@kamino-finance/klend-sdk 3.2.0 → 3.2.2

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
- .option(`--bs58`, 'If true, will print a bs58 txn instead of executing')
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 bs58 this is required, otherwise will be ignored')
64
- .action((_a) => __awaiter(this, [_a], void 0, function* ({ bs58, staging, multisig }) {
65
- const env = initializeClient(bs58, staging);
66
- if (bs58 && !multisig) {
67
- throw new Error('If using bs58, multisig is required');
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: bs58 ? multisigPk : env.payer.publicKey,
72
+ admin: mode === 'multisig' ? multisigPk : env.payer.publicKey,
73
73
  });
74
- const _createMarketSig = yield processTxn(env.client, env.payer, createMarketIxns, bs58, 2500, [marketKp]);
75
- !bs58 && console.log('Market created:', marketKp.publicKey.toBase58());
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
- .option(`--bs58`, 'If true, will print a bs58 txn instead of executing')
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 bs58 this is required, otherwise will be ignored')
86
- .action((_a) => __awaiter(this, [_a], void 0, function* ({ market, mint, mintProgramId, reserveConfigPath, bs58, staging, multisig }) {
87
- const env = initializeClient(bs58, staging);
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 (bs58 && !multisig) {
92
- throw new Error('If using bs58, multisig is required');
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: bs58 ? multisigPk : env.payer.publicKey,
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], bs58, 2500, [reserve]);
106
- const _updateReserveSig = yield processTxn(env.client, env.payer, txnIxns[1], bs58, 2500, [], 400000);
107
- !bs58 &&
108
- console.log('Reserve Created', reserve.publicKey, 'and config updated:', JSON.parse(JSON.stringify(reserveConfig)));
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, updateEntireConfig, bs58, staging, multisig }) {
118
- const env = initializeClient(bs58, staging);
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 (bs58 && !multisig) {
134
- throw new Error('If using bs58, multisig is required');
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, bs58, 2500, [], 400000);
141
- !bs58 && console.log('Reserve Updated with config -> ', JSON.parse(JSON.stringify(reserveConfig)));
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
- .option(`--bs58`, 'If true, will print a bs58 txn instead of executing')
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 bs58 this is required, otherwise will be ignored')
166
- .action((_a) => __awaiter(this, [_a], void 0, function* ({ mint, bs58, staging, multisig }) {
167
- const env = initializeClient(bs58, staging);
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 (bs58 && !multisig) {
170
- throw new Error('If using bs58, multisig is required');
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: bs58 ? multisigPk : env.payer.publicKey,
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, bs58, 2500, [vaultKp]);
183
- !bs58 && console.log('Vault created:', vaultKp.publicKey.toBase58());
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
- .option(`--bs58`, 'If true, will print a bs58 txn instead of executing')
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 bs58 this is required, otherwise will be ignored')
194
- .action((_a) => __awaiter(this, [_a], void 0, function* ({ vault, reserve, allocationWeight, allocationCap, bs58, staging, multisig }) {
195
- const env = initializeClient(bs58, staging);
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 (bs58 && !multisig) {
201
- throw new Error('If using bs58, multisig is required');
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], bs58, 2500, []);
216
- !bs58 && console.log('Vault allocation updated:', updateVaultAllocationSig);
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(bs58, staging) {
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
- !bs58 && console.log('\nSettings ⚙️');
252
- !bs58 && console.log('Admin:', admin);
253
- !bs58 && console.log('Rpc:', rpc);
254
- !bs58 && console.log('kLendProgramId:', kLendProgramId);
255
- !bs58 && console.log('kVaultProgramId:', kVaultProgramId);
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, bs58_1) {
280
- return __awaiter(this, arguments, void 0, function* (web3Client, admin, ixns, bs58, priorityFeeMultiplier = 2500, extraSigners, computeUnits = 200000, priorityFeeLamports = 1000) {
281
- if (bs58) {
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
- return yield (0, lib_1.signSendAndConfirmRawTransactionWithRetry)({
303
- mainConnection: web3Client.sendConnection,
304
- extraConnections: [],
305
- tx: new web3_js_1.VersionedTransaction(tx.compileMessage()),
306
- signers: [admin, ...extraSigners],
307
- commitment: 'confirmed',
308
- sendTransactionOptions: {
309
- skipPreflight: true,
310
- preflightCommitment: 'confirmed',
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4TA,4CAEC;AA9TD,oDAA4B;AAC5B,yCAAoC;AACpC,6CASyB;AACzB,+BAce;AACf,0DAA4C;AAC5C,yCAA6C;AAC7C,+CAS6B;AAC7B,iDAA8C;AAC9C,4DAAiC;AACjC,8CAAuC;AACvC,4DAA+F;AAC/F,uCAAyB;AACzB,iDAAqD;AAGrD,gBAAM,CAAC,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;CAC5D,CAAC,CAAC;AAEH,SAAe,IAAI;;QACjB,MAAM,QAAQ,GAAG,IAAI,mBAAO,EAAE,CAAC;QAE/B,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,WAAW,CAAC,qDAAqD,CAAC,CAAC;QAEvG,QAAQ;aACL,OAAO,CAAC,eAAe,CAAC;aACxB,cAAc,CACb,iBAAiB,EACjB,uJAAuJ,CACxJ;aACA,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;aAC7D,MAAM,CAAC,qBAAqB,EAAE,oEAAoE,CAAC;aACnG,MAAM,CAAC,KAAoC,EAAE,0CAA/B,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;YACxC,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC;YAE3D,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACzE,CAAC;YAED,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,mBAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,mBAAS,CAAC,OAAO,CAAC;YAE1E,MAAM,aAAa,GAAG,IAAI,mBAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;YAE1G,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,MAAM,aAAa,CAAC,eAAe,CAAC;gBACvF,KAAK,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS;aAC9D,CAAC,CAAC;YAEH,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE3G,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtF,CAAC,CAAA,CAAC,CAAC;QAEL,QAAQ;aACL,OAAO,CAAC,qBAAqB,CAAC;aAC9B,cAAc,CAAC,mBAAmB,EAAE,+BAA+B,CAAC;aACpE,cAAc,CAAC,iBAAiB,EAAE,8BAA8B,CAAC;aACjE,cAAc,CAAC,4BAA4B,EAAE,yCAAyC,CAAC;aACvF,cAAc,CAAC,gCAAgC,EAAE,6BAA6B,CAAC;aAC/E,cAAc,CACb,iBAAiB,EACjB,uJAAuJ,CACxJ;aACA,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;aAC7D,MAAM,CAAC,qBAAqB,EAAE,oEAAoE,CAAC;aACnG,MAAM,CAAC,KAAoF,EAAE,0CAA/E,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;YACxF,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,SAAS,GAAG,IAAI,mBAAS,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,kBAAkB,GAAG,IAAI,mBAAS,CAAC,aAAa,CAAC,CAAC;YACxD,MAAM,aAAa,GAAG,IAAI,mBAAS,CAAC,MAAM,CAAC,CAAC;YAE5C,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YAED,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,mBAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,mBAAS,CAAC,OAAO,CAAC;YAC1E,MAAM,aAAa,GAAG,IAAI,mBAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;YAE1G,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;YAErF,MAAM,aAAa,GAAG,0BAA0B,CAAC,qBAAqB,CAAC,CAAC;YACxE,MAAM,WAAW,GAAG,IAAI,2BAAqB,CAAC,SAAS,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;YAE5F,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,aAAa,CAAC,mBAAmB,CAAC;gBACnE,KAAK,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS;gBAC7D,aAAa,EAAE,aAAa;gBAC5B,WAAW,EAAE,WAAW;aACzB,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAE5C,MAAM,iBAAiB,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;YAErG,MAAM,iBAAiB,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAO,CAAC,CAAC;YAEvG,IAAI,KAAK,SAAS;gBAChB,OAAO,CAAC,GAAG,CACT,8BAA8B,EAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,EACzC,oBAAoB,EACpB,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,CAC7B,CAAC;QACN,CAAC,CAAA,CAAC,CAAC;QAEL,QAAQ;aACL,OAAO,CAAC,uBAAuB,CAAC;aAChC,cAAc,CAAC,oBAAoB,EAAE,iBAAiB,CAAC;aACvD,cAAc,CAAC,gCAAgC,EAAE,6BAA6B,CAAC;aAC/E,cAAc,CACb,iBAAiB,EACjB,uJAAuJ,CACxJ;aACA,MAAM,CAAC,wBAAwB,EAAE,+DAA+D,CAAC;aACjG,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;aAC7D,MAAM,CAAC,KAAoF,EAAE,0CAA/E,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE;YACxF,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,cAAc,GAAG,IAAI,mBAAS,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,YAAY,GAAG,MAAM,aAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;YACtG,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YAED,MAAM,aAAa,GAAG,YAAY,CAAC,aAAa,CAAC;YACjD,MAAM,WAAW,GAAG,MAAM,mBAAa,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;YAC1G,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtC,CAAC;YACD,MAAM,iBAAiB,GAAsB;gBAC3C,OAAO,EAAE,aAAa;gBACtB,KAAK,EAAE,WAAW;aACnB,CAAC;YAEF,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YAED,MAAM,aAAa,GAAG,IAAI,mBAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;YAE1G,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;YAErF,MAAM,aAAa,GAAG,0BAA0B,CAAC,qBAAqB,CAAC,CAAC;YAExE,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,gBAAgB,CAC/C,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,kBAAkB,CACnB,CAAC;YAEF,MAAM,iBAAiB,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAO,CAAC,CAAC;YAEjG,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAClH,CAAC,CAAA,CAAC,CAAC;QAEL,QAAQ;aACL,OAAO,CAAC,yBAAyB,CAAC;aAClC,cAAc,CAAC,oBAAoB,EAAE,iBAAiB,CAAC;aACvD,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;aAC7D,MAAM,CAAC,KAA6B,EAAE,0CAAxB,EAAE,OAAO,EAAE,OAAO,EAAE;YACjC,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,cAAc,GAAG,IAAI,mBAAS,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,YAAY,GAAG,MAAM,aAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;YACtG,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YAED,EAAE,CAAC,SAAS,CAAC,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAExF,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAE3G,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAE3E,EAAE,CAAC,aAAa,CACd,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,WAAW,GAAG,OAAO,EAClF,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC,CAC9C,CAAC;QACJ,CAAC,CAAA,CAAC,CAAC;QAEL,QAAQ;aACL,OAAO,CAAC,cAAc,CAAC;aACvB,cAAc,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;aACrD,cAAc,CACb,iBAAiB,EACjB,uJAAuJ,CACxJ;aACA,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;aAC7D,MAAM,CAAC,qBAAqB,EAAE,oEAAoE,CAAC;aACnG,MAAM,CAAC,KAA0C,EAAE,0CAArC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;YAC9C,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,SAAS,GAAG,IAAI,mBAAS,CAAC,IAAI,CAAC,CAAC;YAEtC,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YAED,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,mBAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,mBAAS,CAAC,OAAO,CAAC;YAC1E,MAAM,aAAa,GAAG,IAAI,mBAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;YAE1G,MAAM,iBAAiB,GAAG,IAAI,uBAAiB,CAAC;gBAC9C,KAAK,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS;gBAC7D,SAAS,EAAE,SAAS;gBACpB,kBAAkB,EAAE,4BAAgB;gBACpC,kBAAkB,EAAE,IAAI,oBAAO,CAAC,GAAG,CAAC;gBACpC,iBAAiB,EAAE,IAAI,oBAAO,CAAC,GAAG,CAAC;aACpC,CAAC,CAAC;YAEH,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAErG,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;YAErG,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpF,CAAC,CAAA,CAAC,CAAC;QAEL,QAAQ;aACL,OAAO,CAAC,iCAAiC,CAAC;aAC1C,cAAc,CAAC,kBAAkB,EAAE,eAAe,CAAC;aACnD,cAAc,CAAC,oBAAoB,EAAE,iBAAiB,CAAC;aACvD,cAAc,CAAC,8BAA8B,EAAE,mBAAmB,CAAC;aACnE,cAAc,CAAC,2BAA2B,EAAE,8BAA8B,CAAC;aAC3E,cAAc,CACb,iBAAiB,EACjB,uJAAuJ,CACxJ;aACA,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;aAC7D,MAAM,CAAC,qBAAqB,EAAE,oEAAoE,CAAC;aACnG,MAAM,CAAC,KAAqF,EAAE,0CAAhF,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;YACzF,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,cAAc,GAAG,IAAI,mBAAS,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,YAAY,GAAG,IAAI,mBAAS,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,qBAAqB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACvD,MAAM,oBAAoB,GAAG,IAAI,oBAAO,CAAC,aAAa,CAAC,CAAC;YAExD,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YAED,MAAM,aAAa,GAAG,IAAI,mBAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;YAC1G,MAAM,YAAY,GAAG,MAAM,aAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;YACtG,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YAED,MAAM,kBAAkB,GAAuB;gBAC7C,OAAO,EAAE,cAAc;gBACvB,KAAK,EAAE,YAAY;aACpB,CAAC;YACF,MAAM,4BAA4B,GAAG,IAAI,6BAAuB,CAC9D,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,CACrB,CAAC;YACF,MAAM,WAAW,GAAG,IAAI,iBAAW,CAAC,YAAY,EAAE,SAAS,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;YAClF,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,+BAA+B,CACtE,WAAW,EACX,4BAA4B,CAC7B,CAAC;YAEF,MAAM,wBAAwB,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAEzG,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,wBAAwB,CAAC,CAAC;QAC3F,CAAC,CAAA,CAAC,CAAC;QAEL,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,MAAM,CAAC,GAAS,EAAE;YACxD,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3C,MAAM,aAAa,GAAG,IAAI,mBAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;YAE1G,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,qBAAqB,EAAE,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAC1E,CAAC,CAAA,CAAC,CAAC;QAEH,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC9B,CAAC;CAAA;AAED,IAAI,EAAE;KACH,IAAI,CAAC,GAAG,EAAE;IACT,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACX,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEL,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,OAAO,iBAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAiB,EAAE,OAAgB;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAM,CAAC;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAI,CAAC;IAC7B,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAyB,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAyB,CAAC;IAC/G,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,yBAA0B,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,yBAA0B,CAAC;IAElH,uBAAuB;IACvB,MAAM,GAAG,GAAQ,YAAY,CAAC;QAC5B,aAAa,EAAE,KAAK;QACpB,GAAG,EAAE,GAAG;QACR,cAAc,EAAE,IAAI,mBAAS,CAAC,cAAc,CAAC;QAC7C,eAAe,EAAE,IAAI,mBAAS,CAAC,eAAe,CAAC;KAChD,CAAC,CAAC;IAEH,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IAC5D,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;IAE9D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,IAKrB;IACC,MAAM,KAAK,GAAU;QACnB,IAAI,EAAE,cAAc;QACpB,QAAQ,EAAE,IAAI,CAAC,GAAG;QAClB,UAAU,EAAE,IAAI,CAAC,GAAG;QACpB,OAAO,EAAE,2BAAqB;QAC9B,WAAW,EAAE,uBAAuB;KACrC,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,gBAAU,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC;IACzC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC;IAEvG,OAAO;QACL,QAAQ;QACR,KAAK;QACL,MAAM;QACN,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,eAAe,EAAE,IAAI,CAAC,eAAe;KACtC,CAAC;AACJ,CAAC;AAUD,SAAe,UAAU;yDACvB,UAAsB,EACtB,KAAc,EACd,IAA8B,EAC9B,IAAY,EACZ,wBAAgC,IAAI,EACpC,YAAsB,EACtB,eAAuB,MAAO,EAC9B,sBAA8B,IAAI;QAElC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YAC3F,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,IAAI,GAAG,qDAAqD,CAAC,CAAC;QACnG,CAAC;QACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC;YACvE,MAAM,GAAG,GAAG,IAAI,qBAAW,EAAE,CAAC;YAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YACjB,GAAG,CAAC,eAAe,GAAG,SAAS,CAAC;YAChC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;YAE/B,OAAO,CAAC,GAAG,CAAC,IAAA,4BAAgB,EAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YAEtD,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,mBAAmB,GAAG,SAAA,EAAE,EAAI,CAAC,CAAA,CAAC,CAAC,gBAAgB;YACpE,MAAM,8BAA8B,GAAG,YAAY,GAAG,YAAY,CAAC;YAEnE,MAAM,EAAE,GAAG,IAAI,qBAAW,EAAE,CAAC;YAC7B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC;YACvE,IAAI,qBAAqB,EAAE,CAAC;gBAC1B,MAAM,cAAc,GAAG,uCAAuC,CAC5D,YAAY,EACZ,8BAA8B,GAAG,qBAAqB,CACvD,CAAC;gBACF,EAAE,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC;YAC5B,CAAC;YACD,EAAE,CAAC,eAAe,GAAG,SAAS,CAAC;YAC/B,EAAE,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;YAC9B,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAEhB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,MAAM,IAAA,+CAAyC,EAAC;oBACrD,cAAc,EAAE,UAAU,CAAC,cAAc;oBACzC,gBAAgB,EAAE,EAAE;oBACpB,EAAE,EAAE,IAAI,8BAAoB,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC;oBACjD,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,YAAY,CAAC;oBACjC,UAAU,EAAE,WAAW;oBACvB,sBAAsB,EAAE;wBACtB,aAAa,EAAE,IAAI;wBACnB,mBAAmB,EAAE,WAAW;qBACjC;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC/B,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,mBAAmB,CACpE,IAAI,8BAAoB,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAC9C,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxD,CAAC;iBAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CACT,WAAW,EACX,oDAAoD,kBAAkB,CACpE,EAAE,CAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACzC,EAAE,CACJ,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CAAA;AAED,SAAS,uCAAuC,CAAC,KAAa,EAAE,aAAqB;IACnF,MAAM,IAAI,GAA6B,EAAE,CAAC;IAC1C,IAAI,CAAC,IAAI,CAAC,8BAAoB,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC,IAAI,CAAC,8BAAoB,CAAC,mBAAmB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,0BAA0B,CAAC,kBAAuB;IACzD,MAAM,mBAAmB,GAAwB;QAC/C,MAAM,EAAE,kBAAkB,CAAC,MAAM;QACjC,cAAc,EAAE,kBAAkB,CAAC,cAAc;QACjD,uBAAuB,EAAE,kBAAkB,CAAC,uBAAuB;QACnE,sBAAsB,EAAE,kBAAkB,CAAC,sBAAsB;QACjE,yBAAyB,EAAE,kBAAkB,CAAC,yBAAyB;QACvE,mBAAmB,EAAE,kBAAkB,CAAC,yBAAyB;QACjE,SAAS,EAAE,kBAAkB,CAAC,SAAS;QACvC,mBAAmB,EAAE,kBAAkB,CAAC,mBAAmB;QAC3D,sBAAsB,EAAE,kBAAkB,CAAC,sBAAsB;QACjE,0BAA0B,EAAE,kBAAkB,CAAC,0BAA0B;QACzE,IAAI,EAAE;YACJ,WAAW,EAAE,mBAAQ,CAAC,WAAW,CAAC,IAAI,oBAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;YACzF,cAAc,EAAE,mBAAQ,CAAC,WAAW,CAAC,IAAI,oBAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO;YAC/F,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SAC1B;QACD,YAAY,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,YAAY,CAAC;QACrD,WAAW,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,WAAW,CAAC;QACnD,SAAS,EAAE,8BACT,IAAI,EAAE,IAAA,qBAAe,EAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,EACxD,SAAS,EAAE,IAAI,sBAAc,CAAC;gBAC5B,KAAK,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC3D,KAAK,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC3D,GAAG,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC;aACxD,CAAC,EACF,oBAAoB,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAC/E,kBAAkB,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAC3E,iBAAiB,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,CAAC,IACtE,wBAAwB,CAAC,kBAAkB,CAAC,KAC/C,eAAe,EAAE,kBAAkB,CAAC,SAAS,CAAC,eAAe,EAC7D,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAC1B,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,WAAE,CAAC,CAAC,CAAC,CAAC,GACtB;QACd,eAAe,EAAE,oBAAoB,CAAC,kBAAkB,CAAC;QACzD,oBAAoB,EAAE,IAAI,sBAAc,CAAC;YACvC,cAAc,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,cAAc,CAAC;YAC9E,YAAY,EAAE,IAAI,WAAE,CAAC,CAAC,CAAC;YACvB,0BAA0B,EAAE,IAAI,WAAE,CAAC,CAAC,CAAC;YACrC,2BAA2B,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,2BAA2B,CAAC;SACzG,CAAC;QACF,iBAAiB,EAAE,IAAI,sBAAc,CAAC;YACpC,cAAc,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,cAAc,CAAC;YAC3E,YAAY,EAAE,IAAI,WAAE,CAAC,CAAC,CAAC;YACvB,0BAA0B,EAAE,IAAI,WAAE,CAAC,CAAC,CAAC;YACrC,2BAA2B,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,2BAA2B,CAAC;SACtG,CAAC;QACF,gCAAgC,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,gCAAgC,CAAC;QAC7F,eAAe,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,eAAe,CAAC;QAC3D,eAAe,EAAE,kBAAkB,CAAC,eAAe;QACnD,gCAAgC,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,gCAAgC,CAAC;QAC7F,kBAAkB,EAAE,kBAAkB,CAAC,kBAAkB;QACzD,8BAA8B,EAAE,kBAAkB,CAAC,8BAA8B;QACjF,mCAAmC,EAAE,kBAAkB,CAAC,mCAAmC;QAC3F,wBAAwB,EAAE,kBAAkB,CAAC,wBAAwB;QACrE,gCAAgC,EAAE,IAAI,WAAE,CAAC,kBAAkB,CAAC,gCAAgC,CAAC;QAC7F,gDAAgD,EAAE,yCAAyC,CAAC,kBAAkB,CAAC;QAC/G,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;KAC5B,CAAC;IAEF,OAAO,IAAI,qBAAa,CAAC,mBAAmB,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,wBAAwB,CAAC,kBAAuB;IAKvD,MAAM,iBAAiB,GAAG,IAAI,yBAAiB,CAAC;QAC9C,KAAK,EAAE,IAAI,mBAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC;KAC3E,CAAC,CAAC;IACH,MAAM,wBAAwB,GAAG,IAAI,gCAAwB,CAAC;QAC5D,eAAe,EAAE,IAAI,mBAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,wBAAwB,CAAC,eAAe,CAAC;QACrG,cAAc,EAAE,IAAI,mBAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,wBAAwB,CAAC,cAAc,CAAC;KACpG,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAE/C,MAAM,kBAAkB,GAAa,kBAAkB,CAAC,SAAS,CAAC,kBAAkB,CAAC,UAAU,CAAC;IAChG,MAAM,iBAAiB,GAAa,kBAAkB,CAAC,SAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC;IAE9F,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAC1E,iBAAiB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAExE,MAAM,kBAAkB,GAAG,IAAI,0BAAkB,CAAC;QAChD,SAAS,EAAE,IAAI,mBAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC;QACnF,UAAU,EAAE,UAAU;QACtB,SAAS,EAAE,SAAS;KACrB,CAAC,CAAC;IAEH,OAAO;QACL,iBAAiB;QACjB,wBAAwB;QACxB,kBAAkB;KACnB,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,kBAAuB;IACnD,MAAM,WAAW,GAAuB,EAAE,CAAC;IAE3C,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,UAA2D,EAAE,EAAE,CAChH,WAAW,CAAC,IAAI,CAAC;QACf,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;QACjD,aAAa,EAAE,UAAU,CAAC,aAAa;KACxC,CAAC,CACH,CAAC;IAEF,MAAM,gBAAgB,GAAuB,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAEjG,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IAEnF,MAAM,eAAe,GAAG,IAAI,uBAAe,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAE1E,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,yCAAyC,CAAC,kBAAuB;IACxE,MAAM,oCAAoC,GAAS,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,WAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7E,kBAAkB,CAAC,gDAAgD,CAAC,OAAO,CACzE,CAAC,KAAU,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC,oCAAoC,CAAC,KAAK,CAAC,GAAG,IAAI,WAAE,CAAC,KAAK,CAAC,CAAC,CAC7F,CAAC;IAEF,OAAO,oCAAoC,CAAC;AAC9C,CAAC;AAED,SAAS,wBAAwB,CAAC,aAA4B;IAC5D,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IAEzC,OAAO;QACL,MAAM,EAAE,aAAa,CAAC,MAAM;QAC5B,cAAc,EAAE,aAAa,CAAC,cAAc;QAC5C,uBAAuB,EAAE,aAAa,CAAC,uBAAuB;QAC9D,sBAAsB,EAAE,aAAa,CAAC,sBAAsB;QAC5D,yBAAyB,EAAE,aAAa,CAAC,yBAAyB;QAClE,mBAAmB,EAAE,aAAa,CAAC,yBAAyB;QAC5D,SAAS,EAAE,aAAa,CAAC,SAAS;QAClC,mBAAmB,EAAE,aAAa,CAAC,mBAAmB;QACtD,sBAAsB,EAAE,aAAa,CAAC,sBAAsB;QAC5D,0BAA0B,EAAE,aAAa,CAAC,0BAA0B;QACpE,IAAI,EAAE;YACJ,SAAS,EAAE,IAAI,mBAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE;YAC9E,YAAY,EAAE,IAAI,mBAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE;YACpF,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SAC1B;QACD,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC,QAAQ,EAAE;QACnD,WAAW,EAAE,aAAa,CAAC,WAAW,CAAC,QAAQ,EAAE;QACjD,SAAS,EAAE;YACT,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YACtF,SAAS,EAAE;gBACT,GAAG,EAAE,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE;gBACrD,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE;gBACzD,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE;aAC1D;YACD,oBAAoB,EAAE,aAAa,CAAC,SAAS,CAAC,oBAAoB,CAAC,QAAQ,EAAE;YAC7E,kBAAkB,EAAE,aAAa,CAAC,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE;YACzE,iBAAiB,EAAE,aAAa,CAAC,SAAS,CAAC,iBAAiB,CAAC,QAAQ,EAAE;YACvE,kBAAkB,EAAE,aAAa,CAAC,SAAS,CAAC,kBAAkB;YAC9D,wBAAwB,EAAE,aAAa,CAAC,SAAS,CAAC,wBAAwB;YAC1E,iBAAiB,EAAE,aAAa,CAAC,SAAS,CAAC,iBAAiB;YAC5D,eAAe,EAAE,aAAa,CAAC,SAAS,CAAC,eAAe;SACzD;QACD,eAAe,EAAE,aAAa,CAAC,eAAe;QAC9C,oBAAoB,EAAE,aAAa,CAAC,oBAAoB;QACxD,iBAAiB,EAAE,aAAa,CAAC,iBAAiB;QAClD,gCAAgC,EAAE,aAAa,CAAC,gCAAgC,CAAC,QAAQ,EAAE;QAC3F,eAAe,EAAE,aAAa,CAAC,eAAe,CAAC,QAAQ,EAAE;QACzD,eAAe,EAAE,aAAa,CAAC,eAAe;QAC9C,gCAAgC,EAAE,aAAa,CAAC,gCAAgC,CAAC,QAAQ,EAAE;QAC3F,kBAAkB,EAAE,aAAa,CAAC,kBAAkB;QACpD,8BAA8B,EAAE,aAAa,CAAC,8BAA8B;QAC5E,mCAAmC,EAAE,aAAa,CAAC,mCAAmC;QACtF,wBAAwB,EAAE,aAAa,CAAC,wBAAwB;QAChE,gCAAgC,EAAE,aAAa,CAAC,gCAAgC,CAAC,QAAQ,EAAE;QAC3F,gDAAgD,EAC9C,aAAa,CAAC,gDAAgD,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjG,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;KAC5B,CAAC;AACJ,CAAC","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.0",
3
+ "version": "3.2.2",
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",