@kamino-finance/klend-sdk 2.13.2 → 2.13.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"reserve.js","sourceRoot":"","sources":["../../src/classes/reserve.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport { AccountInfo, Connection, PublicKey } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport {\n INITIAL_COLLATERAL_RATE,\n ONE_HUNDRED_PCT_IN_BPS,\n SLOTS_PER_DAY,\n SLOTS_PER_SECOND,\n SLOTS_PER_YEAR,\n TokenOracleData,\n U64_MAX,\n} from '../utils';\nimport { ReserveDataType, ReserveStatus } from './shared';\nimport { Reserve, ReserveFields } from '../idl_codegen/accounts';\nimport { CurvePointFields } from '../idl_codegen/types';\nimport { calculateAPYFromAPR, getBorrowRate, parseTokenSymbol } from './utils';\nimport { Fraction } from './fraction';\nimport BN from 'bn.js';\nimport { ActionType } from './action';\n\nexport const DEFAULT_RECENT_SLOT_DURATION_MS = 450;\n\nexport class KaminoReserve {\n state: Reserve;\n address: PublicKey;\n symbol: string;\n\n tokenOraclePrice: TokenOracleData;\n stats: ReserveDataType;\n\n private buffer: AccountInfo<Buffer> | null;\n private connection: Connection;\n private readonly recentSlotDurationMs: number;\n\n constructor(\n state: Reserve,\n address: PublicKey,\n tokenOraclePrice: TokenOracleData,\n connection: Connection,\n recentSlotDurationMs: number\n ) {\n this.state = state;\n this.address = address;\n this.buffer = null;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = {} as ReserveDataType;\n this.connection = connection;\n this.symbol = parseTokenSymbol(state.config.tokenInfo.name);\n this.recentSlotDurationMs = recentSlotDurationMs;\n }\n\n static initialize(\n accountData: AccountInfo<Buffer>,\n address: PublicKey,\n state: Reserve,\n tokenOraclePrice: TokenOracleData,\n connection: Connection,\n recentSlotDurationMs: number\n ) {\n const reserve = new KaminoReserve(state, address, tokenOraclePrice, connection, recentSlotDurationMs);\n reserve.setBuffer(accountData);\n reserve.stats = reserve.formatReserveData(state);\n return reserve;\n }\n\n /// GETTERS\n\n /**\n * @returns the parsed token symbol of the reserve\n */\n getTokenSymbol(): string {\n return parseTokenSymbol(this.state.config.tokenInfo.name);\n }\n\n /**\n * @returns the total borrowed amount of the reserve\n */\n getBorrowedAmount(): Decimal {\n return new Fraction(this.state.liquidity.borrowedAmountSf).toDecimal();\n }\n\n /**\n * @returns the available liquidity amount of the reserve\n */\n getLiquidityAvailableAmount(): Decimal {\n return new Decimal(this.state.liquidity.availableAmount.toString());\n }\n\n /**\n *\n * @returns the last cached price stored in the reserve in USD\n */\n getReserveMarketPrice(): Decimal {\n return new Fraction(this.state.liquidity.marketPriceSf).toDecimal();\n }\n\n /**\n * @returns the current market price of the reserve in USD\n */\n getOracleMarketPrice(): Decimal {\n return this.tokenOraclePrice.price;\n }\n\n /**\n * @returns the total accumulated protocol fees of the reserve\n */\n getAccumulatedProtocolFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedProtocolFeesSf).toDecimal();\n }\n\n /**\n * @returns the total accumulated referrer fees of the reserve\n */\n getAccumulatedReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedReferrerFeesSf).toDecimal();\n }\n\n /**\n * @returns the total pending referrer fees of the reserve\n */\n getPendingReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.pendingReferrerFeesSf).toDecimal();\n }\n\n /**\n *\n * @returns the flash loan fee percentage of the reserve\n */\n getFlashLoanFee = (): Decimal => {\n if (this.state.config.fees.flashLoanFeeSf.toString() === U64_MAX) {\n return new Decimal('0');\n }\n return new Fraction(this.state.config.fees.flashLoanFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the origination fee percentage of the reserve\n */\n getBorrowFee = (): Decimal => {\n return new Fraction(this.state.config.fees.borrowFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the fixed interest rate allocated to the host\n */\n getFixedHostInterestRate = (): Decimal => {\n return new Decimal(this.state.config.hostFixedInterestRateBps).div(10_000);\n };\n\n /**\n * Use getEstimatedTotalSupply() for the most accurate value\n * @returns the stale total liquidity supply of the reserve from the last refresh\n */\n getTotalSupply(): Decimal {\n return this.getLiquidityAvailableAmount()\n .add(this.getBorrowedAmount())\n .sub(this.getAccumulatedProtocolFees())\n .sub(this.getAccumulatedReferrerFees())\n .sub(this.getPendingReferrerFees());\n }\n\n /**\n * Calculates the total liquidity supply of the reserve\n */\n getEstimatedTotalSupply(slot: number, referralFeeBps: number): Decimal {\n const { totalSupply } = this.getEstimatedDebtAndSupply(slot, referralFeeBps);\n return totalSupply;\n }\n\n /**\n * Use getEstimatedCumulativeBorrowRate() for the most accurate value\n * @returns the stale cumulative borrow rate of the reserve from the last refresh\n */\n getCumulativeBorrowRate(): Decimal {\n let accSf = new BN(0);\n for (const value of this.state.liquidity.cumulativeBorrowRateBsf.value.reverse()) {\n accSf = accSf.add(value);\n accSf.shrn(64);\n }\n return new Fraction(accSf).toDecimal();\n }\n\n /**\n * @Returns estimated cumulative borrow rate of the reserve\n */\n getEstimatedCumulativeBorrowRate(currentSlot: number): Decimal {\n const currentBorrowRate = new Decimal(this.calculateBorrowAPR());\n const slotsElapsed = Math.max(currentSlot - this.state.lastUpdate.slot.toNumber(), 0);\n\n const compoundInterest = this.approximateCompoundedInterest(currentBorrowRate, slotsElapsed);\n\n const previousCumulativeBorrowRate = this.getCumulativeBorrowRate();\n\n return previousCumulativeBorrowRate.mul(compoundInterest);\n }\n\n /**\n * Use getEstimatedCollateralExchangeRate() for the most accurate value\n * @returns the stale exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getCollateralExchangeRate(): Decimal {\n const totalSupply = this.getTotalSupply();\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the estimated exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getEstimatedCollateralExchangeRate(slot: number, referralFeeBps: number): Decimal {\n const totalSupply = this.getEstimatedTotalSupply(slot, referralFeeBps);\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the total USD value of the existing collateral in the reserve\n */\n getDepositTvl = (): Decimal => {\n return new Decimal(this.getTotalSupply().toString()).mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n *\n * Get the total USD value of the borrowed assets from the reserve\n */\n getBorrowTvl = (): Decimal => {\n return this.getBorrowedAmount().mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n * @returns 10^mint_decimals\n */\n getMintFactor(): Decimal {\n return new Decimal(10).pow(this.state.liquidity.mintDecimals.toNumber());\n }\n\n /**\n * @Returns true if the total liquidity supply of the reserve is greater than the deposit limit\n */\n depositLimitCrossed(): boolean {\n return this.getTotalSupply().gt(new Decimal(this.state.config.depositLimit.toString()));\n }\n\n /**\n * @Returns true if the total borrowed amount of the reserve is greater than the borrow limit\n */\n borrowLimitCrossed(): boolean {\n return this.getBorrowedAmount().gt(new Decimal(this.state.config.borrowLimit.toString()));\n }\n\n /**\n *\n * @returns the max capacity of the daily deposit withdrawal cap\n */\n getDepositWithdrawalCapCapacity(): Decimal {\n return new Decimal(this.state.config.depositWithdrawalCap.configCapacity.toString());\n }\n\n /**\n *\n * @returns the current capacity of the daily deposit withdrawal cap\n */\n getDepositWithdrawalCapCurrent(slot: number): Decimal {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n if (slotsElapsed > SLOTS_PER_DAY) {\n return new Decimal(0);\n } else {\n return new Decimal(this.state.config.depositWithdrawalCap.currentTotal.toString());\n }\n }\n\n /**\n *\n * @returns the max capacity of the daily debt withdrawal cap\n */\n getDebtWithdrawalCapCapacity(): Decimal {\n return new Decimal(this.state.config.debtWithdrawalCap.configCapacity.toString());\n }\n\n /**\n *\n * @returns the borrow limit of the reserve outside the elevation group\n */\n getBorrowLimitOutsideElevationGroup(): Decimal {\n return new Decimal(this.state.config.borrowLimitOutsideElevationGroup.toString());\n }\n\n /**\n *\n * @returns the borrowed amount of the reserve outside the elevation group\n */\n getBorrowedAmountOutsideElevationGroup(): Decimal {\n return new Decimal(this.state.borrowedAmountOutsideElevationGroup.toString());\n }\n\n /**\n *\n * @returns the borrow limit against the collateral reserve in the elevation group\n */\n getBorrowLimitAgainstCollateralInElevationGroup(elevationGroupIndex: number): Decimal {\n return new Decimal(\n this.state.config.borrowLimitAgainstThisCollateralInElevationGroup[elevationGroupIndex].toString()\n );\n }\n\n /**\n *\n * @returns the borrowed amount against the collateral reserve in the elevation group\n */\n getBorrowedAmountAgainstCollateralInElevationGroup(elevationGroupIndex: number): Decimal {\n return new Decimal(this.state.borrowedAmountsAgainstThisReserveInElevationGroups[elevationGroupIndex].toString());\n }\n\n /**\n *\n * @returns the current capacity of the daily debt withdrawal cap\n */\n getDebtWithdrawalCapCurrent(slot: number): Decimal {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n if (slotsElapsed > SLOTS_PER_DAY) {\n return new Decimal(0);\n } else {\n return new Decimal(this.state.config.debtWithdrawalCap.currentTotal.toString());\n }\n }\n\n getBorrowFactor(): Decimal {\n return new Decimal(this.state.config.borrowFactorPct.toString()).div(100);\n }\n\n calculateSupplyAPR() {\n const currentUtilization = this.calculateUtilizationRatio();\n\n const borrowAPR = this.calculateBorrowAPR();\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n return currentUtilization * borrowAPR * protocolTakeRatePct;\n }\n\n getEstimatedDebtAndSupply(slot: number, referralFeeBps: number): { totalBorrow: Decimal; totalSupply: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let totalBorrow: Decimal;\n let totalSupply: Decimal;\n if (slotsElapsed === 0) {\n totalBorrow = this.getBorrowedAmount();\n totalSupply = this.getTotalSupply();\n } else {\n const { newDebt, newAccProtocolFees, pendingReferralFees } = this.compoundInterest(slotsElapsed, referralFeeBps);\n const newTotalSupply = this.getLiquidityAvailableAmount()\n .add(newDebt)\n .sub(newAccProtocolFees)\n .sub(this.getAccumulatedReferrerFees())\n .sub(pendingReferralFees);\n totalBorrow = newDebt;\n totalSupply = newTotalSupply;\n }\n return { totalBorrow, totalSupply };\n }\n\n getEstimatedAccumulatedProtocolFees(\n slot: number,\n referralFeeBps: number\n ): { accumulatedProtocolFees: Decimal; compoundedVariableProtocolFee: Decimal; compoundedFixedHostFee: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let accumulatedProtocolFees: Decimal;\n let compoundedVariableProtocolFee: Decimal;\n let compoundedFixedHostFee: Decimal;\n if (slotsElapsed === 0) {\n accumulatedProtocolFees = this.getAccumulatedProtocolFees();\n compoundedVariableProtocolFee = new Decimal(0);\n compoundedFixedHostFee = new Decimal(0);\n } else {\n const { newAccProtocolFees, variableProtocolFee, fixedHostFee } = this.compoundInterest(\n slotsElapsed,\n referralFeeBps\n );\n accumulatedProtocolFees = newAccProtocolFees;\n compoundedVariableProtocolFee = variableProtocolFee;\n compoundedFixedHostFee = fixedHostFee;\n }\n return { accumulatedProtocolFees, compoundedVariableProtocolFee, compoundedFixedHostFee };\n }\n\n calculateUtilizationRatio() {\n const totalBorrows = this.getBorrowedAmount();\n const totalSupply = this.getTotalSupply();\n if (totalSupply.eq(0)) {\n return 0;\n }\n return totalBorrows.dividedBy(totalSupply).toNumber();\n }\n\n calcSimulatedUtilizationRatio(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ): number {\n const { totalBorrow: previousTotalBorrowed, totalSupply: previousTotalSupply } = this.getEstimatedDebtAndSupply(\n slot,\n referralFeeBps\n );\n\n switch (action) {\n case 'deposit': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'withdraw': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n if (newTotalSupply.eq(0)) {\n return 0;\n } else {\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n }\n case 'borrow': {\n const newTotalBorrowed = previousTotalBorrowed.add(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'repay': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'depositAndBorrow': {\n const newTotalSupply = previousTotalSupply.add(amount);\n const newTotalBorrowed = previousTotalBorrowed.add(outflowAmount!);\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'repayAndWithdraw': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n const newTotalSupply = previousTotalSupply.sub(outflowAmount!);\n if (newTotalSupply.eq(0)) {\n return 0;\n }\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'mint': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'redeem': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n default:\n throw Error(`Invalid action type ${action} for simulatedUtilizationRatio`);\n }\n }\n\n calcSimulatedBorrowAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(newUtilization, curve) * slotAdjustmentFactor;\n }\n\n calcSimulatedSupplyAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const simulatedBorrowAPR = this.calcSimulatedBorrowAPR(amount, action, slot, referralFeeBps, outflowAmount);\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n\n return newUtilization * simulatedBorrowAPR * protocolTakeRatePct;\n }\n\n slotAdjustmentFactor(): number {\n return 1000 / SLOTS_PER_SECOND / this.recentSlotDurationMs;\n }\n\n calculateBorrowAPR() {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const currentUtilization = this.calculateUtilizationRatio();\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(currentUtilization, curve) * slotAdjustmentFactor;\n }\n\n /**\n * @returns the mint of the reserve liquidity token\n */\n getLiquidityMint(): PublicKey {\n return this.state.liquidity.mintPubkey;\n }\n\n /**\n * @returns the token program of the reserve liquidity mint\n */\n getLiquidityTokenProgram(): PublicKey {\n return this.state.liquidity.tokenProgram;\n }\n\n /**\n * @returns the mint of the reserve collateral token , i.e. the cToken minted for depositing the liquidity token\n */\n getCTokenMint(): PublicKey {\n return this.state.collateral.mintPubkey;\n }\n\n setBuffer(buffer: AccountInfo<Buffer> | null) {\n this.buffer = buffer;\n }\n\n async load(tokenOraclePrice: TokenOracleData) {\n if (!this.buffer) {\n this.setBuffer(await this.connection.getAccountInfo(this.address, 'processed'));\n }\n\n if (!this.buffer) {\n throw Error(`Error requesting account info for ${this.symbol}`);\n }\n\n const parsedData = await Reserve.fetch(this.connection, this.address);\n if (!parsedData) {\n throw Error(`Unable to parse data of reserve ${this.symbol}`);\n }\n this.state = parsedData;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = this.formatReserveData(parsedData);\n }\n\n totalSupplyAPY() {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n const totalAPY = new Decimal(stats.supplyInterestAPY).toNumber();\n\n return {\n interestAPY: stats.supplyInterestAPY,\n totalAPY,\n };\n }\n\n totalBorrowAPY() {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n const totalAPY = new Decimal(stats.borrowInterestAPY).toNumber();\n\n return {\n interestAPY: stats.borrowInterestAPY,\n totalAPY,\n };\n }\n\n private formatReserveData(parsedData: ReserveFields): ReserveDataType {\n const mintTotalSupply = new Decimal(parsedData.collateral.mintTotalSupply.toString()).div(this.getMintFactor());\n let reserveStatus = ReserveStatus.Active;\n switch (parsedData.config.status) {\n case 0:\n reserveStatus = ReserveStatus.Active;\n break;\n case 1:\n reserveStatus = ReserveStatus.Obsolete;\n break;\n case 2:\n reserveStatus = ReserveStatus.Hidden;\n break;\n }\n return {\n // Reserve config\n\n status: reserveStatus,\n mintAddress: parsedData.liquidity.mintPubkey,\n borrowCurve: truncateBorrowCurve(parsedData.config.borrowRateCurve.points),\n loanToValuePct: parsedData.config.loanToValuePct / 100,\n maxLiquidationBonus: parsedData.config.maxLiquidationBonusBps / 10000,\n minLiquidationBonus: parsedData.config.minLiquidationBonusBps / 10000,\n liquidationThreshold: parsedData.config.liquidationThresholdPct / 100,\n protocolTakeRate: parsedData.config.protocolTakeRatePct / 100,\n reserveDepositLimit: new Decimal(parsedData.config.depositLimit.toString()),\n reserveBorrowLimit: new Decimal(parsedData.config.borrowLimit.toString()),\n\n // Reserve info\n symbol: parseTokenSymbol(parsedData.config.tokenInfo.name),\n decimals: this.state.liquidity.mintDecimals.toNumber(),\n supplyInterestAPY: calculateAPYFromAPR(this.calculateSupplyAPR()),\n borrowInterestAPY: calculateAPYFromAPR(this.calculateBorrowAPR()),\n accumulatedProtocolFees: this.getAccumulatedProtocolFees().div(this.getMintFactor()),\n mintTotalSupply,\n depositLimitCrossedSlot: parsedData.liquidity.depositLimitCrossedSlot.toNumber(),\n borrowLimitCrossedSlot: parsedData.liquidity.borrowLimitCrossedSlot.toNumber(),\n borrowFactor: parsedData.config.borrowFactorPct.toNumber(),\n };\n }\n\n /**\n * Compound current borrow rate over elapsed slots\n *\n * This also calculates protocol fees, which are taken for all obligations that have borrowed from current reserve.\n *\n * This also calculates referral fees, which are taken into pendingReferralFees.\n *\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L517\n *\n * @param slotsElapsed\n * @param referralFeeBps\n */\n private compoundInterest(\n slotsElapsed: number,\n referralFeeBps: number\n ): {\n newDebt: Decimal;\n netNewDebt: Decimal;\n variableProtocolFee: Decimal;\n fixedHostFee: Decimal;\n absoluteReferralFee: Decimal;\n maxReferralFees: Decimal;\n newAccProtocolFees: Decimal;\n pendingReferralFees: Decimal;\n } {\n const currentBorrowRate = this.calculateBorrowAPR();\n const protocolTakeRate = new Decimal(this.state.config.protocolTakeRatePct).div(100);\n const referralRate = new Decimal(referralFeeBps).div(10_000);\n const fixedHostInterestRate = this.getFixedHostInterestRate();\n\n const compoundedInterestRate = this.approximateCompoundedInterest(\n new Decimal(currentBorrowRate).plus(fixedHostInterestRate),\n slotsElapsed\n );\n const compoundedFixedRate = this.approximateCompoundedInterest(fixedHostInterestRate, slotsElapsed);\n\n const previousDebt = this.getBorrowedAmount();\n const newDebt = previousDebt.mul(compoundedInterestRate);\n const fixedHostFee = previousDebt.mul(compoundedFixedRate).sub(previousDebt);\n\n const netNewDebt = newDebt.sub(previousDebt).sub(fixedHostFee);\n\n const variableProtocolFee = netNewDebt.mul(protocolTakeRate);\n const absoluteReferralFee = protocolTakeRate.mul(referralRate);\n const maxReferralFees = netNewDebt.mul(absoluteReferralFee);\n\n const newAccProtocolFees = variableProtocolFee\n .add(fixedHostFee)\n .sub(maxReferralFees)\n .add(this.getAccumulatedProtocolFees());\n\n const pendingReferralFees = this.getPendingReferrerFees().add(maxReferralFees);\n\n return {\n newDebt,\n netNewDebt,\n variableProtocolFee,\n fixedHostFee,\n absoluteReferralFee,\n maxReferralFees,\n newAccProtocolFees,\n pendingReferralFees,\n };\n }\n\n /**\n * Approximation to match the smart contract calculation\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L1026\n * @param rate\n * @param elapsedSlots\n * @private\n */\n private approximateCompoundedInterest(rate: Decimal, elapsedSlots: number): Decimal {\n const base = rate.div(SLOTS_PER_YEAR);\n switch (elapsedSlots) {\n case 0:\n return new Decimal(1);\n case 1:\n return base.add(1);\n case 2:\n return base.add(1).mul(base.add(1));\n case 3:\n return base.add(1).mul(base.add(1)).mul(base.add(1));\n case 4:\n // eslint-disable-next-line no-case-declarations\n const pow2 = base.add(1).mul(base.add(1));\n return pow2.mul(pow2);\n }\n const exp = elapsedSlots;\n const expMinus1 = exp - 1;\n const expMinus2 = exp - 2;\n\n const basePow2 = base.mul(base);\n const basePow3 = basePow2.mul(base);\n\n const firstTerm = base.mul(exp);\n const secondTerm = basePow2.mul(exp).mul(expMinus1).div(2);\n const thirdTerm = basePow3.mul(exp).mul(expMinus1).mul(expMinus2).div(6);\n\n return new Decimal(1).add(firstTerm).add(secondTerm).add(thirdTerm);\n }\n}\n\nconst truncateBorrowCurve = (points: CurvePointFields[]): [number, number][] => {\n const curve: [number, number][] = [];\n for (const { utilizationRateBps, borrowRateBps } of points) {\n curve.push([utilizationRateBps / ONE_HUNDRED_PCT_IN_BPS, borrowRateBps / ONE_HUNDRED_PCT_IN_BPS]);\n\n if (utilizationRateBps === ONE_HUNDRED_PCT_IN_BPS) {\n break;\n }\n }\n return curve;\n};\n"]}
1
+ {"version":3,"file":"reserve.js","sourceRoot":"","sources":["../../src/classes/reserve.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport { AccountInfo, Connection, PublicKey } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport {\n INITIAL_COLLATERAL_RATE,\n ONE_HUNDRED_PCT_IN_BPS,\n SLOTS_PER_DAY,\n SLOTS_PER_SECOND,\n SLOTS_PER_YEAR,\n TokenOracleData,\n U64_MAX,\n} from '../utils';\nimport { ReserveDataType, ReserveStatus } from './shared';\nimport { Reserve, ReserveFields } from '../idl_codegen/accounts';\nimport { CurvePointFields } from '../idl_codegen/types';\nimport { calculateAPYFromAPR, getBorrowRate, parseTokenSymbol } from './utils';\nimport { Fraction } from './fraction';\nimport BN from 'bn.js';\nimport { ActionType } from './action';\nimport { KaminoMarket } from './market';\n\nexport const DEFAULT_RECENT_SLOT_DURATION_MS = 450;\n\nexport class KaminoReserve {\n state: Reserve;\n address: PublicKey;\n symbol: string;\n\n tokenOraclePrice: TokenOracleData;\n stats: ReserveDataType;\n\n private buffer: AccountInfo<Buffer> | null;\n private connection: Connection;\n private readonly recentSlotDurationMs: number;\n\n constructor(\n state: Reserve,\n address: PublicKey,\n tokenOraclePrice: TokenOracleData,\n connection: Connection,\n recentSlotDurationMs: number\n ) {\n this.state = state;\n this.address = address;\n this.buffer = null;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = {} as ReserveDataType;\n this.connection = connection;\n this.symbol = parseTokenSymbol(state.config.tokenInfo.name);\n this.recentSlotDurationMs = recentSlotDurationMs;\n }\n\n static initialize(\n accountData: AccountInfo<Buffer>,\n address: PublicKey,\n state: Reserve,\n tokenOraclePrice: TokenOracleData,\n connection: Connection,\n recentSlotDurationMs: number\n ) {\n const reserve = new KaminoReserve(state, address, tokenOraclePrice, connection, recentSlotDurationMs);\n reserve.setBuffer(accountData);\n reserve.stats = reserve.formatReserveData(state);\n return reserve;\n }\n\n /// GETTERS\n\n /**\n * @returns the parsed token symbol of the reserve\n */\n getTokenSymbol(): string {\n return parseTokenSymbol(this.state.config.tokenInfo.name);\n }\n\n /**\n * @returns the total borrowed amount of the reserve\n */\n getBorrowedAmount(): Decimal {\n return new Fraction(this.state.liquidity.borrowedAmountSf).toDecimal();\n }\n\n /**\n * @returns the available liquidity amount of the reserve\n */\n getLiquidityAvailableAmount(): Decimal {\n return new Decimal(this.state.liquidity.availableAmount.toString());\n }\n\n /**\n *\n * @returns the last cached price stored in the reserve in USD\n */\n getReserveMarketPrice(): Decimal {\n return new Fraction(this.state.liquidity.marketPriceSf).toDecimal();\n }\n\n /**\n * @returns the current market price of the reserve in USD\n */\n getOracleMarketPrice(): Decimal {\n return this.tokenOraclePrice.price;\n }\n\n /**\n * @returns the total accumulated protocol fees of the reserve\n */\n getAccumulatedProtocolFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedProtocolFeesSf).toDecimal();\n }\n\n /**\n * @returns the total accumulated referrer fees of the reserve\n */\n getAccumulatedReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedReferrerFeesSf).toDecimal();\n }\n\n /**\n * @returns the total pending referrer fees of the reserve\n */\n getPendingReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.pendingReferrerFeesSf).toDecimal();\n }\n\n /**\n *\n * @returns the flash loan fee percentage of the reserve\n */\n getFlashLoanFee = (): Decimal => {\n if (this.state.config.fees.flashLoanFeeSf.toString() === U64_MAX) {\n return new Decimal('0');\n }\n return new Fraction(this.state.config.fees.flashLoanFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the origination fee percentage of the reserve\n */\n getBorrowFee = (): Decimal => {\n return new Fraction(this.state.config.fees.borrowFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the fixed interest rate allocated to the host\n */\n getFixedHostInterestRate = (): Decimal => {\n return new Decimal(this.state.config.hostFixedInterestRateBps).div(10_000);\n };\n\n /**\n * Use getEstimatedTotalSupply() for the most accurate value\n * @returns the stale total liquidity supply of the reserve from the last refresh\n */\n getTotalSupply(): Decimal {\n return this.getLiquidityAvailableAmount()\n .add(this.getBorrowedAmount())\n .sub(this.getAccumulatedProtocolFees())\n .sub(this.getAccumulatedReferrerFees())\n .sub(this.getPendingReferrerFees());\n }\n\n /**\n * Calculates the total liquidity supply of the reserve\n */\n getEstimatedTotalSupply(slot: number, referralFeeBps: number): Decimal {\n const { totalSupply } = this.getEstimatedDebtAndSupply(slot, referralFeeBps);\n return totalSupply;\n }\n\n /**\n * Use getEstimatedCumulativeBorrowRate() for the most accurate value\n * @returns the stale cumulative borrow rate of the reserve from the last refresh\n */\n getCumulativeBorrowRate(): Decimal {\n let accSf = new BN(0);\n for (const value of this.state.liquidity.cumulativeBorrowRateBsf.value.reverse()) {\n accSf = accSf.add(value);\n accSf.shrn(64);\n }\n return new Fraction(accSf).toDecimal();\n }\n\n /**\n * @Returns estimated cumulative borrow rate of the reserve\n */\n getEstimatedCumulativeBorrowRate(currentSlot: number): Decimal {\n const currentBorrowRate = new Decimal(this.calculateBorrowAPR());\n const slotsElapsed = Math.max(currentSlot - this.state.lastUpdate.slot.toNumber(), 0);\n\n const compoundInterest = this.approximateCompoundedInterest(currentBorrowRate, slotsElapsed);\n\n const previousCumulativeBorrowRate = this.getCumulativeBorrowRate();\n\n return previousCumulativeBorrowRate.mul(compoundInterest);\n }\n\n /**\n * Use getEstimatedCollateralExchangeRate() for the most accurate value\n * @returns the stale exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getCollateralExchangeRate(): Decimal {\n const totalSupply = this.getTotalSupply();\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the estimated exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getEstimatedCollateralExchangeRate(slot: number, referralFeeBps: number): Decimal {\n const totalSupply = this.getEstimatedTotalSupply(slot, referralFeeBps);\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the total USD value of the existing collateral in the reserve\n */\n getDepositTvl = (): Decimal => {\n return new Decimal(this.getTotalSupply().toString()).mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n *\n * Get the total USD value of the borrowed assets from the reserve\n */\n getBorrowTvl = (): Decimal => {\n return this.getBorrowedAmount().mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n * @returns 10^mint_decimals\n */\n getMintFactor(): Decimal {\n return new Decimal(10).pow(this.state.liquidity.mintDecimals.toNumber());\n }\n\n /**\n * @Returns true if the total liquidity supply of the reserve is greater than the deposit limit\n */\n depositLimitCrossed(): boolean {\n return this.getTotalSupply().gt(new Decimal(this.state.config.depositLimit.toString()));\n }\n\n /**\n * @Returns true if the total borrowed amount of the reserve is greater than the borrow limit\n */\n borrowLimitCrossed(): boolean {\n return this.getBorrowedAmount().gt(new Decimal(this.state.config.borrowLimit.toString()));\n }\n\n /**\n *\n * @returns the max capacity of the daily deposit withdrawal cap\n */\n getDepositWithdrawalCapCapacity(): Decimal {\n return new Decimal(this.state.config.depositWithdrawalCap.configCapacity.toString());\n }\n\n /**\n *\n * @returns the current capacity of the daily deposit withdrawal cap\n */\n getDepositWithdrawalCapCurrent(slot: number): Decimal {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n if (slotsElapsed > SLOTS_PER_DAY) {\n return new Decimal(0);\n } else {\n return new Decimal(this.state.config.depositWithdrawalCap.currentTotal.toString());\n }\n }\n\n /**\n *\n * @returns the max capacity of the daily debt withdrawal cap\n */\n getDebtWithdrawalCapCapacity(): Decimal {\n return new Decimal(this.state.config.debtWithdrawalCap.configCapacity.toString());\n }\n\n /**\n *\n * @returns the borrow limit of the reserve outside the elevation group\n */\n getBorrowLimitOutsideElevationGroup(): Decimal {\n return new Decimal(this.state.config.borrowLimitOutsideElevationGroup.toString());\n }\n\n /**\n *\n * @returns the borrowed amount of the reserve outside the elevation group\n */\n getBorrowedAmountOutsideElevationGroup(): Decimal {\n return new Decimal(this.state.borrowedAmountOutsideElevationGroup.toString());\n }\n\n /**\n *\n * @returns the borrow limit against the collateral reserve in the elevation group\n */\n getBorrowLimitAgainstCollateralInElevationGroup(elevationGroupIndex: number): Decimal {\n return new Decimal(\n this.state.config.borrowLimitAgainstThisCollateralInElevationGroup[elevationGroupIndex].toString()\n );\n }\n\n /**\n *\n * @returns the borrowed amount against the collateral reserve in the elevation group\n */\n getBorrowedAmountAgainstCollateralInElevationGroup(elevationGroupIndex: number): Decimal {\n return new Decimal(this.state.borrowedAmountsAgainstThisReserveInElevationGroups[elevationGroupIndex].toString());\n }\n\n /**\n *\n * @returns the current capacity of the daily debt withdrawal cap\n */\n getDebtWithdrawalCapCurrent(slot: number): Decimal {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n if (slotsElapsed > SLOTS_PER_DAY) {\n return new Decimal(0);\n } else {\n return new Decimal(this.state.config.debtWithdrawalCap.currentTotal.toString());\n }\n }\n\n getBorrowFactor(): Decimal {\n return new Decimal(this.state.config.borrowFactorPct.toString()).div(100);\n }\n\n calculateSupplyAPR() {\n const currentUtilization = this.calculateUtilizationRatio();\n\n const borrowAPR = this.calculateBorrowAPR();\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n return currentUtilization * borrowAPR * protocolTakeRatePct;\n }\n\n getEstimatedDebtAndSupply(slot: number, referralFeeBps: number): { totalBorrow: Decimal; totalSupply: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let totalBorrow: Decimal;\n let totalSupply: Decimal;\n if (slotsElapsed === 0) {\n totalBorrow = this.getBorrowedAmount();\n totalSupply = this.getTotalSupply();\n } else {\n const { newDebt, newAccProtocolFees, pendingReferralFees } = this.compoundInterest(slotsElapsed, referralFeeBps);\n const newTotalSupply = this.getLiquidityAvailableAmount()\n .add(newDebt)\n .sub(newAccProtocolFees)\n .sub(this.getAccumulatedReferrerFees())\n .sub(pendingReferralFees);\n totalBorrow = newDebt;\n totalSupply = newTotalSupply;\n }\n return { totalBorrow, totalSupply };\n }\n\n getEstimatedAccumulatedProtocolFees(\n slot: number,\n referralFeeBps: number\n ): { accumulatedProtocolFees: Decimal; compoundedVariableProtocolFee: Decimal; compoundedFixedHostFee: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let accumulatedProtocolFees: Decimal;\n let compoundedVariableProtocolFee: Decimal;\n let compoundedFixedHostFee: Decimal;\n if (slotsElapsed === 0) {\n accumulatedProtocolFees = this.getAccumulatedProtocolFees();\n compoundedVariableProtocolFee = new Decimal(0);\n compoundedFixedHostFee = new Decimal(0);\n } else {\n const { newAccProtocolFees, variableProtocolFee, fixedHostFee } = this.compoundInterest(\n slotsElapsed,\n referralFeeBps\n );\n accumulatedProtocolFees = newAccProtocolFees;\n compoundedVariableProtocolFee = variableProtocolFee;\n compoundedFixedHostFee = fixedHostFee;\n }\n return { accumulatedProtocolFees, compoundedVariableProtocolFee, compoundedFixedHostFee };\n }\n\n calculateUtilizationRatio() {\n const totalBorrows = this.getBorrowedAmount();\n const totalSupply = this.getTotalSupply();\n if (totalSupply.eq(0)) {\n return 0;\n }\n return totalBorrows.dividedBy(totalSupply).toNumber();\n }\n\n calcSimulatedUtilizationRatio(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ): number {\n const { totalBorrow: previousTotalBorrowed, totalSupply: previousTotalSupply } = this.getEstimatedDebtAndSupply(\n slot,\n referralFeeBps\n );\n\n switch (action) {\n case 'deposit': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'withdraw': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n if (newTotalSupply.eq(0)) {\n return 0;\n } else {\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n }\n case 'borrow': {\n const newTotalBorrowed = previousTotalBorrowed.add(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'repay': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'depositAndBorrow': {\n const newTotalSupply = previousTotalSupply.add(amount);\n const newTotalBorrowed = previousTotalBorrowed.add(outflowAmount!);\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'repayAndWithdraw': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n const newTotalSupply = previousTotalSupply.sub(outflowAmount!);\n if (newTotalSupply.eq(0)) {\n return 0;\n }\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'mint': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'redeem': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n default:\n throw Error(`Invalid action type ${action} for simulatedUtilizationRatio`);\n }\n }\n\n getMaxBorrowAmountWithCollReserve(market: KaminoMarket, collReserve: KaminoReserve, slot: number): Decimal {\n const groupsColl = collReserve.state.config.elevationGroups;\n const groupsDebt = this.state.config.elevationGroups;\n const groups = market.state.elevationGroups;\n const commonElevationGroups = [...groupsColl].filter(\n (item) => groupsDebt.includes(item) && item !== 0 && groups[item - 1].debtReserve.equals(this.address)\n );\n\n let eModeGroup = 0;\n\n if (commonElevationGroups.length !== 0) {\n const eModeGroupWithMaxLtvAndDebtReserve = commonElevationGroups.reduce((prev, curr) => {\n const prevGroup = groups.find((group) => group.id === prev);\n const currGroup = groups.find((group) => group.id === curr);\n return prevGroup!.ltvPct > currGroup!.ltvPct ? prev : curr;\n });\n\n eModeGroup = groups.find((group) => group.id === eModeGroupWithMaxLtvAndDebtReserve)!.id;\n }\n\n const elevationGroupActivated = this.state.config.elevationGroups.includes(eModeGroup) && eModeGroup !== 0;\n\n const reserveAvailableAmount = this.getLiquidityAvailableAmount();\n const reserveBorrowCapRemained = this.stats.reserveBorrowLimit.sub(this.getBorrowedAmount());\n\n let maxBorrowAmount = Decimal.min(reserveAvailableAmount, reserveBorrowCapRemained);\n\n const debtWithdrawalCap = this.getDebtWithdrawalCapCapacity().sub(this.getDebtWithdrawalCapCurrent(slot));\n maxBorrowAmount = this.getDebtWithdrawalCapCapacity().gt(0)\n ? Decimal.min(maxBorrowAmount, debtWithdrawalCap)\n : maxBorrowAmount;\n\n let originationFeeRate = this.getBorrowFee();\n\n // Inclusive fee rate\n originationFeeRate = originationFeeRate.div(originationFeeRate.add(new Decimal(1)));\n const borrowFee = maxBorrowAmount.mul(originationFeeRate);\n\n maxBorrowAmount = maxBorrowAmount.sub(borrowFee);\n\n const utilizationRatioLimit = this.state.config.utilizationLimitBlockBorrowingAbove / 100;\n const currentUtilizationRatio = this.calculateUtilizationRatio();\n\n if (utilizationRatioLimit > 0 && currentUtilizationRatio > utilizationRatioLimit) {\n return new Decimal(0);\n } else if (utilizationRatioLimit > 0 && currentUtilizationRatio < utilizationRatioLimit) {\n const maxBorrowBasedOnUtilization = new Decimal(utilizationRatioLimit - currentUtilizationRatio).mul(\n this.getTotalSupply()\n );\n maxBorrowAmount = Decimal.min(maxBorrowAmount, maxBorrowBasedOnUtilization);\n }\n\n let borrowLimitDependentOnElevationGroup = new Decimal(U64_MAX);\n\n if (!elevationGroupActivated) {\n borrowLimitDependentOnElevationGroup = this.getBorrowLimitOutsideElevationGroup().sub(\n this.getBorrowedAmountOutsideElevationGroup()\n );\n } else {\n let maxDebtTakenAgainstCollaterals = new Decimal(U64_MAX);\n const maxDebtAllowedAgainstCollateral = this.getBorrowLimitAgainstCollateralInElevationGroup(eModeGroup - 1).sub(\n this.getBorrowedAmountAgainstCollateralInElevationGroup(eModeGroup - 1)\n );\n\n maxDebtTakenAgainstCollaterals = Decimal.max(\n new Decimal(0),\n Decimal.min(maxDebtAllowedAgainstCollateral, maxDebtTakenAgainstCollaterals)\n );\n borrowLimitDependentOnElevationGroup = maxDebtTakenAgainstCollaterals;\n }\n\n maxBorrowAmount = Decimal.min(maxBorrowAmount, borrowLimitDependentOnElevationGroup);\n\n return Decimal.max(new Decimal(0), maxBorrowAmount);\n }\n\n calcSimulatedBorrowAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(newUtilization, curve) * slotAdjustmentFactor;\n }\n\n calcSimulatedSupplyAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const simulatedBorrowAPR = this.calcSimulatedBorrowAPR(amount, action, slot, referralFeeBps, outflowAmount);\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n\n return newUtilization * simulatedBorrowAPR * protocolTakeRatePct;\n }\n\n slotAdjustmentFactor(): number {\n return 1000 / SLOTS_PER_SECOND / this.recentSlotDurationMs;\n }\n\n calculateBorrowAPR() {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const currentUtilization = this.calculateUtilizationRatio();\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(currentUtilization, curve) * slotAdjustmentFactor;\n }\n\n /**\n * @returns the mint of the reserve liquidity token\n */\n getLiquidityMint(): PublicKey {\n return this.state.liquidity.mintPubkey;\n }\n\n /**\n * @returns the token program of the reserve liquidity mint\n */\n getLiquidityTokenProgram(): PublicKey {\n return this.state.liquidity.tokenProgram;\n }\n\n /**\n * @returns the mint of the reserve collateral token , i.e. the cToken minted for depositing the liquidity token\n */\n getCTokenMint(): PublicKey {\n return this.state.collateral.mintPubkey;\n }\n\n setBuffer(buffer: AccountInfo<Buffer> | null) {\n this.buffer = buffer;\n }\n\n async load(tokenOraclePrice: TokenOracleData) {\n if (!this.buffer) {\n this.setBuffer(await this.connection.getAccountInfo(this.address, 'processed'));\n }\n\n if (!this.buffer) {\n throw Error(`Error requesting account info for ${this.symbol}`);\n }\n\n const parsedData = await Reserve.fetch(this.connection, this.address);\n if (!parsedData) {\n throw Error(`Unable to parse data of reserve ${this.symbol}`);\n }\n this.state = parsedData;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = this.formatReserveData(parsedData);\n }\n\n totalSupplyAPY() {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n const totalAPY = new Decimal(stats.supplyInterestAPY).toNumber();\n\n return {\n interestAPY: stats.supplyInterestAPY,\n totalAPY,\n };\n }\n\n totalBorrowAPY() {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n const totalAPY = new Decimal(stats.borrowInterestAPY).toNumber();\n\n return {\n interestAPY: stats.borrowInterestAPY,\n totalAPY,\n };\n }\n\n private formatReserveData(parsedData: ReserveFields): ReserveDataType {\n const mintTotalSupply = new Decimal(parsedData.collateral.mintTotalSupply.toString()).div(this.getMintFactor());\n let reserveStatus = ReserveStatus.Active;\n switch (parsedData.config.status) {\n case 0:\n reserveStatus = ReserveStatus.Active;\n break;\n case 1:\n reserveStatus = ReserveStatus.Obsolete;\n break;\n case 2:\n reserveStatus = ReserveStatus.Hidden;\n break;\n }\n return {\n // Reserve config\n\n status: reserveStatus,\n mintAddress: parsedData.liquidity.mintPubkey,\n borrowCurve: truncateBorrowCurve(parsedData.config.borrowRateCurve.points),\n loanToValuePct: parsedData.config.loanToValuePct / 100,\n maxLiquidationBonus: parsedData.config.maxLiquidationBonusBps / 10000,\n minLiquidationBonus: parsedData.config.minLiquidationBonusBps / 10000,\n liquidationThreshold: parsedData.config.liquidationThresholdPct / 100,\n protocolTakeRate: parsedData.config.protocolTakeRatePct / 100,\n reserveDepositLimit: new Decimal(parsedData.config.depositLimit.toString()),\n reserveBorrowLimit: new Decimal(parsedData.config.borrowLimit.toString()),\n\n // Reserve info\n symbol: parseTokenSymbol(parsedData.config.tokenInfo.name),\n decimals: this.state.liquidity.mintDecimals.toNumber(),\n supplyInterestAPY: calculateAPYFromAPR(this.calculateSupplyAPR()),\n borrowInterestAPY: calculateAPYFromAPR(this.calculateBorrowAPR()),\n accumulatedProtocolFees: this.getAccumulatedProtocolFees().div(this.getMintFactor()),\n mintTotalSupply,\n depositLimitCrossedSlot: parsedData.liquidity.depositLimitCrossedSlot.toNumber(),\n borrowLimitCrossedSlot: parsedData.liquidity.borrowLimitCrossedSlot.toNumber(),\n borrowFactor: parsedData.config.borrowFactorPct.toNumber(),\n };\n }\n\n /**\n * Compound current borrow rate over elapsed slots\n *\n * This also calculates protocol fees, which are taken for all obligations that have borrowed from current reserve.\n *\n * This also calculates referral fees, which are taken into pendingReferralFees.\n *\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L517\n *\n * @param slotsElapsed\n * @param referralFeeBps\n */\n private compoundInterest(\n slotsElapsed: number,\n referralFeeBps: number\n ): {\n newDebt: Decimal;\n netNewDebt: Decimal;\n variableProtocolFee: Decimal;\n fixedHostFee: Decimal;\n absoluteReferralFee: Decimal;\n maxReferralFees: Decimal;\n newAccProtocolFees: Decimal;\n pendingReferralFees: Decimal;\n } {\n const currentBorrowRate = this.calculateBorrowAPR();\n const protocolTakeRate = new Decimal(this.state.config.protocolTakeRatePct).div(100);\n const referralRate = new Decimal(referralFeeBps).div(10_000);\n const fixedHostInterestRate = this.getFixedHostInterestRate();\n\n const compoundedInterestRate = this.approximateCompoundedInterest(\n new Decimal(currentBorrowRate).plus(fixedHostInterestRate),\n slotsElapsed\n );\n const compoundedFixedRate = this.approximateCompoundedInterest(fixedHostInterestRate, slotsElapsed);\n\n const previousDebt = this.getBorrowedAmount();\n const newDebt = previousDebt.mul(compoundedInterestRate);\n const fixedHostFee = previousDebt.mul(compoundedFixedRate).sub(previousDebt);\n\n const netNewDebt = newDebt.sub(previousDebt).sub(fixedHostFee);\n\n const variableProtocolFee = netNewDebt.mul(protocolTakeRate);\n const absoluteReferralFee = protocolTakeRate.mul(referralRate);\n const maxReferralFees = netNewDebt.mul(absoluteReferralFee);\n\n const newAccProtocolFees = variableProtocolFee\n .add(fixedHostFee)\n .sub(maxReferralFees)\n .add(this.getAccumulatedProtocolFees());\n\n const pendingReferralFees = this.getPendingReferrerFees().add(maxReferralFees);\n\n return {\n newDebt,\n netNewDebt,\n variableProtocolFee,\n fixedHostFee,\n absoluteReferralFee,\n maxReferralFees,\n newAccProtocolFees,\n pendingReferralFees,\n };\n }\n\n /**\n * Approximation to match the smart contract calculation\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L1026\n * @param rate\n * @param elapsedSlots\n * @private\n */\n private approximateCompoundedInterest(rate: Decimal, elapsedSlots: number): Decimal {\n const base = rate.div(SLOTS_PER_YEAR);\n switch (elapsedSlots) {\n case 0:\n return new Decimal(1);\n case 1:\n return base.add(1);\n case 2:\n return base.add(1).mul(base.add(1));\n case 3:\n return base.add(1).mul(base.add(1)).mul(base.add(1));\n case 4:\n // eslint-disable-next-line no-case-declarations\n const pow2 = base.add(1).mul(base.add(1));\n return pow2.mul(pow2);\n }\n const exp = elapsedSlots;\n const expMinus1 = exp - 1;\n const expMinus2 = exp - 2;\n\n const basePow2 = base.mul(base);\n const basePow3 = basePow2.mul(base);\n\n const firstTerm = base.mul(exp);\n const secondTerm = basePow2.mul(exp).mul(expMinus1).div(2);\n const thirdTerm = basePow3.mul(exp).mul(expMinus1).mul(expMinus2).div(6);\n\n return new Decimal(1).add(firstTerm).add(secondTerm).add(thirdTerm);\n }\n}\n\nconst truncateBorrowCurve = (points: CurvePointFields[]): [number, number][] => {\n const curve: [number, number][] = [];\n for (const { utilizationRateBps, borrowRateBps } of points) {\n curve.push([utilizationRateBps / ONE_HUNDRED_PCT_IN_BPS, borrowRateBps / ONE_HUNDRED_PCT_IN_BPS]);\n\n if (utilizationRateBps === ONE_HUNDRED_PCT_IN_BPS) {\n break;\n }\n }\n return curve;\n};\n"]}
@@ -13,6 +13,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.getRepayWithCollIxns = exports.getRepayWithCollSwapInputs = exports.repayWithCollCalcs = void 0;
16
+ const spl_token_1 = require("@solana/spl-token");
16
17
  const classes_1 = require("../classes");
