@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
@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.VaultHoldings = exports.ReserveAllocationConfig = exports.KaminoVaultConfig = exports.KaminoVault = exports.KaminoVaultClient = exports.INITIAL_DEPOSIT_LAMPORTS = exports.METADATA_PROGRAM_ID = exports.METADATA_SEED = exports.kaminoVaultStagingId = exports.kaminoVaultId = void 0;
7
7
  exports.getCTokenVaultPda = getCTokenVaultPda;
8
8
  exports.getEventAuthorityPda = getEventAuthorityPda;
9
+ exports.getKvaultGlobalConfigPda = getKvaultGlobalConfigPda;
10
+ exports.getReserveWhitelistEntryPda = getReserveWhitelistEntryPda;
9
11
  const bn_js_1 = __importDefault(require("bn.js"));
10
12
  const kit_1 = require("@solana/kit");
11
13
  const lib_1 = require("../lib");
@@ -42,6 +44,8 @@ const BASE_VAULT_AUTHORITY_SEED = 'authority';
42
44
  const SHARES_SEED = 'shares';
43
45
  const EVENT_AUTHORITY_SEED = '__event_authority';
44
46
  exports.METADATA_SEED = 'metadata';
47
+ const GLOBAL_CONFIG_STATE_SEED = 'global_config';
48
+ const WHITELISTED_RESERVES_SEED = 'whitelisted_reserves';
45
49
  exports.METADATA_PROGRAM_ID = (0, kit_1.address)('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s');
46
50
  exports.INITIAL_DEPOSIT_LAMPORTS = 1000;
47
51
  const addressEncoder = (0, kit_1.getAddressEncoder)();
@@ -95,6 +99,23 @@ class KaminoVaultClient {
95
99
  holdings.print();
96
100
  console.log('Tokens per share: ', tokensPerShare);
97
101
  }
