@kamino-finance/klend-sdk
Version:
Typescript SDK for interacting with the Kamino Lending (klend) protocol
333 lines • 17.4 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.LendingMarket = void 0;
const web3_js_1 = require("@solana/web3.js");
const bn_js_1 = __importDefault(require("bn.js")); // eslint-disable-line @typescript-eslint/no-unused-vars
const borsh = __importStar(require("@coral-xyz/borsh")); // eslint-disable-line @typescript-eslint/no-unused-vars
const types = __importStar(require("../types")); // eslint-disable-line @typescript-eslint/no-unused-vars
const programId_1 = require("../programId");
class LendingMarket {
/** Version of lending market */
version;
/** Bump seed for derived authority address */
bumpSeed;
/** Owner authority which can add new reserves */
lendingMarketOwner;
/** Temporary cache of the lending market owner, used in update_lending_market_owner */
lendingMarketOwnerCached;
/**
* Currency market prices are quoted in
* e.g. "USD" null padded (`*b"USD\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"`) or a SPL token mint pubkey
*/
quoteCurrency;
/** Referral fee for the lending market, as bps out of the total protocol fee */
referralFeeBps;
emergencyMode;
/**
* Whether the obligations on this market should be subject to auto-deleveraging after deposit
* or borrow limit is crossed.
* Besides this flag, the particular reserve's flag also needs to be enabled (logical `AND`).
* **NOTE:** this also affects the individual "target LTV" deleveraging.
*/
autodeleverageEnabled;
borrowDisabled;
/**
* Refresh price from oracle only if it's older than this percentage of the price max age.
* e.g. if the max age is set to 100s and this is set to 80%, the price will be refreshed if it's older than 80s.
* Price is always refreshed if this set to 0.
*/
priceRefreshTriggerToMaxAgePct;
/** Percentage of the total borrowed value in an obligation available for liquidation */
liquidationMaxDebtCloseFactorPct;
/** Minimum acceptable unhealthy LTV before max_debt_close_factor_pct becomes 100% */
insolvencyRiskUnhealthyLtvPct;
/** Minimum liquidation value threshold triggering full liquidation for an obligation */
minFullLiquidationValueThreshold;
/** Max allowed liquidation value in one ix call */
maxLiquidatableDebtMarketValueAtOnce;
/** [DEPRECATED] Global maximum unhealthy borrow value allowed for any obligation */
reserved0;
/** Global maximum allowed borrow value allowed for any obligation */
globalAllowedBorrowValue;
/** The address of the risk council, in charge of making parameter and risk decisions on behalf of the protocol */
riskCouncil;
/** [DEPRECATED] Reward points multiplier per obligation type */
reserved1;
/** Elevation groups are used to group together reserves that have the same risk parameters and can bump the ltv and liquidation threshold */
elevationGroups;
elevationGroupPadding;
/** Min net value accepted to be found in a position after any lending action in an obligation (scaled by quote currency decimals) */
minNetValueInObligationSf;
/** Minimum value to enforce smallest ltv priority checks on the collateral reserves on liquidation */
minValueSkipLiquidationLtvChecks;
/** Market name, zero-padded. */
name;
/** Minimum value to enforce highest borrow factor priority checks on the debt reserves on liquidation */
minValueSkipLiquidationBfChecks;
/**
* Time (in seconds) that must pass before liquidation is allowed on an obligation that has
* been individually marked for auto-deleveraging (by the risk council).
*/
individualAutodeleverageMarginCallPeriodSecs;
/**
* Minimum amount of deposit at creation of a reserve to prevent artificial inflation
* Note: this amount cannot be recovered, the ctoken associated are never minted
*/
minInitialDepositAmount;
/** Whether the obligation orders should be evaluated during liquidations. */
obligationOrderExecutionEnabled;
/** Whether the lending market is set as immutable. */
immutable;
/**
* Whether new obligation orders can be created.
* Note: updating or cancelling existing orders is *not* affected by this flag.
*/
obligationOrderCreationEnabled;
padding2;
padding1;
static discriminator = Buffer.from([
246, 114, 50, 98, 72, 157, 28, 120,
]);
static layout = borsh.struct([
borsh.u64("version"),
borsh.u64("bumpSeed"),
borsh.publicKey("lendingMarketOwner"),
borsh.publicKey("lendingMarketOwnerCached"),
borsh.array(borsh.u8(), 32, "quoteCurrency"),
borsh.u16("referralFeeBps"),
borsh.u8("emergencyMode"),
borsh.u8("autodeleverageEnabled"),
borsh.u8("borrowDisabled"),
borsh.u8("priceRefreshTriggerToMaxAgePct"),
borsh.u8("liquidationMaxDebtCloseFactorPct"),
borsh.u8("insolvencyRiskUnhealthyLtvPct"),
borsh.u64("minFullLiquidationValueThreshold"),
borsh.u64("maxLiquidatableDebtMarketValueAtOnce"),
borsh.array(borsh.u8(), 8, "reserved0"),
borsh.u64("globalAllowedBorrowValue"),
borsh.publicKey("riskCouncil"),
borsh.array(borsh.u8(), 8, "reserved1"),
borsh.array(types.ElevationGroup.layout(), 32, "elevationGroups"),
borsh.array(borsh.u64(), 90, "elevationGroupPadding"),
borsh.u128("minNetValueInObligationSf"),
borsh.u64("minValueSkipLiquidationLtvChecks"),
borsh.array(borsh.u8(), 32, "name"),
borsh.u64("minValueSkipLiquidationBfChecks"),
borsh.u64("individualAutodeleverageMarginCallPeriodSecs"),
borsh.u64("minInitialDepositAmount"),
borsh.u8("obligationOrderExecutionEnabled"),
borsh.u8("immutable"),
borsh.u8("obligationOrderCreationEnabled"),
borsh.array(borsh.u8(), 5, "padding2"),
borsh.array(borsh.u64(), 169, "padding1"),
]);
constructor(fields) {
this.version = fields.version;
this.bumpSeed = fields.bumpSeed;
this.lendingMarketOwner = fields.lendingMarketOwner;
this.lendingMarketOwnerCached = fields.lendingMarketOwnerCached;
this.quoteCurrency = fields.quoteCurrency;
this.referralFeeBps = fields.referralFeeBps;
this.emergencyMode = fields.emergencyMode;
this.autodeleverageEnabled = fields.autodeleverageEnabled;
this.borrowDisabled = fields.borrowDisabled;
this.priceRefreshTriggerToMaxAgePct = fields.priceRefreshTriggerToMaxAgePct;
this.liquidationMaxDebtCloseFactorPct =
fields.liquidationMaxDebtCloseFactorPct;
this.insolvencyRiskUnhealthyLtvPct = fields.insolvencyRiskUnhealthyLtvPct;
this.minFullLiquidationValueThreshold =
fields.minFullLiquidationValueThreshold;
this.maxLiquidatableDebtMarketValueAtOnce =
fields.maxLiquidatableDebtMarketValueAtOnce;
this.reserved0 = fields.reserved0;
this.globalAllowedBorrowValue = fields.globalAllowedBorrowValue;
this.riskCouncil = fields.riskCouncil;
this.reserved1 = fields.reserved1;
this.elevationGroups = fields.elevationGroups.map((item) => new types.ElevationGroup({ ...item }));
this.elevationGroupPadding = fields.elevationGroupPadding;
this.minNetValueInObligationSf = fields.minNetValueInObligationSf;
this.minValueSkipLiquidationLtvChecks =
fields.minValueSkipLiquidationLtvChecks;
this.name = fields.name;
this.minValueSkipLiquidationBfChecks =
fields.minValueSkipLiquidationBfChecks;
this.individualAutodeleverageMarginCallPeriodSecs =
fields.individualAutodeleverageMarginCallPeriodSecs;
this.minInitialDepositAmount = fields.minInitialDepositAmount;
this.obligationOrderExecutionEnabled =
fields.obligationOrderExecutionEnabled;
this.immutable = fields.immutable;
this.obligationOrderCreationEnabled = fields.obligationOrderCreationEnabled;
this.padding2 = fields.padding2;
this.padding1 = fields.padding1;
}
static async fetch(c, address, programId = programId_1.PROGRAM_ID) {
const info = await c.getAccountInfo(address);
if (info === null) {
return null;
}
if (!info.owner.equals(programId)) {
throw new Error("account doesn't belong to this program");
}
return this.decode(info.data);
}
static async fetchMultiple(c, addresses, programId = programId_1.PROGRAM_ID) {
const infos = await c.getMultipleAccountsInfo(addresses);
return infos.map((info) => {
if (info === null) {
return null;
}
if (!info.owner.equals(programId)) {
throw new Error("account doesn't belong to this program");
}
return this.decode(info.data);
});
}
static decode(data) {
if (!data.slice(0, 8).equals(LendingMarket.discriminator)) {
throw new Error("invalid account discriminator");
}
const dec = LendingMarket.layout.decode(data.slice(8));
return new LendingMarket({
version: dec.version,
bumpSeed: dec.bumpSeed,
lendingMarketOwner: dec.lendingMarketOwner,
lendingMarketOwnerCached: dec.lendingMarketOwnerCached,
quoteCurrency: dec.quoteCurrency,
referralFeeBps: dec.referralFeeBps,
emergencyMode: dec.emergencyMode,
autodeleverageEnabled: dec.autodeleverageEnabled,
borrowDisabled: dec.borrowDisabled,
priceRefreshTriggerToMaxAgePct: dec.priceRefreshTriggerToMaxAgePct,
liquidationMaxDebtCloseFactorPct: dec.liquidationMaxDebtCloseFactorPct,
insolvencyRiskUnhealthyLtvPct: dec.insolvencyRiskUnhealthyLtvPct,
minFullLiquidationValueThreshold: dec.minFullLiquidationValueThreshold,
maxLiquidatableDebtMarketValueAtOnce: dec.maxLiquidatableDebtMarketValueAtOnce,
reserved0: dec.reserved0,
globalAllowedBorrowValue: dec.globalAllowedBorrowValue,
riskCouncil: dec.riskCouncil,
reserved1: dec.reserved1,
elevationGroups: dec.elevationGroups.map((item /* eslint-disable-line @typescript-eslint/no-explicit-any */) => types.ElevationGroup.fromDecoded(item)),
elevationGroupPadding: dec.elevationGroupPadding,
minNetValueInObligationSf: dec.minNetValueInObligationSf,
minValueSkipLiquidationLtvChecks: dec.minValueSkipLiquidationLtvChecks,
name: dec.name,
minValueSkipLiquidationBfChecks: dec.minValueSkipLiquidationBfChecks,
individualAutodeleverageMarginCallPeriodSecs: dec.individualAutodeleverageMarginCallPeriodSecs,
minInitialDepositAmount: dec.minInitialDepositAmount,
obligationOrderExecutionEnabled: dec.obligationOrderExecutionEnabled,
immutable: dec.immutable,
obligationOrderCreationEnabled: dec.obligationOrderCreationEnabled,
padding2: dec.padding2,
padding1: dec.padding1,
});
}
toJSON() {
return {
version: this.version.toString(),
bumpSeed: this.bumpSeed.toString(),
lendingMarketOwner: this.lendingMarketOwner.toString(),
lendingMarketOwnerCached: this.lendingMarketOwnerCached.toString(),
quoteCurrency: this.quoteCurrency,
referralFeeBps: this.referralFeeBps,
emergencyMode: this.emergencyMode,
autodeleverageEnabled: this.autodeleverageEnabled,
borrowDisabled: this.borrowDisabled,
priceRefreshTriggerToMaxAgePct: this.priceRefreshTriggerToMaxAgePct,
liquidationMaxDebtCloseFactorPct: this.liquidationMaxDebtCloseFactorPct,
insolvencyRiskUnhealthyLtvPct: this.insolvencyRiskUnhealthyLtvPct,
minFullLiquidationValueThreshold: this.minFullLiquidationValueThreshold.toString(),
maxLiquidatableDebtMarketValueAtOnce: this.maxLiquidatableDebtMarketValueAtOnce.toString(),
reserved0: this.reserved0,
globalAllowedBorrowValue: this.globalAllowedBorrowValue.toString(),
riskCouncil: this.riskCouncil.toString(),
reserved1: this.reserved1,
elevationGroups: this.elevationGroups.map((item) => item.toJSON()),
elevationGroupPadding: this.elevationGroupPadding.map((item) => item.toString()),
minNetValueInObligationSf: this.minNetValueInObligationSf.toString(),
minValueSkipLiquidationLtvChecks: this.minValueSkipLiquidationLtvChecks.toString(),
name: this.name,
minValueSkipLiquidationBfChecks: this.minValueSkipLiquidationBfChecks.toString(),
individualAutodeleverageMarginCallPeriodSecs: this.individualAutodeleverageMarginCallPeriodSecs.toString(),
minInitialDepositAmount: this.minInitialDepositAmount.toString(),
obligationOrderExecutionEnabled: this.obligationOrderExecutionEnabled,
immutable: this.immutable,
obligationOrderCreationEnabled: this.obligationOrderCreationEnabled,
padding2: this.padding2,
padding1: this.padding1.map((item) => item.toString()),
};
}
static fromJSON(obj) {
return new LendingMarket({
version: new bn_js_1.default(obj.version),
bumpSeed: new bn_js_1.default(obj.bumpSeed),
lendingMarketOwner: new web3_js_1.PublicKey(obj.lendingMarketOwner),
lendingMarketOwnerCached: new web3_js_1.PublicKey(obj.lendingMarketOwnerCached),
quoteCurrency: obj.quoteCurrency,
referralFeeBps: obj.referralFeeBps,
emergencyMode: obj.emergencyMode,
autodeleverageEnabled: obj.autodeleverageEnabled,
borrowDisabled: obj.borrowDisabled,
priceRefreshTriggerToMaxAgePct: obj.priceRefreshTriggerToMaxAgePct,
liquidationMaxDebtCloseFactorPct: obj.liquidationMaxDebtCloseFactorPct,
insolvencyRiskUnhealthyLtvPct: obj.insolvencyRiskUnhealthyLtvPct,
minFullLiquidationValueThreshold: new bn_js_1.default(obj.minFullLiquidationValueThreshold),
maxLiquidatableDebtMarketValueAtOnce: new bn_js_1.default(obj.maxLiquidatableDebtMarketValueAtOnce),
reserved0: obj.reserved0,
globalAllowedBorrowValue: new bn_js_1.default(obj.globalAllowedBorrowValue),
riskCouncil: new web3_js_1.PublicKey(obj.riskCouncil),
reserved1: obj.reserved1,
elevationGroups: obj.elevationGroups.map((item) => types.ElevationGroup.fromJSON(item)),
elevationGroupPadding: obj.elevationGroupPadding.map((item) => new bn_js_1.default(item)),
minNetValueInObligationSf: new bn_js_1.default(obj.minNetValueInObligationSf),
minValueSkipLiquidationLtvChecks: new bn_js_1.default(obj.minValueSkipLiquidationLtvChecks),
name: obj.name,
minValueSkipLiquidationBfChecks: new bn_js_1.default(obj.minValueSkipLiquidationBfChecks),
individualAutodeleverageMarginCallPeriodSecs: new bn_js_1.default(obj.individualAutodeleverageMarginCallPeriodSecs),
minInitialDepositAmount: new bn_js_1.default(obj.minInitialDepositAmount),
obligationOrderExecutionEnabled: obj.obligationOrderExecutionEnabled,
immutable: obj.immutable,
obligationOrderCreationEnabled: obj.obligationOrderCreationEnabled,
padding2: obj.padding2,
padding1: obj.padding1.map((item) => new bn_js_1.default(item)),
});
}
}
exports.LendingMarket = LendingMarket;
//# sourceMappingURL=LendingMarket.js.map