@kamino-finance/klend-sdk 3.2.0 → 3.2.1
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.
|
@@ -58,21 +58,21 @@ function main() {
|
|
|
58
58
|
commands.name('kamino-manager-cli').description('CLI to interact with the kvaults and klend programs');
|
|
59
59
|
commands
|
|
60
60
|
.command('create-market')
|
|
61
|
-
.
|
|
61
|
+
.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')
|
|
62
62
|
.option(`--staging`, 'If true, will use the staging programs')
|
|
63
|
-
.option(`--multisig <string>`, 'If using
|
|
64
|
-
.action((_a) => __awaiter(this, [_a], void 0, function* ({
|
|
65
|
-
const env = initializeClient(
|
|
66
|
-
if (
|
|
67
|
-
throw new Error('If using
|
|
63
|
+
.option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')
|
|
64
|
+
.action((_a) => __awaiter(this, [_a], void 0, function* ({ mode, staging, multisig }) {
|
|
65
|
+
const env = initializeClient(mode === 'multisig', staging);
|
|
66
|
+
if (mode === 'multisig' && !multisig) {
|
|
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
70
|
const kaminoManager = new lib_1.KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);
|
|
71
71
|
const { market: marketKp, ixns: createMarketIxns } = yield kaminoManager.createMarketIxs({
|
|
72
|
-
admin:
|
|
72
|
+
admin: mode === 'multisig' ? multisigPk : env.payer.publicKey,
|
|
73
73
|
});
|
|
74
|
-
const _createMarketSig = yield processTxn(env.client, env.payer, createMarketIxns,
|
|
75
|
-
|
|
74
|
+
const _createMarketSig = yield processTxn(env.client, env.payer, createMarketIxns, mode, 2500, [marketKp]);
|
|
75
|
+
mode === 'execute' && console.log('Market created:', marketKp.publicKey.toBase58());
|
|
76
76
|
}));
|
|
77
77
|
commands
|
|
78
78
|
.command('add-asset-to-market')
|
|
@@ -80,16 +80,16 @@ function main() {
|
|
|
80
80
|
.requiredOption('--mint <string>', 'Reserve liquidity token mint')
|
|
81
81
|
.requiredOption('--mint-program-id <string>', 'Reserve liquidity token mint program id')
|
|
82
82
|
.requiredOption('--reserve-config-path <string>', 'Path for the reserve config')
|
|
83
|
-
.
|
|
83
|
+
.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')
|
|
84
84
|
.option(`--staging`, 'If true, will use the staging programs')
|
|
85
|
-
.option(`--multisig <string>`, 'If using
|
|
86
|
-
.action((_a) => __awaiter(this, [_a], void 0, function* ({ market, mint, mintProgramId, reserveConfigPath,
|
|
87
|
-
const env = initializeClient(
|
|
85
|
+
.option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')
|
|
86
|
+
.action((_a) => __awaiter(this, [_a], void 0, function* ({ market, mint, mintProgramId, reserveConfigPath, mode, staging, multisig }) {
|
|
87
|
+
const env = initializeClient(mode === 'multisig', staging);
|
|
88
88
|
const tokenMint = new web3_js_1.PublicKey(mint);
|
|
89
89
|
const tokenMintProgramId = new web3_js_1.PublicKey(mintProgramId);
|
|
90
90
|
const marketAddress = new web3_js_1.PublicKey(market);
|
|
91
|
-
if (
|
|
92
|
-
throw new Error('If using
|
|
91
|
+
if (mode === 'multisig' && !multisig) {
|
|
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
95
|
const kaminoManager = new lib_1.KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);
|
|
@@ -97,25 +97,25 @@ function main() {
|
|
|
97
97
|
const reserveConfig = parseReserveConfigFromFile(reserveConfigFromFile);
|
|
98
98
|
const assetConfig = new lib_1.AssetReserveConfigCli(tokenMint, tokenMintProgramId, reserveConfig);
|
|
99
99
|
const { reserve, txnIxns } = yield kaminoManager.addAssetToMarketIxs({
|
|
100
|
-
admin:
|
|
100
|
+
admin: mode === 'multisig' ? multisigPk : env.payer.publicKey,
|
|
101
101
|
marketAddress: marketAddress,
|
|
102
102
|
assetConfig: assetConfig,
|
|
103
103
|
});
|
|
104
104
|
console.log('reserve: ', reserve.publicKey);
|
|
105
|
-
const _createReserveSig = yield processTxn(env.client, env.payer, txnIxns[0],
|
|
106
|
-
const _updateReserveSig = yield processTxn(env.client, env.payer, txnIxns[1],
|
|
107
|
-
|
|
108
|
-
console.log('Reserve Created
|
|
105
|
+
const _createReserveSig = yield processTxn(env.client, env.payer, txnIxns[0], mode, 2500, [reserve]);
|
|
106
|
+
const _updateReserveSig = yield processTxn(env.client, env.payer, txnIxns[1], mode, 2500, [], 400000);
|
|
107
|
+
mode === 'execute' &&
|
|
108
|
+
console.log('Reserve Created with config:', JSON.parse(JSON.stringify(reserveConfig)), '\nreserve address:', reserve.publicKey.toBase58());
|
|
109
109
|
}));
|
|
110
110
|
commands
|
|
111
111
|
.command('update-reserve-config')
|
|
112
112
|
.requiredOption('--reserve <string>', 'Reserve address')
|
|
113
113
|
.requiredOption('--reserve-config-path <string>', 'Path for the reserve config')
|
|
114
|
+
.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')
|
|
114
115
|
.option('--update-entire-config', 'If set, it will update entire reserve config in 1 instruction')
|
|
115
|
-
.option(`--bs58`, 'If true, will print a bs58 txn instead of executing')
|
|
116
116
|
.option(`--staging`, 'If true, will use the staging programs')
|
|
117
|
-
.action((_a) => __awaiter(this, [_a], void 0, function* ({ reserve, reserveConfigPath,
|
|
118
|
-
const env = initializeClient(
|
|
117
|
+
.action((_a) => __awaiter(this, [_a], void 0, function* ({ reserve, reserveConfigPath, mode, updateEntireConfig, staging, multisig }) {
|
|
118
|
+
const env = initializeClient(mode === 'multisig', staging);
|
|
119
119
|
const reserveAddress = new web3_js_1.PublicKey(reserve);
|
|
120
120
|
const reserveState = yield lib_1.Reserve.fetch(env.provider.connection, reserveAddress, env.kLendProgramId);
|
|
121
121
|
if (!reserveState) {
|
|
@@ -130,15 +130,15 @@ function main() {
|
|
|
130
130
|
address: marketAddress,
|
|
131
131
|
state: marketState,
|
|
132
132
|
};
|
|
133
|
-
if (
|
|
134
|
-
throw new Error('If using
|
|
133
|
+
if (mode === 'multisig' && !multisig) {
|
|
134
|
+
throw new Error('If using multisig mode, multisig is required');
|
|
135
135
|
}
|
|
136
136
|
const kaminoManager = new lib_1.KaminoManager(env.provider.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);
|
|
140
|
-
const _updateReserveSig = yield processTxn(env.client, env.payer, ixns,
|
|
141
|
-
|
|
140
|
+
const _updateReserveSig = yield processTxn(env.client, env.payer, ixns, mode, 2500, [], 400000);
|
|
141
|
+
mode === 'execute' && console.log('Reserve Updated with config -> ', JSON.parse(JSON.stringify(reserveConfig)));
|
|
142
142
|
}));
|
|
143
143
|
commands
|
|
144
144
|
.command('download-reserve-config')
|
|
@@ -160,27 +160,27 @@ function main() {
|
|
|
160
160
|
commands
|
|
161
161
|
.command('create-vault')
|
|
162
162
|
.requiredOption('--mint <string>', 'Vault token mint')
|
|
163
|
-
.
|
|
163
|
+
.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')
|
|
164
164
|
.option(`--staging`, 'If true, will use the staging programs')
|
|
165
|
-
.option(`--multisig <string>`, 'If using
|
|
166
|
-
.action((_a) => __awaiter(this, [_a], void 0, function* ({ mint,
|
|
167
|
-
const env = initializeClient(
|
|
165
|
+
.option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')
|
|
166
|
+
.action((_a) => __awaiter(this, [_a], void 0, function* ({ mint, mode, staging, multisig }) {
|
|
167
|
+
const env = initializeClient(mode === 'multisig', staging);
|
|
168
168
|
const tokenMint = new web3_js_1.PublicKey(mint);
|
|
169
|
-
if (
|
|
170
|
-
throw new Error('If using
|
|
169
|
+
if (mode === 'multisig' && !multisig) {
|
|
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
173
|
const kaminoManager = new lib_1.KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);
|
|
174
174
|
const kaminoVaultConfig = new lib_1.KaminoVaultConfig({
|
|
175
|
-
admin:
|
|
175
|
+
admin: mode === 'multisig' ? multisigPk : env.payer.publicKey,
|
|
176
176
|
tokenMint: tokenMint,
|
|
177
177
|
tokenMintProgramId: spl_token_1.TOKEN_PROGRAM_ID,
|
|
178
178
|
performanceFeeRate: new decimal_js_1.default(0.0),
|
|
179
179
|
managementFeeRate: new decimal_js_1.default(0.0),
|
|
180
180
|
});
|
|
181
181
|
const { vault: vaultKp, ixns: instructions } = yield kaminoManager.createVaultIxs(kaminoVaultConfig);
|
|
182
|
-
const _createVaultSig = yield processTxn(env.client, env.payer, instructions,
|
|
183
|
-
|
|
182
|
+
const _createVaultSig = yield processTxn(env.client, env.payer, instructions, mode, 2500, [vaultKp]);
|
|
183
|
+
mode === 'execute' && console.log('Vault created:', vaultKp.publicKey.toBase58());
|
|
184
184
|
}));
|
|
185
185
|
commands
|
|
186
186
|
.command('update-vault-reserve-allocation')
|
|
@@ -188,17 +188,17 @@ function main() {
|
|
|
188
188
|
.requiredOption('--reserve <string>', 'Reserve address')
|
|
189
189
|
.requiredOption('--allocation-weight <number>', 'Allocation weight')
|
|
190
190
|
.requiredOption('--allocation-cap <string>', 'Allocation cap decimal value')
|
|
191
|
-
.
|
|
191
|
+
.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')
|
|
192
192
|
.option(`--staging`, 'If true, will use the staging programs')
|
|
193
|
-
.option(`--multisig <string>`, 'If using
|
|
194
|
-
.action((_a) => __awaiter(this, [_a], void 0, function* ({ vault, reserve, allocationWeight, allocationCap,
|
|
195
|
-
const env = initializeClient(
|
|
193
|
+
.option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')
|
|
194
|
+
.action((_a) => __awaiter(this, [_a], void 0, function* ({ vault, reserve, allocationWeight, allocationCap, mode, staging, multisig }) {
|
|
195
|
+
const env = initializeClient(mode === 'multisig', staging);
|
|
196
196
|
const reserveAddress = new web3_js_1.PublicKey(reserve);
|
|
197
197
|
const vaultAddress = new web3_js_1.PublicKey(vault);
|
|
198
198
|
const allocationWeightValue = Number(allocationWeight);
|
|
199
199
|
const allocationCapDecimal = new decimal_js_1.default(allocationCap);
|
|
200
|
-
if (
|
|
201
|
-
throw new Error('If using
|
|
200
|
+
if (mode === 'multisig' && !multisig) {
|
|
201
|
+
throw new Error('If using multisig mode, multisig is required');
|
|
202
202
|
}
|
|
203
203
|
const kaminoManager = new lib_1.KaminoManager(env.provider.connection, env.kLendProgramId, env.kVaultProgramId);
|
|
204
204
|
const reserveState = yield lib_1.Reserve.fetch(env.provider.connection, reserveAddress, env.kLendProgramId);
|
|
@@ -212,8 +212,8 @@ function main() {
|
|
|
212
212
|
const firstReserveAllocationConfig = new lib_1.ReserveAllocationConfig(reserveWithAddress, allocationWeightValue, allocationCapDecimal);
|
|
213
213
|
const kaminoVault = new lib_1.KaminoVault(vaultAddress, undefined, env.kVaultProgramId);
|
|
214
214
|
const instructions = yield kaminoManager.updateVaultReserveAllocationIxs(kaminoVault, firstReserveAllocationConfig);
|
|
215
|
-
const updateVaultAllocationSig = yield processTxn(env.client, env.payer, [instructions],
|
|
216
|
-
|
|
215
|
+
const updateVaultAllocationSig = yield processTxn(env.client, env.payer, [instructions], mode, 2500, []);
|
|
216
|
+
mode === 'execute' && console.log('Vault allocation updated:', updateVaultAllocationSig);
|
|
217
217
|
}));
|
|
218
218
|
commands.command('get-oracle-mappings').action(() => __awaiter(this, void 0, void 0, function* () {
|
|
219
219
|
const env = initializeClient(false, false);
|
|
@@ -236,7 +236,7 @@ main()
|
|
|
236
236
|
function parseKeypairFile(file) {
|
|
237
237
|
return web3_js_1.Keypair.fromSecretKey(Buffer.from(JSON.parse(require('fs').readFileSync(file))));
|
|
238
238
|
}
|
|
239
|
-
function initializeClient(
|
|
239
|
+
function initializeClient(multisig, staging) {
|
|
240
240
|
const admin = process.env.ADMIN;
|
|
241
241
|
const rpc = process.env.RPC;
|
|
242
242
|
const kLendProgramId = staging ? process.env.KLEND_PROGRAM_ID_STAGING : process.env.KLEND_PROGRAM_ID_MAINNET;
|
|
@@ -248,11 +248,11 @@ function initializeClient(bs58, staging) {
|
|
|
248
248
|
kLendProgramId: new web3_js_1.PublicKey(kLendProgramId),
|
|
249
249
|
kVaultProgramId: new web3_js_1.PublicKey(kVaultProgramId),
|
|
250
250
|
});
|
|
251
|
-
!
|
|
252
|
-
!
|
|
253
|
-
!
|
|
254
|
-
!
|
|
255
|
-
!
|
|
251
|
+
!multisig && console.log('\nSettings ⚙️');
|
|
252
|
+
!multisig && console.log('Admin:', admin);
|
|
253
|
+
!multisig && console.log('Rpc:', rpc);
|
|
254
|
+
!multisig && console.log('kLendProgramId:', kLendProgramId);
|
|
255
|
+
!multisig && console.log('kVaultProgramId:', kVaultProgramId);
|
|
256
256
|
return env;
|
|
257
257
|
}
|
|
258
258
|
function setUpProgram(args) {
|
|
@@ -276,9 +276,12 @@ function setUpProgram(args) {
|
|
|
276
276
|
kVaultProgramId: args.kVaultProgramId,
|
|
277
277
|
};
|
|
278
278
|
}
|
|
279
|
-
function processTxn(web3Client_1, admin_1, ixns_1,
|
|
280
|
-
return __awaiter(this, arguments, void 0, function* (web3Client, admin, ixns,
|
|
281
|
-
if (
|
|
279
|
+
function processTxn(web3Client_1, admin_1, ixns_1, mode_1) {
|
|
280
|
+
return __awaiter(this, arguments, void 0, function* (web3Client, admin, ixns, mode, priorityFeeMultiplier = 2500, extraSigners, computeUnits = 200000, priorityFeeLamports = 1000) {
|
|
281
|
+
if (mode !== 'inspect' && mode !== 'simulate' && mode !== 'execute' && mode !== 'multisig') {
|
|
282
|
+
throw new Error('Invalid mode: ' + mode + '. Must be one of: inspect/simulate/execute/multisig');
|
|
283
|
+
}
|
|
284
|
+
if (mode === 'multisig') {
|
|
282
285
|
const { blockhash } = yield web3Client.connection.getLatestBlockhash();
|
|
283
286
|
const txn = new web3_js_1.Transaction();
|
|
284
287
|
txn.add(...ixns);
|
|
@@ -299,17 +302,27 @@ function processTxn(web3Client_1, admin_1, ixns_1, bs58_1) {
|
|
|
299
302
|
tx.recentBlockhash = blockhash;
|
|
300
303
|
tx.feePayer = admin.publicKey;
|
|
301
304
|
tx.add(...ixns);
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
305
|
+
if (mode === 'execute') {
|
|
306
|
+
return yield (0, lib_1.signSendAndConfirmRawTransactionWithRetry)({
|
|
307
|
+
mainConnection: web3Client.sendConnection,
|
|
308
|
+
extraConnections: [],
|
|
309
|
+
tx: new web3_js_1.VersionedTransaction(tx.compileMessage()),
|
|
310
|
+
signers: [admin, ...extraSigners],
|
|
311
|
+
commitment: 'confirmed',
|
|
312
|
+
sendTransactionOptions: {
|
|
313
|
+
skipPreflight: true,
|
|
314
|
+
preflightCommitment: 'confirmed',
|
|
315
|
+
},
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
else if (mode === 'simulate') {
|
|
319
|
+
const simulation = yield web3Client.sendConnection.simulateTransaction(new web3_js_1.VersionedTransaction(tx.compileMessage()));
|
|
320
|
+
console.log('Simulation: \n' + simulation.value.logs);
|
|
321
|
+
}
|
|
322
|
+
else if (mode === 'inspect') {
|
|
323
|
+
console.log('Tx in B64', `https://explorer.solana.com/tx/inspector?message=${encodeURIComponent(tx.serializeMessage().toString('base64'))}`);
|
|
324
|
+
}
|
|
325
|
+
return '';
|
|
313
326
|
}
|
|
314
327
|
});
|
|
315
328
|
}
|
|
@@ -342,7 +355,7 @@ function parseReserveConfigFromFile(farmConfigFromFile) {
|
|
|
342
355
|
lower: new anchor_1.BN(farmConfigFromFile.tokenInfo.heuristic.lower),
|
|
343
356
|
upper: new anchor_1.BN(farmConfigFromFile.tokenInfo.heuristic.upper),
|
|
344
357
|
exp: new anchor_1.BN(farmConfigFromFile.tokenInfo.heuristic.exp),
|
|
345
|
-
}), maxTwapDivergenceBps: new anchor_1.BN(farmConfigFromFile.tokenInfo.maxTwapDivergenceBps), maxAgePriceSeconds: new anchor_1.BN(farmConfigFromFile.tokenInfo.maxAgePriceSeconds), maxAgeTwapSeconds: new anchor_1.BN(farmConfigFromFile.tokenInfo.maxAgeTwapSeconds) }, parseOracleConfiguration(farmConfigFromFile)), { reserved: Array(7).fill(0), padding: Array(19).fill(new anchor_1.BN(0)) }),
|
|
358
|
+
}), maxTwapDivergenceBps: new anchor_1.BN(farmConfigFromFile.tokenInfo.maxTwapDivergenceBps), maxAgePriceSeconds: new anchor_1.BN(farmConfigFromFile.tokenInfo.maxAgePriceSeconds), maxAgeTwapSeconds: new anchor_1.BN(farmConfigFromFile.tokenInfo.maxAgeTwapSeconds) }, parseOracleConfiguration(farmConfigFromFile)), { blockPriceUsage: farmConfigFromFile.tokenInfo.blockPriceUsage, reserved: Array(7).fill(0), padding: Array(19).fill(new anchor_1.BN(0)) }),
|
|
346
359
|
borrowRateCurve: parseBorrowRateCurve(farmConfigFromFile),
|
|
347
360
|
depositWithdrawalCap: new types_1.WithdrawalCaps({
|
|
348
361
|
configCapacity: new anchor_1.BN(farmConfigFromFile.depositWithdrawalCap.configCapacity),
|
|
@@ -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 .option(`--bs58`, 'If true, will print a bs58 txn instead of executing')\n .option(`--staging`, 'If true, will use the staging programs')\n .option(`--multisig <string>`, 'If using bs58 this is required, otherwise will be ignored')\n .action(async ({ bs58, staging, multisig }) => {\n const env = initializeClient(bs58, staging);\n\n if (bs58 && !multisig) {\n throw new Error('If using bs58, multisig 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: bs58 ? multisigPk : env.payer.publicKey,\n });\n\n const _createMarketSig = await processTxn(env.client, env.payer, createMarketIxns, bs58, 2500, [marketKp]);\n\n !bs58 && 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 .option(`--bs58`, 'If true, will print a bs58 txn instead of executing')\n .option(`--staging`, 'If true, will use the staging programs')\n .option(`--multisig <string>`, 'If using bs58 this is required, otherwise will be ignored')\n .action(async ({ market, mint, mintProgramId, reserveConfigPath, bs58, staging, multisig }) => {\n const env = initializeClient(bs58, staging);\n const tokenMint = new PublicKey(mint);\n const tokenMintProgramId = new PublicKey(mintProgramId);\n const marketAddress = new PublicKey(market);\n\n if (bs58 && !multisig) {\n throw new Error('If using bs58, 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: bs58 ? 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], bs58, 2500, [reserve]);\n\n const _updateReserveSig = await processTxn(env.client, env.payer, txnIxns[1], bs58, 2500, [], 400_000);\n\n !bs58 &&\n console.log(\n 'Reserve Created',\n reserve.publicKey,\n 'and config updated:',\n JSON.parse(JSON.stringify(reserveConfig))\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 .option('--update-entire-config', 'If set, it will update entire reserve config in 1 instruction')\n .option(`--bs58`, 'If true, will print a bs58 txn instead of executing')\n .option(`--staging`, 'If true, will use the staging programs')\n .action(async ({ reserve, reserveConfigPath, updateEntireConfig, bs58, staging, multisig }) => {\n const env = initializeClient(bs58, 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 (bs58 && !multisig) {\n throw new Error('If using bs58, 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, bs58, 2500, [], 400_000);\n\n !bs58 && 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 .option(`--bs58`, 'If true, will print a bs58 txn instead of executing')\n .option(`--staging`, 'If true, will use the staging programs')\n .option(`--multisig <string>`, 'If using bs58 this is required, otherwise will be ignored')\n .action(async ({ mint, bs58, staging, multisig }) => {\n const env = initializeClient(bs58, staging);\n const tokenMint = new PublicKey(mint);\n\n if (bs58 && !multisig) {\n throw new Error('If using bs58, 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: bs58 ? 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, bs58, 2500, [vaultKp]);\n\n !bs58 && 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 .option(`--bs58`, 'If true, will print a bs58 txn instead of executing')\n .option(`--staging`, 'If true, will use the staging programs')\n .option(`--multisig <string>`, 'If using bs58 this is required, otherwise will be ignored')\n .action(async ({ vault, reserve, allocationWeight, allocationCap, bs58, staging, multisig }) => {\n const env = initializeClient(bs58, 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 (bs58 && !multisig) {\n throw new Error('If using bs58, 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], bs58, 2500, []);\n\n !bs58 && 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(bs58: 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 !bs58 && console.log('\\nSettings ⚙️');\n !bs58 && console.log('Admin:', admin);\n !bs58 && console.log('Rpc:', rpc);\n !bs58 && console.log('kLendProgramId:', kLendProgramId);\n !bs58 && 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 bs58: boolean,\n priorityFeeMultiplier: number = 2500,\n extraSigners: Signer[],\n computeUnits: number = 200_000,\n priorityFeeLamports: number = 1000\n): Promise<TransactionSignature> {\n if (bs58) {\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 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 }\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 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 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kamino-finance/klend-sdk",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.1",
|
|
4
4
|
"description": "Typescript SDK for interacting with the Kamino Lending (klend) protocol",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -38,7 +38,8 @@
|
|
|
38
38
|
"codegen-jupiter-perps": "yarn anchor-client-gen src/jupiter_perps_idl.json ./src/idl_codegen_jupiter_perps/ --program-id PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu",
|
|
39
39
|
"start-validator": "solana-test-validator $(./deps/test-validator-params.sh)",
|
|
40
40
|
"start-validator-and-test": "yarn start-server-and-test 'yarn start-validator' http://127.0.0.1:8899/health test",
|
|
41
|
-
"dump-programs": "./deps/dump-from-mainnet.sh"
|
|
41
|
+
"dump-programs": "./deps/dump-from-mainnet.sh",
|
|
42
|
+
"kamino-manager": "ts-node src/client_kamino_manager.ts"
|
|
42
43
|
},
|
|
43
44
|
"dependencies": {
|
|
44
45
|
"@bokuweb/zstd-wasm": "^0.0.20",
|