17
18
  const leverage_1 = require("../leverage");
18
19
  const utils_1 = require("../utils");
@@ -90,8 +91,13 @@ const getRepayWithCollIxns = (props) => __awaiter(void 0, void 0, void 0, functi
90
91
  console.log('Ops Calcs', (0, leverage_1.toJson)(calcs));
91
92
  // // 1. Create atas & budget txns
92
93
  const mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve.getCTokenMint()];
94
+ const mintsToCreateAtasTokenPrograms = [
95
+ collReserve === null || collReserve === void 0 ? void 0 : collReserve.getLiquidityTokenProgram(),
96
+ debtReserve === null || debtReserve === void 0 ? void 0 : debtReserve.getLiquidityTokenProgram(),
97
+ spl_token_1.TOKEN_PROGRAM_ID,
98
+ ];
93
99
  const budgetIxns = budgetAndPriorityFeeIxns || (0, utils_1.getComputeBudgetAndPriorityFeeIxns)(3000000);
94
- const { atas: [, debtTokenAta], createAtasIxns, closeAtasIxns, } = yield (0, utils_1.getAtasWithCreateIxnsIfMissing)(connection, owner, mintsToCreateAtas);
100
+ const { atas: [, debtTokenAta], createAtasIxns, closeAtasIxns, } = yield (0, utils_1.getAtasWithCreateIxnsIfMissing)(connection, owner, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);
95
101
  // 1. Flash borrow & repay the debt to repay amount needed
