@kamino-finance/klend-sdk 7.2.6 → 7.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/@codegen/klend/accounts/LendingMarket.d.ts +33 -0
- package/dist/@codegen/klend/accounts/LendingMarket.d.ts.map +1 -1
- package/dist/@codegen/klend/accounts/LendingMarket.js +24 -2
- package/dist/@codegen/klend/accounts/LendingMarket.js.map +1 -1
- package/dist/@codegen/klend/errors/custom.d.ts +26 -2
- package/dist/@codegen/klend/errors/custom.d.ts.map +1 -1
- package/dist/@codegen/klend/errors/custom.js +45 -3
- package/dist/@codegen/klend/errors/custom.js.map +1 -1
- package/dist/@codegen/klend/instructions/index.d.ts +2 -0
- package/dist/@codegen/klend/instructions/index.d.ts.map +1 -1
- package/dist/@codegen/klend/instructions/index.js +3 -1
- package/dist/@codegen/klend/instructions/index.js.map +1 -1
- package/dist/@codegen/klend/instructions/initReserve.d.ts +1 -1
- package/dist/@codegen/klend/instructions/initReserve.d.ts.map +1 -1
- package/dist/@codegen/klend/instructions/initReserve.js +1 -5
- package/dist/@codegen/klend/instructions/initReserve.js.map +1 -1
- package/dist/@codegen/klend/instructions/liquidateObligationAndRedeemReserveCollateralV2.js +1 -1
- package/dist/@codegen/klend/instructions/seedDepositOnInitReserve.d.ts +13 -0
- package/dist/@codegen/klend/instructions/seedDepositOnInitReserve.d.ts.map +1 -0
- package/dist/@codegen/klend/instructions/seedDepositOnInitReserve.js +24 -0
- package/dist/@codegen/klend/instructions/seedDepositOnInitReserve.js.map +1 -0
- package/dist/@codegen/klend/instructions/withdrawObligationCollateral.js +1 -1
- package/dist/@codegen/klend/instructions/withdrawObligationCollateralV2.js +1 -1
- package/dist/@codegen/klend/types/ReserveConfig.d.ts +58 -24
- package/dist/@codegen/klend/types/ReserveConfig.d.ts.map +1 -1
- package/dist/@codegen/klend/types/ReserveConfig.js +40 -18
- package/dist/@codegen/klend/types/ReserveConfig.js.map +1 -1
- package/dist/@codegen/klend/types/ReserveFees.d.ts +8 -8
- package/dist/@codegen/klend/types/ReserveFees.d.ts.map +1 -1
- package/dist/@codegen/klend/types/ReserveFees.js +8 -8
- package/dist/@codegen/klend/types/ReserveFees.js.map +1 -1
- package/dist/@codegen/klend/types/UpdateConfigMode.d.ts +46 -7
- package/dist/@codegen/klend/types/UpdateConfigMode.d.ts.map +1 -1
- package/dist/@codegen/klend/types/UpdateConfigMode.js +85 -12
- package/dist/@codegen/klend/types/UpdateConfigMode.js.map +1 -1
- package/dist/@codegen/klend/types/UpdateLendingMarketMode.d.ts +26 -0
- package/dist/@codegen/klend/types/UpdateLendingMarketMode.d.ts.map +1 -1
- package/dist/@codegen/klend/types/UpdateLendingMarketMode.js +49 -1
- package/dist/@codegen/klend/types/UpdateLendingMarketMode.js.map +1 -1
- package/dist/@codegen/klend/types/index.d.ts +4 -4
- package/dist/@codegen/klend/types/index.d.ts.map +1 -1
- package/dist/@codegen/klend/types/index.js.map +1 -1
- package/dist/@codegen/kvault/accounts/GlobalConfig.d.ts +32 -0
- package/dist/@codegen/kvault/accounts/GlobalConfig.d.ts.map +1 -0
- package/dist/@codegen/kvault/accounts/GlobalConfig.js +125 -0
- package/dist/@codegen/kvault/accounts/GlobalConfig.js.map +1 -0
- package/dist/@codegen/kvault/accounts/Reserve.js +1 -1
- package/dist/@codegen/kvault/accounts/ReserveWhitelistEntry.d.ts +52 -0
- package/dist/@codegen/kvault/accounts/ReserveWhitelistEntry.d.ts.map +1 -0
- package/dist/@codegen/kvault/accounts/ReserveWhitelistEntry.js +127 -0
- package/dist/@codegen/kvault/accounts/ReserveWhitelistEntry.js.map +1 -0
- package/dist/@codegen/kvault/accounts/VaultState.d.ts +18 -0
- package/dist/@codegen/kvault/accounts/VaultState.d.ts.map +1 -1
- package/dist/@codegen/kvault/accounts/VaultState.js +39 -1
- package/dist/@codegen/kvault/accounts/VaultState.js.map +1 -1
- package/dist/@codegen/kvault/accounts/index.d.ts +4 -0
- package/dist/@codegen/kvault/accounts/index.d.ts.map +1 -1
- package/dist/@codegen/kvault/accounts/index.js +5 -1
- package/dist/@codegen/kvault/accounts/index.js.map +1 -1
- package/dist/@codegen/kvault/errors/custom.d.ts +61 -5
- package/dist/@codegen/kvault/errors/custom.d.ts.map +1 -1
- package/dist/@codegen/kvault/errors/custom.js +108 -9
- package/dist/@codegen/kvault/errors/custom.js.map +1 -1
- package/dist/@codegen/kvault/instructions/addUpdateWhitelistedReserve.d.ts +16 -0
- package/dist/@codegen/kvault/instructions/addUpdateWhitelistedReserve.d.ts.map +1 -0
- package/dist/@codegen/kvault/instructions/addUpdateWhitelistedReserve.js +66 -0
- package/dist/@codegen/kvault/instructions/addUpdateWhitelistedReserve.js.map +1 -0
- package/dist/@codegen/kvault/instructions/buy.d.ts +24 -0
- package/dist/@codegen/kvault/instructions/buy.d.ts.map +1 -0
- package/dist/@codegen/kvault/instructions/buy.js +67 -0
- package/dist/@codegen/kvault/instructions/buy.js.map +1 -0
- package/dist/@codegen/kvault/instructions/index.d.ts +12 -0
- package/dist/@codegen/kvault/instructions/index.d.ts.map +1 -1
- package/dist/@codegen/kvault/instructions/index.js +13 -1
- package/dist/@codegen/kvault/instructions/index.js.map +1 -1
- package/dist/@codegen/kvault/instructions/initGlobalConfig.d.ts +11 -0
- package/dist/@codegen/kvault/instructions/initGlobalConfig.d.ts.map +1 -0
- package/dist/@codegen/kvault/instructions/initGlobalConfig.js +20 -0
- package/dist/@codegen/kvault/instructions/initGlobalConfig.js.map +1 -0
- package/dist/@codegen/kvault/instructions/invest.d.ts +2 -1
- package/dist/@codegen/kvault/instructions/invest.d.ts.map +1 -1
- package/dist/@codegen/kvault/instructions/invest.js +5 -0
- package/dist/@codegen/kvault/instructions/invest.js.map +1 -1
- package/dist/@codegen/kvault/instructions/sell.d.ts +40 -0
- package/dist/@codegen/kvault/instructions/sell.d.ts.map +1 -0
- package/dist/@codegen/kvault/instructions/sell.js +98 -0
- package/dist/@codegen/kvault/instructions/sell.js.map +1 -0
- package/dist/@codegen/kvault/instructions/updateGlobalConfig.d.ts +13 -0
- package/dist/@codegen/kvault/instructions/updateGlobalConfig.d.ts.map +1 -0
- package/dist/@codegen/kvault/instructions/updateGlobalConfig.js +63 -0
- package/dist/@codegen/kvault/instructions/updateGlobalConfig.js.map +1 -0
- package/dist/@codegen/kvault/instructions/updateGlobalConfigAdmin.d.ts +8 -0
- package/dist/@codegen/kvault/instructions/updateGlobalConfigAdmin.d.ts.map +1 -0
- package/dist/@codegen/kvault/instructions/updateGlobalConfigAdmin.js +21 -0
- package/dist/@codegen/kvault/instructions/updateGlobalConfigAdmin.js.map +1 -0
- package/dist/@codegen/kvault/instructions/updateReserveAllocation.d.ts +2 -1
- package/dist/@codegen/kvault/instructions/updateReserveAllocation.d.ts.map +1 -1
- package/dist/@codegen/kvault/instructions/updateReserveAllocation.js +5 -0
- package/dist/@codegen/kvault/instructions/updateReserveAllocation.js.map +1 -1
- package/dist/@codegen/kvault/instructions/updateVaultConfig.d.ts +2 -1
- package/dist/@codegen/kvault/instructions/updateVaultConfig.d.ts.map +1 -1
- package/dist/@codegen/kvault/instructions/updateVaultConfig.js +2 -5
- package/dist/@codegen/kvault/instructions/updateVaultConfig.js.map +1 -1
- package/dist/@codegen/kvault/instructions/withdraw.d.ts +1 -0
- package/dist/@codegen/kvault/instructions/withdraw.d.ts.map +1 -1
- package/dist/@codegen/kvault/instructions/withdraw.js +1 -0
- package/dist/@codegen/kvault/instructions/withdraw.js.map +1 -1
- package/dist/@codegen/kvault/instructions/withdrawFromAvailable.d.ts +1 -0
- package/dist/@codegen/kvault/instructions/withdrawFromAvailable.d.ts.map +1 -1
- package/dist/@codegen/kvault/instructions/withdrawFromAvailable.js +1 -0
- package/dist/@codegen/kvault/instructions/withdrawFromAvailable.js.map +1 -1
- package/dist/@codegen/kvault/types/ReserveConfig.d.ts +27 -34
- package/dist/@codegen/kvault/types/ReserveConfig.d.ts.map +1 -1
- package/dist/@codegen/kvault/types/ReserveConfig.js +20 -17
- package/dist/@codegen/kvault/types/ReserveConfig.js.map +1 -1
- package/dist/@codegen/kvault/types/ReserveFees.d.ts +8 -8
- package/dist/@codegen/kvault/types/ReserveFees.d.ts.map +1 -1
- package/dist/@codegen/kvault/types/ReserveFees.js +8 -8
- package/dist/@codegen/kvault/types/ReserveFees.js.map +1 -1
- package/dist/@codegen/kvault/types/UpdateGlobalConfigMode.d.ts +68 -0
- package/dist/@codegen/kvault/types/UpdateGlobalConfigMode.d.ts.map +1 -0
- package/dist/@codegen/kvault/types/UpdateGlobalConfigMode.js +162 -0
- package/dist/@codegen/kvault/types/UpdateGlobalConfigMode.js.map +1 -0
- package/dist/@codegen/kvault/types/UpdateReserveWhitelistMode.d.ts +46 -0
- package/dist/@codegen/kvault/types/UpdateReserveWhitelistMode.d.ts.map +1 -0
- package/dist/@codegen/kvault/types/UpdateReserveWhitelistMode.js +124 -0
- package/dist/@codegen/kvault/types/UpdateReserveWhitelistMode.js.map +1 -0
- package/dist/@codegen/kvault/types/VaultConfigField.d.ts +65 -0
- package/dist/@codegen/kvault/types/VaultConfigField.d.ts.map +1 -1
- package/dist/@codegen/kvault/types/VaultConfigField.js +121 -1
- package/dist/@codegen/kvault/types/VaultConfigField.js.map +1 -1
- package/dist/@codegen/kvault/types/index.d.ts +10 -2
- package/dist/@codegen/kvault/types/index.d.ts.map +1 -1
- package/dist/@codegen/kvault/types/index.js +5 -1
- package/dist/@codegen/kvault/types/index.js.map +1 -1
- package/dist/classes/manager.d.ts +17 -1
- package/dist/classes/manager.d.ts.map +1 -1
- package/dist/classes/manager.js +22 -0
- package/dist/classes/manager.js.map +1 -1
- package/dist/classes/reserve.d.ts.map +1 -1
- package/dist/classes/reserve.js +7 -4
- package/dist/classes/reserve.js.map +1 -1
- package/dist/classes/vault.d.ts +29 -5
- package/dist/classes/vault.d.ts.map +1 -1
- package/dist/classes/vault.js +119 -48
- package/dist/classes/vault.js.map +1 -1
- package/dist/idl/klend.json +129 -59
- package/dist/lib.d.ts +1 -0
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +4 -2
- package/dist/lib.js.map +1 -1
- package/dist/manager/client_kamino_manager.js +206 -15
- package/dist/manager/client_kamino_manager.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/managerTypes.d.ts +1 -1
- package/dist/utils/managerTypes.d.ts.map +1 -1
- package/dist/utils/managerTypes.js +5 -3
- package/dist/utils/managerTypes.js.map +1 -1
- package/dist/utils/parse.d.ts +10 -0
- package/dist/utils/parse.d.ts.map +1 -0
- package/dist/utils/parse.js +24 -0
- package/dist/utils/parse.js.map +1 -0
- package/dist/utils/seeds.d.ts +5 -5
- package/dist/utils/seeds.d.ts.map +1 -1
- package/dist/utils/seeds.js +13 -13
- package/dist/utils/seeds.js.map +1 -1
- package/dist/utils/vault.d.ts.map +1 -1
- package/dist/utils/vault.js +6 -0
- package/dist/utils/vault.js.map +1 -1
- package/package.json +1 -1
- package/src/@codegen/klend/accounts/LendingMarket.ts +46 -2
- package/src/@codegen/klend/errors/custom.ts +47 -2
- package/src/@codegen/klend/instructions/index.ts +2 -0
- package/src/@codegen/klend/instructions/initReserve.ts +2 -6
- package/src/@codegen/klend/instructions/liquidateObligationAndRedeemReserveCollateralV2.ts +1 -1
- package/src/@codegen/klend/instructions/seedDepositOnInitReserve.ts +50 -0
- package/src/@codegen/klend/instructions/withdrawObligationCollateral.ts +1 -1
- package/src/@codegen/klend/instructions/withdrawObligationCollateralV2.ts +1 -1
- package/src/@codegen/klend/types/ReserveConfig.ts +72 -30
- package/src/@codegen/klend/types/ReserveFees.ts +12 -12
- package/src/@codegen/klend/types/UpdateConfigMode.ts +103 -13
- package/src/@codegen/klend/types/UpdateLendingMarketMode.ts +60 -0
- package/src/@codegen/klend/types/index.ts +12 -2
- package/src/@codegen/kvault/accounts/GlobalConfig.ts +136 -0
- package/src/@codegen/kvault/accounts/Reserve.ts +1 -1
- package/src/@codegen/kvault/accounts/ReserveWhitelistEntry.ts +157 -0
- package/src/@codegen/kvault/accounts/VaultState.ts +57 -1
- package/src/@codegen/kvault/accounts/index.ts +7 -0
- package/src/@codegen/kvault/errors/custom.ts +109 -8
- package/src/@codegen/kvault/instructions/addUpdateWhitelistedReserve.ts +64 -0
- package/src/@codegen/kvault/instructions/buy.ts +74 -0
- package/src/@codegen/kvault/instructions/index.ts +18 -0
- package/src/@codegen/kvault/instructions/initGlobalConfig.ts +44 -0
- package/src/@codegen/kvault/instructions/invest.ts +4 -0
- package/src/@codegen/kvault/instructions/sell.ts +122 -0
- package/src/@codegen/kvault/instructions/updateGlobalConfig.ts +58 -0
- package/src/@codegen/kvault/instructions/updateGlobalConfigAdmin.ts +42 -0
- package/src/@codegen/kvault/instructions/updateReserveAllocation.ts +4 -0
- package/src/@codegen/kvault/instructions/updateVaultConfig.ts +4 -6
- package/src/@codegen/kvault/instructions/withdraw.ts +2 -0
- package/src/@codegen/kvault/instructions/withdrawFromAvailable.ts +2 -0
- package/src/@codegen/kvault/types/ReserveConfig.ts +34 -37
- package/src/@codegen/kvault/types/ReserveFees.ts +12 -12
- package/src/@codegen/kvault/types/UpdateGlobalConfigMode.ts +160 -0
- package/src/@codegen/kvault/types/UpdateReserveWhitelistMode.ts +117 -0
- package/src/@codegen/kvault/types/VaultConfigField.ts +150 -0
- package/src/@codegen/kvault/types/index.ts +31 -0
- package/src/classes/manager.ts +29 -1
- package/src/classes/reserve.ts +7 -5
- package/src/classes/vault.ts +166 -48
- package/src/idl/klend.json +130 -60
- package/src/idl/kvault.json +582 -23
- package/src/lib.ts +2 -1
- package/src/manager/client_kamino_manager.ts +313 -18
- package/src/utils/index.ts +2 -1
- package/src/utils/managerTypes.ts +6 -4
- package/src/utils/parse.ts +18 -0
- package/src/utils/seeds.ts +13 -17
- package/src/utils/vault.ts +6 -0
package/src/lib.ts
CHANGED
|
@@ -4,7 +4,8 @@ export * from './@codegen/klend/programId';
|
|
|
4
4
|
export * from './@codegen/klend/zero_padding';
|
|
5
5
|
|
|
6
6
|
export * from './@codegen/kvault/instructions';
|
|
7
|
-
// only export vault state, do not export Reserve as it's the same one in main klend /@codegen/klend/accounts
|
|
7
|
+
// only export vault state and global config, do not export Reserve as it's the same one in main klend /@codegen/klend/accounts
|
|
8
|
+
export { GlobalConfig as KVaultGlobalConfig } from './@codegen/kvault/accounts/GlobalConfig';
|
|
8
9
|
export * from './@codegen/kvault/accounts/VaultState';
|
|
9
10
|
export * from './@codegen/kvault/types';
|
|
10
11
|
export { PROGRAM_ID as KVAULTS_PROGRAM_ID } from './@codegen/kvault/programId';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import dotenv from 'dotenv';
|
|
2
2
|
import { Command } from 'commander';
|
|
3
|
-
import { Address, address, Instruction } from '@solana/kit';
|
|
3
|
+
import { Address, address, Instruction, TransactionSigner } from '@solana/kit';
|
|
4
4
|
import {
|
|
5
5
|
AssetReserveConfigCli,
|
|
6
6
|
calculateAPYFromAPR,
|
|
@@ -19,7 +19,10 @@ import {
|
|
|
19
19
|
KaminoVaultConfig,
|
|
20
20
|
lamportsToDecimal,
|
|
21
21
|
LendingMarket,
|
|
22
|
+
parseBooleanFlag,
|
|
23
|
+
parseTokenSymbol,
|
|
22
24
|
parseZeroPaddedUtf8,
|
|
25
|
+
programDataPda,
|
|
23
26
|
Reserve,
|
|
24
27
|
ReserveAllocationConfig,
|
|
25
28
|
ReserveWithAddress,
|
|
@@ -38,7 +41,7 @@ import {
|
|
|
38
41
|
import { Fraction } from '../classes/fraction';
|
|
39
42
|
import Decimal from 'decimal.js';
|
|
40
43
|
import BN from 'bn.js';
|
|
41
|
-
import { PythConfiguration, SwitchboardConfiguration } from '../@codegen/kvault/types';
|
|
44
|
+
import { PythConfiguration, SwitchboardConfiguration, UpdateReserveWhitelistMode } from '../@codegen/kvault/types';
|
|
42
45
|
import * as fs from 'fs';
|
|
43
46
|
import { MarketWithAddress } from '../utils/managerTypes';
|
|
44
47
|
import { ManagementFeeBps, PendingVaultAdmin, PerformanceFeeBps } from '../@codegen/kvault/types/VaultConfigField';
|
|
@@ -72,7 +75,7 @@ async function main() {
|
|
|
72
75
|
throw new Error('If using multisig mode, multisig pubkey is required');
|
|
73
76
|
}
|
|
74
77
|
const ms = multisig ? address(multisig) : undefined;
|
|
75
|
-
const env = await initEnv(
|
|
78
|
+
const env = await initEnv(staging, ms);
|
|
76
79
|
const admin = await env.getSigner();
|
|
77
80
|
|
|
78
81
|
const kaminoManager = new KaminoManager(
|
|
@@ -303,6 +306,59 @@ async function main() {
|
|
|
303
306
|
);
|
|
304
307
|
});
|
|
305
308
|
|
|
309
|
+
commands
|
|
310
|
+
.command('init-kvault-global-config')
|
|
311
|
+
.requiredOption(
|
|
312
|
+
'--mode <string>',
|
|
313
|
+
'simulate|multisig|execute - simulate - to print txn simulation and to get tx simulation link in explorer, execute - execute tx, multisig - to get bs58 tx for multisig usage'
|
|
314
|
+
)
|
|
315
|
+
.option(`--staging`, 'If true, will use the staging programs')
|
|
316
|
+
.option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')
|
|
317
|
+
.option('--signer-path <string>', 'If set, it will use the provided signer')
|
|
318
|
+
.action(async ({ mode, staging, multisig, signerPath }) => {
|
|
319
|
+
if (mode === 'multisig' && !multisig) {
|
|
320
|
+
throw new Error('If using multisig mode, multisig is required');
|
|
321
|
+
}
|
|
322
|
+
const ms = multisig ? address(multisig) : undefined;
|
|
323
|
+
const env = await initEnv(staging, ms, signerPath);
|
|
324
|
+
const kaminoManager = new KaminoManager(
|
|
325
|
+
env.c.rpc,
|
|
326
|
+
DEFAULT_RECENT_SLOT_DURATION_MS,
|
|
327
|
+
env.klendProgramId,
|
|
328
|
+
env.kvaultProgramId
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
let signer: TransactionSigner | undefined = undefined;
|
|
332
|
+
if (signerPath) {
|
|
333
|
+
signer = await parseKeypairFile(signerPath);
|
|
334
|
+
} else {
|
|
335
|
+
const programData = await programDataPda(env.kvaultProgramId);
|
|
336
|
+
const programDataInfo = await env.c.rpc.getAccountInfo(programData).send();
|
|
337
|
+
if (programDataInfo === null) {
|
|
338
|
+
throw new Error('KVault program data not found');
|
|
339
|
+
}
|
|
340
|
+
const programAdmin = programDataInfo.value?.owner.toString();
|
|
341
|
+
if (!programAdmin) {
|
|
342
|
+
throw new Error('Program admin not found');
|
|
343
|
+
}
|
|
344
|
+
signer = noopSigner(address(programAdmin));
|
|
345
|
+
}
|
|
346
|
+
const ix = await kaminoManager.initKvaultGlobalConfigIx(signer);
|
|
347
|
+
await processTx(
|
|
348
|
+
env.c,
|
|
349
|
+
signer,
|
|
350
|
+
[
|
|
351
|
+
ix,
|
|
352
|
+
...getPriorityFeeAndCuIxs({
|
|
353
|
+
priorityFeeMultiplier: 2500,
|
|
354
|
+
}),
|
|
355
|
+
],
|
|
356
|
+
mode,
|
|
357
|
+
[]
|
|
358
|
+
);
|
|
359
|
+
mode === 'execute' && console.log('KVault global config initialized');
|
|
360
|
+
});
|
|
361
|
+
|
|
306
362
|
commands
|
|
307
363
|
.command('create-vault')
|
|
308
364
|
.requiredOption('--mint <string>', 'Vault token mint')
|
|
@@ -508,8 +564,18 @@ async function main() {
|
|
|
508
564
|
`--lutSigner <string>`,
|
|
509
565
|
'If set, it will use the provided signer instead of the default one for the LUT update'
|
|
510
566
|
)
|
|
511
|
-
.
|
|
512
|
-
|
|
567
|
+
.option(
|
|
568
|
+
`--global-admin <string>`,
|
|
569
|
+
'Global admin signer (keypair path in execute/simulate modes, pubkey in multisig mode). Required when setting AllowInvestInWhitelistedReservesOnly or AllowAllocationsInWhitelistedReservesOnly to false'
|
|
570
|
+
)
|
|
571
|
+
.option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')
|
|
572
|
+
.action(async ({ vault, field, value, mode, staging, skipLutUpdate, lutSigner, globalAdmin, multisig }) => {
|
|
573
|
+
if (mode === 'multisig' && !multisig) {
|
|
574
|
+
throw new Error('If using multisig mode, multisig pubkey is required');
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
const ms = multisig ? address(multisig) : undefined;
|
|
578
|
+
const env = await initEnv(staging, ms);
|
|
513
579
|
const vaultAddress = address(vault);
|
|
514
580
|
|
|
515
581
|
const kaminoManager = new KaminoManager(
|
|
@@ -521,7 +587,16 @@ async function main() {
|
|
|
521
587
|
|
|
522
588
|
const kaminoVault = new KaminoVault(env.c.rpc, vaultAddress, undefined, env.kvaultProgramId);
|
|
523
589
|
const vaultState = await kaminoVault.getState();
|
|
524
|
-
|
|
590
|
+
|
|
591
|
+
// Use global admin signer if provided, otherwise fall back to vault admin/noop signer depending on mode
|
|
592
|
+
let signer;
|
|
593
|
+
if (mode === 'multisig' && globalAdmin) {
|
|
594
|
+
signer = noopSigner(address(globalAdmin));
|
|
595
|
+
} else if (globalAdmin) {
|
|
596
|
+
signer = await parseKeypairFile(globalAdmin as string);
|
|
597
|
+
} else {
|
|
598
|
+
signer = await env.getSigner({ vaultState });
|
|
599
|
+
}
|
|
525
600
|
|
|
526
601
|
let lutSignerOrUndefined = undefined;
|
|
527
602
|
if (lutSigner) {
|
|
@@ -555,10 +630,226 @@ async function main() {
|
|
|
555
630
|
mode === 'execute' && console.log('Vault updated');
|
|
556
631
|
});
|
|
557
632
|
|
|
633
|
+
commands
|
|
634
|
+
.command('add-update-whitelisted-reserve')
|
|
635
|
+
.requiredOption('--reserve <string>', 'Reserve address to whitelist')
|
|
636
|
+
.requiredOption('--whitelist-mode <string>', 'Whitelist mode: "Invest" or "AddAllocation"')
|
|
637
|
+
.requiredOption(
|
|
638
|
+
'--value <string>',
|
|
639
|
+
'Value: "1" or "true" to add to whitelist, "0" or "false" to remove from whitelist'
|
|
640
|
+
)
|
|
641
|
+
.requiredOption(
|
|
642
|
+
`--mode <string>`,
|
|
643
|
+
'simulate|multisig|execute - simulate - to print txn simulation and to get tx simulation link in explorer, execute - execute tx, multisig - to get bs58 tx for multisig usage'
|
|
644
|
+
)
|
|
645
|
+
.requiredOption(
|
|
646
|
+
'--global-admin <string>',
|
|
647
|
+
'Global admin signer (keypair path in execute/simulate modes, pubkey in multisig mode)'
|
|
648
|
+
)
|
|
649
|
+
.option(`--staging`, 'If true, will use the staging programs')
|
|
650
|
+
.option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')
|
|
651
|
+
.action(async ({ reserve, whitelistMode, value, mode, globalAdmin, staging, multisig }) => {
|
|
652
|
+
if (mode === 'multisig' && !multisig) {
|
|
653
|
+
throw new Error('If using multisig mode, multisig pubkey is required');
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
const ms = multisig ? address(multisig) : undefined;
|
|
657
|
+
const env = await initEnv(staging, ms);
|
|
658
|
+
const reserveAddress = address(reserve);
|
|
659
|
+
|
|
660
|
+
const kaminoManager = new KaminoManager(
|
|
661
|
+
env.c.rpc,
|
|
662
|
+
DEFAULT_RECENT_SLOT_DURATION_MS,
|
|
663
|
+
env.klendProgramId,
|
|
664
|
+
env.kvaultProgramId
|
|
665
|
+
);
|
|
666
|
+
|
|
667
|
+
// Parse the value (1/true = add, 0/false = remove)
|
|
668
|
+
const flagValue = parseBooleanFlag(value);
|
|
669
|
+
|
|
670
|
+
// Parse the whitelist mode
|
|
671
|
+
let whitelistModeEnum;
|
|
672
|
+
if (whitelistMode === 'Invest') {
|
|
673
|
+
whitelistModeEnum = new UpdateReserveWhitelistMode.Invest([flagValue]);
|
|
674
|
+
} else if (whitelistMode === 'AddAllocation') {
|
|
675
|
+
whitelistModeEnum = new UpdateReserveWhitelistMode.AddAllocation([flagValue]);
|
|
676
|
+
} else {
|
|
677
|
+
throw new Error(`Invalid whitelist mode '${whitelistMode}'. Expected 'Invest' or 'AddAllocation'.`);
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
let globalAdminSigner;
|
|
681
|
+
if (mode === 'multisig') {
|
|
682
|
+
globalAdminSigner = noopSigner(address(globalAdmin));
|
|
683
|
+
} else {
|
|
684
|
+
globalAdminSigner = await parseKeypairFile(globalAdmin as string);
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
const instruction = await kaminoManager.addUpdateWhitelistedReserveIx(
|
|
688
|
+
reserveAddress,
|
|
689
|
+
whitelistModeEnum,
|
|
690
|
+
globalAdminSigner
|
|
691
|
+
);
|
|
692
|
+
|
|
693
|
+
await processTx(
|
|
694
|
+
env.c,
|
|
695
|
+
globalAdminSigner,
|
|
696
|
+
[
|
|
697
|
+
instruction,
|
|
698
|
+
...getPriorityFeeAndCuIxs({
|
|
699
|
+
priorityFeeMultiplier: 2500,
|
|
700
|
+
}),
|
|
701
|
+
],
|
|
702
|
+
mode,
|
|
703
|
+
[]
|
|
704
|
+
);
|
|
705
|
+
|
|
706
|
+
mode === 'execute' &&
|
|
707
|
+
console.log(
|
|
708
|
+
`Reserve ${reserveAddress} whitelisted for ${whitelistMode} with value ${flagValue ? 'ALLOW' : 'DENY'}`
|
|
709
|
+
);
|
|
710
|
+
});
|
|
711
|
+
|
|
712
|
+
commands
|
|
713
|
+
.command('backfill-whitelisted-reserves')
|
|
714
|
+
.option(
|
|
715
|
+
'--value <string>',
|
|
716
|
+
'Value: "1" or "true" to add to whitelist, "0" or "false" to remove from whitelist',
|
|
717
|
+
'1'
|
|
718
|
+
)
|
|
719
|
+
.requiredOption(
|
|
720
|
+
`--mode <string>`,
|
|
721
|
+
'simulate|multisig|execute - simulate - to print txn simulation and to get tx simulation link in explorer, execute - execute tx, multisig - to get bs58 tx for multisig usage'
|
|
722
|
+
)
|
|
723
|
+
.requiredOption(
|
|
724
|
+
'--global-admin <string>',
|
|
725
|
+
'Global admin signer (keypair path in execute/simulate modes, pubkey in multisig mode)'
|
|
726
|
+
)
|
|
727
|
+
.option(
|
|
728
|
+
`--markets <string>`,
|
|
729
|
+
'Comma-separated list of market addresses. If not provided, all markets will be processed'
|
|
730
|
+
)
|
|
731
|
+
.option(`--staging`, 'If true, will use the staging programs')
|
|
732
|
+
.option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')
|
|
733
|
+
.action(async ({ value, mode, globalAdmin, markets, staging, multisig }) => {
|
|
734
|
+
if (mode === 'multisig' && !multisig) {
|
|
735
|
+
throw new Error('If using multisig mode, multisig pubkey is required');
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
const ms = multisig ? address(multisig) : undefined;
|
|
739
|
+
const env = await initEnv(staging, ms);
|
|
740
|
+
|
|
741
|
+
const kaminoManager = new KaminoManager(
|
|
742
|
+
env.c.rpc,
|
|
743
|
+
DEFAULT_RECENT_SLOT_DURATION_MS,
|
|
744
|
+
env.klendProgramId,
|
|
745
|
+
env.kvaultProgramId
|
|
746
|
+
);
|
|
747
|
+
|
|
748
|
+
let globalAdminSigner;
|
|
749
|
+
if (mode === 'multisig') {
|
|
750
|
+
globalAdminSigner = noopSigner(address(globalAdmin));
|
|
751
|
+
} else {
|
|
752
|
+
globalAdminSigner = await parseKeypairFile(globalAdmin as string);
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
// Get markets to process
|
|
756
|
+
let marketsToProcess: KaminoMarket[];
|
|
757
|
+
if (markets) {
|
|
758
|
+
const marketAddresses = markets.split(',').map((m: string) => address(m.trim()));
|
|
759
|
+
console.log(`Processing ${marketAddresses.length} specified markets...`);
|
|
760
|
+
marketsToProcess = await Promise.all(
|
|
761
|
+
marketAddresses.map(async (marketAddress: Address) => {
|
|
762
|
+
const market = await KaminoMarket.load(
|
|
763
|
+
env.c.rpc,
|
|
764
|
+
marketAddress,
|
|
765
|
+
DEFAULT_RECENT_SLOT_DURATION_MS,
|
|
766
|
+
env.klendProgramId
|
|
767
|
+
);
|
|
768
|
+
if (!market) {
|
|
769
|
+
throw new Error(`Market ${marketAddress} not found`);
|
|
770
|
+
}
|
|
771
|
+
return market;
|
|
772
|
+
})
|
|
773
|
+
);
|
|
774
|
+
} else {
|
|
775
|
+
console.log('Fetching all markets...');
|
|
776
|
+
marketsToProcess = await kaminoManager.getAllMarkets(env.klendProgramId);
|
|
777
|
+
console.log(`Found ${marketsToProcess.length} markets`);
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// Collect all reserves from all markets
|
|
781
|
+
const allReserves: Address[] = [];
|
|
782
|
+
for (const market of marketsToProcess) {
|
|
783
|
+
const marketName = parseTokenSymbol(market.state.name);
|
|
784
|
+
const reserveAddresses = Array.from(market.reserves.keys());
|
|
785
|
+
console.log(`Market ${market.getAddress()} (${marketName}): ${reserveAddresses.length} reserves`);
|
|
786
|
+
allReserves.push(...reserveAddresses);
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
console.log(`\nTotal reserves to whitelist: ${allReserves.length}`);
|
|
790
|
+
console.log(`Whitelist modes: Invest AND AddAllocation (both will be set)`);
|
|
791
|
+
|
|
792
|
+
// Parse the value (1/true = add, 0/false = remove)
|
|
793
|
+
const flagValue = parseBooleanFlag(value);
|
|
794
|
+
console.log(`Action: ${flagValue ? 'ADD to whitelist' : 'REMOVE from whitelist'}`);
|
|
795
|
+
|
|
796
|
+
if (mode === 'simulate') {
|
|
797
|
+
console.log('\nSimulation mode - no transactions will be executed');
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
// Create whitelist mode enums for both Invest and AddAllocation
|
|
801
|
+
const investModeEnum = new UpdateReserveWhitelistMode.Invest([flagValue]);
|
|
802
|
+
const addAllocationModeEnum = new UpdateReserveWhitelistMode.AddAllocation([flagValue]);
|
|
803
|
+
|
|
804
|
+
// Process each reserve with both whitelist modes
|
|
805
|
+
let successCount = 0;
|
|
806
|
+
let errorCount = 0;
|
|
807
|
+
|
|
808
|
+
for (const reserveAddress of allReserves) {
|
|
809
|
+
try {
|
|
810
|
+
const investInstruction = await kaminoManager.addUpdateWhitelistedReserveIx(
|
|
811
|
+
reserveAddress,
|
|
812
|
+
investModeEnum,
|
|
813
|
+
globalAdminSigner
|
|
814
|
+
);
|
|
815
|
+
|
|
816
|
+
const addAllocationInstruction = await kaminoManager.addUpdateWhitelistedReserveIx(
|
|
817
|
+
reserveAddress,
|
|
818
|
+
addAllocationModeEnum,
|
|
819
|
+
globalAdminSigner
|
|
820
|
+
);
|
|
821
|
+
|
|
822
|
+
await processTx(
|
|
823
|
+
env.c,
|
|
824
|
+
globalAdminSigner,
|
|
825
|
+
[
|
|
826
|
+
investInstruction,
|
|
827
|
+
addAllocationInstruction,
|
|
828
|
+
...getPriorityFeeAndCuIxs({
|
|
829
|
+
priorityFeeMultiplier: 2500,
|
|
830
|
+
}),
|
|
831
|
+
],
|
|
832
|
+
mode,
|
|
833
|
+
[]
|
|
834
|
+
);
|
|
835
|
+
|
|
836
|
+
successCount++;
|
|
837
|
+
console.log(`✓ [${successCount}/${allReserves.length}] ${reserveAddress} (Invest + AddAllocation)`);
|
|
838
|
+
} catch (error) {
|
|
839
|
+
errorCount++;
|
|
840
|
+
console.error(`✗ Failed to whitelist ${reserveAddress}:`, error);
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
console.log(`\nBackfill complete!`);
|
|
845
|
+
console.log(`Success: ${successCount} reserves (both modes set)`);
|
|
846
|
+
console.log(`Errors: ${errorCount}`);
|
|
847
|
+
});
|
|
848
|
+
|
|
558
849
|
commands
|
|
559
850
|
.command('update-vault-mgmt-fee')
|
|
560
851
|
.requiredOption('--vault <string>', 'Vault address')
|
|
561
|
-
.requiredOption('--fee-bps <string>', '
|
|
852
|
+
.requiredOption('--fee-bps <string>', 'Management fee to set (in basis points)')
|
|
562
853
|
.requiredOption(
|
|
563
854
|
`--mode <string>`,
|
|
564
855
|
'simulate|multisig|execute - simulate - to print txn simulation and to get tx simulation link in explorer, execute - execute tx, multisig - to get bs58 tx for multisig usage'
|
|
@@ -614,7 +905,11 @@ async function main() {
|
|
|
614
905
|
.option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')
|
|
615
906
|
.option(`--signer <string>`, 'If set, it will use the provided signer instead of the default one')
|
|
616
907
|
.action(async ({ lut, addresses, mode, staging, multisig, signer }) => {
|
|
617
|
-
|
|
908
|
+
if (mode === 'multisig' && !multisig) {
|
|
909
|
+
throw new Error('If using multisig mode, multisig is required');
|
|
910
|
+
}
|
|
911
|
+
const ms = multisig ? address(multisig) : undefined;
|
|
912
|
+
const env = await initEnv(staging, ms);
|
|
618
913
|
const lutAddress = address(lut);
|
|
619
914
|
let txSigner = await env.getSigner();
|
|
620
915
|
// if the signer is provided (path to a keypair) we use it, otherwise we use the default one
|
|
@@ -623,10 +918,6 @@ async function main() {
|
|
|
623
918
|
}
|
|
624
919
|
const addressesArr = addresses.split(' ').map((a: string) => address(a));
|
|
625
920
|
|
|
626
|
-
if (mode === 'multisig' && !multisig) {
|
|
627
|
-
throw new Error('If using multisig mode, multisig is required');
|
|
628
|
-
}
|
|
629
|
-
|
|
630
921
|
const kaminoManager = new KaminoManager(
|
|
631
922
|
env.c.rpc,
|
|
632
923
|
DEFAULT_RECENT_SLOT_DURATION_MS,
|
|
@@ -739,7 +1030,7 @@ async function main() {
|
|
|
739
1030
|
commands
|
|
740
1031
|
.command('update-vault-perf-fee')
|
|
741
1032
|
.requiredOption('--vault <string>', 'Vault address')
|
|
742
|
-
.requiredOption('--fee-bps <string>', '
|
|
1033
|
+
.requiredOption('--fee-bps <string>', 'Performance fee to set (in basis points)')
|
|
743
1034
|
.requiredOption(
|
|
744
1035
|
`--mode <string>`,
|
|
745
1036
|
'simulate|multisig|execute - simulate - to print txn simulation and to get tx simulation link in explorer, execute - execute tx, multisig - to get bs58 tx for multisig usage'
|
|
@@ -1139,7 +1430,8 @@ async function main() {
|
|
|
1139
1430
|
if (mode === 'multisig' && !multisig) {
|
|
1140
1431
|
throw new Error('If using multisig mode, multisig is required');
|
|
1141
1432
|
}
|
|
1142
|
-
const
|
|
1433
|
+
const ms = multisig ? address(multisig) : undefined;
|
|
1434
|
+
const env = await initEnv(staging, ms);
|
|
1143
1435
|
const vaultAddress = address(vault);
|
|
1144
1436
|
|
|
1145
1437
|
const kaminoManager = new KaminoManager(
|
|
@@ -1185,7 +1477,8 @@ async function main() {
|
|
|
1185
1477
|
if (mode === 'multisig' && !multisig) {
|
|
1186
1478
|
throw new Error('If using multisig mode, multisig is required');
|
|
1187
1479
|
}
|
|
1188
|
-
const
|
|
1480
|
+
const ms = multisig ? address(multisig) : undefined;
|
|
1481
|
+
const env = await initEnv(staging, ms);
|
|
1189
1482
|
const signer = await env.getSigner();
|
|
1190
1483
|
const vaultAddress = address(vault);
|
|
1191
1484
|
|
|
@@ -2157,7 +2450,7 @@ function parseReserveConfigFromFile(reserveConfigFromFile: any): ReserveConfig {
|
|
|
2157
2450
|
maxLiquidationBonusBps: reserveConfigFromFile.maxLiquidationBonusBps,
|
|
2158
2451
|
badDebtLiquidationBonusBps: reserveConfigFromFile.badDebtLiquidationBonusBps,
|
|
2159
2452
|
fees: {
|
|
2160
|
-
|
|
2453
|
+
originationFeeSf: Fraction.fromDecimal(new Decimal(reserveConfigFromFile.fees.borrowFee)).valueSf,
|
|
2161
2454
|
flashLoanFeeSf: Fraction.fromDecimal(new Decimal(reserveConfigFromFile.fees.flashLoanFee)).valueSf,
|
|
2162
2455
|
padding: Array(8).fill(0),
|
|
2163
2456
|
},
|
|
@@ -2203,7 +2496,9 @@ function parseReserveConfigFromFile(reserveConfigFromFile: any): ReserveConfig {
|
|
|
2203
2496
|
borrowLimitAgainstThisCollateralInElevationGroup: parseReserveBorrowLimitAgainstCollInEmode(reserveConfigFromFile),
|
|
2204
2497
|
deleveragingBonusIncreaseBpsPerDay: new BN(reserveConfigFromFile.deleveragingBonusIncreaseBpsPerDay),
|
|
2205
2498
|
reserved1: Array(1).fill(0),
|
|
2206
|
-
|
|
2499
|
+
minDeleveragingBonusBps: 0,
|
|
2500
|
+
proposerAuthorityLocked: 0,
|
|
2501
|
+
blockCtokenUsage: 0,
|
|
2207
2502
|
};
|
|
2208
2503
|
|
|
2209
2504
|
return new ReserveConfig(reserveConfigFields);
|
|
@@ -2287,7 +2582,7 @@ function parseReserveConfigToFile(reserveConfig: ReserveConfig) {
|
|
|
2287
2582
|
maxLiquidationBonusBps: reserveConfig.maxLiquidationBonusBps,
|
|
2288
2583
|
badDebtLiquidationBonusBps: reserveConfig.badDebtLiquidationBonusBps,
|
|
2289
2584
|
fees: {
|
|
2290
|
-
borrowFee: new Fraction(reserveConfig.fees.
|
|
2585
|
+
borrowFee: new Fraction(reserveConfig.fees.originationFeeSf).toDecimal().toString(),
|
|
2291
2586
|
flashLoanFee: new Fraction(reserveConfig.fees.flashLoanFeeSf).toDecimal().toString(),
|
|
2292
2587
|
padding: Array(8).fill(0),
|
|
2293
2588
|
},
|
package/src/utils/index.ts
CHANGED
|
@@ -243,7 +243,7 @@ export type AssetReserveConfigParams = {
|
|
|
243
243
|
minLiquidationBonusBps: number;
|
|
244
244
|
badDebtLiquidationBonusBps: number;
|
|
245
245
|
liquidationThresholdPct: number;
|
|
246
|
-
|
|
246
|
+
originationFeeSf: Fraction;
|
|
247
247
|
flashLoanFeeSf: Fraction;
|
|
248
248
|
protocolTakeRate: number;
|
|
249
249
|
elevationGroups: number[];
|
|
@@ -260,7 +260,7 @@ export const getDefaultConfigParams = (): AssetReserveConfigParams => {
|
|
|
260
260
|
minLiquidationBonusBps: 200,
|
|
261
261
|
badDebtLiquidationBonusBps: 10,
|
|
262
262
|
liquidationThresholdPct: 75,
|
|
263
|
-
|
|
263
|
+
originationFeeSf: ZERO_FRACTION,
|
|
264
264
|
flashLoanFeeSf: ZERO_FRACTION,
|
|
265
265
|
protocolTakeRate: 0,
|
|
266
266
|
elevationGroups: new Array(20).fill(0),
|
|
@@ -310,7 +310,7 @@ function buildReserveConfig(fields: {
|
|
|
310
310
|
maxLiquidationBonusBps: fields.configParams.maxLiquidationBonusBps,
|
|
311
311
|
badDebtLiquidationBonusBps: fields.configParams.badDebtLiquidationBonusBps,
|
|
312
312
|
fees: {
|
|
313
|
-
|
|
313
|
+
originationFeeSf: fields.configParams.originationFeeSf.getValue(),
|
|
314
314
|
flashLoanFeeSf: fields.configParams.flashLoanFeeSf.getValue(),
|
|
315
315
|
padding: Array(6).fill(0),
|
|
316
316
|
},
|
|
@@ -370,7 +370,9 @@ function buildReserveConfig(fields: {
|
|
|
370
370
|
borrowLimitAgainstThisCollateralInElevationGroup: Array(32).fill(new BN(0)),
|
|
371
371
|
deleveragingBonusIncreaseBpsPerDay: new BN(100),
|
|
372
372
|
reserved1: Array(1).fill(0),
|
|
373
|
-
|
|
373
|
+
minDeleveragingBonusBps: 0,
|
|
374
|
+
proposerAuthorityLocked: 0,
|
|
375
|
+
blockCtokenUsage: 0,
|
|
374
376
|
};
|
|
375
377
|
|
|
376
378
|
return new ReserveConfig(reserveConfigFields);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses a boolean-like string value ("true", "false", "1", "0") into a number (0 or 1).
|
|
3
|
+
* Used for vault configuration flags like whitelist settings.
|
|
4
|
+
*
|
|
5
|
+
* @param value - The string value to parse (case-insensitive)
|
|
6
|
+
* @returns 1 for truthy values ("true" or "1"), 0 for falsy values ("false" or "0")
|
|
7
|
+
* @throws Error if the value is not one of the expected values
|
|
8
|
+
*/
|
|
9
|
+
export function parseBooleanFlag(value: string): number {
|
|
10
|
+
const normalizedValue = value.toLowerCase();
|
|
11
|
+
if (normalizedValue === 'true' || normalizedValue === '1') {
|
|
12
|
+
return 1;
|
|
13
|
+
} else if (normalizedValue === 'false' || normalizedValue === '0') {
|
|
14
|
+
return 0;
|
|
15
|
+
} else {
|
|
16
|
+
throw new Error(`Invalid value '${value}'. Expected 'true', 'false', '1', or '0'.`);
|
|
17
|
+
}
|
|
18
|
+
}
|
package/src/utils/seeds.ts
CHANGED
|
@@ -73,12 +73,12 @@ export interface ReservePdas {
|
|
|
73
73
|
* @param mint
|
|
74
74
|
* @returns ReservePdas
|
|
75
75
|
*/
|
|
76
|
-
export async function reservePdas(programId: Address,
|
|
76
|
+
export async function reservePdas(programId: Address, reserve: Address): Promise<ReservePdas> {
|
|
77
77
|
const [[liquiditySupplyVault], [collateralMint], [collateralSupplyVault], [feeVault]] = await Promise.all([
|
|
78
|
-
reserveLiqSupplyPda(
|
|
79
|
-
reserveCollateralMintPda(
|
|
80
|
-
reserveCollateralSupplyPda(
|
|
81
|
-
reserveFeeVaultPda(
|
|
78
|
+
reserveLiqSupplyPda(reserve, programId),
|
|
79
|
+
reserveCollateralMintPda(reserve, programId),
|
|
80
|
+
reserveCollateralSupplyPda(reserve, programId),
|
|
81
|
+
reserveFeeVaultPda(reserve, programId),
|
|
82
82
|
]);
|
|
83
83
|
return {
|
|
84
84
|
liquiditySupplyVault,
|
|
@@ -112,12 +112,11 @@ export function lendingMarketAuthPda(
|
|
|
112
112
|
* @returns [pda, bump]
|
|
113
113
|
*/
|
|
114
114
|
export async function reserveLiqSupplyPda(
|
|
115
|
-
|
|
116
|
-
mint: Address,
|
|
115
|
+
reserve: Address,
|
|
117
116
|
programId: Address = PROGRAM_ID
|
|
118
117
|
): Promise<ProgramDerivedAddress> {
|
|
119
118
|
return getProgramDerivedAddress({
|
|
120
|
-
seeds: [Buffer.from(RESERVE_LIQ_SUPPLY_SEED), addressEncoder.encode(
|
|
119
|
+
seeds: [Buffer.from(RESERVE_LIQ_SUPPLY_SEED), addressEncoder.encode(reserve)],
|
|
121
120
|
programAddress: programId,
|
|
122
121
|
});
|
|
123
122
|
}
|
|
@@ -130,12 +129,11 @@ export async function reserveLiqSupplyPda(
|
|
|
130
129
|
* @returns [vaultPda, bump]
|
|
131
130
|
*/
|
|
132
131
|
export async function reserveFeeVaultPda(
|
|
133
|
-
|
|
134
|
-
mint: Address,
|
|
132
|
+
reserve: Address,
|
|
135
133
|
programId: Address = PROGRAM_ID
|
|
136
134
|
): Promise<ProgramDerivedAddress> {
|
|
137
135
|
return getProgramDerivedAddress({
|
|
138
|
-
seeds: [Buffer.from(FEE_RECEIVER_SEED), addressEncoder.encode(
|
|
136
|
+
seeds: [Buffer.from(FEE_RECEIVER_SEED), addressEncoder.encode(reserve)],
|
|
139
137
|
programAddress: programId,
|
|
140
138
|
});
|
|
141
139
|
}
|
|
@@ -148,12 +146,11 @@ export async function reserveFeeVaultPda(
|
|
|
148
146
|
* @returns [mintPda, bump]
|
|
149
147
|
*/
|
|
150
148
|
export async function reserveCollateralMintPda(
|
|
151
|
-
|
|
152
|
-
mint: Address,
|
|
149
|
+
reserve: Address,
|
|
153
150
|
programId: Address = PROGRAM_ID
|
|
154
151
|
): Promise<ProgramDerivedAddress> {
|
|
155
152
|
return getProgramDerivedAddress({
|
|
156
|
-
seeds: [Buffer.from(RESERVE_COLL_MINT_SEED), addressEncoder.encode(
|
|
153
|
+
seeds: [Buffer.from(RESERVE_COLL_MINT_SEED), addressEncoder.encode(reserve)],
|
|
157
154
|
programAddress: programId,
|
|
158
155
|
});
|
|
159
156
|
}
|
|
@@ -166,12 +163,11 @@ export async function reserveCollateralMintPda(
|
|
|
166
163
|
* @returns [pda, bump]
|
|
167
164
|
*/
|
|
168
165
|
export function reserveCollateralSupplyPda(
|
|
169
|
-
|
|
170
|
-
mint: Address,
|
|
166
|
+
reserve: Address,
|
|
171
167
|
programId: Address = PROGRAM_ID
|
|
172
168
|
): Promise<ProgramDerivedAddress> {
|
|
173
169
|
return getProgramDerivedAddress({
|
|
174
|
-
seeds: [Buffer.from(RESERVE_COLL_SUPPLY_SEED), addressEncoder.encode(
|
|
170
|
+
seeds: [Buffer.from(RESERVE_COLL_SUPPLY_SEED), addressEncoder.encode(reserve)],
|
|
175
171
|
programAddress: programId,
|
|
176
172
|
});
|
|
177
173
|
}
|
package/src/utils/vault.ts
CHANGED
|
@@ -46,6 +46,12 @@ export function decodeVaultState(data: Buffer): VaultState {
|
|
|
46
46
|
vaultFarm: dec.vaultFarm,
|
|
47
47
|
creationTimestamp: dec.creationTimestamp,
|
|
48
48
|
allocationAdmin: dec.allocationAdmin,
|
|
49
|
+
withdrawalPenaltyLamports: dec.withdrawalPenaltyLamports,
|
|
50
|
+
withdrawalPenaltyBps: dec.withdrawalPenaltyBps,
|
|
49
51
|
padding3: dec.padding3,
|
|
52
|
+
firstLossCapitalFarm: dec.firstLossCapitalFarm,
|
|
53
|
+
allowAllocationsInWhitelistedReservesOnly: dec.allowAllocationsInWhitelistedReservesOnly,
|
|
54
|
+
allowInvestInWhitelistedReservesOnly: dec.allowInvestInWhitelistedReservesOnly,
|
|
55
|
+
padding4: dec.padding4,
|
|
50
56
|
});
|
|
51
57
|
}
|