@kamino-finance/klend-sdk 7.2.6-beta.1 → 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 (226) 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/market.js +3 -3
  142. package/dist/classes/market.js.map +1 -1
  143. package/dist/classes/reserve.d.ts.map +1 -1
  144. package/dist/classes/reserve.js +7 -4
  145. package/dist/classes/reserve.js.map +1 -1
  146. package/dist/classes/vault.d.ts +29 -5
  147. package/dist/classes/vault.d.ts.map +1 -1
  148. package/dist/classes/vault.js +119 -48
  149. package/dist/classes/vault.js.map +1 -1
  150. package/dist/idl/klend.json +129 -59
  151. package/dist/lib.d.ts +1 -0
  152. package/dist/lib.d.ts.map +1 -1
  153. package/dist/lib.js +4 -2
  154. package/dist/lib.js.map +1 -1
  155. package/dist/manager/client_kamino_manager.js +206 -15
  156. package/dist/manager/client_kamino_manager.js.map +1 -1
  157. package/dist/utils/index.d.ts +1 -0
  158. package/dist/utils/index.d.ts.map +1 -1
  159. package/dist/utils/index.js +1 -0
  160. package/dist/utils/index.js.map +1 -1
  161. package/dist/utils/managerTypes.d.ts +1 -1
  162. package/dist/utils/managerTypes.d.ts.map +1 -1
  163. package/dist/utils/managerTypes.js +5 -3
  164. package/dist/utils/managerTypes.js.map +1 -1
  165. package/dist/utils/parse.d.ts +10 -0
  166. package/dist/utils/parse.d.ts.map +1 -0
  167. package/dist/utils/parse.js +24 -0
  168. package/dist/utils/parse.js.map +1 -0
  169. package/dist/utils/seeds.d.ts +5 -5
  170. package/dist/utils/seeds.d.ts.map +1 -1
  171. package/dist/utils/seeds.js +13 -13
  172. package/dist/utils/seeds.js.map +1 -1
  173. package/dist/utils/vault.d.ts.map +1 -1
  174. package/dist/utils/vault.js +6 -0
  175. package/dist/utils/vault.js.map +1 -1
  176. package/package.json +1 -1
  177. package/src/@codegen/klend/accounts/LendingMarket.ts +46 -2
  178. package/src/@codegen/klend/errors/custom.ts +47 -2
  179. package/src/@codegen/klend/instructions/index.ts +2 -0
  180. package/src/@codegen/klend/instructions/initReserve.ts +2 -6
  181. package/src/@codegen/klend/instructions/liquidateObligationAndRedeemReserveCollateralV2.ts +1 -1
  182. package/src/@codegen/klend/instructions/seedDepositOnInitReserve.ts +50 -0
  183. package/src/@codegen/klend/instructions/withdrawObligationCollateral.ts +1 -1
  184. package/src/@codegen/klend/instructions/withdrawObligationCollateralV2.ts +1 -1
  185. package/src/@codegen/klend/types/ReserveConfig.ts +72 -30
  186. package/src/@codegen/klend/types/ReserveFees.ts +12 -12
  187. package/src/@codegen/klend/types/UpdateConfigMode.ts +103 -13
  188. package/src/@codegen/klend/types/UpdateLendingMarketMode.ts +60 -0
  189. package/src/@codegen/klend/types/index.ts +12 -2
  190. package/src/@codegen/kvault/accounts/GlobalConfig.ts +136 -0
  191. package/src/@codegen/kvault/accounts/Reserve.ts +1 -1
  192. package/src/@codegen/kvault/accounts/ReserveWhitelistEntry.ts +157 -0
  193. package/src/@codegen/kvault/accounts/VaultState.ts +57 -1
  194. package/src/@codegen/kvault/accounts/index.ts +7 -0
  195. package/src/@codegen/kvault/errors/custom.ts +109 -8
  196. package/src/@codegen/kvault/instructions/addUpdateWhitelistedReserve.ts +64 -0
  197. package/src/@codegen/kvault/instructions/buy.ts +74 -0
  198. package/src/@codegen/kvault/instructions/index.ts +18 -0
  199. package/src/@codegen/kvault/instructions/initGlobalConfig.ts +44 -0
  200. package/src/@codegen/kvault/instructions/invest.ts +4 -0
  201. package/src/@codegen/kvault/instructions/sell.ts +122 -0
  202. package/src/@codegen/kvault/instructions/updateGlobalConfig.ts +58 -0
  203. package/src/@codegen/kvault/instructions/updateGlobalConfigAdmin.ts +42 -0
  204. package/src/@codegen/kvault/instructions/updateReserveAllocation.ts +4 -0
  205. package/src/@codegen/kvault/instructions/updateVaultConfig.ts +4 -6
  206. package/src/@codegen/kvault/instructions/withdraw.ts +2 -0
  207. package/src/@codegen/kvault/instructions/withdrawFromAvailable.ts +2 -0
  208. package/src/@codegen/kvault/types/ReserveConfig.ts +34 -37
  209. package/src/@codegen/kvault/types/ReserveFees.ts +12 -12
  210. package/src/@codegen/kvault/types/UpdateGlobalConfigMode.ts +160 -0
  211. package/src/@codegen/kvault/types/UpdateReserveWhitelistMode.ts +117 -0
  212. package/src/@codegen/kvault/types/VaultConfigField.ts +150 -0
  213. package/src/@codegen/kvault/types/index.ts +31 -0
  214. package/src/classes/manager.ts +29 -1
  215. package/src/classes/market.ts +3 -3
  216. package/src/classes/reserve.ts +7 -5
  217. package/src/classes/vault.ts +166 -48
  218. package/src/idl/klend.json +130 -60
  219. package/src/idl/kvault.json +582 -23
  220. package/src/lib.ts +2 -1
  221. package/src/manager/client_kamino_manager.ts +313 -18
  222. package/src/utils/index.ts +2 -1
  223. package/src/utils/managerTypes.ts +6 -4
  224. package/src/utils/parse.ts +18 -0
  225. package/src/utils/seeds.ts +13 -17
  226. package/src/utils/vault.ts +6 -0