102
+ /**
103
+ * This method initializes the kvault global config (one off, needs to be signed by program owner)
104
+ * @param admin - the admin of the kvault program
105
+ * @returns - an instruction to initialize the kvault global config
106
+ */
107
+ async initKvaultGlobalConfigIx(admin) {
108
+ const globalConfigAddress = await getKvaultGlobalConfigPda(this.getProgramID());
109
+ const programData = await (0, utils_2.programDataPda)(this.getProgramID());
110
+ const ix = (0, instructions_1.initKVaultGlobalConfig)({
111
+ payer: admin,
112
+ globalConfig: globalConfigAddress,
113
+ programData: programData,
114
+ systemProgram: system_1.SYSTEM_PROGRAM_ADDRESS,
115
+ rent: sysvars_1.SYSVAR_RENT_ADDRESS,
116
+ }, undefined, this.getProgramID());
117
+ return ix;
118
+ }
98
119
  /**
99
120
  * 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
100
121
  * @param vaultConfig - the config object used to create a vault
@@ -174,21 +195,21 @@ class KaminoVaultClient {
174
195
  farm_utils_1.FARMS_GLOBAL_CONFIG_MAINNET,
175
196
  ];
176
197
  const insertIntoLUTIxs = await (0, lookupTable_1.insertIntoLookupTableIxs)(this.getConnection(), vaultConfig.admin, lut, accountsToBeInserted, []);
177
- const setLUTIx = this.updateUninitialisedVaultConfigIx(vaultConfig.admin, vaultState.address, new types_1.VaultConfigField.LookupTable(), lut.toString());
198
+ const setLUTIx = await this.updateUninitialisedVaultConfigIx(vaultConfig.admin, vaultState.address, new types_1.VaultConfigField.LookupTable(), lut.toString());
178
199
  const ixs = [createVaultIx, initVaultIx, setLUTIx];
179
200
  if (vaultConfig.getPerformanceFeeBps() > 0) {
180
- const setPerformanceFeeIx = this.updateUninitialisedVaultConfigIx(vaultConfig.admin, vaultState.address, new types_1.VaultConfigField.PerformanceFeeBps(), vaultConfig.getPerformanceFeeBps().toString());
201
+ const setPerformanceFeeIx = await this.updateUninitialisedVaultConfigIx(vaultConfig.admin, vaultState.address, new types_1.VaultConfigField.PerformanceFeeBps(), vaultConfig.getPerformanceFeeBps().toString());
181
202
  ixs.push(setPerformanceFeeIx);
182
203
  }
183
204
  if (vaultConfig.getManagementFeeBps() > 0) {
184
- const setManagementFeeIx = this.updateUninitialisedVaultConfigIx(vaultConfig.admin, vaultState.address, new types_1.VaultConfigField.ManagementFeeBps(), vaultConfig.getManagementFeeBps().toString());
205
+ const setManagementFeeIx = await this.updateUninitialisedVaultConfigIx(vaultConfig.admin, vaultState.address, new types_1.VaultConfigField.ManagementFeeBps(), vaultConfig.getManagementFeeBps().toString());
185
206
  ixs.push(setManagementFeeIx);
186
207
  }
187
208
  if (vaultConfig.name && vaultConfig.name.length > 0) {
188
- const setNameIx = this.updateUninitialisedVaultConfigIx(vaultConfig.admin, vaultState.address, new types_1.VaultConfigField.Name(), vaultConfig.name);
209
+ const setNameIx = await this.updateUninitialisedVaultConfigIx(vaultConfig.admin, vaultState.address, new types_1.VaultConfigField.Name(), vaultConfig.name);
189
210
  ixs.push(setNameIx);
190
211
  }
191
- const setFarmIx = this.updateUninitialisedVaultConfigIx(vaultConfig.admin, vaultState.address, new types_1.VaultConfigField.Farm(), createVaultFarm.farm.address);
212
+ const setFarmIx = await this.updateUninitialisedVaultConfigIx(vaultConfig.admin, vaultState.address, new types_1.VaultConfigField.Farm(), createVaultFarm.farm.address);
192
213
  const metadataIx = await this.getSetSharesMetadataIx(this.getConnection(), vaultConfig.admin, vaultState.address, sharesMint, baseVaultAuthority, vaultConfig.vaultTokenSymbol, vaultConfig.vaultTokenName);
193
214
  return {
194
215
  vault: vaultState,
@@ -254,6 +275,7 @@ class KaminoVaultClient {
254
275
  const vaultState = await vault.getState();
255
276
  const reserveState = reserveAllocationConfig.getReserveState();
256
277
  const cTokenVault = await getCTokenVaultPda(vault.address, reserveAllocationConfig.getReserveAddress(), this._kaminoVaultProgramId);
278
+ const reserveWhitelistEntryOption = await getReserveWhitelistEntryIfExists(reserveAllocationConfig.getReserveAddress(), this.getConnection(), this._kaminoVaultProgramId);
257
279
  const vaultAdmin = parseVaultAdmin(vaultState, vaultAdminAuthority);
258
280
  const updateReserveAllocationAccounts = {
259
281
  signer: vaultAdmin,
@@ -262,6 +284,7 @@ class KaminoVaultClient {
262
284
  reserveCollateralMint: reserveState.collateral.mintPubkey,
263
285
  reserve: reserveAllocationConfig.getReserveAddress(),
264
286
  ctokenVault: cTokenVault,
287
+ reserveWhitelistEntry: reserveWhitelistEntryOption,
265
288
  systemProgram: system_1.SYSTEM_PROGRAM_ADDRESS,
266
289
  rent: sysvars_1.SYSVAR_RENT_ADDRESS,
267
290
  reserveCollateralTokenProgram: token_1.TOKEN_PROGRAM_ADDRESS,
@@ -436,41 +459,26 @@ class KaminoVaultClient {
436
459
  * @param vault the vault to update
437
460
  * @param mode the field to update (based on VaultConfigFieldKind enum)
438
461
  * @param value the value to update the field with
439
- * @param [vaultAdminAuthority] 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
462
+ * @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.
463
+ * The global admin should be passed in when wanting to change the AllowAllocationsInWhitelistedReservesOnly or AllowInvestInWhitelistedReservesOnly fields to false
440
464
  * @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
441
465
  * @param [skipLutUpdate] if true, the lookup table instructions will not be included in the returned instructions
442
466
  * @returns a struct that contains the instruction to update the field and an optional list of instructions to update the lookup table
443
467
  */
