@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.
Files changed (223) hide show
  1. package/README.md +1 -0
  2. package/dist/@codegen/klend/accounts/LendingMarket.d.ts +33 -0
  3. package/dist/@codegen/klend/accounts/LendingMarket.d.ts.map +1 -1
  4. package/dist/@codegen/klend/accounts/LendingMarket.js +24 -2
  5. package/dist/@codegen/klend/accounts/LendingMarket.js.map +1 -1
  6. package/dist/@codegen/klend/errors/custom.d.ts +26 -2
  7. package/dist/@codegen/klend/errors/custom.d.ts.map +1 -1
  8. package/dist/@codegen/klend/errors/custom.js +45 -3
  9. package/dist/@codegen/klend/errors/custom.js.map +1 -1
  10. package/dist/@codegen/klend/instructions/index.d.ts +2 -0
  11. package/dist/@codegen/klend/instructions/index.d.ts.map +1 -1
  12. package/dist/@codegen/klend/instructions/index.js +3 -1
  13. package/dist/@codegen/klend/instructions/index.js.map +1 -1
  14. package/dist/@codegen/klend/instructions/initReserve.d.ts +1 -1
  15. package/dist/@codegen/klend/instructions/initReserve.d.ts.map +1 -1
  16. package/dist/@codegen/klend/instructions/initReserve.js +1 -5
  17. package/dist/@codegen/klend/instructions/initReserve.js.map +1 -1
  18. package/dist/@codegen/klend/instructions/liquidateObligationAndRedeemReserveCollateralV2.js +1 -1
  19. package/dist/@codegen/klend/instructions/seedDepositOnInitReserve.d.ts +13 -0
  20. package/dist/@codegen/klend/instructions/seedDepositOnInitReserve.d.ts.map +1 -0
  21. package/dist/@codegen/klend/instructions/seedDepositOnInitReserve.js +24 -0
  22. package/dist/@codegen/klend/instructions/seedDepositOnInitReserve.js.map +1 -0
  23. package/dist/@codegen/klend/instructions/withdrawObligationCollateral.js +1 -1
  24. package/dist/@codegen/klend/instructions/withdrawObligationCollateralV2.js +1 -1
  25. package/dist/@codegen/klend/types/ReserveConfig.d.ts +58 -24
  26. package/dist/@codegen/klend/types/ReserveConfig.d.ts.map +1 -1
  27. package/dist/@codegen/klend/types/ReserveConfig.js +40 -18
  28. package/dist/@codegen/klend/types/ReserveConfig.js.map +1 -1
  29. package/dist/@codegen/klend/types/ReserveFees.d.ts +8 -8
  30. package/dist/@codegen/klend/types/ReserveFees.d.ts.map +1 -1
  31. package/dist/@codegen/klend/types/ReserveFees.js +8 -8
  32. package/dist/@codegen/klend/types/ReserveFees.js.map +1 -1
  33. package/dist/@codegen/klend/types/UpdateConfigMode.d.ts +46 -7
  34. package/dist/@codegen/klend/types/UpdateConfigMode.d.ts.map +1 -1
  35. package/dist/@codegen/klend/types/UpdateConfigMode.js +85 -12
  36. package/dist/@codegen/klend/types/UpdateConfigMode.js.map +1 -1
  37. package/dist/@codegen/klend/types/UpdateLendingMarketMode.d.ts +26 -0
  38. package/dist/@codegen/klend/types/UpdateLendingMarketMode.d.ts.map +1 -1
  39. package/dist/@codegen/klend/types/UpdateLendingMarketMode.js +49 -1
  40. package/dist/@codegen/klend/types/UpdateLendingMarketMode.js.map +1 -1
  41. package/dist/@codegen/klend/types/index.d.ts +4 -4
  42. package/dist/@codegen/klend/types/index.d.ts.map +1 -1
  43. package/dist/@codegen/klend/types/index.js.map +1 -1
  44. package/dist/@codegen/kvault/accounts/GlobalConfig.d.ts +32 -0
  45. package/dist/@codegen/kvault/accounts/GlobalConfig.d.ts.map +1 -0
  46. package/dist/@codegen/kvault/accounts/GlobalConfig.js +125 -0
  47. package/dist/@codegen/kvault/accounts/GlobalConfig.js.map +1 -0
  48. package/dist/@codegen/kvault/accounts/Reserve.js +1 -1
  49. package/dist/@codegen/kvault/accounts/ReserveWhitelistEntry.d.ts +52 -0
  50. package/dist/@codegen/kvault/accounts/ReserveWhitelistEntry.d.ts.map +1 -0
  51. package/dist/@codegen/kvault/accounts/ReserveWhitelistEntry.js +127 -0
  52. package/dist/@codegen/kvault/accounts/ReserveWhitelistEntry.js.map +1 -0
  53. package/dist/@codegen/kvault/accounts/VaultState.d.ts +18 -0
  54. package/dist/@codegen/kvault/accounts/VaultState.d.ts.map +1 -1
  55. package/dist/@codegen/kvault/accounts/VaultState.js +39 -1
  56. package/dist/@codegen/kvault/accounts/VaultState.js.map +1 -1
  57. package/dist/@codegen/kvault/accounts/index.d.ts +4 -0
  58. package/dist/@codegen/kvault/accounts/index.d.ts.map +1 -1
  59. package/dist/@codegen/kvault/accounts/index.js +5 -1
  60. package/dist/@codegen/kvault/accounts/index.js.map +1 -1
  61. package/dist/@codegen/kvault/errors/custom.d.ts +61 -5
  62. package/dist/@codegen/kvault/errors/custom.d.ts.map +1 -1
  63. package/dist/@codegen/kvault/errors/custom.js +108 -9
  64. package/dist/@codegen/kvault/errors/custom.js.map +1 -1
  65. package/dist/@codegen/kvault/instructions/addUpdateWhitelistedReserve.d.ts +16 -0
  66. package/dist/@codegen/kvault/instructions/addUpdateWhitelistedReserve.d.ts.map +1 -0
  67. package/dist/@codegen/kvault/instructions/addUpdateWhitelistedReserve.js +66 -0
  68. package/dist/@codegen/kvault/instructions/addUpdateWhitelistedReserve.js.map +1 -0
  69. package/dist/@codegen/kvault/instructions/buy.d.ts +24 -0
  70. package/dist/@codegen/kvault/instructions/buy.d.ts.map +1 -0
  71. package/dist/@codegen/kvault/instructions/buy.js +67 -0
  72. package/dist/@codegen/kvault/instructions/buy.js.map +1 -0
  73. package/dist/@codegen/kvault/instructions/index.d.ts +12 -0
  74. package/dist/@codegen/kvault/instructions/index.d.ts.map +1 -1
  75. package/dist/@codegen/kvault/instructions/index.js +13 -1
  76. package/dist/@codegen/kvault/instructions/index.js.map +1 -1
  77. package/dist/@codegen/kvault/instructions/initGlobalConfig.d.ts +11 -0
  78. package/dist/@codegen/kvault/instructions/initGlobalConfig.d.ts.map +1 -0
  79. package/dist/@codegen/kvault/instructions/initGlobalConfig.js +20 -0
  80. package/dist/@codegen/kvault/instructions/initGlobalConfig.js.map +1 -0
  81. package/dist/@codegen/kvault/instructions/invest.d.ts +2 -1
  82. package/dist/@codegen/kvault/instructions/invest.d.ts.map +1 -1
  83. package/dist/@codegen/kvault/instructions/invest.js +5 -0
  84. package/dist/@codegen/kvault/instructions/invest.js.map +1 -1
  85. package/dist/@codegen/kvault/instructions/sell.d.ts +40 -0
  86. package/dist/@codegen/kvault/instructions/sell.d.ts.map +1 -0
  87. package/dist/@codegen/kvault/instructions/sell.js +98 -0
  88. package/dist/@codegen/kvault/instructions/sell.js.map +1 -0
  89. package/dist/@codegen/kvault/instructions/updateGlobalConfig.d.ts +13 -0
  90. package/dist/@codegen/kvault/instructions/updateGlobalConfig.d.ts.map +1 -0
  91. package/dist/@codegen/kvault/instructions/updateGlobalConfig.js +63 -0
  92. package/dist/@codegen/kvault/instructions/updateGlobalConfig.js.map +1 -0
  93. package/dist/@codegen/kvault/instructions/updateGlobalConfigAdmin.d.ts +8 -0
  94. package/dist/@codegen/kvault/instructions/updateGlobalConfigAdmin.d.ts.map +1 -0
  95. package/dist/@codegen/kvault/instructions/updateGlobalConfigAdmin.js +21 -0
  96. package/dist/@codegen/kvault/instructions/updateGlobalConfigAdmin.js.map +1 -0
  97. package/dist/@codegen/kvault/instructions/updateReserveAllocation.d.ts +2 -1
  98. package/dist/@codegen/kvault/instructions/updateReserveAllocation.d.ts.map +1 -1
  99. package/dist/@codegen/kvault/instructions/updateReserveAllocation.js +5 -0
  100. package/dist/@codegen/kvault/instructions/updateReserveAllocation.js.map +1 -1
  101. package/dist/@codegen/kvault/instructions/updateVaultConfig.d.ts +2 -1
  102. package/dist/@codegen/kvault/instructions/updateVaultConfig.d.ts.map +1 -1
  103. package/dist/@codegen/kvault/instructions/updateVaultConfig.js +2 -5
  104. package/dist/@codegen/kvault/instructions/updateVaultConfig.js.map +1 -1
  105. package/dist/@codegen/kvault/instructions/withdraw.d.ts +1 -0
  106. package/dist/@codegen/kvault/instructions/withdraw.d.ts.map +1 -1
  107. package/dist/@codegen/kvault/instructions/withdraw.js +1 -0
  108. package/dist/@codegen/kvault/instructions/withdraw.js.map +1 -1
  109. package/dist/@codegen/kvault/instructions/withdrawFromAvailable.d.ts +1 -0
  110. package/dist/@codegen/kvault/instructions/withdrawFromAvailable.d.ts.map +1 -1
  111. package/dist/@codegen/kvault/instructions/withdrawFromAvailable.js +1 -0
  112. package/dist/@codegen/kvault/instructions/withdrawFromAvailable.js.map +1 -1
  113. package/dist/@codegen/kvault/types/ReserveConfig.d.ts +27 -34
  114. package/dist/@codegen/kvault/types/ReserveConfig.d.ts.map +1 -1
  115. package/dist/@codegen/kvault/types/ReserveConfig.js +20 -17
  116. package/dist/@codegen/kvault/types/ReserveConfig.js.map +1 -1
  117. package/dist/@codegen/kvault/types/ReserveFees.d.ts +8 -8
  118. package/dist/@codegen/kvault/types/ReserveFees.d.ts.map +1 -1
  119. package/dist/@codegen/kvault/types/ReserveFees.js +8 -8
  120. package/dist/@codegen/kvault/types/ReserveFees.js.map +1 -1
  121. package/dist/@codegen/kvault/types/UpdateGlobalConfigMode.d.ts +68 -0
  122. package/dist/@codegen/kvault/types/UpdateGlobalConfigMode.d.ts.map +1 -0
  123. package/dist/@codegen/kvault/types/UpdateGlobalConfigMode.js +162 -0
  124. package/dist/@codegen/kvault/types/UpdateGlobalConfigMode.js.map +1 -0
  125. package/dist/@codegen/kvault/types/UpdateReserveWhitelistMode.d.ts +46 -0
  126. package/dist/@codegen/kvault/types/UpdateReserveWhitelistMode.d.ts.map +1 -0
  127. package/dist/@codegen/kvault/types/UpdateReserveWhitelistMode.js +124 -0
  128. package/dist/@codegen/kvault/types/UpdateReserveWhitelistMode.js.map +1 -0
  129. package/dist/@codegen/kvault/types/VaultConfigField.d.ts +65 -0
  130. package/dist/@codegen/kvault/types/VaultConfigField.d.ts.map +1 -1
  131. package/dist/@codegen/kvault/types/VaultConfigField.js +121 -1
  132. package/dist/@codegen/kvault/types/VaultConfigField.js.map +1 -1
  133. package/dist/@codegen/kvault/types/index.d.ts +10 -2
  134. package/dist/@codegen/kvault/types/index.d.ts.map +1 -1
  135. package/dist/@codegen/kvault/types/index.js +5 -1
  136. package/dist/@codegen/kvault/types/index.js.map +1 -1
  137. package/dist/classes/manager.d.ts +17 -1
  138. package/dist/classes/manager.d.ts.map +1 -1
  139. package/dist/classes/manager.js +22 -0
  140. package/dist/classes/manager.js.map +1 -1
  141. package/dist/classes/reserve.d.ts.map +1 -1
  142. package/dist/classes/reserve.js +7 -4
  143. package/dist/classes/reserve.js.map +1 -1
  144. package/dist/classes/vault.d.ts +29 -5
  145. package/dist/classes/vault.d.ts.map +1 -1
  146. package/dist/classes/vault.js +119 -48
  147. package/dist/classes/vault.js.map +1 -1
  148. package/dist/idl/klend.json +129 -59
  149. package/dist/lib.d.ts +1 -0
  150. package/dist/lib.d.ts.map +1 -1
  151. package/dist/lib.js +4 -2
  152. package/dist/lib.js.map +1 -1
  153. package/dist/manager/client_kamino_manager.js +206 -15
  154. package/dist/manager/client_kamino_manager.js.map +1 -1
  155. package/dist/utils/index.d.ts +1 -0
  156. package/dist/utils/index.d.ts.map +1 -1
  157. package/dist/utils/index.js +1 -0
  158. package/dist/utils/index.js.map +1 -1
  159. package/dist/utils/managerTypes.d.ts +1 -1
  160. package/dist/utils/managerTypes.d.ts.map +1 -1
  161. package/dist/utils/managerTypes.js +5 -3
  162. package/dist/utils/managerTypes.js.map +1 -1
  163. package/dist/utils/parse.d.ts +10 -0
  164. package/dist/utils/parse.d.ts.map +1 -0
  165. package/dist/utils/parse.js +24 -0
  166. package/dist/utils/parse.js.map +1 -0
  167. package/dist/utils/seeds.d.ts +5 -5
  168. package/dist/utils/seeds.d.ts.map +1 -1
  169. package/dist/utils/seeds.js +13 -13
  170. package/dist/utils/seeds.js.map +1 -1
  171. package/dist/utils/vault.d.ts.map +1 -1
  172. package/dist/utils/vault.js +6 -0
  173. package/dist/utils/vault.js.map +1 -1
  174. package/package.json +1 -1
  175. package/src/@codegen/klend/accounts/LendingMarket.ts +46 -2
  176. package/src/@codegen/klend/errors/custom.ts +47 -2
  177. package/src/@codegen/klend/instructions/index.ts +2 -0
  178. package/src/@codegen/klend/instructions/initReserve.ts +2 -6
  179. package/src/@codegen/klend/instructions/liquidateObligationAndRedeemReserveCollateralV2.ts +1 -1
  180. package/src/@codegen/klend/instructions/seedDepositOnInitReserve.ts +50 -0
  181. package/src/@codegen/klend/instructions/withdrawObligationCollateral.ts +1 -1
  182. package/src/@codegen/klend/instructions/withdrawObligationCollateralV2.ts +1 -1
  183. package/src/@codegen/klend/types/ReserveConfig.ts +72 -30
  184. package/src/@codegen/klend/types/ReserveFees.ts +12 -12
  185. package/src/@codegen/klend/types/UpdateConfigMode.ts +103 -13
  186. package/src/@codegen/klend/types/UpdateLendingMarketMode.ts +60 -0
  187. package/src/@codegen/klend/types/index.ts +12 -2
  188. package/src/@codegen/kvault/accounts/GlobalConfig.ts +136 -0
  189. package/src/@codegen/kvault/accounts/Reserve.ts +1 -1
  190. package/src/@codegen/kvault/accounts/ReserveWhitelistEntry.ts +157 -0
  191. package/src/@codegen/kvault/accounts/VaultState.ts +57 -1
  192. package/src/@codegen/kvault/accounts/index.ts +7 -0
  193. package/src/@codegen/kvault/errors/custom.ts +109 -8
  194. package/src/@codegen/kvault/instructions/addUpdateWhitelistedReserve.ts +64 -0
  195. package/src/@codegen/kvault/instructions/buy.ts +74 -0
  196. package/src/@codegen/kvault/instructions/index.ts +18 -0
  197. package/src/@codegen/kvault/instructions/initGlobalConfig.ts +44 -0
  198. package/src/@codegen/kvault/instructions/invest.ts +4 -0
  199. package/src/@codegen/kvault/instructions/sell.ts +122 -0
  200. package/src/@codegen/kvault/instructions/updateGlobalConfig.ts +58 -0
  201. package/src/@codegen/kvault/instructions/updateGlobalConfigAdmin.ts +42 -0
  202. package/src/@codegen/kvault/instructions/updateReserveAllocation.ts +4 -0
  203. package/src/@codegen/kvault/instructions/updateVaultConfig.ts +4 -6
  204. package/src/@codegen/kvault/instructions/withdraw.ts +2 -0
  205. package/src/@codegen/kvault/instructions/withdrawFromAvailable.ts +2 -0
  206. package/src/@codegen/kvault/types/ReserveConfig.ts +34 -37
  207. package/src/@codegen/kvault/types/ReserveFees.ts +12 -12
  208. package/src/@codegen/kvault/types/UpdateGlobalConfigMode.ts +160 -0
  209. package/src/@codegen/kvault/types/UpdateReserveWhitelistMode.ts +117 -0
  210. package/src/@codegen/kvault/types/VaultConfigField.ts +150 -0
  211. package/src/@codegen/kvault/types/index.ts +31 -0
  212. package/src/classes/manager.ts +29 -1
  213. package/src/classes/reserve.ts +7 -5
  214. package/src/classes/vault.ts +166 -48
  215. package/src/idl/klend.json +130 -60
  216. package/src/idl/kvault.json +582 -23
  217. package/src/lib.ts +2 -1
  218. package/src/manager/client_kamino_manager.ts +313 -18
  219. package/src/utils/index.ts +2 -1
  220. package/src/utils/managerTypes.ts +6 -4
  221. package/src/utils/parse.ts +18 -0
  222. package/src/utils/seeds.ts +13 -17
  223. 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(ms, staging);
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
- .action(async ({ vault, field, value, mode, staging, skipLutUpdate, lutSigner }) => {
512
- const env = await initEnv(staging);
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
- const signer = await env.getSigner({ vaultState });
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>', 'Pubkey of the new admin')
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
- const env = await initEnv(multisig, staging);
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>', 'Pubkey of the new admin')
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 env = await initEnv(staging, multisig);
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 env = await initEnv(multisig, staging);
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
- borrowFeeSf: Fraction.fromDecimal(new Decimal(reserveConfigFromFile.fees.borrowFee)).valueSf,
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
- reserved2: Array(9).fill(0),
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.borrowFeeSf).toDecimal().toString(),
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
  },