@@ -216,7 +216,7 @@ export class KaminoReserve {
216
216
  * @returns the origination fee percentage of the reserve
217
217
  */
218
218
  getBorrowFee = (): Decimal => {
219
- return new Fraction(this.state.config.fees.borrowFeeSf).toDecimal();
219
+ return new Fraction(this.state.config.fees.originationFeeSf).toDecimal();
220
220
  };
221
221
 
222
222
  /**
@@ -1180,13 +1180,12 @@ export async function createReserveIxs(
1180
1180
 
1181
1181
  const { liquiditySupplyVault, collateralMint, collateralSupplyVault, feeVault } = await reservePdas(
1182
1182
  programId,
1183
- lendingMarket,
1184
- liquidityMint
1183
+ reserveAddress.address
1185
1184
  );
1186
1185
  const [lendingMarketAuthority] = await lendingMarketAuthPda(lendingMarket, programId);
1187
1186
 
1188
1187
  const accounts: InitReserveAccounts = {
1189
- lendingMarketOwner: owner,
1188
+ signer: owner,
1190
1189
  lendingMarket: lendingMarket,
1191
1190
  lendingMarketAuthority: lendingMarketAuthority,
1192
1191
  reserve: reserveAddress.address,
@@ -1239,7 +1238,7 @@ export const RESERVE_CONFIG_UPDATER = new ConfigUpdater(UpdateConfigMode.fromDec
1239
1238
  [UpdateConfigMode.UpdateLiquidationThresholdPct.kind]: config.liquidationThresholdPct,
1240
1239
  [UpdateConfigMode.UpdateProtocolLiquidationFee.kind]: config.protocolLiquidationFeePct,
1241
1240
  [UpdateConfigMode.UpdateProtocolTakeRate.kind]: config.protocolTakeRatePct,
1242
- [UpdateConfigMode.UpdateFeesBorrowFee.kind]: config.fees.borrowFeeSf,
1241
+ [UpdateConfigMode.UpdateFeesOriginationFee.kind]: config.fees.originationFeeSf,
1243
1242
  [UpdateConfigMode.UpdateFeesFlashLoanFee.kind]: config.fees.flashLoanFeeSf,
1244
1243
  [UpdateConfigMode.DeprecatedUpdateFeesReferralFeeBps.kind]: [], // deprecated
1245
1244
  [UpdateConfigMode.UpdateDepositLimit.kind]: config.depositLimit,
@@ -1291,6 +1290,9 @@ export const RESERVE_CONFIG_UPDATER = new ConfigUpdater(UpdateConfigMode.fromDec
1291
1290
  [UpdateConfigMode.UpdateAutodeleverageEnabled.kind]: config.autodeleverageEnabled,
1292
1291
  [UpdateConfigMode.UpdateDeleveragingBonusIncreaseBpsPerDay.kind]: config.deleveragingBonusIncreaseBpsPerDay,
1293
1292
  [UpdateConfigMode.UpdateProtocolOrderExecutionFee.kind]: config.protocolOrderExecutionFeePct,
1293
+ [UpdateConfigMode.UpdateProposerAuthorityLock.kind]: config.proposerAuthorityLocked,
1294
+ [UpdateConfigMode.UpdateMinDeleveragingBonusBps.kind]: config.minDeleveragingBonusBps,
1295
+ [UpdateConfigMode.UpdateBlockCTokenUsage.kind]: config.blockCtokenUsage,
1294
1296
  }));
1295
1297
 
1296
1298
  export async function updateEntireReserveConfigIx(
@@ -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 [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
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
- vaultAdminAuthority?: TransactionSigner,
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, vaultAdminAuthority);
815
+ const admin = parseVaultAdmin(vaultState, adminAuthority);
774
816
 
817
+ const globalConfig = await getKvaultGlobalConfigPda(this._kaminoVaultProgramId);
775
818
  const updateVaultConfigAccs: UpdateVaultConfigAccounts = {
776
- vaultAdminAuthority: admin,
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: Buffer.from([0]),
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 for a vault that
899
- * @param admin - address of vault to be updated
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
- vaultAdminAuthority: admin,
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: Buffer.from([0]),
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
  }