@kamino-finance/klend-sdk 2.10.14 → 2.10.16

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.
@@ -241,7 +241,7 @@ class KaminoObligation {
241
241
  let borrowPosition = undefined;
242
242
  for (const oldBorrow of oldBorrows.values()) {
243
243
  if (oldBorrow.mintAddress.equals(mint)) {
244
- borrowPosition = oldBorrow;
244
+ borrowPosition = Object.assign({}, oldBorrow);
245
245
  }
246
246
  }
247
247
  let reserve = undefined;
@@ -284,7 +284,7 @@ class KaminoObligation {
284
284
  let depositPosition = undefined;
285
285
  for (const oldDeposit of oldDeposits.values()) {
286
286
  if (oldDeposit.mintAddress.equals(mint)) {
287
- depositPosition = oldDeposit;
287
+ depositPosition = Object.assign({}, oldDeposit);
288
288
  }
289
289
  }
290
290
  let reserve = undefined;
@@ -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 } 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: Array<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(\n amount: 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 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 const { stats, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n amount,\n mint,\n reserves,\n market\n );\n\n newStats = stats;\n newDeposits = deposits;\n\n break;\n }\n case 'borrow': {\n const { stats, borrows } = this.calculateSimulatedBorrow(\n this.refreshedStats,\n this.borrows,\n amount,\n mint,\n reserves\n );\n newStats = stats;\n newBorrows = borrows;\n break;\n }\n case 'repay': {\n const { stats, borrows } = this.calculateSimulatedBorrow(\n this.refreshedStats,\n this.borrows,\n new Decimal(amount).neg(),\n mint,\n reserves\n );\n newStats = stats;\n newBorrows = borrows;\n break;\n }\n\n case 'withdraw': {\n const { stats, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n new Decimal(amount).neg(),\n mint,\n reserves,\n market\n );\n newStats = stats;\n newDeposits = deposits;\n break;\n }\n case 'depositAndBorrow': {\n const { stats: statsAfterDeposit, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n amount,\n mint,\n reserves,\n market\n );\n const { stats, borrows } = this.calculateSimulatedBorrow(\n statsAfterDeposit,\n this.borrows,\n amount,\n mint,\n reserves\n );\n\n newStats = stats;\n newDeposits = deposits;\n newBorrows = borrows;\n break;\n }\n case 'repayAndWithdraw': {\n const { stats: statsAfterRepay, borrows } = this.calculateSimulatedBorrow(\n this.refreshedStats,\n this.borrows,\n new Decimal(amount).neg(),\n mint,\n reserves\n );\n const { stats: statsAfterWithdraw, deposits } = this.calculateSimulatedDeposit(\n statsAfterRepay,\n this.deposits,\n amount,\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 reserve: KaminoReserve,\n borrow: ObligationLiquidity,\n currentSlot: number\n ): Decimal => {\n const estimatedCumulativeBorrowRate = reserve.getEstimatedCumulativeBorrowRate(currentSlot);\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 commonElevationGroups = this.getElevationGroups(market);\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 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: commonElevationGroups,\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 /**\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);\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);\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,oCAA0D;AA+B1D,MAAa,gBAAgB;IAmB3B;;;;;;;OAOG;IACH,YACE,MAAoB,EACpB,iBAA4B,EAC5B,UAAsB,EACtB,uBAAgD,EAChD,qBAA8C;QAuhBhD,mCAA8B,GAAG,CAC/B,OAAsB,EACtB,MAA2B,EAC3B,WAAmB,EACV,EAAE;YACX,MAAM,6BAA6B,GAAG,OAAO,CAAC,gCAAgC,CAAC,WAAW,CAAC,CAAC;YAE5F,MAAM,2BAA2B,GAAG,gBAAgB,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAErF,IAAI,6BAA6B,CAAC,EAAE,CAAC,2BAA2B,CAAC,EAAE;gBACjE,OAAO,6BAA6B,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;aACvE;YAED,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC;QAniBA,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;gBACtB,OAAO,IAAI,CAAC;aACb;YACD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE;gBACjD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;aAC3D;YACD,MAAM,UAAU,GAAG,qBAAU,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEnD,IAAI,UAAU,KAAK,IAAI,EAAE;gBACvB,OAAO,IAAI,CAAC;aACb;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;gBAChB,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;aACJ;iBAAM;gBACL,WAAW,GAAG,MAAM,qBAAU,CAAC,aAAa,CAC1C,YAAY,CAAC,aAAa,EAAE,EAC5B,mBAAmB,EACnB,YAAY,CAAC,SAAS,CACvB,CAAC;aACH;YACD,MAAM,qBAAqB,GAAG,IAAI,qBAAa,EAAsB,CAAC;YACtE,MAAM,uBAAuB,GAAG,IAAI,qBAAa,EAAsB,CAAC;YACxE,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;gBACpC,IAAI,UAAU,KAAK,IAAI,EAAE;oBACvB,gBAAgB,CAAC,qBAAqB,CACpC,YAAY,EACZ,UAAU,EACV,uBAAuB,EACvB,qBAAqB,EACrB,WAAW,CACZ,CAAC;iBACH;aACF;YAED,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;gBACvC,IAAI,UAAU,KAAK,IAAI,EAAE;oBACvB,OAAO,IAAI,CAAC;iBACb;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;YACzC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBAClC,OAAO,KAAK,CAAC;aACd;SACF;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,gBAAgB,CAAC,IAAe;QAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE;YAC1C,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBAClC,OAAO,KAAK,CAAC;aACd;SACF;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;YAC9C,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;SACvB;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;YAClD,IAAI,IAAA,uBAAe,EAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;gBACpF,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAE,CAAC,CAAC;aACjG;SACF;QACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE;YAChD,IAAI,IAAA,uBAAe,EAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;gBAChF,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,aAAa,CAAE,CAAC,CAAC;aAC7F;SACF;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;YAC9B,KAAK,MAAM,cAAc,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE;gBACjE,IAAI,cAAc,KAAK,CAAC,EAAE;oBACxB,MAAM,KAAK,GAAG,qBAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;oBACxD,IAAI,KAAK,EAAE;wBACT,qBAAqB,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;qBACtD;yBAAM;wBACL,qBAAqB,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;qBAC9C;iBACF;aACF;SACF;QACD,MAAM,qBAAqB,GAAG,IAAI,KAAK,EAAU,CAAC;QAClD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,qBAAqB,CAAC,OAAO,EAAE,EAAE;YAC5D,IAAI,KAAK,KAAK,QAAQ,CAAC,MAAM,EAAE;gBAC7B,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACnC;SACF;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;YAC3C,IAAI,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBACtC,cAAc,qBAAQ,SAAS,CAAE,CAAC;aACnC;SACF;QACD,IAAI,OAAO,GAA8B,SAAS,CAAC;QACnD,KAAK,MAAM,aAAa,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE;YAC7C,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBACjD,OAAO,GAAG,aAAa,CAAC;aACzB;SACF;QAED,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;SACtD;QAED,IAAI,CAAC,cAAc,EAAE;YACnB,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;SACH;QAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE;YAC7E,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAC;SACH;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;YAC7C,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBACvC,eAAe,qBAAQ,UAAU,CAAE,CAAC;aACrC;SACF;QACD,IAAI,OAAO,GAA8B,SAAS,CAAC;QACnD,KAAK,MAAM,aAAa,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE;YAC7C,IAAI,aAAa,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBACjD,OAAO,GAAG,aAAa,CAAC;aACzB;SACF;QACD,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;SACtD;QAED,IAAI,CAAC,eAAe,EAAE;YACpB,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;SACH;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;YACnC,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;SAClG;QAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE;YAC7E,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAC;SACH;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,CACzB,MAAe,EACf,MAAkB,EAClB,IAAe,EACf,MAAoB,EACpB,QAAuC;QAMvC,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;YACd,KAAK,SAAS,CAAC,CAAC;gBACd,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,yBAAyB,CACxD,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,QAAQ,EACb,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,MAAM,CACP,CAAC;gBAEF,QAAQ,GAAG,KAAK,CAAC;gBACjB,WAAW,GAAG,QAAQ,CAAC;gBAEvB,MAAM;aACP;YACD,KAAK,QAAQ,CAAC,CAAC;gBACb,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,wBAAwB,CACtD,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,OAAO,EACZ,MAAM,EACN,IAAI,EACJ,QAAQ,CACT,CAAC;gBACF,QAAQ,GAAG,KAAK,CAAC;gBACjB,UAAU,GAAG,OAAO,CAAC;gBACrB,MAAM;aACP;YACD,KAAK,OAAO,CAAC,CAAC;gBACZ,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,wBAAwB,CACtD,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,OAAO,EACZ,IAAI,oBAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EACzB,IAAI,EACJ,QAAQ,CACT,CAAC;gBACF,QAAQ,GAAG,KAAK,CAAC;gBACjB,UAAU,GAAG,OAAO,CAAC;gBACrB,MAAM;aACP;YAED,KAAK,UAAU,CAAC,CAAC;gBACf,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,yBAAyB,CACxD,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,QAAQ,EACb,IAAI,oBAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EACzB,IAAI,EACJ,QAAQ,EACR,MAAM,CACP,CAAC;gBACF,QAAQ,GAAG,KAAK,CAAC;gBACjB,WAAW,GAAG,QAAQ,CAAC;gBACvB,MAAM;aACP;YACD,KAAK,kBAAkB,CAAC,CAAC;gBACvB,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAC3E,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,QAAQ,EACb,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,MAAM,CACP,CAAC;gBACF,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,wBAAwB,CACtD,iBAAiB,EACjB,IAAI,CAAC,OAAO,EACZ,MAAM,EACN,IAAI,EACJ,QAAQ,CACT,CAAC;gBAEF,QAAQ,GAAG,KAAK,CAAC;gBACjB,WAAW,GAAG,QAAQ,CAAC;gBACvB,UAAU,GAAG,OAAO,CAAC;gBACrB,MAAM;aACP;YACD,KAAK,kBAAkB,CAAC,CAAC;gBACvB,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,wBAAwB,CACvE,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,OAAO,EACZ,IAAI,oBAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EACzB,IAAI,EACJ,QAAQ,CACT,CAAC;gBACF,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAC5E,eAAe,EACf,IAAI,CAAC,QAAQ,EACb,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,MAAM,CACP,CAAC;gBACF,QAAQ,GAAG,kBAAkB,CAAC;gBAC9B,WAAW,GAAG,QAAQ,CAAC;gBACvB,UAAU,GAAG,OAAO,CAAC;gBACrB,MAAM;aACP;YACD,OAAO,CAAC,CAAC;gBACP,MAAM,KAAK,CAAC,uBAAuB,MAAM,kCAAkC,CAAC,CAAC;aAC9E;SACF;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;IAkBO,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,qBAAqB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE9D,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,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,EAAE,qBAAqB;aACrD;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;YACnD,IAAI,CAAC,IAAA,uBAAe,EAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE;gBAC3D,SAAS;aACV;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;gBACZ,MAAM,IAAI,KAAK,CACb,uDAAuD,OAAO,CAAC,cAAc,iEAAiE,OAAO,CAAC,eAAe,EAAE,CACxK,CAAC;aACH;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;gBACnC,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;aAC1G;YAED,IAAI,YAAY,CAAC;YACjB,IAAI,uBAAuB,KAAK,IAAI,EAAE;gBACpC,YAAY,GAAG,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAE,CAAC;aAC9D;iBAAM;gBACL,YAAY,GAAG,OAAO,CAAC,yBAAyB,EAAE,CAAC;aACpD;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;gBACrB,0BAA0B,GAAG,0BAA0B,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;aAC9E;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;SACzC;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;YAClD,IAAI,CAAC,IAAA,uBAAe,EAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE;gBACzD,SAAS;aACV;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;gBACZ,MAAM,IAAI,KAAK,CACb,sDACE,MAAM,CAAC,aACT,gEAAgE,gBAAgB,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAC3G,CAAC;aACH;YAED,MAAM,8BAA8B,GAAG,gBAAgB,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YACxF,IAAI,oBAAoB,CAAC;YACzB,IAAI,qBAAqB,KAAK,IAAI,EAAE;gBAClC,oBAAoB,GAAG,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAE,CAAC;aACpE;iBAAM;gBACL,oBAAoB,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;aAC1D;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;gBACtC,SAAS,IAAI,CAAC,CAAC;aAChB;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;SACxC;QAED,OAAO;YACL,OAAO;YACP,eAAe;YACf,mCAAmC;YACnC,SAAS;SACV,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;YAClE,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAChB;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;YACnD,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;gBACnG,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;aACtE;SACF;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;YACnD,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;gBACnG,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;aACtE;SACF;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;YAClD,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;gBAC7F,MAAM,OAAO,GAAG,YAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,aAAa,CAAE,CAAC;gBACxE,MAAM,oBAAoB,GAAG,OAAO,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC;gBAC5E,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;aAClE;SACF;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;YAClD,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;gBAC7F,MAAM,OAAO,GAAG,YAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,aAAa,CAAE,CAAC;gBACxE,MAAM,oBAAoB,GAAG,OAAO,CAAC,gCAAgC,CAAC,IAAI,CAAC,CAAC;gBAC5E,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;aAClE;SACF;IACH,CAAC;IAED,MAAM,CAAC,yBAAyB,CAAC,OAAsB,EAAE,cAAsB;QAC7E,IAAI,cAAc,KAAK,CAAC,EAAE;YACxB,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;SACvB;QACD,OAAO,IAAI,oBAAO,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1D,CAAC;CACF;AA95BD,4CA85BC","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 } 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: Array<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(\n amount: 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 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 const { stats, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n amount,\n mint,\n reserves,\n market\n );\n\n newStats = stats;\n newDeposits = deposits;\n\n break;\n }\n case 'borrow': {\n const { stats, borrows } = this.calculateSimulatedBorrow(\n this.refreshedStats,\n this.borrows,\n amount,\n mint,\n reserves\n );\n newStats = stats;\n newBorrows = borrows;\n break;\n }\n case 'repay': {\n const { stats, borrows } = this.calculateSimulatedBorrow(\n this.refreshedStats,\n this.borrows,\n new Decimal(amount).neg(),\n mint,\n reserves\n );\n newStats = stats;\n newBorrows = borrows;\n break;\n }\n\n case 'withdraw': {\n const { stats, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n new Decimal(amount).neg(),\n mint,\n reserves,\n market\n );\n newStats = stats;\n newDeposits = deposits;\n break;\n }\n case 'depositAndBorrow': {\n const { stats: statsAfterDeposit, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n amount,\n mint,\n reserves,\n market\n );\n const { stats, borrows } = this.calculateSimulatedBorrow(\n statsAfterDeposit,\n this.borrows,\n amount,\n mint,\n reserves\n );\n\n newStats = stats;\n newDeposits = deposits;\n newBorrows = borrows;\n break;\n }\n case 'repayAndWithdraw': {\n const { stats: statsAfterRepay, borrows } = this.calculateSimulatedBorrow(\n this.refreshedStats,\n this.borrows,\n new Decimal(amount).neg(),\n mint,\n reserves\n );\n const { stats: statsAfterWithdraw, deposits } = this.calculateSimulatedDeposit(\n statsAfterRepay,\n this.deposits,\n amount,\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 reserve: KaminoReserve,\n borrow: ObligationLiquidity,\n currentSlot: number\n ): Decimal => {\n const estimatedCumulativeBorrowRate = reserve.getEstimatedCumulativeBorrowRate(currentSlot);\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 commonElevationGroups = this.getElevationGroups(market);\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 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: commonElevationGroups,\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 /**\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);\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);\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"]}
@@ -31,7 +31,7 @@ export interface FormsCalcsResult {
31
31
  netValueUsd: Decimal;
32
32
  ltv: Decimal;
33
33
  }
34
- export declare function calculateMultiplyEffects(getPriceByTokenMintDecimal: (mint: PublicKey | string) => Decimal, { depositAmount, withdrawAmount, deposited, borrowed, debtTokenMint, selectedTokenMint, collTokenMint, targetLeverage, activeTab, flashBorrowReserveFlashLoanFeePercentage, debtBorrowFactorPct, priceCollToDebt, priceDebtToColl, }: LeverageFormsCalcsArgs): Promise<FormsCalcsResult>;
34
+ export declare function calculateMultiplyEffects(getPriceByTokenMintDecimal: (mint: PublicKey | string) => Promise<Decimal>, { depositAmount, withdrawAmount, deposited, borrowed, debtTokenMint, selectedTokenMint, collTokenMint, targetLeverage, activeTab, flashBorrowReserveFlashLoanFeePercentage, debtBorrowFactorPct, priceCollToDebt, priceDebtToColl, }: LeverageFormsCalcsArgs): Promise<FormsCalcsResult>;
35
35
  /**
36
36
  * returns how much borrowToken will be borrowed to reach leverage given initial collateral amount
37
37
  * @param depositTokenAmount
@@ -94,8 +94,8 @@ function calculateMultiplyEffects(getPriceByTokenMintDecimal, { depositAmount, w
94
94
  break;
95
95
  }
96
96
  }
97
- const borrowTokenPrice = getPriceByTokenMintDecimal(debtTokenMint);
98
- const depositTokenPrice = getPriceByTokenMintDecimal(collTokenMint);
97
+ const borrowTokenPrice = yield getPriceByTokenMintDecimal(debtTokenMint);
98
+ const depositTokenPrice = yield getPriceByTokenMintDecimal(collTokenMint);
99
99
  const totalDepositedUsd = depositTokenPrice.mul(totalDeposited);
100
100
  const totalBorrowedUsd = borrowTokenPrice.mul(totalBorrowed);
101
101
  const netValueUsd = totalDepositedUsd.minus(totalBorrowedUsd);
@@ -1 +1 @@
1
- {"version":3,"file":"calcs.js","sourceRoot":"","sources":["../../src/leverage/calcs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4DAAiC;AAG1B,MAAM,MAAM,GAAG,CAAC,MAAW,EAAU,EAAE;IAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC;AAFW,QAAA,MAAM,UAEjB;AAEF,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAE5C,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,+BAAmB,CAAA;IACnB,iCAAqB,CAAA;IACrB,6BAAiB,CAAA;IACjB,2BAAe,CAAA;AACjB,CAAC,EALW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAKnB;AA2BD,SAAsB,wBAAwB,CAC5C,0BAAiE,EACjE,EACE,aAAa,EACb,cAAc,EACd,SAAS,EACT,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,SAAS,EACT,wCAAwC,EACxC,mBAAmB,EACnB,eAAe,EACf,eAAe,GACQ;;QAEzB,8CAA8C;QAC9C,MAAM,EACJ,qBAAqB,EAAE,iCAAiC,EACxD,oBAAoB,EAAE,gCAAgC,GACvD,GAAG,IAAA,2BAAmB,EAAC;YACtB,eAAe;YACf,eAAe;YACf,MAAM,EAAE,aAAa;YACrB,cAAc;YACd,iBAAiB;YACjB,aAAa,EAAE,aAAa;YAC5B,YAAY,EAAE,wCAAwC;SACvD,CAAC,CAAC;QAEH,+CAA+C;QAC/C,MAAM,EACJ,qBAAqB,EAAE,0CAA0C,EACjE,oBAAoB,EAAE,yCAAyC,GAChE,GAAG,IAAA,4BAAoB,EAAC;YACvB,eAAe,EAAE,eAAe;YAChC,aAAa;YACb,iBAAiB;YACjB,MAAM,EAAE,cAAc;YACtB,SAAS,EAAE,IAAI,oBAAO,CAAC,SAAS,CAAC;YACjC,QAAQ,EAAE,IAAI,oBAAO,CAAC,QAAQ,CAAC;SAChC,CAAC,CAAC;QAEH,6CAA6C;QAC7C,MAAM,EACJ,qBAAqB,EAAE,gCAAgC,EACvD,oBAAoB,EAAE,8BAA8B,GACrD,GAAG,IAAA,0BAAkB,EAAC,eAAe,EAAE;YACtC,cAAc;YACd,aAAa;YACb,aAAa;YACb,cAAc,EAAE,IAAI,oBAAO,CAAC,SAAS,CAAC;YACtC,aAAa,EAAE,IAAI,oBAAO,CAAC,QAAQ,CAAC;YACpC,YAAY,EAAE,wCAAwC,EAAE,wCAAwC;SACjG,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CACT,aAAa,EACb,IAAA,cAAM,EAAC;YACL,SAAS;YACT,iCAAiC;YACjC,gCAAgC;YAChC,0CAA0C;YAC1C,yCAAyC;YACzC,gCAAgC;YAChC,8BAA8B;SAC/B,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,iBAAiB,EAAE,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,oBAAO,CAAC,CAAC,CAAC,EAAE,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjG,QAAQ,SAAS,EAAE;YACjB,KAAK,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACrB,6CAA6C;gBAC7C,iBAAiB,GAAG,KAAK,CAAC;gBAC1B,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;gBAClE,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC/D,MAAM;aACP;YACD,KAAK,QAAQ,CAAC,KAAK,CAAC;YACpB,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACtB,iBAAiB;oBACf,CAAC,0CAA0C,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,SAAS,CAAC,CAAC;wBACrE,yCAAyC,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,QAAQ,CAAC,CAAC;wBACpE,IAAA,eAAO,EAAC,0CAA0C,EAAE,IAAI,oBAAO,CAAC,SAAS,CAAC,EAAE,4BAA4B,CAAC;wBACzG,IAAA,eAAO,EAAC,yCAAyC,EAAE,IAAI,oBAAO,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC,CAAC;wBAC1G,CAAC,IAAA,eAAO,EAAC,0CAA0C,EAAE,IAAI,oBAAO,CAAC,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;gBAErG,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;gBAChH,aAAa,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;gBAC7G,MAAM;aACP;YACD,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACpB,6CAA6C;gBAC7C,iBAAiB,GAAG,KAAK,CAAC;gBAC1B,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBACjE,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC7D,MAAM;aACP;SACF;QAED,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,aAAa,CAAC,CAAC;QACnE,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,aAAa,CAAC,CAAC;QAEpE,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAChE,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC9D,0FAA0F;QAC1F,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAEtF,OAAO;YACL,MAAM,EAAE,IAAI,oBAAO,CAAC,CAAC,CAAC;YACtB,cAAc;YACd,aAAa;YACb,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,WAAW;YACxB,GAAG;SACJ,CAAC;IACJ,CAAC;CAAA;AAzHD,4DAyHC;AAED;;;;;;GAMG;AACI,MAAM,gBAAgB,GAAG,CAAC,EAC/B,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,cAAc,GAMf,EAAE,EAAE;IACH,MAAM,4BAA4B,GAAG,kBAAkB,CAAC;IAExD,MAAM,0BAA0B,GAAG,4BAA4B,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACpF,MAAM,0BAA0B,GAAG,0BAA0B,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAChG,MAAM,0BAA0B,GAAG,0BAA0B,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAEnF,MAAM,cAAc,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1D,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEzE,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC;AArBW,QAAA,gBAAgB,oBAqB3B;AAWK,MAAM,oBAAoB,GAAG,CAAC,KAAsC,EAAE,EAAE;IAC7E,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IAEjG,OAAO,mBAAmB,CAAC;QACzB,iBAAiB;QACjB,aAAa;QACb,cAAc,EAAE,IAAI,oBAAO,CAAC,MAAM,CAAC;QACnC,eAAe;QACf,qBAAqB,EAAE,QAAQ;QAC/B,sBAAsB,EAAE,SAAS;KAClC,CAAC,CAAC;AACL,CAAC,CAAC;AAXW,QAAA,oBAAoB,wBAW/B;AAgBF,SAAgB,mBAAmB,CAAC,MAAsB;IACxD,MAAM,EACJ,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,aAAa,GACd,GAAG,MAAM,CAAC;IAEX,WAAW;IACX,MAAM,+BAA+B,GAAG,sBAAsB,CAAC;IAC/D,MAAM,4BAA4B,GAAG,qBAAqB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAChF,MAAM,mCAAmC,GAAG,+BAA+B,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChH,MAAM,cAAc,GAAG,+BAA+B,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAEhG,MAAM,+BAA+B,GAAG,sBAAsB,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IAEjH,MAAM,4BAA4B,GAAG,iBAAiB,CAAC,MAAM,CAAC,aAAa,CAAC;QAC1E,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAExC,MAAM,aAAa,GAAG,+BAA+B,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAE9G,MAAM,YAAY,GAAG,IAAA,wBAAgB,EAAC;QACpC,kBAAkB,EAAE,+BAA+B,CAAC,KAAK,CAAC,4BAA4B,CAAC;QACvF,eAAe,EAAE,IAAI,oBAAO,CAAC,eAAe,CAAC;QAC7C,cAAc,EAAE,IAAI,oBAAO,CAAC,cAAc,CAAC;QAC3C,cAAc,EAAE,IAAI,oBAAO,CAAC,CAAC,CAAC;KAC/B,CAAC,CAAC;IAEH,MAAM,qBAAqB,GAAG,sBAAsB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1E,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAEvE,+CAA+C;IAC/C,OAAO;QACL,qBAAqB;QACrB,oBAAoB;KACrB,CAAC;AACJ,CAAC;AAvCD,kDAuCC;AAEM,MAAM,OAAO,GAAG,CAAC,CAAgB,EAAE,CAAgB,EAAE,OAAO,GAAG,MAAM,EAAE,EAAE;IAC9E,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC,CAAC;AAFW,QAAA,OAAO,WAElB;AAWF;;;;;GAKG;AACI,MAAM,kBAAkB,GAAG,CAChC,eAAwB,EACxB,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAiC,EAC9F,EAAE;IACF,OAAO,iBAAiB,CAAC;QACvB,qBAAqB,EAAE,aAAa;QACpC,sBAAsB,EAAE,cAAc;QACtC,eAAe;QACf,cAAc;QACd,YAAY;KACb,CAAC,CAAC;AACL,CAAC,CAAC;AAXW,QAAA,kBAAkB,sBAW7B;AAeF;;;;;;;;;GASG;AACH,SAAgB,iBAAiB,CAAC,EAChC,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,YAAY,GACS;IACrB,MAAM,cAAc,GAAG,sBAAsB,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IAChG,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEzD,MAAM,YAAY,GAAG,IAAA,wBAAgB,EAAC;QACpC,kBAAkB,EAAE,cAAc;QAClC,eAAe,EAAE,IAAI,oBAAO,CAAC,eAAe,CAAC;QAC7C,cAAc,EAAE,IAAI,oBAAO,CAAC,cAAc,CAAC;QAC3C,cAAc,EAAE,YAAY;KAC7B,CAAC,CAAC;IAEH,MAAM,qBAAqB,GAAG,aAAa,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1E,MAAM,oBAAoB,GAAG,YAAY,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAEvE,OAAO;QACL,qBAAqB;QACrB,oBAAoB;KACrB,CAAC;AACJ,CAAC;AAxBD,8CAwBC;AAaD,iDAAiD;AACjD,oEAAoE;AAC7D,MAAM,mBAAmB,GAAG,CAAC,EAClC,eAAe,EACf,eAAe,EACf,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,WAAW,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,GACJ,EAAE,EAAE;IAC5B,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAEtE,MAAM,oBAAoB,GAAG,qBAAqB;QAChD,CAAC,CAAC,IAAI,oBAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE;QACpD,CAAC,CAAC,IAAI,oBAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;IAE5E,MAAM,sBAAsB,GAAG,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC5F,MAAM,YAAY,GAAG,IAAA,wBAAgB,EAAC;QACpC,kBAAkB,EAAE,sBAAsB;QAC1C,cAAc,EAAE,IAAI,oBAAO,CAAC,cAAc,CAAC;QAC3C,eAAe,EAAE,IAAI,oBAAO,CAAC,eAAe,CAAC;QAC7C,cAAc,EAAE,IAAI,oBAAO,CAAC,YAAY,CAAC;KAC1C,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,wBAAwB,GAAG,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAElE,OAAO;QACL,qBAAqB,EAAE,oBAAoB;QAC3C,oBAAoB,EAAE,wBAAwB,CAAC,QAAQ,EAAE;KAC1D,CAAC;AACJ,CAAC,CAAC;AA/BW,QAAA,mBAAmB,uBA+B9B;AAEF;;;;;;;;GAQG;AACH,SAAsB,kBAAkB,CACtC,MAAc,EACd,QAA6B,EAC7B,UAAmB,EACnB,gBAA+B;;QAE/B,IAAI,QAAQ,GAAG,gBAAgB,CAAC;QAChC,IAAI,CAAC,QAAQ,EAAE;YACb,QAAQ,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;SACxE;QACD,MAAM,mBAAmB,GAAG,IAAI,oBAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CACpF,SAAA,EAAE,EAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA,CACtD,CAAC;QAEF,2DAA2D;QAC3D,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAA,EAAE,EAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC;QACxF,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAA,EAAE,EAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC;QACxF,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAErD,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAExC,OAAO,CAAC,IAAI,CACV,6BAA6B,UAAU,wBAAwB,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,2BAA2B,SAAS,kBAAkB,SAAS,0BAA0B,IAAA,cAAM,kCAClL,QAAQ,KAAE,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,IACrE,EAAE,CACJ,CAAC;QAEF,gGAAgG;QAChG,MAAM,WAAW,GAAG,oBAAO,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,oBAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAEpF,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,SAAA,EAAE,EAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxG,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,SAAA,EAAE,EAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAExG,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,YAAY,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QAC3C,IAAI,OAAO,EAAE,OAAO,CAAC;QACrB,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YACxB,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;YAC1C,OAAO,GAAG,EAAE,CAAC;SACd;aAAM;YACL,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;SACtC;QACD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACvG,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACvG,MAAM,UAAU,GAAG,oBAAO,CAAC,GAAG,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,GAAG,CAClE,SAAA,EAAE,EAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA,CACtD,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,QAAQ,OAAO,sBAAsB,UAAU,EAAE,CAAC,CAAC;QAEpG,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;CAAA;AAxDD,gDAwDC","sourcesContent":["import { PublicKey } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport { Kamino, StrategyWithAddress, TokenAmounts } from '@hubbleprotocol/kamino-sdk';\n\nexport const toJson = (object: any): string => {\n return JSON.stringify(object, null, 2);\n};\n\nconst closingPositionDiffTolerance = 0.0001;\n\nexport enum FormTabs {\n deposit = 'Deposit',\n withdraw = 'Withdraw',\n adjust = 'Adjust',\n close = 'Close',\n}\n\nexport interface LeverageFormsCalcsArgs {\n depositAmount: Decimal;\n withdrawAmount: Decimal;\n deposited: Decimal;\n borrowed: Decimal;\n debtTokenMint: PublicKey;\n selectedTokenMint: PublicKey;\n collTokenMint: PublicKey;\n targetLeverage: Decimal;\n activeTab: FormTabs;\n flashBorrowReserveFlashLoanFeePercentage: Decimal;\n debtBorrowFactorPct: Decimal;\n priceCollToDebt: Decimal;\n priceDebtToColl: Decimal;\n}\n\nexport interface FormsCalcsResult {\n earned: Decimal;\n totalDeposited: Decimal;\n totalBorrowed: Decimal;\n netValue: Decimal;\n netValueUsd: Decimal;\n ltv: Decimal;\n}\n\nexport async function calculateMultiplyEffects(\n getPriceByTokenMintDecimal: (mint: PublicKey | string) => Decimal,\n {\n depositAmount,\n withdrawAmount,\n deposited,\n borrowed,\n debtTokenMint,\n selectedTokenMint,\n collTokenMint,\n targetLeverage,\n activeTab,\n flashBorrowReserveFlashLoanFeePercentage,\n debtBorrowFactorPct,\n priceCollToDebt,\n priceDebtToColl,\n }: LeverageFormsCalcsArgs\n): Promise<FormsCalcsResult> {\n // calculate estimations for deposit operation\n const {\n adjustDepositPosition: depositModeEstimatedDepositAmount,\n adjustBorrowPosition: depositModeEstimatedBorrowAmount,\n } = estimateDepositMode({\n priceCollToDebt,\n priceDebtToColl,\n amount: depositAmount,\n targetLeverage,\n selectedTokenMint,\n collTokenMint: collTokenMint,\n flashLoanFee: flashBorrowReserveFlashLoanFeePercentage,\n });\n\n // calculate estimations for withdraw operation\n const {\n adjustDepositPosition: withdrawModeEstimatedDepositTokenWithdrawn,\n adjustBorrowPosition: withdrawModeEstimatedBorrowTokenWithdrawn,\n } = estimateWithdrawMode({\n priceCollToDebt: priceCollToDebt,\n collTokenMint,\n selectedTokenMint,\n amount: withdrawAmount,\n deposited: new Decimal(deposited),\n borrowed: new Decimal(borrowed),\n });\n\n // calculate estimations for adjust operation\n const {\n adjustDepositPosition: adjustModeEstimatedDepositAmount,\n adjustBorrowPosition: adjustModeEstimateBorrowAmount,\n } = estimateAdjustMode(priceCollToDebt, {\n targetLeverage,\n debtTokenMint,\n collTokenMint,\n totalDeposited: new Decimal(deposited),\n totalBorrowed: new Decimal(borrowed),\n flashLoanFee: flashBorrowReserveFlashLoanFeePercentage, // TODO: is this the right flash borrow?\n });\n\n console.log(\n 'Estimations',\n toJson({\n activeTab,\n depositModeEstimatedDepositAmount,\n depositModeEstimatedBorrowAmount,\n withdrawModeEstimatedDepositTokenWithdrawn,\n withdrawModeEstimatedBorrowTokenWithdrawn,\n adjustModeEstimatedDepositAmount,\n adjustModeEstimateBorrowAmount,\n })\n );\n\n let [isClosingPosition, totalDeposited, totalBorrowed] = [false, new Decimal(0), new Decimal(0)];\n\n switch (activeTab) {\n case FormTabs.deposit: {\n // Deposit and Adjust never clos the position\n isClosingPosition = false;\n totalDeposited = deposited.add(depositModeEstimatedDepositAmount);\n totalBorrowed = borrowed.add(depositModeEstimatedBorrowAmount);\n break;\n }\n case FormTabs.close:\n case FormTabs.withdraw: {\n isClosingPosition =\n (withdrawModeEstimatedDepositTokenWithdrawn.gte(new Decimal(deposited)) ||\n withdrawModeEstimatedBorrowTokenWithdrawn.gte(new Decimal(borrowed)) ||\n fuzzyEq(withdrawModeEstimatedDepositTokenWithdrawn, new Decimal(deposited), closingPositionDiffTolerance) ||\n fuzzyEq(withdrawModeEstimatedBorrowTokenWithdrawn, new Decimal(borrowed), closingPositionDiffTolerance)) &&\n !fuzzyEq(withdrawModeEstimatedDepositTokenWithdrawn, new Decimal(0), closingPositionDiffTolerance);\n\n totalDeposited = isClosingPosition ? new Decimal(0) : deposited.sub(withdrawModeEstimatedDepositTokenWithdrawn);\n totalBorrowed = isClosingPosition ? new Decimal(0) : borrowed.sub(withdrawModeEstimatedBorrowTokenWithdrawn);\n break;\n }\n case FormTabs.adjust: {\n // Deposit and Adjust never clos the position\n isClosingPosition = false;\n totalDeposited = deposited.add(adjustModeEstimatedDepositAmount);\n totalBorrowed = borrowed.add(adjustModeEstimateBorrowAmount);\n break;\n }\n }\n\n const borrowTokenPrice = getPriceByTokenMintDecimal(debtTokenMint);\n const depositTokenPrice = getPriceByTokenMintDecimal(collTokenMint);\n\n const totalDepositedUsd = depositTokenPrice.mul(totalDeposited);\n const totalBorrowedUsd = borrowTokenPrice.mul(totalBorrowed);\n const netValueUsd = totalDepositedUsd.minus(totalBorrowedUsd);\n // TODO marius this is bad, do not convert to sol as we don't only do leveraged loops only\n const netValueSol = netValueUsd.div(borrowTokenPrice);\n const ltv = totalBorrowedUsd.mul(debtBorrowFactorPct.div(100)).div(totalDepositedUsd);\n\n return {\n earned: new Decimal(0),\n totalDeposited,\n totalBorrowed,\n netValue: netValueSol,\n netValueUsd: netValueUsd,\n ltv,\n };\n}\n\n/**\n * returns how much borrowToken will be borrowed to reach leverage given initial collateral amount\n * @param depositTokenAmount\n * @param leverage\n * @param priceAToB\n * @param flashBorrowFee\n */\nexport const calcBorrowAmount = ({\n depositTokenAmount,\n targetLeverage,\n priceCollToDebt,\n flashBorrowFee,\n}: {\n depositTokenAmount: Decimal;\n targetLeverage: Decimal;\n priceCollToDebt: Decimal;\n flashBorrowFee: Decimal;\n}) => {\n const initialCollAmountInCollToken = depositTokenAmount;\n\n const finalCollAmountInCollToken = initialCollAmountInCollToken.mul(targetLeverage);\n const finalDebtAmountInCollToken = finalCollAmountInCollToken.sub(initialCollAmountInCollToken);\n const finalDebtAmountInDebtToken = finalDebtAmountInCollToken.mul(priceCollToDebt);\n\n const flashFeeFactor = new Decimal(1).add(flashBorrowFee);\n const debtTokenToBorrow = finalDebtAmountInDebtToken.mul(flashFeeFactor);\n\n return debtTokenToBorrow;\n};\n\ninterface UseEstimateWithdrawAmountsProps {\n priceCollToDebt: Decimal;\n amount: Decimal.Value;\n deposited: Decimal;\n borrowed: Decimal;\n collTokenMint: PublicKey;\n selectedTokenMint: PublicKey;\n}\n\nexport const estimateWithdrawMode = (props: UseEstimateWithdrawAmountsProps) => {\n const { amount, collTokenMint, selectedTokenMint, deposited, borrowed, priceCollToDebt } = props;\n\n return calcWithdrawAmounts({\n selectedTokenMint,\n collTokenMint,\n withdrawAmount: new Decimal(amount),\n priceCollToDebt,\n currentBorrowPosition: borrowed,\n currentDepositPosition: deposited,\n });\n};\n\nexport interface WithdrawParams {\n currentBorrowPosition: Decimal;\n currentDepositPosition: Decimal;\n priceCollToDebt: Decimal;\n withdrawAmount: Decimal;\n selectedTokenMint: PublicKey;\n collTokenMint: PublicKey;\n}\n\ninterface WithdrawResult {\n adjustDepositPosition: Decimal;\n adjustBorrowPosition: Decimal;\n}\n\nexport function calcWithdrawAmounts(params: WithdrawParams): WithdrawResult {\n const {\n currentBorrowPosition,\n currentDepositPosition,\n priceCollToDebt,\n withdrawAmount,\n selectedTokenMint,\n collTokenMint,\n } = params;\n\n // MSOL/SOL\n const currentDepositInCollateralToken = currentDepositPosition;\n const currentDebtInCollateralToken = currentBorrowPosition.div(priceCollToDebt);\n const currentNetPositionInCollateralToken = currentDepositInCollateralToken.minus(currentDebtInCollateralToken);\n const targetLeverage = currentDepositInCollateralToken.div(currentNetPositionInCollateralToken);\n\n const initialDepositInCollateralToken = currentDepositPosition.minus(currentBorrowPosition.div(priceCollToDebt));\n\n const amountToWithdrawDepositToken = selectedTokenMint.equals(collTokenMint)\n ? withdrawAmount\n : withdrawAmount.div(priceCollToDebt);\n\n const targetDeposit = initialDepositInCollateralToken.minus(amountToWithdrawDepositToken).mul(targetLeverage);\n\n const targetBorrow = calcBorrowAmount({\n depositTokenAmount: initialDepositInCollateralToken.minus(amountToWithdrawDepositToken),\n priceCollToDebt: new Decimal(priceCollToDebt),\n targetLeverage: new Decimal(targetLeverage),\n flashBorrowFee: new Decimal(0),\n });\n\n const adjustDepositPosition = currentDepositPosition.minus(targetDeposit);\n const adjustBorrowPosition = currentBorrowPosition.minus(targetBorrow);\n\n // TODO: add flashLoan fee here in final values\n return {\n adjustDepositPosition,\n adjustBorrowPosition,\n };\n}\n\nexport const fuzzyEq = (a: Decimal.Value, b: Decimal.Value, epsilon = 0.0001) => {\n return new Decimal(a).sub(b).abs().lte(epsilon);\n};\n\ninterface UseEstimateAdjustAmountsProps {\n targetLeverage: Decimal;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n totalDeposited: Decimal;\n totalBorrowed: Decimal;\n flashLoanFee: Decimal;\n}\n\n/**\n * Calculate how much token will be deposited or withdrawn in case of position adjustment\n * @param leverage\n * @param totalDeposited\n * @param totalBorrowed\n */\nexport const estimateAdjustMode = (\n priceCollToDebt: Decimal,\n { targetLeverage, totalDeposited, totalBorrowed, flashLoanFee }: UseEstimateAdjustAmountsProps\n) => {\n return calcAdjustAmounts({\n currentBorrowPosition: totalBorrowed,\n currentDepositPosition: totalDeposited,\n priceCollToDebt,\n targetLeverage,\n flashLoanFee,\n });\n};\n\nexport interface AdjustLeverageParams {\n targetLeverage: Decimal;\n currentBorrowPosition: Decimal;\n currentDepositPosition: Decimal;\n priceCollToDebt: Decimal;\n flashLoanFee: Decimal;\n}\n\ninterface AdjustLeverageResult {\n adjustDepositPosition: Decimal;\n adjustBorrowPosition: Decimal;\n}\n\n/**\n * Calculates the amounts of tokenA to deposit/withdraw and tokenB to borrow/repay proportionally to adjust the leverage of a position.\n *\n * @param {AdjustLeverageParams} params - Parameters for the calculation\n * @param {number} params.targetLeverage - The target leverage for the position\n * @param {Decimal} params.currentPositionTokenA - The current amount of tokenA in the position\n * @param {Decimal} params.currentPositionTokenB - The current amount of borrowed tokenB in the position\n * @param {number} params.priceAtoB - The conversion rate from tokenA to tokenB (tokenA price = tokenB price * priceAtoB)\n * @returns {AdjustLeverageResult} An object containing the amounts of tokenA to deposit/withdraw and tokenB to borrow/repay\n */\nexport function calcAdjustAmounts({\n targetLeverage,\n currentBorrowPosition,\n currentDepositPosition,\n priceCollToDebt,\n flashLoanFee,\n}: AdjustLeverageParams): AdjustLeverageResult {\n const initialDeposit = currentDepositPosition.minus(currentBorrowPosition.div(priceCollToDebt));\n const targetDeposit = initialDeposit.mul(targetLeverage);\n\n const targetBorrow = calcBorrowAmount({\n depositTokenAmount: initialDeposit,\n priceCollToDebt: new Decimal(priceCollToDebt),\n targetLeverage: new Decimal(targetLeverage),\n flashBorrowFee: flashLoanFee,\n });\n\n const adjustDepositPosition = targetDeposit.minus(currentDepositPosition);\n const adjustBorrowPosition = targetBorrow.minus(currentBorrowPosition);\n\n return {\n adjustDepositPosition,\n adjustBorrowPosition,\n };\n}\n\ninterface UseTransactionInfoStats {\n priceCollToDebt: Decimal;\n priceDebtToColl: Decimal;\n amount: Decimal;\n targetLeverage: Decimal;\n selectedTokenMint: PublicKey;\n collTokenMint: PublicKey;\n flashLoanFee: Decimal;\n slippagePct?: Decimal;\n}\n\n// Given a deposit amount of Deposit|Borrow token\n// and a target leverage, calculate final { collateral, debt } value\nexport const estimateDepositMode = ({\n priceCollToDebt,\n priceDebtToColl,\n amount,\n targetLeverage,\n selectedTokenMint,\n collTokenMint,\n flashLoanFee,\n slippagePct = new Decimal(0),\n}: UseTransactionInfoStats) => {\n const isDepositingCollToken = selectedTokenMint.equals(collTokenMint);\n\n const finalCollTokenAmount = isDepositingCollToken\n ? new Decimal(amount).mul(targetLeverage).toNumber()\n : new Decimal(amount).mul(priceDebtToColl).mul(targetLeverage).toNumber();\n\n const depositCollTokenAmount = isDepositingCollToken ? amount : amount.mul(priceDebtToColl);\n const borrowAmount = calcBorrowAmount({\n depositTokenAmount: depositCollTokenAmount,\n targetLeverage: new Decimal(targetLeverage),\n priceCollToDebt: new Decimal(priceCollToDebt),\n flashBorrowFee: new Decimal(flashLoanFee),\n });\n\n const slippageFactor = new Decimal(1).add(slippagePct.div(new Decimal(100)));\n const borrowAmountWithSlippage = borrowAmount.mul(slippageFactor);\n\n return {\n adjustDepositPosition: finalCollTokenAmount,\n adjustBorrowPosition: borrowAmountWithSlippage.toNumber(),\n };\n};\n\n/**\n * Given an amount of ktokens, returns the estimated amount of token A and token B that need to be deposited\n * The amount of A and B may result in less ktokens being minted, the actual amount of ktokens minted is returned as well\n * @param kamino\n * @param strategy\n * @param mintAmount - desired amount of ktokens to mint\n * @param strategyHoldings - optional strategy holdings, if not provided will be fetched from the blockchain\n * @returns [tokenA, tokenB, actualMintAmount]\n */\nexport async function simulateMintKToken(\n kamino: Kamino,\n strategy: StrategyWithAddress,\n mintAmount: Decimal,\n strategyHoldings?: TokenAmounts\n): Promise<[Decimal, Decimal, Decimal]> {\n let holdings = strategyHoldings;\n if (!holdings) {\n holdings = await kamino.getStrategyTokensHoldings(strategy, 'DEPOSIT');\n }\n const sharesIssuedDecimal = new Decimal(strategy.strategy.sharesIssued.toString()).div(\n 10 ** strategy.strategy.sharesMintDecimals.toNumber()\n );\n\n // Add 1 because the sdk doesn't round up where the SC will\n const strategyA = holdings.a.div(10 ** strategy.strategy.tokenAMintDecimals.toNumber());\n const strategyB = holdings.b.div(10 ** strategy.strategy.tokenBMintDecimals.toNumber());\n const aPerShare = strategyA.div(sharesIssuedDecimal);\n const bPerShare = strategyB.div(sharesIssuedDecimal);\n\n const requiredA = aPerShare.mul(mintAmount);\n const requiredB = bPerShare.mul(mintAmount);\n const pxAInB = strategyB.div(strategyA);\n\n console.info(\n `Estimating kToken mint of ${mintAmount} ktokens on strategy ${strategy.address.toString()} requires: estimated A: ${requiredA}, estimated B: ${requiredB}. Current pool state:\\n${toJson(\n { ...holdings, sharesIssued: sharesIssuedDecimal, poolPxAInB: pxAInB }\n )}`\n );\n\n // If we deposited with this exact ratio - how many ktokens do we actually get from the program?\n const RustDecimal = Decimal.clone({ precision: 18, rounding: Decimal.ROUND_FLOOR });\n\n const usA = new RustDecimal(holdings.a);\n const usB = new RustDecimal(holdings.b);\n const uA = new RustDecimal(requiredA.mul(10 ** strategy.strategy.tokenAMintDecimals.toNumber()).ceil());\n const uB = new RustDecimal(requiredB.mul(10 ** strategy.strategy.tokenBMintDecimals.toNumber()).ceil());\n\n const ratio = usA.div(usB);\n const depositableB = uA.div(ratio).floor();\n let actualA, actualB;\n if (depositableB.lte(uB)) {\n actualA = depositableB.mul(ratio).floor();\n actualB = uB;\n } else {\n actualA = uB.mul(ratio).floor();\n actualB = actualA.div(ratio).floor();\n }\n const actualMintFromA = actualA.mul(strategy.strategy.sharesIssued.toString()).div(holdings.a).floor();\n const actualMintFromB = actualB.mul(strategy.strategy.sharesIssued.toString()).div(holdings.b).floor();\n const actualMint = Decimal.min(actualMintFromA, actualMintFromB).div(\n 10 ** strategy.strategy.sharesMintDecimals.toNumber()\n );\n console.log(`Actual deposit amounts: A: ${actualA}, B: ${actualB}, kTokens to mint: ${actualMint}`);\n\n return [requiredA, requiredB, actualMint];\n}\n"]}
1
+ {"version":3,"file":"calcs.js","sourceRoot":"","sources":["../../src/leverage/calcs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4DAAiC;AAG1B,MAAM,MAAM,GAAG,CAAC,MAAW,EAAU,EAAE;IAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC;AAFW,QAAA,MAAM,UAEjB;AAEF,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAE5C,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,+BAAmB,CAAA;IACnB,iCAAqB,CAAA;IACrB,6BAAiB,CAAA;IACjB,2BAAe,CAAA;AACjB,CAAC,EALW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAKnB;AA2BD,SAAsB,wBAAwB,CAC5C,0BAA0E,EAC1E,EACE,aAAa,EACb,cAAc,EACd,SAAS,EACT,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,SAAS,EACT,wCAAwC,EACxC,mBAAmB,EACnB,eAAe,EACf,eAAe,GACQ;;QAEzB,8CAA8C;QAC9C,MAAM,EACJ,qBAAqB,EAAE,iCAAiC,EACxD,oBAAoB,EAAE,gCAAgC,GACvD,GAAG,IAAA,2BAAmB,EAAC;YACtB,eAAe;YACf,eAAe;YACf,MAAM,EAAE,aAAa;YACrB,cAAc;YACd,iBAAiB;YACjB,aAAa,EAAE,aAAa;YAC5B,YAAY,EAAE,wCAAwC;SACvD,CAAC,CAAC;QAEH,+CAA+C;QAC/C,MAAM,EACJ,qBAAqB,EAAE,0CAA0C,EACjE,oBAAoB,EAAE,yCAAyC,GAChE,GAAG,IAAA,4BAAoB,EAAC;YACvB,eAAe,EAAE,eAAe;YAChC,aAAa;YACb,iBAAiB;YACjB,MAAM,EAAE,cAAc;YACtB,SAAS,EAAE,IAAI,oBAAO,CAAC,SAAS,CAAC;YACjC,QAAQ,EAAE,IAAI,oBAAO,CAAC,QAAQ,CAAC;SAChC,CAAC,CAAC;QAEH,6CAA6C;QAC7C,MAAM,EACJ,qBAAqB,EAAE,gCAAgC,EACvD,oBAAoB,EAAE,8BAA8B,GACrD,GAAG,IAAA,0BAAkB,EAAC,eAAe,EAAE;YACtC,cAAc;YACd,aAAa;YACb,aAAa;YACb,cAAc,EAAE,IAAI,oBAAO,CAAC,SAAS,CAAC;YACtC,aAAa,EAAE,IAAI,oBAAO,CAAC,QAAQ,CAAC;YACpC,YAAY,EAAE,wCAAwC,EAAE,wCAAwC;SACjG,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CACT,aAAa,EACb,IAAA,cAAM,EAAC;YACL,SAAS;YACT,iCAAiC;YACjC,gCAAgC;YAChC,0CAA0C;YAC1C,yCAAyC;YACzC,gCAAgC;YAChC,8BAA8B;SAC/B,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,iBAAiB,EAAE,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,oBAAO,CAAC,CAAC,CAAC,EAAE,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjG,QAAQ,SAAS,EAAE;YACjB,KAAK,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACrB,6CAA6C;gBAC7C,iBAAiB,GAAG,KAAK,CAAC;gBAC1B,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;gBAClE,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC/D,MAAM;aACP;YACD,KAAK,QAAQ,CAAC,KAAK,CAAC;YACpB,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACtB,iBAAiB;oBACf,CAAC,0CAA0C,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,SAAS,CAAC,CAAC;wBACrE,yCAAyC,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,QAAQ,CAAC,CAAC;wBACpE,IAAA,eAAO,EAAC,0CAA0C,EAAE,IAAI,oBAAO,CAAC,SAAS,CAAC,EAAE,4BAA4B,CAAC;wBACzG,IAAA,eAAO,EAAC,yCAAyC,EAAE,IAAI,oBAAO,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC,CAAC;wBAC1G,CAAC,IAAA,eAAO,EAAC,0CAA0C,EAAE,IAAI,oBAAO,CAAC,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;gBAErG,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;gBAChH,aAAa,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;gBAC7G,MAAM;aACP;YACD,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACpB,6CAA6C;gBAC7C,iBAAiB,GAAG,KAAK,CAAC;gBAC1B,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBACjE,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC7D,MAAM;aACP;SACF;QAED,MAAM,gBAAgB,GAAG,MAAM,0BAA0B,CAAC,aAAa,CAAC,CAAC;QACzE,MAAM,iBAAiB,GAAG,MAAM,0BAA0B,CAAC,aAAa,CAAC,CAAC;QAE1E,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAChE,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC9D,0FAA0F;QAC1F,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAEtF,OAAO;YACL,MAAM,EAAE,IAAI,oBAAO,CAAC,CAAC,CAAC;YACtB,cAAc;YACd,aAAa;YACb,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,WAAW;YACxB,GAAG;SACJ,CAAC;IACJ,CAAC;CAAA;AAzHD,4DAyHC;AAED;;;;;;GAMG;AACI,MAAM,gBAAgB,GAAG,CAAC,EAC/B,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,cAAc,GAMf,EAAE,EAAE;IACH,MAAM,4BAA4B,GAAG,kBAAkB,CAAC;IAExD,MAAM,0BAA0B,GAAG,4BAA4B,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACpF,MAAM,0BAA0B,GAAG,0BAA0B,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAChG,MAAM,0BAA0B,GAAG,0BAA0B,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAEnF,MAAM,cAAc,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1D,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEzE,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC;AArBW,QAAA,gBAAgB,oBAqB3B;AAWK,MAAM,oBAAoB,GAAG,CAAC,KAAsC,EAAE,EAAE;IAC7E,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IAEjG,OAAO,mBAAmB,CAAC;QACzB,iBAAiB;QACjB,aAAa;QACb,cAAc,EAAE,IAAI,oBAAO,CAAC,MAAM,CAAC;QACnC,eAAe;QACf,qBAAqB,EAAE,QAAQ;QAC/B,sBAAsB,EAAE,SAAS;KAClC,CAAC,CAAC;AACL,CAAC,CAAC;AAXW,QAAA,oBAAoB,wBAW/B;AAgBF,SAAgB,mBAAmB,CAAC,MAAsB;IACxD,MAAM,EACJ,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,aAAa,GACd,GAAG,MAAM,CAAC;IAEX,WAAW;IACX,MAAM,+BAA+B,GAAG,sBAAsB,CAAC;IAC/D,MAAM,4BAA4B,GAAG,qBAAqB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAChF,MAAM,mCAAmC,GAAG,+BAA+B,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChH,MAAM,cAAc,GAAG,+BAA+B,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAEhG,MAAM,+BAA+B,GAAG,sBAAsB,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IAEjH,MAAM,4BAA4B,GAAG,iBAAiB,CAAC,MAAM,CAAC,aAAa,CAAC;QAC1E,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAExC,MAAM,aAAa,GAAG,+BAA+B,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAE9G,MAAM,YAAY,GAAG,IAAA,wBAAgB,EAAC;QACpC,kBAAkB,EAAE,+BAA+B,CAAC,KAAK,CAAC,4BAA4B,CAAC;QACvF,eAAe,EAAE,IAAI,oBAAO,CAAC,eAAe,CAAC;QAC7C,cAAc,EAAE,IAAI,oBAAO,CAAC,cAAc,CAAC;QAC3C,cAAc,EAAE,IAAI,oBAAO,CAAC,CAAC,CAAC;KAC/B,CAAC,CAAC;IAEH,MAAM,qBAAqB,GAAG,sBAAsB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1E,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAEvE,+CAA+C;IAC/C,OAAO;QACL,qBAAqB;QACrB,oBAAoB;KACrB,CAAC;AACJ,CAAC;AAvCD,kDAuCC;AAEM,MAAM,OAAO,GAAG,CAAC,CAAgB,EAAE,CAAgB,EAAE,OAAO,GAAG,MAAM,EAAE,EAAE;IAC9E,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAClD,CAAC,CAAC;AAFW,QAAA,OAAO,WAElB;AAWF;;;;;GAKG;AACI,MAAM,kBAAkB,GAAG,CAChC,eAAwB,EACxB,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAiC,EAC9F,EAAE;IACF,OAAO,iBAAiB,CAAC;QACvB,qBAAqB,EAAE,aAAa;QACpC,sBAAsB,EAAE,cAAc;QACtC,eAAe;QACf,cAAc;QACd,YAAY;KACb,CAAC,CAAC;AACL,CAAC,CAAC;AAXW,QAAA,kBAAkB,sBAW7B;AAeF;;;;;;;;;GASG;AACH,SAAgB,iBAAiB,CAAC,EAChC,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,YAAY,GACS;IACrB,MAAM,cAAc,GAAG,sBAAsB,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IAChG,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEzD,MAAM,YAAY,GAAG,IAAA,wBAAgB,EAAC;QACpC,kBAAkB,EAAE,cAAc;QAClC,eAAe,EAAE,IAAI,oBAAO,CAAC,eAAe,CAAC;QAC7C,cAAc,EAAE,IAAI,oBAAO,CAAC,cAAc,CAAC;QAC3C,cAAc,EAAE,YAAY;KAC7B,CAAC,CAAC;IAEH,MAAM,qBAAqB,GAAG,aAAa,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1E,MAAM,oBAAoB,GAAG,YAAY,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAEvE,OAAO;QACL,qBAAqB;QACrB,oBAAoB;KACrB,CAAC;AACJ,CAAC;AAxBD,8CAwBC;AAaD,iDAAiD;AACjD,oEAAoE;AAC7D,MAAM,mBAAmB,GAAG,CAAC,EAClC,eAAe,EACf,eAAe,EACf,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,WAAW,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,GACJ,EAAE,EAAE;IAC5B,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAEtE,MAAM,oBAAoB,GAAG,qBAAqB;QAChD,CAAC,CAAC,IAAI,oBAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE;QACpD,CAAC,CAAC,IAAI,oBAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;IAE5E,MAAM,sBAAsB,GAAG,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC5F,MAAM,YAAY,GAAG,IAAA,wBAAgB,EAAC;QACpC,kBAAkB,EAAE,sBAAsB;QAC1C,cAAc,EAAE,IAAI,oBAAO,CAAC,cAAc,CAAC;QAC3C,eAAe,EAAE,IAAI,oBAAO,CAAC,eAAe,CAAC;QAC7C,cAAc,EAAE,IAAI,oBAAO,CAAC,YAAY,CAAC;KAC1C,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,wBAAwB,GAAG,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAElE,OAAO;QACL,qBAAqB,EAAE,oBAAoB;QAC3C,oBAAoB,EAAE,wBAAwB,CAAC,QAAQ,EAAE;KAC1D,CAAC;AACJ,CAAC,CAAC;AA/BW,QAAA,mBAAmB,uBA+B9B;AAEF;;;;;;;;GAQG;AACH,SAAsB,kBAAkB,CACtC,MAAc,EACd,QAA6B,EAC7B,UAAmB,EACnB,gBAA+B;;QAE/B,IAAI,QAAQ,GAAG,gBAAgB,CAAC;QAChC,IAAI,CAAC,QAAQ,EAAE;YACb,QAAQ,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;SACxE;QACD,MAAM,mBAAmB,GAAG,IAAI,oBAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CACpF,SAAA,EAAE,EAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA,CACtD,CAAC;QAEF,2DAA2D;QAC3D,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAA,EAAE,EAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC;QACxF,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAA,EAAE,EAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC;QACxF,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAErD,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAExC,OAAO,CAAC,IAAI,CACV,6BAA6B,UAAU,wBAAwB,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,2BAA2B,SAAS,kBAAkB,SAAS,0BAA0B,IAAA,cAAM,kCAClL,QAAQ,KAAE,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,IACrE,EAAE,CACJ,CAAC;QAEF,gGAAgG;QAChG,MAAM,WAAW,GAAG,oBAAO,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,oBAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAEpF,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,SAAA,EAAE,EAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxG,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,SAAA,EAAE,EAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAExG,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,YAAY,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QAC3C,IAAI,OAAO,EAAE,OAAO,CAAC;QACrB,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YACxB,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;YAC1C,OAAO,GAAG,EAAE,CAAC;SACd;aAAM;YACL,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;SACtC;QACD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACvG,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACvG,MAAM,UAAU,GAAG,oBAAO,CAAC,GAAG,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,GAAG,CAClE,SAAA,EAAE,EAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAA,CACtD,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,QAAQ,OAAO,sBAAsB,UAAU,EAAE,CAAC,CAAC;QAEpG,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;CAAA;AAxDD,gDAwDC","sourcesContent":["import { PublicKey } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport { Kamino, StrategyWithAddress, TokenAmounts } from '@hubbleprotocol/kamino-sdk';\n\nexport const toJson = (object: any): string => {\n return JSON.stringify(object, null, 2);\n};\n\nconst closingPositionDiffTolerance = 0.0001;\n\nexport enum FormTabs {\n deposit = 'Deposit',\n withdraw = 'Withdraw',\n adjust = 'Adjust',\n close = 'Close',\n}\n\nexport interface LeverageFormsCalcsArgs {\n depositAmount: Decimal;\n withdrawAmount: Decimal;\n deposited: Decimal;\n borrowed: Decimal;\n debtTokenMint: PublicKey;\n selectedTokenMint: PublicKey;\n collTokenMint: PublicKey;\n targetLeverage: Decimal;\n activeTab: FormTabs;\n flashBorrowReserveFlashLoanFeePercentage: Decimal;\n debtBorrowFactorPct: Decimal;\n priceCollToDebt: Decimal;\n priceDebtToColl: Decimal;\n}\n\nexport interface FormsCalcsResult {\n earned: Decimal;\n totalDeposited: Decimal;\n totalBorrowed: Decimal;\n netValue: Decimal;\n netValueUsd: Decimal;\n ltv: Decimal;\n}\n\nexport async function calculateMultiplyEffects(\n getPriceByTokenMintDecimal: (mint: PublicKey | string) => Promise<Decimal>,\n {\n depositAmount,\n withdrawAmount,\n deposited,\n borrowed,\n debtTokenMint,\n selectedTokenMint,\n collTokenMint,\n targetLeverage,\n activeTab,\n flashBorrowReserveFlashLoanFeePercentage,\n debtBorrowFactorPct,\n priceCollToDebt,\n priceDebtToColl,\n }: LeverageFormsCalcsArgs\n): Promise<FormsCalcsResult> {\n // calculate estimations for deposit operation\n const {\n adjustDepositPosition: depositModeEstimatedDepositAmount,\n adjustBorrowPosition: depositModeEstimatedBorrowAmount,\n } = estimateDepositMode({\n priceCollToDebt,\n priceDebtToColl,\n amount: depositAmount,\n targetLeverage,\n selectedTokenMint,\n collTokenMint: collTokenMint,\n flashLoanFee: flashBorrowReserveFlashLoanFeePercentage,\n });\n\n // calculate estimations for withdraw operation\n const {\n adjustDepositPosition: withdrawModeEstimatedDepositTokenWithdrawn,\n adjustBorrowPosition: withdrawModeEstimatedBorrowTokenWithdrawn,\n } = estimateWithdrawMode({\n priceCollToDebt: priceCollToDebt,\n collTokenMint,\n selectedTokenMint,\n amount: withdrawAmount,\n deposited: new Decimal(deposited),\n borrowed: new Decimal(borrowed),\n });\n\n // calculate estimations for adjust operation\n const {\n adjustDepositPosition: adjustModeEstimatedDepositAmount,\n adjustBorrowPosition: adjustModeEstimateBorrowAmount,\n } = estimateAdjustMode(priceCollToDebt, {\n targetLeverage,\n debtTokenMint,\n collTokenMint,\n totalDeposited: new Decimal(deposited),\n totalBorrowed: new Decimal(borrowed),\n flashLoanFee: flashBorrowReserveFlashLoanFeePercentage, // TODO: is this the right flash borrow?\n });\n\n console.log(\n 'Estimations',\n toJson({\n activeTab,\n depositModeEstimatedDepositAmount,\n depositModeEstimatedBorrowAmount,\n withdrawModeEstimatedDepositTokenWithdrawn,\n withdrawModeEstimatedBorrowTokenWithdrawn,\n adjustModeEstimatedDepositAmount,\n adjustModeEstimateBorrowAmount,\n })\n );\n\n let [isClosingPosition, totalDeposited, totalBorrowed] = [false, new Decimal(0), new Decimal(0)];\n\n switch (activeTab) {\n case FormTabs.deposit: {\n // Deposit and Adjust never clos the position\n isClosingPosition = false;\n totalDeposited = deposited.add(depositModeEstimatedDepositAmount);\n totalBorrowed = borrowed.add(depositModeEstimatedBorrowAmount);\n break;\n }\n case FormTabs.close:\n case FormTabs.withdraw: {\n isClosingPosition =\n (withdrawModeEstimatedDepositTokenWithdrawn.gte(new Decimal(deposited)) ||\n withdrawModeEstimatedBorrowTokenWithdrawn.gte(new Decimal(borrowed)) ||\n fuzzyEq(withdrawModeEstimatedDepositTokenWithdrawn, new Decimal(deposited), closingPositionDiffTolerance) ||\n fuzzyEq(withdrawModeEstimatedBorrowTokenWithdrawn, new Decimal(borrowed), closingPositionDiffTolerance)) &&\n !fuzzyEq(withdrawModeEstimatedDepositTokenWithdrawn, new Decimal(0), closingPositionDiffTolerance);\n\n totalDeposited = isClosingPosition ? new Decimal(0) : deposited.sub(withdrawModeEstimatedDepositTokenWithdrawn);\n totalBorrowed = isClosingPosition ? new Decimal(0) : borrowed.sub(withdrawModeEstimatedBorrowTokenWithdrawn);\n break;\n }\n case FormTabs.adjust: {\n // Deposit and Adjust never clos the position\n isClosingPosition = false;\n totalDeposited = deposited.add(adjustModeEstimatedDepositAmount);\n totalBorrowed = borrowed.add(adjustModeEstimateBorrowAmount);\n break;\n }\n }\n\n const borrowTokenPrice = await getPriceByTokenMintDecimal(debtTokenMint);\n const depositTokenPrice = await getPriceByTokenMintDecimal(collTokenMint);\n\n const totalDepositedUsd = depositTokenPrice.mul(totalDeposited);\n const totalBorrowedUsd = borrowTokenPrice.mul(totalBorrowed);\n const netValueUsd = totalDepositedUsd.minus(totalBorrowedUsd);\n // TODO marius this is bad, do not convert to sol as we don't only do leveraged loops only\n const netValueSol = netValueUsd.div(borrowTokenPrice);\n const ltv = totalBorrowedUsd.mul(debtBorrowFactorPct.div(100)).div(totalDepositedUsd);\n\n return {\n earned: new Decimal(0),\n totalDeposited,\n totalBorrowed,\n netValue: netValueSol,\n netValueUsd: netValueUsd,\n ltv,\n };\n}\n\n/**\n * returns how much borrowToken will be borrowed to reach leverage given initial collateral amount\n * @param depositTokenAmount\n * @param leverage\n * @param priceAToB\n * @param flashBorrowFee\n */\nexport const calcBorrowAmount = ({\n depositTokenAmount,\n targetLeverage,\n priceCollToDebt,\n flashBorrowFee,\n}: {\n depositTokenAmount: Decimal;\n targetLeverage: Decimal;\n priceCollToDebt: Decimal;\n flashBorrowFee: Decimal;\n}) => {\n const initialCollAmountInCollToken = depositTokenAmount;\n\n const finalCollAmountInCollToken = initialCollAmountInCollToken.mul(targetLeverage);\n const finalDebtAmountInCollToken = finalCollAmountInCollToken.sub(initialCollAmountInCollToken);\n const finalDebtAmountInDebtToken = finalDebtAmountInCollToken.mul(priceCollToDebt);\n\n const flashFeeFactor = new Decimal(1).add(flashBorrowFee);\n const debtTokenToBorrow = finalDebtAmountInDebtToken.mul(flashFeeFactor);\n\n return debtTokenToBorrow;\n};\n\ninterface UseEstimateWithdrawAmountsProps {\n priceCollToDebt: Decimal;\n amount: Decimal.Value;\n deposited: Decimal;\n borrowed: Decimal;\n collTokenMint: PublicKey;\n selectedTokenMint: PublicKey;\n}\n\nexport const estimateWithdrawMode = (props: UseEstimateWithdrawAmountsProps) => {\n const { amount, collTokenMint, selectedTokenMint, deposited, borrowed, priceCollToDebt } = props;\n\n return calcWithdrawAmounts({\n selectedTokenMint,\n collTokenMint,\n withdrawAmount: new Decimal(amount),\n priceCollToDebt,\n currentBorrowPosition: borrowed,\n currentDepositPosition: deposited,\n });\n};\n\nexport interface WithdrawParams {\n currentBorrowPosition: Decimal;\n currentDepositPosition: Decimal;\n priceCollToDebt: Decimal;\n withdrawAmount: Decimal;\n selectedTokenMint: PublicKey;\n collTokenMint: PublicKey;\n}\n\ninterface WithdrawResult {\n adjustDepositPosition: Decimal;\n adjustBorrowPosition: Decimal;\n}\n\nexport function calcWithdrawAmounts(params: WithdrawParams): WithdrawResult {\n const {\n currentBorrowPosition,\n currentDepositPosition,\n priceCollToDebt,\n withdrawAmount,\n selectedTokenMint,\n collTokenMint,\n } = params;\n\n // MSOL/SOL\n const currentDepositInCollateralToken = currentDepositPosition;\n const currentDebtInCollateralToken = currentBorrowPosition.div(priceCollToDebt);\n const currentNetPositionInCollateralToken = currentDepositInCollateralToken.minus(currentDebtInCollateralToken);\n const targetLeverage = currentDepositInCollateralToken.div(currentNetPositionInCollateralToken);\n\n const initialDepositInCollateralToken = currentDepositPosition.minus(currentBorrowPosition.div(priceCollToDebt));\n\n const amountToWithdrawDepositToken = selectedTokenMint.equals(collTokenMint)\n ? withdrawAmount\n : withdrawAmount.div(priceCollToDebt);\n\n const targetDeposit = initialDepositInCollateralToken.minus(amountToWithdrawDepositToken).mul(targetLeverage);\n\n const targetBorrow = calcBorrowAmount({\n depositTokenAmount: initialDepositInCollateralToken.minus(amountToWithdrawDepositToken),\n priceCollToDebt: new Decimal(priceCollToDebt),\n targetLeverage: new Decimal(targetLeverage),\n flashBorrowFee: new Decimal(0),\n });\n\n const adjustDepositPosition = currentDepositPosition.minus(targetDeposit);\n const adjustBorrowPosition = currentBorrowPosition.minus(targetBorrow);\n\n // TODO: add flashLoan fee here in final values\n return {\n adjustDepositPosition,\n adjustBorrowPosition,\n };\n}\n\nexport const fuzzyEq = (a: Decimal.Value, b: Decimal.Value, epsilon = 0.0001) => {\n return new Decimal(a).sub(b).abs().lte(epsilon);\n};\n\ninterface UseEstimateAdjustAmountsProps {\n targetLeverage: Decimal;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n totalDeposited: Decimal;\n totalBorrowed: Decimal;\n flashLoanFee: Decimal;\n}\n\n/**\n * Calculate how much token will be deposited or withdrawn in case of position adjustment\n * @param leverage\n * @param totalDeposited\n * @param totalBorrowed\n */\nexport const estimateAdjustMode = (\n priceCollToDebt: Decimal,\n { targetLeverage, totalDeposited, totalBorrowed, flashLoanFee }: UseEstimateAdjustAmountsProps\n) => {\n return calcAdjustAmounts({\n currentBorrowPosition: totalBorrowed,\n currentDepositPosition: totalDeposited,\n priceCollToDebt,\n targetLeverage,\n flashLoanFee,\n });\n};\n\nexport interface AdjustLeverageParams {\n targetLeverage: Decimal;\n currentBorrowPosition: Decimal;\n currentDepositPosition: Decimal;\n priceCollToDebt: Decimal;\n flashLoanFee: Decimal;\n}\n\ninterface AdjustLeverageResult {\n adjustDepositPosition: Decimal;\n adjustBorrowPosition: Decimal;\n}\n\n/**\n * Calculates the amounts of tokenA to deposit/withdraw and tokenB to borrow/repay proportionally to adjust the leverage of a position.\n *\n * @param {AdjustLeverageParams} params - Parameters for the calculation\n * @param {number} params.targetLeverage - The target leverage for the position\n * @param {Decimal} params.currentPositionTokenA - The current amount of tokenA in the position\n * @param {Decimal} params.currentPositionTokenB - The current amount of borrowed tokenB in the position\n * @param {number} params.priceAtoB - The conversion rate from tokenA to tokenB (tokenA price = tokenB price * priceAtoB)\n * @returns {AdjustLeverageResult} An object containing the amounts of tokenA to deposit/withdraw and tokenB to borrow/repay\n */\nexport function calcAdjustAmounts({\n targetLeverage,\n currentBorrowPosition,\n currentDepositPosition,\n priceCollToDebt,\n flashLoanFee,\n}: AdjustLeverageParams): AdjustLeverageResult {\n const initialDeposit = currentDepositPosition.minus(currentBorrowPosition.div(priceCollToDebt));\n const targetDeposit = initialDeposit.mul(targetLeverage);\n\n const targetBorrow = calcBorrowAmount({\n depositTokenAmount: initialDeposit,\n priceCollToDebt: new Decimal(priceCollToDebt),\n targetLeverage: new Decimal(targetLeverage),\n flashBorrowFee: flashLoanFee,\n });\n\n const adjustDepositPosition = targetDeposit.minus(currentDepositPosition);\n const adjustBorrowPosition = targetBorrow.minus(currentBorrowPosition);\n\n return {\n adjustDepositPosition,\n adjustBorrowPosition,\n };\n}\n\ninterface UseTransactionInfoStats {\n priceCollToDebt: Decimal;\n priceDebtToColl: Decimal;\n amount: Decimal;\n targetLeverage: Decimal;\n selectedTokenMint: PublicKey;\n collTokenMint: PublicKey;\n flashLoanFee: Decimal;\n slippagePct?: Decimal;\n}\n\n// Given a deposit amount of Deposit|Borrow token\n// and a target leverage, calculate final { collateral, debt } value\nexport const estimateDepositMode = ({\n priceCollToDebt,\n priceDebtToColl,\n amount,\n targetLeverage,\n selectedTokenMint,\n collTokenMint,\n flashLoanFee,\n slippagePct = new Decimal(0),\n}: UseTransactionInfoStats) => {\n const isDepositingCollToken = selectedTokenMint.equals(collTokenMint);\n\n const finalCollTokenAmount = isDepositingCollToken\n ? new Decimal(amount).mul(targetLeverage).toNumber()\n : new Decimal(amount).mul(priceDebtToColl).mul(targetLeverage).toNumber();\n\n const depositCollTokenAmount = isDepositingCollToken ? amount : amount.mul(priceDebtToColl);\n const borrowAmount = calcBorrowAmount({\n depositTokenAmount: depositCollTokenAmount,\n targetLeverage: new Decimal(targetLeverage),\n priceCollToDebt: new Decimal(priceCollToDebt),\n flashBorrowFee: new Decimal(flashLoanFee),\n });\n\n const slippageFactor = new Decimal(1).add(slippagePct.div(new Decimal(100)));\n const borrowAmountWithSlippage = borrowAmount.mul(slippageFactor);\n\n return {\n adjustDepositPosition: finalCollTokenAmount,\n adjustBorrowPosition: borrowAmountWithSlippage.toNumber(),\n };\n};\n\n/**\n * Given an amount of ktokens, returns the estimated amount of token A and token B that need to be deposited\n * The amount of A and B may result in less ktokens being minted, the actual amount of ktokens minted is returned as well\n * @param kamino\n * @param strategy\n * @param mintAmount - desired amount of ktokens to mint\n * @param strategyHoldings - optional strategy holdings, if not provided will be fetched from the blockchain\n * @returns [tokenA, tokenB, actualMintAmount]\n */\nexport async function simulateMintKToken(\n kamino: Kamino,\n strategy: StrategyWithAddress,\n mintAmount: Decimal,\n strategyHoldings?: TokenAmounts\n): Promise<[Decimal, Decimal, Decimal]> {\n let holdings = strategyHoldings;\n if (!holdings) {\n holdings = await kamino.getStrategyTokensHoldings(strategy, 'DEPOSIT');\n }\n const sharesIssuedDecimal = new Decimal(strategy.strategy.sharesIssued.toString()).div(\n 10 ** strategy.strategy.sharesMintDecimals.toNumber()\n );\n\n // Add 1 because the sdk doesn't round up where the SC will\n const strategyA = holdings.a.div(10 ** strategy.strategy.tokenAMintDecimals.toNumber());\n const strategyB = holdings.b.div(10 ** strategy.strategy.tokenBMintDecimals.toNumber());\n const aPerShare = strategyA.div(sharesIssuedDecimal);\n const bPerShare = strategyB.div(sharesIssuedDecimal);\n\n const requiredA = aPerShare.mul(mintAmount);\n const requiredB = bPerShare.mul(mintAmount);\n const pxAInB = strategyB.div(strategyA);\n\n console.info(\n `Estimating kToken mint of ${mintAmount} ktokens on strategy ${strategy.address.toString()} requires: estimated A: ${requiredA}, estimated B: ${requiredB}. Current pool state:\\n${toJson(\n { ...holdings, sharesIssued: sharesIssuedDecimal, poolPxAInB: pxAInB }\n )}`\n );\n\n // If we deposited with this exact ratio - how many ktokens do we actually get from the program?\n const RustDecimal = Decimal.clone({ precision: 18, rounding: Decimal.ROUND_FLOOR });\n\n const usA = new RustDecimal(holdings.a);\n const usB = new RustDecimal(holdings.b);\n const uA = new RustDecimal(requiredA.mul(10 ** strategy.strategy.tokenAMintDecimals.toNumber()).ceil());\n const uB = new RustDecimal(requiredB.mul(10 ** strategy.strategy.tokenBMintDecimals.toNumber()).ceil());\n\n const ratio = usA.div(usB);\n const depositableB = uA.div(ratio).floor();\n let actualA, actualB;\n if (depositableB.lte(uB)) {\n actualA = depositableB.mul(ratio).floor();\n actualB = uB;\n } else {\n actualA = uB.mul(ratio).floor();\n actualB = actualA.div(ratio).floor();\n }\n const actualMintFromA = actualA.mul(strategy.strategy.sharesIssued.toString()).div(holdings.a).floor();\n const actualMintFromB = actualB.mul(strategy.strategy.sharesIssued.toString()).div(holdings.b).floor();\n const actualMint = Decimal.min(actualMintFromA, actualMintFromB).div(\n 10 ** strategy.strategy.sharesMintDecimals.toNumber()\n );\n console.log(`Actual deposit amounts: A: ${actualA}, B: ${actualB}, kTokens to mint: ${actualMint}`);\n\n return [requiredA, requiredB, actualMint];\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kamino-finance/klend-sdk",
3
- "version": "2.10.14",
3
+ "version": "2.10.16",
4
4
  "description": "Typescript SDK for interacting with the Kamino Lending (klend) protocol",
5
5
  "repository": {
6
6
  "type": "git",