@kamino-finance/klend-sdk 3.2.9 → 3.2.11
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/README_KAMINO_MANAGER.md +60 -3
- package/dist/classes/manager.d.ts +15 -1
- package/dist/classes/manager.js +292 -0
- package/dist/classes/manager.js.map +1 -1
- package/dist/classes/obligation.d.ts +35 -0
- package/dist/classes/obligation.js +67 -35
- package/dist/classes/obligation.js.map +1 -1
- package/dist/classes/reserve.d.ts +7 -1
- package/dist/classes/reserve.js +74 -1
- package/dist/classes/reserve.js.map +1 -1
- package/dist/classes/shared.d.ts +12 -1
- package/dist/classes/shared.js.map +1 -1
- package/dist/classes/utils.d.ts +1 -0
- package/dist/classes/utils.js +8 -0
- package/dist/classes/utils.js.map +1 -1
- package/dist/client_kamino_manager.js +100 -0
- package/dist/client_kamino_manager.js.map +1 -1
- package/dist/utils/api.d.ts +7 -0
- package/dist/utils/api.js +8 -1
- package/dist/utils/api.js.map +1 -1
- package/package.json +1 -1
package/dist/classes/shared.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { PublicKey } from '@solana/web3.js';
|
|
2
2
|
import Decimal from 'decimal.js';
|
|
3
|
+
import { FarmState, RewardInfo } from '@hubbleprotocol/farms-sdk';
|
|
3
4
|
export type ConfigType = Array<MarketConfigType>;
|
|
4
5
|
export type MarketConfigType = {
|
|
5
6
|
name: string;
|
|
6
7
|
isPrimary: boolean;
|
|
7
8
|
description: string;
|
|
8
9
|
lendingMarket: string;
|
|
10
|
+
lookupTable: string;
|
|
9
11
|
};
|
|
10
12
|
export type ReserveConfigResponse = {
|
|
11
13
|
liquidityToken: {
|
|
@@ -22,7 +24,7 @@ export type ReserveDataType = {
|
|
|
22
24
|
status: ReserveStatus;
|
|
23
25
|
mintAddress: PublicKey;
|
|
24
26
|
borrowCurve: [number, number][];
|
|
25
|
-
|
|
27
|
+
loanToValue: number;
|
|
26
28
|
maxLiquidationBonus: number;
|
|
27
29
|
minLiquidationBonus: number;
|
|
28
30
|
liquidationThreshold: number;
|
|
@@ -37,3 +39,12 @@ export type ReserveDataType = {
|
|
|
37
39
|
mintTotalSupply: Decimal;
|
|
38
40
|
borrowFactor: number;
|
|
39
41
|
};
|
|
42
|
+
export type ReserveRewardYield = {
|
|
43
|
+
apy: Decimal;
|
|
44
|
+
apr: Decimal;
|
|
45
|
+
rewardInfo: RewardInfo;
|
|
46
|
+
};
|
|
47
|
+
export type ReserveFarmInfo = {
|
|
48
|
+
fetched: boolean;
|
|
49
|
+
farmStates: FarmState[];
|
|
50
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/classes/shared.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/classes/shared.ts"],"names":[],"mappings":";;;AAqBA,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,kCAAiB,CAAA;IACjB,sCAAqB,CAAA;IACrB,kCAAiB,CAAA;AACnB,CAAC,EAJW,aAAa,6BAAb,aAAa,QAIxB","sourcesContent":["import { PublicKey } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport { FarmState, RewardInfo } from '@hubbleprotocol/farms-sdk';\n\nexport type ConfigType = Array<MarketConfigType>;\n\nexport type MarketConfigType = {\n name: string;\n isPrimary: boolean;\n description: string;\n lendingMarket: string;\n lookupTable: string;\n};\n\nexport type ReserveConfigResponse = {\n liquidityToken: {\n symbol: string;\n mint: string;\n };\n};\n\nexport enum ReserveStatus {\n Active = 'Active',\n Obsolete = 'Obsolete',\n Hidden = 'Hidden',\n}\n\nexport type ReserveDataType = {\n status: ReserveStatus;\n mintAddress: PublicKey;\n borrowCurve: [number, number][];\n loanToValue: number;\n maxLiquidationBonus: number;\n minLiquidationBonus: number;\n liquidationThreshold: number;\n reserveDepositLimit: Decimal;\n reserveBorrowLimit: Decimal;\n depositLimitCrossedSlot: number;\n borrowLimitCrossedSlot: number;\n symbol: string;\n decimals: number;\n protocolTakeRate: number;\n accumulatedProtocolFees: Decimal;\n mintTotalSupply: Decimal;\n borrowFactor: number;\n};\n\nexport type ReserveRewardYield = {\n apy: Decimal;\n apr: Decimal;\n rewardInfo: RewardInfo;\n};\n\nexport type ReserveFarmInfo = {\n fetched: boolean;\n farmStates: FarmState[];\n};\n"]}
|
package/dist/classes/utils.d.ts
CHANGED
|
@@ -37,4 +37,5 @@ export declare const valueOrZero: (value: Decimal) => Decimal;
|
|
|
37
37
|
export declare const isEmptyObject: (obj: any) => boolean;
|
|
38
38
|
export declare const positiveOrZero: (value: Decimal) => Decimal;
|
|
39
39
|
export declare function calculateAPYFromAPR(apr: number): number;
|
|
40
|
+
export declare function calculateAPRFromAPY(apy: Decimal.Value): Decimal;
|
|
40
41
|
export {};
|
package/dist/classes/utils.js
CHANGED
|
@@ -8,6 +8,7 @@ exports.sleep = sleep;
|
|
|
8
8
|
exports.numberToLamportsDecimal = numberToLamportsDecimal;
|
|
9
9
|
exports.lamportsToNumberDecimal = lamportsToNumberDecimal;
|
|
10
10
|
exports.calculateAPYFromAPR = calculateAPYFromAPR;
|
|
11
|
+
exports.calculateAPRFromAPY = calculateAPRFromAPY;
|
|
11
12
|
const utils_1 = require("../utils");
|
|
12
13
|
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
13
14
|
const lib_1 = require("../lib");
|
|
@@ -126,4 +127,11 @@ function calculateAPYFromAPR(apr) {
|
|
|
126
127
|
const apy = Math.pow(new decimal_js_1.default(1).plus(new decimal_js_1.default(apr).dividedBy(utils_1.SLOTS_PER_YEAR)).toNumber(), utils_1.SLOTS_PER_YEAR) - 1;
|
|
127
128
|
return apy;
|
|
128
129
|
}
|
|
130
|
+
function calculateAPRFromAPY(apy) {
|
|
131
|
+
return new decimal_js_1.default(apy)
|
|
132
|
+
.plus(1)
|
|
133
|
+
.pow(1 / utils_1.SLOTS_PER_YEAR)
|
|
134
|
+
.minus(1)
|
|
135
|
+
.times(utils_1.SLOTS_PER_YEAR);
|
|
136
|
+
}
|
|
129
137
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/classes/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { SLOTS_PER_SECOND, SLOTS_PER_YEAR } from '../utils';\nimport Decimal from 'decimal.js';\nimport { PublicKey } from '@solana/web3.js';\nimport { SOL_MINTS } from '../lib';\n\ntype ObligationFarmScoreType = {\n obligationId: string;\n balance: string;\n debt: string;\n score: string;\n lastSlot: number;\n tokenMint: string;\n side: 'supply' | 'borrow';\n};\n\ntype RewardRate = {\n beginningSlot: number;\n rewardRate: string;\n name?: string;\n};\n\nfunction getLatestRewardRate(\n rewardRates: Array<{\n beginningSlot: number;\n rewardRate: string;\n name?: string;\n }>,\n slot: number\n) {\n return rewardRates\n .filter((rr) => slot >= rr.beginningSlot)\n .reduce((v1, v2) => (v1.beginningSlot > v2.beginningSlot ? v1 : v2), {\n beginningSlot: 0,\n rewardRate: '0',\n });\n}\n\nexport const calculateNewScore = (\n rewardStat: {\n lastSlot: number;\n rewardRates: Array<RewardRate>;\n rewardsPerShare: string;\n totalBalance: string;\n },\n pool: ObligationFarmScoreType,\n rewardRate: string,\n endSlot: number,\n startSlot: number\n) => {\n const { balance, debt, score } = pool;\n const { rewardsPerShare, totalBalance } = rewardStat;\n\n const oldDebt = new Decimal(debt);\n const oldScore = new Decimal(score);\n const oldRewardsPerShare = new Decimal(rewardsPerShare);\n const oldBalance = new Decimal(balance);\n const totalBalanceVal = new Decimal(totalBalance);\n\n const newRewardsPerShare = !totalBalanceVal.isZero()\n ? oldRewardsPerShare.plus(\n new Decimal(endSlot)\n .minus(new Decimal(startSlot.toString()))\n .times(new Decimal(rewardRate))\n .div(totalBalanceVal)\n .div(new Decimal(SLOTS_PER_YEAR))\n )\n : new Decimal(0);\n\n return oldScore.plus(newRewardsPerShare.times(oldBalance).minus(oldDebt));\n};\n\nexport const estimateCurrentScore = (\n rewardStat: {\n lastSlot: number;\n rewardRates: Array<RewardRate>;\n rewardsPerShare: string;\n totalBalance: string;\n },\n rewardScore: ObligationFarmScoreType,\n mostRecentSlot: number,\n mostRecentSlotTime: number\n) => {\n const { lastSlot, rewardRates } = rewardStat;\n\n const estimatedCurrentSlot = mostRecentSlot + SLOTS_PER_SECOND * (Date.now() / 1000 - mostRecentSlotTime);\n\n const { rewardRate } = getLatestRewardRate(rewardRates, estimatedCurrentSlot);\n\n const currentScore = calculateNewScore(rewardStat, rewardScore, rewardRate, estimatedCurrentSlot, lastSlot);\n\n return currentScore;\n};\n\nexport const interpolate = (x: number, x0: number, x1: number, y0: number, y1: number) => {\n if (x > x1) {\n throw 'Cannot do extrapolation';\n }\n\n return y0 + ((x - x0) * (y1 - y0)) / (x1 - x0);\n};\n\nexport const getBorrowRate = (currentUtilization: number, curve: [number, number][]): number => {\n let [x0, y0, x1, y1] = [0, 0, 0, 0];\n\n if (curve.length < 2) {\n throw 'Invalid borrow rate curve, only one point';\n }\n\n if (currentUtilization > 1) {\n currentUtilization = 1;\n }\n\n for (let i = 1; i < curve.length; i++) {\n const [pointUtilization, pointRate] = curve[i];\n if (pointUtilization === currentUtilization) {\n return pointRate;\n }\n\n if (currentUtilization <= pointUtilization) {\n x0 = curve[i - 1][0];\n y0 = curve[i - 1][1];\n x1 = curve[i][0];\n y1 = curve[i][1];\n break;\n }\n }\n\n if (x0 === 0 && y0 === 0 && x1 === 0 && y1 === 0) {\n console.log('All are 0');\n throw 'Invalid borrow rate curve, could not identify the interpolation points.';\n }\n\n if (x0 >= x1 || y0 > y1) {\n console.log('(x0, y0), (x1, y1)', x0, y0, x1, y1);\n throw 'Invalid borrow rate curve, curve is not uniformly increasing';\n }\n\n return interpolate(currentUtilization, x0, x1, y0, y1);\n};\n\nexport const parseTokenSymbol = (tokenSymbol: number[]): string => {\n return String.fromCharCode(...tokenSymbol.filter((x) => x > 0));\n};\n\nexport function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function numberToLamportsDecimal(amount: Decimal.Value, decimals: number): Decimal {\n const factor = 10 ** decimals;\n return new Decimal(amount).mul(factor);\n}\n\nexport function lamportsToNumberDecimal(amount: Decimal.Value, decimals: number): Decimal {\n const factor = 10 ** decimals;\n return new Decimal(amount).div(factor);\n}\n\nexport const isSolMint = (mint: PublicKey): boolean => {\n return SOL_MINTS.filter((m) => m.equals(mint)).length > 0;\n};\n\nexport const valueOrZero = (value: Decimal): Decimal => {\n const zero = new Decimal(0);\n if (value.isNaN() || !value.isFinite()) {\n return zero;\n } else {\n return value;\n }\n};\n\nexport const isEmptyObject = (obj: any) => {\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n};\n\nexport const positiveOrZero = (value: Decimal): Decimal => {\n const zero = new Decimal(0);\n return Decimal.max(value, zero);\n};\n\nexport function calculateAPYFromAPR(apr: number) {\n const apy = new Decimal(1).plus(new Decimal(apr).dividedBy(SLOTS_PER_YEAR)).toNumber() ** SLOTS_PER_YEAR - 1;\n return apy;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/classes/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { SLOTS_PER_SECOND, SLOTS_PER_YEAR } from '../utils';\nimport Decimal from 'decimal.js';\nimport { PublicKey } from '@solana/web3.js';\nimport { SOL_MINTS } from '../lib';\n\ntype ObligationFarmScoreType = {\n obligationId: string;\n balance: string;\n debt: string;\n score: string;\n lastSlot: number;\n tokenMint: string;\n side: 'supply' | 'borrow';\n};\n\ntype RewardRate = {\n beginningSlot: number;\n rewardRate: string;\n name?: string;\n};\n\nfunction getLatestRewardRate(\n rewardRates: Array<{\n beginningSlot: number;\n rewardRate: string;\n name?: string;\n }>,\n slot: number\n) {\n return rewardRates\n .filter((rr) => slot >= rr.beginningSlot)\n .reduce((v1, v2) => (v1.beginningSlot > v2.beginningSlot ? v1 : v2), {\n beginningSlot: 0,\n rewardRate: '0',\n });\n}\n\nexport const calculateNewScore = (\n rewardStat: {\n lastSlot: number;\n rewardRates: Array<RewardRate>;\n rewardsPerShare: string;\n totalBalance: string;\n },\n pool: ObligationFarmScoreType,\n rewardRate: string,\n endSlot: number,\n startSlot: number\n) => {\n const { balance, debt, score } = pool;\n const { rewardsPerShare, totalBalance } = rewardStat;\n\n const oldDebt = new Decimal(debt);\n const oldScore = new Decimal(score);\n const oldRewardsPerShare = new Decimal(rewardsPerShare);\n const oldBalance = new Decimal(balance);\n const totalBalanceVal = new Decimal(totalBalance);\n\n const newRewardsPerShare = !totalBalanceVal.isZero()\n ? oldRewardsPerShare.plus(\n new Decimal(endSlot)\n .minus(new Decimal(startSlot.toString()))\n .times(new Decimal(rewardRate))\n .div(totalBalanceVal)\n .div(new Decimal(SLOTS_PER_YEAR))\n )\n : new Decimal(0);\n\n return oldScore.plus(newRewardsPerShare.times(oldBalance).minus(oldDebt));\n};\n\nexport const estimateCurrentScore = (\n rewardStat: {\n lastSlot: number;\n rewardRates: Array<RewardRate>;\n rewardsPerShare: string;\n totalBalance: string;\n },\n rewardScore: ObligationFarmScoreType,\n mostRecentSlot: number,\n mostRecentSlotTime: number\n) => {\n const { lastSlot, rewardRates } = rewardStat;\n\n const estimatedCurrentSlot = mostRecentSlot + SLOTS_PER_SECOND * (Date.now() / 1000 - mostRecentSlotTime);\n\n const { rewardRate } = getLatestRewardRate(rewardRates, estimatedCurrentSlot);\n\n const currentScore = calculateNewScore(rewardStat, rewardScore, rewardRate, estimatedCurrentSlot, lastSlot);\n\n return currentScore;\n};\n\nexport const interpolate = (x: number, x0: number, x1: number, y0: number, y1: number) => {\n if (x > x1) {\n throw 'Cannot do extrapolation';\n }\n\n return y0 + ((x - x0) * (y1 - y0)) / (x1 - x0);\n};\n\nexport const getBorrowRate = (currentUtilization: number, curve: [number, number][]): number => {\n let [x0, y0, x1, y1] = [0, 0, 0, 0];\n\n if (curve.length < 2) {\n throw 'Invalid borrow rate curve, only one point';\n }\n\n if (currentUtilization > 1) {\n currentUtilization = 1;\n }\n\n for (let i = 1; i < curve.length; i++) {\n const [pointUtilization, pointRate] = curve[i];\n if (pointUtilization === currentUtilization) {\n return pointRate;\n }\n\n if (currentUtilization <= pointUtilization) {\n x0 = curve[i - 1][0];\n y0 = curve[i - 1][1];\n x1 = curve[i][0];\n y1 = curve[i][1];\n break;\n }\n }\n\n if (x0 === 0 && y0 === 0 && x1 === 0 && y1 === 0) {\n console.log('All are 0');\n throw 'Invalid borrow rate curve, could not identify the interpolation points.';\n }\n\n if (x0 >= x1 || y0 > y1) {\n console.log('(x0, y0), (x1, y1)', x0, y0, x1, y1);\n throw 'Invalid borrow rate curve, curve is not uniformly increasing';\n }\n\n return interpolate(currentUtilization, x0, x1, y0, y1);\n};\n\nexport const parseTokenSymbol = (tokenSymbol: number[]): string => {\n return String.fromCharCode(...tokenSymbol.filter((x) => x > 0));\n};\n\nexport function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function numberToLamportsDecimal(amount: Decimal.Value, decimals: number): Decimal {\n const factor = 10 ** decimals;\n return new Decimal(amount).mul(factor);\n}\n\nexport function lamportsToNumberDecimal(amount: Decimal.Value, decimals: number): Decimal {\n const factor = 10 ** decimals;\n return new Decimal(amount).div(factor);\n}\n\nexport const isSolMint = (mint: PublicKey): boolean => {\n return SOL_MINTS.filter((m) => m.equals(mint)).length > 0;\n};\n\nexport const valueOrZero = (value: Decimal): Decimal => {\n const zero = new Decimal(0);\n if (value.isNaN() || !value.isFinite()) {\n return zero;\n } else {\n return value;\n }\n};\n\nexport const isEmptyObject = (obj: any) => {\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n};\n\nexport const positiveOrZero = (value: Decimal): Decimal => {\n const zero = new Decimal(0);\n return Decimal.max(value, zero);\n};\n\nexport function calculateAPYFromAPR(apr: number) {\n const apy = new Decimal(1).plus(new Decimal(apr).dividedBy(SLOTS_PER_YEAR)).toNumber() ** SLOTS_PER_YEAR - 1;\n return apy;\n}\n\nexport function calculateAPRFromAPY(apy: Decimal.Value) {\n return new Decimal(apy)\n .plus(1)\n .pow(1 / SLOTS_PER_YEAR)\n .minus(1)\n .times(SLOTS_PER_YEAR);\n}\n"]}
|
|
@@ -222,6 +222,106 @@ function main() {
|
|
|
222
222
|
const oracleConfigs = yield kaminoManager.getScopeOracleConfigs();
|
|
223
223
|
console.log('oracleConfigs', JSON.parse(JSON.stringify(oracleConfigs)));
|
|
224
224
|
}));
|
|
225
|
+
commands
|
|
226
|
+
.command('download-lending-market-config')
|
|
227
|
+
.requiredOption('--lending-market <string>', 'Lending Market Address')
|
|
228
|
+
.option(`--staging`, 'If true, will use the staging programs')
|
|
229
|
+
.action((_a) => __awaiter(this, [_a], void 0, function* ({ lendingMarket, staging }) {
|
|
230
|
+
const env = initializeClient(false, staging);
|
|
231
|
+
const lendingMarketAddress = new web3_js_1.PublicKey(lendingMarket);
|
|
232
|
+
const lendingMarketState = yield lib_1.LendingMarket.fetch(env.provider.connection, lendingMarketAddress, env.kLendProgramId);
|
|
233
|
+
if (!lendingMarketState) {
|
|
234
|
+
throw new Error('Lending Market not found');
|
|
235
|
+
}
|
|
236
|
+
fs.mkdirSync('./configs/' + lendingMarketAddress.toBase58(), { recursive: true });
|
|
237
|
+
const lendingMarketConfigForFile = lendingMarketState.toJSON();
|
|
238
|
+
fs.writeFileSync('./configs/' + lendingMarketAddress.toBase58() + '/market-' + lendingMarketAddress.toBase58() + '.json', JSON.stringify(lendingMarketConfigForFile, null, 2));
|
|
239
|
+
}));
|
|
240
|
+
commands
|
|
241
|
+
.command('download-lending-market-config-and-all-reserves-configs')
|
|
242
|
+
.requiredOption('--lending-market <string>', 'Lending Market Address')
|
|
243
|
+
.option(`--staging`, 'If true, will use the staging programs')
|
|
244
|
+
.action((_a) => __awaiter(this, [_a], void 0, function* ({ lendingMarket, staging }) {
|
|
245
|
+
const env = initializeClient(false, staging);
|
|
246
|
+
const decoder = new TextDecoder('utf-8');
|
|
247
|
+
const lendingMarketAddress = new web3_js_1.PublicKey(lendingMarket);
|
|
248
|
+
const kaminoMarket = yield lib_1.KaminoMarket.load(env.provider.connection, lendingMarketAddress, lib_1.DEFAULT_RECENT_SLOT_DURATION_MS, env.kLendProgramId);
|
|
249
|
+
if (!kaminoMarket) {
|
|
250
|
+
throw new Error('Lending Market not found');
|
|
251
|
+
}
|
|
252
|
+
const lendingMarketState = yield lib_1.LendingMarket.fetch(env.provider.connection, lendingMarketAddress, env.kLendProgramId);
|
|
253
|
+
if (!lendingMarketState) {
|
|
254
|
+
throw new Error('Lending Market not found');
|
|
255
|
+
}
|
|
256
|
+
fs.mkdirSync('./configs/' + lendingMarketAddress.toBase58(), { recursive: true });
|
|
257
|
+
const lendingMarketConfigForFile = lendingMarketState.toJSON();
|
|
258
|
+
fs.writeFileSync('./configs/' + lendingMarketAddress.toBase58() + '/market-' + lendingMarketAddress.toBase58() + '.json', JSON.stringify(lendingMarketConfigForFile, null, 2));
|
|
259
|
+
kaminoMarket.reserves.forEach((reserve) => __awaiter(this, void 0, void 0, function* () {
|
|
260
|
+
const reserveState = reserve.state;
|
|
261
|
+
const reserveName = decoder.decode(Uint8Array.from(reserveState.config.tokenInfo.name)).replace(/\0/g, '');
|
|
262
|
+
const reserveConfigDisplay = parseReserveConfigToFile(reserveState.config);
|
|
263
|
+
fs.writeFileSync('./configs/' + lendingMarketAddress.toBase58() + '/' + reserveName + '.json', JSON.stringify(reserveConfigDisplay, null, 2));
|
|
264
|
+
}));
|
|
265
|
+
}));
|
|
266
|
+
commands
|
|
267
|
+
.command('update-lending-market-from-config')
|
|
268
|
+
.requiredOption('--lending-market <string>', 'Lending Market address')
|
|
269
|
+
.requiredOption('--lending-market-config-path <string>', 'Path for the market config')
|
|
270
|
+
.requiredOption(`--mode <string>`, 'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage')
|
|
271
|
+
.option(`--staging`, 'If true, will use the staging programs')
|
|
272
|
+
.action((_a) => __awaiter(this, [_a], void 0, function* ({ lendingMarket, lendingMarketConfigPath, mode, staging }) {
|
|
273
|
+
const env = initializeClient(mode === 'multisig', staging);
|
|
274
|
+
const lendingMarketAddress = new web3_js_1.PublicKey(lendingMarket);
|
|
275
|
+
const lendingMarketState = yield lib_1.LendingMarket.fetch(env.provider.connection, lendingMarketAddress, env.kLendProgramId);
|
|
276
|
+
if (!lendingMarketState) {
|
|
277
|
+
throw new Error('Lending Market not found');
|
|
278
|
+
}
|
|
279
|
+
const marketWithAddress = {
|
|
280
|
+
address: lendingMarketAddress,
|
|
281
|
+
state: lendingMarketState,
|
|
282
|
+
};
|
|
283
|
+
if (mode === 'multisig') {
|
|
284
|
+
throw new Error('If using multisig mode, multisig is required');
|
|
285
|
+
}
|
|
286
|
+
const kaminoManager = new lib_1.KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);
|
|
287
|
+
const newLendingMarket = lib_1.LendingMarket.fromJSON(JSON.parse(fs.readFileSync(lendingMarketConfigPath, 'utf8')));
|
|
288
|
+
const ixns = kaminoManager.updateLendingMarketIxs(marketWithAddress, newLendingMarket);
|
|
289
|
+
// executing 6 ixns in a txn to make sure they fit
|
|
290
|
+
for (let ixnIndex = 0; ixnIndex < ixns.length; ixnIndex += 6) {
|
|
291
|
+
const ixnToExecute = ixns.slice(ixnIndex, ixnIndex + 6);
|
|
292
|
+
const _updateLendingMarketSig = yield processTxn(env.client, env.payer, ixnToExecute, mode, 2500, [], 400000);
|
|
293
|
+
}
|
|
294
|
+
mode === 'execute' &&
|
|
295
|
+
console.log('Reserve Updated with new config -> ', JSON.parse(JSON.stringify(newLendingMarket)));
|
|
296
|
+
}));
|
|
297
|
+
commands
|
|
298
|
+
.command('update-lending-market-owner')
|
|
299
|
+
.requiredOption('--lending-market <string>', 'Lending Market address')
|
|
300
|
+
.requiredOption(`--mode <string>`, 'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage')
|
|
301
|
+
.option(`--staging`, 'If true, will use the staging programs')
|
|
302
|
+
.action((_a) => __awaiter(this, [_a], void 0, function* ({ lendingMarket, mode, staging }) {
|
|
303
|
+
const env = initializeClient(mode === 'multisig', staging);
|
|
304
|
+
const lendingMarketAddress = new web3_js_1.PublicKey(lendingMarket);
|
|
305
|
+
const lendingMarketState = yield lib_1.LendingMarket.fetch(env.provider.connection, lendingMarketAddress, env.kLendProgramId);
|
|
306
|
+
if (!lendingMarketState) {
|
|
307
|
+
throw new Error('Lending Market not found');
|
|
308
|
+
}
|
|
309
|
+
const marketWithAddress = {
|
|
310
|
+
address: lendingMarketAddress,
|
|
311
|
+
state: lendingMarketState,
|
|
312
|
+
};
|
|
313
|
+
if (!lendingMarketState) {
|
|
314
|
+
throw new Error('Lending Market not found');
|
|
315
|
+
}
|
|
316
|
+
if (mode === 'multisig') {
|
|
317
|
+
throw new Error('If using multisig mode, multisig is required');
|
|
318
|
+
}
|
|
319
|
+
const kaminoManager = new lib_1.KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);
|
|
320
|
+
const ixn = kaminoManager.updateLendingMarketOwnerIxs(marketWithAddress);
|
|
321
|
+
const _updateLendingMarketSig = yield processTxn(env.client, env.payer, [ixn], mode, 2500, [], 400000);
|
|
322
|
+
mode === 'execute' &&
|
|
323
|
+
console.log('Lending market admin updated to the new admin -> ', JSON.parse(JSON.stringify(lendingMarketState.lendingMarketOwnerCached)));
|
|
324
|
+
}));
|
|
225
325
|
yield commands.parseAsync();
|
|
226
326
|
});
|
|
227
327
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client_kamino_manager.js","sourceRoot":"","sources":["../src/client_kamino_manager.ts"],"names":[],"mappings":"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","sourcesContent":["import dotenv from 'dotenv';\nimport { Command } from 'commander';\nimport {\n ComputeBudgetProgram,\n Keypair,\n PublicKey,\n Signer,\n Transaction,\n TransactionInstruction,\n TransactionSignature,\n VersionedTransaction,\n} from '@solana/web3.js';\nimport {\n AssetReserveConfigCli,\n Chain,\n encodeTokenName,\n KaminoManager,\n KaminoVault,\n KaminoVaultConfig,\n LendingMarket,\n MAINNET_BETA_CHAIN_ID,\n Reserve,\n ReserveAllocationConfig,\n ReserveWithAddress,\n signSendAndConfirmRawTransactionWithRetry,\n Web3Client,\n} from './lib';\nimport * as anchor from '@coral-xyz/anchor';\nimport { binary_to_base58 } from 'base58-js';\nimport {\n BorrowRateCurve,\n CurvePointFields,\n PriceHeuristic,\n ReserveConfig,\n ReserveConfigFields,\n ScopeConfiguration,\n TokenInfo,\n WithdrawalCaps,\n} from './idl_codegen/types';\nimport { Fraction } from './classes/fraction';\nimport Decimal from 'decimal.js';\nimport { BN } from '@coral-xyz/anchor';\nimport { PythConfiguration, SwitchboardConfiguration } from './idl_codegen_kamino_vault/types';\nimport * as fs from 'fs';\nimport { TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport { MarketWithAddress } from './utils/managerTypes';\n\ndotenv.config({\n path: `.env${process.env.ENV ? '.' + process.env.ENV : ''}`,\n});\n\nasync function main() {\n const commands = new Command();\n\n commands.name('kamino-manager-cli').description('CLI to interact with the kvaults and klend programs');\n\n commands\n .command('create-market')\n .requiredOption(\n `--mode <string>`,\n 'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage'\n )\n .option(`--staging`, 'If true, will use the staging programs')\n .option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')\n .action(async ({ mode, staging, multisig }) => {\n const env = initializeClient(mode === 'multisig', staging);\n\n if (mode === 'multisig' && !multisig) {\n throw new Error('If using multisig mode, multisig pubkey is required');\n }\n\n const multisigPk = multisig ? new PublicKey(multisig) : PublicKey.default;\n\n const kaminoManager = new KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);\n\n const { market: marketKp, ixns: createMarketIxns } = await kaminoManager.createMarketIxs({\n admin: mode === 'multisig' ? multisigPk : env.payer.publicKey,\n });\n\n const _createMarketSig = await processTxn(env.client, env.payer, createMarketIxns, mode, 2500, [marketKp]);\n\n mode === 'execute' && console.log('Market created:', marketKp.publicKey.toBase58());\n });\n\n commands\n .command('add-asset-to-market')\n .requiredOption('--market <string>', 'Market addres to add asset to')\n .requiredOption('--mint <string>', 'Reserve liquidity token mint')\n .requiredOption('--mint-program-id <string>', 'Reserve liquidity token mint program id')\n .requiredOption('--reserve-config-path <string>', 'Path for the reserve config')\n .requiredOption(\n `--mode <string>`,\n 'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage'\n )\n .option(`--staging`, 'If true, will use the staging programs')\n .option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')\n .action(async ({ market, mint, mintProgramId, reserveConfigPath, mode, staging, multisig }) => {\n const env = initializeClient(mode === 'multisig', staging);\n const tokenMint = new PublicKey(mint);\n const tokenMintProgramId = new PublicKey(mintProgramId);\n const marketAddress = new PublicKey(market);\n\n if (mode === 'multisig' && !multisig) {\n throw new Error('If using multisig mode, multisig is required');\n }\n\n const multisigPk = multisig ? new PublicKey(multisig) : PublicKey.default;\n const kaminoManager = new KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);\n\n const reserveConfigFromFile = JSON.parse(fs.readFileSync(reserveConfigPath, 'utf8'));\n\n const reserveConfig = parseReserveConfigFromFile(reserveConfigFromFile);\n const assetConfig = new AssetReserveConfigCli(tokenMint, tokenMintProgramId, reserveConfig);\n\n const { reserve, txnIxns } = await kaminoManager.addAssetToMarketIxs({\n admin: mode === 'multisig' ? multisigPk : env.payer.publicKey,\n marketAddress: marketAddress,\n assetConfig: assetConfig,\n });\n\n console.log('reserve: ', reserve.publicKey);\n\n const _createReserveSig = await processTxn(env.client, env.payer, txnIxns[0], mode, 2500, [reserve]);\n\n const _updateReserveSig = await processTxn(env.client, env.payer, txnIxns[1], mode, 2500, [], 400_000);\n\n mode === 'execute' &&\n console.log(\n 'Reserve Created with config:',\n JSON.parse(JSON.stringify(reserveConfig)),\n '\\nreserve address:',\n reserve.publicKey.toBase58()\n );\n });\n\n commands\n .command('update-reserve-config')\n .requiredOption('--reserve <string>', 'Reserve address')\n .requiredOption('--reserve-config-path <string>', 'Path for the reserve config')\n .requiredOption(\n `--mode <string>`,\n 'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage'\n )\n .option('--update-entire-config', 'If set, it will update entire reserve config in 1 instruction')\n .option(`--staging`, 'If true, will use the staging programs')\n .action(async ({ reserve, reserveConfigPath, mode, updateEntireConfig, staging, multisig }) => {\n const env = initializeClient(mode === 'multisig', staging);\n const reserveAddress = new PublicKey(reserve);\n const reserveState = await Reserve.fetch(env.provider.connection, reserveAddress, env.kLendProgramId);\n if (!reserveState) {\n throw new Error('Reserve not found');\n }\n\n const marketAddress = reserveState.lendingMarket;\n const marketState = await LendingMarket.fetch(env.provider.connection, marketAddress, env.kLendProgramId);\n if (!marketState) {\n throw new Error('Market not found');\n }\n const marketWithAddress: MarketWithAddress = {\n address: marketAddress,\n state: marketState,\n };\n\n if (mode === 'multisig' && !multisig) {\n throw new Error('If using multisig mode, multisig is required');\n }\n\n const kaminoManager = new KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);\n\n const reserveConfigFromFile = JSON.parse(fs.readFileSync(reserveConfigPath, 'utf8'));\n\n const reserveConfig = parseReserveConfigFromFile(reserveConfigFromFile);\n\n const ixns = await kaminoManager.updateReserveIxs(\n marketWithAddress,\n reserveAddress,\n reserveConfig,\n reserveState,\n updateEntireConfig\n );\n\n const _updateReserveSig = await processTxn(env.client, env.payer, ixns, mode, 2500, [], 400_000);\n\n mode === 'execute' && console.log('Reserve Updated with config -> ', JSON.parse(JSON.stringify(reserveConfig)));\n });\n\n commands\n .command('download-reserve-config')\n .requiredOption('--reserve <string>', 'Reserve address')\n .option(`--staging`, 'If true, will use the staging programs')\n .action(async ({ reserve, staging }) => {\n const env = initializeClient(false, staging);\n const reserveAddress = new PublicKey(reserve);\n const reserveState = await Reserve.fetch(env.provider.connection, reserveAddress, env.kLendProgramId);\n if (!reserveState) {\n throw new Error('Reserve not found');\n }\n\n fs.mkdirSync('./configs/' + reserveState.lendingMarket.toBase58(), { recursive: true });\n\n const decoder = new TextDecoder('utf-8');\n const reserveName = decoder.decode(Uint8Array.from(reserveState.config.tokenInfo.name)).replace(/\\0/g, '');\n\n const reserveConfigDisplay = parseReserveConfigToFile(reserveState.config);\n\n fs.writeFileSync(\n './configs/' + reserveState.lendingMarket.toBase58() + '/' + reserveName + '.json',\n JSON.stringify(reserveConfigDisplay, null, 2)\n );\n });\n\n commands\n .command('create-vault')\n .requiredOption('--mint <string>', 'Vault token mint')\n .requiredOption(\n `--mode <string>`,\n 'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage'\n )\n .option(`--staging`, 'If true, will use the staging programs')\n .option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')\n .action(async ({ mint, mode, staging, multisig }) => {\n const env = initializeClient(mode === 'multisig', staging);\n const tokenMint = new PublicKey(mint);\n\n if (mode === 'multisig' && !multisig) {\n throw new Error('If using multisig mode, multisig is required');\n }\n\n const multisigPk = multisig ? new PublicKey(multisig) : PublicKey.default;\n const kaminoManager = new KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);\n\n const kaminoVaultConfig = new KaminoVaultConfig({\n admin: mode === 'multisig' ? multisigPk : env.payer.publicKey,\n tokenMint: tokenMint,\n tokenMintProgramId: TOKEN_PROGRAM_ID,\n performanceFeeRate: new Decimal(0.0),\n managementFeeRate: new Decimal(0.0),\n });\n\n const { vault: vaultKp, ixns: instructions } = await kaminoManager.createVaultIxs(kaminoVaultConfig);\n\n const _createVaultSig = await processTxn(env.client, env.payer, instructions, mode, 2500, [vaultKp]);\n\n mode === 'execute' && console.log('Vault created:', vaultKp.publicKey.toBase58());\n });\n\n commands\n .command('update-vault-reserve-allocation')\n .requiredOption('--vault <string>', 'Vault address')\n .requiredOption('--reserve <string>', 'Reserve address')\n .requiredOption('--allocation-weight <number>', 'Allocation weight')\n .requiredOption('--allocation-cap <string>', 'Allocation cap decimal value')\n .requiredOption(\n `--mode <string>`,\n 'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage'\n )\n .option(`--staging`, 'If true, will use the staging programs')\n .option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')\n .action(async ({ vault, reserve, allocationWeight, allocationCap, mode, staging, multisig }) => {\n const env = initializeClient(mode === 'multisig', staging);\n const reserveAddress = new PublicKey(reserve);\n const vaultAddress = new PublicKey(vault);\n const allocationWeightValue = Number(allocationWeight);\n const allocationCapDecimal = new Decimal(allocationCap);\n\n if (mode === 'multisig' && !multisig) {\n throw new Error('If using multisig mode, multisig is required');\n }\n\n const kaminoManager = new KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);\n const reserveState = await Reserve.fetch(env.provider.connection, reserveAddress, env.kLendProgramId);\n if (!reserveState) {\n throw new Error('Reserve not found');\n }\n\n const reserveWithAddress: ReserveWithAddress = {\n address: reserveAddress,\n state: reserveState,\n };\n const firstReserveAllocationConfig = new ReserveAllocationConfig(\n reserveWithAddress,\n allocationWeightValue,\n allocationCapDecimal\n );\n const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);\n const instructions = await kaminoManager.updateVaultReserveAllocationIxs(\n kaminoVault,\n firstReserveAllocationConfig\n );\n\n const updateVaultAllocationSig = await processTxn(env.client, env.payer, [instructions], mode, 2500, []);\n\n mode === 'execute' && console.log('Vault allocation updated:', updateVaultAllocationSig);\n });\n\n commands.command('get-oracle-mappings').action(async () => {\n const env = initializeClient(false, false);\n const kaminoManager = new KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);\n\n console.log('Getting oracle mappings');\n const oracleConfigs = await kaminoManager.getScopeOracleConfigs();\n console.log('oracleConfigs', JSON.parse(JSON.stringify(oracleConfigs)));\n });\n\n await commands.parseAsync();\n}\n\nmain()\n .then(() => {\n process.exit();\n })\n .catch((e) => {\n console.error('\\n\\nKamino CLI exited with error:\\n\\n', e);\n process.exit(1);\n });\n\nexport function parseKeypairFile(file: string): Keypair {\n return Keypair.fromSecretKey(Buffer.from(JSON.parse(require('fs').readFileSync(file))));\n}\n\nfunction initializeClient(multisig: boolean, staging: boolean): Env {\n const admin = process.env.ADMIN!;\n const rpc = process.env.RPC!;\n const kLendProgramId = staging ? process.env.KLEND_PROGRAM_ID_STAGING! : process.env.KLEND_PROGRAM_ID_MAINNET!;\n const kVaultProgramId = staging ? process.env.KVAULT_PROGRAM_ID_STAGING! : process.env.KVAULT_PROGRAM_ID_MAINNET!;\n\n // Get connection first\n const env: Env = setUpProgram({\n adminFilePath: admin,\n rpc: rpc,\n kLendProgramId: new PublicKey(kLendProgramId),\n kVaultProgramId: new PublicKey(kVaultProgramId),\n });\n\n !multisig && console.log('\\nSettings ⚙️');\n !multisig && console.log('Admin:', admin);\n !multisig && console.log('Rpc:', rpc);\n !multisig && console.log('kLendProgramId:', kLendProgramId);\n !multisig && console.log('kVaultProgramId:', kVaultProgramId);\n\n return env;\n}\n\nfunction setUpProgram(args: {\n adminFilePath: string;\n rpc: string;\n kLendProgramId: PublicKey;\n kVaultProgramId: PublicKey;\n}): Env {\n const chain: Chain = {\n name: 'mainnet-beta',\n endpoint: args.rpc,\n wsEndpoint: args.rpc,\n chainID: MAINNET_BETA_CHAIN_ID,\n displayName: 'Mainnet Beta (Triton)',\n };\n const client = new Web3Client(chain);\n const connection = client.sendConnection;\n const payer = parseKeypairFile(args.adminFilePath);\n const wallet = new anchor.Wallet(payer);\n const provider = new anchor.AnchorProvider(connection, wallet, anchor.AnchorProvider.defaultOptions());\n\n return {\n provider,\n payer,\n client,\n kLendProgramId: args.kLendProgramId,\n kVaultProgramId: args.kVaultProgramId,\n };\n}\n\nexport type Env = {\n provider: anchor.AnchorProvider;\n payer: Keypair;\n client: Web3Client;\n kLendProgramId: PublicKey;\n kVaultProgramId: PublicKey;\n};\n\nasync function processTxn(\n web3Client: Web3Client,\n admin: Keypair,\n ixns: TransactionInstruction[],\n mode: string,\n priorityFeeMultiplier: number = 2500,\n extraSigners: Signer[],\n computeUnits: number = 200_000,\n priorityFeeLamports: number = 1000\n): Promise<TransactionSignature> {\n if (mode !== 'inspect' && mode !== 'simulate' && mode !== 'execute' && mode !== 'multisig') {\n throw new Error('Invalid mode: ' + mode + '. Must be one of: inspect/simulate/execute/multisig');\n }\n if (mode === 'multisig') {\n const { blockhash } = await web3Client.connection.getLatestBlockhash();\n const txn = new Transaction();\n txn.add(...ixns);\n txn.recentBlockhash = blockhash;\n txn.feePayer = admin.publicKey;\n\n console.log(binary_to_base58(txn.serializeMessage()));\n\n return '';\n } else {\n const microLamport = priorityFeeLamports * 10 ** 6; // 1000 lamports\n const microLamportsPrioritizationFee = microLamport / computeUnits;\n\n const tx = new Transaction();\n const { blockhash } = await web3Client.connection.getLatestBlockhash();\n if (priorityFeeMultiplier) {\n const priorityFeeIxn = createAddExtraComputeUnitFeeTransaction(\n computeUnits,\n microLamportsPrioritizationFee * priorityFeeMultiplier\n );\n tx.add(...priorityFeeIxn);\n }\n tx.recentBlockhash = blockhash;\n tx.feePayer = admin.publicKey;\n tx.add(...ixns);\n\n if (mode === 'execute') {\n return await signSendAndConfirmRawTransactionWithRetry({\n mainConnection: web3Client.sendConnection,\n extraConnections: [],\n tx: new VersionedTransaction(tx.compileMessage()),\n signers: [admin, ...extraSigners],\n commitment: 'confirmed',\n sendTransactionOptions: {\n skipPreflight: true,\n preflightCommitment: 'confirmed',\n },\n });\n } else if (mode === 'simulate') {\n const simulation = await web3Client.sendConnection.simulateTransaction(\n new VersionedTransaction(tx.compileMessage())\n );\n console.log('Simulation: \\n' + simulation.value.logs);\n } else if (mode === 'inspect') {\n console.log(\n 'Tx in B64',\n `https://explorer.solana.com/tx/inspector?message=${encodeURIComponent(\n tx.serializeMessage().toString('base64')\n )}`\n );\n }\n return '';\n }\n}\n\nfunction createAddExtraComputeUnitFeeTransaction(units: number, microLamports: number): TransactionInstruction[] {\n const ixns: TransactionInstruction[] = [];\n ixns.push(ComputeBudgetProgram.setComputeUnitLimit({ units }));\n ixns.push(ComputeBudgetProgram.setComputeUnitPrice({ microLamports }));\n return ixns;\n}\n\nfunction parseReserveConfigFromFile(farmConfigFromFile: any): ReserveConfig {\n const reserveConfigFields: ReserveConfigFields = {\n status: farmConfigFromFile.status,\n loanToValuePct: farmConfigFromFile.loanToValuePct,\n liquidationThresholdPct: farmConfigFromFile.liquidationThresholdPct,\n minLiquidationBonusBps: farmConfigFromFile.minLiquidationBonusBps,\n protocolLiquidationFeePct: farmConfigFromFile.protocolLiquidationFeePct,\n protocolTakeRatePct: farmConfigFromFile.protocolLiquidationFeePct,\n assetTier: farmConfigFromFile.assetTier,\n multiplierSideBoost: farmConfigFromFile.multiplierSideBoost,\n maxLiquidationBonusBps: farmConfigFromFile.maxLiquidationBonusBps,\n badDebtLiquidationBonusBps: farmConfigFromFile.badDebtLiquidationBonusBps,\n fees: {\n borrowFeeSf: Fraction.fromDecimal(new Decimal(farmConfigFromFile.fees.borrowFee)).valueSf,\n flashLoanFeeSf: Fraction.fromDecimal(new Decimal(farmConfigFromFile.fees.flashLoanFee)).valueSf,\n padding: Array(8).fill(0),\n },\n depositLimit: new BN(farmConfigFromFile.depositLimit),\n borrowLimit: new BN(farmConfigFromFile.borrowLimit),\n tokenInfo: {\n name: encodeTokenName(farmConfigFromFile.tokenInfo.name),\n heuristic: new PriceHeuristic({\n lower: new BN(farmConfigFromFile.tokenInfo.heuristic.lower),\n upper: new BN(farmConfigFromFile.tokenInfo.heuristic.upper),\n exp: new BN(farmConfigFromFile.tokenInfo.heuristic.exp),\n }),\n maxTwapDivergenceBps: new BN(farmConfigFromFile.tokenInfo.maxTwapDivergenceBps),\n maxAgePriceSeconds: new BN(farmConfigFromFile.tokenInfo.maxAgePriceSeconds),\n maxAgeTwapSeconds: new BN(farmConfigFromFile.tokenInfo.maxAgeTwapSeconds),\n ...parseOracleConfiguration(farmConfigFromFile),\n blockPriceUsage: farmConfigFromFile.tokenInfo.blockPriceUsage,\n reserved: Array(7).fill(0),\n padding: Array(19).fill(new BN(0)),\n } as TokenInfo,\n borrowRateCurve: parseBorrowRateCurve(farmConfigFromFile),\n depositWithdrawalCap: new WithdrawalCaps({\n configCapacity: new BN(farmConfigFromFile.depositWithdrawalCap.configCapacity),\n currentTotal: new BN(0),\n lastIntervalStartTimestamp: new BN(0),\n configIntervalLengthSeconds: new BN(farmConfigFromFile.depositWithdrawalCap.configIntervalLengthSeconds),\n }),\n debtWithdrawalCap: new WithdrawalCaps({\n configCapacity: new BN(farmConfigFromFile.debtWithdrawalCap.configCapacity),\n currentTotal: new BN(0),\n lastIntervalStartTimestamp: new BN(0),\n configIntervalLengthSeconds: new BN(farmConfigFromFile.debtWithdrawalCap.configIntervalLengthSeconds),\n }),\n deleveragingMarginCallPeriodSecs: new BN(farmConfigFromFile.deleveragingMarginCallPeriodSecs),\n borrowFactorPct: new BN(farmConfigFromFile.borrowFactorPct),\n elevationGroups: farmConfigFromFile.elevationGroups,\n deleveragingThresholdSlotsPerBps: new BN(farmConfigFromFile.deleveragingThresholdSlotsPerBps),\n multiplierTagBoost: farmConfigFromFile.multiplierTagBoost,\n disableUsageAsCollOutsideEmode: farmConfigFromFile.disableUsageAsCollOutsideEmode,\n utilizationLimitBlockBorrowingAbove: farmConfigFromFile.utilizationLimitBlockBorrowingAbove,\n hostFixedInterestRateBps: farmConfigFromFile.hostFixedInterestRateBps,\n borrowLimitOutsideElevationGroup: new BN(farmConfigFromFile.borrowLimitOutsideElevationGroup),\n borrowLimitAgainstThisCollateralInElevationGroup: parseReserveBorrowLimitAgainstCollInEmode(farmConfigFromFile),\n reserved1: Array(2).fill(0),\n };\n\n return new ReserveConfig(reserveConfigFields);\n}\n\nfunction parseOracleConfiguration(farmConfigFromFile: any): {\n pythConfiguration: PythConfiguration;\n switchboardConfiguration: SwitchboardConfiguration;\n scopeConfiguration: ScopeConfiguration;\n} {\n const pythConfiguration = new PythConfiguration({\n price: new PublicKey(farmConfigFromFile.tokenInfo.pythConfiguration.price),\n });\n const switchboardConfiguration = new SwitchboardConfiguration({\n priceAggregator: new PublicKey(farmConfigFromFile.tokenInfo.switchboardConfiguration.priceAggregator),\n twapAggregator: new PublicKey(farmConfigFromFile.tokenInfo.switchboardConfiguration.twapAggregator),\n });\n const priceChain = [65535, 65535, 65535, 65535];\n const twapChain = [65535, 65535, 65535, 65535];\n\n const priceChainFromFile: number[] = farmConfigFromFile.tokenInfo.scopeConfiguration.priceChain;\n const twapChainFromFile: number[] = farmConfigFromFile.tokenInfo.scopeConfiguration.twapChain;\n\n priceChainFromFile.forEach((value, index) => (priceChain[index] = value));\n twapChainFromFile.forEach((value, index) => (twapChain[index] = value));\n\n const scopeConfiguration = new ScopeConfiguration({\n priceFeed: new PublicKey(farmConfigFromFile.tokenInfo.scopeConfiguration.priceFeed),\n priceChain: priceChain,\n twapChain: twapChain,\n });\n\n return {\n pythConfiguration,\n switchboardConfiguration,\n scopeConfiguration,\n };\n}\n\nfunction parseBorrowRateCurve(farmConfigFromFile: any): BorrowRateCurve {\n const curvePoints: CurvePointFields[] = [];\n\n farmConfigFromFile.borrowRateCurve.points.forEach((curvePoint: { utilizationRateBps: any; borrowRateBps: any }) =>\n curvePoints.push({\n utilizationRateBps: curvePoint.utilizationRateBps,\n borrowRateBps: curvePoint.borrowRateBps,\n })\n );\n\n const finalCruvePoints: CurvePointFields[] = Array(11).fill(curvePoints[curvePoints.length - 1]);\n\n curvePoints.forEach((curvePoint, index) => (finalCruvePoints[index] = curvePoint));\n\n const borrowRateCurve = new BorrowRateCurve({ points: finalCruvePoints });\n\n return borrowRateCurve;\n}\n\nfunction parseReserveBorrowLimitAgainstCollInEmode(farmConfigFromFile: any): BN[] {\n const reserveBorrowLimitAgainstCollInEmode: BN[] = Array(32).fill(new BN(0));\n\n farmConfigFromFile.borrowLimitAgainstThisCollateralInElevationGroup.forEach(\n (limit: any, index: number) => (reserveBorrowLimitAgainstCollInEmode[index] = new BN(limit))\n );\n\n return reserveBorrowLimitAgainstCollInEmode;\n}\n\nfunction parseReserveConfigToFile(reserveConfig: ReserveConfig) {\n const decoder = new TextDecoder('utf-8');\n\n return {\n status: reserveConfig.status,\n loanToValuePct: reserveConfig.loanToValuePct,\n liquidationThresholdPct: reserveConfig.liquidationThresholdPct,\n minLiquidationBonusBps: reserveConfig.minLiquidationBonusBps,\n protocolLiquidationFeePct: reserveConfig.protocolLiquidationFeePct,\n protocolTakeRatePct: reserveConfig.protocolLiquidationFeePct,\n assetTier: reserveConfig.assetTier,\n multiplierSideBoost: reserveConfig.multiplierSideBoost,\n maxLiquidationBonusBps: reserveConfig.maxLiquidationBonusBps,\n badDebtLiquidationBonusBps: reserveConfig.badDebtLiquidationBonusBps,\n fees: {\n borrowFee: new Fraction(reserveConfig.fees.borrowFeeSf).toDecimal().toString(),\n flashLoanFee: new Fraction(reserveConfig.fees.flashLoanFeeSf).toDecimal().toString(),\n padding: Array(8).fill(0),\n },\n depositLimit: reserveConfig.depositLimit.toString(),\n borrowLimit: reserveConfig.borrowLimit.toString(),\n tokenInfo: {\n name: decoder.decode(Uint8Array.from(reserveConfig.tokenInfo.name)).replace(/\\0/g, ''),\n heuristic: {\n exp: reserveConfig.tokenInfo.heuristic.exp.toString(),\n lower: reserveConfig.tokenInfo.heuristic.lower.toString(),\n upper: reserveConfig.tokenInfo.heuristic.upper.toString(),\n },\n maxTwapDivergenceBps: reserveConfig.tokenInfo.maxTwapDivergenceBps.toString(),\n maxAgePriceSeconds: reserveConfig.tokenInfo.maxAgePriceSeconds.toString(),\n maxAgeTwapSeconds: reserveConfig.tokenInfo.maxAgeTwapSeconds.toString(),\n scopeConfiguration: reserveConfig.tokenInfo.scopeConfiguration,\n switchboardConfiguration: reserveConfig.tokenInfo.switchboardConfiguration,\n pythConfiguration: reserveConfig.tokenInfo.pythConfiguration,\n blockPriceUsage: reserveConfig.tokenInfo.blockPriceUsage,\n },\n borrowRateCurve: reserveConfig.borrowRateCurve,\n depositWithdrawalCap: reserveConfig.depositWithdrawalCap,\n debtWithdrawalCap: reserveConfig.debtWithdrawalCap,\n deleveragingMarginCallPeriodSecs: reserveConfig.deleveragingMarginCallPeriodSecs.toString(),\n borrowFactorPct: reserveConfig.borrowFactorPct.toString(),\n elevationGroups: reserveConfig.elevationGroups,\n deleveragingThresholdSlotsPerBps: reserveConfig.deleveragingThresholdSlotsPerBps.toString(),\n multiplierTagBoost: reserveConfig.multiplierTagBoost,\n disableUsageAsCollOutsideEmode: reserveConfig.disableUsageAsCollOutsideEmode,\n utilizationLimitBlockBorrowingAbove: reserveConfig.utilizationLimitBlockBorrowingAbove,\n hostFixedInterestRateBps: reserveConfig.hostFixedInterestRateBps,\n borrowLimitOutsideElevationGroup: reserveConfig.borrowLimitOutsideElevationGroup.toString(),\n borrowLimitAgainstThisCollateralInElevationGroup:\n reserveConfig.borrowLimitAgainstThisCollateralInElevationGroup.map((entry) => entry.toString()),\n reserved1: Array(2).fill(0),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"client_kamino_manager.js","sourceRoot":"","sources":["../src/client_kamino_manager.ts"],"names":[],"mappings":"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","sourcesContent":["import dotenv from 'dotenv';\nimport { Command } from 'commander';\nimport {\n ComputeBudgetProgram,\n Keypair,\n PublicKey,\n Signer,\n Transaction,\n TransactionInstruction,\n TransactionSignature,\n VersionedTransaction,\n} from '@solana/web3.js';\nimport {\n AssetReserveConfigCli,\n Chain,\n DEFAULT_RECENT_SLOT_DURATION_MS,\n encodeTokenName,\n KaminoManager,\n KaminoMarket,\n KaminoVault,\n KaminoVaultConfig,\n LendingMarket,\n MAINNET_BETA_CHAIN_ID,\n Reserve,\n ReserveAllocationConfig,\n ReserveWithAddress,\n signSendAndConfirmRawTransactionWithRetry,\n Web3Client,\n} from './lib';\nimport * as anchor from '@coral-xyz/anchor';\nimport { binary_to_base58 } from 'base58-js';\nimport {\n BorrowRateCurve,\n CurvePointFields,\n PriceHeuristic,\n ReserveConfig,\n ReserveConfigFields,\n ScopeConfiguration,\n TokenInfo,\n WithdrawalCaps,\n} from './idl_codegen/types';\nimport { Fraction } from './classes/fraction';\nimport Decimal from 'decimal.js';\nimport { BN } from '@coral-xyz/anchor';\nimport { PythConfiguration, SwitchboardConfiguration } from './idl_codegen_kamino_vault/types';\nimport * as fs from 'fs';\nimport { TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport { MarketWithAddress } from './utils/managerTypes';\n\ndotenv.config({\n path: `.env${process.env.ENV ? '.' + process.env.ENV : ''}`,\n});\n\nasync function main() {\n const commands = new Command();\n\n commands.name('kamino-manager-cli').description('CLI to interact with the kvaults and klend programs');\n\n commands\n .command('create-market')\n .requiredOption(\n `--mode <string>`,\n 'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage'\n )\n .option(`--staging`, 'If true, will use the staging programs')\n .option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')\n .action(async ({ mode, staging, multisig }) => {\n const env = initializeClient(mode === 'multisig', staging);\n\n if (mode === 'multisig' && !multisig) {\n throw new Error('If using multisig mode, multisig pubkey is required');\n }\n\n const multisigPk = multisig ? new PublicKey(multisig) : PublicKey.default;\n\n const kaminoManager = new KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);\n\n const { market: marketKp, ixns: createMarketIxns } = await kaminoManager.createMarketIxs({\n admin: mode === 'multisig' ? multisigPk : env.payer.publicKey,\n });\n\n const _createMarketSig = await processTxn(env.client, env.payer, createMarketIxns, mode, 2500, [marketKp]);\n\n mode === 'execute' && console.log('Market created:', marketKp.publicKey.toBase58());\n });\n\n commands\n .command('add-asset-to-market')\n .requiredOption('--market <string>', 'Market addres to add asset to')\n .requiredOption('--mint <string>', 'Reserve liquidity token mint')\n .requiredOption('--mint-program-id <string>', 'Reserve liquidity token mint program id')\n .requiredOption('--reserve-config-path <string>', 'Path for the reserve config')\n .requiredOption(\n `--mode <string>`,\n 'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage'\n )\n .option(`--staging`, 'If true, will use the staging programs')\n .option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')\n .action(async ({ market, mint, mintProgramId, reserveConfigPath, mode, staging, multisig }) => {\n const env = initializeClient(mode === 'multisig', staging);\n const tokenMint = new PublicKey(mint);\n const tokenMintProgramId = new PublicKey(mintProgramId);\n const marketAddress = new PublicKey(market);\n\n if (mode === 'multisig' && !multisig) {\n throw new Error('If using multisig mode, multisig is required');\n }\n\n const multisigPk = multisig ? new PublicKey(multisig) : PublicKey.default;\n const kaminoManager = new KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);\n\n const reserveConfigFromFile = JSON.parse(fs.readFileSync(reserveConfigPath, 'utf8'));\n\n const reserveConfig = parseReserveConfigFromFile(reserveConfigFromFile);\n const assetConfig = new AssetReserveConfigCli(tokenMint, tokenMintProgramId, reserveConfig);\n\n const { reserve, txnIxns } = await kaminoManager.addAssetToMarketIxs({\n admin: mode === 'multisig' ? multisigPk : env.payer.publicKey,\n marketAddress: marketAddress,\n assetConfig: assetConfig,\n });\n\n console.log('reserve: ', reserve.publicKey);\n\n const _createReserveSig = await processTxn(env.client, env.payer, txnIxns[0], mode, 2500, [reserve]);\n\n const _updateReserveSig = await processTxn(env.client, env.payer, txnIxns[1], mode, 2500, [], 400_000);\n\n mode === 'execute' &&\n console.log(\n 'Reserve Created with config:',\n JSON.parse(JSON.stringify(reserveConfig)),\n '\\nreserve address:',\n reserve.publicKey.toBase58()\n );\n });\n\n commands\n .command('update-reserve-config')\n .requiredOption('--reserve <string>', 'Reserve address')\n .requiredOption('--reserve-config-path <string>', 'Path for the reserve config')\n .requiredOption(\n `--mode <string>`,\n 'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage'\n )\n .option('--update-entire-config', 'If set, it will update entire reserve config in 1 instruction')\n .option(`--staging`, 'If true, will use the staging programs')\n .action(async ({ reserve, reserveConfigPath, mode, updateEntireConfig, staging, multisig }) => {\n const env = initializeClient(mode === 'multisig', staging);\n const reserveAddress = new PublicKey(reserve);\n const reserveState = await Reserve.fetch(env.provider.connection, reserveAddress, env.kLendProgramId);\n if (!reserveState) {\n throw new Error('Reserve not found');\n }\n\n const marketAddress = reserveState.lendingMarket;\n const marketState = await LendingMarket.fetch(env.provider.connection, marketAddress, env.kLendProgramId);\n if (!marketState) {\n throw new Error('Market not found');\n }\n const marketWithAddress: MarketWithAddress = {\n address: marketAddress,\n state: marketState,\n };\n\n if (mode === 'multisig' && !multisig) {\n throw new Error('If using multisig mode, multisig is required');\n }\n\n const kaminoManager = new KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);\n\n const reserveConfigFromFile = JSON.parse(fs.readFileSync(reserveConfigPath, 'utf8'));\n\n const reserveConfig = parseReserveConfigFromFile(reserveConfigFromFile);\n\n const ixns = await kaminoManager.updateReserveIxs(\n marketWithAddress,\n reserveAddress,\n reserveConfig,\n reserveState,\n updateEntireConfig\n );\n\n const _updateReserveSig = await processTxn(env.client, env.payer, ixns, mode, 2500, [], 400_000);\n\n mode === 'execute' && console.log('Reserve Updated with config -> ', JSON.parse(JSON.stringify(reserveConfig)));\n });\n\n commands\n .command('download-reserve-config')\n .requiredOption('--reserve <string>', 'Reserve address')\n .option(`--staging`, 'If true, will use the staging programs')\n .action(async ({ reserve, staging }) => {\n const env = initializeClient(false, staging);\n const reserveAddress = new PublicKey(reserve);\n const reserveState = await Reserve.fetch(env.provider.connection, reserveAddress, env.kLendProgramId);\n if (!reserveState) {\n throw new Error('Reserve not found');\n }\n\n fs.mkdirSync('./configs/' + reserveState.lendingMarket.toBase58(), { recursive: true });\n\n const decoder = new TextDecoder('utf-8');\n const reserveName = decoder.decode(Uint8Array.from(reserveState.config.tokenInfo.name)).replace(/\\0/g, '');\n\n const reserveConfigDisplay = parseReserveConfigToFile(reserveState.config);\n\n fs.writeFileSync(\n './configs/' + reserveState.lendingMarket.toBase58() + '/' + reserveName + '.json',\n JSON.stringify(reserveConfigDisplay, null, 2)\n );\n });\n\n commands\n .command('create-vault')\n .requiredOption('--mint <string>', 'Vault token mint')\n .requiredOption(\n `--mode <string>`,\n 'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage'\n )\n .option(`--staging`, 'If true, will use the staging programs')\n .option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')\n .action(async ({ mint, mode, staging, multisig }) => {\n const env = initializeClient(mode === 'multisig', staging);\n const tokenMint = new PublicKey(mint);\n\n if (mode === 'multisig' && !multisig) {\n throw new Error('If using multisig mode, multisig is required');\n }\n\n const multisigPk = multisig ? new PublicKey(multisig) : PublicKey.default;\n const kaminoManager = new KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);\n\n const kaminoVaultConfig = new KaminoVaultConfig({\n admin: mode === 'multisig' ? multisigPk : env.payer.publicKey,\n tokenMint: tokenMint,\n tokenMintProgramId: TOKEN_PROGRAM_ID,\n performanceFeeRate: new Decimal(0.0),\n managementFeeRate: new Decimal(0.0),\n });\n\n const { vault: vaultKp, ixns: instructions } = await kaminoManager.createVaultIxs(kaminoVaultConfig);\n\n const _createVaultSig = await processTxn(env.client, env.payer, instructions, mode, 2500, [vaultKp]);\n\n mode === 'execute' && console.log('Vault created:', vaultKp.publicKey.toBase58());\n });\n\n commands\n .command('update-vault-reserve-allocation')\n .requiredOption('--vault <string>', 'Vault address')\n .requiredOption('--reserve <string>', 'Reserve address')\n .requiredOption('--allocation-weight <number>', 'Allocation weight')\n .requiredOption('--allocation-cap <string>', 'Allocation cap decimal value')\n .requiredOption(\n `--mode <string>`,\n 'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage'\n )\n .option(`--staging`, 'If true, will use the staging programs')\n .option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')\n .action(async ({ vault, reserve, allocationWeight, allocationCap, mode, staging, multisig }) => {\n const env = initializeClient(mode === 'multisig', staging);\n const reserveAddress = new PublicKey(reserve);\n const vaultAddress = new PublicKey(vault);\n const allocationWeightValue = Number(allocationWeight);\n const allocationCapDecimal = new Decimal(allocationCap);\n\n if (mode === 'multisig' && !multisig) {\n throw new Error('If using multisig mode, multisig is required');\n }\n\n const kaminoManager = new KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);\n const reserveState = await Reserve.fetch(env.provider.connection, reserveAddress, env.kLendProgramId);\n if (!reserveState) {\n throw new Error('Reserve not found');\n }\n\n const reserveWithAddress: ReserveWithAddress = {\n address: reserveAddress,\n state: reserveState,\n };\n const firstReserveAllocationConfig = new ReserveAllocationConfig(\n reserveWithAddress,\n allocationWeightValue,\n allocationCapDecimal\n );\n const kaminoVault = new KaminoVault(vaultAddress, undefined, env.kVaultProgramId);\n const instructions = await kaminoManager.updateVaultReserveAllocationIxs(\n kaminoVault,\n firstReserveAllocationConfig\n );\n\n const updateVaultAllocationSig = await processTxn(env.client, env.payer, [instructions], mode, 2500, []);\n\n mode === 'execute' && console.log('Vault allocation updated:', updateVaultAllocationSig);\n });\n\n commands.command('get-oracle-mappings').action(async () => {\n const env = initializeClient(false, false);\n const kaminoManager = new KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);\n\n console.log('Getting oracle mappings');\n const oracleConfigs = await kaminoManager.getScopeOracleConfigs();\n console.log('oracleConfigs', JSON.parse(JSON.stringify(oracleConfigs)));\n });\n\n commands\n .command('download-lending-market-config')\n .requiredOption('--lending-market <string>', 'Lending Market Address')\n .option(`--staging`, 'If true, will use the staging programs')\n .action(async ({ lendingMarket, staging }) => {\n const env = initializeClient(false, staging);\n const lendingMarketAddress = new PublicKey(lendingMarket);\n const lendingMarketState = await LendingMarket.fetch(\n env.provider.connection,\n lendingMarketAddress,\n env.kLendProgramId\n );\n\n if (!lendingMarketState) {\n throw new Error('Lending Market not found');\n }\n\n fs.mkdirSync('./configs/' + lendingMarketAddress.toBase58(), { recursive: true });\n\n const lendingMarketConfigForFile = lendingMarketState.toJSON();\n\n fs.writeFileSync(\n './configs/' + lendingMarketAddress.toBase58() + '/market-' + lendingMarketAddress.toBase58() + '.json',\n JSON.stringify(lendingMarketConfigForFile, null, 2)\n );\n });\n\n commands\n .command('download-lending-market-config-and-all-reserves-configs')\n .requiredOption('--lending-market <string>', 'Lending Market Address')\n .option(`--staging`, 'If true, will use the staging programs')\n .action(async ({ lendingMarket, staging }) => {\n const env = initializeClient(false, staging);\n const decoder = new TextDecoder('utf-8');\n const lendingMarketAddress = new PublicKey(lendingMarket);\n\n const kaminoMarket = await KaminoMarket.load(\n env.provider.connection,\n lendingMarketAddress,\n DEFAULT_RECENT_SLOT_DURATION_MS,\n env.kLendProgramId\n );\n\n if (!kaminoMarket) {\n throw new Error('Lending Market not found');\n }\n\n const lendingMarketState = await LendingMarket.fetch(\n env.provider.connection,\n lendingMarketAddress,\n env.kLendProgramId\n );\n\n if (!lendingMarketState) {\n throw new Error('Lending Market not found');\n }\n\n fs.mkdirSync('./configs/' + lendingMarketAddress.toBase58(), { recursive: true });\n\n const lendingMarketConfigForFile = lendingMarketState.toJSON();\n\n fs.writeFileSync(\n './configs/' + lendingMarketAddress.toBase58() + '/market-' + lendingMarketAddress.toBase58() + '.json',\n JSON.stringify(lendingMarketConfigForFile, null, 2)\n );\n\n kaminoMarket.reserves.forEach(async (reserve) => {\n const reserveState = reserve.state;\n const reserveName = decoder.decode(Uint8Array.from(reserveState.config.tokenInfo.name)).replace(/\\0/g, '');\n\n const reserveConfigDisplay = parseReserveConfigToFile(reserveState.config);\n\n fs.writeFileSync(\n './configs/' + lendingMarketAddress.toBase58() + '/' + reserveName + '.json',\n JSON.stringify(reserveConfigDisplay, null, 2)\n );\n });\n });\n\n commands\n .command('update-lending-market-from-config')\n .requiredOption('--lending-market <string>', 'Lending Market address')\n .requiredOption('--lending-market-config-path <string>', 'Path for the market config')\n .requiredOption(\n `--mode <string>`,\n 'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage'\n )\n .option(`--staging`, 'If true, will use the staging programs')\n .action(async ({ lendingMarket, lendingMarketConfigPath, mode, staging }) => {\n const env = initializeClient(mode === 'multisig', staging);\n const lendingMarketAddress = new PublicKey(lendingMarket);\n const lendingMarketState = await LendingMarket.fetch(\n env.provider.connection,\n lendingMarketAddress,\n env.kLendProgramId\n );\n if (!lendingMarketState) {\n throw new Error('Lending Market not found');\n }\n const marketWithAddress = {\n address: lendingMarketAddress,\n state: lendingMarketState,\n };\n\n if (mode === 'multisig') {\n throw new Error('If using multisig mode, multisig is required');\n }\n\n const kaminoManager = new KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);\n\n const newLendingMarket = LendingMarket.fromJSON(JSON.parse(fs.readFileSync(lendingMarketConfigPath, 'utf8')));\n\n const ixns = kaminoManager.updateLendingMarketIxs(marketWithAddress, newLendingMarket);\n\n // executing 6 ixns in a txn to make sure they fit\n for (let ixnIndex = 0; ixnIndex < ixns.length; ixnIndex += 6) {\n const ixnToExecute = ixns.slice(ixnIndex, ixnIndex + 6);\n const _updateLendingMarketSig = await processTxn(env.client, env.payer, ixnToExecute, mode, 2500, [], 400_000);\n }\n\n mode === 'execute' &&\n console.log('Reserve Updated with new config -> ', JSON.parse(JSON.stringify(newLendingMarket)));\n });\n\n commands\n .command('update-lending-market-owner')\n .requiredOption('--lending-market <string>', 'Lending Market address')\n .requiredOption(\n `--mode <string>`,\n 'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage'\n )\n .option(`--staging`, 'If true, will use the staging programs')\n .action(async ({ lendingMarket, mode, staging }) => {\n const env = initializeClient(mode === 'multisig', staging);\n const lendingMarketAddress = new PublicKey(lendingMarket);\n const lendingMarketState = await LendingMarket.fetch(\n env.provider.connection,\n lendingMarketAddress,\n env.kLendProgramId\n );\n if (!lendingMarketState) {\n throw new Error('Lending Market not found');\n }\n const marketWithAddress = {\n address: lendingMarketAddress,\n state: lendingMarketState,\n };\n if (!lendingMarketState) {\n throw new Error('Lending Market not found');\n }\n\n if (mode === 'multisig') {\n throw new Error('If using multisig mode, multisig is required');\n }\n\n const kaminoManager = new KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);\n\n const ixn = kaminoManager.updateLendingMarketOwnerIxs(marketWithAddress);\n\n const _updateLendingMarketSig = await processTxn(env.client, env.payer, [ixn], mode, 2500, [], 400_000);\n\n mode === 'execute' &&\n console.log(\n 'Lending market admin updated to the new admin -> ',\n JSON.parse(JSON.stringify(lendingMarketState.lendingMarketOwnerCached))\n );\n });\n\n await commands.parseAsync();\n}\n\nmain()\n .then(() => {\n process.exit();\n })\n .catch((e) => {\n console.error('\\n\\nKamino CLI exited with error:\\n\\n', e);\n process.exit(1);\n });\n\nexport function parseKeypairFile(file: string): Keypair {\n return Keypair.fromSecretKey(Buffer.from(JSON.parse(require('fs').readFileSync(file))));\n}\n\nfunction initializeClient(multisig: boolean, staging: boolean): Env {\n const admin = process.env.ADMIN!;\n const rpc = process.env.RPC!;\n const kLendProgramId = staging ? process.env.KLEND_PROGRAM_ID_STAGING! : process.env.KLEND_PROGRAM_ID_MAINNET!;\n const kVaultProgramId = staging ? process.env.KVAULT_PROGRAM_ID_STAGING! : process.env.KVAULT_PROGRAM_ID_MAINNET!;\n\n // Get connection first\n const env: Env = setUpProgram({\n adminFilePath: admin,\n rpc: rpc,\n kLendProgramId: new PublicKey(kLendProgramId),\n kVaultProgramId: new PublicKey(kVaultProgramId),\n });\n\n !multisig && console.log('\\nSettings ⚙️');\n !multisig && console.log('Admin:', admin);\n !multisig && console.log('Rpc:', rpc);\n !multisig && console.log('kLendProgramId:', kLendProgramId);\n !multisig && console.log('kVaultProgramId:', kVaultProgramId);\n\n return env;\n}\n\nfunction setUpProgram(args: {\n adminFilePath: string;\n rpc: string;\n kLendProgramId: PublicKey;\n kVaultProgramId: PublicKey;\n}): Env {\n const chain: Chain = {\n name: 'mainnet-beta',\n endpoint: args.rpc,\n wsEndpoint: args.rpc,\n chainID: MAINNET_BETA_CHAIN_ID,\n displayName: 'Mainnet Beta (Triton)',\n };\n const client = new Web3Client(chain);\n const connection = client.sendConnection;\n const payer = parseKeypairFile(args.adminFilePath);\n const wallet = new anchor.Wallet(payer);\n const provider = new anchor.AnchorProvider(connection, wallet, anchor.AnchorProvider.defaultOptions());\n\n return {\n provider,\n payer,\n client,\n kLendProgramId: args.kLendProgramId,\n kVaultProgramId: args.kVaultProgramId,\n };\n}\n\nexport type Env = {\n provider: anchor.AnchorProvider;\n payer: Keypair;\n client: Web3Client;\n kLendProgramId: PublicKey;\n kVaultProgramId: PublicKey;\n};\n\nasync function processTxn(\n web3Client: Web3Client,\n admin: Keypair,\n ixns: TransactionInstruction[],\n mode: string,\n priorityFeeMultiplier: number = 2500,\n extraSigners: Signer[],\n computeUnits: number = 200_000,\n priorityFeeLamports: number = 1000\n): Promise<TransactionSignature> {\n if (mode !== 'inspect' && mode !== 'simulate' && mode !== 'execute' && mode !== 'multisig') {\n throw new Error('Invalid mode: ' + mode + '. Must be one of: inspect/simulate/execute/multisig');\n }\n if (mode === 'multisig') {\n const { blockhash } = await web3Client.connection.getLatestBlockhash();\n const txn = new Transaction();\n txn.add(...ixns);\n txn.recentBlockhash = blockhash;\n txn.feePayer = admin.publicKey;\n\n console.log(binary_to_base58(txn.serializeMessage()));\n\n return '';\n } else {\n const microLamport = priorityFeeLamports * 10 ** 6; // 1000 lamports\n const microLamportsPrioritizationFee = microLamport / computeUnits;\n\n const tx = new Transaction();\n const { blockhash } = await web3Client.connection.getLatestBlockhash();\n if (priorityFeeMultiplier) {\n const priorityFeeIxn = createAddExtraComputeUnitFeeTransaction(\n computeUnits,\n microLamportsPrioritizationFee * priorityFeeMultiplier\n );\n tx.add(...priorityFeeIxn);\n }\n tx.recentBlockhash = blockhash;\n tx.feePayer = admin.publicKey;\n tx.add(...ixns);\n\n if (mode === 'execute') {\n return await signSendAndConfirmRawTransactionWithRetry({\n mainConnection: web3Client.sendConnection,\n extraConnections: [],\n tx: new VersionedTransaction(tx.compileMessage()),\n signers: [admin, ...extraSigners],\n commitment: 'confirmed',\n sendTransactionOptions: {\n skipPreflight: true,\n preflightCommitment: 'confirmed',\n },\n });\n } else if (mode === 'simulate') {\n const simulation = await web3Client.sendConnection.simulateTransaction(\n new VersionedTransaction(tx.compileMessage())\n );\n console.log('Simulation: \\n' + simulation.value.logs);\n } else if (mode === 'inspect') {\n console.log(\n 'Tx in B64',\n `https://explorer.solana.com/tx/inspector?message=${encodeURIComponent(\n tx.serializeMessage().toString('base64')\n )}`\n );\n }\n return '';\n }\n}\n\nfunction createAddExtraComputeUnitFeeTransaction(units: number, microLamports: number): TransactionInstruction[] {\n const ixns: TransactionInstruction[] = [];\n ixns.push(ComputeBudgetProgram.setComputeUnitLimit({ units }));\n ixns.push(ComputeBudgetProgram.setComputeUnitPrice({ microLamports }));\n return ixns;\n}\n\nfunction parseReserveConfigFromFile(farmConfigFromFile: any): ReserveConfig {\n const reserveConfigFields: ReserveConfigFields = {\n status: farmConfigFromFile.status,\n loanToValuePct: farmConfigFromFile.loanToValuePct,\n liquidationThresholdPct: farmConfigFromFile.liquidationThresholdPct,\n minLiquidationBonusBps: farmConfigFromFile.minLiquidationBonusBps,\n protocolLiquidationFeePct: farmConfigFromFile.protocolLiquidationFeePct,\n protocolTakeRatePct: farmConfigFromFile.protocolLiquidationFeePct,\n assetTier: farmConfigFromFile.assetTier,\n multiplierSideBoost: farmConfigFromFile.multiplierSideBoost,\n maxLiquidationBonusBps: farmConfigFromFile.maxLiquidationBonusBps,\n badDebtLiquidationBonusBps: farmConfigFromFile.badDebtLiquidationBonusBps,\n fees: {\n borrowFeeSf: Fraction.fromDecimal(new Decimal(farmConfigFromFile.fees.borrowFee)).valueSf,\n flashLoanFeeSf: Fraction.fromDecimal(new Decimal(farmConfigFromFile.fees.flashLoanFee)).valueSf,\n padding: Array(8).fill(0),\n },\n depositLimit: new BN(farmConfigFromFile.depositLimit),\n borrowLimit: new BN(farmConfigFromFile.borrowLimit),\n tokenInfo: {\n name: encodeTokenName(farmConfigFromFile.tokenInfo.name),\n heuristic: new PriceHeuristic({\n lower: new BN(farmConfigFromFile.tokenInfo.heuristic.lower),\n upper: new BN(farmConfigFromFile.tokenInfo.heuristic.upper),\n exp: new BN(farmConfigFromFile.tokenInfo.heuristic.exp),\n }),\n maxTwapDivergenceBps: new BN(farmConfigFromFile.tokenInfo.maxTwapDivergenceBps),\n maxAgePriceSeconds: new BN(farmConfigFromFile.tokenInfo.maxAgePriceSeconds),\n maxAgeTwapSeconds: new BN(farmConfigFromFile.tokenInfo.maxAgeTwapSeconds),\n ...parseOracleConfiguration(farmConfigFromFile),\n blockPriceUsage: farmConfigFromFile.tokenInfo.blockPriceUsage,\n reserved: Array(7).fill(0),\n padding: Array(19).fill(new BN(0)),\n } as TokenInfo,\n borrowRateCurve: parseBorrowRateCurve(farmConfigFromFile),\n depositWithdrawalCap: new WithdrawalCaps({\n configCapacity: new BN(farmConfigFromFile.depositWithdrawalCap.configCapacity),\n currentTotal: new BN(0),\n lastIntervalStartTimestamp: new BN(0),\n configIntervalLengthSeconds: new BN(farmConfigFromFile.depositWithdrawalCap.configIntervalLengthSeconds),\n }),\n debtWithdrawalCap: new WithdrawalCaps({\n configCapacity: new BN(farmConfigFromFile.debtWithdrawalCap.configCapacity),\n currentTotal: new BN(0),\n lastIntervalStartTimestamp: new BN(0),\n configIntervalLengthSeconds: new BN(farmConfigFromFile.debtWithdrawalCap.configIntervalLengthSeconds),\n }),\n deleveragingMarginCallPeriodSecs: new BN(farmConfigFromFile.deleveragingMarginCallPeriodSecs),\n borrowFactorPct: new BN(farmConfigFromFile.borrowFactorPct),\n elevationGroups: farmConfigFromFile.elevationGroups,\n deleveragingThresholdSlotsPerBps: new BN(farmConfigFromFile.deleveragingThresholdSlotsPerBps),\n multiplierTagBoost: farmConfigFromFile.multiplierTagBoost,\n disableUsageAsCollOutsideEmode: farmConfigFromFile.disableUsageAsCollOutsideEmode,\n utilizationLimitBlockBorrowingAbove: farmConfigFromFile.utilizationLimitBlockBorrowingAbove,\n hostFixedInterestRateBps: farmConfigFromFile.hostFixedInterestRateBps,\n borrowLimitOutsideElevationGroup: new BN(farmConfigFromFile.borrowLimitOutsideElevationGroup),\n borrowLimitAgainstThisCollateralInElevationGroup: parseReserveBorrowLimitAgainstCollInEmode(farmConfigFromFile),\n reserved1: Array(2).fill(0),\n };\n\n return new ReserveConfig(reserveConfigFields);\n}\n\nfunction parseOracleConfiguration(farmConfigFromFile: any): {\n pythConfiguration: PythConfiguration;\n switchboardConfiguration: SwitchboardConfiguration;\n scopeConfiguration: ScopeConfiguration;\n} {\n const pythConfiguration = new PythConfiguration({\n price: new PublicKey(farmConfigFromFile.tokenInfo.pythConfiguration.price),\n });\n const switchboardConfiguration = new SwitchboardConfiguration({\n priceAggregator: new PublicKey(farmConfigFromFile.tokenInfo.switchboardConfiguration.priceAggregator),\n twapAggregator: new PublicKey(farmConfigFromFile.tokenInfo.switchboardConfiguration.twapAggregator),\n });\n const priceChain = [65535, 65535, 65535, 65535];\n const twapChain = [65535, 65535, 65535, 65535];\n\n const priceChainFromFile: number[] = farmConfigFromFile.tokenInfo.scopeConfiguration.priceChain;\n const twapChainFromFile: number[] = farmConfigFromFile.tokenInfo.scopeConfiguration.twapChain;\n\n priceChainFromFile.forEach((value, index) => (priceChain[index] = value));\n twapChainFromFile.forEach((value, index) => (twapChain[index] = value));\n\n const scopeConfiguration = new ScopeConfiguration({\n priceFeed: new PublicKey(farmConfigFromFile.tokenInfo.scopeConfiguration.priceFeed),\n priceChain: priceChain,\n twapChain: twapChain,\n });\n\n return {\n pythConfiguration,\n switchboardConfiguration,\n scopeConfiguration,\n };\n}\n\nfunction parseBorrowRateCurve(farmConfigFromFile: any): BorrowRateCurve {\n const curvePoints: CurvePointFields[] = [];\n\n farmConfigFromFile.borrowRateCurve.points.forEach((curvePoint: { utilizationRateBps: any; borrowRateBps: any }) =>\n curvePoints.push({\n utilizationRateBps: curvePoint.utilizationRateBps,\n borrowRateBps: curvePoint.borrowRateBps,\n })\n );\n\n const finalCruvePoints: CurvePointFields[] = Array(11).fill(curvePoints[curvePoints.length - 1]);\n\n curvePoints.forEach((curvePoint, index) => (finalCruvePoints[index] = curvePoint));\n\n const borrowRateCurve = new BorrowRateCurve({ points: finalCruvePoints });\n\n return borrowRateCurve;\n}\n\nfunction parseReserveBorrowLimitAgainstCollInEmode(farmConfigFromFile: any): BN[] {\n const reserveBorrowLimitAgainstCollInEmode: BN[] = Array(32).fill(new BN(0));\n\n farmConfigFromFile.borrowLimitAgainstThisCollateralInElevationGroup.forEach(\n (limit: any, index: number) => (reserveBorrowLimitAgainstCollInEmode[index] = new BN(limit))\n );\n\n return reserveBorrowLimitAgainstCollInEmode;\n}\n\nfunction parseReserveConfigToFile(reserveConfig: ReserveConfig) {\n const decoder = new TextDecoder('utf-8');\n\n return {\n status: reserveConfig.status,\n loanToValuePct: reserveConfig.loanToValuePct,\n liquidationThresholdPct: reserveConfig.liquidationThresholdPct,\n minLiquidationBonusBps: reserveConfig.minLiquidationBonusBps,\n protocolLiquidationFeePct: reserveConfig.protocolLiquidationFeePct,\n protocolTakeRatePct: reserveConfig.protocolLiquidationFeePct,\n assetTier: reserveConfig.assetTier,\n multiplierSideBoost: reserveConfig.multiplierSideBoost,\n maxLiquidationBonusBps: reserveConfig.maxLiquidationBonusBps,\n badDebtLiquidationBonusBps: reserveConfig.badDebtLiquidationBonusBps,\n fees: {\n borrowFee: new Fraction(reserveConfig.fees.borrowFeeSf).toDecimal().toString(),\n flashLoanFee: new Fraction(reserveConfig.fees.flashLoanFeeSf).toDecimal().toString(),\n padding: Array(8).fill(0),\n },\n depositLimit: reserveConfig.depositLimit.toString(),\n borrowLimit: reserveConfig.borrowLimit.toString(),\n tokenInfo: {\n name: decoder.decode(Uint8Array.from(reserveConfig.tokenInfo.name)).replace(/\\0/g, ''),\n heuristic: {\n exp: reserveConfig.tokenInfo.heuristic.exp.toString(),\n lower: reserveConfig.tokenInfo.heuristic.lower.toString(),\n upper: reserveConfig.tokenInfo.heuristic.upper.toString(),\n },\n maxTwapDivergenceBps: reserveConfig.tokenInfo.maxTwapDivergenceBps.toString(),\n maxAgePriceSeconds: reserveConfig.tokenInfo.maxAgePriceSeconds.toString(),\n maxAgeTwapSeconds: reserveConfig.tokenInfo.maxAgeTwapSeconds.toString(),\n scopeConfiguration: reserveConfig.tokenInfo.scopeConfiguration,\n switchboardConfiguration: reserveConfig.tokenInfo.switchboardConfiguration,\n pythConfiguration: reserveConfig.tokenInfo.pythConfiguration,\n blockPriceUsage: reserveConfig.tokenInfo.blockPriceUsage,\n },\n borrowRateCurve: reserveConfig.borrowRateCurve,\n depositWithdrawalCap: reserveConfig.depositWithdrawalCap,\n debtWithdrawalCap: reserveConfig.debtWithdrawalCap,\n deleveragingMarginCallPeriodSecs: reserveConfig.deleveragingMarginCallPeriodSecs.toString(),\n borrowFactorPct: reserveConfig.borrowFactorPct.toString(),\n elevationGroups: reserveConfig.elevationGroups,\n deleveragingThresholdSlotsPerBps: reserveConfig.deleveragingThresholdSlotsPerBps.toString(),\n multiplierTagBoost: reserveConfig.multiplierTagBoost,\n disableUsageAsCollOutsideEmode: reserveConfig.disableUsageAsCollOutsideEmode,\n utilizationLimitBlockBorrowingAbove: reserveConfig.utilizationLimitBlockBorrowingAbove,\n hostFixedInterestRateBps: reserveConfig.hostFixedInterestRateBps,\n borrowLimitOutsideElevationGroup: reserveConfig.borrowLimitOutsideElevationGroup.toString(),\n borrowLimitAgainstThisCollateralInElevationGroup:\n reserveConfig.borrowLimitAgainstThisCollateralInElevationGroup.map((entry) => entry.toString()),\n reserved1: Array(2).fill(0),\n };\n}\n"]}
|
package/dist/utils/api.d.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { PublicKey } from '@solana/web3.js';
|
|
2
2
|
import { ConfigType } from '../classes';
|
|
3
3
|
import { IBackOffOptions } from 'exponential-backoff';
|
|
4
|
+
/**
|
|
5
|
+
* Fetch config from the API
|
|
6
|
+
* A good place to start to find active klend markets without expensive RPC calls
|
|
7
|
+
*
|
|
8
|
+
* @param programId - The program id to retrieve config for
|
|
9
|
+
* @param source - CDN is a json file hosted in the cloud, API is a webserver
|
|
10
|
+
*/
|
|
4
11
|
export declare function getMarketsFromApi(programId?: PublicKey, source?: 'API' | 'CDN'): Promise<ConfigType>;
|
|
5
12
|
export declare const KAMINO_CDN_RETRY: Partial<IBackOffOptions>;
|
|
6
13
|
export declare const KAMINO_API_RETRY: Partial<IBackOffOptions>;
|
package/dist/utils/api.js
CHANGED
|
@@ -19,14 +19,21 @@ const classes_1 = require("../classes");
|
|
|
19
19
|
const utils_1 = require("../utils");
|
|
20
20
|
const exponential_backoff_1 = require("exponential-backoff");
|
|
21
21
|
const lib_1 = require("../lib");
|
|
22
|
+
/**
|
|
23
|
+
* Fetch config from the API
|
|
24
|
+
* A good place to start to find active klend markets without expensive RPC calls
|
|
25
|
+
*
|
|
26
|
+
* @param programId - The program id to retrieve config for
|
|
27
|
+
* @param source - CDN is a json file hosted in the cloud, API is a webserver
|
|
28
|
+
*/
|
|
22
29
|
function getMarketsFromApi() {
|
|
23
30
|
return __awaiter(this, arguments, void 0, function* (programId = lib_1.PROGRAM_ID, source = 'CDN') {
|
|
24
31
|
let configs = {};
|
|
25
32
|
if (source === 'CDN') {
|
|
26
33
|
configs = (yield (0, exponential_backoff_1.backOff)(() => axios_1.default.get(utils_1.CDN_ENDPOINT), exports.KAMINO_CDN_RETRY)).data[programId.toString()];
|
|
27
34
|
}
|
|
28
|
-
const API_ENDPOINT = (0, utils_1.getApiEndpoint)(programId);
|
|
29
35
|
if (!configs || (0, classes_1.isEmptyObject)(configs)) {
|
|
36
|
+
const API_ENDPOINT = (0, utils_1.getApiEndpoint)(programId);
|
|
30
37
|
configs = (yield (0, exponential_backoff_1.backOff)(() => axios_1.default.get(API_ENDPOINT), exports.KAMINO_API_RETRY)).data;
|
|
31
38
|
}
|
|
32
39
|
return configs;
|
package/dist/utils/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAcA,8CAgBC;AA7BD,kDAA0B;AAC1B,wCAAuD;AACvD,oCAAwD;AACxD,6DAA+D;AAC/D,gCAAoC;AAEpC;;;;;;GAMG;AACH,SAAsB,iBAAiB;yDACrC,YAAuB,gBAAU,EACjC,SAAwB,KAAK;QAE7B,IAAI,OAAO,GAAe,EAAgB,CAAC;QAE3C,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,OAAO,GAAG,CAAC,MAAM,IAAA,6BAAO,EAAC,GAAG,EAAE,CAAC,eAAK,CAAC,GAAG,CAAC,oBAAY,CAAC,EAAE,wBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAe,CAAC;QACtH,CAAC;QAED,IAAI,CAAC,OAAO,IAAI,IAAA,uBAAa,EAAC,OAAO,CAAC,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,IAAA,sBAAc,EAAC,SAAS,CAAC,CAAC;YAC/C,OAAO,GAAG,CAAC,MAAM,IAAA,6BAAO,EAAC,GAAG,EAAE,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,wBAAgB,CAAC,CAAC,CAAC,IAAkB,CAAC;QAChG,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CAAA;AAEY,QAAA,gBAAgB,GAA6B;IACxD,QAAQ,EAAE,IAAI;IACd,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,EAAE;IACjB,KAAK,EAAE,CAAC,CAAM,EAAE,aAAqB,EAAE,EAAE;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC;YACX,aAAa;YACb,OAAO,EAAE,8DAA8D;SACxE,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEW,QAAA,gBAAgB,GAA6B;IACxD,QAAQ,EAAE,IAAI;IACd,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,EAAE;IACjB,KAAK,EAAE,CAAC,CAAM,EAAE,aAAqB,EAAE,EAAE;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC;YACX,aAAa;YACb,OAAO,EAAE,sEAAsE;SAChF,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC","sourcesContent":["import { PublicKey } from '@solana/web3.js';\nimport axios from 'axios';\nimport { ConfigType, isEmptyObject } from '../classes';\nimport { CDN_ENDPOINT, getApiEndpoint } from '../utils';\nimport { IBackOffOptions, backOff } from 'exponential-backoff';\nimport { PROGRAM_ID } from '../lib';\n\n/**\n * Fetch config from the API\n * A good place to start to find active klend markets without expensive RPC calls\n *\n * @param programId - The program id to retrieve config for\n * @param source - CDN is a json file hosted in the cloud, API is a webserver\n */\nexport async function getMarketsFromApi(\n programId: PublicKey = PROGRAM_ID,\n source: 'API' | 'CDN' = 'CDN'\n): Promise<ConfigType> {\n let configs: ConfigType = {} as ConfigType;\n\n if (source === 'CDN') {\n configs = (await backOff(() => axios.get(CDN_ENDPOINT), KAMINO_CDN_RETRY)).data[programId.toString()] as ConfigType;\n }\n\n if (!configs || isEmptyObject(configs)) {\n const API_ENDPOINT = getApiEndpoint(programId);\n configs = (await backOff(() => axios.get(API_ENDPOINT), KAMINO_API_RETRY)).data as ConfigType;\n }\n\n return configs;\n}\n\nexport const KAMINO_CDN_RETRY: Partial<IBackOffOptions> = {\n maxDelay: 1000,\n numOfAttempts: 3,\n startingDelay: 10,\n retry: (e: any, attemptNumber: number) => {\n console.warn(e);\n console.warn({\n attemptNumber,\n message: 'kamino CDN call failed, retrying with exponential backoff...',\n });\n return true;\n },\n};\n\nexport const KAMINO_API_RETRY: Partial<IBackOffOptions> = {\n maxDelay: 1000,\n numOfAttempts: 3,\n startingDelay: 10,\n retry: (e: any, attemptNumber: number) => {\n console.warn(e);\n console.warn({\n attemptNumber,\n message: 'api.kamino.finance call failed, retrying with exponential backoff...',\n });\n return true;\n },\n};\n"]}
|