96
102
  const { flashBorrowIxn, flashRepayIxn } = (0, leverage_1.getFlashLoanInstructions)({
97
103
  borrowIxnIndex: budgetIxns.length + createAtasIxns.length,
@@ -1 +1 @@
1
- {"version":3,"file":"repay_with_collateral_operations.js","sourceRoot":"","sources":["../../src/lending_operations/repay_with_collateral_operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { KaminoAction, KaminoMarket, KaminoObligation, numberToLamportsDecimal } from '../classes';\nimport { SwapInputs, SwapIxnsProvider, getFlashLoanInstructions, toJson } from '../leverage';\nimport {\n PublicKeySet,\n U64_MAX,\n getAtasWithCreateIxnsIfMissing,\n getComputeBudgetAndPriorityFeeIxns,\n removeBudgetAndAtaIxns,\n} from '../utils';\nimport { PublicKey, TransactionInstruction } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\n\nexport const repayWithCollCalcs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n flashLoanFeePct: Decimal;\n}): {\n repayAmount: Decimal;\n collToSwapIn: Decimal;\n swapDebtExpectedOut: Decimal;\n} => {\n // Initialize local variables from the props object\n const { repayAmount, priceDebtToColl, slippagePct, flashLoanFeePct } = props;\n\n const slippage = slippagePct.div('100');\n const flashLoanFee = flashLoanFeePct.div('100');\n\n const swapDebtExpectedOut = repayAmount.mul(new Decimal(1.0).add(flashLoanFee));\n const collToSwapIn = swapDebtExpectedOut.mul(new Decimal(1.0).add(slippage)).mul(priceDebtToColl);\n\n return {\n repayAmount,\n collToSwapIn,\n swapDebtExpectedOut,\n };\n};\n\nexport type InitialInputs = {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n currentSlot: number;\n};\n\nexport const getRepayWithCollSwapInputs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n kaminoMarket: KaminoMarket;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n obligation: KaminoObligation;\n currentSlot: number;\n}): {\n swapInputs: SwapInputs;\n initialInputs: InitialInputs;\n} => {\n const {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n kaminoMarket,\n debtTokenMint,\n collTokenMint,\n obligation,\n currentSlot,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const flashLoanFeePct = debtReserve?.getFlashLoanFee().ceil() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n // add 0.1% to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not repaying enough\n const repayAmountIrAdjusted = repayAmount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const repayCalcs = repayWithCollCalcs({\n repayAmount: repayAmountIrAdjusted,\n priceDebtToColl,\n slippagePct,\n flashLoanFeePct: flashLoanFeePct,\n });\n\n return {\n swapInputs: {\n inputAmountLamports: numberToLamportsDecimal(repayCalcs.collToSwapIn, collReserve!.stats.decimals)\n .ceil()\n .toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n },\n initialInputs: {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n currentSlot,\n },\n };\n};\n\nexport const getRepayWithCollIxns = async (props: {\n kaminoMarket: KaminoMarket;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n amount: Decimal;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n owner: PublicKey;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n isClosingPosition: boolean;\n obligation: KaminoObligation;\n referrer: PublicKey;\n swapper: SwapIxnsProvider;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n}): Promise<{\n ixns: TransactionInstruction[];\n lookupTablesAddresses: PublicKey[];\n swapInputs: SwapInputs;\n totalKlendAccounts: number;\n initialInputs: InitialInputs;\n}> => {\n const {\n kaminoMarket,\n budgetAndPriorityFeeIxns,\n amount,\n debtTokenMint,\n collTokenMint,\n owner,\n priceDebtToColl,\n slippagePct,\n isClosingPosition,\n obligation,\n referrer,\n swapper,\n currentSlot,\n getTotalKlendAccountsOnly,\n } = props;\n\n const connection = kaminoMarket.getConnection();\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n // const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);\n const flashLoanFeePct = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n // add 0.1% to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not reapying enough\n const repayAmount = amount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const calcs = repayWithCollCalcs({\n repayAmount,\n priceDebtToColl,\n slippagePct,\n flashLoanFeePct,\n });\n\n console.log('Ops Calcs', toJson(calcs));\n\n // // 1. Create atas & budget txns\n const mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n const {\n atas: [, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, owner, mintsToCreateAtas);\n\n // 1. Flash borrow & repay the debt to repay amount needed\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length,\n walletPublicKey: owner,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: debtReserve!,\n amountLamports: numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor(),\n destinationAta: debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n // 2. Repay using the flash borrowed funds & withdraw collateral to swap and pay the flash loan\n const repayAndWithdrawAction = await KaminoAction.buildRepayAndWithdrawTxns(\n kaminoMarket,\n isClosingPosition ? U64_MAX : numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor().toString(),\n new PublicKey(debtTokenMint),\n isClosingPosition\n ? U64_MAX\n : numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toString(),\n new PublicKey(collTokenMint),\n owner,\n currentSlot,\n obligation,\n 0,\n false,\n undefined,\n undefined,\n isClosingPosition,\n referrer\n );\n\n const ixns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n const uniqueAccounts = new PublicKeySet<PublicKey>([]);\n ixns.forEach((ixn) => {\n ixn.keys.forEach((key) => {\n uniqueAccounts.add(key.pubkey);\n });\n });\n const totalKlendAccounts = uniqueAccounts.toArray().length;\n\n // return early to avoid extra swapper calls\n if (getTotalKlendAccountsOnly) {\n return {\n ixns: [],\n lookupTablesAddresses: [],\n swapInputs: { inputAmountLamports: 0, inputMint: PublicKey.default, outputMint: PublicKey.default },\n totalKlendAccounts: totalKlendAccounts,\n initialInputs: {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n currentSlot,\n },\n };\n }\n\n console.log(\n 'Expected to swap in',\n calcs.collToSwapIn.toString(),\n 'coll for',\n calcs.swapDebtExpectedOut.toString(),\n 'debt'\n );\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n };\n\n // 3. Swap collateral to debt to repay flash loan\n const [swapIxns, lookupTablesAddresses] = await swapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct.toNumber()\n );\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n return {\n ixns: [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...swapInstructions,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ],\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts,\n initialInputs: {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n currentSlot,\n },\n };\n};\n"]}
1
+ {"version":3,"file":"repay_with_collateral_operations.js","sourceRoot":"","sources":["../../src/lending_operations/repay_with_collateral_operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport { KaminoAction, KaminoMarket, KaminoObligation, numberToLamportsDecimal } from '../classes';\nimport { SwapInputs, SwapIxnsProvider, getFlashLoanInstructions, toJson } from '../leverage';\nimport {\n PublicKeySet,\n U64_MAX,\n getAtasWithCreateIxnsIfMissing,\n getComputeBudgetAndPriorityFeeIxns,\n removeBudgetAndAtaIxns,\n} from '../utils';\nimport { PublicKey, TransactionInstruction } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\n\nexport const repayWithCollCalcs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n flashLoanFeePct: Decimal;\n}): {\n repayAmount: Decimal;\n collToSwapIn: Decimal;\n swapDebtExpectedOut: Decimal;\n} => {\n // Initialize local variables from the props object\n const { repayAmount, priceDebtToColl, slippagePct, flashLoanFeePct } = props;\n\n const slippage = slippagePct.div('100');\n const flashLoanFee = flashLoanFeePct.div('100');\n\n const swapDebtExpectedOut = repayAmount.mul(new Decimal(1.0).add(flashLoanFee));\n const collToSwapIn = swapDebtExpectedOut.mul(new Decimal(1.0).add(slippage)).mul(priceDebtToColl);\n\n return {\n repayAmount,\n collToSwapIn,\n swapDebtExpectedOut,\n };\n};\n\nexport type InitialInputs = {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n currentSlot: number;\n};\n\nexport const getRepayWithCollSwapInputs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n kaminoMarket: KaminoMarket;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n obligation: KaminoObligation;\n currentSlot: number;\n}): {\n swapInputs: SwapInputs;\n initialInputs: InitialInputs;\n} => {\n const {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n kaminoMarket,\n debtTokenMint,\n collTokenMint,\n obligation,\n currentSlot,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const flashLoanFeePct = debtReserve?.getFlashLoanFee().ceil() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n // add 0.1% to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not repaying enough\n const repayAmountIrAdjusted = repayAmount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const repayCalcs = repayWithCollCalcs({\n repayAmount: repayAmountIrAdjusted,\n priceDebtToColl,\n slippagePct,\n flashLoanFeePct: flashLoanFeePct,\n });\n\n return {\n swapInputs: {\n inputAmountLamports: numberToLamportsDecimal(repayCalcs.collToSwapIn, collReserve!.stats.decimals)\n .ceil()\n .toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n },\n initialInputs: {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n currentSlot,\n },\n };\n};\n\nexport const getRepayWithCollIxns = async (props: {\n kaminoMarket: KaminoMarket;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n amount: Decimal;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n owner: PublicKey;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n isClosingPosition: boolean;\n obligation: KaminoObligation;\n referrer: PublicKey;\n swapper: SwapIxnsProvider;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n}): Promise<{\n ixns: TransactionInstruction[];\n lookupTablesAddresses: PublicKey[];\n swapInputs: SwapInputs;\n totalKlendAccounts: number;\n initialInputs: InitialInputs;\n}> => {\n const {\n kaminoMarket,\n budgetAndPriorityFeeIxns,\n amount,\n debtTokenMint,\n collTokenMint,\n owner,\n priceDebtToColl,\n slippagePct,\n isClosingPosition,\n obligation,\n referrer,\n swapper,\n currentSlot,\n getTotalKlendAccountsOnly,\n } = props;\n\n const connection = kaminoMarket.getConnection();\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n // const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);\n const flashLoanFeePct = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n // add 0.1% to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not reapying enough\n const repayAmount = amount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const calcs = repayWithCollCalcs({\n repayAmount,\n priceDebtToColl,\n slippagePct,\n flashLoanFeePct,\n });\n\n console.log('Ops Calcs', toJson(calcs));\n\n // // 1. Create atas & budget txns\n const mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n const mintsToCreateAtasTokenPrograms = [\n collReserve?.getLiquidityTokenProgram()!,\n debtReserve?.getLiquidityTokenProgram()!,\n TOKEN_PROGRAM_ID,\n ];\n\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n const {\n atas: [, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, owner, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);\n\n // 1. Flash borrow & repay the debt to repay amount needed\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length,\n walletPublicKey: owner,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: debtReserve!,\n amountLamports: numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor(),\n destinationAta: debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n // 2. Repay using the flash borrowed funds & withdraw collateral to swap and pay the flash loan\n const repayAndWithdrawAction = await KaminoAction.buildRepayAndWithdrawTxns(\n kaminoMarket,\n isClosingPosition ? U64_MAX : numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor().toString(),\n new PublicKey(debtTokenMint),\n isClosingPosition\n ? U64_MAX\n : numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toString(),\n new PublicKey(collTokenMint),\n owner,\n currentSlot,\n obligation,\n 0,\n false,\n undefined,\n undefined,\n isClosingPosition,\n referrer\n );\n\n const ixns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n const uniqueAccounts = new PublicKeySet<PublicKey>([]);\n ixns.forEach((ixn) => {\n ixn.keys.forEach((key) => {\n uniqueAccounts.add(key.pubkey);\n });\n });\n const totalKlendAccounts = uniqueAccounts.toArray().length;\n\n // return early to avoid extra swapper calls\n if (getTotalKlendAccountsOnly) {\n return {\n ixns: [],\n lookupTablesAddresses: [],\n swapInputs: { inputAmountLamports: 0, inputMint: PublicKey.default, outputMint: PublicKey.default },\n totalKlendAccounts: totalKlendAccounts,\n initialInputs: {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n currentSlot,\n },\n };\n }\n\n console.log(\n 'Expected to swap in',\n calcs.collToSwapIn.toString(),\n 'coll for',\n calcs.swapDebtExpectedOut.toString(),\n 'debt'\n );\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n };\n\n // 3. Swap collateral to debt to repay flash loan\n const [swapIxns, lookupTablesAddresses] = await swapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct.toNumber()\n );\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n return {\n ixns: [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...swapInstructions,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ],\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts,\n initialInputs: {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n currentSlot,\n },\n };\n};\n"]}
@@ -24,7 +24,6 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.getRepayFlashLoanInstruction = exports.getBorrowFlashLoanInstruction = exports.getFlashLoanInstructions = exports.SOL_MINTS = void 0;
27
- const spl_token_1 = require("@solana/spl-token");
28
27
  const web3_js_1 = require("@solana/web3.js");
29
28
  const lib_1 = require("../lib");
30
29
  const anchor = __importStar(require("@coral-xyz/anchor"));
@@ -75,7 +74,7 @@ const getBorrowFlashLoanInstruction = ({ walletPublicKey, lendingMarketAuthority
75
74
  referrerTokenState: referrerTokenState,
76
75
  reserveLiquidityFeeReceiver: reserve.state.liquidity.feeVault,
77
76
  sysvarInfo: web3_js_1.SYSVAR_INSTRUCTIONS_PUBKEY,
78
- tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
77
+ tokenProgram: reserve.getLiquidityTokenProgram(),
79
78
  };
80
79
  return (0, lib_1.flashBorrowReserveLiquidity)(args, accounts, programId);
81
80
  };
@@ -97,7 +96,7 @@ const getRepayFlashLoanInstruction = ({ borrowIxnIndex, walletPublicKey, lending
97
96
  referrerTokenState: referrerTokenState,
98
97
  reserveLiquidityFeeReceiver: reserve.state.liquidity.feeVault,
99
98
  sysvarInfo: web3_js_1.SYSVAR_INSTRUCTIONS_PUBKEY,
100
- tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
99
+ tokenProgram: reserve.getLiquidityTokenProgram(),
101
100
  };
102
101
  return (0, lib_1.flashRepayReserveLiquidity)(args, accounts, programId);
103
102
  };
@@ -1 +1 @@
1
- {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/leverage/instructions.ts"],"names":[],"mappings":"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","sourcesContent":["import { TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport { PublicKey, SYSVAR_INSTRUCTIONS_PUBKEY } from '@solana/web3.js';\nimport { KaminoReserve } from '../classes';\nimport {\n FlashBorrowReserveLiquidityArgs,\n FlashBorrowReserveLiquidityAccounts,\n flashBorrowReserveLiquidity,\n FlashRepayReserveLiquidityArgs,\n FlashRepayReserveLiquidityAccounts,\n flashRepayReserveLiquidity,\n} from '../lib';\nimport Decimal from 'decimal.js';\nimport * as anchor from '@coral-xyz/anchor';\n\nexport const SOL_MINTS: Array<PublicKey> = [\n new PublicKey('So11111111111111111111111111111111111111111'),\n new PublicKey('So11111111111111111111111111111111111111112'),\n];\n\nexport const getFlashLoanInstructions = (args: {\n borrowIxnIndex: number;\n walletPublicKey: PublicKey;\n lendingMarketAuthority: PublicKey;\n lendingMarketAddress: PublicKey;\n reserve: KaminoReserve;\n amountLamports: Decimal;\n destinationAta: PublicKey;\n referrerAccount: PublicKey;\n referrerTokenState: PublicKey;\n programId: PublicKey;\n}) => {\n const flashBorrowIxn = getBorrowFlashLoanInstruction({\n walletPublicKey: args.walletPublicKey,\n lendingMarketAuthority: args.lendingMarketAuthority,\n lendingMarketAddress: args.lendingMarketAddress,\n reserve: args.reserve,\n amountLamports: args.amountLamports,\n destinationAta: args.destinationAta,\n referrerAccount: args.referrerAccount,\n referrerTokenState: args.referrerTokenState,\n programId: args.programId,\n });\n const flashRepayIxn = getRepayFlashLoanInstruction({\n borrowIxnIndex: args.borrowIxnIndex,\n walletPublicKey: args.walletPublicKey,\n lendingMarketAuthority: args.lendingMarketAuthority,\n lendingMarketAddress: args.lendingMarketAddress,\n reserve: args.reserve,\n amountLamports: args.amountLamports,\n userSourceLiquidity: args.destinationAta,\n referrerAccount: args.referrerAccount,\n referrerTokenState: args.referrerTokenState,\n programId: args.programId,\n });\n\n return { flashBorrowIxn, flashRepayIxn };\n};\n\nexport const getBorrowFlashLoanInstruction = ({\n walletPublicKey,\n lendingMarketAuthority,\n lendingMarketAddress,\n reserve,\n amountLamports,\n destinationAta,\n referrerAccount,\n referrerTokenState,\n programId,\n}: {\n walletPublicKey: PublicKey;\n lendingMarketAuthority: PublicKey;\n lendingMarketAddress: PublicKey;\n reserve: KaminoReserve;\n amountLamports: Decimal;\n destinationAta: PublicKey;\n referrerAccount: PublicKey;\n referrerTokenState: PublicKey;\n programId: PublicKey;\n}) => {\n const args: FlashBorrowReserveLiquidityArgs = {\n liquidityAmount: new anchor.BN(amountLamports.floor().toString()),\n };\n const accounts: FlashBorrowReserveLiquidityAccounts = {\n userTransferAuthority: walletPublicKey,\n lendingMarketAuthority: lendingMarketAuthority,\n lendingMarket: lendingMarketAddress,\n reserve: reserve.address,\n reserveLiquidityMint: reserve.getLiquidityMint(),\n reserveSourceLiquidity: reserve.state.liquidity.supplyVault,\n userDestinationLiquidity: destinationAta,\n referrerAccount: referrerAccount,\n referrerTokenState: referrerTokenState,\n reserveLiquidityFeeReceiver: reserve.state.liquidity.feeVault,\n sysvarInfo: SYSVAR_INSTRUCTIONS_PUBKEY,\n tokenProgram: TOKEN_PROGRAM_ID,\n };\n\n return flashBorrowReserveLiquidity(args, accounts, programId);\n};\n\nexport const getRepayFlashLoanInstruction = ({\n borrowIxnIndex,\n walletPublicKey,\n lendingMarketAuthority,\n lendingMarketAddress,\n reserve,\n amountLamports,\n userSourceLiquidity,\n referrerAccount,\n referrerTokenState,\n programId,\n}: {\n borrowIxnIndex: number;\n walletPublicKey: PublicKey;\n lendingMarketAuthority: PublicKey;\n lendingMarketAddress: PublicKey;\n reserve: KaminoReserve;\n amountLamports: Decimal;\n userSourceLiquidity: PublicKey;\n referrerAccount: PublicKey;\n referrerTokenState: PublicKey;\n programId: PublicKey;\n}) => {\n const args: FlashRepayReserveLiquidityArgs = {\n borrowInstructionIndex: borrowIxnIndex,\n liquidityAmount: new anchor.BN(amountLamports.floor().toString()),\n };\n\n const accounts: FlashRepayReserveLiquidityAccounts = {\n userTransferAuthority: walletPublicKey,\n lendingMarketAuthority: lendingMarketAuthority,\n lendingMarket: lendingMarketAddress,\n reserve: reserve.address,\n reserveLiquidityMint: reserve.getLiquidityMint(),\n reserveDestinationLiquidity: reserve.state.liquidity.supplyVault,\n userSourceLiquidity: userSourceLiquidity,\n referrerAccount: referrerAccount,\n referrerTokenState: referrerTokenState,\n reserveLiquidityFeeReceiver: reserve.state.liquidity.feeVault,\n sysvarInfo: SYSVAR_INSTRUCTIONS_PUBKEY,\n tokenProgram: TOKEN_PROGRAM_ID,\n };\n\n return flashRepayReserveLiquidity(args, accounts, programId);\n};\n"]}
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/leverage/instructions.ts"],"names":[],"mappings":"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","sourcesContent":["import { PublicKey, SYSVAR_INSTRUCTIONS_PUBKEY } from '@solana/web3.js';\nimport { KaminoReserve } from '../classes';\nimport {\n FlashBorrowReserveLiquidityArgs,\n FlashBorrowReserveLiquidityAccounts,\n flashBorrowReserveLiquidity,\n FlashRepayReserveLiquidityArgs,\n FlashRepayReserveLiquidityAccounts,\n flashRepayReserveLiquidity,\n} from '../lib';\nimport Decimal from 'decimal.js';\nimport * as anchor from '@coral-xyz/anchor';\n\nexport const SOL_MINTS: Array<PublicKey> = [\n new PublicKey('So11111111111111111111111111111111111111111'),\n new PublicKey('So11111111111111111111111111111111111111112'),\n];\n\nexport const getFlashLoanInstructions = (args: {\n borrowIxnIndex: number;\n walletPublicKey: PublicKey;\n lendingMarketAuthority: PublicKey;\n lendingMarketAddress: PublicKey;\n reserve: KaminoReserve;\n amountLamports: Decimal;\n destinationAta: PublicKey;\n referrerAccount: PublicKey;\n referrerTokenState: PublicKey;\n programId: PublicKey;\n}) => {\n const flashBorrowIxn = getBorrowFlashLoanInstruction({\n walletPublicKey: args.walletPublicKey,\n lendingMarketAuthority: args.lendingMarketAuthority,\n lendingMarketAddress: args.lendingMarketAddress,\n reserve: args.reserve,\n amountLamports: args.amountLamports,\n destinationAta: args.destinationAta,\n referrerAccount: args.referrerAccount,\n referrerTokenState: args.referrerTokenState,\n programId: args.programId,\n });\n const flashRepayIxn = getRepayFlashLoanInstruction({\n borrowIxnIndex: args.borrowIxnIndex,\n walletPublicKey: args.walletPublicKey,\n lendingMarketAuthority: args.lendingMarketAuthority,\n lendingMarketAddress: args.lendingMarketAddress,\n reserve: args.reserve,\n amountLamports: args.amountLamports,\n userSourceLiquidity: args.destinationAta,\n referrerAccount: args.referrerAccount,\n referrerTokenState: args.referrerTokenState,\n programId: args.programId,\n });\n\n return { flashBorrowIxn, flashRepayIxn };\n};\n\nexport const getBorrowFlashLoanInstruction = ({\n walletPublicKey,\n lendingMarketAuthority,\n lendingMarketAddress,\n reserve,\n amountLamports,\n destinationAta,\n referrerAccount,\n referrerTokenState,\n programId,\n}: {\n walletPublicKey: PublicKey;\n lendingMarketAuthority: PublicKey;\n lendingMarketAddress: PublicKey;\n reserve: KaminoReserve;\n amountLamports: Decimal;\n destinationAta: PublicKey;\n referrerAccount: PublicKey;\n referrerTokenState: PublicKey;\n programId: PublicKey;\n}) => {\n const args: FlashBorrowReserveLiquidityArgs = {\n liquidityAmount: new anchor.BN(amountLamports.floor().toString()),\n };\n const accounts: FlashBorrowReserveLiquidityAccounts = {\n userTransferAuthority: walletPublicKey,\n lendingMarketAuthority: lendingMarketAuthority,\n lendingMarket: lendingMarketAddress,\n reserve: reserve.address,\n reserveLiquidityMint: reserve.getLiquidityMint(),\n reserveSourceLiquidity: reserve.state.liquidity.supplyVault,\n userDestinationLiquidity: destinationAta,\n referrerAccount: referrerAccount,\n referrerTokenState: referrerTokenState,\n reserveLiquidityFeeReceiver: reserve.state.liquidity.feeVault,\n sysvarInfo: SYSVAR_INSTRUCTIONS_PUBKEY,\n tokenProgram: reserve.getLiquidityTokenProgram(),\n };\n\n return flashBorrowReserveLiquidity(args, accounts, programId);\n};\n\nexport const getRepayFlashLoanInstruction = ({\n borrowIxnIndex,\n walletPublicKey,\n lendingMarketAuthority,\n lendingMarketAddress,\n reserve,\n amountLamports,\n userSourceLiquidity,\n referrerAccount,\n referrerTokenState,\n programId,\n}: {\n borrowIxnIndex: number;\n walletPublicKey: PublicKey;\n lendingMarketAuthority: PublicKey;\n lendingMarketAddress: PublicKey;\n reserve: KaminoReserve;\n amountLamports: Decimal;\n userSourceLiquidity: PublicKey;\n referrerAccount: PublicKey;\n referrerTokenState: PublicKey;\n programId: PublicKey;\n}) => {\n const args: FlashRepayReserveLiquidityArgs = {\n borrowInstructionIndex: borrowIxnIndex,\n liquidityAmount: new anchor.BN(amountLamports.floor().toString()),\n };\n\n const accounts: FlashRepayReserveLiquidityAccounts = {\n userTransferAuthority: walletPublicKey,\n lendingMarketAuthority: lendingMarketAuthority,\n lendingMarket: lendingMarketAddress,\n reserve: reserve.address,\n reserveLiquidityMint: reserve.getLiquidityMint(),\n reserveDestinationLiquidity: reserve.state.liquidity.supplyVault,\n userSourceLiquidity: userSourceLiquidity,\n referrerAccount: referrerAccount,\n referrerTokenState: referrerTokenState,\n reserveLiquidityFeeReceiver: reserve.state.liquidity.feeVault,\n sysvarInfo: SYSVAR_INSTRUCTIONS_PUBKEY,\n tokenProgram: reserve.getLiquidityTokenProgram(),\n };\n\n return flashRepayReserveLiquidity(args, accounts, programId);\n};\n"]}
@@ -154,7 +154,7 @@ const getDepositWithLeverageIxns = (props) => __awaiter(void 0, void 0, void 0,
154
154
  const collReserve = kaminoMarket.getReserveByMint(collTokenMint);
155
155
  const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
156
156
  const solTokenReserve = kaminoMarket.getReserveByMint(utils_1.WRAPPED_SOL_MINT);
157
- const flashLoanFee = (collReserve === null || collReserve === void 0 ? void 0 : collReserve.getFlashLoanFee()) || new decimal_js_1.default(0);
157
+ const flashLoanFee = collReserve.getFlashLoanFee() || new decimal_js_1.default(0);
158
158
  const selectedTokenIsCollToken = selectedTokenMint.equals(collTokenMint);
159
159
  const depositTokenIsSol = !solTokenReserve ? false : selectedTokenMint.equals(solTokenReserve.getLiquidityMint());
160
160
  const collIsKtoken = yield isKtoken(collTokenMint);
@@ -196,17 +196,36 @@ const getDepositWithLeverageIxns = (props) => __awaiter(void 0, void 0, void 0,
196
196
  }));
197
197
  // // 1. Create atas & budget txns
198
198
  let mintsToCreateAtas = [];
199
+ let mintsToCreateAtasTokenPrograms = [];
199
200
  if (collIsKtoken) {
200
201
  const secondTokenAta = strategy.strategy.tokenAMint.equals(debtTokenMint)
201
202
  ? strategy.strategy.tokenBMint
202
203
  : strategy.strategy.tokenAMint;
204
+ const secondTokenTokenProgarm = (strategy === null || strategy === void 0 ? void 0 : strategy.strategy.tokenAMint.equals(debtTokenMint))
205
+ ? strategy.strategy.tokenBTokenProgram.equals(web3_js_1.PublicKey.default)
206
+ ? spl_token_1.TOKEN_PROGRAM_ID
207
+ : strategy.strategy.tokenBTokenProgram
208
+ : strategy.strategy.tokenATokenProgram.equals(web3_js_1.PublicKey.default)
209
+ ? spl_token_1.TOKEN_PROGRAM_ID
210
+ : strategy.strategy.tokenATokenProgram;
203
211
  mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve.getCTokenMint(), secondTokenAta];
212
+ mintsToCreateAtasTokenPrograms = [
213
+ collReserve.getLiquidityTokenProgram(),
214
+ debtReserve.getLiquidityTokenProgram(),
215
+ spl_token_1.TOKEN_PROGRAM_ID,
216
+ secondTokenTokenProgarm,
217
+ ];
204
218
  }
205
219
  else {
206
220
  mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve.getCTokenMint()];
221
+ mintsToCreateAtasTokenPrograms = [
222
+ collReserve.getLiquidityTokenProgram(),
223
+ debtReserve.getLiquidityTokenProgram(),
224
+ spl_token_1.TOKEN_PROGRAM_ID,
225
+ ];
207
226
  }
208
227
  const budgetIxns = budgetAndPriorityFeeIxns || (0, utils_1.getComputeBudgetAndPriorityFeeIxns)(3000000);
209
- const { atas: [collTokenAta, debtTokenAta], createAtasIxns, closeAtasIxns, } = yield (0, utils_1.getAtasWithCreateIxnsIfMissing)(connection, user, mintsToCreateAtas);
228
+ const { atas: [collTokenAta, debtTokenAta], createAtasIxns, closeAtasIxns, } = yield (0, utils_1.getAtasWithCreateIxnsIfMissing)(connection, user, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);
210
229
  // TODO: this needs to work the other way around also
211
230
  // TODO: marius test this with shorting leverage and with leverage looping
212
231
  const fillWsolAtaIxns = [];
@@ -465,16 +484,35 @@ const getWithdrawWithLeverageIxns = (props) => __awaiter(void 0, void 0, void 0,
465
484
  console.log('Expecting to swap', collTokenSwapIn.toString(), 'coll for', debtTokenExpectedSwapOut.toString(), 'debt');
466
485
  // 1. Create atas & budget txns & user metadata
467
486
  let mintsToCreateAtas = [];
487
+ let mintsToCreateAtasTokenPrograms = [];
468
488
  if (collIsKtoken) {
469
- const secondTokenAta = (strategy === null || strategy === void 0 ? void 0 : strategy.strategy.tokenAMint.equals(debtTokenMint))
470
- ? strategy === null || strategy === void 0 ? void 0 : strategy.strategy.tokenBMint
471
- : strategy === null || strategy === void 0 ? void 0 : strategy.strategy.tokenAMint;
489
+ const secondTokenAta = strategy.strategy.tokenAMint.equals(debtTokenMint)
490
+ ? strategy.strategy.tokenBMint
491
+ : strategy.strategy.tokenAMint;
492
+ const secondTokenTokenProgarm = (strategy === null || strategy === void 0 ? void 0 : strategy.strategy.tokenAMint.equals(debtTokenMint))
493
+ ? strategy.strategy.tokenBTokenProgram.equals(web3_js_1.PublicKey.default)
494
+ ? spl_token_1.TOKEN_PROGRAM_ID
495
+ : strategy.strategy.tokenBTokenProgram
496
+ : strategy.strategy.tokenATokenProgram.equals(web3_js_1.PublicKey.default)
497
+ ? spl_token_1.TOKEN_PROGRAM_ID
498
+ : strategy.strategy.tokenATokenProgram;
472
499
  mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve.getCTokenMint(), secondTokenAta];
500
+ mintsToCreateAtasTokenPrograms = [
501
+ collReserve.getLiquidityTokenProgram(),
502
+ debtReserve.getLiquidityTokenProgram(),
503
+ spl_token_1.TOKEN_PROGRAM_ID,
504
+ secondTokenTokenProgarm,
505
+ ];
473
506
  }
474
507
  else {
475
508
  mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve.getCTokenMint()];
509
+ mintsToCreateAtasTokenPrograms = [
510
+ collReserve.getLiquidityTokenProgram(),
511
+ debtReserve.getLiquidityTokenProgram(),
512
+ spl_token_1.TOKEN_PROGRAM_ID,
513
+ ];
476
514
  }