@@ -15,4 +15,5 @@ export * from './managerTypes';
15
15
  export * from './fuzz';
16
16
  export * from './rpc';
17
17
  export * from './map';
18
- export * from './obligations'
18
+ export * from './parse';
19
+ export * from './obligations';
@@ -243,7 +243,7 @@ export type AssetReserveConfigParams = {
243
243
  minLiquidationBonusBps: number;
244
244
  badDebtLiquidationBonusBps: number;
245
245
  liquidationThresholdPct: number;
246
- borrowFeeSf: Fraction;
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
- borrowFeeSf: ZERO_FRACTION,
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
- borrowFeeSf: fields.configParams.borrowFeeSf.getValue(),
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
- reserved2: Array(9).fill(0),
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
+ }
@@ -73,12 +73,12 @@ export interface ReservePdas {
73
73
  * @param mint
74
74
  * @returns ReservePdas
75
75
  */
76
- export async function reservePdas(programId: Address, market: Address, mint: Address): Promise<ReservePdas> {
76
+ export async function reservePdas(programId: Address, reserve: Address): Promise<ReservePdas> {
77
77
  const [[liquiditySupplyVault], [collateralMint], [collateralSupplyVault], [feeVault]] = await Promise.all([
78
- reserveLiqSupplyPda(market, mint, programId),
79
- reserveCollateralMintPda(market, mint, programId),
80
- reserveCollateralSupplyPda(market, mint, programId),
81
- reserveFeeVaultPda(market, mint, programId),
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
- lendingMarket: Address,
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(lendingMarket), addressEncoder.encode(mint)],
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
- lendingMarket: Address,
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(lendingMarket), addressEncoder.encode(mint)],
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
- lendingMarket: Address,
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(lendingMarket), addressEncoder.encode(mint)],
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
- lendingMarket: Address,
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(lendingMarket), addressEncoder.encode(mint)],
170
+ seeds: [Buffer.from(RESERVE_COLL_SUPPLY_SEED), addressEncoder.encode(reserve)],
175
171
  programAddress: programId,
176
172
  });
177
173
  }
@@ -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
  }