444
- async updateVaultConfigIxs(vault, mode, value, vaultAdminAuthority, lutIxsSigner, skipLutUpdate = false) {
468
+ async updateVaultConfigIxs(vault, mode, value, adminAuthority, lutIxsSigner, skipLutUpdate = false) {
445
469
  const vaultState = await vault.getState();
446
- const admin = parseVaultAdmin(vaultState, vaultAdminAuthority);
470
+ const admin = parseVaultAdmin(vaultState, adminAuthority);
471
+ const globalConfig = await getKvaultGlobalConfigPda(this._kaminoVaultProgramId);
447
472
  const updateVaultConfigAccs = {
448
- vaultAdminAuthority: admin,
473
+ signer: admin,
474
+ globalConfig: globalConfig,
449
475
  vaultState: vault.address,
450
476
  klendProgram: this._kaminoLendProgramId,
451
477
  };
452
- if (vaultAdminAuthority) {
453
- updateVaultConfigAccs.vaultAdminAuthority = vaultAdminAuthority;
454
- }
455
478
  const updateVaultConfigArgs = {
456
479
  entry: mode,
457
- data: Buffer.from([0]),
480
+ data: this.getValueForModeAsBuffer(mode, value),
458
481
  };
459
- if (isNaN(+value) || value === lib_1.DEFAULT_PUBLIC_KEY) {
460
- if (mode.kind === new types_1.VaultConfigField.Name().kind) {
461
- const data = Array.from(this.encodeVaultName(value));
462
- updateVaultConfigArgs.data = Buffer.from(data);
463
- }
464
- else {
465
- const data = (0, kit_1.address)(value);
466
- updateVaultConfigArgs.data = Buffer.from(addressEncoder.encode(data));
467
- }
468
- }
469
- else {
470
- const buffer = Buffer.alloc(8);
471
- buffer.writeBigUInt64LE(BigInt(value.toString()));
472
- updateVaultConfigArgs.data = buffer;
473
- }
474
482
  const vaultReserves = this.getVaultReserves(vaultState);
475
483
  const vaultReservesState = await this.loadVaultReserves(vaultState);
476
484
  let updateVaultConfigIx = (0, instructions_1.updateVaultConfig)(updateVaultConfigArgs, updateVaultConfigAccs, undefined, this._kaminoVaultProgramId);
@@ -503,6 +511,30 @@ class KaminoVaultClient {
503
511
  };
504
512
  return updateVaultConfigIxs;
505
513
  }
514
+ /**
515
+ * Add or update a reserve whitelist entry. This controls whether the reserve is whitelisted for adding/updating
516
+ * allocations or for invest, depending on the mode parameter.
517
+ *
518
+ * @param reserve - Address of the reserve to whitelist
519
+ * @param mode - The whitelist mode: either 'Invest' or 'AddAllocation' with a value (1 = allow, 0 = deny)
520
+ * @param globalAdmin - The global admin that signs the transaction
521
+ * @returns - An instruction to add/update the whitelisted reserve
522
+ */
523
+ async addUpdateWhitelistedReserveIx(reserve, mode, globalAdmin) {
524
+ const globalConfig = await getKvaultGlobalConfigPda(this._kaminoVaultProgramId);
525
+ const reserveWhitelistEntry = await getReserveWhitelistEntryPda(reserve, this._kaminoVaultProgramId);
526
+ const accounts = {
527
+ globalAdmin,
528
+ globalConfig,
529
+ reserve,
530
+ reserveWhitelistEntry,
531
+ systemProgram: system_1.SYSTEM_PROGRAM_ADDRESS,
532
+ };
533
+ const args = {
534
+ update: mode,
535
+ };
536
+ return (0, instructions_1.addUpdateWhitelistedReserve)(args, accounts, undefined, this._kaminoVaultProgramId);
537
+ }
506
538
  /** 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
507
539
  * @param vault - vault to set the farm for
508
540
  * @param farm - the farm where the vault shares can be staked
@@ -520,38 +552,28 @@ class KaminoVaultClient {
520
552
  return this.updateVaultConfigIxs(vault, new types_1.VaultConfigField.Farm(), farm, vaultAdminAuthority, lutIxsSigner, skipLutUpdate);
521
553
  }
522
554
  /**
523
- * This method updates the vault config for a vault that
524
- * @param admin - address of vault to be updated
555
+ * This method updates the vault config during vault initialization, within the same transaction
556
+ * where the vault is created. Use this when the vault state is not yet committed to the chain
557
+ * and cannot be fetched via RPC. For updates to existing vaults, use updateVaultConfigIxs instead.
558
+ *
559
+ * @param admin - the admin that signs the transaction
525
560
  * @param vault - address of vault to be updated
526
561
  * @param mode - the field to be updated
527
562
  * @param value - the new value for the field to be updated (number or pubkey)
528
563
  * @returns - an instruction to update the vault config
529
564
  */
530
- updateUninitialisedVaultConfigIx(admin, vault, mode, value) {
565
+ async updateUninitialisedVaultConfigIx(admin, vault, mode, value) {
566
+ const globalConfig = await getKvaultGlobalConfigPda(this._kaminoVaultProgramId);
531
567
  const updateVaultConfigAccs = {
532
- vaultAdminAuthority: admin,
568
+ signer: admin,
569
+ globalConfig: globalConfig,
533
570
  vaultState: vault,
534
571
  klendProgram: this._kaminoLendProgramId,
535
572
  };
536
573
  const updateVaultConfigArgs = {
537
574
  entry: mode,
538
- data: Buffer.from([0]),
575
+ data: this.getValueForModeAsBuffer(mode, value),
539
576
  };
540
- if (isNaN(+value)) {
541
- if (mode.kind === new types_1.VaultConfigField.Name().kind) {
542
- const data = Array.from(this.encodeVaultName(value));
543
- updateVaultConfigArgs.data = Buffer.from(data);
544
- }
545
- else {
546
- const data = (0, kit_1.address)(value);
547
- updateVaultConfigArgs.data = Buffer.from(addressEncoder.encode(data));
548
- }
549
- }
550
- else {
551
- const buffer = Buffer.alloc(8);
552
- buffer.writeBigUInt64LE(BigInt(value.toString()));
553
- updateVaultConfigArgs.data = buffer;
554
- }
555
577
  const updateVaultConfigIx = (0, instructions_1.updateVaultConfig)(updateVaultConfigArgs, updateVaultConfigAccs, undefined, this._kaminoVaultProgramId);
556
578
  return updateVaultConfigIx;
557
579
  }
@@ -1036,6 +1058,7 @@ class KaminoVaultClient {
1036
1058
  if (createAtaIfNeeded) {
1037
1059
  ixs.push(createAtaIx);
1038
1060
  }
1061
+ const reserveWhitelistEntryOption = await getReserveWhitelistEntryIfExists(reserve.address, this.getConnection(), this._kaminoVaultProgramId);
1039
1062
  const investAccounts = {
1040
1063
  payer,
1041
1064
  vaultState: vault.address,
@@ -1048,6 +1071,7 @@ class KaminoVaultClient {
1048
1071
  lendingMarketAuthority: lendingMarketAuth,
1049
1072
  reserveLiquiditySupply: reserve.state.liquidity.supplyVault,
1050
1073
  reserveCollateralMint: reserve.state.collateral.mintPubkey,
1074
+ reserveWhitelistEntry: reserveWhitelistEntryOption,
1051
1075
  klendProgram: this._kaminoLendProgramId,
1052
1076
  instructionSysvarAccount: sysvars_1.SYSVAR_INSTRUCTIONS_ADDRESS,
1053
1077
  tokenProgram: tokenProgram,
@@ -1072,13 +1096,39 @@ class KaminoVaultClient {
1072
1096
  decodeVaultName(token) {
1073
1097
  return (0, utils_1.decodeVaultName)(token);
1074
1098
  }
1099
+ /** Helper to serialize value as Buffer for updateVaultConfig instruction */
1100
+ getValueForModeAsBuffer(mode, value) {
1101
+ const isWhitelistOnlyFlag = mode.kind === new types_1.VaultConfigField.AllowInvestInWhitelistedReservesOnly().kind ||
1102
+ mode.kind === new types_1.VaultConfigField.AllowAllocationsInWhitelistedReservesOnly().kind;
1103
+ if (isWhitelistOnlyFlag) {
1104
+ const flag = (0, utils_2.parseBooleanFlag)(value);
1105
+ return Buffer.from([flag]);
1106
+ }
1107
+ else if (isNaN(+value)) {
1108
+ if (mode.kind === new types_1.VaultConfigField.Name().kind) {
1109
+ const data = Array.from(this.encodeVaultName(value));
1110
+ return Buffer.from(data);
1111
+ }
1112
+ else {
1113
+ const data = (0, kit_1.address)(value);
1114
+ return Buffer.from(addressEncoder.encode(data));
1115
+ }
1116
+ }
1117
+ else {
1118
+ const buffer = Buffer.alloc(8);
1119
+ buffer.writeBigUInt64LE(BigInt(value.toString()));
1120
+ return buffer;
1121
+ }
1122
+ }
1075
1123
  async withdrawIx(user, vault, vaultState, marketAddress, reserve, userSharesAta, userTokenAta, shareAmountLamports, vaultReservesState) {
1076
1124
  const [lendingMarketAuth] = await (0, utils_2.lendingMarketAuthPda)(marketAddress, this._kaminoLendProgramId);
1125
+ const globalConfig = await getKvaultGlobalConfigPda(this._kaminoVaultProgramId);
1077
1126
  const eventAuthority = await getEventAuthorityPda(this._kaminoVaultProgramId);
1078
1127
  const withdrawAccounts = {
1079
1128
  withdrawFromAvailable: {
1080
1129
  user,
1081
1130
  vaultState: vault.address,
1131
+ globalConfig: globalConfig,
1082
1132
  tokenVault: vaultState.tokenVault,
1083
1133
  baseVaultAuthority: vaultState.baseVaultAuthority,
1084
1134
  userTokenAta: userTokenAta,
@@ -1114,10 +1164,12 @@ class KaminoVaultClient {
1114
1164
  return withdrawIxn;
1115
1165
  }
1116
1166
  async withdrawFromAvailableIx(user, vault, vaultState, userSharesAta, userTokenAta, shareAmountLamports) {
1167
+ const globalConfig = await getKvaultGlobalConfigPda(this._kaminoVaultProgramId);
1117
1168
  const eventAuthority = await getEventAuthorityPda(this._kaminoVaultProgramId);
1118
1169
  const withdrawFromAvailableAccounts = {
1119
1170
  user,
1120
1171
  vaultState: vault.address,
1172
+ globalConfig: globalConfig,
1121
1173
  tokenVault: vaultState.tokenVault,
1122
1174
  baseVaultAuthority: vaultState.baseVaultAuthority,
1123
1175
  userTokenAta,
@@ -2853,6 +2905,25 @@ async function getEventAuthorityPda(kaminoVaultProgramId) {
2853
2905
  programAddress: kaminoVaultProgramId,
2854
2906
  }))[0];
2855
2907
  }
2908
+ async function getKvaultGlobalConfigPda(kaminoVaultProgramId) {
2909
+ return (await (0, kit_1.getProgramDerivedAddress)({
2910
+ seeds: [Buffer.from(GLOBAL_CONFIG_STATE_SEED)],
2911
+ programAddress: kaminoVaultProgramId,
2912
+ }))[0];
2913
+ }
2914
+ async function getReserveWhitelistEntryPda(reserveAddress, kaminoVaultProgramId) {
2915
+ return (await (0, kit_1.getProgramDerivedAddress)({
2916
+ seeds: [Buffer.from(WHITELISTED_RESERVES_SEED), addressEncoder.encode(reserveAddress)],
2917
+ programAddress: kaminoVaultProgramId,
2918
+ }))[0];
2919
+ }
2920
+ async function getReserveWhitelistEntryIfExists(reserveAddress, rpc, kaminoVaultProgramId) {
2921
+ const reserveWhitelistEntry = await getReserveWhitelistEntryPda(reserveAddress, kaminoVaultProgramId);
2922
+ const reserveWhitelistEntryAccount = await (0, kit_1.fetchEncodedAccount)(rpc, reserveWhitelistEntry, {
2923
+ commitment: 'processed',
2924
+ });
2925
+ return reserveWhitelistEntryAccount.exists ? (0, kit_1.some)(reserveWhitelistEntry) : (0, kit_1.none)();
2926
+ }
2856
2927
  function parseVaultAdmin(vault, signer) {
2857
2928
  return signer ?? (0, signer_1.noopSigner)(vault.vaultAdminAuthority);
2858
2929
  }