@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/classes/vault.ts
CHANGED
|
@@ -23,6 +23,9 @@ import {
|
|
|
23
23
|
AccountInfoWithPubkey,
|
|
24
24
|
AccountInfoBase,
|
|
25
25
|
AccountInfoWithJsonData,
|
|
26
|
+
Option,
|
|
27
|
+
some,
|
|
28
|
+
none,
|
|
26
29
|
} from '@solana/kit';
|
|
27
30
|
import {
|
|
28
31
|
AllOracleAccounts,
|
|
@@ -40,12 +43,16 @@ import {
|
|
|
40
43
|
WRAPPED_SOL_MINT,
|
|
41
44
|
} from '../lib';
|
|
42
45
|
import {
|
|
46
|
+
addUpdateWhitelistedReserve,
|
|
47
|
+
AddUpdateWhitelistedReserveAccounts,
|
|
48
|
+
AddUpdateWhitelistedReserveArgs,
|
|
43
49
|
deposit,
|
|
44
50
|
DepositAccounts,
|
|
45
51
|
DepositArgs,
|
|
46
52
|
giveUpPendingFees,
|
|
47
53
|
GiveUpPendingFeesAccounts,
|
|
48
54
|
GiveUpPendingFeesArgs,
|
|
55
|
+
initKVaultGlobalConfig,
|
|
49
56
|
initVault,
|
|
50
57
|
InitVaultAccounts,
|
|
51
58
|
invest,
|
|
@@ -69,7 +76,7 @@ import {
|
|
|
69
76
|
withdrawPendingFees,
|
|
70
77
|
WithdrawPendingFeesAccounts,
|
|
71
78
|
} from '../@codegen/kvault/instructions';
|
|
72
|
-
import { VaultConfigField, VaultConfigFieldKind } from '../@codegen/kvault/types';
|
|
79
|
+
import { UpdateReserveWhitelistModeKind, VaultConfigField, VaultConfigFieldKind } from '../@codegen/kvault/types';
|
|
73
80
|
import { VaultState } from '../@codegen/kvault/accounts';
|
|
74
81
|
import Decimal from 'decimal.js';
|
|
75
82
|
import { bpsToPct, decodeVaultName, numberToLamportsDecimal, parseTokenSymbol, pubkeyHashMapToJson } from './utils';
|
|
@@ -85,6 +92,8 @@ import {
|
|
|
85
92
|
getTokenAccountAmount,
|
|
86
93
|
getTokenAccountMint,
|
|
87
94
|
lendingMarketAuthPda,
|
|
95
|
+
parseBooleanFlag,
|
|
96
|
+
programDataPda,
|
|
88
97
|
SECONDS_PER_YEAR,
|
|
89
98
|
U64_MAX,
|
|
90
99
|
VAULT_INITIAL_DEPOSIT,
|
|
@@ -140,6 +149,8 @@ const BASE_VAULT_AUTHORITY_SEED = 'authority';
|
|
|
140
149
|
const SHARES_SEED = 'shares';
|
|
141
150
|
const EVENT_AUTHORITY_SEED = '__event_authority';
|
|
142
151
|
export const METADATA_SEED = 'metadata';
|
|
152
|
+
const GLOBAL_CONFIG_STATE_SEED = 'global_config';
|
|
153
|
+
const WHITELISTED_RESERVES_SEED = 'whitelisted_reserves';
|
|
143
154
|
|
|
144
155
|
export const METADATA_PROGRAM_ID: Address = address('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s');
|
|
145
156
|
|
|
@@ -215,6 +226,29 @@ export class KaminoVaultClient {
|
|
|
215
226
|
console.log('Tokens per share: ', tokensPerShare);
|
|
216
227
|
}
|
|
217
228
|
|
|
229
|
+
/**
|
|
230
|
+
* This method initializes the kvault global config (one off, needs to be signed by program owner)
|
|
231
|
+
* @param admin - the admin of the kvault program
|
|
232
|
+
* @returns - an instruction to initialize the kvault global config
|
|
233
|
+
*/
|
|
234
|
+
async initKvaultGlobalConfigIx(admin: TransactionSigner) {
|
|
235
|
+
const globalConfigAddress = await getKvaultGlobalConfigPda(this.getProgramID());
|
|
236
|
+
|
|
237
|
+
const programData = await programDataPda(this.getProgramID());
|
|
238
|
+
const ix = initKVaultGlobalConfig(
|
|
239
|
+
{
|
|
240
|
+
payer: admin,
|
|
241
|
+
globalConfig: globalConfigAddress,
|
|
242
|
+
programData: programData,
|
|
243
|
+
systemProgram: SYSTEM_PROGRAM_ADDRESS,
|
|
244
|
+
rent: SYSVAR_RENT_ADDRESS,
|
|
245
|
+
},
|
|
246
|
+
undefined,
|
|
247
|
+
this.getProgramID()
|
|
248
|
+
);
|
|
249
|
+
return ix;
|
|
250
|
+
}
|
|
251
|
+
|
|
218
252
|
/**
|
|
219
253
|
* This method will create a vault with a given config. The config can be changed later on, but it is recommended to set it up correctly from the start
|
|
220
254
|
* @param vaultConfig - the config object used to create a vault
|
|
@@ -316,7 +350,7 @@ export class KaminoVaultClient {
|
|
|
316
350
|
[]
|
|
317
351
|
);
|
|
318
352
|
|
|
319
|
-
const setLUTIx = this.updateUninitialisedVaultConfigIx(
|
|
353
|
+
const setLUTIx = await this.updateUninitialisedVaultConfigIx(
|
|
320
354
|
vaultConfig.admin,
|
|
321
355
|
vaultState.address,
|
|
322
356
|
new VaultConfigField.LookupTable(),
|
|
@@ -326,7 +360,7 @@ export class KaminoVaultClient {
|
|
|
326
360
|
const ixs = [createVaultIx, initVaultIx, setLUTIx];
|
|
327
361
|
|
|
328
362
|
if (vaultConfig.getPerformanceFeeBps() > 0) {
|
|
329
|
-
const setPerformanceFeeIx = this.updateUninitialisedVaultConfigIx(
|
|
363
|
+
const setPerformanceFeeIx = await this.updateUninitialisedVaultConfigIx(
|
|
330
364
|
vaultConfig.admin,
|
|
331
365
|
vaultState.address,
|
|
332
366
|
new VaultConfigField.PerformanceFeeBps(),
|
|
@@ -335,7 +369,7 @@ export class KaminoVaultClient {
|
|
|
335
369
|
ixs.push(setPerformanceFeeIx);
|
|
336
370
|
}
|
|
337
371
|
if (vaultConfig.getManagementFeeBps() > 0) {
|
|
338
|
-
const setManagementFeeIx = this.updateUninitialisedVaultConfigIx(
|
|
372
|
+
const setManagementFeeIx = await this.updateUninitialisedVaultConfigIx(
|
|
339
373
|
vaultConfig.admin,
|
|
340
374
|
vaultState.address,
|
|
341
375
|
new VaultConfigField.ManagementFeeBps(),
|
|
@@ -344,7 +378,7 @@ export class KaminoVaultClient {
|
|
|
344
378
|
ixs.push(setManagementFeeIx);
|
|
345
379
|
}
|
|
346
380
|
if (vaultConfig.name && vaultConfig.name.length > 0) {
|
|
347
|
-
const setNameIx = this.updateUninitialisedVaultConfigIx(
|
|
381
|
+
const setNameIx = await this.updateUninitialisedVaultConfigIx(
|
|
348
382
|
vaultConfig.admin,
|
|
349
383
|
vaultState.address,
|
|
350
384
|
new VaultConfigField.Name(),
|
|
@@ -352,7 +386,7 @@ export class KaminoVaultClient {
|
|
|
352
386
|
);
|
|
353
387
|
ixs.push(setNameIx);
|
|
354
388
|
}
|
|
355
|
-
const setFarmIx = this.updateUninitialisedVaultConfigIx(
|
|
389
|
+
const setFarmIx = await this.updateUninitialisedVaultConfigIx(
|
|
356
390
|
vaultConfig.admin,
|
|
357
391
|
vaultState.address,
|
|
358
392
|
new VaultConfigField.Farm(),
|
|
@@ -482,6 +516,12 @@ export class KaminoVaultClient {
|
|
|
482
516
|
this._kaminoVaultProgramId
|
|
483
517
|
);
|
|
484
518
|
|
|
519
|
+
const reserveWhitelistEntryOption = await getReserveWhitelistEntryIfExists(
|
|
520
|
+
reserveAllocationConfig.getReserveAddress(),
|
|
521
|
+
this.getConnection(),
|
|
522
|
+
this._kaminoVaultProgramId
|
|
523
|
+
);
|
|
524
|
+
|
|
485
525
|
const vaultAdmin = parseVaultAdmin(vaultState, vaultAdminAuthority);
|
|
486
526
|
const updateReserveAllocationAccounts: UpdateReserveAllocationAccounts = {
|
|
487
527
|
signer: vaultAdmin,
|
|
@@ -490,6 +530,7 @@ export class KaminoVaultClient {
|
|
|
490
530
|
reserveCollateralMint: reserveState.collateral.mintPubkey,
|
|
491
531
|
reserve: reserveAllocationConfig.getReserveAddress(),
|
|
492
532
|
ctokenVault: cTokenVault,
|
|
533
|
+
reserveWhitelistEntry: reserveWhitelistEntryOption,
|
|
493
534
|
systemProgram: SYSTEM_PROGRAM_ADDRESS,
|
|
494
535
|
rent: SYSVAR_RENT_ADDRESS,
|
|
495
536
|
reserveCollateralTokenProgram: TOKEN_PROGRAM_ADDRESS,
|
|
@@ -756,7 +797,8 @@ export class KaminoVaultClient {
|
|
|
756
797
|
* @param vault the vault to update
|
|
757
798
|
* @param mode the field to update (based on VaultConfigFieldKind enum)
|
|
758
799
|
* @param value the value to update the field with
|
|
759
|
-
* @param [
|
|
800
|
+
* @param [adminAuthority] the signer of the transaction. Optional. If not provided the admin of the vault will be used. It should be used when changing the admin of the vault if we want to build or batch multiple ixs in the same tx.
|
|
801
|
+
* The global admin should be passed in when wanting to change the AllowAllocationsInWhitelistedReservesOnly or AllowInvestInWhitelistedReservesOnly fields to false
|
|
760
802
|
* @param [lutIxsSigner] the signer of the transaction to be used for the lookup table instructions. Optional. If not provided the admin of the vault will be used. It should be used when changing the admin of the vault if we want to build or batch multiple ixs in the same tx
|
|
761
803
|
* @param [skipLutUpdate] if true, the lookup table instructions will not be included in the returned instructions
|
|
762
804
|
* @returns a struct that contains the instruction to update the field and an optional list of instructions to update the lookup table
|
|
@@ -765,41 +807,26 @@ export class KaminoVaultClient {
|
|
|
765
807
|
vault: KaminoVault,
|
|
766
808
|
mode: VaultConfigFieldKind,
|
|
767
809
|
value: string,
|
|
768
|
-
|
|
810
|
+
adminAuthority?: TransactionSigner,
|
|
769
811
|
lutIxsSigner?: TransactionSigner,
|
|
770
812
|
skipLutUpdate: boolean = false
|
|
771
813
|
): Promise<UpdateVaultConfigIxs> {
|
|
772
814
|
const vaultState: VaultState = await vault.getState();
|
|
773
|
-
const admin = parseVaultAdmin(vaultState,
|
|
815
|
+
const admin = parseVaultAdmin(vaultState, adminAuthority);
|
|
774
816
|
|
|
817
|
+
const globalConfig = await getKvaultGlobalConfigPda(this._kaminoVaultProgramId);
|
|
775
818
|
const updateVaultConfigAccs: UpdateVaultConfigAccounts = {
|
|
776
|
-
|
|
819
|
+
signer: admin,
|
|
820
|
+
globalConfig: globalConfig,
|
|
777
821
|
vaultState: vault.address,
|
|
778
822
|
klendProgram: this._kaminoLendProgramId,
|
|
779
823
|
};
|
|
780
|
-
if (vaultAdminAuthority) {
|
|
781
|
-
updateVaultConfigAccs.vaultAdminAuthority = vaultAdminAuthority;
|
|
782
|
-
}
|
|
783
824
|
|
|
784
825
|
const updateVaultConfigArgs: UpdateVaultConfigArgs = {
|
|
785
826
|
entry: mode,
|
|
786
|
-
data:
|
|
827
|
+
data: this.getValueForModeAsBuffer(mode, value),
|
|
787
828
|
};
|
|
788
829
|
|
|
789
|
-
if (isNaN(+value) || value === DEFAULT_PUBLIC_KEY) {
|
|
790
|
-
if (mode.kind === new VaultConfigField.Name().kind) {
|
|
791
|
-
const data = Array.from(this.encodeVaultName(value));
|
|
792
|
-
updateVaultConfigArgs.data = Buffer.from(data);
|
|
793
|
-
} else {
|
|
794
|
-
const data = address(value);
|
|
795
|
-
updateVaultConfigArgs.data = Buffer.from(addressEncoder.encode(data));
|
|
796
|
-
}
|
|
797
|
-
} else {
|
|
798
|
-
const buffer = Buffer.alloc(8);
|
|
799
|
-
buffer.writeBigUInt64LE(BigInt(value.toString()));
|
|
800
|
-
updateVaultConfigArgs.data = buffer;
|
|
801
|
-
}
|
|
802
|
-
|
|
803
830
|
const vaultReserves = this.getVaultReserves(vaultState);
|
|
804
831
|
const vaultReservesState = await this.loadVaultReserves(vaultState);
|
|
805
832
|
|
|
@@ -863,6 +890,38 @@ export class KaminoVaultClient {
|
|
|
863
890
|
return updateVaultConfigIxs;
|
|
864
891
|
}
|
|
865
892
|
|
|
893
|
+
/**
|
|
894
|
+
* Add or update a reserve whitelist entry. This controls whether the reserve is whitelisted for adding/updating
|
|
895
|
+
* allocations or for invest, depending on the mode parameter.
|
|
896
|
+
*
|
|
897
|
+
* @param reserve - Address of the reserve to whitelist
|
|
898
|
+
* @param mode - The whitelist mode: either 'Invest' or 'AddAllocation' with a value (1 = allow, 0 = deny)
|
|
899
|
+
* @param globalAdmin - The global admin that signs the transaction
|
|
900
|
+
* @returns - An instruction to add/update the whitelisted reserve
|
|
901
|
+
*/
|
|
902
|
+
async addUpdateWhitelistedReserveIx(
|
|
903
|
+
reserve: Address,
|
|
904
|
+
mode: UpdateReserveWhitelistModeKind,
|
|
905
|
+
globalAdmin: TransactionSigner
|
|
906
|
+
): Promise<Instruction> {
|
|
907
|
+
const globalConfig = await getKvaultGlobalConfigPda(this._kaminoVaultProgramId);
|
|
908
|
+
const reserveWhitelistEntry = await getReserveWhitelistEntryPda(reserve, this._kaminoVaultProgramId);
|
|
909
|
+
|
|
910
|
+
const accounts: AddUpdateWhitelistedReserveAccounts = {
|
|
911
|
+
globalAdmin,
|
|
912
|
+
globalConfig,
|
|
913
|
+
reserve,
|
|
914
|
+
reserveWhitelistEntry,
|
|
915
|
+
systemProgram: SYSTEM_PROGRAM_ADDRESS,
|
|
916
|
+
};
|
|
917
|
+
|
|
918
|
+
const args: AddUpdateWhitelistedReserveArgs = {
|
|
919
|
+
update: mode,
|
|
920
|
+
};
|
|
921
|
+
|
|
922
|
+
return addUpdateWhitelistedReserve(args, accounts, undefined, this._kaminoVaultProgramId);
|
|
923
|
+
}
|
|
924
|
+
|
|
866
925
|
/** Sets the farm where the shares can be staked. This is store in vault state and a vault can only have one farm, so the new farm will ovveride the old farm
|
|
867
926
|
* @param vault - vault to set the farm for
|
|
868
927
|
* @param farm - the farm where the vault shares can be staked
|
|
@@ -895,44 +954,35 @@ export class KaminoVaultClient {
|
|
|
895
954
|
}
|
|
896
955
|
|
|
897
956
|
/**
|
|
898
|
-
* This method updates the vault config
|
|
899
|
-
*
|
|
957
|
+
* This method updates the vault config during vault initialization, within the same transaction
|
|
958
|
+
* where the vault is created. Use this when the vault state is not yet committed to the chain
|
|
959
|
+
* and cannot be fetched via RPC. For updates to existing vaults, use updateVaultConfigIxs instead.
|
|
960
|
+
*
|
|
961
|
+
* @param admin - the admin that signs the transaction
|
|
900
962
|
* @param vault - address of vault to be updated
|
|
901
963
|
* @param mode - the field to be updated
|
|
902
964
|
* @param value - the new value for the field to be updated (number or pubkey)
|
|
903
965
|
* @returns - an instruction to update the vault config
|
|
904
966
|
*/
|
|
905
|
-
private updateUninitialisedVaultConfigIx(
|
|
967
|
+
private async updateUninitialisedVaultConfigIx(
|
|
906
968
|
admin: TransactionSigner,
|
|
907
969
|
vault: Address,
|
|
908
970
|
mode: VaultConfigFieldKind,
|
|
909
971
|
value: string
|
|
910
|
-
): Instruction {
|
|
972
|
+
): Promise<Instruction> {
|
|
973
|
+
const globalConfig = await getKvaultGlobalConfigPda(this._kaminoVaultProgramId);
|
|
911
974
|
const updateVaultConfigAccs: UpdateVaultConfigAccounts = {
|
|
912
|
-
|
|
975
|
+
signer: admin,
|
|
976
|
+
globalConfig: globalConfig,
|
|
913
977
|
vaultState: vault,
|
|
914
978
|
klendProgram: this._kaminoLendProgramId,
|
|
915
979
|
};
|
|
916
980
|
|
|
917
981
|
const updateVaultConfigArgs: UpdateVaultConfigArgs = {
|
|
918
982
|
entry: mode,
|
|
919
|
-
data:
|
|
983
|
+
data: this.getValueForModeAsBuffer(mode, value),
|
|
920
984
|
};
|
|
921
985
|
|
|
922
|
-
if (isNaN(+value)) {
|
|
923
|
-
if (mode.kind === new VaultConfigField.Name().kind) {
|
|
924
|
-
const data = Array.from(this.encodeVaultName(value));
|
|
925
|
-
updateVaultConfigArgs.data = Buffer.from(data);
|
|
926
|
-
} else {
|
|
927
|
-
const data = address(value);
|
|
928
|
-
updateVaultConfigArgs.data = Buffer.from(addressEncoder.encode(data));
|
|
929
|
-
}
|
|
930
|
-
} else {
|
|
931
|
-
const buffer = Buffer.alloc(8);
|
|
932
|
-
buffer.writeBigUInt64LE(BigInt(value.toString()));
|
|
933
|
-
updateVaultConfigArgs.data = buffer;
|
|
934
|
-
}
|
|
935
|
-
|
|
936
986
|
const updateVaultConfigIx = updateVaultConfig(
|
|
937
987
|
updateVaultConfigArgs,
|
|
938
988
|
updateVaultConfigAccs,
|
|
@@ -1666,6 +1716,12 @@ export class KaminoVaultClient {
|
|
|
1666
1716
|
ixs.push(createAtaIx);
|
|
1667
1717
|
}
|
|
1668
1718
|
|
|
1719
|
+
const reserveWhitelistEntryOption = await getReserveWhitelistEntryIfExists(
|
|
1720
|
+
reserve.address,
|
|
1721
|
+
this.getConnection(),
|
|
1722
|
+
this._kaminoVaultProgramId
|
|
1723
|
+
);
|
|
1724
|
+
|
|
1669
1725
|
const investAccounts: InvestAccounts = {
|
|
1670
1726
|
payer,
|
|
1671
1727
|
vaultState: vault.address,
|
|
@@ -1678,6 +1734,7 @@ export class KaminoVaultClient {
|
|
|
1678
1734
|
lendingMarketAuthority: lendingMarketAuth,
|
|
1679
1735
|
reserveLiquiditySupply: reserve.state.liquidity.supplyVault,
|
|
1680
1736
|
reserveCollateralMint: reserve.state.collateral.mintPubkey,
|
|
1737
|
+
reserveWhitelistEntry: reserveWhitelistEntryOption,
|
|
1681
1738
|
klendProgram: this._kaminoLendProgramId,
|
|
1682
1739
|
instructionSysvarAccount: SYSVAR_INSTRUCTIONS_ADDRESS,
|
|
1683
1740
|
tokenProgram: tokenProgram,
|
|
@@ -1707,6 +1764,30 @@ export class KaminoVaultClient {
|
|
|
1707
1764
|
return decodeVaultName(token);
|
|
1708
1765
|
}
|
|
1709
1766
|
|
|
1767
|
+
/** Helper to serialize value as Buffer for updateVaultConfig instruction */
|
|
1768
|
+
private getValueForModeAsBuffer(mode: VaultConfigFieldKind, value: string): Buffer {
|
|
1769
|
+
const isWhitelistOnlyFlag =
|
|
1770
|
+
mode.kind === new VaultConfigField.AllowInvestInWhitelistedReservesOnly().kind ||
|
|
1771
|
+
mode.kind === new VaultConfigField.AllowAllocationsInWhitelistedReservesOnly().kind;
|
|
1772
|
+
|
|
1773
|
+
if (isWhitelistOnlyFlag) {
|
|
1774
|
+
const flag = parseBooleanFlag(value);
|
|
1775
|
+
return Buffer.from([flag]);
|
|
1776
|
+
} else if (isNaN(+value)) {
|
|
1777
|
+
if (mode.kind === new VaultConfigField.Name().kind) {
|
|
1778
|
+
const data = Array.from(this.encodeVaultName(value));
|
|
1779
|
+
return Buffer.from(data);
|
|
1780
|
+
} else {
|
|
1781
|
+
const data = address(value);
|
|
1782
|
+
return Buffer.from(addressEncoder.encode(data));
|
|
1783
|
+
}
|
|
1784
|
+
} else {
|
|
1785
|
+
const buffer = Buffer.alloc(8);
|
|
1786
|
+
buffer.writeBigUInt64LE(BigInt(value.toString()));
|
|
1787
|
+
return buffer;
|
|
1788
|
+
}
|
|
1789
|
+
}
|
|
1790
|
+
|
|
1710
1791
|
private async withdrawIx(
|
|
1711
1792
|
user: TransactionSigner,
|
|
1712
1793
|
vault: KaminoVault,
|
|
@@ -1720,11 +1801,13 @@ export class KaminoVaultClient {
|
|
|
1720
1801
|
): Promise<Instruction> {
|
|
1721
1802
|
const [lendingMarketAuth] = await lendingMarketAuthPda(marketAddress, this._kaminoLendProgramId);
|
|
1722
1803
|
|
|
1804
|
+
const globalConfig = await getKvaultGlobalConfigPda(this._kaminoVaultProgramId);
|
|
1723
1805
|
const eventAuthority = await getEventAuthorityPda(this._kaminoVaultProgramId);
|
|
1724
1806
|
const withdrawAccounts: WithdrawAccounts = {
|
|
1725
1807
|
withdrawFromAvailable: {
|
|
1726
1808
|
user,
|
|
1727
1809
|
vaultState: vault.address,
|
|
1810
|
+
globalConfig: globalConfig,
|
|
1728
1811
|
tokenVault: vaultState.tokenVault,
|
|
1729
1812
|
baseVaultAuthority: vaultState.baseVaultAuthority,
|
|
1730
1813
|
userTokenAta: userTokenAta,
|
|
@@ -1772,10 +1855,12 @@ export class KaminoVaultClient {
|
|
|
1772
1855
|
userTokenAta: Address,
|
|
1773
1856
|
shareAmountLamports: Decimal
|
|
1774
1857
|
): Promise<Instruction> {
|
|
1858
|
+
const globalConfig = await getKvaultGlobalConfigPda(this._kaminoVaultProgramId);
|
|
1775
1859
|
const eventAuthority = await getEventAuthorityPda(this._kaminoVaultProgramId);
|
|
1776
1860
|
const withdrawFromAvailableAccounts: WithdrawFromAvailableAccounts = {
|
|
1777
1861
|
user,
|
|
1778
1862
|
vaultState: vault.address,
|
|
1863
|
+
globalConfig: globalConfig,
|
|
1779
1864
|
tokenVault: vaultState.tokenVault,
|
|
1780
1865
|
baseVaultAuthority: vaultState.baseVaultAuthority,
|
|
1781
1866
|
userTokenAta,
|
|
@@ -4162,6 +4247,39 @@ export async function getEventAuthorityPda(kaminoVaultProgramId: Address): Promi
|
|
|
4162
4247
|
)[0];
|
|
4163
4248
|
}
|
|
4164
4249
|
|
|
4250
|
+
export async function getKvaultGlobalConfigPda(kaminoVaultProgramId: Address): Promise<Address> {
|
|
4251
|
+
return (
|
|
4252
|
+
await getProgramDerivedAddress({
|
|
4253
|
+
seeds: [Buffer.from(GLOBAL_CONFIG_STATE_SEED)],
|
|
4254
|
+
programAddress: kaminoVaultProgramId,
|
|
4255
|
+
})
|
|
4256
|
+
)[0];
|
|
4257
|
+
}
|
|
4258
|
+
|
|
4259
|
+
export async function getReserveWhitelistEntryPda(
|
|
4260
|
+
reserveAddress: Address,
|
|
4261
|
+
kaminoVaultProgramId: Address
|
|
4262
|
+
): Promise<Address> {
|
|
4263
|
+
return (
|
|
4264
|
+
await getProgramDerivedAddress({
|
|
4265
|
+
seeds: [Buffer.from(WHITELISTED_RESERVES_SEED), addressEncoder.encode(reserveAddress)],
|
|
4266
|
+
programAddress: kaminoVaultProgramId,
|
|
4267
|
+
})
|
|
4268
|
+
)[0];
|
|
4269
|
+
}
|
|
4270
|
+
|
|
4271
|
+
async function getReserveWhitelistEntryIfExists(
|
|
4272
|
+
reserveAddress: Address,
|
|
4273
|
+
rpc: Rpc<SolanaRpcApi>,
|
|
4274
|
+
kaminoVaultProgramId: Address
|
|
4275
|
+
): Promise<Option<Address>> {
|
|
4276
|
+
const reserveWhitelistEntry = await getReserveWhitelistEntryPda(reserveAddress, kaminoVaultProgramId);
|
|
4277
|
+
const reserveWhitelistEntryAccount = await fetchEncodedAccount(rpc, reserveWhitelistEntry, {
|
|
4278
|
+
commitment: 'processed',
|
|
4279
|
+
});
|
|
4280
|
+
return reserveWhitelistEntryAccount.exists ? some(reserveWhitelistEntry) : none<Address>();
|
|
4281
|
+
}
|
|
4282
|
+
|
|
4165
4283
|
function parseVaultAdmin(vault: VaultState, signer?: TransactionSigner) {
|
|
4166
4284
|
return signer ?? noopSigner(vault.vaultAdminAuthority);
|
|
4167
4285
|
}
|