@kamino-finance/klend-sdk 3.2.7 → 3.2.9
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.
|
@@ -132,7 +132,8 @@ export declare class KaminoObligation {
|
|
|
132
132
|
amountCollateral?: Decimal;
|
|
133
133
|
amountDebt?: Decimal;
|
|
134
134
|
action: ActionType;
|
|
135
|
-
|
|
135
|
+
mintCollateral?: PublicKey;
|
|
136
|
+
mintDebt?: PublicKey;
|
|
136
137
|
market: KaminoMarket;
|
|
137
138
|
reserves: Map<PublicKey, KaminoReserve>;
|
|
138
139
|
}): {
|
|
@@ -336,64 +336,70 @@ class KaminoObligation {
|
|
|
336
336
|
// TODO: Elevation group problems
|
|
337
337
|
// TODO: Shall we set up position limits?
|
|
338
338
|
getSimulatedObligationStats(params) {
|
|
339
|
-
const { amountCollateral, amountDebt, action,
|
|
339
|
+
const { amountCollateral, amountDebt, action, mintCollateral, mintDebt, market, reserves } = params;
|
|
340
340
|
let newStats = Object.assign({}, this.refreshedStats);
|
|
341
341
|
let newDeposits = new utils_2.PubkeyHashMap([...this.deposits.entries()]);
|
|
342
342
|
let newBorrows = new utils_2.PubkeyHashMap([...this.borrows.entries()]);
|
|
343
343
|
switch (action) {
|
|
344
344
|
case 'deposit': {
|
|
345
|
-
if (amountCollateral === undefined) {
|
|
346
|
-
throw Error('
|
|
345
|
+
if (amountCollateral === undefined || mintCollateral === undefined) {
|
|
346
|
+
throw Error('amountCollateral & mintCollateral are required for deposit action');
|
|
347
347
|
}
|
|
348
|
-
const { stats, deposits } = this.calculateSimulatedDeposit(this.refreshedStats, this.deposits, amountCollateral,
|
|
348
|
+
const { stats, deposits } = this.calculateSimulatedDeposit(this.refreshedStats, this.deposits, amountCollateral, mintCollateral, reserves, market);
|
|
349
349
|
newStats = stats;
|
|
350
350
|
newDeposits = deposits;
|
|
351
351
|
break;
|
|
352
352
|
}
|
|
353
353
|
case 'borrow': {
|
|
354
|
-
if (amountDebt === undefined) {
|
|
355
|
-
throw Error('amountDebt
|
|
354
|
+
if (amountDebt === undefined || mintDebt === undefined) {
|
|
355
|
+
throw Error('amountDebt & mintDebt are required for borrow action');
|
|
356
356
|
}
|
|
357
|
-
const { stats, borrows } = this.calculateSimulatedBorrow(this.refreshedStats, this.borrows, amountDebt,
|
|
357
|
+
const { stats, borrows } = this.calculateSimulatedBorrow(this.refreshedStats, this.borrows, amountDebt, mintDebt, reserves);
|
|
358
358
|
newStats = stats;
|
|
359
359
|
newBorrows = borrows;
|
|
360
360
|
break;
|
|
361
361
|
}
|
|
362
362
|
case 'repay': {
|
|
363
|
-
if (amountDebt === undefined) {
|
|
364
|
-
throw Error('amountDebt
|
|
363
|
+
if (amountDebt === undefined || mintDebt === undefined) {
|
|
364
|
+
throw Error('amountDebt & mintDebt are required for repay action');
|
|
365
365
|
}
|
|
366
|
-
const { stats, borrows } = this.calculateSimulatedBorrow(this.refreshedStats, this.borrows, new decimal_js_1.default(amountDebt).neg(),
|
|
366
|
+
const { stats, borrows } = this.calculateSimulatedBorrow(this.refreshedStats, this.borrows, new decimal_js_1.default(amountDebt).neg(), mintDebt, reserves);
|
|
367
367
|
newStats = stats;
|
|
368
368
|
newBorrows = borrows;
|
|
369
369
|
break;
|
|
370
370
|
}
|
|
371
371
|
case 'withdraw': {
|
|
372
|
-
if (amountCollateral === undefined) {
|
|
373
|
-
throw Error('
|
|
372
|
+
if (amountCollateral === undefined || mintCollateral === undefined) {
|
|
373
|
+
throw Error('amountCollateral & mintCollateral are required for withdraw action');
|
|
374
374
|
}
|
|
375
|
-
const { stats, deposits } = this.calculateSimulatedDeposit(this.refreshedStats, this.deposits, new decimal_js_1.default(amountCollateral).neg(),
|
|
375
|
+
const { stats, deposits } = this.calculateSimulatedDeposit(this.refreshedStats, this.deposits, new decimal_js_1.default(amountCollateral).neg(), mintCollateral, reserves, market);
|
|
376
376
|
newStats = stats;
|
|
377
377
|
newDeposits = deposits;
|
|
378
378
|
break;
|
|
379
379
|
}
|
|
380
380
|
case 'depositAndBorrow': {
|
|
381
|
-
if (amountCollateral === undefined ||
|
|
382
|
-
|
|
381
|
+
if (amountCollateral === undefined ||
|
|
382
|
+
amountDebt === undefined ||
|
|
383
|
+
mintCollateral === undefined ||
|
|
384
|
+
mintDebt === undefined) {
|
|
385
|
+
throw Error('amountColl & amountDebt & mintCollateral & mintDebt are required for depositAndBorrow action');
|
|
383
386
|
}
|
|
384
|
-
const { stats: statsAfterDeposit, deposits } = this.calculateSimulatedDeposit(this.refreshedStats, this.deposits, amountCollateral,
|
|
385
|
-
const { stats, borrows } = this.calculateSimulatedBorrow(statsAfterDeposit, this.borrows, amountDebt,
|
|
387
|
+
const { stats: statsAfterDeposit, deposits } = this.calculateSimulatedDeposit(this.refreshedStats, this.deposits, amountCollateral, mintCollateral, reserves, market);
|
|
388
|
+
const { stats, borrows } = this.calculateSimulatedBorrow(statsAfterDeposit, this.borrows, amountDebt, mintDebt, reserves);
|
|
386
389
|
newStats = stats;
|
|
387
390
|
newDeposits = deposits;
|
|
388
391
|
newBorrows = borrows;
|
|
389
392
|
break;
|
|
390
393
|
}
|
|
391
394
|
case 'repayAndWithdraw': {
|
|
392
|
-
if (amountCollateral === undefined ||
|
|
393
|
-
|
|
395
|
+
if (amountCollateral === undefined ||
|
|
396
|
+
amountDebt === undefined ||
|
|
397
|
+
mintCollateral === undefined ||
|
|
398
|
+
mintDebt === undefined) {
|
|
399
|
+
throw Error('amountColl & amountDebt & mintCollateral & mintDebt are required for repayAndWithdraw action');
|
|
394
400
|
}
|
|
395
|
-
const { stats: statsAfterRepay, borrows } = this.calculateSimulatedBorrow(this.refreshedStats, this.borrows, new decimal_js_1.default(amountDebt).neg(),
|
|
396
|
-
const { stats: statsAfterWithdraw, deposits } = this.calculateSimulatedDeposit(statsAfterRepay, this.deposits, new decimal_js_1.default(amountCollateral).neg(),
|
|
401
|
+
const { stats: statsAfterRepay, borrows } = this.calculateSimulatedBorrow(this.refreshedStats, this.borrows, new decimal_js_1.default(amountDebt).neg(), mintDebt, reserves);
|
|
402
|
+
const { stats: statsAfterWithdraw, deposits } = this.calculateSimulatedDeposit(statsAfterRepay, this.deposits, new decimal_js_1.default(amountCollateral).neg(), mintCollateral, reserves, market);
|
|
397
403
|
newStats = statsAfterWithdraw;
|
|
398
404
|
newDeposits = deposits;
|
|
399
405
|
newBorrows = borrows;
|
|
@@ -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 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 let commonElevationGroups = [...emodeGroupsDebtReserve].filter(\n (item) => item !== 0 && groups[item - 1].debtReserve.equals(reserve.address)\n );\n\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 depositReserveEmodeGroups = depositReserve.state.config.elevationGroups;\n\n commonElevationGroups = commonElevationGroups.filter((item) => depositReserveEmodeGroups.includes(item));\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"]}
|
|
1
|
+
{"version":3,"file":"obligation.js","sourceRoot":"","sources":["../../src/classes/obligation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4DAAiC;AAEjC,sDAAqD;AAErD,kDAAuB;AACvB,yCAAsC;AAEtC,mCAAsD;AACtD,oCAAmE;AA+BnE,MAAa,gBAAgB;IAmB3B;;;;;;;OAOG;IACH,YACE,MAAoB,EACpB,iBAA4B,EAC5B,UAAsB,EACtB,uBAAgD,EAChD,qBAA8C;QAsjBhD,mCAA8B,GAAG,CAC/B,MAAoB,EACpB,OAAsB,EACtB,MAA2B,EAC3B,WAAmB,EACV,EAAE;YACX,MAAM,6BAA6B,GAAG,OAAO,CAAC,gCAAgC,CAC5E,WAAW,EACX,MAAM,CAAC,KAAK,CAAC,cAAc,CAC5B,CAAC;YAEF,MAAM,2BAA2B,GAAG,gBAAgB,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAErF,IAAI,6BAA6B,CAAC,EAAE,CAAC,2BAA2B,CAAC,EAAE,CAAC;gBAClE,OAAO,6BAA6B,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACxE,CAAC;YAED,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC;QAtkBA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QACxB,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,kBAAkB,CACnE,MAAM,EACN,UAAU,EACV,uBAAuB,EACvB,qBAAqB,CACtB,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,CAAO,IAAI,CAAC,YAA0B,EAAE,iBAA4B;;YACxE,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;YAC3F,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM,UAAU,GAAG,qBAAU,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEnD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,GAAG,gBAAgB,CAAC,qBAAqB,CAC/F,YAAY,EACZ,UAAU,EACV,GAAG,CAAC,OAAO,CAAC,IAAI,CACjB,CAAC;YACF,OAAO,IAAI,gBAAgB,CACzB,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,uBAAuB,EACvB,qBAAqB,CACtB,CAAC;QACJ,CAAC;KAAA;IAED,MAAM,CAAO,OAAO,CAClB,YAA0B,EAC1B,mBAAgC,EAChC,IAAa;;YAEb,IAAI,WAAW,GAAG,IAAI,CAAC;YACvB,IAAI,WAAkC,CAAC;YACvC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBAC7C,YAAY,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE;oBACtC,qBAAU,CAAC,aAAa,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,mBAAmB,EAAE,YAAY,CAAC,SAAS,CAAC;iBACpG,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,MAAM,qBAAU,CAAC,aAAa,CAC1C,YAAY,CAAC,aAAa,EAAE,EAC5B,mBAAmB,EACnB,YAAY,CAAC,SAAS,CACvB,CAAC;YACJ,CAAC;YACD,MAAM,qBAAqB,GAAG,IAAI,qBAAa,EAAsB,CAAC;YACtE,MAAM,uBAAuB,GAAG,IAAI,qBAAa,EAAsB,CAAC;YACxE,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;oBACxB,gBAAgB,CAAC,qBAAqB,CACpC,YAAY,EACZ,UAAU,EACV,uBAAuB,EACvB,qBAAqB,EACrB,WAAW,CACZ,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;gBACvC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;oBACxB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,IAAI,gBAAgB,CACzB,YAAY,EACZ,mBAAmB,CAAC,CAAC,CAAC,EACtB,UAAU,EACV,uBAAuB,EACvB,qBAAqB,CACtB,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;KAAA;IAED;;OAEG;IACH,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,SAAS,EAAE,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,sBAAsB;QACpB,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,SAAS,EAAE,CAAC;IAC1E,CAAC;IAED;;OAEG;IACH,gCAAgC;QAC9B,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,SAAS,EAAE,CAAC;IAC9E,CAAC;IAED;;OAEG;IACH,qBAAqB;QACnB,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,SAAS,EAAE,CAAC;IACnE,CAAC;IAED;;;OAGG;IACH,uBAAuB;QACrB,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,SAAS,EAAE,CAAC;IACrE,CAAC;IAED;;;OAGG;IACH,qBAAqB,CAAC,OAA6B;QACjD,OAAO,IAAI,mBAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC;IACzD,CAAC;IAED,kBAAkB,CAAC,OAAkB;QACnC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,mBAAmB,CAAC,OAAkB;QACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,eAAe,CAAC,IAAe;QAC7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,gBAAgB,CAAC,IAAe;QAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,oBAAoB,CAAC,MAA2B;QAC9C,OAAO,IAAI,mBAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,8BAA8B,CAAC,MAA2B;QACxD,OAAO,IAAI,mBAAQ,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,SAAS,EAAE,CAAC;IAC5E,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,mCAAmC,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC3G,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAChD,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,YAA0B;QAC3C,MAAM,QAAQ,GAAG,IAAI,qBAAa,EAA4B,CAAC;QAC/D,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,IAAI,IAAA,uBAAe,EAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBACrF,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAE,CAAC,CAAC;YAClG,CAAC;QACH,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACjD,IAAI,IAAA,uBAAe,EAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBACjF,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,aAAa,CAAE,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QACD,OAAO,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,6BAA6B,CAAC,QAA8B;QACjE,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAkB,CAAC;QACxD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,KAAK,MAAM,cAAc,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;gBAClE,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;oBACzB,MAAM,KAAK,GAAG,qBAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;oBACxD,IAAI,KAAK,EAAE,CAAC;wBACV,qBAAqB,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;oBACvD,CAAC;yBAAM,CAAC;wBACN,qBAAqB,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;oBAC/C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,qBAAqB,GAAG,IAAI,KAAK,EAAU,CAAC;QAClD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,qBAAqB,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7D,IAAI,KAAK,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC9B,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QACD,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAED,wBAAwB,CACtB,QAAyB,EACzB,UAAoC,EACpC,YAAqB,EACrB,IAAe,EACf,QAAuC;QAKvC,MAAM,QAAQ,qBAAQ,QAAQ,CAAE,CAAC;QACjC,MAAM,UAAU,GAAG,IAAI,qBAAa,CAAsB,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,cAAc,GAAyB,SAAS,CAAC;QACrD,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,IAAI,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,cAAc,qBAAQ,SAAS,CAAE,CAAC;YACpC,CAAC;QACH,CAAC;QACD,IAAI,OAAO,GAA8B,SAAS,CAAC;QACnD,KAAK,MAAM,aAAa,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,OAAO,GAAG,aAAa,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,cAAc,GAAG;gBACf,cAAc,EAAE,OAAQ,CAAC,OAAO;gBAChC,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,IAAI,oBAAO,CAAC,CAAC,CAAC;gBACtB,oBAAoB,EAAE,IAAI,oBAAO,CAAC,CAAC,CAAC;aACrC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9E,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAChB,IAAI,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,oBAAO,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEtG,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QAE3G,MAAM,kCAAkC,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAE5E,QAAQ,CAAC,eAAe,GAAG,IAAA,sBAAc,EAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QACzF,QAAQ,CAAC,mCAAmC,GAAG,IAAA,sBAAc,EAC3D,QAAQ,CAAC,mCAAmC,CAAC,IAAI,CAAC,kCAAkC,CAAC,CACtF,CAAC;QAEF,cAAc,CAAC,MAAM,GAAG,IAAA,sBAAc,EAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACjF,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC;QAClC,cAAc,CAAC,oBAAoB,GAAG,IAAA,sBAAc,EAAC,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QAE/G,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAC9D,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,KAAK,EAAE,QAAQ;SAChB,CAAC;IACJ,CAAC;IAED,yBAAyB,CACvB,QAAyB,EACzB,WAAqC,EACrC,MAAe,EACf,IAAe,EACf,QAAuC,EACvC,MAAoB;QAKpB,MAAM,QAAQ,qBAAQ,QAAQ,CAAE,CAAC;QACjC,MAAM,WAAW,GAAG,IAAI,qBAAa,CAAsB,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEvF,IAAI,eAAe,GAAyB,SAAS,CAAC;QACtD,KAAK,MAAM,UAAU,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,eAAe,qBAAQ,UAAU,CAAE,CAAC;YACtC,CAAC;QACH,CAAC;QACD,IAAI,OAAO,GAA8B,SAAS,CAAC;QACnD,KAAK,MAAM,aAAa,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,OAAO,GAAG,aAAa,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,eAAe,GAAG;gBAChB,cAAc,EAAE,OAAQ,CAAC,OAAO;gBAChC,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,IAAI,oBAAO,CAAC,CAAC,CAAC;gBACtB,oBAAoB,EAAE,IAAI,oBAAO,CAAC,CAAC,CAAC;aACrC,CAAC;QACJ,CAAC;QAED,IAAI,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;QAC/C,IAAI,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC;QAEtD,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;YACpC,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC;YAC/E,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,uBAAuB,GAAG,GAAG,CAAC;QACnG,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9E,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,oDAAoD;QACjF,MAAM,yBAAyB,GAAG,YAAY;aAC3C,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;aACnC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEtE,QAAQ,CAAC,gBAAgB,GAAG,IAAA,sBAAc,EAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACtG,QAAQ,CAAC,WAAW,GAAG,IAAA,sBAAc,EAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7G,QAAQ,CAAC,sBAAsB,GAAG,IAAA,sBAAc,EAC9C,QAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAClF,CAAC;QACF,QAAQ,CAAC,cAAc,GAAG,IAAA,mBAAW,EAAC,QAAQ,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAEtG,eAAe,CAAC,MAAM,GAAG,IAAA,sBAAc,EAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7E,eAAe,CAAC,WAAW,GAAG,IAAI,CAAC;QACnC,eAAe,CAAC,oBAAoB,GAAG,IAAA,sBAAc,EACnD,eAAe,CAAC,oBAAoB,CAAC,IAAI,CACvC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CACpF,CACF,CAAC;QAEF,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;QAEjE,OAAO;YACL,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,QAAQ;SAChB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,iCAAiC;IACjC,yCAAyC;IACzC,2BAA2B,CAAC,MAQ3B;QAKC,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;QACpG,IAAI,QAAQ,qBAAQ,IAAI,CAAC,cAAc,CAAE,CAAC;QAC1C,IAAI,WAAW,GAA6B,IAAI,qBAAa,CAAsB,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACjH,IAAI,UAAU,GAA6B,IAAI,qBAAa,CAAsB,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAE/G,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,IAAI,gBAAgB,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;oBACnE,MAAM,KAAK,CAAC,mEAAmE,CAAC,CAAC;gBACnF,CAAC;gBACD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,yBAAyB,CACxD,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,QAAQ,EACb,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,MAAM,CACP,CAAC;gBAEF,QAAQ,GAAG,KAAK,CAAC;gBACjB,WAAW,GAAG,QAAQ,CAAC;gBAEvB,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,UAAU,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACvD,MAAM,KAAK,CAAC,sDAAsD,CAAC,CAAC;gBACtE,CAAC;gBACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,wBAAwB,CACtD,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,OAAO,EACZ,UAAU,EACV,QAAQ,EACR,QAAQ,CACT,CAAC;gBACF,QAAQ,GAAG,KAAK,CAAC;gBACjB,UAAU,GAAG,OAAO,CAAC;gBACrB,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,IAAI,UAAU,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACvD,MAAM,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACrE,CAAC;gBACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,wBAAwB,CACtD,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,OAAO,EACZ,IAAI,oBAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,EAC7B,QAAQ,EACR,QAAQ,CACT,CAAC;gBACF,QAAQ,GAAG,KAAK,CAAC;gBACjB,UAAU,GAAG,OAAO,CAAC;gBACrB,MAAM;YACR,CAAC;YAED,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,IAAI,gBAAgB,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;oBACnE,MAAM,KAAK,CAAC,oEAAoE,CAAC,CAAC;gBACpF,CAAC;gBACD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,yBAAyB,CACxD,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,QAAQ,EACb,IAAI,oBAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,EAAE,EACnC,cAAc,EACd,QAAQ,EACR,MAAM,CACP,CAAC;gBACF,QAAQ,GAAG,KAAK,CAAC;gBACjB,WAAW,GAAG,QAAQ,CAAC;gBACvB,MAAM;YACR,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,IACE,gBAAgB,KAAK,SAAS;oBAC9B,UAAU,KAAK,SAAS;oBACxB,cAAc,KAAK,SAAS;oBAC5B,QAAQ,KAAK,SAAS,EACtB,CAAC;oBACD,MAAM,KAAK,CAAC,8FAA8F,CAAC,CAAC;gBAC9G,CAAC;gBACD,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAC3E,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,QAAQ,EACb,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,MAAM,CACP,CAAC;gBACF,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,wBAAwB,CACtD,iBAAiB,EACjB,IAAI,CAAC,OAAO,EACZ,UAAU,EACV,QAAQ,EACR,QAAQ,CACT,CAAC;gBAEF,QAAQ,GAAG,KAAK,CAAC;gBACjB,WAAW,GAAG,QAAQ,CAAC;gBACvB,UAAU,GAAG,OAAO,CAAC;gBACrB,MAAM;YACR,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,IACE,gBAAgB,KAAK,SAAS;oBAC9B,UAAU,KAAK,SAAS;oBACxB,cAAc,KAAK,SAAS;oBAC5B,QAAQ,KAAK,SAAS,EACtB,CAAC;oBACD,MAAM,KAAK,CAAC,8FAA8F,CAAC,CAAC;gBAC9G,CAAC;gBACD,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,wBAAwB,CACvE,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,OAAO,EACZ,IAAI,oBAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,EAC7B,QAAQ,EACR,QAAQ,CACT,CAAC;gBACF,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAC5E,eAAe,EACf,IAAI,CAAC,QAAQ,EACb,IAAI,oBAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,EAAE,EACnC,cAAc,EACd,QAAQ,EACR,MAAM,CACP,CAAC;gBACF,QAAQ,GAAG,kBAAkB,CAAC;gBAC9B,WAAW,GAAG,QAAQ,CAAC;gBACvB,UAAU,GAAG,OAAO,CAAC;gBACrB,MAAM;YACR,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,KAAK,CAAC,uBAAuB,MAAM,kCAAkC,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,eAAe,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QACrF,QAAQ,CAAC,WAAW,GAAG,IAAA,mBAAW,EAChC,QAAQ,CAAC,mCAAmC,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAClF,CAAC;QACF,QAAQ,CAAC,QAAQ,GAAG,IAAA,mBAAW,EAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;QAE/F,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,WAAW;YACrB,OAAO,EAAE,UAAU;SACpB,CAAC;IACJ,CAAC;IAsBO,iBAAiB,CACvB,MAAoB,EACpB,UAAsB,EACtB,uBAAgD,EAChD,KAA0C;QAQ1C,OAAO,gBAAgB,CAAC,2BAA2B,CAAC,MAAM,EAAE,UAAU,EAAE,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAC1G,CAAC;IAEO,gBAAgB,CACtB,MAAoB,EACpB,UAAsB,EACtB,qBAA8C,EAC9C,KAA0C;QAE1C,OAAO,gBAAgB,CAAC,0BAA0B,CAAC,MAAM,EAAE,UAAU,EAAE,qBAAqB,EAAE,KAAK,CAAC,CAAC;IACvG,CAAC;IAEO,kBAAkB,CACxB,MAAoB,EACpB,UAAsB,EACtB,uBAAgD,EAChD,qBAA8C;QAM9C,MAAM,WAAW,GAAG,CAAC,OAAsB,EAAE,EAAE,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;QAC/E,MAAM,uBAAuB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,uBAAuB,EAAE,WAAW,CAAC,CAAC;QAEjH,MAAM,sBAAsB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,qBAAqB,EAAE,WAAW,CAAC,CAAC;QAE7G,MAAM,6BAA6B,GAAG,uBAAuB,CAAC,gBAAgB,CAAC,KAAK,CAClF,sBAAsB,CAAC,eAAe,CACvC,CAAC;QAEF,MAAM,6BAA6B,GAAG,CAAC,CAAC;QAExC,OAAO;YACL,QAAQ,EAAE,uBAAuB,CAAC,QAAQ;YAC1C,OAAO,EAAE,sBAAsB,CAAC,OAAO;YACvC,cAAc,EAAE;gBACd,WAAW,EAAE,uBAAuB,CAAC,WAAW;gBAChD,sBAAsB,EAAE,uBAAuB,CAAC,sBAAsB;gBACtE,eAAe,EAAE,sBAAsB,CAAC,eAAe;gBACvD,mCAAmC,EAAE,sBAAsB,CAAC,mCAAmC;gBAC/F,gBAAgB,EAAE,uBAAuB,CAAC,gBAAgB;gBAC1D,cAAc,EAAE,uBAAuB,CAAC,cAAc;gBACtD,iBAAiB,EAAE,sBAAsB,CAAC,mCAAmC,CAAC,SAAS,CACrF,uBAAuB,CAAC,WAAW,CACpC;gBACD,eAAe,EAAE,6BAA6B;gBAC9C,QAAQ,EAAE,uBAAuB,CAAC,gBAAgB,CAAC,SAAS,CAAC,6BAA6B,CAAC;gBAC3F,WAAW,EAAE,sBAAsB,CAAC,mCAAmC,CAAC,SAAS,CAC/E,uBAAuB,CAAC,gBAAgB,CACzC;gBACD,6BAA6B;aAC9B;SACF,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,2BAA2B,CACvC,MAAoB,EACpB,UAAsB,EACtB,uBAAuD,EACvD,KAA0C;QAS1C,IAAI,gBAAgB,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,0BAA0B,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,WAAW,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,sBAAsB,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QAE5C,MAAM,QAAQ,GAAG,IAAI,qBAAa,EAAuB,CAAC;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,IAAI,CAAC,IAAA,uBAAe,EAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC5D,SAAS;YACX,CAAC;YACD,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,uDAAuD,OAAO,CAAC,cAAc,iEAAiE,OAAO,CAAC,eAAe,EAAE,CACxK,CAAC;YACJ,CAAC;YACD,IAAI,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;YAC/C,IAAI,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC;YAEtD,IAAI,UAAU,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;gBACpC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC;gBACvF,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,uBAAuB,GAAG,GAAG,CAAC;YAC3G,CAAC;YAED,IAAI,YAAY,CAAC;YACjB,IAAI,uBAAuB,KAAK,IAAI,EAAE,CAAC;gBACrC,YAAY,GAAG,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAE,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,YAAY,GAAG,OAAO,CAAC,yBAAyB,EAAE,CAAC;YACrD,CAAC;YACD,MAAM,YAAY,GAAG,IAAI,oBAAO,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAEvF,MAAM,eAAe,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;YAEtF,gBAAgB,GAAG,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAEzD,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;gBACtB,0BAA0B,GAAG,0BAA0B,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC/E,CAAC;YAED,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;YAChE,sBAAsB,GAAG,sBAAsB,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;YAEvF,MAAM,QAAQ,GAAa;gBACzB,cAAc,EAAE,OAAO,CAAC,OAAO;gBAC/B,WAAW,EAAE,OAAO,CAAC,gBAAgB,EAAE;gBACvC,MAAM,EAAE,YAAY;gBACpB,oBAAoB,EAAE,eAAe;aACtC,CAAC;YACF,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO;YACL,QAAQ;YACR,gBAAgB;YAChB,0BAA0B;YAC1B,WAAW;YACX,cAAc,EAAE,IAAA,mBAAW,EAAC,sBAAsB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACzE,sBAAsB;SACvB,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,0BAA0B,CACtC,MAAoB,EACpB,UAAsB,EACtB,qBAAqD,EACrD,KAA0C;QAE1C,IAAI,eAAe,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,mCAAmC,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,MAAM,OAAO,GAAG,IAAI,qBAAa,EAAuB,CAAC;QACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnD,IAAI,CAAC,IAAA,uBAAe,EAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC1D,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACjE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,sDACE,MAAM,CAAC,aACT,gEAAgE,gBAAgB,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAC3G,CAAC;YACJ,CAAC;YAED,MAAM,8BAA8B,GAAG,gBAAgB,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YACxF,IAAI,oBAAoB,CAAC;YACzB,IAAI,qBAAqB,KAAK,IAAI,EAAE,CAAC;gBACnC,oBAAoB,GAAG,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAE,CAAC;YACrE,CAAC;iBAAM,CAAC;gBACN,oBAAoB,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;YAC3D,CAAC;YAED,MAAM,YAAY,GAAG,gBAAgB,CAAC,eAAe,CAAC,MAAM,CAAC;iBAC1D,GAAG,CAAC,oBAAoB,CAAC;iBACzB,SAAS,CAAC,8BAA8B,CAAC,CAAC;YAE7C,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;YAE3F,MAAM,YAAY,GAAG,gBAAgB,CAAC,yBAAyB,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;YACpG,MAAM,kCAAkC,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAE5E,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACvC,SAAS,IAAI,CAAC,CAAC;YACjB,CAAC;YAED,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACvD,mCAAmC,GAAG,mCAAmC,CAAC,IAAI,CAC5E,kCAAkC,CACnC,CAAC;YAEF,MAAM,QAAQ,GAAa;gBACzB,cAAc,EAAE,OAAO,CAAC,OAAO;gBAC/B,WAAW,EAAE,OAAO,CAAC,gBAAgB,EAAE;gBACvC,MAAM,EAAE,YAAY;gBACpB,oBAAoB,EAAE,cAAc;aACrC,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,OAAO;YACL,OAAO;YACP,eAAe;YACf,mCAAmC;YACnC,SAAS;SACV,CAAC;IACJ,CAAC;IAED,kBAAkB,CAChB,MAAoB,EACpB,SAAoB,EACpB,IAAY,EACZ,qBAA8B;QAE9B,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAEnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;QAC5C,MAAM,sBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC;QACpE,IAAI,qBAAqB,GAAG,CAAC,GAAG,sBAAsB,CAAC,CAAC,MAAM,CAC5D,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAC7E,CAAC;QAEF,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACjD,MAAM,cAAc,GAAG,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAExE,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YAED,MAAM,yBAAyB,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC;YAE9E,qBAAqB,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,yBAAyB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3G,CAAC;QAED,IAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;QAC/C,IAAI,qBAAqB,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,kCAAkC,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;gBACrF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;gBAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;gBAC5D,OAAO,SAAU,CAAC,MAAM,GAAG,SAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7D,CAAC,CAAC,CAAC;YAEH,IAAI,qBAAqB,EAAE,CAAC;gBAC1B,cAAc,GAAG,kCAAkC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,MAAM,uBAAuB,GAC3B,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,KAAK,CAAC,CAAC;QAExF,MAAM,mBAAmB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QACtD,MAAM,YAAY,GAAG,uBAAuB,CAAC,CAAC,CAAC,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC;QAEpF,MAAM,wBAAwB,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,4BAA4B;aAC1F,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,mCAAmC,CAAC;aAC9D,GAAG,CAAC,YAAY,CAAC;aACjB,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;aACnC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QAChC,MAAM,sBAAsB,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC;QACrE,IAAI,wBAAwB,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAEjG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAChC,MAAM,cAAc,GAAG,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAC1E,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,8BAA8B,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAC3F,wBAAwB,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,eAAe,GAAG,oBAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,sBAAsB,EAAE,wBAAwB,CAAC,CAAC;QAE9G,MAAM,iBAAiB,GAAG,OAAO,CAAC,4BAA4B,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC;QAChH,eAAe,GAAG,OAAO,CAAC,4BAA4B,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC,CAAC,oBAAO,CAAC,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC;YACjD,CAAC,CAAC,eAAe,CAAC;QAEpB,IAAI,kBAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;QAEhD,qBAAqB;QACrB,kBAAkB,GAAG,kBAAkB,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAE1D,eAAe,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEjD,MAAM,qBAAqB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,mCAAmC,GAAG,GAAG,CAAC;QAC7F,MAAM,uBAAuB,GAAG,OAAO,CAAC,yBAAyB,EAAE,CAAC;QAEpE,IAAI,qBAAqB,GAAG,CAAC,IAAI,uBAAuB,GAAG,qBAAqB,EAAE,CAAC;YACjF,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,IAAI,qBAAqB,GAAG,CAAC,IAAI,uBAAuB,GAAG,qBAAqB,EAAE,CAAC;YACxF,MAAM,2BAA2B,GAAG,IAAI,oBAAO,CAAC,qBAAqB,GAAG,uBAAuB,CAAC,CAAC,GAAG,CAClG,OAAO,CAAC,cAAc,EAAE,CACzB,CAAC;YACF,eAAe,GAAG,oBAAO,CAAC,GAAG,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,oCAAoC,GAAG,IAAI,oBAAO,CAAC,eAAO,CAAC,CAAC;QAEhE,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,oCAAoC,GAAG,OAAO;iBAC3C,mCAAmC,EAAE;iBACrC,GAAG,CAAC,OAAO,CAAC,sCAAsC,EAAE,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,IAAI,8BAA8B,GAAG,IAAI,oBAAO,CAAC,eAAO,CAAC,CAAC;YAC1D,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;gBACjD,MAAM,cAAc,GAAG,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBAExE,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBACvC,CAAC;gBAED,MAAM,+BAA+B,GAAG,cAAc;qBACnD,+CAA+C,CAAC,cAAc,GAAG,CAAC,CAAC;qBACnE,GAAG,CAAC,cAAc,CAAC,kDAAkD,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC;gBAE9F,8BAA8B,GAAG,oBAAO,CAAC,GAAG,CAC1C,IAAI,oBAAO,CAAC,CAAC,CAAC,EACd,oBAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,8BAA8B,CAAC,CAC7E,CAAC;YACJ,CAAC;YACD,oCAAoC,GAAG,8BAA8B,CAAC;QACxE,CAAC;QAED,eAAe,GAAG,oBAAO,CAAC,GAAG,CAAC,eAAe,EAAE,oCAAoC,CAAC,CAAC;QAErF,OAAO,oBAAO,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IACtD,CAAC;IAED,oBAAoB,CAAC,MAAoB,EAAE,SAAoB,EAAE,IAAY;QAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAEnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEtE,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,yBAAyB,GAAG,mBAAmB,CAAC,MAAM,CAAC;QAE7D,IAAI,IAAI,CAAC,cAAc,CAAC,mCAAmC,CAAC,MAAM,CAAC,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,OAAO,IAAI,oBAAO,CAAC,yBAAyB,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,uBAAuB,GAC3B,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,CAAC;QAE9G,MAAM,aAAa,GAAG,uBAAuB;YAC3C,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,GAAG;YAClE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;QACjC,gDAAgD;QAChD,IAAI,IAAI,CAAC,cAAc,CAAC,mCAAmC,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;YAC/F,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,gBAAgB,CAAC;QACrB,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACxB,gBAAgB,GAAG,yBAAyB,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,0CAA0C;YAC1C,iEAAiE;YACjE,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW;iBAC/C,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,mCAAmC,CAAC;iBAC5D,GAAG,CAAC,aAAa,CAAC;iBAClB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,4CAA4C;QAC7D,CAAC;QAED,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5G,MAAM,yBAAyB,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC;QAExE,MAAM,qBAAqB,GAAG,OAAO;aAClC,+BAA+B,EAAE;aACjC,GAAG,CAAC,OAAO,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,OAAO,oBAAO,CAAC,GAAG,CAChB,CAAC,EACD,oBAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,qBAAqB,CAAC,CAC5G,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,eAAe,CAAC,MAA2B;QAChD,OAAO,IAAI,mBAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,EAAE,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,uBAAuB,CAAC,MAA2B;QACxD,IAAI,KAAK,GAAG,IAAI,eAAE,CAAC,CAAC,CAAC,CAAC;QACtB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACnE,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,mBAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;IACzC,CAAC;IAEM,MAAM,CAAC,qBAAqB,CACjC,YAA0B,EAC1B,UAAsB,EACtB,IAAY;QAKZ,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,uCAAuC,CACtF,YAAY,EACZ,UAAU,EACV,IAAI,CACL,CAAC;QACF,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,qCAAqC,CAClF,YAAY,EACZ,UAAU,EACV,IAAI,CACL,CAAC;QAEF,OAAO;YACL,uBAAuB;YACvB,qBAAqB;SACtB,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,qBAAqB,CACjC,YAA0B,EAC1B,UAAsB,EACtB,uBAAgD,EAChD,qBAA8C,EAC9C,IAAY;QAEZ,gBAAgB,CAAC,uCAAuC,CAAC,YAAY,EAAE,uBAAuB,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAClH,gBAAgB,CAAC,qCAAqC,CAAC,YAAY,EAAE,qBAAqB,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAChH,CAAC;IAED,MAAM,CAAC,uCAAuC,CAC5C,YAA0B,EAC1B,UAAsB,EACtB,IAAY;QAEZ,MAAM,uBAAuB,GAAG,IAAI,qBAAa,EAAsB,CAAC;QACxE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,IAAA,uBAAe,EAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBACpG,MAAM,OAAO,GAAG,YAAY,CAAC,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAE,CAAC;gBAC1E,MAAM,sBAAsB,GAAG,OAAO,CAAC,kCAAkC,CACvE,IAAI,EACJ,YAAY,CAAC,KAAK,CAAC,cAAc,CAClC,CAAC;gBACF,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QACD,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,uCAAuC,CAC5C,YAA0B,EAC1B,uBAAgD,EAChD,UAAsB,EACtB,IAAY;QAEZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,IAAA,uBAAe,EAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBACpG,MAAM,OAAO,GAAG,YAAY,CAAC,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAE,CAAC;gBAC1E,MAAM,sBAAsB,GAAG,OAAO,CAAC,kCAAkC,CACvE,IAAI,EACJ,YAAY,CAAC,KAAK,CAAC,cAAc,CAClC,CAAC;gBACF,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,qCAAqC,CAAC,YAA0B,EAAE,UAAsB,EAAE,IAAY;QAC3G,MAAM,qBAAqB,GAAG,IAAI,qBAAa,EAAsB,CAAC;QACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,IAAA,uBAAe,EAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC9F,MAAM,OAAO,GAAG,YAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,aAAa,CAAE,CAAC;gBACxE,MAAM,oBAAoB,GAAG,OAAO,CAAC,gCAAgC,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC/G,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QACD,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,qCAAqC,CAC1C,YAA0B,EAC1B,qBAA8C,EAC9C,UAAsB,EACtB,IAAY;QAEZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,IAAA,uBAAe,EAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC9F,MAAM,OAAO,GAAG,YAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,aAAa,CAAE,CAAC;gBACxE,MAAM,oBAAoB,GAAG,OAAO,CAAC,gCAAgC,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC/G,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,yBAAyB,CAAC,OAAsB,EAAE,cAAsB;QAC7E,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,oBAAO,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1D,CAAC;CACF;AArnCD,4CAqnCC","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 mintCollateral?: PublicKey;\n mintDebt?: 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, mintCollateral, mintDebt, 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 || mintCollateral === undefined) {\n throw Error('amountCollateral & mintCollateral are required for deposit action');\n }\n const { stats, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n amountCollateral,\n mintCollateral,\n reserves,\n market\n );\n\n newStats = stats;\n newDeposits = deposits;\n\n break;\n }\n case 'borrow': {\n if (amountDebt === undefined || mintDebt === undefined) {\n throw Error('amountDebt & mintDebt are required for borrow action');\n }\n const { stats, borrows } = this.calculateSimulatedBorrow(\n this.refreshedStats,\n this.borrows,\n amountDebt,\n mintDebt,\n reserves\n );\n newStats = stats;\n newBorrows = borrows;\n break;\n }\n case 'repay': {\n if (amountDebt === undefined || mintDebt === undefined) {\n throw Error('amountDebt & mintDebt are required for repay action');\n }\n const { stats, borrows } = this.calculateSimulatedBorrow(\n this.refreshedStats,\n this.borrows,\n new Decimal(amountDebt).neg(),\n mintDebt,\n reserves\n );\n newStats = stats;\n newBorrows = borrows;\n break;\n }\n\n case 'withdraw': {\n if (amountCollateral === undefined || mintCollateral === undefined) {\n throw Error('amountCollateral & mintCollateral are required for withdraw action');\n }\n const { stats, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n new Decimal(amountCollateral).neg(),\n mintCollateral,\n reserves,\n market\n );\n newStats = stats;\n newDeposits = deposits;\n break;\n }\n case 'depositAndBorrow': {\n if (\n amountCollateral === undefined ||\n amountDebt === undefined ||\n mintCollateral === undefined ||\n mintDebt === undefined\n ) {\n throw Error('amountColl & amountDebt & mintCollateral & mintDebt are required for depositAndBorrow action');\n }\n const { stats: statsAfterDeposit, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n amountCollateral,\n mintCollateral,\n reserves,\n market\n );\n const { stats, borrows } = this.calculateSimulatedBorrow(\n statsAfterDeposit,\n this.borrows,\n amountDebt,\n mintDebt,\n reserves\n );\n\n newStats = stats;\n newDeposits = deposits;\n newBorrows = borrows;\n break;\n }\n case 'repayAndWithdraw': {\n if (\n amountCollateral === undefined ||\n amountDebt === undefined ||\n mintCollateral === undefined ||\n mintDebt === undefined\n ) {\n throw Error('amountColl & amountDebt & mintCollateral & mintDebt 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 mintDebt,\n reserves\n );\n const { stats: statsAfterWithdraw, deposits } = this.calculateSimulatedDeposit(\n statsAfterRepay,\n this.deposits,\n new Decimal(amountCollateral).neg(),\n mintCollateral,\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 let commonElevationGroups = [...emodeGroupsDebtReserve].filter(\n (item) => item !== 0 && groups[item - 1].debtReserve.equals(reserve.address)\n );\n\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 depositReserveEmodeGroups = depositReserve.state.config.elevationGroups;\n\n commonElevationGroups = commonElevationGroups.filter((item) => depositReserveEmodeGroups.includes(item));\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"]}
|
package/dist/classes/reserve.js
CHANGED
|
@@ -479,7 +479,7 @@ class KaminoReserve {
|
|
|
479
479
|
const slotAdjustmentFactor = this.slotAdjustmentFactor();
|
|
480
480
|
const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);
|
|
481
481
|
const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);
|
|
482
|
-
return (0, utils_2.getBorrowRate)(newUtilization, curve) * slotAdjustmentFactor;
|
|
482
|
+
return (0, utils_2.getBorrowRate)(newUtilization, curve) * slotAdjustmentFactor + this.getFixedHostInterestRate().toNumber();
|
|
483
483
|
}
|
|
484
484
|
calcSimulatedSupplyAPR(amount, action, slot, referralFeeBps, outflowAmount) {
|
|
485
485
|
const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reserve.js","sourceRoot":"","sources":["../../src/classes/reserve.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport {\n AccountInfo,\n Connection,\n PublicKey,\n SystemProgram,\n SYSVAR_RENT_PUBKEY,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport {\n INITIAL_COLLATERAL_RATE,\n lendingMarketAuthPda,\n MarketWithAddress,\n ONE_HUNDRED_PCT_IN_BPS,\n reservePdas,\n SLOTS_PER_DAY,\n SLOTS_PER_SECOND,\n SLOTS_PER_YEAR,\n TokenOracleData,\n U64_MAX,\n} from '../utils';\nimport { ReserveDataType, ReserveStatus } from './shared';\nimport { Reserve, ReserveFields } from '../idl_codegen/accounts';\nimport { BorrowRateCurve, CurvePointFields, ReserveConfig, UpdateConfigMode } from '../idl_codegen/types';\nimport { calculateAPYFromAPR, getBorrowRate, parseTokenSymbol } from './utils';\nimport { Fraction } from './fraction';\nimport BN from 'bn.js';\nimport { ActionType } from './action';\nimport { KaminoMarket } from './market';\nimport {\n initReserve,\n InitReserveAccounts,\n updateReserveConfig,\n UpdateReserveConfigAccounts,\n UpdateReserveConfigArgs,\n} from '../lib';\nimport * as anchor from '@coral-xyz/anchor';\nimport { TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport { UpdateBorrowRateCurve } from '../idl_codegen/types/UpdateConfigMode';\n\nexport const DEFAULT_RECENT_SLOT_DURATION_MS = 450;\n\nexport class KaminoReserve {\n state: Reserve;\n address: PublicKey;\n symbol: string;\n\n tokenOraclePrice: TokenOracleData;\n stats: ReserveDataType;\n\n private buffer: AccountInfo<Buffer> | null;\n private connection: Connection;\n private readonly recentSlotDurationMs: number;\n\n constructor(\n state: Reserve,\n address: PublicKey,\n tokenOraclePrice: TokenOracleData,\n connection: Connection,\n recentSlotDurationMs: number\n ) {\n this.state = state;\n this.address = address;\n this.buffer = null;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = {} as ReserveDataType;\n this.connection = connection;\n this.symbol = parseTokenSymbol(state.config.tokenInfo.name);\n this.recentSlotDurationMs = recentSlotDurationMs;\n }\n\n static initialize(\n accountData: AccountInfo<Buffer>,\n address: PublicKey,\n state: Reserve,\n tokenOraclePrice: TokenOracleData,\n connection: Connection,\n recentSlotDurationMs: number\n ) {\n const reserve = new KaminoReserve(state, address, tokenOraclePrice, connection, recentSlotDurationMs);\n reserve.setBuffer(accountData);\n reserve.stats = reserve.formatReserveData(state);\n return reserve;\n }\n\n /// GETTERS\n\n /**\n * @returns the parsed token symbol of the reserve\n */\n getTokenSymbol(): string {\n return parseTokenSymbol(this.state.config.tokenInfo.name);\n }\n\n /**\n * @returns the total borrowed amount of the reserve\n */\n getBorrowedAmount(): Decimal {\n return new Fraction(this.state.liquidity.borrowedAmountSf).toDecimal();\n }\n\n /**\n * @returns the available liquidity amount of the reserve\n */\n getLiquidityAvailableAmount(): Decimal {\n return new Decimal(this.state.liquidity.availableAmount.toString());\n }\n\n /**\n *\n * @returns the last cached price stored in the reserve in USD\n */\n getReserveMarketPrice(): Decimal {\n return new Fraction(this.state.liquidity.marketPriceSf).toDecimal();\n }\n\n /**\n * @returns the current market price of the reserve in USD\n */\n getOracleMarketPrice(): Decimal {\n return this.tokenOraclePrice.price;\n }\n\n /**\n * @returns the total accumulated protocol fees of the reserve\n */\n getAccumulatedProtocolFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedProtocolFeesSf).toDecimal();\n }\n\n /**\n * @returns the total accumulated referrer fees of the reserve\n */\n getAccumulatedReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedReferrerFeesSf).toDecimal();\n }\n\n /**\n * @returns the total pending referrer fees of the reserve\n */\n getPendingReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.pendingReferrerFeesSf).toDecimal();\n }\n\n /**\n *\n * @returns the flash loan fee percentage of the reserve\n */\n getFlashLoanFee = (): Decimal => {\n if (this.state.config.fees.flashLoanFeeSf.toString() === U64_MAX) {\n return new Decimal('0');\n }\n return new Fraction(this.state.config.fees.flashLoanFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the origination fee percentage of the reserve\n */\n getBorrowFee = (): Decimal => {\n return new Fraction(this.state.config.fees.borrowFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the fixed interest rate allocated to the host\n */\n getFixedHostInterestRate = (): Decimal => {\n return new Decimal(this.state.config.hostFixedInterestRateBps).div(10_000);\n };\n\n /**\n * Use getEstimatedTotalSupply() for the most accurate value\n * @returns the stale total liquidity supply of the reserve from the last refresh\n */\n getTotalSupply(): Decimal {\n return this.getLiquidityAvailableAmount()\n .add(this.getBorrowedAmount())\n .sub(this.getAccumulatedProtocolFees())\n .sub(this.getAccumulatedReferrerFees())\n .sub(this.getPendingReferrerFees());\n }\n\n /**\n * Calculates the total liquidity supply of the reserve\n */\n getEstimatedTotalSupply(slot: number, referralFeeBps: number): Decimal {\n const { totalSupply } = this.getEstimatedDebtAndSupply(slot, referralFeeBps);\n return totalSupply;\n }\n\n /**\n * Use getEstimatedCumulativeBorrowRate() for the most accurate value\n * @returns the stale cumulative borrow rate of the reserve from the last refresh\n */\n getCumulativeBorrowRate(): Decimal {\n const cumulativeBorrowRateBsf = this.state.liquidity.cumulativeBorrowRateBsf.value;\n const accSf = cumulativeBorrowRateBsf.reduce((prev, curr, i) => prev.add(curr.shln(i * 64)), new BN(0));\n return new Fraction(accSf).toDecimal();\n }\n\n /**\n * @Returns estimated cumulative borrow rate of the reserve\n */\n getEstimatedCumulativeBorrowRate(currentSlot: number, referralFeeBps: number): Decimal {\n const currentBorrowRate = new Decimal(this.calculateBorrowAPR(currentSlot, referralFeeBps));\n const slotsElapsed = Math.max(currentSlot - this.state.lastUpdate.slot.toNumber(), 0);\n\n const compoundInterest = this.approximateCompoundedInterest(currentBorrowRate, slotsElapsed);\n\n const previousCumulativeBorrowRate = this.getCumulativeBorrowRate();\n\n return previousCumulativeBorrowRate.mul(compoundInterest);\n }\n\n /**\n * Use getEstimatedCollateralExchangeRate() for the most accurate value\n * @returns the stale exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getCollateralExchangeRate(): Decimal {\n const totalSupply = this.getTotalSupply();\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the estimated exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getEstimatedCollateralExchangeRate(slot: number, referralFeeBps: number): Decimal {\n const totalSupply = this.getEstimatedTotalSupply(slot, referralFeeBps);\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the total USD value of the existing collateral in the reserve\n */\n getDepositTvl = (): Decimal => {\n return new Decimal(this.getTotalSupply().toString()).mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n *\n * Get the total USD value of the borrowed assets from the reserve\n */\n getBorrowTvl = (): Decimal => {\n return this.getBorrowedAmount().mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n * @returns 10^mint_decimals\n */\n getMintFactor(): Decimal {\n return new Decimal(10).pow(this.state.liquidity.mintDecimals.toNumber());\n }\n\n /**\n * @Returns true if the total liquidity supply of the reserve is greater than the deposit limit\n */\n depositLimitCrossed(): boolean {\n return this.getTotalSupply().gt(new Decimal(this.state.config.depositLimit.toString()));\n }\n\n /**\n * @Returns true if the total borrowed amount of the reserve is greater than the borrow limit\n */\n borrowLimitCrossed(): boolean {\n return this.getBorrowedAmount().gt(new Decimal(this.state.config.borrowLimit.toString()));\n }\n\n /**\n *\n * @returns the max capacity of the daily deposit withdrawal cap\n */\n getDepositWithdrawalCapCapacity(): Decimal {\n return new Decimal(this.state.config.depositWithdrawalCap.configCapacity.toString());\n }\n\n /**\n *\n * @returns the current capacity of the daily deposit withdrawal cap\n */\n getDepositWithdrawalCapCurrent(slot: number): Decimal {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n if (slotsElapsed > SLOTS_PER_DAY) {\n return new Decimal(0);\n } else {\n return new Decimal(this.state.config.depositWithdrawalCap.currentTotal.toString());\n }\n }\n\n /**\n *\n * @returns the max capacity of the daily debt withdrawal cap\n */\n getDebtWithdrawalCapCapacity(): Decimal {\n return new Decimal(this.state.config.debtWithdrawalCap.configCapacity.toString());\n }\n\n /**\n *\n * @returns the borrow limit of the reserve outside the elevation group\n */\n getBorrowLimitOutsideElevationGroup(): Decimal {\n return new Decimal(this.state.config.borrowLimitOutsideElevationGroup.toString());\n }\n\n /**\n *\n * @returns the borrowed amount of the reserve outside the elevation group\n */\n getBorrowedAmountOutsideElevationGroup(): Decimal {\n return new Decimal(this.state.borrowedAmountOutsideElevationGroup.toString());\n }\n\n /**\n *\n * @returns the borrow limit against the collateral reserve in the elevation group\n */\n getBorrowLimitAgainstCollateralInElevationGroup(elevationGroupIndex: number): Decimal {\n return new Decimal(\n this.state.config.borrowLimitAgainstThisCollateralInElevationGroup[elevationGroupIndex].toString()\n );\n }\n\n /**\n *\n * @returns the borrowed amount against the collateral reserve in the elevation group\n */\n getBorrowedAmountAgainstCollateralInElevationGroup(elevationGroupIndex: number): Decimal {\n return new Decimal(this.state.borrowedAmountsAgainstThisReserveInElevationGroups[elevationGroupIndex].toString());\n }\n\n /**\n *\n * @returns the current capacity of the daily debt withdrawal cap\n */\n getDebtWithdrawalCapCurrent(slot: number): Decimal {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n if (slotsElapsed > SLOTS_PER_DAY) {\n return new Decimal(0);\n } else {\n return new Decimal(this.state.config.debtWithdrawalCap.currentTotal.toString());\n }\n }\n\n getBorrowFactor(): Decimal {\n return new Decimal(this.state.config.borrowFactorPct.toString()).div(100);\n }\n\n calculateSupplyAPR(slot: number, referralFeeBps: number) {\n const currentUtilization = this.calculateUtilizationRatio();\n\n const borrowRate = this.calculateEstimatedBorrowRate(slot, referralFeeBps);\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n return currentUtilization * borrowRate * protocolTakeRatePct;\n }\n\n getEstimatedDebtAndSupply(slot: number, referralFeeBps: number): { totalBorrow: Decimal; totalSupply: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let totalBorrow: Decimal;\n let totalSupply: Decimal;\n if (slotsElapsed === 0) {\n totalBorrow = this.getBorrowedAmount();\n totalSupply = this.getTotalSupply();\n } else {\n const { newDebt, newAccProtocolFees, pendingReferralFees } = this.compoundInterest(slotsElapsed, referralFeeBps);\n const newTotalSupply = this.getLiquidityAvailableAmount()\n .add(newDebt)\n .sub(newAccProtocolFees)\n .sub(this.getAccumulatedReferrerFees())\n .sub(pendingReferralFees);\n totalBorrow = newDebt;\n totalSupply = newTotalSupply;\n }\n return { totalBorrow, totalSupply };\n }\n\n getEstimatedAccumulatedProtocolFees(\n slot: number,\n referralFeeBps: number\n ): { accumulatedProtocolFees: Decimal; compoundedVariableProtocolFee: Decimal; compoundedFixedHostFee: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let accumulatedProtocolFees: Decimal;\n let compoundedVariableProtocolFee: Decimal;\n let compoundedFixedHostFee: Decimal;\n if (slotsElapsed === 0) {\n accumulatedProtocolFees = this.getAccumulatedProtocolFees();\n compoundedVariableProtocolFee = new Decimal(0);\n compoundedFixedHostFee = new Decimal(0);\n } else {\n const { newAccProtocolFees, variableProtocolFee, fixedHostFee } = this.compoundInterest(\n slotsElapsed,\n referralFeeBps\n );\n accumulatedProtocolFees = newAccProtocolFees;\n compoundedVariableProtocolFee = variableProtocolFee;\n compoundedFixedHostFee = fixedHostFee;\n }\n return { accumulatedProtocolFees, compoundedVariableProtocolFee, compoundedFixedHostFee };\n }\n\n calculateUtilizationRatio() {\n const totalBorrows = this.getBorrowedAmount();\n const totalSupply = this.getTotalSupply();\n if (totalSupply.eq(0)) {\n return 0;\n }\n return totalBorrows.dividedBy(totalSupply).toNumber();\n }\n\n getEstimatedUtilizationRatio(slot: number, referralFeeBps: number) {\n const { totalBorrow: estimatedTotalBorrowed, totalSupply: estimatedTotalSupply } = this.getEstimatedDebtAndSupply(\n slot,\n referralFeeBps\n );\n if (estimatedTotalSupply.eq(0)) {\n return 0;\n }\n\n return estimatedTotalBorrowed.dividedBy(estimatedTotalSupply).toNumber();\n }\n\n calcSimulatedUtilizationRatio(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ): number {\n const { totalBorrow: previousTotalBorrowed, totalSupply: previousTotalSupply } = this.getEstimatedDebtAndSupply(\n slot,\n referralFeeBps\n );\n\n switch (action) {\n case 'deposit': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'withdraw': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n if (newTotalSupply.eq(0)) {\n return 0;\n } else {\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n }\n case 'borrow': {\n const newTotalBorrowed = previousTotalBorrowed.add(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'repay': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'depositAndBorrow': {\n const newTotalSupply = previousTotalSupply.add(amount);\n const newTotalBorrowed = previousTotalBorrowed.add(outflowAmount!);\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'repayAndWithdraw': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n const newTotalSupply = previousTotalSupply.sub(outflowAmount!);\n if (newTotalSupply.eq(0)) {\n return 0;\n }\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'mint': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'redeem': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n default:\n throw Error(`Invalid action type ${action} for simulatedUtilizationRatio`);\n }\n }\n\n getMaxBorrowAmountWithCollReserve(market: KaminoMarket, collReserve: KaminoReserve, slot: number): Decimal {\n const groupsColl = collReserve.state.config.elevationGroups;\n const groupsDebt = this.state.config.elevationGroups;\n const groups = market.state.elevationGroups;\n const commonElevationGroups = [...groupsColl].filter(\n (item) => groupsDebt.includes(item) && item !== 0 && groups[item - 1].debtReserve.equals(this.address)\n );\n\n let eModeGroup = 0;\n\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 eModeGroup = groups.find((group) => group.id === eModeGroupWithMaxLtvAndDebtReserve)!.id;\n }\n\n const elevationGroupActivated = this.state.config.elevationGroups.includes(eModeGroup) && eModeGroup !== 0;\n\n const reserveAvailableAmount = this.getLiquidityAvailableAmount();\n const reserveBorrowCapRemained = this.stats.reserveBorrowLimit.sub(this.getBorrowedAmount());\n\n let maxBorrowAmount = Decimal.min(reserveAvailableAmount, reserveBorrowCapRemained);\n\n const debtWithdrawalCap = this.getDebtWithdrawalCapCapacity().sub(this.getDebtWithdrawalCapCurrent(slot));\n maxBorrowAmount = this.getDebtWithdrawalCapCapacity().gt(0)\n ? Decimal.min(maxBorrowAmount, debtWithdrawalCap)\n : maxBorrowAmount;\n\n let originationFeeRate = this.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 = this.state.config.utilizationLimitBlockBorrowingAbove / 100;\n const currentUtilizationRatio = this.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 this.getTotalSupply()\n );\n maxBorrowAmount = Decimal.min(maxBorrowAmount, maxBorrowBasedOnUtilization);\n }\n\n let borrowLimitDependentOnElevationGroup = new Decimal(U64_MAX);\n\n if (!elevationGroupActivated) {\n borrowLimitDependentOnElevationGroup = this.getBorrowLimitOutsideElevationGroup().sub(\n this.getBorrowedAmountOutsideElevationGroup()\n );\n } else {\n let maxDebtTakenAgainstCollaterals = new Decimal(U64_MAX);\n const maxDebtAllowedAgainstCollateral = collReserve\n .getBorrowLimitAgainstCollateralInElevationGroup(eModeGroup - 1)\n .sub(collReserve.getBorrowedAmountAgainstCollateralInElevationGroup(eModeGroup - 1));\n\n maxDebtTakenAgainstCollaterals = Decimal.max(\n new Decimal(0),\n Decimal.min(maxDebtAllowedAgainstCollateral, maxDebtTakenAgainstCollaterals)\n );\n borrowLimitDependentOnElevationGroup = maxDebtTakenAgainstCollaterals;\n }\n\n maxBorrowAmount = Decimal.min(maxBorrowAmount, borrowLimitDependentOnElevationGroup);\n\n return Decimal.max(new Decimal(0), maxBorrowAmount);\n }\n\n calcSimulatedBorrowAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(newUtilization, curve) * slotAdjustmentFactor;\n }\n\n calcSimulatedSupplyAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const simulatedBorrowAPR = this.calcSimulatedBorrowAPR(amount, action, slot, referralFeeBps, outflowAmount);\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n\n return newUtilization * simulatedBorrowAPR * protocolTakeRatePct;\n }\n\n slotAdjustmentFactor(): number {\n return 1000 / SLOTS_PER_SECOND / this.recentSlotDurationMs;\n }\n\n calculateBorrowRate() {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const currentUtilization = this.calculateUtilizationRatio();\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n\n return getBorrowRate(currentUtilization, curve) * slotAdjustmentFactor;\n }\n\n calculateEstimatedBorrowRate(slot: number, referralFeeBps: number) {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const estimatedCurrentUtilization = this.getEstimatedUtilizationRatio(slot, referralFeeBps);\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(estimatedCurrentUtilization, curve) * slotAdjustmentFactor;\n }\n\n calculateBorrowAPR(slot: number, referralFeeBps: number) {\n const borrowRate = this.calculateEstimatedBorrowRate(slot, referralFeeBps);\n return borrowRate + this.getFixedHostInterestRate().toNumber();\n }\n\n /**\n * @returns the mint of the reserve liquidity token\n */\n getLiquidityMint(): PublicKey {\n return this.state.liquidity.mintPubkey;\n }\n\n /**\n * @returns the token program of the reserve liquidity mint\n */\n getLiquidityTokenProgram(): PublicKey {\n return this.state.liquidity.tokenProgram;\n }\n\n /**\n * @returns the mint of the reserve collateral token , i.e. the cToken minted for depositing the liquidity token\n */\n getCTokenMint(): PublicKey {\n return this.state.collateral.mintPubkey;\n }\n\n setBuffer(buffer: AccountInfo<Buffer> | null) {\n this.buffer = buffer;\n }\n\n async load(tokenOraclePrice: TokenOracleData) {\n if (!this.buffer) {\n this.setBuffer(await this.connection.getAccountInfo(this.address, 'processed'));\n }\n\n if (!this.buffer) {\n throw Error(`Error requesting account info for ${this.symbol}`);\n }\n\n const parsedData = await Reserve.fetch(this.connection, this.address);\n if (!parsedData) {\n throw Error(`Unable to parse data of reserve ${this.symbol}`);\n }\n this.state = parsedData;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = this.formatReserveData(parsedData);\n }\n\n totalSupplyAPY(currentSlot: number) {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n return calculateAPYFromAPR(this.calculateSupplyAPR(currentSlot, 0));\n }\n\n totalBorrowAPY(currentSlot: number) {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n return calculateAPYFromAPR(this.calculateBorrowAPR(currentSlot, 0));\n }\n\n private formatReserveData(parsedData: ReserveFields): ReserveDataType {\n const mintTotalSupply = new Decimal(parsedData.collateral.mintTotalSupply.toString()).div(this.getMintFactor());\n let reserveStatus = ReserveStatus.Active;\n switch (parsedData.config.status) {\n case 0:\n reserveStatus = ReserveStatus.Active;\n break;\n case 1:\n reserveStatus = ReserveStatus.Obsolete;\n break;\n case 2:\n reserveStatus = ReserveStatus.Hidden;\n break;\n }\n return {\n // Reserve config\n\n status: reserveStatus,\n mintAddress: parsedData.liquidity.mintPubkey,\n borrowCurve: truncateBorrowCurve(parsedData.config.borrowRateCurve.points),\n loanToValuePct: parsedData.config.loanToValuePct / 100,\n maxLiquidationBonus: parsedData.config.maxLiquidationBonusBps / 10000,\n minLiquidationBonus: parsedData.config.minLiquidationBonusBps / 10000,\n liquidationThreshold: parsedData.config.liquidationThresholdPct / 100,\n protocolTakeRate: parsedData.config.protocolTakeRatePct / 100,\n reserveDepositLimit: new Decimal(parsedData.config.depositLimit.toString()),\n reserveBorrowLimit: new Decimal(parsedData.config.borrowLimit.toString()),\n\n // Reserve info\n symbol: parseTokenSymbol(parsedData.config.tokenInfo.name),\n decimals: this.state.liquidity.mintDecimals.toNumber(),\n accumulatedProtocolFees: this.getAccumulatedProtocolFees().div(this.getMintFactor()),\n mintTotalSupply,\n depositLimitCrossedSlot: parsedData.liquidity.depositLimitCrossedSlot.toNumber(),\n borrowLimitCrossedSlot: parsedData.liquidity.borrowLimitCrossedSlot.toNumber(),\n borrowFactor: parsedData.config.borrowFactorPct.toNumber(),\n };\n }\n\n /**\n * Compound current borrow rate over elapsed slots\n *\n * This also calculates protocol fees, which are taken for all obligations that have borrowed from current reserve.\n *\n * This also calculates referral fees, which are taken into pendingReferralFees.\n *\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L517\n *\n * @param slotsElapsed\n * @param referralFeeBps\n */\n private compoundInterest(\n slotsElapsed: number,\n referralFeeBps: number\n ): {\n newDebt: Decimal;\n netNewDebt: Decimal;\n variableProtocolFee: Decimal;\n fixedHostFee: Decimal;\n absoluteReferralFee: Decimal;\n maxReferralFees: Decimal;\n newAccProtocolFees: Decimal;\n pendingReferralFees: Decimal;\n } {\n const currentBorrowRate = this.calculateBorrowRate();\n const protocolTakeRate = new Decimal(this.state.config.protocolTakeRatePct).div(100);\n const referralRate = new Decimal(referralFeeBps).div(10_000);\n const fixedHostInterestRate = this.getFixedHostInterestRate();\n\n const compoundedInterestRate = this.approximateCompoundedInterest(\n new Decimal(currentBorrowRate).plus(fixedHostInterestRate),\n slotsElapsed\n );\n const compoundedFixedRate = this.approximateCompoundedInterest(fixedHostInterestRate, slotsElapsed);\n\n const previousDebt = this.getBorrowedAmount();\n const newDebt = previousDebt.mul(compoundedInterestRate);\n const fixedHostFee = previousDebt.mul(compoundedFixedRate).sub(previousDebt);\n\n const netNewDebt = newDebt.sub(previousDebt).sub(fixedHostFee);\n\n const variableProtocolFee = netNewDebt.mul(protocolTakeRate);\n const absoluteReferralFee = protocolTakeRate.mul(referralRate);\n const maxReferralFees = netNewDebt.mul(absoluteReferralFee);\n\n const newAccProtocolFees = variableProtocolFee\n .add(fixedHostFee)\n .sub(maxReferralFees)\n .add(this.getAccumulatedProtocolFees());\n\n const pendingReferralFees = this.getPendingReferrerFees().add(maxReferralFees);\n\n return {\n newDebt,\n netNewDebt,\n variableProtocolFee,\n fixedHostFee,\n absoluteReferralFee,\n maxReferralFees,\n newAccProtocolFees,\n pendingReferralFees,\n };\n }\n\n /**\n * Approximation to match the smart contract calculation\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L1026\n * @param rate\n * @param elapsedSlots\n * @private\n */\n private approximateCompoundedInterest(rate: Decimal, elapsedSlots: number): Decimal {\n const base = rate.div(SLOTS_PER_YEAR);\n switch (elapsedSlots) {\n case 0:\n return new Decimal(1);\n case 1:\n return base.add(1);\n case 2:\n return base.add(1).mul(base.add(1));\n case 3:\n return base.add(1).mul(base.add(1)).mul(base.add(1));\n case 4:\n // eslint-disable-next-line no-case-declarations\n const pow2 = base.add(1).mul(base.add(1));\n return pow2.mul(pow2);\n }\n const exp = elapsedSlots;\n const expMinus1 = exp - 1;\n const expMinus2 = exp - 2;\n\n const basePow2 = base.mul(base);\n const basePow3 = basePow2.mul(base);\n\n const firstTerm = base.mul(exp);\n const secondTerm = basePow2.mul(exp).mul(expMinus1).div(2);\n const thirdTerm = basePow3.mul(exp).mul(expMinus1).mul(expMinus2).div(6);\n\n return new Decimal(1).add(firstTerm).add(secondTerm).add(thirdTerm);\n }\n}\n\nconst truncateBorrowCurve = (points: CurvePointFields[]): [number, number][] => {\n const curve: [number, number][] = [];\n for (const { utilizationRateBps, borrowRateBps } of points) {\n curve.push([utilizationRateBps / ONE_HUNDRED_PCT_IN_BPS, borrowRateBps / ONE_HUNDRED_PCT_IN_BPS]);\n\n if (utilizationRateBps === ONE_HUNDRED_PCT_IN_BPS) {\n break;\n }\n }\n return curve;\n};\n\nexport async function createReserveIxs(\n connection: Connection,\n owner: PublicKey,\n lendingMarket: PublicKey,\n liquidityMint: PublicKey,\n reserveAddress: PublicKey,\n programId: PublicKey\n): Promise<TransactionInstruction[]> {\n const size = Reserve.layout.span + 8;\n\n const createReserveIx = SystemProgram.createAccount({\n fromPubkey: owner,\n newAccountPubkey: reserveAddress,\n lamports: await connection.getMinimumBalanceForRentExemption(size),\n space: size,\n programId: programId,\n });\n\n const { liquiditySupplyVault, collateralMint, collateralSupplyVault, feeVault } = reservePdas(\n programId,\n lendingMarket,\n liquidityMint\n );\n const [lendingMarketAuthority, _] = lendingMarketAuthPda(lendingMarket, programId);\n\n const accounts: InitReserveAccounts = {\n lendingMarketOwner: owner,\n lendingMarket: lendingMarket,\n lendingMarketAuthority: lendingMarketAuthority,\n reserve: reserveAddress,\n reserveLiquidityMint: liquidityMint,\n reserveLiquiditySupply: liquiditySupplyVault,\n feeReceiver: feeVault,\n reserveCollateralMint: collateralMint,\n reserveCollateralSupply: collateralSupplyVault,\n liquidityTokenProgram: TOKEN_PROGRAM_ID,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n };\n\n const initReserveIx = initReserve(accounts, programId);\n\n return [createReserveIx, initReserveIx];\n}\n\nexport function updateReserveConfigIx(\n marketWithAddress: MarketWithAddress,\n reserveAddress: PublicKey,\n modeDiscriminator: number,\n value: Uint8Array,\n programId: PublicKey\n): TransactionInstruction {\n value;\n const args: UpdateReserveConfigArgs = {\n mode: new anchor.BN(modeDiscriminator),\n value: value,\n skipValidation: false,\n };\n\n const accounts: UpdateReserveConfigAccounts = {\n lendingMarketOwner: marketWithAddress.state.lendingMarketOwner,\n lendingMarket: marketWithAddress.address,\n reserve: reserveAddress,\n };\n\n const ix = updateReserveConfig(args, accounts, programId);\n\n return ix;\n}\n\nexport function updateEntireReserveConfigIx(\n marketWithAddress: MarketWithAddress,\n reserveAddress: PublicKey,\n reserveConfig: ReserveConfig,\n programId: PublicKey\n): TransactionInstruction {\n const layout = ReserveConfig.layout();\n const data = Buffer.alloc(1000);\n const len = layout.encode(reserveConfig.toEncodable(), data);\n const value = Uint8Array.from([...data.subarray(0, len)]);\n\n const args: UpdateReserveConfigArgs = {\n mode: new anchor.BN(25),\n value: value,\n skipValidation: true,\n };\n\n const accounts: UpdateReserveConfigAccounts = {\n lendingMarketOwner: marketWithAddress.state.lendingMarketOwner,\n lendingMarket: marketWithAddress.address,\n reserve: reserveAddress,\n };\n\n const ix = updateReserveConfig(args, accounts, programId);\n\n return ix;\n}\n\nexport function parseForChangesReserveConfigAndGetIxs(\n marketWithAddress: MarketWithAddress,\n reserve: Reserve | undefined,\n reserveAddress: PublicKey,\n reserveConfig: ReserveConfig,\n programId: PublicKey\n) {\n const updateReserveIxnsArgs: { mode: number; value: Uint8Array }[] = [];\n for (const key in reserveConfig.toEncodable()) {\n if (key === 'borrowRateCurve') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateBorrowRateCurve.discriminator,\n value: updateReserveConfigEncodedValue(UpdateBorrowRateCurve.discriminator, reserveConfig.borrowRateCurve),\n });\n } else {\n for (let i = 0; i < reserveConfig.borrowRateCurve.points.length; i++) {\n if (\n reserve.config.borrowRateCurve.points[i].utilizationRateBps !==\n reserveConfig.borrowRateCurve.points[i].utilizationRateBps ||\n reserve.config.borrowRateCurve.points[i].borrowRateBps !==\n reserveConfig.borrowRateCurve.points[i].borrowRateBps\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateBorrowRateCurve.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateBorrowRateCurve.discriminator,\n reserveConfig.borrowRateCurve\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'fees') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n reserveConfig.fees.borrowFeeSf.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n reserveConfig.fees.flashLoanFeeSf.toNumber()\n ),\n });\n } else if (!reserve.config.fees.borrowFeeSf.eq(reserveConfig.fees.borrowFeeSf)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n reserveConfig.fees.borrowFeeSf.toNumber()\n ),\n });\n } else if (!reserve.config.fees.flashLoanFeeSf.eq(reserveConfig.fees.flashLoanFeeSf)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n reserveConfig.fees.flashLoanFeeSf.toNumber()\n ),\n });\n }\n } else if (key === 'depositLimit') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositLimit.discriminator,\n reserveConfig.depositLimit.toNumber()\n ),\n });\n } else if (!reserve.config.depositLimit.eq(reserveConfig.depositLimit)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositLimit.discriminator,\n reserveConfig.depositLimit.toNumber()\n ),\n });\n }\n } else if (key === 'borrowLimit') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowLimit.discriminator,\n reserveConfig.borrowLimit.toNumber()\n ),\n });\n } else if (!reserve.config.borrowLimit.eq(reserveConfig.borrowLimit)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowLimit.discriminator,\n reserveConfig.borrowLimit.toNumber()\n ),\n });\n }\n } else if (key === 'maxLiquidationBonusBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n reserveConfig.maxLiquidationBonusBps\n ),\n });\n } else if (reserve.config.maxLiquidationBonusBps !== reserveConfig.maxLiquidationBonusBps) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n reserveConfig.maxLiquidationBonusBps\n ),\n });\n }\n } else if (key === 'minLiquidationBonusBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n reserveConfig.minLiquidationBonusBps\n ),\n });\n } else if (reserve.config.minLiquidationBonusBps !== reserveConfig.minLiquidationBonusBps) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n reserveConfig.minLiquidationBonusBps\n ),\n });\n }\n } else if (key === 'badDebtLiquidationBonusBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n reserveConfig.badDebtLiquidationBonusBps\n ),\n });\n } else if (reserve.config.badDebtLiquidationBonusBps !== reserveConfig.badDebtLiquidationBonusBps) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n reserveConfig.badDebtLiquidationBonusBps\n ),\n });\n }\n } else if (key === 'liquidationThresholdPct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n reserveConfig.liquidationThresholdPct\n ),\n });\n } else if (reserve.config.liquidationThresholdPct !== reserveConfig.liquidationThresholdPct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n reserveConfig.liquidationThresholdPct\n ),\n });\n }\n } else if (key === 'protocolTakeRatePct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n reserveConfig.protocolTakeRatePct\n ),\n });\n } else if (reserve.config.protocolTakeRatePct !== reserveConfig.protocolTakeRatePct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n reserveConfig.protocolTakeRatePct\n ),\n });\n }\n } else if (key === 'status') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateReserveStatus.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateReserveStatus.discriminator,\n reserveConfig.status\n ),\n });\n } else if (reserve.config.status !== reserveConfig.status) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateReserveStatus.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateReserveStatus.discriminator,\n reserveConfig.status\n ),\n });\n }\n } else if (key === 'disableUsageAsCollOutsideEmode') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n reserveConfig.disableUsageAsCollOutsideEmode\n ),\n });\n } else if (reserve.config.disableUsageAsCollOutsideEmode !== reserveConfig.disableUsageAsCollOutsideEmode) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n reserveConfig.disableUsageAsCollOutsideEmode\n ),\n });\n }\n } else if (key === 'utilizationLimitBlockBorrowingAbove') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n reserveConfig.utilizationLimitBlockBorrowingAbove\n ),\n });\n } else if (\n reserve.config.utilizationLimitBlockBorrowingAbove !== reserveConfig.utilizationLimitBlockBorrowingAbove\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n reserveConfig.utilizationLimitBlockBorrowingAbove\n ),\n });\n }\n } else if (key === 'deleveragingThresholdSlotsPerBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n reserveConfig.deleveragingThresholdSlotsPerBps.toNumber()\n ),\n });\n } else if (!reserve.config.deleveragingThresholdSlotsPerBps.eq(reserveConfig.deleveragingThresholdSlotsPerBps)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n reserveConfig.deleveragingThresholdSlotsPerBps.toNumber()\n ),\n });\n }\n } else if (key === 'depositWithdrawalCap') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator, [\n reserveConfig.depositWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n reserveConfig.depositWithdrawalCap.currentTotal.toNumber()\n ),\n });\n } else if (\n !reserve.config.depositWithdrawalCap.configCapacity.eq(reserveConfig.depositWithdrawalCap.configCapacity) ||\n !reserve.config.depositWithdrawalCap.configIntervalLengthSeconds.eq(\n reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator, [\n reserveConfig.depositWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n } else if (\n !reserve.config.depositWithdrawalCap.currentTotal.eq(reserveConfig.depositWithdrawalCap.currentTotal)\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n reserveConfig.depositWithdrawalCap.currentTotal.toNumber()\n ),\n });\n }\n } else if (key === 'debtWithdrawalCap') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator, [\n reserveConfig.debtWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n reserveConfig.debtWithdrawalCap.currentTotal.toNumber()\n ),\n });\n } else if (\n !reserve.config.debtWithdrawalCap.configCapacity.eq(reserveConfig.debtWithdrawalCap.configCapacity) ||\n !reserve.config.debtWithdrawalCap.configIntervalLengthSeconds.eq(\n reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator, [\n reserveConfig.debtWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n } else if (!reserve.config.debtWithdrawalCap.currentTotal.eq(reserveConfig.debtWithdrawalCap.currentTotal)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n reserveConfig.debtWithdrawalCap.currentTotal.toNumber()\n ),\n });\n }\n } else if (key === 'elevationGroups') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateElevationGroup.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateElevationGroup.discriminator,\n reserveConfig.elevationGroups\n ),\n });\n } else {\n for (let i = 0; i < reserveConfig.elevationGroups.length; i++) {\n if (reserve.config.elevationGroups[i] !== reserveConfig.elevationGroups[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateElevationGroup.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateElevationGroup.discriminator,\n reserveConfig.elevationGroups\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'borrowFactorPct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowFactor.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowFactor.discriminator,\n reserveConfig.borrowFactorPct.toNumber()\n ),\n });\n } else if (!reserve.config.borrowFactorPct.eq(reserveConfig.borrowFactorPct)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowFactor.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowFactor.discriminator,\n reserveConfig.borrowFactorPct.toNumber()\n ),\n });\n }\n } else if (key === 'loanToValuePct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n reserveConfig.loanToValuePct\n ),\n });\n } else if (reserve.config.loanToValuePct !== reserveConfig.loanToValuePct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n reserveConfig.loanToValuePct\n ),\n });\n }\n } else if (key === 'protocolLiquidationFeePct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n reserveConfig.protocolLiquidationFeePct\n ),\n });\n } else if (reserve.config.protocolLiquidationFeePct !== reserveConfig.protocolLiquidationFeePct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n reserveConfig.protocolLiquidationFeePct\n ),\n });\n }\n } else if (key === 'multiplierSideBoost') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n reserveConfig.multiplierSideBoost\n ),\n });\n } else {\n for (let i = 0; i < reserveConfig.multiplierSideBoost.length; i++) {\n if (reserve.config.multiplierSideBoost[i] !== reserveConfig.multiplierSideBoost[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n reserveConfig.multiplierSideBoost\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'multiplierTagBoost') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n reserveConfig.multiplierTagBoost\n ),\n });\n } else {\n for (let i = 0; i < reserveConfig.multiplierTagBoost.length; i++) {\n if (reserve.config.multiplierTagBoost[i] !== reserveConfig.multiplierTagBoost[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n reserveConfig.multiplierTagBoost\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'deleveragingMarginCallPeriodSecs') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n reserveConfig.deleveragingMarginCallPeriodSecs.toNumber()\n ),\n });\n } else if (!reserve.config.deleveragingMarginCallPeriodSecs.eq(reserveConfig.deleveragingMarginCallPeriodSecs)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n reserveConfig.deleveragingMarginCallPeriodSecs.toNumber()\n ),\n });\n }\n } else if (key === 'assetTier') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateAssetTier.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateAssetTier.discriminator,\n reserveConfig.assetTier\n ),\n });\n } else if (reserve.config.assetTier !== reserveConfig.assetTier) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateAssetTier.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateAssetTier.discriminator,\n reserveConfig.assetTier\n ),\n });\n }\n } else if (key === 'tokenInfo') {\n const tokenInfo = reserveConfig.tokenInfo;\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoName.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateTokenInfoName.discriminator, tokenInfo.name),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n tokenInfo.heuristic.lower.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n tokenInfo.heuristic.upper.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n tokenInfo.heuristic.exp.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n tokenInfo.maxTwapDivergenceBps.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n tokenInfo.maxAgePriceSeconds.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n tokenInfo.maxAgeTwapSeconds.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n tokenInfo.scopeConfiguration.priceChain\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n tokenInfo.scopeConfiguration.twapChain\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n tokenInfo.switchboardConfiguration.priceAggregator\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n tokenInfo.switchboardConfiguration.twapAggregator\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdatePythPrice.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdatePythPrice.discriminator,\n tokenInfo.pythConfiguration.price\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n tokenInfo.blockPriceUsage\n ),\n });\n } else {\n for (let i = 0; i < tokenInfo.name.length; i++) {\n if (reserve.config.tokenInfo.name[i] !== tokenInfo.name[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoName.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoName.discriminator,\n tokenInfo.name\n ),\n });\n break;\n }\n }\n if (!reserve.config.tokenInfo.heuristic.lower.eq(tokenInfo.heuristic.lower)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n tokenInfo.heuristic.lower.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.heuristic.upper.eq(tokenInfo.heuristic.upper)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n tokenInfo.heuristic.upper.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.heuristic.exp.eq(tokenInfo.heuristic.exp)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n tokenInfo.heuristic.exp.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.maxTwapDivergenceBps.eq(tokenInfo.maxTwapDivergenceBps)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n tokenInfo.maxTwapDivergenceBps.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.maxAgePriceSeconds.eq(tokenInfo.maxAgePriceSeconds)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n tokenInfo.maxAgePriceSeconds.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.maxAgeTwapSeconds.eq(tokenInfo.maxAgeTwapSeconds)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n tokenInfo.maxAgeTwapSeconds.toNumber()\n ),\n });\n }\n for (let i = 0; i < tokenInfo.scopeConfiguration.priceChain.length; i++) {\n if (\n reserve.config.tokenInfo.scopeConfiguration.priceChain[i] !== tokenInfo.scopeConfiguration.priceChain[i]\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n tokenInfo.scopeConfiguration.priceChain\n ),\n });\n break;\n }\n }\n for (let i = 0; i < tokenInfo.scopeConfiguration.twapChain.length; i++) {\n if (reserve.config.tokenInfo.scopeConfiguration.twapChain[i] !== tokenInfo.scopeConfiguration.twapChain[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n tokenInfo.scopeConfiguration.twapChain\n ),\n });\n break;\n }\n }\n if (\n !reserve.config.tokenInfo.switchboardConfiguration.priceAggregator.equals(\n tokenInfo.switchboardConfiguration.priceAggregator\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n tokenInfo.switchboardConfiguration.priceAggregator\n ),\n });\n }\n if (\n !reserve.config.tokenInfo.switchboardConfiguration.twapAggregator.equals(\n tokenInfo.switchboardConfiguration.twapAggregator\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n tokenInfo.switchboardConfiguration.twapAggregator\n ),\n });\n }\n if (!reserve.config.tokenInfo.pythConfiguration.price.equals(tokenInfo.pythConfiguration.price)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdatePythPrice.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdatePythPrice.discriminator,\n tokenInfo.pythConfiguration.price\n ),\n });\n }\n if (reserve.config.tokenInfo.blockPriceUsage !== tokenInfo.blockPriceUsage) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n tokenInfo.blockPriceUsage\n ),\n });\n }\n if (!reserve.config.tokenInfo.scopeConfiguration.priceFeed.equals(tokenInfo.scopeConfiguration.priceFeed)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateScopePriceFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateScopePriceFeed.discriminator,\n tokenInfo.scopeConfiguration.priceFeed\n ),\n });\n }\n }\n }\n } // for loop\n\n const ixns: TransactionInstruction[] = [];\n\n updateReserveIxnsArgs.forEach((updateReserveConfigArgs) => {\n ixns.push(\n updateReserveConfigIx(\n marketWithAddress,\n reserveAddress,\n updateReserveConfigArgs.mode + 1,\n updateReserveConfigArgs.value,\n programId\n )\n );\n });\n\n return ixns;\n}\n\nexport function updateReserveConfigEncodedValue(\n discriminator: number,\n value: number | number[] | BorrowRateCurve | PublicKey\n): Uint8Array {\n let buffer: Buffer;\n let valueArray: number[] = [];\n\n switch (discriminator) {\n case UpdateConfigMode.UpdateLoanToValuePct.discriminator:\n case UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator:\n case UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator:\n case UpdateConfigMode.UpdateProtocolTakeRate.discriminator:\n case UpdateConfigMode.UpdateAssetTier.discriminator:\n case UpdateConfigMode.UpdateReserveStatus.discriminator:\n case UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator:\n case UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator:\n case UpdateConfigMode.UpdateBlockPriceUsage.discriminator:\n buffer = Buffer.alloc(1);\n buffer.writeUIntLE(value as number, 0, 1);\n break;\n case UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator:\n case UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator:\n case UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator:\n buffer = Buffer.alloc(2);\n buffer.writeUInt16LE(value as number, 0);\n break;\n case UpdateConfigMode.UpdateFeesBorrowFee.discriminator:\n case UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator:\n case UpdateConfigMode.UpdateDepositLimit.discriminator:\n case UpdateConfigMode.UpdateBorrowLimit.discriminator:\n case UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator:\n case UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator:\n case UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator:\n case UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator:\n case UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator:\n case UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator:\n case UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator:\n case UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator:\n case UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator:\n case UpdateConfigMode.UpdateBorrowFactor.discriminator:\n case UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator:\n value = value as number;\n buffer = Buffer.alloc(8);\n buffer.writeBigUint64LE(BigInt(value), 0);\n break;\n case UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator:\n case UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(8);\n for (let i = 0; i < valueArray.length; i++) {\n buffer.writeUInt16LE(valueArray[i], 2 * i);\n }\n break;\n case UpdateConfigMode.UpdateTokenInfoName.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(32);\n for (let i = 0; i < valueArray.length; i++) {\n buffer.writeUIntLE(valueArray[i], i, 1);\n }\n break;\n case UpdateConfigMode.UpdateScopePriceFeed.discriminator:\n case UpdateConfigMode.UpdatePythPrice.discriminator:\n case UpdateConfigMode.UpdateSwitchboardFeed.discriminator:\n case UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator:\n case UpdateConfigMode.UpdateFarmCollateral.discriminator:\n case UpdateConfigMode.UpdateFarmDebt.discriminator:\n buffer = (value as PublicKey).toBuffer();\n break;\n case UpdateConfigMode.UpdateBorrowRateCurve.discriminator:\n buffer = serializeBorrowRateCurve(value as BorrowRateCurve);\n break;\n case UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator:\n case UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(16);\n buffer.writeBigUint64LE(BigInt(valueArray[0]), 0);\n buffer.writeBigUInt64LE(BigInt(valueArray[1]), 8);\n break;\n case UpdateConfigMode.UpdateElevationGroup.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(20);\n for (let i = 0; i < valueArray.length; i++) {\n buffer.writeUIntLE(valueArray[i], i, 1);\n }\n break;\n case UpdateConfigMode.UpdateMultiplierTagBoost.discriminator:\n case UpdateConfigMode.UpdateMultiplierSideBoost.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(2);\n buffer.writeUIntLE(valueArray[0], 0, 1);\n buffer.writeUIntLE(valueArray[1], 1, 1);\n break;\n default:\n buffer = Buffer.alloc(0);\n }\n\n return Uint8Array.from([...buffer]);\n}\n\nexport function serializeBorrowRateCurve(curve: BorrowRateCurve): Buffer {\n const buffer = Buffer.alloc(4 + 8 * curve.points.length);\n buffer.writeUInt32LE(curve.points.length, 0);\n for (let i = 0; i < curve.points.length; i++) {\n buffer.writeUInt32LE(curve.points[i].utilizationRateBps, 4 + 8 * i);\n buffer.writeUInt32LE(curve.points[i].borrowRateBps, 8 + 8 * i);\n }\n return buffer;\n}\n\nexport type ReserveWithAddress = {\n address: PublicKey;\n state: Reserve;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"reserve.js","sourceRoot":"","sources":["../../src/classes/reserve.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport {\n AccountInfo,\n Connection,\n PublicKey,\n SystemProgram,\n SYSVAR_RENT_PUBKEY,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport {\n INITIAL_COLLATERAL_RATE,\n lendingMarketAuthPda,\n MarketWithAddress,\n ONE_HUNDRED_PCT_IN_BPS,\n reservePdas,\n SLOTS_PER_DAY,\n SLOTS_PER_SECOND,\n SLOTS_PER_YEAR,\n TokenOracleData,\n U64_MAX,\n} from '../utils';\nimport { ReserveDataType, ReserveStatus } from './shared';\nimport { Reserve, ReserveFields } from '../idl_codegen/accounts';\nimport { BorrowRateCurve, CurvePointFields, ReserveConfig, UpdateConfigMode } from '../idl_codegen/types';\nimport { calculateAPYFromAPR, getBorrowRate, parseTokenSymbol } from './utils';\nimport { Fraction } from './fraction';\nimport BN from 'bn.js';\nimport { ActionType } from './action';\nimport { KaminoMarket } from './market';\nimport {\n initReserve,\n InitReserveAccounts,\n updateReserveConfig,\n UpdateReserveConfigAccounts,\n UpdateReserveConfigArgs,\n} from '../lib';\nimport * as anchor from '@coral-xyz/anchor';\nimport { TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport { UpdateBorrowRateCurve } from '../idl_codegen/types/UpdateConfigMode';\n\nexport const DEFAULT_RECENT_SLOT_DURATION_MS = 450;\n\nexport class KaminoReserve {\n state: Reserve;\n address: PublicKey;\n symbol: string;\n\n tokenOraclePrice: TokenOracleData;\n stats: ReserveDataType;\n\n private buffer: AccountInfo<Buffer> | null;\n private connection: Connection;\n private readonly recentSlotDurationMs: number;\n\n constructor(\n state: Reserve,\n address: PublicKey,\n tokenOraclePrice: TokenOracleData,\n connection: Connection,\n recentSlotDurationMs: number\n ) {\n this.state = state;\n this.address = address;\n this.buffer = null;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = {} as ReserveDataType;\n this.connection = connection;\n this.symbol = parseTokenSymbol(state.config.tokenInfo.name);\n this.recentSlotDurationMs = recentSlotDurationMs;\n }\n\n static initialize(\n accountData: AccountInfo<Buffer>,\n address: PublicKey,\n state: Reserve,\n tokenOraclePrice: TokenOracleData,\n connection: Connection,\n recentSlotDurationMs: number\n ) {\n const reserve = new KaminoReserve(state, address, tokenOraclePrice, connection, recentSlotDurationMs);\n reserve.setBuffer(accountData);\n reserve.stats = reserve.formatReserveData(state);\n return reserve;\n }\n\n /// GETTERS\n\n /**\n * @returns the parsed token symbol of the reserve\n */\n getTokenSymbol(): string {\n return parseTokenSymbol(this.state.config.tokenInfo.name);\n }\n\n /**\n * @returns the total borrowed amount of the reserve\n */\n getBorrowedAmount(): Decimal {\n return new Fraction(this.state.liquidity.borrowedAmountSf).toDecimal();\n }\n\n /**\n * @returns the available liquidity amount of the reserve\n */\n getLiquidityAvailableAmount(): Decimal {\n return new Decimal(this.state.liquidity.availableAmount.toString());\n }\n\n /**\n *\n * @returns the last cached price stored in the reserve in USD\n */\n getReserveMarketPrice(): Decimal {\n return new Fraction(this.state.liquidity.marketPriceSf).toDecimal();\n }\n\n /**\n * @returns the current market price of the reserve in USD\n */\n getOracleMarketPrice(): Decimal {\n return this.tokenOraclePrice.price;\n }\n\n /**\n * @returns the total accumulated protocol fees of the reserve\n */\n getAccumulatedProtocolFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedProtocolFeesSf).toDecimal();\n }\n\n /**\n * @returns the total accumulated referrer fees of the reserve\n */\n getAccumulatedReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedReferrerFeesSf).toDecimal();\n }\n\n /**\n * @returns the total pending referrer fees of the reserve\n */\n getPendingReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.pendingReferrerFeesSf).toDecimal();\n }\n\n /**\n *\n * @returns the flash loan fee percentage of the reserve\n */\n getFlashLoanFee = (): Decimal => {\n if (this.state.config.fees.flashLoanFeeSf.toString() === U64_MAX) {\n return new Decimal('0');\n }\n return new Fraction(this.state.config.fees.flashLoanFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the origination fee percentage of the reserve\n */\n getBorrowFee = (): Decimal => {\n return new Fraction(this.state.config.fees.borrowFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the fixed interest rate allocated to the host\n */\n getFixedHostInterestRate = (): Decimal => {\n return new Decimal(this.state.config.hostFixedInterestRateBps).div(10_000);\n };\n\n /**\n * Use getEstimatedTotalSupply() for the most accurate value\n * @returns the stale total liquidity supply of the reserve from the last refresh\n */\n getTotalSupply(): Decimal {\n return this.getLiquidityAvailableAmount()\n .add(this.getBorrowedAmount())\n .sub(this.getAccumulatedProtocolFees())\n .sub(this.getAccumulatedReferrerFees())\n .sub(this.getPendingReferrerFees());\n }\n\n /**\n * Calculates the total liquidity supply of the reserve\n */\n getEstimatedTotalSupply(slot: number, referralFeeBps: number): Decimal {\n const { totalSupply } = this.getEstimatedDebtAndSupply(slot, referralFeeBps);\n return totalSupply;\n }\n\n /**\n * Use getEstimatedCumulativeBorrowRate() for the most accurate value\n * @returns the stale cumulative borrow rate of the reserve from the last refresh\n */\n getCumulativeBorrowRate(): Decimal {\n const cumulativeBorrowRateBsf = this.state.liquidity.cumulativeBorrowRateBsf.value;\n const accSf = cumulativeBorrowRateBsf.reduce((prev, curr, i) => prev.add(curr.shln(i * 64)), new BN(0));\n return new Fraction(accSf).toDecimal();\n }\n\n /**\n * @Returns estimated cumulative borrow rate of the reserve\n */\n getEstimatedCumulativeBorrowRate(currentSlot: number, referralFeeBps: number): Decimal {\n const currentBorrowRate = new Decimal(this.calculateBorrowAPR(currentSlot, referralFeeBps));\n const slotsElapsed = Math.max(currentSlot - this.state.lastUpdate.slot.toNumber(), 0);\n\n const compoundInterest = this.approximateCompoundedInterest(currentBorrowRate, slotsElapsed);\n\n const previousCumulativeBorrowRate = this.getCumulativeBorrowRate();\n\n return previousCumulativeBorrowRate.mul(compoundInterest);\n }\n\n /**\n * Use getEstimatedCollateralExchangeRate() for the most accurate value\n * @returns the stale exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getCollateralExchangeRate(): Decimal {\n const totalSupply = this.getTotalSupply();\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the estimated exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getEstimatedCollateralExchangeRate(slot: number, referralFeeBps: number): Decimal {\n const totalSupply = this.getEstimatedTotalSupply(slot, referralFeeBps);\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the total USD value of the existing collateral in the reserve\n */\n getDepositTvl = (): Decimal => {\n return new Decimal(this.getTotalSupply().toString()).mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n *\n * Get the total USD value of the borrowed assets from the reserve\n */\n getBorrowTvl = (): Decimal => {\n return this.getBorrowedAmount().mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n * @returns 10^mint_decimals\n */\n getMintFactor(): Decimal {\n return new Decimal(10).pow(this.state.liquidity.mintDecimals.toNumber());\n }\n\n /**\n * @Returns true if the total liquidity supply of the reserve is greater than the deposit limit\n */\n depositLimitCrossed(): boolean {\n return this.getTotalSupply().gt(new Decimal(this.state.config.depositLimit.toString()));\n }\n\n /**\n * @Returns true if the total borrowed amount of the reserve is greater than the borrow limit\n */\n borrowLimitCrossed(): boolean {\n return this.getBorrowedAmount().gt(new Decimal(this.state.config.borrowLimit.toString()));\n }\n\n /**\n *\n * @returns the max capacity of the daily deposit withdrawal cap\n */\n getDepositWithdrawalCapCapacity(): Decimal {\n return new Decimal(this.state.config.depositWithdrawalCap.configCapacity.toString());\n }\n\n /**\n *\n * @returns the current capacity of the daily deposit withdrawal cap\n */\n getDepositWithdrawalCapCurrent(slot: number): Decimal {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n if (slotsElapsed > SLOTS_PER_DAY) {\n return new Decimal(0);\n } else {\n return new Decimal(this.state.config.depositWithdrawalCap.currentTotal.toString());\n }\n }\n\n /**\n *\n * @returns the max capacity of the daily debt withdrawal cap\n */\n getDebtWithdrawalCapCapacity(): Decimal {\n return new Decimal(this.state.config.debtWithdrawalCap.configCapacity.toString());\n }\n\n /**\n *\n * @returns the borrow limit of the reserve outside the elevation group\n */\n getBorrowLimitOutsideElevationGroup(): Decimal {\n return new Decimal(this.state.config.borrowLimitOutsideElevationGroup.toString());\n }\n\n /**\n *\n * @returns the borrowed amount of the reserve outside the elevation group\n */\n getBorrowedAmountOutsideElevationGroup(): Decimal {\n return new Decimal(this.state.borrowedAmountOutsideElevationGroup.toString());\n }\n\n /**\n *\n * @returns the borrow limit against the collateral reserve in the elevation group\n */\n getBorrowLimitAgainstCollateralInElevationGroup(elevationGroupIndex: number): Decimal {\n return new Decimal(\n this.state.config.borrowLimitAgainstThisCollateralInElevationGroup[elevationGroupIndex].toString()\n );\n }\n\n /**\n *\n * @returns the borrowed amount against the collateral reserve in the elevation group\n */\n getBorrowedAmountAgainstCollateralInElevationGroup(elevationGroupIndex: number): Decimal {\n return new Decimal(this.state.borrowedAmountsAgainstThisReserveInElevationGroups[elevationGroupIndex].toString());\n }\n\n /**\n *\n * @returns the current capacity of the daily debt withdrawal cap\n */\n getDebtWithdrawalCapCurrent(slot: number): Decimal {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n if (slotsElapsed > SLOTS_PER_DAY) {\n return new Decimal(0);\n } else {\n return new Decimal(this.state.config.debtWithdrawalCap.currentTotal.toString());\n }\n }\n\n getBorrowFactor(): Decimal {\n return new Decimal(this.state.config.borrowFactorPct.toString()).div(100);\n }\n\n calculateSupplyAPR(slot: number, referralFeeBps: number) {\n const currentUtilization = this.calculateUtilizationRatio();\n\n const borrowRate = this.calculateEstimatedBorrowRate(slot, referralFeeBps);\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n return currentUtilization * borrowRate * protocolTakeRatePct;\n }\n\n getEstimatedDebtAndSupply(slot: number, referralFeeBps: number): { totalBorrow: Decimal; totalSupply: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let totalBorrow: Decimal;\n let totalSupply: Decimal;\n if (slotsElapsed === 0) {\n totalBorrow = this.getBorrowedAmount();\n totalSupply = this.getTotalSupply();\n } else {\n const { newDebt, newAccProtocolFees, pendingReferralFees } = this.compoundInterest(slotsElapsed, referralFeeBps);\n const newTotalSupply = this.getLiquidityAvailableAmount()\n .add(newDebt)\n .sub(newAccProtocolFees)\n .sub(this.getAccumulatedReferrerFees())\n .sub(pendingReferralFees);\n totalBorrow = newDebt;\n totalSupply = newTotalSupply;\n }\n return { totalBorrow, totalSupply };\n }\n\n getEstimatedAccumulatedProtocolFees(\n slot: number,\n referralFeeBps: number\n ): { accumulatedProtocolFees: Decimal; compoundedVariableProtocolFee: Decimal; compoundedFixedHostFee: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let accumulatedProtocolFees: Decimal;\n let compoundedVariableProtocolFee: Decimal;\n let compoundedFixedHostFee: Decimal;\n if (slotsElapsed === 0) {\n accumulatedProtocolFees = this.getAccumulatedProtocolFees();\n compoundedVariableProtocolFee = new Decimal(0);\n compoundedFixedHostFee = new Decimal(0);\n } else {\n const { newAccProtocolFees, variableProtocolFee, fixedHostFee } = this.compoundInterest(\n slotsElapsed,\n referralFeeBps\n );\n accumulatedProtocolFees = newAccProtocolFees;\n compoundedVariableProtocolFee = variableProtocolFee;\n compoundedFixedHostFee = fixedHostFee;\n }\n return { accumulatedProtocolFees, compoundedVariableProtocolFee, compoundedFixedHostFee };\n }\n\n calculateUtilizationRatio() {\n const totalBorrows = this.getBorrowedAmount();\n const totalSupply = this.getTotalSupply();\n if (totalSupply.eq(0)) {\n return 0;\n }\n return totalBorrows.dividedBy(totalSupply).toNumber();\n }\n\n getEstimatedUtilizationRatio(slot: number, referralFeeBps: number) {\n const { totalBorrow: estimatedTotalBorrowed, totalSupply: estimatedTotalSupply } = this.getEstimatedDebtAndSupply(\n slot,\n referralFeeBps\n );\n if (estimatedTotalSupply.eq(0)) {\n return 0;\n }\n\n return estimatedTotalBorrowed.dividedBy(estimatedTotalSupply).toNumber();\n }\n\n calcSimulatedUtilizationRatio(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ): number {\n const { totalBorrow: previousTotalBorrowed, totalSupply: previousTotalSupply } = this.getEstimatedDebtAndSupply(\n slot,\n referralFeeBps\n );\n\n switch (action) {\n case 'deposit': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'withdraw': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n if (newTotalSupply.eq(0)) {\n return 0;\n } else {\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n }\n case 'borrow': {\n const newTotalBorrowed = previousTotalBorrowed.add(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'repay': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'depositAndBorrow': {\n const newTotalSupply = previousTotalSupply.add(amount);\n const newTotalBorrowed = previousTotalBorrowed.add(outflowAmount!);\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'repayAndWithdraw': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n const newTotalSupply = previousTotalSupply.sub(outflowAmount!);\n if (newTotalSupply.eq(0)) {\n return 0;\n }\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'mint': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'redeem': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n default:\n throw Error(`Invalid action type ${action} for simulatedUtilizationRatio`);\n }\n }\n\n getMaxBorrowAmountWithCollReserve(market: KaminoMarket, collReserve: KaminoReserve, slot: number): Decimal {\n const groupsColl = collReserve.state.config.elevationGroups;\n const groupsDebt = this.state.config.elevationGroups;\n const groups = market.state.elevationGroups;\n const commonElevationGroups = [...groupsColl].filter(\n (item) => groupsDebt.includes(item) && item !== 0 && groups[item - 1].debtReserve.equals(this.address)\n );\n\n let eModeGroup = 0;\n\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 eModeGroup = groups.find((group) => group.id === eModeGroupWithMaxLtvAndDebtReserve)!.id;\n }\n\n const elevationGroupActivated = this.state.config.elevationGroups.includes(eModeGroup) && eModeGroup !== 0;\n\n const reserveAvailableAmount = this.getLiquidityAvailableAmount();\n const reserveBorrowCapRemained = this.stats.reserveBorrowLimit.sub(this.getBorrowedAmount());\n\n let maxBorrowAmount = Decimal.min(reserveAvailableAmount, reserveBorrowCapRemained);\n\n const debtWithdrawalCap = this.getDebtWithdrawalCapCapacity().sub(this.getDebtWithdrawalCapCurrent(slot));\n maxBorrowAmount = this.getDebtWithdrawalCapCapacity().gt(0)\n ? Decimal.min(maxBorrowAmount, debtWithdrawalCap)\n : maxBorrowAmount;\n\n let originationFeeRate = this.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 = this.state.config.utilizationLimitBlockBorrowingAbove / 100;\n const currentUtilizationRatio = this.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 this.getTotalSupply()\n );\n maxBorrowAmount = Decimal.min(maxBorrowAmount, maxBorrowBasedOnUtilization);\n }\n\n let borrowLimitDependentOnElevationGroup = new Decimal(U64_MAX);\n\n if (!elevationGroupActivated) {\n borrowLimitDependentOnElevationGroup = this.getBorrowLimitOutsideElevationGroup().sub(\n this.getBorrowedAmountOutsideElevationGroup()\n );\n } else {\n let maxDebtTakenAgainstCollaterals = new Decimal(U64_MAX);\n const maxDebtAllowedAgainstCollateral = collReserve\n .getBorrowLimitAgainstCollateralInElevationGroup(eModeGroup - 1)\n .sub(collReserve.getBorrowedAmountAgainstCollateralInElevationGroup(eModeGroup - 1));\n\n maxDebtTakenAgainstCollaterals = Decimal.max(\n new Decimal(0),\n Decimal.min(maxDebtAllowedAgainstCollateral, maxDebtTakenAgainstCollaterals)\n );\n borrowLimitDependentOnElevationGroup = maxDebtTakenAgainstCollaterals;\n }\n\n maxBorrowAmount = Decimal.min(maxBorrowAmount, borrowLimitDependentOnElevationGroup);\n\n return Decimal.max(new Decimal(0), maxBorrowAmount);\n }\n\n calcSimulatedBorrowAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(newUtilization, curve) * slotAdjustmentFactor + this.getFixedHostInterestRate().toNumber();\n }\n\n calcSimulatedSupplyAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const simulatedBorrowAPR = this.calcSimulatedBorrowAPR(amount, action, slot, referralFeeBps, outflowAmount);\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n\n return newUtilization * simulatedBorrowAPR * protocolTakeRatePct;\n }\n\n slotAdjustmentFactor(): number {\n return 1000 / SLOTS_PER_SECOND / this.recentSlotDurationMs;\n }\n\n calculateBorrowRate() {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const currentUtilization = this.calculateUtilizationRatio();\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n\n return getBorrowRate(currentUtilization, curve) * slotAdjustmentFactor;\n }\n\n calculateEstimatedBorrowRate(slot: number, referralFeeBps: number) {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const estimatedCurrentUtilization = this.getEstimatedUtilizationRatio(slot, referralFeeBps);\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(estimatedCurrentUtilization, curve) * slotAdjustmentFactor;\n }\n\n calculateBorrowAPR(slot: number, referralFeeBps: number) {\n const borrowRate = this.calculateEstimatedBorrowRate(slot, referralFeeBps);\n return borrowRate + this.getFixedHostInterestRate().toNumber();\n }\n\n /**\n * @returns the mint of the reserve liquidity token\n */\n getLiquidityMint(): PublicKey {\n return this.state.liquidity.mintPubkey;\n }\n\n /**\n * @returns the token program of the reserve liquidity mint\n */\n getLiquidityTokenProgram(): PublicKey {\n return this.state.liquidity.tokenProgram;\n }\n\n /**\n * @returns the mint of the reserve collateral token , i.e. the cToken minted for depositing the liquidity token\n */\n getCTokenMint(): PublicKey {\n return this.state.collateral.mintPubkey;\n }\n\n setBuffer(buffer: AccountInfo<Buffer> | null) {\n this.buffer = buffer;\n }\n\n async load(tokenOraclePrice: TokenOracleData) {\n if (!this.buffer) {\n this.setBuffer(await this.connection.getAccountInfo(this.address, 'processed'));\n }\n\n if (!this.buffer) {\n throw Error(`Error requesting account info for ${this.symbol}`);\n }\n\n const parsedData = await Reserve.fetch(this.connection, this.address);\n if (!parsedData) {\n throw Error(`Unable to parse data of reserve ${this.symbol}`);\n }\n this.state = parsedData;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = this.formatReserveData(parsedData);\n }\n\n totalSupplyAPY(currentSlot: number) {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n return calculateAPYFromAPR(this.calculateSupplyAPR(currentSlot, 0));\n }\n\n totalBorrowAPY(currentSlot: number) {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n return calculateAPYFromAPR(this.calculateBorrowAPR(currentSlot, 0));\n }\n\n private formatReserveData(parsedData: ReserveFields): ReserveDataType {\n const mintTotalSupply = new Decimal(parsedData.collateral.mintTotalSupply.toString()).div(this.getMintFactor());\n let reserveStatus = ReserveStatus.Active;\n switch (parsedData.config.status) {\n case 0:\n reserveStatus = ReserveStatus.Active;\n break;\n case 1:\n reserveStatus = ReserveStatus.Obsolete;\n break;\n case 2:\n reserveStatus = ReserveStatus.Hidden;\n break;\n }\n return {\n // Reserve config\n\n status: reserveStatus,\n mintAddress: parsedData.liquidity.mintPubkey,\n borrowCurve: truncateBorrowCurve(parsedData.config.borrowRateCurve.points),\n loanToValuePct: parsedData.config.loanToValuePct / 100,\n maxLiquidationBonus: parsedData.config.maxLiquidationBonusBps / 10000,\n minLiquidationBonus: parsedData.config.minLiquidationBonusBps / 10000,\n liquidationThreshold: parsedData.config.liquidationThresholdPct / 100,\n protocolTakeRate: parsedData.config.protocolTakeRatePct / 100,\n reserveDepositLimit: new Decimal(parsedData.config.depositLimit.toString()),\n reserveBorrowLimit: new Decimal(parsedData.config.borrowLimit.toString()),\n\n // Reserve info\n symbol: parseTokenSymbol(parsedData.config.tokenInfo.name),\n decimals: this.state.liquidity.mintDecimals.toNumber(),\n accumulatedProtocolFees: this.getAccumulatedProtocolFees().div(this.getMintFactor()),\n mintTotalSupply,\n depositLimitCrossedSlot: parsedData.liquidity.depositLimitCrossedSlot.toNumber(),\n borrowLimitCrossedSlot: parsedData.liquidity.borrowLimitCrossedSlot.toNumber(),\n borrowFactor: parsedData.config.borrowFactorPct.toNumber(),\n };\n }\n\n /**\n * Compound current borrow rate over elapsed slots\n *\n * This also calculates protocol fees, which are taken for all obligations that have borrowed from current reserve.\n *\n * This also calculates referral fees, which are taken into pendingReferralFees.\n *\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L517\n *\n * @param slotsElapsed\n * @param referralFeeBps\n */\n private compoundInterest(\n slotsElapsed: number,\n referralFeeBps: number\n ): {\n newDebt: Decimal;\n netNewDebt: Decimal;\n variableProtocolFee: Decimal;\n fixedHostFee: Decimal;\n absoluteReferralFee: Decimal;\n maxReferralFees: Decimal;\n newAccProtocolFees: Decimal;\n pendingReferralFees: Decimal;\n } {\n const currentBorrowRate = this.calculateBorrowRate();\n const protocolTakeRate = new Decimal(this.state.config.protocolTakeRatePct).div(100);\n const referralRate = new Decimal(referralFeeBps).div(10_000);\n const fixedHostInterestRate = this.getFixedHostInterestRate();\n\n const compoundedInterestRate = this.approximateCompoundedInterest(\n new Decimal(currentBorrowRate).plus(fixedHostInterestRate),\n slotsElapsed\n );\n const compoundedFixedRate = this.approximateCompoundedInterest(fixedHostInterestRate, slotsElapsed);\n\n const previousDebt = this.getBorrowedAmount();\n const newDebt = previousDebt.mul(compoundedInterestRate);\n const fixedHostFee = previousDebt.mul(compoundedFixedRate).sub(previousDebt);\n\n const netNewDebt = newDebt.sub(previousDebt).sub(fixedHostFee);\n\n const variableProtocolFee = netNewDebt.mul(protocolTakeRate);\n const absoluteReferralFee = protocolTakeRate.mul(referralRate);\n const maxReferralFees = netNewDebt.mul(absoluteReferralFee);\n\n const newAccProtocolFees = variableProtocolFee\n .add(fixedHostFee)\n .sub(maxReferralFees)\n .add(this.getAccumulatedProtocolFees());\n\n const pendingReferralFees = this.getPendingReferrerFees().add(maxReferralFees);\n\n return {\n newDebt,\n netNewDebt,\n variableProtocolFee,\n fixedHostFee,\n absoluteReferralFee,\n maxReferralFees,\n newAccProtocolFees,\n pendingReferralFees,\n };\n }\n\n /**\n * Approximation to match the smart contract calculation\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L1026\n * @param rate\n * @param elapsedSlots\n * @private\n */\n private approximateCompoundedInterest(rate: Decimal, elapsedSlots: number): Decimal {\n const base = rate.div(SLOTS_PER_YEAR);\n switch (elapsedSlots) {\n case 0:\n return new Decimal(1);\n case 1:\n return base.add(1);\n case 2:\n return base.add(1).mul(base.add(1));\n case 3:\n return base.add(1).mul(base.add(1)).mul(base.add(1));\n case 4:\n // eslint-disable-next-line no-case-declarations\n const pow2 = base.add(1).mul(base.add(1));\n return pow2.mul(pow2);\n }\n const exp = elapsedSlots;\n const expMinus1 = exp - 1;\n const expMinus2 = exp - 2;\n\n const basePow2 = base.mul(base);\n const basePow3 = basePow2.mul(base);\n\n const firstTerm = base.mul(exp);\n const secondTerm = basePow2.mul(exp).mul(expMinus1).div(2);\n const thirdTerm = basePow3.mul(exp).mul(expMinus1).mul(expMinus2).div(6);\n\n return new Decimal(1).add(firstTerm).add(secondTerm).add(thirdTerm);\n }\n}\n\nconst truncateBorrowCurve = (points: CurvePointFields[]): [number, number][] => {\n const curve: [number, number][] = [];\n for (const { utilizationRateBps, borrowRateBps } of points) {\n curve.push([utilizationRateBps / ONE_HUNDRED_PCT_IN_BPS, borrowRateBps / ONE_HUNDRED_PCT_IN_BPS]);\n\n if (utilizationRateBps === ONE_HUNDRED_PCT_IN_BPS) {\n break;\n }\n }\n return curve;\n};\n\nexport async function createReserveIxs(\n connection: Connection,\n owner: PublicKey,\n lendingMarket: PublicKey,\n liquidityMint: PublicKey,\n reserveAddress: PublicKey,\n programId: PublicKey\n): Promise<TransactionInstruction[]> {\n const size = Reserve.layout.span + 8;\n\n const createReserveIx = SystemProgram.createAccount({\n fromPubkey: owner,\n newAccountPubkey: reserveAddress,\n lamports: await connection.getMinimumBalanceForRentExemption(size),\n space: size,\n programId: programId,\n });\n\n const { liquiditySupplyVault, collateralMint, collateralSupplyVault, feeVault } = reservePdas(\n programId,\n lendingMarket,\n liquidityMint\n );\n const [lendingMarketAuthority, _] = lendingMarketAuthPda(lendingMarket, programId);\n\n const accounts: InitReserveAccounts = {\n lendingMarketOwner: owner,\n lendingMarket: lendingMarket,\n lendingMarketAuthority: lendingMarketAuthority,\n reserve: reserveAddress,\n reserveLiquidityMint: liquidityMint,\n reserveLiquiditySupply: liquiditySupplyVault,\n feeReceiver: feeVault,\n reserveCollateralMint: collateralMint,\n reserveCollateralSupply: collateralSupplyVault,\n liquidityTokenProgram: TOKEN_PROGRAM_ID,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n };\n\n const initReserveIx = initReserve(accounts, programId);\n\n return [createReserveIx, initReserveIx];\n}\n\nexport function updateReserveConfigIx(\n marketWithAddress: MarketWithAddress,\n reserveAddress: PublicKey,\n modeDiscriminator: number,\n value: Uint8Array,\n programId: PublicKey\n): TransactionInstruction {\n value;\n const args: UpdateReserveConfigArgs = {\n mode: new anchor.BN(modeDiscriminator),\n value: value,\n skipValidation: false,\n };\n\n const accounts: UpdateReserveConfigAccounts = {\n lendingMarketOwner: marketWithAddress.state.lendingMarketOwner,\n lendingMarket: marketWithAddress.address,\n reserve: reserveAddress,\n };\n\n const ix = updateReserveConfig(args, accounts, programId);\n\n return ix;\n}\n\nexport function updateEntireReserveConfigIx(\n marketWithAddress: MarketWithAddress,\n reserveAddress: PublicKey,\n reserveConfig: ReserveConfig,\n programId: PublicKey\n): TransactionInstruction {\n const layout = ReserveConfig.layout();\n const data = Buffer.alloc(1000);\n const len = layout.encode(reserveConfig.toEncodable(), data);\n const value = Uint8Array.from([...data.subarray(0, len)]);\n\n const args: UpdateReserveConfigArgs = {\n mode: new anchor.BN(25),\n value: value,\n skipValidation: true,\n };\n\n const accounts: UpdateReserveConfigAccounts = {\n lendingMarketOwner: marketWithAddress.state.lendingMarketOwner,\n lendingMarket: marketWithAddress.address,\n reserve: reserveAddress,\n };\n\n const ix = updateReserveConfig(args, accounts, programId);\n\n return ix;\n}\n\nexport function parseForChangesReserveConfigAndGetIxs(\n marketWithAddress: MarketWithAddress,\n reserve: Reserve | undefined,\n reserveAddress: PublicKey,\n reserveConfig: ReserveConfig,\n programId: PublicKey\n) {\n const updateReserveIxnsArgs: { mode: number; value: Uint8Array }[] = [];\n for (const key in reserveConfig.toEncodable()) {\n if (key === 'borrowRateCurve') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateBorrowRateCurve.discriminator,\n value: updateReserveConfigEncodedValue(UpdateBorrowRateCurve.discriminator, reserveConfig.borrowRateCurve),\n });\n } else {\n for (let i = 0; i < reserveConfig.borrowRateCurve.points.length; i++) {\n if (\n reserve.config.borrowRateCurve.points[i].utilizationRateBps !==\n reserveConfig.borrowRateCurve.points[i].utilizationRateBps ||\n reserve.config.borrowRateCurve.points[i].borrowRateBps !==\n reserveConfig.borrowRateCurve.points[i].borrowRateBps\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateBorrowRateCurve.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateBorrowRateCurve.discriminator,\n reserveConfig.borrowRateCurve\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'fees') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n reserveConfig.fees.borrowFeeSf.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n reserveConfig.fees.flashLoanFeeSf.toNumber()\n ),\n });\n } else if (!reserve.config.fees.borrowFeeSf.eq(reserveConfig.fees.borrowFeeSf)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n reserveConfig.fees.borrowFeeSf.toNumber()\n ),\n });\n } else if (!reserve.config.fees.flashLoanFeeSf.eq(reserveConfig.fees.flashLoanFeeSf)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n reserveConfig.fees.flashLoanFeeSf.toNumber()\n ),\n });\n }\n } else if (key === 'depositLimit') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositLimit.discriminator,\n reserveConfig.depositLimit.toNumber()\n ),\n });\n } else if (!reserve.config.depositLimit.eq(reserveConfig.depositLimit)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositLimit.discriminator,\n reserveConfig.depositLimit.toNumber()\n ),\n });\n }\n } else if (key === 'borrowLimit') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowLimit.discriminator,\n reserveConfig.borrowLimit.toNumber()\n ),\n });\n } else if (!reserve.config.borrowLimit.eq(reserveConfig.borrowLimit)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowLimit.discriminator,\n reserveConfig.borrowLimit.toNumber()\n ),\n });\n }\n } else if (key === 'maxLiquidationBonusBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n reserveConfig.maxLiquidationBonusBps\n ),\n });\n } else if (reserve.config.maxLiquidationBonusBps !== reserveConfig.maxLiquidationBonusBps) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n reserveConfig.maxLiquidationBonusBps\n ),\n });\n }\n } else if (key === 'minLiquidationBonusBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n reserveConfig.minLiquidationBonusBps\n ),\n });\n } else if (reserve.config.minLiquidationBonusBps !== reserveConfig.minLiquidationBonusBps) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n reserveConfig.minLiquidationBonusBps\n ),\n });\n }\n } else if (key === 'badDebtLiquidationBonusBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n reserveConfig.badDebtLiquidationBonusBps\n ),\n });\n } else if (reserve.config.badDebtLiquidationBonusBps !== reserveConfig.badDebtLiquidationBonusBps) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n reserveConfig.badDebtLiquidationBonusBps\n ),\n });\n }\n } else if (key === 'liquidationThresholdPct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n reserveConfig.liquidationThresholdPct\n ),\n });\n } else if (reserve.config.liquidationThresholdPct !== reserveConfig.liquidationThresholdPct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n reserveConfig.liquidationThresholdPct\n ),\n });\n }\n } else if (key === 'protocolTakeRatePct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n reserveConfig.protocolTakeRatePct\n ),\n });\n } else if (reserve.config.protocolTakeRatePct !== reserveConfig.protocolTakeRatePct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n reserveConfig.protocolTakeRatePct\n ),\n });\n }\n } else if (key === 'status') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateReserveStatus.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateReserveStatus.discriminator,\n reserveConfig.status\n ),\n });\n } else if (reserve.config.status !== reserveConfig.status) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateReserveStatus.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateReserveStatus.discriminator,\n reserveConfig.status\n ),\n });\n }\n } else if (key === 'disableUsageAsCollOutsideEmode') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n reserveConfig.disableUsageAsCollOutsideEmode\n ),\n });\n } else if (reserve.config.disableUsageAsCollOutsideEmode !== reserveConfig.disableUsageAsCollOutsideEmode) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n reserveConfig.disableUsageAsCollOutsideEmode\n ),\n });\n }\n } else if (key === 'utilizationLimitBlockBorrowingAbove') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n reserveConfig.utilizationLimitBlockBorrowingAbove\n ),\n });\n } else if (\n reserve.config.utilizationLimitBlockBorrowingAbove !== reserveConfig.utilizationLimitBlockBorrowingAbove\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n reserveConfig.utilizationLimitBlockBorrowingAbove\n ),\n });\n }\n } else if (key === 'deleveragingThresholdSlotsPerBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n reserveConfig.deleveragingThresholdSlotsPerBps.toNumber()\n ),\n });\n } else if (!reserve.config.deleveragingThresholdSlotsPerBps.eq(reserveConfig.deleveragingThresholdSlotsPerBps)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n reserveConfig.deleveragingThresholdSlotsPerBps.toNumber()\n ),\n });\n }\n } else if (key === 'depositWithdrawalCap') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator, [\n reserveConfig.depositWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n reserveConfig.depositWithdrawalCap.currentTotal.toNumber()\n ),\n });\n } else if (\n !reserve.config.depositWithdrawalCap.configCapacity.eq(reserveConfig.depositWithdrawalCap.configCapacity) ||\n !reserve.config.depositWithdrawalCap.configIntervalLengthSeconds.eq(\n reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator, [\n reserveConfig.depositWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n } else if (\n !reserve.config.depositWithdrawalCap.currentTotal.eq(reserveConfig.depositWithdrawalCap.currentTotal)\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n reserveConfig.depositWithdrawalCap.currentTotal.toNumber()\n ),\n });\n }\n } else if (key === 'debtWithdrawalCap') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator, [\n reserveConfig.debtWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n reserveConfig.debtWithdrawalCap.currentTotal.toNumber()\n ),\n });\n } else if (\n !reserve.config.debtWithdrawalCap.configCapacity.eq(reserveConfig.debtWithdrawalCap.configCapacity) ||\n !reserve.config.debtWithdrawalCap.configIntervalLengthSeconds.eq(\n reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator, [\n reserveConfig.debtWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n } else if (!reserve.config.debtWithdrawalCap.currentTotal.eq(reserveConfig.debtWithdrawalCap.currentTotal)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n reserveConfig.debtWithdrawalCap.currentTotal.toNumber()\n ),\n });\n }\n } else if (key === 'elevationGroups') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateElevationGroup.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateElevationGroup.discriminator,\n reserveConfig.elevationGroups\n ),\n });\n } else {\n for (let i = 0; i < reserveConfig.elevationGroups.length; i++) {\n if (reserve.config.elevationGroups[i] !== reserveConfig.elevationGroups[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateElevationGroup.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateElevationGroup.discriminator,\n reserveConfig.elevationGroups\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'borrowFactorPct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowFactor.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowFactor.discriminator,\n reserveConfig.borrowFactorPct.toNumber()\n ),\n });\n } else if (!reserve.config.borrowFactorPct.eq(reserveConfig.borrowFactorPct)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowFactor.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowFactor.discriminator,\n reserveConfig.borrowFactorPct.toNumber()\n ),\n });\n }\n } else if (key === 'loanToValuePct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n reserveConfig.loanToValuePct\n ),\n });\n } else if (reserve.config.loanToValuePct !== reserveConfig.loanToValuePct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n reserveConfig.loanToValuePct\n ),\n });\n }\n } else if (key === 'protocolLiquidationFeePct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n reserveConfig.protocolLiquidationFeePct\n ),\n });\n } else if (reserve.config.protocolLiquidationFeePct !== reserveConfig.protocolLiquidationFeePct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n reserveConfig.protocolLiquidationFeePct\n ),\n });\n }\n } else if (key === 'multiplierSideBoost') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n reserveConfig.multiplierSideBoost\n ),\n });\n } else {\n for (let i = 0; i < reserveConfig.multiplierSideBoost.length; i++) {\n if (reserve.config.multiplierSideBoost[i] !== reserveConfig.multiplierSideBoost[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n reserveConfig.multiplierSideBoost\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'multiplierTagBoost') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n reserveConfig.multiplierTagBoost\n ),\n });\n } else {\n for (let i = 0; i < reserveConfig.multiplierTagBoost.length; i++) {\n if (reserve.config.multiplierTagBoost[i] !== reserveConfig.multiplierTagBoost[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n reserveConfig.multiplierTagBoost\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'deleveragingMarginCallPeriodSecs') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n reserveConfig.deleveragingMarginCallPeriodSecs.toNumber()\n ),\n });\n } else if (!reserve.config.deleveragingMarginCallPeriodSecs.eq(reserveConfig.deleveragingMarginCallPeriodSecs)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n reserveConfig.deleveragingMarginCallPeriodSecs.toNumber()\n ),\n });\n }\n } else if (key === 'assetTier') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateAssetTier.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateAssetTier.discriminator,\n reserveConfig.assetTier\n ),\n });\n } else if (reserve.config.assetTier !== reserveConfig.assetTier) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateAssetTier.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateAssetTier.discriminator,\n reserveConfig.assetTier\n ),\n });\n }\n } else if (key === 'tokenInfo') {\n const tokenInfo = reserveConfig.tokenInfo;\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoName.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateTokenInfoName.discriminator, tokenInfo.name),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n tokenInfo.heuristic.lower.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n tokenInfo.heuristic.upper.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n tokenInfo.heuristic.exp.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n tokenInfo.maxTwapDivergenceBps.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n tokenInfo.maxAgePriceSeconds.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n tokenInfo.maxAgeTwapSeconds.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n tokenInfo.scopeConfiguration.priceChain\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n tokenInfo.scopeConfiguration.twapChain\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n tokenInfo.switchboardConfiguration.priceAggregator\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n tokenInfo.switchboardConfiguration.twapAggregator\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdatePythPrice.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdatePythPrice.discriminator,\n tokenInfo.pythConfiguration.price\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n tokenInfo.blockPriceUsage\n ),\n });\n } else {\n for (let i = 0; i < tokenInfo.name.length; i++) {\n if (reserve.config.tokenInfo.name[i] !== tokenInfo.name[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoName.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoName.discriminator,\n tokenInfo.name\n ),\n });\n break;\n }\n }\n if (!reserve.config.tokenInfo.heuristic.lower.eq(tokenInfo.heuristic.lower)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n tokenInfo.heuristic.lower.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.heuristic.upper.eq(tokenInfo.heuristic.upper)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n tokenInfo.heuristic.upper.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.heuristic.exp.eq(tokenInfo.heuristic.exp)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n tokenInfo.heuristic.exp.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.maxTwapDivergenceBps.eq(tokenInfo.maxTwapDivergenceBps)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n tokenInfo.maxTwapDivergenceBps.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.maxAgePriceSeconds.eq(tokenInfo.maxAgePriceSeconds)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n tokenInfo.maxAgePriceSeconds.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.maxAgeTwapSeconds.eq(tokenInfo.maxAgeTwapSeconds)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n tokenInfo.maxAgeTwapSeconds.toNumber()\n ),\n });\n }\n for (let i = 0; i < tokenInfo.scopeConfiguration.priceChain.length; i++) {\n if (\n reserve.config.tokenInfo.scopeConfiguration.priceChain[i] !== tokenInfo.scopeConfiguration.priceChain[i]\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n tokenInfo.scopeConfiguration.priceChain\n ),\n });\n break;\n }\n }\n for (let i = 0; i < tokenInfo.scopeConfiguration.twapChain.length; i++) {\n if (reserve.config.tokenInfo.scopeConfiguration.twapChain[i] !== tokenInfo.scopeConfiguration.twapChain[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n tokenInfo.scopeConfiguration.twapChain\n ),\n });\n break;\n }\n }\n if (\n !reserve.config.tokenInfo.switchboardConfiguration.priceAggregator.equals(\n tokenInfo.switchboardConfiguration.priceAggregator\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n tokenInfo.switchboardConfiguration.priceAggregator\n ),\n });\n }\n if (\n !reserve.config.tokenInfo.switchboardConfiguration.twapAggregator.equals(\n tokenInfo.switchboardConfiguration.twapAggregator\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n tokenInfo.switchboardConfiguration.twapAggregator\n ),\n });\n }\n if (!reserve.config.tokenInfo.pythConfiguration.price.equals(tokenInfo.pythConfiguration.price)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdatePythPrice.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdatePythPrice.discriminator,\n tokenInfo.pythConfiguration.price\n ),\n });\n }\n if (reserve.config.tokenInfo.blockPriceUsage !== tokenInfo.blockPriceUsage) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n tokenInfo.blockPriceUsage\n ),\n });\n }\n if (!reserve.config.tokenInfo.scopeConfiguration.priceFeed.equals(tokenInfo.scopeConfiguration.priceFeed)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateScopePriceFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateScopePriceFeed.discriminator,\n tokenInfo.scopeConfiguration.priceFeed\n ),\n });\n }\n }\n }\n } // for loop\n\n const ixns: TransactionInstruction[] = [];\n\n updateReserveIxnsArgs.forEach((updateReserveConfigArgs) => {\n ixns.push(\n updateReserveConfigIx(\n marketWithAddress,\n reserveAddress,\n updateReserveConfigArgs.mode + 1,\n updateReserveConfigArgs.value,\n programId\n )\n );\n });\n\n return ixns;\n}\n\nexport function updateReserveConfigEncodedValue(\n discriminator: number,\n value: number | number[] | BorrowRateCurve | PublicKey\n): Uint8Array {\n let buffer: Buffer;\n let valueArray: number[] = [];\n\n switch (discriminator) {\n case UpdateConfigMode.UpdateLoanToValuePct.discriminator:\n case UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator:\n case UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator:\n case UpdateConfigMode.UpdateProtocolTakeRate.discriminator:\n case UpdateConfigMode.UpdateAssetTier.discriminator:\n case UpdateConfigMode.UpdateReserveStatus.discriminator:\n case UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator:\n case UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator:\n case UpdateConfigMode.UpdateBlockPriceUsage.discriminator:\n buffer = Buffer.alloc(1);\n buffer.writeUIntLE(value as number, 0, 1);\n break;\n case UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator:\n case UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator:\n case UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator:\n buffer = Buffer.alloc(2);\n buffer.writeUInt16LE(value as number, 0);\n break;\n case UpdateConfigMode.UpdateFeesBorrowFee.discriminator:\n case UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator:\n case UpdateConfigMode.UpdateDepositLimit.discriminator:\n case UpdateConfigMode.UpdateBorrowLimit.discriminator:\n case UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator:\n case UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator:\n case UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator:\n case UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator:\n case UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator:\n case UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator:\n case UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator:\n case UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator:\n case UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator:\n case UpdateConfigMode.UpdateBorrowFactor.discriminator:\n case UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator:\n value = value as number;\n buffer = Buffer.alloc(8);\n buffer.writeBigUint64LE(BigInt(value), 0);\n break;\n case UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator:\n case UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(8);\n for (let i = 0; i < valueArray.length; i++) {\n buffer.writeUInt16LE(valueArray[i], 2 * i);\n }\n break;\n case UpdateConfigMode.UpdateTokenInfoName.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(32);\n for (let i = 0; i < valueArray.length; i++) {\n buffer.writeUIntLE(valueArray[i], i, 1);\n }\n break;\n case UpdateConfigMode.UpdateScopePriceFeed.discriminator:\n case UpdateConfigMode.UpdatePythPrice.discriminator:\n case UpdateConfigMode.UpdateSwitchboardFeed.discriminator:\n case UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator:\n case UpdateConfigMode.UpdateFarmCollateral.discriminator:\n case UpdateConfigMode.UpdateFarmDebt.discriminator:\n buffer = (value as PublicKey).toBuffer();\n break;\n case UpdateConfigMode.UpdateBorrowRateCurve.discriminator:\n buffer = serializeBorrowRateCurve(value as BorrowRateCurve);\n break;\n case UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator:\n case UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(16);\n buffer.writeBigUint64LE(BigInt(valueArray[0]), 0);\n buffer.writeBigUInt64LE(BigInt(valueArray[1]), 8);\n break;\n case UpdateConfigMode.UpdateElevationGroup.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(20);\n for (let i = 0; i < valueArray.length; i++) {\n buffer.writeUIntLE(valueArray[i], i, 1);\n }\n break;\n case UpdateConfigMode.UpdateMultiplierTagBoost.discriminator:\n case UpdateConfigMode.UpdateMultiplierSideBoost.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(2);\n buffer.writeUIntLE(valueArray[0], 0, 1);\n buffer.writeUIntLE(valueArray[1], 1, 1);\n break;\n default:\n buffer = Buffer.alloc(0);\n }\n\n return Uint8Array.from([...buffer]);\n}\n\nexport function serializeBorrowRateCurve(curve: BorrowRateCurve): Buffer {\n const buffer = Buffer.alloc(4 + 8 * curve.points.length);\n buffer.writeUInt32LE(curve.points.length, 0);\n for (let i = 0; i < curve.points.length; i++) {\n buffer.writeUInt32LE(curve.points[i].utilizationRateBps, 4 + 8 * i);\n buffer.writeUInt32LE(curve.points[i].borrowRateBps, 8 + 8 * i);\n }\n return buffer;\n}\n\nexport type ReserveWithAddress = {\n address: PublicKey;\n state: Reserve;\n};\n"]}
|