477
- const { atas: [, debtTokenAta], createAtasIxns, closeAtasIxns, } = yield (0, utils_1.getAtasWithCreateIxnsIfMissing)(connection, user, mintsToCreateAtas);
515
+ const { atas: [, debtTokenAta], createAtasIxns, closeAtasIxns, } = yield (0, utils_1.getAtasWithCreateIxnsIfMissing)(connection, user, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);
478
516
  const closeWsolAtaIxns = [];
479
517
  if (depositTokenIsSol || debtTokenMint.equals(utils_1.WRAPPED_SOL_MINT)) {
480
518
  const wsolAta = (0, utils_1.getAssociatedTokenAddress)(utils_1.WRAPPED_SOL_MINT, user, false);
@@ -644,10 +682,10 @@ const getAdjustLeverageIxns = (props) => __awaiter(void 0, void 0, void 0, funct
644
682
  const isDepositViaLeverage = targetLeverage.gte(new decimal_js_1.default(currentLeverage));
645
683
  let flashLoanFee = new decimal_js_1.default(0);
646
684
  if (isDepositViaLeverage) {
647
- flashLoanFee = (collReserve === null || collReserve === void 0 ? void 0 : collReserve.getFlashLoanFee()) || new decimal_js_1.default(0);
685
+ flashLoanFee = collReserve.getFlashLoanFee() || new decimal_js_1.default(0);
648
686
  }
649
687
  else {
650
- flashLoanFee = (debtReserve === null || debtReserve === void 0 ? void 0 : debtReserve.getFlashLoanFee()) || new decimal_js_1.default(0);
688
+ flashLoanFee = debtReserve.getFlashLoanFee() || new decimal_js_1.default(0);
651
689
  }
652
690
  const { adjustDepositPosition, adjustBorrowPosition } = (0, calcs_1.calcAdjustAmounts)({
653
691
  currentDepositPosition: deposited,
@@ -736,7 +774,7 @@ const getIncreaseLeverageIxns = (props) => __awaiter(void 0, void 0, void 0, fun
736
774
  const collReserve = kaminoMarket.getReserveByMint(collTokenMint);
737
775
  const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
738
776
  const collIsKtoken = yield isKtoken(collTokenMint);
739
- const flashLoanFee = (collReserve === null || collReserve === void 0 ? void 0 : collReserve.getFlashLoanFee()) || new decimal_js_1.default(0);
777
+ const flashLoanFee = collReserve.getFlashLoanFee() || new decimal_js_1.default(0);
740
778
  if (!priceDebtToColl || !priceCollToDebt) {
741
779
  throw new Error('Price is not loaded. Please, reload the page and try again');
742
780
  }
@@ -745,16 +783,35 @@ const getIncreaseLeverageIxns = (props) => __awaiter(void 0, void 0, void 0, fun
745
783
  // 1. Create atas & budget txns
746
784
  const budgetIxns = budgetAndPriorityFeeIxns || (0, utils_1.getComputeBudgetAndPriorityFeeIxns)(3000000);
747
785
  let mintsToCreateAtas = [];
786
+ let mintsToCreateAtasTokenPrograms = [];
748
787
  if (collIsKtoken) {
749
- const secondTokenAta = (strategy === null || strategy === void 0 ? void 0 : strategy.strategy.tokenAMint.equals(debtTokenMint))
750
- ? strategy === null || strategy === void 0 ? void 0 : strategy.strategy.tokenBMint
751
- : strategy === null || strategy === void 0 ? void 0 : strategy.strategy.tokenAMint;
788
+ const secondTokenAta = strategy.strategy.tokenAMint.equals(debtTokenMint)
789
+ ? strategy.strategy.tokenBMint
790
+ : strategy.strategy.tokenAMint;
791
+ const secondTokenTokenProgarm = (strategy === null || strategy === void 0 ? void 0 : strategy.strategy.tokenAMint.equals(debtTokenMint))
792
+ ? strategy.strategy.tokenBTokenProgram.equals(web3_js_1.PublicKey.default)
793
+ ? spl_token_1.TOKEN_PROGRAM_ID
794
+ : strategy.strategy.tokenBTokenProgram
795
+ : strategy.strategy.tokenATokenProgram.equals(web3_js_1.PublicKey.default)
796
+ ? spl_token_1.TOKEN_PROGRAM_ID
797
+ : strategy.strategy.tokenATokenProgram;
752
798
  mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve.getCTokenMint(), secondTokenAta];
799
+ mintsToCreateAtasTokenPrograms = [
800
+ collReserve.getLiquidityTokenProgram(),
801
+ debtReserve.getLiquidityTokenProgram(),
802
+ spl_token_1.TOKEN_PROGRAM_ID,
803
+ secondTokenTokenProgarm,
804
+ ];
753
805
  }
754
806
  else {
755
807
  mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve.getCTokenMint()];
808
+ mintsToCreateAtasTokenPrograms = [
809
+ collReserve.getLiquidityTokenProgram(),
810
+ debtReserve.getLiquidityTokenProgram(),
811
+ spl_token_1.TOKEN_PROGRAM_ID,
812
+ ];
756
813
  }
757
- const { atas: [collTokenAta, debtTokenAta], createAtasIxns, closeAtasIxns, } = yield (0, utils_1.getAtasWithCreateIxnsIfMissing)(connection, user, mintsToCreateAtas);
814
+ const { atas: [collTokenAta, debtTokenAta], createAtasIxns, closeAtasIxns, } = yield (0, utils_1.getAtasWithCreateIxnsIfMissing)(connection, user, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);
758
815
  // 2. Create borrow flash loan instruction
759
816
  // used if coll is Ktoken and we borrow debt token instead
760
817
  const amountToFashBorrowDebt = depositAmount
@@ -911,16 +968,35 @@ const getDecreaseLeverageIxns = (props) => __awaiter(void 0, void 0, void 0, fun
911
968
  // 1. Create atas & budget txns
912
969
  const budgetIxns = budgetAndPriorityFeeIxns || (0, utils_1.getComputeBudgetAndPriorityFeeIxns)(3000000);
913
970
  let mintsToCreateAtas = [];
971
+ let mintsToCreateAtasTokenPrograms = [];
914
972
  if (collIsKtoken) {
915
- const secondTokenAta = (strategy === null || strategy === void 0 ? void 0 : strategy.strategy.tokenAMint.equals(debtTokenMint))
916
- ? strategy === null || strategy === void 0 ? void 0 : strategy.strategy.tokenBMint
917
- : strategy === null || strategy === void 0 ? void 0 : strategy.strategy.tokenAMint;
973
+ const secondTokenAta = strategy.strategy.tokenAMint.equals(debtTokenMint)
974
+ ? strategy.strategy.tokenBMint
975
+ : strategy.strategy.tokenAMint;
976
+ const secondTokenTokenProgarm = (strategy === null || strategy === void 0 ? void 0 : strategy.strategy.tokenAMint.equals(debtTokenMint))
977
+ ? strategy.strategy.tokenBTokenProgram.equals(web3_js_1.PublicKey.default)
978
+ ? spl_token_1.TOKEN_PROGRAM_ID
979
+ : strategy.strategy.tokenBTokenProgram
980
+ : strategy.strategy.tokenATokenProgram.equals(web3_js_1.PublicKey.default)
981
+ ? spl_token_1.TOKEN_PROGRAM_ID
982
+ : strategy.strategy.tokenATokenProgram;
918
983
  mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve.getCTokenMint(), secondTokenAta];
984
+ mintsToCreateAtasTokenPrograms = [
985
+ collReserve.getLiquidityTokenProgram(),
986
+ debtReserve.getLiquidityTokenProgram(),
987
+ spl_token_1.TOKEN_PROGRAM_ID,
988
+ secondTokenTokenProgarm,
989
+ ];
919
990
  }
920
991
  else {
921
992
  mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve.getCTokenMint()];
993
+ mintsToCreateAtasTokenPrograms = [
994
+ collReserve.getLiquidityTokenProgram(),
995
+ debtReserve.getLiquidityTokenProgram(),
996
+ spl_token_1.TOKEN_PROGRAM_ID,
997
+ ];
922
998
  }
923
- const { atas: [, debtTokenAta], createAtasIxns, closeAtasIxns, } = yield (0, utils_1.getAtasWithCreateIxnsIfMissing)(connection, user, mintsToCreateAtas);
999
+ const { atas: [, debtTokenAta], createAtasIxns, closeAtasIxns, } = yield (0, utils_1.getAtasWithCreateIxnsIfMissing)(connection, user, mintsToCreateAtas, mintsToCreateAtasTokenPrograms);
924
1000
  // TODO: Mihai/Marius check if we can improve this logic and not convert any SOL
925
1001
  // This is here so that we have enough wsol to repay in case the kAB swapped to sol after estimates is not enough
926
1002
  const closeWsolAtaIxns = [];