@kamino-finance/klend-sdk 3.2.17 → 3.2.19
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.md +42 -0
- package/dist/classes/manager.js +0 -17
- package/dist/classes/manager.js.map +1 -1
- package/dist/classes/market.d.ts +15 -0
- package/dist/classes/market.js +153 -0
- package/dist/classes/market.js.map +1 -1
- package/dist/classes/obligation.js.map +1 -1
- package/dist/classes/reserve.js +5 -49
- package/dist/classes/reserve.js.map +1 -1
- package/dist/client_kamino_manager.d.ts +2 -1
- package/dist/client_kamino_manager.js +22 -21
- package/dist/client_kamino_manager.js.map +1 -1
- package/dist/idl.json +41 -19
- package/dist/idl_codegen/accounts/LendingMarket.d.ts +6 -6
- package/dist/idl_codegen/accounts/LendingMarket.js +5 -5
- package/dist/idl_codegen/accounts/LendingMarket.js.map +1 -1
- package/dist/idl_codegen/errors/custom.d.ts +25 -1
- package/dist/idl_codegen/errors/custom.js +40 -1
- package/dist/idl_codegen/errors/custom.js.map +1 -1
- package/dist/idl_codegen/instructions/flashBorrowReserveLiquidity.d.ts +0 -1
- package/dist/idl_codegen/instructions/flashBorrowReserveLiquidity.js +1 -1
- package/dist/idl_codegen/instructions/flashBorrowReserveLiquidity.js.map +1 -1
- package/dist/idl_codegen/instructions/flashRepayReserveLiquidity.d.ts +0 -1
- package/dist/idl_codegen/instructions/flashRepayReserveLiquidity.js +1 -1
- package/dist/idl_codegen/instructions/flashRepayReserveLiquidity.js.map +1 -1
- package/dist/idl_codegen/instructions/index.d.ts +2 -0
- package/dist/idl_codegen/instructions/index.js +3 -1
- package/dist/idl_codegen/instructions/index.js.map +1 -1
- package/dist/idl_codegen/instructions/refreshReservesBatch.d.ts +6 -0
- package/dist/idl_codegen/instructions/refreshReservesBatch.js +43 -0
- package/dist/idl_codegen/instructions/refreshReservesBatch.js.map +1 -0
- package/dist/idl_codegen/programId.js.map +1 -1
- package/dist/idl_codegen/types/ReserveConfig.d.ts +16 -16
- package/dist/idl_codegen/types/ReserveConfig.js +12 -12
- package/dist/idl_codegen/types/ReserveConfig.js.map +1 -1
- package/dist/idl_codegen/types/UpdateConfigMode.d.ts +14 -14
- package/dist/idl_codegen/types/UpdateConfigMode.js +25 -25
- package/dist/idl_codegen/types/UpdateConfigMode.js.map +1 -1
- package/dist/idl_codegen/types/UpdateLendingMarketMode.d.ts +20 -7
- package/dist/idl_codegen/types/UpdateLendingMarketMode.js +39 -13
- package/dist/idl_codegen/types/UpdateLendingMarketMode.js.map +1 -1
- package/dist/idl_codegen/types/index.d.ts +4 -4
- package/dist/idl_codegen/types/index.js.map +1 -1
- package/dist/utils/instruction.js +0 -1
- package/dist/utils/instruction.js.map +1 -1
- package/dist/utils/managerTypes.js +2 -2
- package/dist/utils/managerTypes.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { Keypair, PublicKey } from '@solana/web3.js';
|
|
1
|
+
import { Connection, Keypair, PublicKey } from '@solana/web3.js';
|
|
2
2
|
import { Web3Client } from './lib';
|
|
3
3
|
import * as anchor from '@coral-xyz/anchor';
|
|
4
4
|
export declare function parseKeypairFile(file: string): Keypair;
|
|
5
5
|
export type Env = {
|
|
6
6
|
provider: anchor.AnchorProvider;
|
|
7
7
|
payer: Keypair;
|
|
8
|
+
connection: Connection;
|
|
8
9
|
client: Web3Client;
|
|
9
10
|
kLendProgramId: PublicKey;
|
|
10
11
|
kVaultProgramId: PublicKey;
|
|
@@ -67,7 +67,7 @@ function main() {
|
|
|
67
67
|
throw new Error('If using multisig mode, multisig pubkey is required');
|
|
68
68
|
}
|
|
69
69
|
const multisigPk = multisig ? new web3_js_1.PublicKey(multisig) : web3_js_1.PublicKey.default;
|
|
70
|
-
const kaminoManager = new lib_1.KaminoManager(env.
|
|
70
|
+
const kaminoManager = new lib_1.KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
|
|
71
71
|
const { market: marketKp, ixns: createMarketIxns } = yield kaminoManager.createMarketIxs({
|
|
72
72
|
admin: mode === 'multisig' ? multisigPk : env.payer.publicKey,
|
|
73
73
|
});
|
|
@@ -92,7 +92,7 @@ function main() {
|
|
|
92
92
|
throw new Error('If using multisig mode, multisig is required');
|
|
93
93
|
}
|
|
94
94
|
const multisigPk = multisig ? new web3_js_1.PublicKey(multisig) : web3_js_1.PublicKey.default;
|
|
95
|
-
const kaminoManager = new lib_1.KaminoManager(env.
|
|
95
|
+
const kaminoManager = new lib_1.KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
|
|
96
96
|
const reserveConfigFromFile = JSON.parse(fs.readFileSync(reserveConfigPath, 'utf8'));
|
|
97
97
|
const reserveConfig = parseReserveConfigFromFile(reserveConfigFromFile);
|
|
98
98
|
const assetConfig = new lib_1.AssetReserveConfigCli(tokenMint, tokenMintProgramId, reserveConfig);
|
|
@@ -117,12 +117,12 @@ function main() {
|
|
|
117
117
|
.action((_a) => __awaiter(this, [_a], void 0, function* ({ reserve, reserveConfigPath, mode, updateEntireConfig, staging, multisig }) {
|
|
118
118
|
const env = initializeClient(mode === 'multisig', staging);
|
|
119
119
|
const reserveAddress = new web3_js_1.PublicKey(reserve);
|
|
120
|
-
const reserveState = yield lib_1.Reserve.fetch(env.
|
|
120
|
+
const reserveState = yield lib_1.Reserve.fetch(env.connection, reserveAddress, env.kLendProgramId);
|
|
121
121
|
if (!reserveState) {
|
|
122
122
|
throw new Error('Reserve not found');
|
|
123
123
|
}
|
|
124
124
|
const marketAddress = reserveState.lendingMarket;
|
|
125
|
-
const marketState = yield lib_1.LendingMarket.fetch(env.
|
|
125
|
+
const marketState = yield lib_1.LendingMarket.fetch(env.connection, marketAddress, env.kLendProgramId);
|
|
126
126
|
if (!marketState) {
|
|
127
127
|
throw new Error('Market not found');
|
|
128
128
|
}
|
|
@@ -133,7 +133,7 @@ function main() {
|
|
|
133
133
|
if (mode === 'multisig' && !multisig) {
|
|
134
134
|
throw new Error('If using multisig mode, multisig is required');
|
|
135
135
|
}
|
|
136
|
-
const kaminoManager = new lib_1.KaminoManager(env.
|
|
136
|
+
const kaminoManager = new lib_1.KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
|
|
137
137
|
const reserveConfigFromFile = JSON.parse(fs.readFileSync(reserveConfigPath, 'utf8'));
|
|
138
138
|
const reserveConfig = parseReserveConfigFromFile(reserveConfigFromFile);
|
|
139
139
|
const ixns = yield kaminoManager.updateReserveIxs(marketWithAddress, reserveAddress, reserveConfig, reserveState, updateEntireConfig);
|
|
@@ -147,7 +147,7 @@ function main() {
|
|
|
147
147
|
.action((_a) => __awaiter(this, [_a], void 0, function* ({ reserve, staging }) {
|
|
148
148
|
const env = initializeClient(false, staging);
|
|
149
149
|
const reserveAddress = new web3_js_1.PublicKey(reserve);
|
|
150
|
-
const reserveState = yield lib_1.Reserve.fetch(env.
|
|
150
|
+
const reserveState = yield lib_1.Reserve.fetch(env.connection, reserveAddress, env.kLendProgramId);
|
|
151
151
|
if (!reserveState) {
|
|
152
152
|
throw new Error('Reserve not found');
|
|
153
153
|
}
|
|
@@ -170,7 +170,7 @@ function main() {
|
|
|
170
170
|
throw new Error('If using multisig mode, multisig is required');
|
|
171
171
|
}
|
|
172
172
|
const multisigPk = multisig ? new web3_js_1.PublicKey(multisig) : web3_js_1.PublicKey.default;
|
|
173
|
-
const kaminoManager = new lib_1.KaminoManager(env.
|
|
173
|
+
const kaminoManager = new lib_1.KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
|
|
174
174
|
const kaminoVaultConfig = new lib_1.KaminoVaultConfig({
|
|
175
175
|
admin: mode === 'multisig' ? multisigPk : env.payer.publicKey,
|
|
176
176
|
tokenMint: tokenMint,
|
|
@@ -200,8 +200,8 @@ function main() {
|
|
|
200
200
|
if (mode === 'multisig' && !multisig) {
|
|
201
201
|
throw new Error('If using multisig mode, multisig is required');
|
|
202
202
|
}
|
|
203
|
-
const kaminoManager = new lib_1.KaminoManager(env.
|
|
204
|
-
const reserveState = yield lib_1.Reserve.fetch(env.
|
|
203
|
+
const kaminoManager = new lib_1.KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
|
|
204
|
+
const reserveState = yield lib_1.Reserve.fetch(env.connection, reserveAddress, env.kLendProgramId);
|
|
205
205
|
if (!reserveState) {
|
|
206
206
|
throw new Error('Reserve not found');
|
|
207
207
|
}
|
|
@@ -217,7 +217,7 @@ function main() {
|
|
|
217
217
|
}));
|
|
218
218
|
commands.command('get-oracle-mappings').action(() => __awaiter(this, void 0, void 0, function* () {
|
|
219
219
|
const env = initializeClient(false, false);
|
|
220
|
-
const kaminoManager = new lib_1.KaminoManager(env.
|
|
220
|
+
const kaminoManager = new lib_1.KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
|
|
221
221
|
console.log('Getting oracle mappings');
|
|
222
222
|
const oracleConfigs = yield kaminoManager.getScopeOracleConfigs();
|
|
223
223
|
console.log('oracleConfigs', JSON.parse(JSON.stringify(oracleConfigs)));
|
|
@@ -229,7 +229,7 @@ function main() {
|
|
|
229
229
|
.action((_a) => __awaiter(this, [_a], void 0, function* ({ lendingMarket, staging }) {
|
|
230
230
|
const env = initializeClient(false, staging);
|
|
231
231
|
const lendingMarketAddress = new web3_js_1.PublicKey(lendingMarket);
|
|
232
|
-
const lendingMarketState = yield lib_1.LendingMarket.fetch(env.
|
|
232
|
+
const lendingMarketState = yield lib_1.LendingMarket.fetch(env.connection, lendingMarketAddress, env.kLendProgramId);
|
|
233
233
|
if (!lendingMarketState) {
|
|
234
234
|
throw new Error('Lending Market not found');
|
|
235
235
|
}
|
|
@@ -245,11 +245,11 @@ function main() {
|
|
|
245
245
|
const env = initializeClient(false, staging);
|
|
246
246
|
const decoder = new TextDecoder('utf-8');
|
|
247
247
|
const lendingMarketAddress = new web3_js_1.PublicKey(lendingMarket);
|
|
248
|
-
const kaminoMarket = yield lib_1.KaminoMarket.load(env.
|
|
248
|
+
const kaminoMarket = yield lib_1.KaminoMarket.load(env.connection, lendingMarketAddress, lib_1.DEFAULT_RECENT_SLOT_DURATION_MS, env.kLendProgramId);
|
|
249
249
|
if (!kaminoMarket) {
|
|
250
250
|
throw new Error('Lending Market not found');
|
|
251
251
|
}
|
|
252
|
-
const lendingMarketState = yield lib_1.LendingMarket.fetch(env.
|
|
252
|
+
const lendingMarketState = yield lib_1.LendingMarket.fetch(env.connection, lendingMarketAddress, env.kLendProgramId);
|
|
253
253
|
if (!lendingMarketState) {
|
|
254
254
|
throw new Error('Lending Market not found');
|
|
255
255
|
}
|
|
@@ -272,7 +272,7 @@ function main() {
|
|
|
272
272
|
.action((_a) => __awaiter(this, [_a], void 0, function* ({ lendingMarket, lendingMarketConfigPath, mode, staging }) {
|
|
273
273
|
const env = initializeClient(mode === 'multisig', staging);
|
|
274
274
|
const lendingMarketAddress = new web3_js_1.PublicKey(lendingMarket);
|
|
275
|
-
const lendingMarketState = yield lib_1.LendingMarket.fetch(env.
|
|
275
|
+
const lendingMarketState = yield lib_1.LendingMarket.fetch(env.connection, lendingMarketAddress, env.kLendProgramId);
|
|
276
276
|
if (!lendingMarketState) {
|
|
277
277
|
throw new Error('Lending Market not found');
|
|
278
278
|
}
|
|
@@ -283,7 +283,7 @@ function main() {
|
|
|
283
283
|
if (mode === 'multisig') {
|
|
284
284
|
throw new Error('If using multisig mode, multisig is required');
|
|
285
285
|
}
|
|
286
|
-
const kaminoManager = new lib_1.KaminoManager(env.
|
|
286
|
+
const kaminoManager = new lib_1.KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
|
|
287
287
|
const newLendingMarket = lib_1.LendingMarket.fromJSON(JSON.parse(fs.readFileSync(lendingMarketConfigPath, 'utf8')));
|
|
288
288
|
const ixns = kaminoManager.updateLendingMarketIxs(marketWithAddress, newLendingMarket);
|
|
289
289
|
// executing 6 ixns in a txn to make sure they fit
|
|
@@ -302,7 +302,7 @@ function main() {
|
|
|
302
302
|
.action((_a) => __awaiter(this, [_a], void 0, function* ({ lendingMarket, mode, staging }) {
|
|
303
303
|
const env = initializeClient(mode === 'multisig', staging);
|
|
304
304
|
const lendingMarketAddress = new web3_js_1.PublicKey(lendingMarket);
|
|
305
|
-
const lendingMarketState = yield lib_1.LendingMarket.fetch(env.
|
|
305
|
+
const lendingMarketState = yield lib_1.LendingMarket.fetch(env.connection, lendingMarketAddress, env.kLendProgramId);
|
|
306
306
|
if (!lendingMarketState) {
|
|
307
307
|
throw new Error('Lending Market not found');
|
|
308
308
|
}
|
|
@@ -316,7 +316,7 @@ function main() {
|
|
|
316
316
|
if (mode === 'multisig') {
|
|
317
317
|
throw new Error('If using multisig mode, multisig is required');
|
|
318
318
|
}
|
|
319
|
-
const kaminoManager = new lib_1.KaminoManager(env.
|
|
319
|
+
const kaminoManager = new lib_1.KaminoManager(env.connection, env.kLendProgramId, env.kVaultProgramId);
|
|
320
320
|
const ixn = kaminoManager.updateLendingMarketOwnerIxs(marketWithAddress);
|
|
321
321
|
const _updateLendingMarketSig = yield processTxn(env.client, env.payer, [ixn], mode, 2500, [], 400000);
|
|
322
322
|
mode === 'execute' &&
|
|
@@ -372,6 +372,7 @@ function setUpProgram(args) {
|
|
|
372
372
|
provider,
|
|
373
373
|
payer,
|
|
374
374
|
client,
|
|
375
|
+
connection,
|
|
375
376
|
kLendProgramId: args.kLendProgramId,
|
|
376
377
|
kVaultProgramId: args.kVaultProgramId,
|
|
377
378
|
};
|
|
@@ -441,7 +442,6 @@ function parseReserveConfigFromFile(farmConfigFromFile) {
|
|
|
441
442
|
protocolLiquidationFeePct: farmConfigFromFile.protocolLiquidationFeePct,
|
|
442
443
|
protocolTakeRatePct: farmConfigFromFile.protocolLiquidationFeePct,
|
|
443
444
|
assetTier: farmConfigFromFile.assetTier,
|
|
444
|
-
multiplierSideBoost: farmConfigFromFile.multiplierSideBoost,
|
|
445
445
|
maxLiquidationBonusBps: farmConfigFromFile.maxLiquidationBonusBps,
|
|
446
446
|
badDebtLiquidationBonusBps: farmConfigFromFile.badDebtLiquidationBonusBps,
|
|
447
447
|
fees: {
|
|
@@ -473,13 +473,14 @@ function parseReserveConfigFromFile(farmConfigFromFile) {
|
|
|
473
473
|
borrowFactorPct: new anchor_1.BN(farmConfigFromFile.borrowFactorPct),
|
|
474
474
|
elevationGroups: farmConfigFromFile.elevationGroups,
|
|
475
475
|
deleveragingThresholdSlotsPerBps: new anchor_1.BN(farmConfigFromFile.deleveragingThresholdSlotsPerBps),
|
|
476
|
-
multiplierTagBoost: farmConfigFromFile.multiplierTagBoost,
|
|
477
476
|
disableUsageAsCollOutsideEmode: farmConfigFromFile.disableUsageAsCollOutsideEmode,
|
|
478
477
|
utilizationLimitBlockBorrowingAbove: farmConfigFromFile.utilizationLimitBlockBorrowingAbove,
|
|
479
478
|
hostFixedInterestRateBps: farmConfigFromFile.hostFixedInterestRateBps,
|
|
480
479
|
borrowLimitOutsideElevationGroup: new anchor_1.BN(farmConfigFromFile.borrowLimitOutsideElevationGroup),
|
|
481
480
|
borrowLimitAgainstThisCollateralInElevationGroup: parseReserveBorrowLimitAgainstCollInEmode(farmConfigFromFile),
|
|
482
481
|
reserved1: Array(2).fill(0),
|
|
482
|
+
reserved2: Array(2).fill(0),
|
|
483
|
+
reserved3: Array(8).fill(0),
|
|
483
484
|
};
|
|
484
485
|
return new types_1.ReserveConfig(reserveConfigFields);
|
|
485
486
|
}
|
|
@@ -534,7 +535,6 @@ function parseReserveConfigToFile(reserveConfig) {
|
|
|
534
535
|
protocolLiquidationFeePct: reserveConfig.protocolLiquidationFeePct,
|
|
535
536
|
protocolTakeRatePct: reserveConfig.protocolLiquidationFeePct,
|
|
536
537
|
assetTier: reserveConfig.assetTier,
|
|
537
|
-
multiplierSideBoost: reserveConfig.multiplierSideBoost,
|
|
538
538
|
maxLiquidationBonusBps: reserveConfig.maxLiquidationBonusBps,
|
|
539
539
|
badDebtLiquidationBonusBps: reserveConfig.badDebtLiquidationBonusBps,
|
|
540
540
|
fees: {
|
|
@@ -566,13 +566,14 @@ function parseReserveConfigToFile(reserveConfig) {
|
|
|
566
566
|
borrowFactorPct: reserveConfig.borrowFactorPct.toString(),
|
|
567
567
|
elevationGroups: reserveConfig.elevationGroups,
|
|
568
568
|
deleveragingThresholdSlotsPerBps: reserveConfig.deleveragingThresholdSlotsPerBps.toString(),
|
|
569
|
-
multiplierTagBoost: reserveConfig.multiplierTagBoost,
|
|
570
569
|
disableUsageAsCollOutsideEmode: reserveConfig.disableUsageAsCollOutsideEmode,
|
|
571
570
|
utilizationLimitBlockBorrowingAbove: reserveConfig.utilizationLimitBlockBorrowingAbove,
|
|
572
571
|
hostFixedInterestRateBps: reserveConfig.hostFixedInterestRateBps,
|
|
573
572
|
borrowLimitOutsideElevationGroup: reserveConfig.borrowLimitOutsideElevationGroup.toString(),
|
|
574
573
|
borrowLimitAgainstThisCollateralInElevationGroup: reserveConfig.borrowLimitAgainstThisCollateralInElevationGroup.map((entry) => entry.toString()),
|
|
575
574
|
reserved1: Array(2).fill(0),
|
|
575
|
+
reserved2: Array(2).fill(0),
|
|
576
|
+
reserved3: Array(8).fill(0),
|
|
576
577
|
};
|
|
577
578
|
}
|
|
578
579
|
//# sourceMappingURL=client_kamino_manager.js.map
|
|
@@ -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 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"]}
|
|
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 Connection,\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.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.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.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.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.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.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.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.connection, env.kLendProgramId, env.kVaultProgramId);\n const reserveState = await Reserve.fetch(env.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.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(env.connection, lendingMarketAddress, env.kLendProgramId);\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.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(env.connection, lendingMarketAddress, env.kLendProgramId);\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(env.connection, lendingMarketAddress, env.kLendProgramId);\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.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(env.connection, lendingMarketAddress, env.kLendProgramId);\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.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 connection,\n kLendProgramId: args.kLendProgramId,\n kVaultProgramId: args.kVaultProgramId,\n };\n}\n\nexport type Env = {\n provider: anchor.AnchorProvider;\n payer: Keypair;\n connection: Connection;\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 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 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 reserved2: Array(2).fill(0),\n reserved3: Array(8).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 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 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 reserved2: Array(2).fill(0),\n reserved3: Array(8).fill(0),\n };\n}\n"]}
|