@kamino-finance/klend-sdk 2.10.10 → 2.10.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/classes/reserve.js +3 -0
- package/dist/classes/reserve.js.map +1 -1
- package/dist/lending_operations/repay_with_collateral_calcs.d.ts +16 -4
- package/dist/lending_operations/repay_with_collateral_calcs.js +5 -4
- package/dist/lending_operations/repay_with_collateral_calcs.js.map +1 -1
- package/dist/lending_operations/repay_with_collateral_operations.d.ts +1 -1
- package/dist/lending_operations/repay_with_collateral_operations.js +6 -6
- package/dist/lending_operations/repay_with_collateral_operations.js.map +1 -1
- package/dist/utils/userMetadata.js +1 -0
- package/dist/utils/userMetadata.js.map +1 -1
- package/package.json +1 -1
package/dist/classes/reserve.js
CHANGED
|
@@ -27,6 +27,9 @@ class KaminoReserve {
|
|
|
27
27
|
* @returns the flash loan fee percentage of the reserve
|
|
28
28
|
*/
|
|
29
29
|
this.getFlashLoanFee = () => {
|
|
30
|
+
if (this.state.config.fees.flashLoanFeeSf.toString() === utils_1.U64_MAX) {
|
|
31
|
+
return new decimal_js_1.default('0');
|
|
32
|
+
}
|
|
30
33
|
return new fraction_1.Fraction(this.state.config.fees.flashLoanFeeSf).toDecimal();
|
|
31
34
|
};
|
|
32
35
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reserve.js","sourceRoot":"","sources":["../../src/classes/reserve.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport { AccountInfo, Connection, PublicKey } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport { INITIAL_COLLATERAL_RATE, ONE_HUNDRED_PCT_IN_BPS, SLOTS_PER_YEAR, TokenOracleData } from '../utils';\nimport { ReserveDataType, ReserveStatus } from './shared';\nimport { Reserve, ReserveFields } from '../idl_codegen/accounts';\nimport { CurvePointFields } from '../idl_codegen/types';\nimport { calculateAPYFromAPR, getBorrowRate, parseTokenSymbol } from './utils';\nimport { Fraction } from './fraction';\nimport BN from 'bn.js';\nimport { ActionType } from './action';\n\nexport class KaminoReserve {\n state: Reserve;\n address: PublicKey;\n symbol: string;\n\n tokenOraclePrice: TokenOracleData;\n stats: ReserveDataType;\n\n private buffer: AccountInfo<Buffer> | null;\n private connection: Connection;\n\n constructor(state: Reserve, address: PublicKey, tokenOraclePrice: TokenOracleData, connection: Connection) {\n this.state = state;\n this.address = address;\n this.buffer = null;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = {} as ReserveDataType;\n this.connection = connection;\n this.symbol = parseTokenSymbol(state.config.tokenInfo.name);\n }\n\n static initialize(\n accountData: AccountInfo<Buffer>,\n address: PublicKey,\n state: Reserve,\n tokenOraclePrice: TokenOracleData,\n connection: Connection\n ) {\n const reserve = new KaminoReserve(state, address, tokenOraclePrice, connection);\n reserve.setBuffer(accountData);\n reserve.stats = reserve.formatReserveData(state);\n return reserve;\n }\n\n /// GETTERS\n\n /**\n * @returns the parsed token symbol of the reserve\n */\n getTokenSymbol(): string {\n return parseTokenSymbol(this.state.config.tokenInfo.name);\n }\n\n /**\n * @returns the total borrowed amount of the reserve\n */\n getBorrowedAmount(): Decimal {\n return new Fraction(this.state.liquidity.borrowedAmountSf).toDecimal();\n }\n\n /**\n * @returns the available liquidity amount of the reserve\n */\n getLiquidityAvailableAmount(): Decimal {\n return new Decimal(this.state.liquidity.availableAmount.toString());\n }\n\n /**\n *\n * @returns the last cached price stored in the reserve in USD\n */\n getReserveMarketPrice(): Decimal {\n return new Fraction(this.state.liquidity.marketPriceSf).toDecimal();\n }\n\n /**\n * @returns the current market price of the reserve in USD\n */\n getOracleMarketPrice(): Decimal {\n return this.tokenOraclePrice.price;\n }\n\n /**\n * @returns the total accumulated protocol fees of the reserve\n */\n getAccumulatedProtocolFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedProtocolFeesSf).toDecimal();\n }\n\n /**\n * @returns the total accumulated referrer fees of the reserve\n */\n getAccumulatedReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedReferrerFeesSf).toDecimal();\n }\n\n /**\n * @returns the total pending referrer fees of the reserve\n */\n getPendingReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.pendingReferrerFeesSf).toDecimal();\n }\n\n /**\n *\n * @returns the flash loan fee percentage of the reserve\n */\n getFlashLoanFee = (): Decimal => {\n return new Fraction(this.state.config.fees.flashLoanFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the origination fee percentage of the reserve\n */\n getBorrowFee = (): Decimal => {\n return new Fraction(this.state.config.fees.borrowFeeSf).toDecimal();\n };\n\n /**\n * Use getEstimatedTotalSupply() for the most accurate value\n * @returns the stale total liquidity supply of the reserve from the last refresh\n */\n getTotalSupply(): Decimal {\n return this.getLiquidityAvailableAmount()\n .add(this.getBorrowedAmount())\n .sub(this.getAccumulatedProtocolFees())\n .sub(this.getAccumulatedReferrerFees())\n .sub(this.getPendingReferrerFees());\n }\n\n /**\n * Calculates the total liquidity supply of the reserve\n */\n getEstimatedTotalSupply(slot: number, referralFeeBps: number): Decimal {\n const { totalSupply } = this.getEstimatedDebtAndSupply(slot, referralFeeBps);\n return totalSupply;\n }\n\n /**\n * Use getEstimatedCumulativeBorrowRate() for the most accurate value\n * @returns the stale cumulative borrow rate of the reserve from the last refresh\n */\n getCumulativeBorrowRate(): Decimal {\n let accSf = new BN(0);\n for (const value of this.state.liquidity.cumulativeBorrowRateBsf.value.reverse()) {\n accSf = accSf.add(value);\n accSf.shrn(64);\n }\n return new Fraction(accSf).toDecimal();\n }\n\n /**\n * @Returns estimated cumulative borrow rate of the reserve\n */\n getEstimatedCumulativeBorrowRate(currentSlot: number): Decimal {\n const currentBorrowRate = new Decimal(this.calculateBorrowAPR());\n const slotsElapsed = Math.max(currentSlot - this.state.lastUpdate.slot.toNumber(), 0);\n\n const compoundInterest = this.approximateCompoundedInterest(currentBorrowRate, slotsElapsed);\n\n const previousCumulativeBorrowRate = this.getCumulativeBorrowRate();\n\n return previousCumulativeBorrowRate.mul(compoundInterest);\n }\n\n /**\n * Use getEstimatedCollateralExchangeRate() for the most accurate value\n * @returns the stale exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getCollateralExchangeRate(): Decimal {\n const totalSupply = this.getTotalSupply();\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the estimated exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getEstimatedCollateralExchangeRate(slot: number, referralFeeBps: number): Decimal {\n const totalSupply = this.getEstimatedTotalSupply(slot, referralFeeBps);\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the total USD value of the existing collateral in the reserve\n */\n getDepositTvl = (): Decimal => {\n return new Decimal(this.getTotalSupply().toString()).mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n *\n * Get the total USD value of the borrowed assets from the reserve\n */\n getBorrowTvl = (): Decimal => {\n return this.getBorrowedAmount().mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n * @returns 10^mint_decimals\n */\n getMintFactor(): Decimal {\n return new Decimal(10).pow(this.state.liquidity.mintDecimals.toNumber());\n }\n\n /**\n * @Returns true if the total liquidity supply of the reserve is greater than the deposit limit\n */\n depositLimitCrossed(): boolean {\n return this.getTotalSupply().gt(new Decimal(this.state.config.depositLimit.toString()));\n }\n\n /**\n * @Returns true if the total borrowed amount of the reserve is greater than the borrow limit\n */\n borrowLimitCrossed(): boolean {\n return this.getBorrowedAmount().gt(new Decimal(this.state.config.borrowLimit.toString()));\n }\n\n calculateSupplyAPR() {\n const currentUtilization = this.calculateUtilizationRatio();\n\n const borrowAPR = this.calculateBorrowAPR();\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n return currentUtilization * borrowAPR * protocolTakeRatePct;\n }\n\n getEstimatedDebtAndSupply(slot: number, referralFeeBps: number): { totalBorrow: Decimal; totalSupply: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let totalBorrow: Decimal;\n let totalSupply: Decimal;\n if (slotsElapsed === 0) {\n totalBorrow = this.getBorrowedAmount();\n totalSupply = this.getTotalSupply();\n } else {\n const { newDebt, newAccProtocolFees, pendingReferralFees } = this.compoundInterest(slotsElapsed, referralFeeBps);\n const newTotalSupply = this.getLiquidityAvailableAmount()\n .add(newDebt)\n .sub(newAccProtocolFees)\n .sub(this.getAccumulatedReferrerFees())\n .sub(pendingReferralFees);\n totalBorrow = newDebt;\n totalSupply = newTotalSupply;\n }\n return { totalBorrow, totalSupply };\n }\n\n calculateUtilizationRatio() {\n const totalBorrows = this.getBorrowedAmount();\n const totalSupply = this.getTotalSupply();\n if (totalSupply.eq(0)) {\n return 0;\n }\n return totalBorrows.dividedBy(totalSupply).toNumber();\n }\n\n calcSimulatedUtilizationRatio(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ): number {\n const { totalBorrow: previousTotalBorrowed, totalSupply: previousTotalSupply } = this.getEstimatedDebtAndSupply(\n slot,\n referralFeeBps\n );\n\n switch (action) {\n case 'deposit': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'withdraw': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n if (newTotalSupply.eq(0)) {\n return 0;\n } else {\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n }\n case 'borrow': {\n const newTotalBorrowed = previousTotalBorrowed.add(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'repay': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'depositAndBorrow': {\n const newTotalSupply = previousTotalSupply.add(amount);\n const newTotalBorrowed = previousTotalBorrowed.add(outflowAmount!);\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'repayAndWithdraw': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n const newTotalSupply = previousTotalSupply.sub(outflowAmount!);\n if (newTotalSupply.eq(0)) {\n return 0;\n }\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'mint': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'redeem': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n default:\n throw Error(`Invalid action type ${action} for simulatedUtilizationRatio`);\n }\n }\n\n calcSimulatedBorrowAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(newUtilization, curve);\n }\n\n calcSimulatedSupplyAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const simulatedBorrowAPR = this.calcSimulatedBorrowAPR(amount, action, slot, referralFeeBps, outflowAmount);\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n\n return newUtilization * simulatedBorrowAPR * protocolTakeRatePct;\n }\n\n calculateBorrowAPR() {\n const currentUtilization = this.calculateUtilizationRatio();\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(currentUtilization, curve);\n }\n\n /**\n * @returns the mint of the reserve liquidity token\n */\n getLiquidityMint(): PublicKey {\n return this.state.liquidity.mintPubkey;\n }\n\n /**\n * @returns the mint of the reserve collateral token , i.e. the cToken minted for depositing the liquidity token\n */\n getCTokenMint(): PublicKey {\n return this.state.collateral.mintPubkey;\n }\n\n setBuffer(buffer: AccountInfo<Buffer> | null) {\n this.buffer = buffer;\n }\n\n async load(tokenOraclePrice: TokenOracleData) {\n if (!this.buffer) {\n this.setBuffer(await this.connection.getAccountInfo(this.address, 'processed'));\n }\n\n if (!this.buffer) {\n throw Error(`Error requesting account info for ${this.symbol}`);\n }\n\n const parsedData = await Reserve.fetch(this.connection, this.address);\n if (!parsedData) {\n throw Error(`Unable to parse data of reserve ${this.symbol}`);\n }\n this.state = parsedData;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = this.formatReserveData(parsedData);\n }\n\n totalSupplyAPY() {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n const totalAPY = new Decimal(stats.supplyInterestAPY).toNumber();\n\n return {\n interestAPY: stats.supplyInterestAPY,\n totalAPY,\n };\n }\n\n totalBorrowAPY() {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n const totalAPY = new Decimal(stats.borrowInterestAPY).toNumber();\n\n return {\n interestAPY: stats.borrowInterestAPY,\n totalAPY,\n };\n }\n\n private formatReserveData(parsedData: ReserveFields): ReserveDataType {\n const mintTotalSupply = new Decimal(parsedData.collateral.mintTotalSupply.toString()).div(this.getMintFactor());\n let reserveStatus = ReserveStatus.Active;\n switch (parsedData.config.status) {\n case 0:\n reserveStatus = ReserveStatus.Active;\n break;\n case 1:\n reserveStatus = ReserveStatus.Obsolete;\n break;\n case 2:\n reserveStatus = ReserveStatus.Hidden;\n break;\n }\n return {\n // Reserve config\n\n status: reserveStatus,\n mintAddress: parsedData.liquidity.mintPubkey,\n borrowCurve: truncateBorrowCurve(parsedData.config.borrowRateCurve.points),\n loanToValuePct: parsedData.config.loanToValuePct / 100,\n maxLiquidationBonus: parsedData.config.maxLiquidationBonusBps / 10000,\n minLiquidationBonus: parsedData.config.minLiquidationBonusBps / 10000,\n liquidationThreshold: parsedData.config.liquidationThresholdPct / 100,\n protocolTakeRate: parsedData.config.protocolTakeRatePct / 100,\n reserveDepositLimit: new Decimal(parsedData.config.depositLimit.toString()),\n reserveBorrowLimit: new Decimal(parsedData.config.borrowLimit.toString()),\n\n // Reserve info\n symbol: parseTokenSymbol(parsedData.config.tokenInfo.name),\n decimals: this.state.liquidity.mintDecimals.toNumber(),\n supplyInterestAPY: calculateAPYFromAPR(this.calculateSupplyAPR()),\n borrowInterestAPY: calculateAPYFromAPR(this.calculateBorrowAPR()),\n accumulatedProtocolFees: this.getAccumulatedProtocolFees().div(this.getMintFactor()),\n mintTotalSupply,\n depositLimitCrossedSlot: parsedData.liquidity.depositLimitCrossedSlot.toNumber(),\n borrowLimitCrossedSlot: parsedData.liquidity.borrowLimitCrossedSlot.toNumber(),\n borrowFactor: parsedData.config.borrowFactorPct.toNumber(),\n };\n }\n\n /**\n * Compound current borrow rate over elapsed slots\n *\n * This also calculates protocol fees, which are taken for all obligations that have borrowed from current reserve.\n *\n * This also calculates referral fees, which are taken into pendingReferralFees.\n *\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L517\n *\n * @param slotsElapsed\n * @param referralFeeBps\n */\n private compoundInterest(\n slotsElapsed: number,\n referralFeeBps: number\n ): {\n newDebt: Decimal;\n netNewDebt: Decimal;\n totalProtocolFee: Decimal;\n absoluteReferralFee: Decimal;\n maxReferralFees: Decimal;\n newAccProtocolFees: Decimal;\n pendingReferralFees: Decimal;\n } {\n const currentBorrowRate = this.calculateBorrowAPR();\n const protocolTakeRate = new Decimal(this.state.config.protocolTakeRatePct).div(100);\n const referralRate = new Decimal(referralFeeBps).div(10_000);\n\n const compoundInterestRate = this.approximateCompoundedInterest(new Decimal(currentBorrowRate), slotsElapsed);\n\n const previousDebt = this.getBorrowedAmount();\n const newDebt = previousDebt.mul(compoundInterestRate);\n const netNewDebt = newDebt.sub(previousDebt);\n\n const totalProtocolFee = netNewDebt.mul(protocolTakeRate);\n const absoluteReferralFee = protocolTakeRate.mul(referralRate);\n const maxReferralFees = netNewDebt.mul(absoluteReferralFee);\n\n const newAccProtocolFees = totalProtocolFee.sub(maxReferralFees).add(this.getAccumulatedProtocolFees());\n\n const pendingReferralFees = this.getPendingReferrerFees().add(maxReferralFees);\n\n return {\n newDebt,\n netNewDebt,\n totalProtocolFee,\n absoluteReferralFee,\n maxReferralFees,\n newAccProtocolFees,\n pendingReferralFees,\n };\n }\n\n /**\n * Approximation to match the smart contract calculation\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L1026\n * @param rate\n * @param elapsedSlots\n * @private\n */\n private approximateCompoundedInterest(rate: Decimal, elapsedSlots: number): Decimal {\n const base = rate.div(SLOTS_PER_YEAR);\n switch (elapsedSlots) {\n case 0:\n return new Decimal(1);\n case 1:\n return base.add(1);\n case 2:\n return base.add(1).mul(base.add(1));\n case 3:\n return base.add(1).mul(base.add(1)).mul(base.add(1));\n case 4:\n // eslint-disable-next-line no-case-declarations\n const pow2 = base.add(1).mul(base.add(1));\n return pow2.mul(pow2);\n }\n const exp = elapsedSlots;\n const expMinus1 = exp - 1;\n const expMinus2 = exp - 2;\n\n const basePow2 = base.mul(base);\n const basePow3 = basePow2.mul(base);\n\n const firstTerm = base.mul(exp);\n const secondTerm = basePow2.mul(exp).mul(expMinus1).div(2);\n const thirdTerm = basePow3.mul(exp).mul(expMinus1).mul(expMinus2).div(6);\n\n return new Decimal(1).add(firstTerm).add(secondTerm).add(thirdTerm);\n }\n}\n\nconst truncateBorrowCurve = (points: CurvePointFields[]): [number, number][] => {\n const curve: [number, number][] = [];\n for (const { utilizationRateBps, borrowRateBps } of points) {\n curve.push([utilizationRateBps / ONE_HUNDRED_PCT_IN_BPS, borrowRateBps / ONE_HUNDRED_PCT_IN_BPS]);\n\n if (utilizationRateBps === ONE_HUNDRED_PCT_IN_BPS) {\n break;\n }\n }\n return curve;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"reserve.js","sourceRoot":"","sources":["../../src/classes/reserve.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4DAAiC;AACjC,oCAAqH;AACrH,qCAA0D;AAC1D,sDAAiE;AAEjE,mCAA+E;AAC/E,yCAAsC;AACtC,kDAAuB;AAGvB,MAAa,aAAa;IAWxB,YAAY,KAAc,EAAE,OAAkB,EAAE,gBAAiC,EAAE,UAAsB;QAkFzG;;;WAGG;QACH,oBAAe,GAAG,GAAY,EAAE;YAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,eAAO,EAAE;gBAChE,OAAO,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC;aACzB;YACD,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,CAAC;QACzE,CAAC,CAAC;QAEF;;;WAGG;QACH,iBAAY,GAAG,GAAY,EAAE;YAC3B,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,SAAS,EAAE,CAAC;QACtE,CAAC,CAAC;QA6EF;;;WAGG;QACH,kBAAa,GAAG,GAAY,EAAE;YAC5B,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAClH,CAAC,CAAC;QAEF;;;WAGG;QACH,iBAAY,GAAG,GAAY,EAAE;YAC3B,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAC7F,CAAC,CAAC;QA7LA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,EAAqB,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAA,wBAAgB,EAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,CAAC,UAAU,CACf,WAAgC,EAChC,OAAkB,EAClB,KAAc,EACd,gBAAiC,EACjC,UAAsB;QAEtB,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAC;QAChF,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,WAAW;IAEX;;OAEG;IACH,cAAc;QACZ,OAAO,IAAA,wBAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,SAAS,EAAE,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,2BAA2B;QACzB,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACH,qBAAqB;QACnB,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,0BAA0B;QACxB,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC,SAAS,EAAE,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,0BAA0B;QACxB,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC,SAAS,EAAE,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,sBAAsB;QACpB,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,SAAS,EAAE,CAAC;IAC9E,CAAC;IAqBD;;;OAGG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,2BAA2B,EAAE;aACtC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;aAC7B,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC;aACtC,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC;aACtC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,IAAY,EAAE,cAAsB;QAC1D,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC7E,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,uBAAuB;QACrB,IAAI,KAAK,GAAG,IAAI,eAAE,CAAC,CAAC,CAAC,CAAC;QACtB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,uBAAuB,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;YAChF,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAChB;QACD,OAAO,IAAI,mBAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,gCAAgC,CAAC,WAAmB;QAClD,MAAM,iBAAiB,GAAG,IAAI,oBAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACjE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAEtF,MAAM,gBAAgB,GAAG,IAAI,CAAC,6BAA6B,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;QAE7F,MAAM,4BAA4B,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAEpE,OAAO,4BAA4B,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACH,yBAAyB;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC;QAC9D,IAAI,eAAe,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE;YACpD,OAAO,+BAAuB,CAAC;SAChC;aAAM;YACL,OAAO,IAAI,oBAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;SAClF;IACH,CAAC;IAED;;;OAGG;IACH,kCAAkC,CAAC,IAAY,EAAE,cAAsB;QACrE,MAAM,WAAW,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACvE,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC;QAC9D,IAAI,eAAe,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE;YACpD,OAAO,+BAAuB,CAAC;SAChC;aAAM;YACL,OAAO,IAAI,oBAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;SAClF;IACH,CAAC;IAkBD;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,oBAAO,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,kBAAkB;QAChB,MAAM,kBAAkB,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAE5D,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5C,MAAM,mBAAmB,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,GAAG,GAAG,CAAC;QAC5E,OAAO,kBAAkB,GAAG,SAAS,GAAG,mBAAmB,CAAC;IAC9D,CAAC;IAED,yBAAyB,CAAC,IAAY,EAAE,cAAsB;QAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/E,IAAI,WAAoB,CAAC;QACzB,IAAI,WAAoB,CAAC;QACzB,IAAI,YAAY,KAAK,CAAC,EAAE;YACtB,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;SACrC;aAAM;YACL,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;YACjH,MAAM,cAAc,GAAG,IAAI,CAAC,2BAA2B,EAAE;iBACtD,GAAG,CAAC,OAAO,CAAC;iBACZ,GAAG,CAAC,kBAAkB,CAAC;iBACvB,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC;iBACtC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YAC5B,WAAW,GAAG,OAAO,CAAC;YACtB,WAAW,GAAG,cAAc,CAAC;SAC9B;QACD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IACtC,CAAC;IAED,yBAAyB;QACvB,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACrB,OAAO,CAAC,CAAC;SACV;QACD,OAAO,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxD,CAAC;IAED,6BAA6B,CAC3B,MAAe,EACf,MAAkB,EAClB,IAAY,EACZ,cAAsB,EACtB,aAAuB;QAEvB,MAAM,EAAE,WAAW,EAAE,qBAAqB,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAC7G,IAAI,EACJ,cAAc,CACf,CAAC;QAEF,QAAQ,MAAM,EAAE;YACd,KAAK,SAAS,CAAC,CAAC;gBACd,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACvD,OAAO,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;aACnE;YACD,KAAK,UAAU,CAAC,CAAC;gBACf,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACvD,IAAI,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;oBACxB,OAAO,CAAC,CAAC;iBACV;qBAAM;oBACL,OAAO,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;iBACnE;aACF;YACD,KAAK,QAAQ,CAAC,CAAC;gBACb,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC3D,OAAO,gBAAgB,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,CAAC;aACnE;YACD,KAAK,OAAO,CAAC,CAAC;gBACZ,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC3D,OAAO,gBAAgB,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,CAAC;aACnE;YACD,KAAK,kBAAkB,CAAC,CAAC;gBACvB,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACvD,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,GAAG,CAAC,aAAc,CAAC,CAAC;gBACnE,OAAO,gBAAgB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;aAC9D;YACD,KAAK,kBAAkB,CAAC,CAAC;gBACvB,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC3D,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,aAAc,CAAC,CAAC;gBAC/D,IAAI,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;oBACxB,OAAO,CAAC,CAAC;iBACV;gBACD,OAAO,gBAAgB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;aAC9D;YACD,KAAK,MAAM,CAAC,CAAC;gBACX,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACvD,OAAO,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;aACnE;YACD,KAAK,QAAQ,CAAC,CAAC;gBACb,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACvD,OAAO,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;aACnE;YACD;gBACE,MAAM,KAAK,CAAC,uBAAuB,MAAM,gCAAgC,CAAC,CAAC;SAC9E;IACH,CAAC;IAED,sBAAsB,CACpB,MAAe,EACf,MAAkB,EAClB,IAAY,EACZ,cAAsB,EACtB,aAAuB;QAEvB,MAAM,cAAc,GAAG,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;QAC/G,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5E,OAAO,IAAA,qBAAa,EAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,sBAAsB,CACpB,MAAe,EACf,MAAkB,EAClB,IAAY,EACZ,cAAsB,EACtB,aAAuB;QAEvB,MAAM,cAAc,GAAG,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;QAC/G,MAAM,kBAAkB,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;QAC5G,MAAM,mBAAmB,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,GAAG,GAAG,CAAC;QAE5E,OAAO,cAAc,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;IACnE,CAAC;IAED,kBAAkB;QAChB,MAAM,kBAAkB,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5E,OAAO,IAAA,qBAAa,EAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;IAC1C,CAAC;IAED,SAAS,CAAC,MAAkC;QAC1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEK,IAAI,CAAC,gBAAiC;;YAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAChB,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;aACjF;YAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAChB,MAAM,KAAK,CAAC,qCAAqC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;aACjE;YAED,MAAM,UAAU,GAAG,MAAM,kBAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACtE,IAAI,CAAC,UAAU,EAAE;gBACf,MAAM,KAAK,CAAC,mCAAmC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;aAC/D;YACD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;YACxB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;YACzC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC;KAAA;IAED,cAAc;QACZ,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,KAAK,CAAC,qCAAqC,CAAC,CAAC;SACpD;QAED,MAAM,QAAQ,GAAG,IAAI,oBAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC;QAEjE,OAAO;YACL,WAAW,EAAE,KAAK,CAAC,iBAAiB;YACpC,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,cAAc;QACZ,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,KAAK,CAAC,qCAAqC,CAAC,CAAC;SACpD;QAED,MAAM,QAAQ,GAAG,IAAI,oBAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC;QAEjE,OAAO;YACL,WAAW,EAAE,KAAK,CAAC,iBAAiB;YACpC,QAAQ;SACT,CAAC;IACJ,CAAC;IAEO,iBAAiB,CAAC,UAAyB;QACjD,MAAM,eAAe,GAAG,IAAI,oBAAO,CAAC,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAChH,IAAI,aAAa,GAAG,sBAAa,CAAC,MAAM,CAAC;QACzC,QAAQ,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE;YAChC,KAAK,CAAC;gBACJ,aAAa,GAAG,sBAAa,CAAC,MAAM,CAAC;gBACrC,MAAM;YACR,KAAK,CAAC;gBACJ,aAAa,GAAG,sBAAa,CAAC,QAAQ,CAAC;gBACvC,MAAM;YACR,KAAK,CAAC;gBACJ,aAAa,GAAG,sBAAa,CAAC,MAAM,CAAC;gBACrC,MAAM;SACT;QACD,OAAO;YACL,iBAAiB;YAEjB,MAAM,EAAE,aAAa;YACrB,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,UAAU;YAC5C,WAAW,EAAE,mBAAmB,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;YAC1E,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,cAAc,GAAG,GAAG;YACtD,mBAAmB,EAAE,UAAU,CAAC,MAAM,CAAC,sBAAsB,GAAG,KAAK;YACrE,mBAAmB,EAAE,UAAU,CAAC,MAAM,CAAC,sBAAsB,GAAG,KAAK;YACrE,oBAAoB,EAAE,UAAU,CAAC,MAAM,CAAC,uBAAuB,GAAG,GAAG;YACrE,gBAAgB,EAAE,UAAU,CAAC,MAAM,CAAC,mBAAmB,GAAG,GAAG;YAC7D,mBAAmB,EAAE,IAAI,oBAAO,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC3E,kBAAkB,EAAE,IAAI,oBAAO,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAEzE,eAAe;YACf,MAAM,EAAE,IAAA,wBAAgB,EAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1D,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE;YACtD,iBAAiB,EAAE,IAAA,2BAAmB,EAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACjE,iBAAiB,EAAE,IAAA,2BAAmB,EAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACjE,uBAAuB,EAAE,IAAI,CAAC,0BAA0B,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACpF,eAAe;YACf,uBAAuB,EAAE,UAAU,CAAC,SAAS,CAAC,uBAAuB,CAAC,QAAQ,EAAE;YAChF,sBAAsB,EAAE,UAAU,CAAC,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE;YAC9E,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE;SAC3D,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;OAWG;IACK,gBAAgB,CACtB,YAAoB,EACpB,cAAsB;QAUtB,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACpD,MAAM,gBAAgB,GAAG,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrF,MAAM,YAAY,GAAG,IAAI,oBAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,KAAM,CAAC,CAAC;QAE7D,MAAM,oBAAoB,GAAG,IAAI,CAAC,6BAA6B,CAAC,IAAI,oBAAO,CAAC,iBAAiB,CAAC,EAAE,YAAY,CAAC,CAAC;QAE9G,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAE7C,MAAM,gBAAgB,GAAG,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC1D,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC/D,MAAM,eAAe,GAAG,UAAU,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAE5D,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC,CAAC;QAExG,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAE/E,OAAO;YACL,OAAO;YACP,UAAU;YACV,gBAAgB;YAChB,mBAAmB;YACnB,eAAe;YACf,kBAAkB;YAClB,mBAAmB;SACpB,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,6BAA6B,CAAC,IAAa,EAAE,YAAoB;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,sBAAc,CAAC,CAAC;QACtC,QAAQ,YAAY,EAAE;YACpB,KAAK,CAAC;gBACJ,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;YACxB,KAAK,CAAC;gBACJ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrB,KAAK,CAAC;gBACJ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,KAAK,CAAC;gBACJ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,KAAK,CAAC;gBACJ,gDAAgD;gBAChD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACzB;QACD,MAAM,GAAG,GAAG,YAAY,CAAC;QACzB,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC;QAC1B,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEzE,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;CACF;AAliBD,sCAkiBC;AAED,MAAM,mBAAmB,GAAG,CAAC,MAA0B,EAAsB,EAAE;IAC7E,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,KAAK,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,IAAI,MAAM,EAAE;QAC1D,KAAK,CAAC,IAAI,CAAC,CAAC,kBAAkB,GAAG,8BAAsB,EAAE,aAAa,GAAG,8BAAsB,CAAC,CAAC,CAAC;QAElG,IAAI,kBAAkB,KAAK,8BAAsB,EAAE;YACjD,MAAM;SACP;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport { AccountInfo, Connection, PublicKey } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport { INITIAL_COLLATERAL_RATE, ONE_HUNDRED_PCT_IN_BPS, SLOTS_PER_YEAR, TokenOracleData, U64_MAX } from '../utils';\nimport { ReserveDataType, ReserveStatus } from './shared';\nimport { Reserve, ReserveFields } from '../idl_codegen/accounts';\nimport { CurvePointFields } from '../idl_codegen/types';\nimport { calculateAPYFromAPR, getBorrowRate, parseTokenSymbol } from './utils';\nimport { Fraction } from './fraction';\nimport BN from 'bn.js';\nimport { ActionType } from './action';\n\nexport class KaminoReserve {\n state: Reserve;\n address: PublicKey;\n symbol: string;\n\n tokenOraclePrice: TokenOracleData;\n stats: ReserveDataType;\n\n private buffer: AccountInfo<Buffer> | null;\n private connection: Connection;\n\n constructor(state: Reserve, address: PublicKey, tokenOraclePrice: TokenOracleData, connection: Connection) {\n this.state = state;\n this.address = address;\n this.buffer = null;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = {} as ReserveDataType;\n this.connection = connection;\n this.symbol = parseTokenSymbol(state.config.tokenInfo.name);\n }\n\n static initialize(\n accountData: AccountInfo<Buffer>,\n address: PublicKey,\n state: Reserve,\n tokenOraclePrice: TokenOracleData,\n connection: Connection\n ) {\n const reserve = new KaminoReserve(state, address, tokenOraclePrice, connection);\n reserve.setBuffer(accountData);\n reserve.stats = reserve.formatReserveData(state);\n return reserve;\n }\n\n /// GETTERS\n\n /**\n * @returns the parsed token symbol of the reserve\n */\n getTokenSymbol(): string {\n return parseTokenSymbol(this.state.config.tokenInfo.name);\n }\n\n /**\n * @returns the total borrowed amount of the reserve\n */\n getBorrowedAmount(): Decimal {\n return new Fraction(this.state.liquidity.borrowedAmountSf).toDecimal();\n }\n\n /**\n * @returns the available liquidity amount of the reserve\n */\n getLiquidityAvailableAmount(): Decimal {\n return new Decimal(this.state.liquidity.availableAmount.toString());\n }\n\n /**\n *\n * @returns the last cached price stored in the reserve in USD\n */\n getReserveMarketPrice(): Decimal {\n return new Fraction(this.state.liquidity.marketPriceSf).toDecimal();\n }\n\n /**\n * @returns the current market price of the reserve in USD\n */\n getOracleMarketPrice(): Decimal {\n return this.tokenOraclePrice.price;\n }\n\n /**\n * @returns the total accumulated protocol fees of the reserve\n */\n getAccumulatedProtocolFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedProtocolFeesSf).toDecimal();\n }\n\n /**\n * @returns the total accumulated referrer fees of the reserve\n */\n getAccumulatedReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedReferrerFeesSf).toDecimal();\n }\n\n /**\n * @returns the total pending referrer fees of the reserve\n */\n getPendingReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.pendingReferrerFeesSf).toDecimal();\n }\n\n /**\n *\n * @returns the flash loan fee percentage of the reserve\n */\n getFlashLoanFee = (): Decimal => {\n if (this.state.config.fees.flashLoanFeeSf.toString() === U64_MAX) {\n return new Decimal('0');\n }\n return new Fraction(this.state.config.fees.flashLoanFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the origination fee percentage of the reserve\n */\n getBorrowFee = (): Decimal => {\n return new Fraction(this.state.config.fees.borrowFeeSf).toDecimal();\n };\n\n /**\n * Use getEstimatedTotalSupply() for the most accurate value\n * @returns the stale total liquidity supply of the reserve from the last refresh\n */\n getTotalSupply(): Decimal {\n return this.getLiquidityAvailableAmount()\n .add(this.getBorrowedAmount())\n .sub(this.getAccumulatedProtocolFees())\n .sub(this.getAccumulatedReferrerFees())\n .sub(this.getPendingReferrerFees());\n }\n\n /**\n * Calculates the total liquidity supply of the reserve\n */\n getEstimatedTotalSupply(slot: number, referralFeeBps: number): Decimal {\n const { totalSupply } = this.getEstimatedDebtAndSupply(slot, referralFeeBps);\n return totalSupply;\n }\n\n /**\n * Use getEstimatedCumulativeBorrowRate() for the most accurate value\n * @returns the stale cumulative borrow rate of the reserve from the last refresh\n */\n getCumulativeBorrowRate(): Decimal {\n let accSf = new BN(0);\n for (const value of this.state.liquidity.cumulativeBorrowRateBsf.value.reverse()) {\n accSf = accSf.add(value);\n accSf.shrn(64);\n }\n return new Fraction(accSf).toDecimal();\n }\n\n /**\n * @Returns estimated cumulative borrow rate of the reserve\n */\n getEstimatedCumulativeBorrowRate(currentSlot: number): Decimal {\n const currentBorrowRate = new Decimal(this.calculateBorrowAPR());\n const slotsElapsed = Math.max(currentSlot - this.state.lastUpdate.slot.toNumber(), 0);\n\n const compoundInterest = this.approximateCompoundedInterest(currentBorrowRate, slotsElapsed);\n\n const previousCumulativeBorrowRate = this.getCumulativeBorrowRate();\n\n return previousCumulativeBorrowRate.mul(compoundInterest);\n }\n\n /**\n * Use getEstimatedCollateralExchangeRate() for the most accurate value\n * @returns the stale exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getCollateralExchangeRate(): Decimal {\n const totalSupply = this.getTotalSupply();\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the estimated exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getEstimatedCollateralExchangeRate(slot: number, referralFeeBps: number): Decimal {\n const totalSupply = this.getEstimatedTotalSupply(slot, referralFeeBps);\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the total USD value of the existing collateral in the reserve\n */\n getDepositTvl = (): Decimal => {\n return new Decimal(this.getTotalSupply().toString()).mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n *\n * Get the total USD value of the borrowed assets from the reserve\n */\n getBorrowTvl = (): Decimal => {\n return this.getBorrowedAmount().mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n * @returns 10^mint_decimals\n */\n getMintFactor(): Decimal {\n return new Decimal(10).pow(this.state.liquidity.mintDecimals.toNumber());\n }\n\n /**\n * @Returns true if the total liquidity supply of the reserve is greater than the deposit limit\n */\n depositLimitCrossed(): boolean {\n return this.getTotalSupply().gt(new Decimal(this.state.config.depositLimit.toString()));\n }\n\n /**\n * @Returns true if the total borrowed amount of the reserve is greater than the borrow limit\n */\n borrowLimitCrossed(): boolean {\n return this.getBorrowedAmount().gt(new Decimal(this.state.config.borrowLimit.toString()));\n }\n\n calculateSupplyAPR() {\n const currentUtilization = this.calculateUtilizationRatio();\n\n const borrowAPR = this.calculateBorrowAPR();\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n return currentUtilization * borrowAPR * protocolTakeRatePct;\n }\n\n getEstimatedDebtAndSupply(slot: number, referralFeeBps: number): { totalBorrow: Decimal; totalSupply: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let totalBorrow: Decimal;\n let totalSupply: Decimal;\n if (slotsElapsed === 0) {\n totalBorrow = this.getBorrowedAmount();\n totalSupply = this.getTotalSupply();\n } else {\n const { newDebt, newAccProtocolFees, pendingReferralFees } = this.compoundInterest(slotsElapsed, referralFeeBps);\n const newTotalSupply = this.getLiquidityAvailableAmount()\n .add(newDebt)\n .sub(newAccProtocolFees)\n .sub(this.getAccumulatedReferrerFees())\n .sub(pendingReferralFees);\n totalBorrow = newDebt;\n totalSupply = newTotalSupply;\n }\n return { totalBorrow, totalSupply };\n }\n\n calculateUtilizationRatio() {\n const totalBorrows = this.getBorrowedAmount();\n const totalSupply = this.getTotalSupply();\n if (totalSupply.eq(0)) {\n return 0;\n }\n return totalBorrows.dividedBy(totalSupply).toNumber();\n }\n\n calcSimulatedUtilizationRatio(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ): number {\n const { totalBorrow: previousTotalBorrowed, totalSupply: previousTotalSupply } = this.getEstimatedDebtAndSupply(\n slot,\n referralFeeBps\n );\n\n switch (action) {\n case 'deposit': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'withdraw': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n if (newTotalSupply.eq(0)) {\n return 0;\n } else {\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n }\n case 'borrow': {\n const newTotalBorrowed = previousTotalBorrowed.add(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'repay': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'depositAndBorrow': {\n const newTotalSupply = previousTotalSupply.add(amount);\n const newTotalBorrowed = previousTotalBorrowed.add(outflowAmount!);\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'repayAndWithdraw': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n const newTotalSupply = previousTotalSupply.sub(outflowAmount!);\n if (newTotalSupply.eq(0)) {\n return 0;\n }\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'mint': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'redeem': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n default:\n throw Error(`Invalid action type ${action} for simulatedUtilizationRatio`);\n }\n }\n\n calcSimulatedBorrowAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(newUtilization, curve);\n }\n\n calcSimulatedSupplyAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const simulatedBorrowAPR = this.calcSimulatedBorrowAPR(amount, action, slot, referralFeeBps, outflowAmount);\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n\n return newUtilization * simulatedBorrowAPR * protocolTakeRatePct;\n }\n\n calculateBorrowAPR() {\n const currentUtilization = this.calculateUtilizationRatio();\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(currentUtilization, curve);\n }\n\n /**\n * @returns the mint of the reserve liquidity token\n */\n getLiquidityMint(): PublicKey {\n return this.state.liquidity.mintPubkey;\n }\n\n /**\n * @returns the mint of the reserve collateral token , i.e. the cToken minted for depositing the liquidity token\n */\n getCTokenMint(): PublicKey {\n return this.state.collateral.mintPubkey;\n }\n\n setBuffer(buffer: AccountInfo<Buffer> | null) {\n this.buffer = buffer;\n }\n\n async load(tokenOraclePrice: TokenOracleData) {\n if (!this.buffer) {\n this.setBuffer(await this.connection.getAccountInfo(this.address, 'processed'));\n }\n\n if (!this.buffer) {\n throw Error(`Error requesting account info for ${this.symbol}`);\n }\n\n const parsedData = await Reserve.fetch(this.connection, this.address);\n if (!parsedData) {\n throw Error(`Unable to parse data of reserve ${this.symbol}`);\n }\n this.state = parsedData;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = this.formatReserveData(parsedData);\n }\n\n totalSupplyAPY() {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n const totalAPY = new Decimal(stats.supplyInterestAPY).toNumber();\n\n return {\n interestAPY: stats.supplyInterestAPY,\n totalAPY,\n };\n }\n\n totalBorrowAPY() {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n const totalAPY = new Decimal(stats.borrowInterestAPY).toNumber();\n\n return {\n interestAPY: stats.borrowInterestAPY,\n totalAPY,\n };\n }\n\n private formatReserveData(parsedData: ReserveFields): ReserveDataType {\n const mintTotalSupply = new Decimal(parsedData.collateral.mintTotalSupply.toString()).div(this.getMintFactor());\n let reserveStatus = ReserveStatus.Active;\n switch (parsedData.config.status) {\n case 0:\n reserveStatus = ReserveStatus.Active;\n break;\n case 1:\n reserveStatus = ReserveStatus.Obsolete;\n break;\n case 2:\n reserveStatus = ReserveStatus.Hidden;\n break;\n }\n return {\n // Reserve config\n\n status: reserveStatus,\n mintAddress: parsedData.liquidity.mintPubkey,\n borrowCurve: truncateBorrowCurve(parsedData.config.borrowRateCurve.points),\n loanToValuePct: parsedData.config.loanToValuePct / 100,\n maxLiquidationBonus: parsedData.config.maxLiquidationBonusBps / 10000,\n minLiquidationBonus: parsedData.config.minLiquidationBonusBps / 10000,\n liquidationThreshold: parsedData.config.liquidationThresholdPct / 100,\n protocolTakeRate: parsedData.config.protocolTakeRatePct / 100,\n reserveDepositLimit: new Decimal(parsedData.config.depositLimit.toString()),\n reserveBorrowLimit: new Decimal(parsedData.config.borrowLimit.toString()),\n\n // Reserve info\n symbol: parseTokenSymbol(parsedData.config.tokenInfo.name),\n decimals: this.state.liquidity.mintDecimals.toNumber(),\n supplyInterestAPY: calculateAPYFromAPR(this.calculateSupplyAPR()),\n borrowInterestAPY: calculateAPYFromAPR(this.calculateBorrowAPR()),\n accumulatedProtocolFees: this.getAccumulatedProtocolFees().div(this.getMintFactor()),\n mintTotalSupply,\n depositLimitCrossedSlot: parsedData.liquidity.depositLimitCrossedSlot.toNumber(),\n borrowLimitCrossedSlot: parsedData.liquidity.borrowLimitCrossedSlot.toNumber(),\n borrowFactor: parsedData.config.borrowFactorPct.toNumber(),\n };\n }\n\n /**\n * Compound current borrow rate over elapsed slots\n *\n * This also calculates protocol fees, which are taken for all obligations that have borrowed from current reserve.\n *\n * This also calculates referral fees, which are taken into pendingReferralFees.\n *\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L517\n *\n * @param slotsElapsed\n * @param referralFeeBps\n */\n private compoundInterest(\n slotsElapsed: number,\n referralFeeBps: number\n ): {\n newDebt: Decimal;\n netNewDebt: Decimal;\n totalProtocolFee: Decimal;\n absoluteReferralFee: Decimal;\n maxReferralFees: Decimal;\n newAccProtocolFees: Decimal;\n pendingReferralFees: Decimal;\n } {\n const currentBorrowRate = this.calculateBorrowAPR();\n const protocolTakeRate = new Decimal(this.state.config.protocolTakeRatePct).div(100);\n const referralRate = new Decimal(referralFeeBps).div(10_000);\n\n const compoundInterestRate = this.approximateCompoundedInterest(new Decimal(currentBorrowRate), slotsElapsed);\n\n const previousDebt = this.getBorrowedAmount();\n const newDebt = previousDebt.mul(compoundInterestRate);\n const netNewDebt = newDebt.sub(previousDebt);\n\n const totalProtocolFee = netNewDebt.mul(protocolTakeRate);\n const absoluteReferralFee = protocolTakeRate.mul(referralRate);\n const maxReferralFees = netNewDebt.mul(absoluteReferralFee);\n\n const newAccProtocolFees = totalProtocolFee.sub(maxReferralFees).add(this.getAccumulatedProtocolFees());\n\n const pendingReferralFees = this.getPendingReferrerFees().add(maxReferralFees);\n\n return {\n newDebt,\n netNewDebt,\n totalProtocolFee,\n absoluteReferralFee,\n maxReferralFees,\n newAccProtocolFees,\n pendingReferralFees,\n };\n }\n\n /**\n * Approximation to match the smart contract calculation\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L1026\n * @param rate\n * @param elapsedSlots\n * @private\n */\n private approximateCompoundedInterest(rate: Decimal, elapsedSlots: number): Decimal {\n const base = rate.div(SLOTS_PER_YEAR);\n switch (elapsedSlots) {\n case 0:\n return new Decimal(1);\n case 1:\n return base.add(1);\n case 2:\n return base.add(1).mul(base.add(1));\n case 3:\n return base.add(1).mul(base.add(1)).mul(base.add(1));\n case 4:\n // eslint-disable-next-line no-case-declarations\n const pow2 = base.add(1).mul(base.add(1));\n return pow2.mul(pow2);\n }\n const exp = elapsedSlots;\n const expMinus1 = exp - 1;\n const expMinus2 = exp - 2;\n\n const basePow2 = base.mul(base);\n const basePow3 = basePow2.mul(base);\n\n const firstTerm = base.mul(exp);\n const secondTerm = basePow2.mul(exp).mul(expMinus1).div(2);\n const thirdTerm = basePow3.mul(exp).mul(expMinus1).mul(expMinus2).div(6);\n\n return new Decimal(1).add(firstTerm).add(secondTerm).add(thirdTerm);\n }\n}\n\nconst truncateBorrowCurve = (points: CurvePointFields[]): [number, number][] => {\n const curve: [number, number][] = [];\n for (const { utilizationRateBps, borrowRateBps } of points) {\n curve.push([utilizationRateBps / ONE_HUNDRED_PCT_IN_BPS, borrowRateBps / ONE_HUNDRED_PCT_IN_BPS]);\n\n if (utilizationRateBps === ONE_HUNDRED_PCT_IN_BPS) {\n break;\n }\n }\n return curve;\n};\n"]}
|
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
import Decimal from 'decimal.js';
|
|
2
2
|
import { KaminoMarket, KaminoObligation } from '../classes';
|
|
3
3
|
import { PublicKey } from '@solana/web3.js';
|
|
4
|
-
export declare function estimateDebtRepaymentWithColl(
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
export declare function estimateDebtRepaymentWithColl(props: {
|
|
5
|
+
collAmount: Decimal;
|
|
6
|
+
priceDebtToColl: Decimal;
|
|
7
|
+
slippagePct: Decimal;
|
|
8
|
+
flashBorrowReserveFlashLoanFeePercentage: Decimal;
|
|
9
|
+
kaminoMarket: KaminoMarket;
|
|
10
|
+
debtTokenMint: PublicKey;
|
|
11
|
+
obligation: KaminoObligation;
|
|
12
|
+
currentSlot: number;
|
|
13
|
+
}): Decimal;
|
|
14
|
+
export declare function estimateCollNeededForDebtRepayment(props: {
|
|
15
|
+
debtAmount: Decimal;
|
|
16
|
+
priceDebtToColl: Decimal;
|
|
17
|
+
slippagePct: Decimal;
|
|
18
|
+
flashBorrowReserveFlashLoanFeePercentage: Decimal;
|
|
19
|
+
}): Decimal;
|
|
@@ -5,8 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.estimateCollNeededForDebtRepayment = exports.estimateDebtRepaymentWithColl = void 0;
|
|
7
7
|
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
8
|
-
function estimateDebtRepaymentWithColl(
|
|
9
|
-
priceDebtToColl, slippagePct, flashBorrowReserveFlashLoanFeePercentage, kaminoMarket, debtTokenMint, obligation, currentSlot
|
|
8
|
+
function estimateDebtRepaymentWithColl(props) {
|
|
9
|
+
const { collAmount, priceDebtToColl, slippagePct, flashBorrowReserveFlashLoanFeePercentage, kaminoMarket, debtTokenMint, obligation, currentSlot, } = props;
|
|
10
10
|
const slippage = slippagePct.div('100');
|
|
11
11
|
const flashLoanFee = flashBorrowReserveFlashLoanFeePercentage.div('100');
|
|
12
12
|
const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
|
|
@@ -25,8 +25,9 @@ priceDebtToColl, slippagePct, flashBorrowReserveFlashLoanFeePercentage, kaminoMa
|
|
|
25
25
|
return debtIrAdjusted;
|
|
26
26
|
}
|
|
27
27
|
exports.estimateDebtRepaymentWithColl = estimateDebtRepaymentWithColl;
|
|
28
|
-
function estimateCollNeededForDebtRepayment(
|
|
29
|
-
|
|
28
|
+
function estimateCollNeededForDebtRepayment(props) {
|
|
29
|
+
const { debtAmount, // in decimals
|
|
30
|
+
priceDebtToColl, slippagePct, flashBorrowReserveFlashLoanFeePercentage, } = props;
|
|
30
31
|
const slippage = slippagePct.div('100');
|
|
31
32
|
const flashLoanFee = flashBorrowReserveFlashLoanFeePercentage.div('100');
|
|
32
33
|
const debtFlashLoanRepay = debtAmount.mul(new decimal_js_1.default(1.0).add(flashLoanFee));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repay_with_collateral_calcs.js","sourceRoot":"","sources":["../../src/lending_operations/repay_with_collateral_calcs.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAiC;AAIjC,SAAgB,6BAA6B,
|
|
1
|
+
{"version":3,"file":"repay_with_collateral_calcs.js","sourceRoot":"","sources":["../../src/lending_operations/repay_with_collateral_calcs.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAiC;AAIjC,SAAgB,6BAA6B,CAAC,KAS7C;IACC,MAAM,EACJ,UAAU,EACV,eAAe,EACf,WAAW,EACX,wCAAwC,EACxC,YAAY,EACZ,aAAa,EACb,UAAU,EACV,WAAW,GACZ,GAAG,KAAK,CAAC;IACV,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,wCAAwC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,YAAY,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACjE,IAAI,WAAW,KAAK,SAAS,EAAE;QAC7B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;KAC3C;IAED,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC1F,MAAM,uBAAuB,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAEtF,MAAM,oBAAoB,GAAG,UAAU;SACpC,8BAA8B,CAC7B,WAAW,EACX,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,WAAC,OAAA,MAAA,MAAM,CAAC,aAAa,0CAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA,EAAA,CAAE,EAC9F,WAAW,CACZ;SACA,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,oBAAO,CAAC,UAAU,CAAC,CAAC;IAE5F,uHAAuH;IACvH,MAAM,cAAc,GAAG,uBAAuB;SAC3C,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,MAAM,CAAC,CAAC,CAAC;SAClD,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,oBAAO,CAAC,UAAU,CAAC,CAAC;IAE5F,OAAO,cAAc,CAAC;AACxB,CAAC;AA5CD,sEA4CC;AAED,SAAgB,kCAAkC,CAAC,KAKlD;IACC,MAAM,EACJ,UAAU,EAAE,cAAc;IAC1B,eAAe,EACf,WAAW,EACX,wCAAwC,GACzC,GAAG,KAAK,CAAC;IACV,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,wCAAwC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEzE,MAAM,kBAAkB,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAE/F,OAAO,UAAU,CAAC;AACpB,CAAC;AAnBD,gFAmBC","sourcesContent":["import Decimal from 'decimal.js';\nimport { KaminoMarket, KaminoObligation } from '../classes';\nimport { PublicKey } from '@solana/web3.js';\n\nexport function estimateDebtRepaymentWithColl(props: {\n collAmount: Decimal; // in decimals\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n flashBorrowReserveFlashLoanFeePercentage: Decimal;\n kaminoMarket: KaminoMarket;\n debtTokenMint: PublicKey;\n obligation: KaminoObligation;\n currentSlot: number;\n}): Decimal {\n const {\n collAmount,\n priceDebtToColl,\n slippagePct,\n flashBorrowReserveFlashLoanFeePercentage,\n kaminoMarket,\n debtTokenMint,\n obligation,\n currentSlot,\n } = props;\n const slippage = slippagePct.div('100');\n const flashLoanFee = flashBorrowReserveFlashLoanFeePercentage.div('100');\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n if (debtReserve === undefined) {\n throw new Error('Debt reserve not found');\n }\n\n const debtAfterSwap = collAmount.div(new Decimal(1.0).add(slippage)).div(priceDebtToColl);\n const debtAfterFlashLoanRepay = debtAfterSwap.div(new Decimal(1.0).add(flashLoanFee));\n\n const irSlippageBpsForDebt = obligation\n .estimateObligationInterestRate(\n debtReserve,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve.address))!,\n currentSlot\n )\n .toDecimalPlaces(debtReserve.state.liquidity.mintDecimals.toNumber(), Decimal.ROUND_CEIL);\n\n // Estimate slightly more, by adding 1% to IR in order to avoid the case where UI users can repay the max we allow them\n const debtIrAdjusted = debtAfterFlashLoanRepay\n .div(irSlippageBpsForDebt.mul(new Decimal('1.01')))\n .toDecimalPlaces(debtReserve.state.liquidity.mintDecimals.toNumber(), Decimal.ROUND_CEIL);\n\n return debtIrAdjusted;\n}\n\nexport function estimateCollNeededForDebtRepayment(props: {\n debtAmount: Decimal; // in decimals\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n flashBorrowReserveFlashLoanFeePercentage: Decimal;\n}): Decimal {\n const {\n debtAmount, // in decimals\n priceDebtToColl,\n slippagePct,\n flashBorrowReserveFlashLoanFeePercentage,\n } = props;\n const slippage = slippagePct.div('100');\n const flashLoanFee = flashBorrowReserveFlashLoanFeePercentage.div('100');\n\n const debtFlashLoanRepay = debtAmount.mul(new Decimal(1.0).add(flashLoanFee));\n const collToSwap = debtFlashLoanRepay.mul(new Decimal(1.0).add(slippage)).mul(priceDebtToColl);\n\n return collToSwap;\n}\n"]}
|
|
@@ -20,8 +20,9 @@ const web3_js_1 = require("@solana/web3.js");
|
|
|
20
20
|
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
21
21
|
const repayWithCollCalcs = (props) => {
|
|
22
22
|
// Initialize local variables from the props object
|
|
23
|
-
const { repayAmount, priceDebtToColl, slippagePct,
|
|
23
|
+
const { repayAmount, priceDebtToColl, slippagePct, flashLoanFeePct } = props;
|
|
24
24
|
const slippage = slippagePct.div('100');
|
|
25
|
+
const flashLoanFee = flashLoanFeePct.div('100');
|
|
25
26
|
const swapDebtExpectedOut = repayAmount.mul(new decimal_js_1.default(1.0).add(flashLoanFee));
|
|
26
27
|
const collToSwapIn = swapDebtExpectedOut.mul(new decimal_js_1.default(1.0).add(slippage)).mul(priceDebtToColl);
|
|
27
28
|
return {
|
|
@@ -35,7 +36,7 @@ const getRepayWithCollSwapInputs = (props) => {
|
|
|
35
36
|
const { repayAmount, priceDebtToColl, slippagePct, kaminoMarket, debtTokenMint, collTokenMint, obligation, currentSlot, } = props;
|
|
36
37
|
const collReserve = kaminoMarket.getReserveByMint(collTokenMint);
|
|
37
38
|
const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
|
|
38
|
-
const
|
|
39
|
+
const flashLoanFeePct = (debtReserve === null || debtReserve === void 0 ? void 0 : debtReserve.getFlashLoanFee().ceil()) || new decimal_js_1.default(0);
|
|
39
40
|
const irSlippageBpsForDebt = obligation
|
|
40
41
|
.estimateObligationInterestRate(debtReserve, obligation === null || obligation === void 0 ? void 0 : obligation.state.borrows.find((borrow) => { var _a; return (_a = borrow.borrowReserve) === null || _a === void 0 ? void 0 : _a.equals(debtReserve.address); }), currentSlot)
|
|
41
42
|
.toDecimalPlaces(debtReserve === null || debtReserve === void 0 ? void 0 : debtReserve.state.liquidity.mintDecimals.toNumber(), decimal_js_1.default.ROUND_CEIL);
|
|
@@ -47,7 +48,7 @@ const getRepayWithCollSwapInputs = (props) => {
|
|
|
47
48
|
repayAmount: repayAmountIrAdjusted,
|
|
48
49
|
priceDebtToColl,
|
|
49
50
|
slippagePct,
|
|
50
|
-
|
|
51
|
+
flashLoanFeePct: flashLoanFeePct,
|
|
51
52
|
});
|
|
52
53
|
return {
|
|
53
54
|
swapInputs: {
|
|
@@ -66,7 +67,7 @@ const getRepayWithCollIxns = (props) => __awaiter(void 0, void 0, void 0, functi
|
|
|
66
67
|
const collReserve = kaminoMarket.getReserveByMint(collTokenMint);
|
|
67
68
|
const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
|
|
68
69
|
// const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);
|
|
69
|
-
const
|
|
70
|
+
const flashLoanFeePct = (debtReserve === null || debtReserve === void 0 ? void 0 : debtReserve.getFlashLoanFee()) || new decimal_js_1.default(0);
|
|
70
71
|
const irSlippageBpsForDebt = obligation
|
|
71
72
|
.estimateObligationInterestRate(debtReserve, obligation === null || obligation === void 0 ? void 0 : obligation.state.borrows.find((borrow) => { var _a; return (_a = borrow.borrowReserve) === null || _a === void 0 ? void 0 : _a.equals(debtReserve.address); }), currentSlot)
|
|
72
73
|
.toDecimalPlaces(debtReserve === null || debtReserve === void 0 ? void 0 : debtReserve.state.liquidity.mintDecimals.toNumber(), decimal_js_1.default.ROUND_CEIL);
|
|
@@ -78,9 +79,8 @@ const getRepayWithCollIxns = (props) => __awaiter(void 0, void 0, void 0, functi
|
|
|
78
79
|
repayAmount,
|
|
79
80
|
priceDebtToColl,
|
|
80
81
|
slippagePct,
|
|
81
|
-
|
|
82
|
+
flashLoanFeePct,
|
|
82
83
|
});
|
|
83
|
-
console.log('repayWithCollSwapInputs', repayAmount, priceDebtToColl, slippagePct, flashLoanFee);
|
|
84
84
|
console.log('Ops Calcs', (0, leverage_1.toJson)(calcs));
|
|
85
85
|
// // 1. Create atas & budget txns
|
|
86
86
|
const mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve.getCTokenMint()];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repay_with_collateral_operations.js","sourceRoot":"","sources":["../../src/lending_operations/repay_with_collateral_operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { KaminoAction, KaminoMarket, KaminoObligation, numberToLamportsDecimal } from '../classes';\nimport { SwapInputs, SwapIxnsProvider, getFlashLoanInstructions, toJson } from '../leverage';\nimport {\n PublicKeySet,\n U64_MAX,\n getAtasWithCreateIxnsIfMissing,\n getComputeBudgetAndPriorityFeeIxns,\n removeBudgetAndAtaIxns,\n} from '../utils';\nimport { PublicKey, TransactionInstruction } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\n\nexport const repayWithCollCalcs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n flashLoanFee: Decimal;\n}): {\n repayAmount: Decimal;\n collToSwapIn: Decimal;\n swapDebtExpectedOut: Decimal;\n} => {\n // Initialize local variables from the props object\n const { repayAmount, priceDebtToColl, slippagePct, flashLoanFee } = props;\n\n const slippage = slippagePct.div('100');\n\n const swapDebtExpectedOut = repayAmount.mul(new Decimal(1.0).add(flashLoanFee));\n const collToSwapIn = swapDebtExpectedOut.mul(new Decimal(1.0).add(slippage)).mul(priceDebtToColl);\n\n return {\n repayAmount,\n collToSwapIn,\n swapDebtExpectedOut,\n };\n};\n\nexport const getRepayWithCollSwapInputs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n kaminoMarket: KaminoMarket;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n obligation: KaminoObligation;\n currentSlot: number;\n}): {\n swapInputs: SwapInputs;\n} => {\n const {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n kaminoMarket,\n debtTokenMint,\n collTokenMint,\n obligation,\n currentSlot,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const flashLoanFee = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n // add 0.1% to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not repaying enough\n const repayAmountIrAdjusted = repayAmount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const repayCalcs = repayWithCollCalcs({\n repayAmount: repayAmountIrAdjusted,\n priceDebtToColl,\n slippagePct,\n flashLoanFee,\n });\n\n return {\n swapInputs: {\n inputAmountLamports: numberToLamportsDecimal(repayCalcs.collToSwapIn, collReserve!.stats.decimals)\n .ceil()\n .toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n },\n };\n};\n\nexport const getRepayWithCollIxns = async (props: {\n kaminoMarket: KaminoMarket;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n amount: Decimal;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n owner: PublicKey;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n isClosingPosition: boolean;\n obligation: KaminoObligation;\n referrer: PublicKey;\n swapper: SwapIxnsProvider;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n}): Promise<{\n ixns: TransactionInstruction[];\n lookupTablesAddresses: PublicKey[];\n swapInputs: SwapInputs;\n totalKlendAccounts: number;\n}> => {\n const {\n kaminoMarket,\n budgetAndPriorityFeeIxns,\n amount,\n debtTokenMint,\n collTokenMint,\n owner,\n priceDebtToColl,\n slippagePct,\n isClosingPosition,\n obligation,\n referrer,\n swapper,\n currentSlot,\n getTotalKlendAccountsOnly,\n } = props;\n\n const connection = kaminoMarket.getConnection();\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n // const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);\n const flashLoanFee = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n // add 0.1% to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not reapying enough\n const repayAmount = amount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const calcs = repayWithCollCalcs({\n repayAmount,\n priceDebtToColl,\n slippagePct,\n flashLoanFee,\n });\n\n console.log('repayWithCollSwapInputs', repayAmount, priceDebtToColl, slippagePct, flashLoanFee);\n\n console.log('Ops Calcs', toJson(calcs));\n\n // // 1. Create atas & budget txns\n const mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n const {\n atas: [, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, owner, mintsToCreateAtas);\n\n // 1. Flash borrow & repay the debt to repay amount needed\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length,\n walletPublicKey: owner,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: debtReserve!,\n amountLamports: numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor(),\n destinationAta: debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n // 2. Repay using the flash borrowed funds & withdraw collateral to swap and pay the flash loan\n const repayAndWithdrawAction = await KaminoAction.buildRepayAndWithdrawTxns(\n kaminoMarket,\n isClosingPosition ? U64_MAX : numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor().toString(),\n new PublicKey(debtTokenMint),\n isClosingPosition\n ? U64_MAX\n : numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toString(),\n new PublicKey(collTokenMint),\n owner,\n currentSlot,\n obligation,\n 0,\n false,\n undefined,\n undefined,\n isClosingPosition,\n referrer\n );\n\n const ixns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n const uniqueAccounts = new PublicKeySet<PublicKey>([]);\n ixns.forEach((ixn) => {\n ixn.keys.forEach((key) => {\n uniqueAccounts.add(key.pubkey);\n });\n });\n const totalKlendAccounts = uniqueAccounts.toArray().length;\n\n // return early to avoid extra swapper calls\n if (getTotalKlendAccountsOnly) {\n return {\n ixns: [],\n lookupTablesAddresses: [],\n swapInputs: { inputAmountLamports: 0, inputMint: PublicKey.default, outputMint: PublicKey.default },\n totalKlendAccounts: totalKlendAccounts,\n };\n }\n\n console.log(\n 'Expected to swap in',\n calcs.collToSwapIn.toString(),\n 'coll for',\n calcs.swapDebtExpectedOut.toString(),\n 'debt'\n );\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n };\n\n // 3. Swap collateral to debt to repay flash loan\n const [swapIxns, lookupTablesAddresses] = await swapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct.toNumber()\n );\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n return {\n ixns: [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...swapInstructions,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ],\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts,\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"repay_with_collateral_operations.js","sourceRoot":"","sources":["../../src/lending_operations/repay_with_collateral_operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { KaminoAction, KaminoMarket, KaminoObligation, numberToLamportsDecimal } from '../classes';\nimport { SwapInputs, SwapIxnsProvider, getFlashLoanInstructions, toJson } from '../leverage';\nimport {\n PublicKeySet,\n U64_MAX,\n getAtasWithCreateIxnsIfMissing,\n getComputeBudgetAndPriorityFeeIxns,\n removeBudgetAndAtaIxns,\n} from '../utils';\nimport { PublicKey, TransactionInstruction } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\n\nexport const repayWithCollCalcs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n flashLoanFeePct: Decimal;\n}): {\n repayAmount: Decimal;\n collToSwapIn: Decimal;\n swapDebtExpectedOut: Decimal;\n} => {\n // Initialize local variables from the props object\n const { repayAmount, priceDebtToColl, slippagePct, flashLoanFeePct } = props;\n\n const slippage = slippagePct.div('100');\n const flashLoanFee = flashLoanFeePct.div('100');\n\n const swapDebtExpectedOut = repayAmount.mul(new Decimal(1.0).add(flashLoanFee));\n const collToSwapIn = swapDebtExpectedOut.mul(new Decimal(1.0).add(slippage)).mul(priceDebtToColl);\n\n return {\n repayAmount,\n collToSwapIn,\n swapDebtExpectedOut,\n };\n};\n\nexport const getRepayWithCollSwapInputs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n kaminoMarket: KaminoMarket;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n obligation: KaminoObligation;\n currentSlot: number;\n}): {\n swapInputs: SwapInputs;\n} => {\n const {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n kaminoMarket,\n debtTokenMint,\n collTokenMint,\n obligation,\n currentSlot,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const flashLoanFeePct = debtReserve?.getFlashLoanFee().ceil() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n // add 0.1% to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not repaying enough\n const repayAmountIrAdjusted = repayAmount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const repayCalcs = repayWithCollCalcs({\n repayAmount: repayAmountIrAdjusted,\n priceDebtToColl,\n slippagePct,\n flashLoanFeePct: flashLoanFeePct,\n });\n\n return {\n swapInputs: {\n inputAmountLamports: numberToLamportsDecimal(repayCalcs.collToSwapIn, collReserve!.stats.decimals)\n .ceil()\n .toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n },\n };\n};\n\nexport const getRepayWithCollIxns = async (props: {\n kaminoMarket: KaminoMarket;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n amount: Decimal;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n owner: PublicKey;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n isClosingPosition: boolean;\n obligation: KaminoObligation;\n referrer: PublicKey;\n swapper: SwapIxnsProvider;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n}): Promise<{\n ixns: TransactionInstruction[];\n lookupTablesAddresses: PublicKey[];\n swapInputs: SwapInputs;\n totalKlendAccounts: number;\n}> => {\n const {\n kaminoMarket,\n budgetAndPriorityFeeIxns,\n amount,\n debtTokenMint,\n collTokenMint,\n owner,\n priceDebtToColl,\n slippagePct,\n isClosingPosition,\n obligation,\n referrer,\n swapper,\n currentSlot,\n getTotalKlendAccountsOnly,\n } = props;\n\n const connection = kaminoMarket.getConnection();\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n // const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);\n const flashLoanFeePct = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n // add 0.1% to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not reapying enough\n const repayAmount = amount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const calcs = repayWithCollCalcs({\n repayAmount,\n priceDebtToColl,\n slippagePct,\n flashLoanFeePct,\n });\n\n console.log('Ops Calcs', toJson(calcs));\n\n // // 1. Create atas & budget txns\n const mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n const {\n atas: [, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, owner, mintsToCreateAtas);\n\n // 1. Flash borrow & repay the debt to repay amount needed\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length,\n walletPublicKey: owner,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: debtReserve!,\n amountLamports: numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor(),\n destinationAta: debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n // 2. Repay using the flash borrowed funds & withdraw collateral to swap and pay the flash loan\n const repayAndWithdrawAction = await KaminoAction.buildRepayAndWithdrawTxns(\n kaminoMarket,\n isClosingPosition ? U64_MAX : numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor().toString(),\n new PublicKey(debtTokenMint),\n isClosingPosition\n ? U64_MAX\n : numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toString(),\n new PublicKey(collTokenMint),\n owner,\n currentSlot,\n obligation,\n 0,\n false,\n undefined,\n undefined,\n isClosingPosition,\n referrer\n );\n\n const ixns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n const uniqueAccounts = new PublicKeySet<PublicKey>([]);\n ixns.forEach((ixn) => {\n ixn.keys.forEach((key) => {\n uniqueAccounts.add(key.pubkey);\n });\n });\n const totalKlendAccounts = uniqueAccounts.toArray().length;\n\n // return early to avoid extra swapper calls\n if (getTotalKlendAccountsOnly) {\n return {\n ixns: [],\n lookupTablesAddresses: [],\n swapInputs: { inputAmountLamports: 0, inputMint: PublicKey.default, outputMint: PublicKey.default },\n totalKlendAccounts: totalKlendAccounts,\n };\n }\n\n console.log(\n 'Expected to swap in',\n calcs.collToSwapIn.toString(),\n 'coll for',\n calcs.swapDebtExpectedOut.toString(),\n 'debt'\n );\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n };\n\n // 3. Swap collateral to debt to repay flash loan\n const [swapIxns, lookupTablesAddresses] = await swapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct.toNumber()\n );\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n return {\n ixns: [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...swapInstructions,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ],\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts,\n };\n};\n"]}
|
|
@@ -141,6 +141,7 @@ const getUserLookupTableAddresses = (kaminoMarket, user, referrer, multiplyMints
|
|
|
141
141
|
if (repayWithCollObligation) {
|
|
142
142
|
const repayWithCollFarmUserStates = getRepayWithCollObligationFarmStateAddresses(kaminoMarket, repayWithCollObligation);
|
|
143
143
|
addresses.push(...repayWithCollFarmUserStates);
|
|
144
|
+
addresses.push({ address: repayWithCollObligation.obligationAddress, log: 'repay with coll obligation' });
|
|
144
145
|
}
|
|
145
146
|
return addresses;
|
|
146
147
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userMetadata.js","sourceRoot":"","sources":["../../src/utils/userMetadata.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n PublicKey,\n TransactionInstruction,\n SYSVAR_RENT_PUBKEY,\n SystemProgram,\n Connection,\n GetProgramAccountsFilter,\n} from '@solana/web3.js';\nimport { KaminoMarket, KaminoObligation } from '../classes';\nimport {\n LeverageObligation,\n MultiplyObligation,\n WRAPPED_SOL_MINT,\n createLookupTableIx,\n extendLookupTableIxs,\n getAssociatedTokenAddress,\n initUserMetadata,\n referrerTokenStatePda,\n userMetadataPda,\n isNotNullPubkey,\n UserMetadata,\n PublicKeySet,\n} from '../lib';\nimport { farmsId } from '@hubbleprotocol/farms-sdk';\nimport { KaminoReserve } from '../classes/reserve';\n\nexport type KaminoUserMetadata = {\n address: PublicKey;\n state: UserMetadata;\n};\n\nexport const getUserLutAddressAndSetupIxns = async (\n kaminoMarket: KaminoMarket,\n user: PublicKey,\n referrer: PublicKey = PublicKey.default,\n withExtendLut: boolean = true,\n multiplyMints: { coll: PublicKey; debt: PublicKey }[] = [],\n leverageMints: { coll: PublicKey; debt: PublicKey }[] = [],\n repayWithCollObligation: KaminoObligation | undefined = undefined,\n payer: PublicKey = PublicKey.default\n): Promise<[PublicKey, TransactionInstruction[][]]> => {\n const [userMetadataAddress, userMetadataState] = await kaminoMarket.getUserMetadata(user);\n const initUserMetadataIxs: TransactionInstruction[] = [];\n let userLookupTableAddress: PublicKey;\n\n const referrerUserMetadata = referrer.equals(PublicKey.default)\n ? kaminoMarket.programId\n : (await kaminoMarket.getUserMetadata(referrer))[0];\n\n if (!userMetadataState) {\n const [createLutIx, lookupTableAddress] = await createLookupTableIx(kaminoMarket.getConnection(), user);\n userLookupTableAddress = lookupTableAddress;\n initUserMetadataIxs.push(createLutIx);\n initUserMetadataIxs.push(\n initUserMetadata(\n {\n userLookupTable: lookupTableAddress,\n },\n {\n owner: user,\n feePayer: payer.equals(PublicKey.default) ? user : payer,\n userMetadata: userMetadataAddress,\n referrerUserMetadata: referrerUserMetadata,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n },\n kaminoMarket.programId\n )\n );\n } else {\n userLookupTableAddress = userMetadataState.userLookupTable;\n }\n\n const setupUserMetadataIxs = [initUserMetadataIxs];\n\n if (withExtendLut) {\n const dedupUserLutAddresses = await getDedupUserLookupTableAddresses(\n kaminoMarket,\n userLookupTableAddress,\n user,\n referrer,\n multiplyMints,\n leverageMints,\n userMetadataState !== null,\n repayWithCollObligation\n );\n\n const extendLookupTableChunkIxs = extendLookupTableIxs(user, userLookupTableAddress, dedupUserLutAddresses, payer);\n\n for (const extendLutIx of extendLookupTableChunkIxs) {\n setupUserMetadataIxs.push([extendLutIx]);\n }\n }\n\n return [userLookupTableAddress, setupUserMetadataIxs];\n};\n\nconst getDedupUserLookupTableAddresses = async (\n kaminoMarket: KaminoMarket,\n table_pk: PublicKey,\n user: PublicKey,\n referrer: PublicKey,\n multiplyMints: { coll: PublicKey; debt: PublicKey }[] = [],\n leverageMints: { coll: PublicKey; debt: PublicKey }[] = [],\n tableExists: boolean,\n repayWithCollObligation: KaminoObligation | undefined = undefined\n): Promise<PublicKey[]> => {\n const requiredAddresses = await getUserLookupTableAddresses(\n kaminoMarket,\n user,\n referrer,\n multiplyMints,\n leverageMints,\n repayWithCollObligation\n );\n\n if (tableExists) {\n const userLookupTable = (await kaminoMarket.getConnection().getAddressLookupTable(table_pk)).value?.state!;\n const addressesAndLogsNotInLut = requiredAddresses.filter(\n (addressAndLogs) => userLookupTable.addresses.filter((a) => a.equals(addressAndLogs.address)).length === 0\n );\n console.log('Addresses to be added in LUT:');\n const addressNotInLut = addressesAndLogsNotInLut.map((addressAndLogs) => {\n console.log(addressAndLogs.log);\n return addressAndLogs.address;\n });\n return new PublicKeySet(addressNotInLut).toArray();\n } else {\n const addressNotInLut = requiredAddresses.map((addressAndLogs) => {\n console.log(addressAndLogs.log);\n return addressAndLogs.address;\n });\n return new PublicKeySet(addressNotInLut).toArray();\n }\n};\n\nconst getUserLookupTableAddresses = async (\n kaminoMarket: KaminoMarket,\n user: PublicKey,\n referrer: PublicKey,\n multiplyMints: { coll: PublicKey; debt: PublicKey }[] = [],\n leverageMints: { coll: PublicKey; debt: PublicKey }[] = [],\n repayWithCollObligation: KaminoObligation | undefined = undefined\n): Promise<{ address: PublicKey; log: string }[]> => {\n const addresses: { address: PublicKey; log: string }[] = [];\n addresses.push({ address: user, log: 'user address' });\n const [userMetadataAddress] = userMetadataPda(user, kaminoMarket.programId);\n addresses.push({ address: userMetadataAddress, log: 'userMetadata address' });\n\n const allMints: PublicKey[] = [];\n multiplyMints.forEach(({ coll: collMint, debt: debtMint }) => {\n allMints.push(collMint);\n allMints.push(debtMint);\n });\n leverageMints.forEach(({ coll: collMint, debt: debtMint }) => {\n allMints.push(collMint);\n allMints.push(debtMint);\n });\n\n if (repayWithCollObligation) {\n repayWithCollObligation.borrows.forEach((borrow) => {\n allMints.push(borrow.mintAddress);\n });\n\n repayWithCollObligation.deposits.forEach((deposit) => {\n allMints.push(deposit.mintAddress);\n });\n }\n\n const dedupMints = [...new PublicKeySet(allMints).toArray()];\n const reserves: KaminoReserve[] = [];\n dedupMints.forEach((mint) => {\n const kaminoReserve = kaminoMarket.getReserveByMint(mint);\n if (kaminoReserve) {\n reserves.push(kaminoReserve);\n }\n });\n\n // reserve mint ATAs\n const mintsAtas: { address: PublicKey; log: string }[] = await Promise.all(\n dedupMints.map(async (mint) => {\n return { address: await getAssociatedTokenAddress(mint, user), log: 'ata for mint ' + mint.toString() };\n })\n );\n addresses.push(...mintsAtas);\n // ctoken ATAs\n const ctokenMintsAtas: { address: PublicKey; log: string }[] = await Promise.all(\n reserves.map(async (reserve) => {\n const ctokenMint = reserve.getCTokenMint();\n return {\n address: await getAssociatedTokenAddress(ctokenMint, user),\n log: 'ctoken ata for reserve ' + reserve.address.toString(),\n };\n })\n );\n addresses.push(...ctokenMintsAtas);\n // farm states\n const farmCollateralStates: PublicKey[] = reserves.map((reserve) => reserve.state.farmCollateral);\n const farmDebtStates: PublicKey[] = reserves.map((reserve) => reserve.state.farmDebt);\n const farmStates = new PublicKeySet(\n farmCollateralStates.concat(farmDebtStates).filter((address) => isNotNullPubkey(address))\n );\n const farmStatesAdressesAndLogs = farmStates.toArray().map((address) => {\n return { address: address, log: 'farm state' };\n });\n addresses.push(...farmStatesAdressesAndLogs);\n // referrer token states\n const referrerTokenStates: { address: PublicKey; log: string }[] = reserves.map((reserve) => {\n return {\n address: referrerTokenStatePda(referrer, reserve.address, kaminoMarket.programId)[0],\n log: 'referrer token state for reserve ' + reserve.address,\n };\n });\n if (!referrer.equals(PublicKey.default)) {\n addresses.push(...referrerTokenStates);\n }\n\n const [multiplyObligations, multiplyObligationsFarmUserStates] = getMultiplyObligationAndObligationFarmStateAddresses(\n kaminoMarket,\n user,\n multiplyMints\n );\n\n addresses.push(...multiplyObligations);\n addresses.push(...multiplyObligationsFarmUserStates);\n\n const [leverageObligations, leverageObligationsFarmUserStates] = getLeverageObligationAndObligationFarmStateAddresses(\n kaminoMarket,\n user,\n leverageMints\n );\n\n addresses.push(...leverageObligations);\n addresses.push(...leverageObligationsFarmUserStates);\n\n if (repayWithCollObligation) {\n const repayWithCollFarmUserStates = getRepayWithCollObligationFarmStateAddresses(\n kaminoMarket,\n repayWithCollObligation\n );\n addresses.push(...repayWithCollFarmUserStates);\n }\n\n return addresses;\n};\n\nfunction getMultiplyObligationAndObligationFarmStateAddresses(\n kaminoMarket: KaminoMarket,\n user: PublicKey,\n mints: { coll: PublicKey; debt: PublicKey }[]\n): [{ address: PublicKey; log: string }[], { address: PublicKey; log: string }[]] {\n const obligationPdas: { address: PublicKey; log: string }[] = [];\n const farmUserStates: { address: PublicKey; log: string }[] = [];\n\n for (const { coll: collMint, debt: debtMint } of mints) {\n const collReserve = kaminoMarket.getReserveByMint(collMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtMint);\n const collMintString = collMint.toString();\n const debtMintString = debtMint.toString();\n if (collReserve && debtReserve) {\n const multiplyObligation = new MultiplyObligation(collMint, WRAPPED_SOL_MINT, kaminoMarket.programId);\n obligationPdas.push({\n address: multiplyObligation.toPda(kaminoMarket.getAddress(), user),\n log: 'multiply obligation coll: ' + collMintString + ' debt: ' + debtMintString,\n });\n if (!collReserve.state.farmCollateral.equals(PublicKey.default)) {\n farmUserStates.push({\n address: getPdaFarmsUserState(\n collReserve.state.farmCollateral!,\n multiplyObligation.toPda(kaminoMarket.getAddress(), user)\n ),\n log: 'collReserve farmState for multiply obligation coll: ' + collMintString + ' debt: ' + debtMintString,\n });\n }\n if (!debtReserve.state.farmDebt.equals(PublicKey.default)) {\n farmUserStates.push({\n address: getPdaFarmsUserState(\n debtReserve.state.farmDebt!,\n multiplyObligation.toPda(kaminoMarket.getAddress(), user)\n ),\n log: 'debtReserve farmState for multiply obligation coll: ' + collMintString + ' debt: ' + debtMintString,\n });\n }\n }\n }\n\n return [obligationPdas, farmUserStates];\n}\n\nfunction getLeverageObligationAndObligationFarmStateAddresses(\n kaminoMarket: KaminoMarket,\n user: PublicKey,\n mints: { coll: PublicKey; debt: PublicKey }[]\n): [{ address: PublicKey; log: string }[], { address: PublicKey; log: string }[]] {\n const obligationPdas: { address: PublicKey; log: string }[] = [];\n const farmUserStates: { address: PublicKey; log: string }[] = [];\n\n for (const { coll: collMint, debt: debtMint } of mints) {\n const collReserve = kaminoMarket.getReserveByMint(collMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtMint);\n const collMintString = collMint.toString();\n const debtMintString = debtMint.toString();\n if (collReserve && debtReserve) {\n const leverageObligation = new LeverageObligation(collMint, debtMint, kaminoMarket.programId);\n obligationPdas.push({\n address: leverageObligation.toPda(kaminoMarket.getAddress(), user),\n log: 'leverage obligation coll: ' + collMintString + ' debt: ' + debtMintString,\n });\n if (!collReserve.state.farmCollateral.equals(PublicKey.default)) {\n farmUserStates.push({\n address: getPdaFarmsUserState(\n collReserve.state.farmCollateral!,\n leverageObligation.toPda(kaminoMarket.getAddress(), user)\n ),\n log: 'collReserve farmState for leverage obligation coll: ' + collMintString + ' debt: ' + debtMintString,\n });\n }\n if (!debtReserve.state.farmDebt.equals(PublicKey.default)) {\n farmUserStates.push({\n address: getPdaFarmsUserState(\n debtReserve.state.farmDebt!,\n leverageObligation.toPda(kaminoMarket.getAddress(), user)\n ),\n log: 'debtReserve farmState for leverage obligation coll: ' + collMintString + ' debt: ' + debtMintString,\n });\n }\n }\n }\n\n return [obligationPdas, farmUserStates];\n}\n\nfunction getRepayWithCollObligationFarmStateAddresses(\n kaminoMarket: KaminoMarket,\n obligation: KaminoObligation\n): { address: PublicKey; log: string }[] {\n const farmUserStates: { address: PublicKey; log: string }[] = [];\n const obligationString = obligation.obligationAddress.toString();\n\n obligation.borrows.forEach((borrow) => {\n const borrowReserve = kaminoMarket.getReserveByMint(borrow.mintAddress)!;\n if (!borrowReserve.state.farmDebt.equals(PublicKey.default)) {\n farmUserStates.push({\n address: getPdaFarmsUserState(borrowReserve.state.farmDebt!, obligation.obligationAddress),\n log: 'debtReserve farmState for vanilla obligation: ' + obligationString,\n });\n }\n });\n\n obligation.deposits.forEach((deposit) => {\n const depositReserve = kaminoMarket.getReserveByMint(deposit.mintAddress)!;\n if (!depositReserve.state.farmCollateral.equals(PublicKey.default)) {\n farmUserStates.push({\n address: getPdaFarmsUserState(depositReserve.state.farmCollateral!, obligation.obligationAddress),\n log: 'collReserve farmState for vanilla obligation' + obligationString,\n });\n }\n });\n\n return farmUserStates;\n}\n\nconst BASE_SEED_USER_STATE = Buffer.from('user');\n\nconst getPdaFarmsUserState = (farm: PublicKey, obligation: PublicKey) =>\n PublicKey.findProgramAddressSync([BASE_SEED_USER_STATE, farm.toBytes(), obligation.toBytes()], farmsId)[0];\n\nexport async function getAllUserMetadatasWithFilter(\n connection: Connection,\n filter: GetProgramAccountsFilter[],\n programId: PublicKey\n): Promise<KaminoUserMetadata[]> {\n const filters = [\n {\n dataSize: UserMetadata.layout.span + 8,\n },\n ...filter,\n ];\n\n const userMetadatas = await connection.getProgramAccounts(programId, {\n filters,\n });\n\n return userMetadatas.map((userMetadata) => {\n if (userMetadata.account === null) {\n throw new Error('Invalid account');\n }\n if (!userMetadata.account.owner.equals(programId)) {\n throw new Error(\"account doesn't belong to this program\");\n }\n\n const userMetadataAccount = UserMetadata.decode(userMetadata.account.data);\n\n if (!userMetadataAccount) {\n throw Error('Could not parse user metadata.');\n }\n\n return { address: userMetadata.pubkey, state: userMetadataAccount };\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"userMetadata.js","sourceRoot":"","sources":["../../src/utils/userMetadata.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n PublicKey,\n TransactionInstruction,\n SYSVAR_RENT_PUBKEY,\n SystemProgram,\n Connection,\n GetProgramAccountsFilter,\n} from '@solana/web3.js';\nimport { KaminoMarket, KaminoObligation } from '../classes';\nimport {\n LeverageObligation,\n MultiplyObligation,\n WRAPPED_SOL_MINT,\n createLookupTableIx,\n extendLookupTableIxs,\n getAssociatedTokenAddress,\n initUserMetadata,\n referrerTokenStatePda,\n userMetadataPda,\n isNotNullPubkey,\n UserMetadata,\n PublicKeySet,\n} from '../lib';\nimport { farmsId } from '@hubbleprotocol/farms-sdk';\nimport { KaminoReserve } from '../classes/reserve';\n\nexport type KaminoUserMetadata = {\n address: PublicKey;\n state: UserMetadata;\n};\n\nexport const getUserLutAddressAndSetupIxns = async (\n kaminoMarket: KaminoMarket,\n user: PublicKey,\n referrer: PublicKey = PublicKey.default,\n withExtendLut: boolean = true,\n multiplyMints: { coll: PublicKey; debt: PublicKey }[] = [],\n leverageMints: { coll: PublicKey; debt: PublicKey }[] = [],\n repayWithCollObligation: KaminoObligation | undefined = undefined,\n payer: PublicKey = PublicKey.default\n): Promise<[PublicKey, TransactionInstruction[][]]> => {\n const [userMetadataAddress, userMetadataState] = await kaminoMarket.getUserMetadata(user);\n const initUserMetadataIxs: TransactionInstruction[] = [];\n let userLookupTableAddress: PublicKey;\n\n const referrerUserMetadata = referrer.equals(PublicKey.default)\n ? kaminoMarket.programId\n : (await kaminoMarket.getUserMetadata(referrer))[0];\n\n if (!userMetadataState) {\n const [createLutIx, lookupTableAddress] = await createLookupTableIx(kaminoMarket.getConnection(), user);\n userLookupTableAddress = lookupTableAddress;\n initUserMetadataIxs.push(createLutIx);\n initUserMetadataIxs.push(\n initUserMetadata(\n {\n userLookupTable: lookupTableAddress,\n },\n {\n owner: user,\n feePayer: payer.equals(PublicKey.default) ? user : payer,\n userMetadata: userMetadataAddress,\n referrerUserMetadata: referrerUserMetadata,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n },\n kaminoMarket.programId\n )\n );\n } else {\n userLookupTableAddress = userMetadataState.userLookupTable;\n }\n\n const setupUserMetadataIxs = [initUserMetadataIxs];\n\n if (withExtendLut) {\n const dedupUserLutAddresses = await getDedupUserLookupTableAddresses(\n kaminoMarket,\n userLookupTableAddress,\n user,\n referrer,\n multiplyMints,\n leverageMints,\n userMetadataState !== null,\n repayWithCollObligation\n );\n\n const extendLookupTableChunkIxs = extendLookupTableIxs(user, userLookupTableAddress, dedupUserLutAddresses, payer);\n\n for (const extendLutIx of extendLookupTableChunkIxs) {\n setupUserMetadataIxs.push([extendLutIx]);\n }\n }\n\n return [userLookupTableAddress, setupUserMetadataIxs];\n};\n\nconst getDedupUserLookupTableAddresses = async (\n kaminoMarket: KaminoMarket,\n table_pk: PublicKey,\n user: PublicKey,\n referrer: PublicKey,\n multiplyMints: { coll: PublicKey; debt: PublicKey }[] = [],\n leverageMints: { coll: PublicKey; debt: PublicKey }[] = [],\n tableExists: boolean,\n repayWithCollObligation: KaminoObligation | undefined = undefined\n): Promise<PublicKey[]> => {\n const requiredAddresses = await getUserLookupTableAddresses(\n kaminoMarket,\n user,\n referrer,\n multiplyMints,\n leverageMints,\n repayWithCollObligation\n );\n\n if (tableExists) {\n const userLookupTable = (await kaminoMarket.getConnection().getAddressLookupTable(table_pk)).value?.state!;\n const addressesAndLogsNotInLut = requiredAddresses.filter(\n (addressAndLogs) => userLookupTable.addresses.filter((a) => a.equals(addressAndLogs.address)).length === 0\n );\n console.log('Addresses to be added in LUT:');\n const addressNotInLut = addressesAndLogsNotInLut.map((addressAndLogs) => {\n console.log(addressAndLogs.log);\n return addressAndLogs.address;\n });\n return new PublicKeySet(addressNotInLut).toArray();\n } else {\n const addressNotInLut = requiredAddresses.map((addressAndLogs) => {\n console.log(addressAndLogs.log);\n return addressAndLogs.address;\n });\n return new PublicKeySet(addressNotInLut).toArray();\n }\n};\n\nconst getUserLookupTableAddresses = async (\n kaminoMarket: KaminoMarket,\n user: PublicKey,\n referrer: PublicKey,\n multiplyMints: { coll: PublicKey; debt: PublicKey }[] = [],\n leverageMints: { coll: PublicKey; debt: PublicKey }[] = [],\n repayWithCollObligation: KaminoObligation | undefined = undefined\n): Promise<{ address: PublicKey; log: string }[]> => {\n const addresses: { address: PublicKey; log: string }[] = [];\n addresses.push({ address: user, log: 'user address' });\n const [userMetadataAddress] = userMetadataPda(user, kaminoMarket.programId);\n addresses.push({ address: userMetadataAddress, log: 'userMetadata address' });\n\n const allMints: PublicKey[] = [];\n multiplyMints.forEach(({ coll: collMint, debt: debtMint }) => {\n allMints.push(collMint);\n allMints.push(debtMint);\n });\n leverageMints.forEach(({ coll: collMint, debt: debtMint }) => {\n allMints.push(collMint);\n allMints.push(debtMint);\n });\n\n if (repayWithCollObligation) {\n repayWithCollObligation.borrows.forEach((borrow) => {\n allMints.push(borrow.mintAddress);\n });\n\n repayWithCollObligation.deposits.forEach((deposit) => {\n allMints.push(deposit.mintAddress);\n });\n }\n\n const dedupMints = [...new PublicKeySet(allMints).toArray()];\n const reserves: KaminoReserve[] = [];\n dedupMints.forEach((mint) => {\n const kaminoReserve = kaminoMarket.getReserveByMint(mint);\n if (kaminoReserve) {\n reserves.push(kaminoReserve);\n }\n });\n\n // reserve mint ATAs\n const mintsAtas: { address: PublicKey; log: string }[] = await Promise.all(\n dedupMints.map(async (mint) => {\n return { address: await getAssociatedTokenAddress(mint, user), log: 'ata for mint ' + mint.toString() };\n })\n );\n addresses.push(...mintsAtas);\n // ctoken ATAs\n const ctokenMintsAtas: { address: PublicKey; log: string }[] = await Promise.all(\n reserves.map(async (reserve) => {\n const ctokenMint = reserve.getCTokenMint();\n return {\n address: await getAssociatedTokenAddress(ctokenMint, user),\n log: 'ctoken ata for reserve ' + reserve.address.toString(),\n };\n })\n );\n addresses.push(...ctokenMintsAtas);\n // farm states\n const farmCollateralStates: PublicKey[] = reserves.map((reserve) => reserve.state.farmCollateral);\n const farmDebtStates: PublicKey[] = reserves.map((reserve) => reserve.state.farmDebt);\n const farmStates = new PublicKeySet(\n farmCollateralStates.concat(farmDebtStates).filter((address) => isNotNullPubkey(address))\n );\n const farmStatesAdressesAndLogs = farmStates.toArray().map((address) => {\n return { address: address, log: 'farm state' };\n });\n addresses.push(...farmStatesAdressesAndLogs);\n // referrer token states\n const referrerTokenStates: { address: PublicKey; log: string }[] = reserves.map((reserve) => {\n return {\n address: referrerTokenStatePda(referrer, reserve.address, kaminoMarket.programId)[0],\n log: 'referrer token state for reserve ' + reserve.address,\n };\n });\n if (!referrer.equals(PublicKey.default)) {\n addresses.push(...referrerTokenStates);\n }\n\n const [multiplyObligations, multiplyObligationsFarmUserStates] = getMultiplyObligationAndObligationFarmStateAddresses(\n kaminoMarket,\n user,\n multiplyMints\n );\n\n addresses.push(...multiplyObligations);\n addresses.push(...multiplyObligationsFarmUserStates);\n\n const [leverageObligations, leverageObligationsFarmUserStates] = getLeverageObligationAndObligationFarmStateAddresses(\n kaminoMarket,\n user,\n leverageMints\n );\n\n addresses.push(...leverageObligations);\n addresses.push(...leverageObligationsFarmUserStates);\n\n if (repayWithCollObligation) {\n const repayWithCollFarmUserStates = getRepayWithCollObligationFarmStateAddresses(\n kaminoMarket,\n repayWithCollObligation\n );\n addresses.push(...repayWithCollFarmUserStates);\n addresses.push({ address: repayWithCollObligation.obligationAddress, log: 'repay with coll obligation' });\n }\n\n return addresses;\n};\n\nfunction getMultiplyObligationAndObligationFarmStateAddresses(\n kaminoMarket: KaminoMarket,\n user: PublicKey,\n mints: { coll: PublicKey; debt: PublicKey }[]\n): [{ address: PublicKey; log: string }[], { address: PublicKey; log: string }[]] {\n const obligationPdas: { address: PublicKey; log: string }[] = [];\n const farmUserStates: { address: PublicKey; log: string }[] = [];\n\n for (const { coll: collMint, debt: debtMint } of mints) {\n const collReserve = kaminoMarket.getReserveByMint(collMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtMint);\n const collMintString = collMint.toString();\n const debtMintString = debtMint.toString();\n if (collReserve && debtReserve) {\n const multiplyObligation = new MultiplyObligation(collMint, WRAPPED_SOL_MINT, kaminoMarket.programId);\n obligationPdas.push({\n address: multiplyObligation.toPda(kaminoMarket.getAddress(), user),\n log: 'multiply obligation coll: ' + collMintString + ' debt: ' + debtMintString,\n });\n if (!collReserve.state.farmCollateral.equals(PublicKey.default)) {\n farmUserStates.push({\n address: getPdaFarmsUserState(\n collReserve.state.farmCollateral!,\n multiplyObligation.toPda(kaminoMarket.getAddress(), user)\n ),\n log: 'collReserve farmState for multiply obligation coll: ' + collMintString + ' debt: ' + debtMintString,\n });\n }\n if (!debtReserve.state.farmDebt.equals(PublicKey.default)) {\n farmUserStates.push({\n address: getPdaFarmsUserState(\n debtReserve.state.farmDebt!,\n multiplyObligation.toPda(kaminoMarket.getAddress(), user)\n ),\n log: 'debtReserve farmState for multiply obligation coll: ' + collMintString + ' debt: ' + debtMintString,\n });\n }\n }\n }\n\n return [obligationPdas, farmUserStates];\n}\n\nfunction getLeverageObligationAndObligationFarmStateAddresses(\n kaminoMarket: KaminoMarket,\n user: PublicKey,\n mints: { coll: PublicKey; debt: PublicKey }[]\n): [{ address: PublicKey; log: string }[], { address: PublicKey; log: string }[]] {\n const obligationPdas: { address: PublicKey; log: string }[] = [];\n const farmUserStates: { address: PublicKey; log: string }[] = [];\n\n for (const { coll: collMint, debt: debtMint } of mints) {\n const collReserve = kaminoMarket.getReserveByMint(collMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtMint);\n const collMintString = collMint.toString();\n const debtMintString = debtMint.toString();\n if (collReserve && debtReserve) {\n const leverageObligation = new LeverageObligation(collMint, debtMint, kaminoMarket.programId);\n obligationPdas.push({\n address: leverageObligation.toPda(kaminoMarket.getAddress(), user),\n log: 'leverage obligation coll: ' + collMintString + ' debt: ' + debtMintString,\n });\n if (!collReserve.state.farmCollateral.equals(PublicKey.default)) {\n farmUserStates.push({\n address: getPdaFarmsUserState(\n collReserve.state.farmCollateral!,\n leverageObligation.toPda(kaminoMarket.getAddress(), user)\n ),\n log: 'collReserve farmState for leverage obligation coll: ' + collMintString + ' debt: ' + debtMintString,\n });\n }\n if (!debtReserve.state.farmDebt.equals(PublicKey.default)) {\n farmUserStates.push({\n address: getPdaFarmsUserState(\n debtReserve.state.farmDebt!,\n leverageObligation.toPda(kaminoMarket.getAddress(), user)\n ),\n log: 'debtReserve farmState for leverage obligation coll: ' + collMintString + ' debt: ' + debtMintString,\n });\n }\n }\n }\n\n return [obligationPdas, farmUserStates];\n}\n\nfunction getRepayWithCollObligationFarmStateAddresses(\n kaminoMarket: KaminoMarket,\n obligation: KaminoObligation\n): { address: PublicKey; log: string }[] {\n const farmUserStates: { address: PublicKey; log: string }[] = [];\n const obligationString = obligation.obligationAddress.toString();\n\n obligation.borrows.forEach((borrow) => {\n const borrowReserve = kaminoMarket.getReserveByMint(borrow.mintAddress)!;\n if (!borrowReserve.state.farmDebt.equals(PublicKey.default)) {\n farmUserStates.push({\n address: getPdaFarmsUserState(borrowReserve.state.farmDebt!, obligation.obligationAddress),\n log: 'debtReserve farmState for vanilla obligation: ' + obligationString,\n });\n }\n });\n\n obligation.deposits.forEach((deposit) => {\n const depositReserve = kaminoMarket.getReserveByMint(deposit.mintAddress)!;\n if (!depositReserve.state.farmCollateral.equals(PublicKey.default)) {\n farmUserStates.push({\n address: getPdaFarmsUserState(depositReserve.state.farmCollateral!, obligation.obligationAddress),\n log: 'collReserve farmState for vanilla obligation' + obligationString,\n });\n }\n });\n\n return farmUserStates;\n}\n\nconst BASE_SEED_USER_STATE = Buffer.from('user');\n\nconst getPdaFarmsUserState = (farm: PublicKey, obligation: PublicKey) =>\n PublicKey.findProgramAddressSync([BASE_SEED_USER_STATE, farm.toBytes(), obligation.toBytes()], farmsId)[0];\n\nexport async function getAllUserMetadatasWithFilter(\n connection: Connection,\n filter: GetProgramAccountsFilter[],\n programId: PublicKey\n): Promise<KaminoUserMetadata[]> {\n const filters = [\n {\n dataSize: UserMetadata.layout.span + 8,\n },\n ...filter,\n ];\n\n const userMetadatas = await connection.getProgramAccounts(programId, {\n filters,\n });\n\n return userMetadatas.map((userMetadata) => {\n if (userMetadata.account === null) {\n throw new Error('Invalid account');\n }\n if (!userMetadata.account.owner.equals(programId)) {\n throw new Error(\"account doesn't belong to this program\");\n }\n\n const userMetadataAccount = UserMetadata.decode(userMetadata.account.data);\n\n if (!userMetadataAccount) {\n throw Error('Could not parse user metadata.');\n }\n\n return { address: userMetadata.pubkey, state: userMetadataAccount };\n });\n}\n"]}
|