@kamino-finance/klend-sdk
Version:
Typescript SDK for interacting with the Kamino Lending (klend) protocol
256 lines • 11.4 kB
TypeScript
import { Address, Instruction, Slot, TransactionSigner, Rpc, GetMinimumBalanceForRentExemptionApi, Option, GetProgramAccountsApi, GetAccountInfoApi, GetMultipleAccountsApi } from '@solana/kit';
import Decimal from 'decimal.js';
import { AllOracleAccounts, MarketWithAddress, TokenOracleData } from '../utils';
import { FeeCalculation, Fees, ReserveDataType, ReserveRewardYield } from './shared';
import { Reserve } from '../@codegen/klend/accounts';
import { ReserveConfig, UpdateConfigModeKind } from '../@codegen/klend/types';
import { ConfigUpdater } from './configItems';
import { ActionType } from './action';
import { BorrowCapsAndCounters, KaminoMarket } from './market';
import { KaminoPrices } from '@kamino-finance/kliquidity-sdk';
export type KaminoReserveRpcApi = GetProgramAccountsApi & GetAccountInfoApi & GetMultipleAccountsApi;
export declare const DEFAULT_RECENT_SLOT_DURATION_MS = 400;
export declare class KaminoReserve {
state: Reserve;
address: Address;
symbol: string;
tokenOraclePrice: TokenOracleData;
stats: ReserveDataType;
private farmData;
private rpc;
private readonly recentSlotDurationMs;
private metadata?;
constructor(state: Reserve, address: Address, tokenOraclePrice: TokenOracleData, connection: Rpc<KaminoReserveRpcApi>, recentSlotDurationMs: number);
static initialize(address: Address, state: Reserve, tokenOraclePrice: TokenOracleData, rpc: Rpc<KaminoReserveRpcApi>, recentSlotDurationMs: number): KaminoReserve;
static initializeFromAddress(address: Address, rpc: Rpc<KaminoReserveRpcApi>, recentSlotDurationMs: number, reserveState?: Reserve, oracleAccounts?: AllOracleAccounts): Promise<KaminoReserve>;
/**
* @returns the parsed token symbol of the reserve
*/
getTokenSymbol(): string;
/**
* @returns list of logo names and human readable oracle descriptions
*/
getOracleMetadata(): Promise<[string, string][]>;
/**
* @returns the total borrowed amount of the reserve in lamports
*/
getBorrowedAmount(): Decimal;
/**
* @returns the available liquidity amount of the reserve in lamports
*/
getLiquidityAvailableAmount(): Decimal;
/**
*
* @returns the last cached price stored in the reserve in USD
*/
getReserveMarketPrice(): Decimal;
/**
* @returns the current market price of the reserve in USD
*/
getOracleMarketPrice(): Decimal;
/**
* @returns the total accumulated protocol fees of the reserve
*/
getAccumulatedProtocolFees(): Decimal;
/**
* @returns the total accumulated referrer fees of the reserve
*/
getAccumulatedReferrerFees(): Decimal;
/**
* @returns the total pending referrer fees of the reserve
*/
getPendingReferrerFees(): Decimal;
/**
*
* @returns the flash loan fee percentage of the reserve
*/
getFlashLoanFee: () => Decimal;
/**
*
* @returns the origination fee percentage of the reserve
*/
getBorrowFee: () => Decimal;
/**
*
* @returns the fixed interest rate allocated to the host
*/
getFixedHostInterestRate: () => Decimal;
/**
* Use getEstimatedTotalSupply() for the most accurate value
* @returns the stale total liquidity supply of the reserve from the last refresh
*/
getTotalSupply(): Decimal;
/**
* Calculates the total liquidity supply of the reserve
*/
getEstimatedTotalSupply(slot: Slot, referralFeeBps: number): Decimal;
/**
* Use getEstimatedCumulativeBorrowRate() for the most accurate value
* @returns the stale cumulative borrow rate of the reserve from the last refresh
*/
getCumulativeBorrowRate(): Decimal;
/**
* @Returns estimated cumulative borrow rate of the reserve
*/
getEstimatedCumulativeBorrowRate(currentSlot: Slot, referralFeeBps: number): Decimal;
/**
* Use getEstimatedCollateralExchangeRate() for the most accurate value
* @returns the stale exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18
*/
getCollateralExchangeRate(): Decimal;
/**
*
* @returns the estimated exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18
*/
getEstimatedCollateralExchangeRate(slot: Slot, referralFeeBps: number): Decimal;
/**
*
* @returns the total USD value of the existing collateral in the reserve
*/
getDepositTvl: () => Decimal;
/**
*
* Get the total USD value of the borrowed assets from the reserve
*/
getBorrowTvl: () => Decimal;
/**
* @returns 10^mint_decimals
*/
getMintFactor(): Decimal;
/**
* @returns mint_decimals of the liquidity token
*/
getMintDecimals(): number;
/**
* @returns the collateral farm address if it is set, otherwise none
*/
getCollateralFarmAddress(): Option<Address>;
/**
* @returns the debt farm address if it is set, otherwise none
*/
getDebtFarmAddress(): Option<Address>;
/**
* @Returns true if the total liquidity supply of the reserve is greater than the deposit limit
*/
depositLimitCrossed(): boolean;
/**
* @Returns true if the total borrowed amount of the reserve is greater than the borrow limit
*/
borrowLimitCrossed(): boolean;
/**
*
* @returns the max capacity of the daily deposit withdrawal cap
*/
getDepositWithdrawalCapCapacity(): Decimal;
/**
*
* @returns the current capacity of the daily deposit withdrawal cap
*/
getDepositWithdrawalCapCurrent(slot: Slot): Decimal;
/**
*
* @returns the max capacity of the daily debt withdrawal cap
*/
getDebtWithdrawalCapCapacity(): Decimal;
/**
*
* @returns the borrow limit of the reserve outside the elevation group
*/
getBorrowLimitOutsideElevationGroup(): Decimal;
/**
*
* @returns the borrowed amount of the reserve outside the elevation group
*/
getBorrowedAmountOutsideElevationGroup(): Decimal;
/**
*
* @returns the borrow limit against the collateral reserve in the elevation group
*/
getBorrowLimitAgainstCollateralInElevationGroup(elevationGroupIndex: number): Decimal;
/**
*
* @returns the borrowed amount against the collateral reserve in the elevation group
*/
getBorrowedAmountAgainstCollateralInElevationGroup(elevationGroupIndex: number): Decimal;
/**
*
* @returns the current capacity of the daily debt withdrawal cap
*/
getDebtWithdrawalCapCurrent(slot: Slot): Decimal;
getBorrowFactor(): Decimal;
calculateSupplyAPR(slot: Slot, referralFeeBps: number): number;
getEstimatedDebtAndSupply(slot: Slot, referralFeeBps: number): {
totalBorrow: Decimal;
totalSupply: Decimal;
};
getEstimatedAccumulatedProtocolFees(slot: Slot, referralFeeBps: number): {
accumulatedProtocolFees: Decimal;
compoundedVariableProtocolFee: Decimal;
compoundedFixedHostFee: Decimal;
};
calculateUtilizationRatio(): number;
getEstimatedUtilizationRatio(slot: Slot, referralFeeBps: number): number;
calcSimulatedUtilizationRatio(amount: Decimal, action: ActionType, slot: Slot, referralFeeBps: number, outflowAmount?: Decimal): number;
getMaxBorrowAmountWithCollReserve(market: KaminoMarket, collReserve: KaminoReserve, slot: Slot): Decimal;
calcSimulatedBorrowRate(amount: Decimal, action: ActionType, slot: Slot, referralFeeBps: number, outflowAmount?: Decimal): number;
calcSimulatedBorrowAPR(amount: Decimal, action: ActionType, slot: Slot, referralFeeBps: number, outflowAmount?: Decimal): number;
calcSimulatedSupplyAPR(amount: Decimal, action: ActionType, slot: Slot, referralFeeBps: number, outflowAmount?: Decimal): number;
slotAdjustmentFactor(): number;
calculateBorrowRate(): number;
calculateEstimatedBorrowRate(slot: Slot, referralFeeBps: number): number;
calculateBorrowAPR(slot: Slot, referralFeeBps: number): number;
/**
* @returns the mint of the reserve liquidity token
*/
getLiquidityMint(): Address;
/**
* @returns the token program of the reserve liquidity mint
*/
getLiquidityTokenProgram(): Address;
/**
* @returns the mint of the reserve collateral token , i.e. the cToken minted for depositing the liquidity token
*/
getCTokenMint(): Address;
calculateFees(amountLamports: Decimal, borrowFeeRate: Decimal, feeCalculation: FeeCalculation, referralFeeBps: number, hasReferrer: boolean): Fees;
calculateFlashLoanFees(flashLoanAmountLamports: Decimal, referralFeeBps: number, hasReferrer: boolean): Fees;
load(tokenOraclePrice: TokenOracleData): Promise<void>;
totalSupplyAPY(currentSlot: Slot): number;
totalBorrowAPY(currentSlot: Slot): number;
loadFarmStates(): Promise<void>;
getRewardYields(prices: KaminoPrices): Promise<ReserveRewardYield[]>;
private calculateRewardYield;
private formatReserveData;
/**
* Compound current borrow rate over elapsed slots
*
* This also calculates protocol fees, which are taken for all obligations that have borrowed from current reserve.
*
* This also calculates referral fees, which are taken into pendingReferralFees.
*
* https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L517
*
* @param slotsElapsed
* @param referralFeeBps
*/
private compoundInterest;
/**
* Approximation to match the smart contract calculation
* https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L1026
* @param rate
* @param elapsedSlots
* @private
*/
private approximateCompoundedInterest;
getBorrowCapForReserve(market: KaminoMarket): BorrowCapsAndCounters;
getLiquidityAvailableForDebtReserveGivenCaps(market: KaminoMarket, elevationGroups: number[], collateralReserves?: Address[]): Decimal[];
}
export declare function createReserveIxs(rpc: Rpc<GetMinimumBalanceForRentExemptionApi>, owner: TransactionSigner, ownerLiquiditySource: Address, lendingMarket: Address, liquidityMint: Address, liquidityMintTokenProgram: Address, reserveAddress: TransactionSigner, programId: Address): Promise<Instruction[]>;
export declare function updateReserveConfigIx(signer: TransactionSigner, marketAddress: Address, reserveAddress: Address, mode: UpdateConfigModeKind, value: Uint8Array, programId: Address, skipConfigIntegrityValidation?: boolean): Promise<Instruction>;
export declare const RESERVE_CONFIG_UPDATER: ConfigUpdater<UpdateConfigModeKind, ReserveConfig>;
export declare function updateEntireReserveConfigIx(signer: TransactionSigner, marketAddress: Address, reserveAddress: Address, reserveConfig: ReserveConfig, programId: Address): Promise<Instruction>;
export declare function parseForChangesReserveConfigAndGetIxs(marketWithAddress: MarketWithAddress, reserve: Reserve | undefined, reserveAddress: Address, reserveConfig: ReserveConfig, programId: Address, lendingMarketOwner?: TransactionSigner): Promise<Instruction[]>;
export type ReserveWithAddress = {
address: Address;
state: Reserve;
};
//# sourceMappingURL=reserve.d.ts.map