@kamino-finance/klend-sdk 5.13.2 → 5.13.4

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.
@@ -252,10 +252,12 @@ async function main() {
252
252
  `--mode <string>`,
253
253
  'simulate - to print txn simulation, inspect - to get txn simulation in explorer, execute - execute txn, multisig - to get bs58 txn for multisig usage'
254
254
  )
255
- .option(`--name`, 'The onchain name of the strat')
255
+ .requiredOption('--name <string>', 'The onchain name of the strat')
256
+ .requiredOption('--tokenName <string>', 'The name of the token in the vault')
257
+ .requiredOption('--extraTokenName <string>', 'The extra string appended to the token symbol')
256
258
  .option(`--staging`, 'If true, will use the staging programs')
257
259
  .option(`--multisig <string>`, 'If using multisig mode this is required, otherwise will be ignored')
258
- .action(async ({ mint, mode, name, staging, multisig }) => {
260
+ .action(async ({ mint, mode, name, tokenName, extraTokenName, staging, multisig }) => {
259
261
  const env = initializeClient(mode === 'multisig', staging);
260
262
  const tokenMint = new PublicKey(mint);
261
263
 
@@ -279,6 +281,8 @@ async function main() {
279
281
  performanceFeeRatePercentage: new Decimal(0.0),
280
282
  managementFeeRatePercentage: new Decimal(0.0),
281
283
  name,
284
+ vaultTokenSymbol: tokenName,
285
+ vaultTokenName: extraTokenName,
282
286
  });
283
287
 
284
288
  const { vault: vaultKp, initVaultIxs: instructions } = await kaminoManager.createVaultIxs(kaminoVaultConfig);
@@ -294,9 +298,37 @@ async function main() {
294
298
  await sleep(2000);
295
299
  const _populateLUTSig = await processTxn(env.client, env.payer, instructions.populateLUTIxs, mode, 2500, []);
296
300
 
301
+ const _setSharesMetadataSig = await processTxn(
302
+ env.client,
303
+ env.payer,
304
+ [instructions.initSharesMetadataIx],
305
+ mode,
306
+ 2500,
307
+ []
308
+ );
297
309
  mode === 'execute' && console.log('Vault created:', vaultKp.publicKey.toBase58());
298
310
  });
299
311
 
312
+ commands
313
+ .command('set-shares-metadata')
314
+ .requiredOption('--vault <string>', 'Vault address')
315
+ .requiredOption('--symbol <string>', 'The symbol of the kVault token')
316
+ .requiredOption('--extraName <string>', 'The name of the kVault token, appended to the symbol')
317
+ .action(async ({ vault, symbol, extraName }) => {
318
+ const env = initializeClient(false, false);
319
+ const kVault = new KaminoVault(new PublicKey(vault));
320
+
321
+ const kaminoManager = new KaminoManager(
322
+ env.connection,
323
+ DEFAULT_RECENT_SLOT_DURATION_MS,
324
+ env.kLendProgramId,
325
+ env.kVaultProgramId
326
+ );
327
+ const ix = await kaminoManager.getSetSharesMetadataIx(kVault, symbol, extraName);
328
+
329
+ await processTxn(env.client, env.payer, [ix], 'execute', 2500, []);
330
+ });
331
+
300
332
  commands
301
333
  .command('update-vault-pending-admin')
302
334
  .requiredOption('--vault <string>', 'Vault address')
@@ -0,0 +1,115 @@
1
+ import { Connection, PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY, TransactionInstruction } from '@solana/web3.js';
2
+ import {
3
+ getKVaultSharesMetadataPda,
4
+ initializeSharesMetadata,
5
+ InitializeSharesMetadataAccounts,
6
+ InitializeSharesMetadataArgs,
7
+ METADATA_PROGRAM_ID,
8
+ updateSharesMetadata,
9
+ UpdateSharesMetadataAccounts,
10
+ UpdateSharesMetadataArgs,
11
+ } from '../lib';
12
+
13
+ export function resolveMetadata(
14
+ kTokenMint: PublicKey,
15
+ extra: string,
16
+ inputToken?: string,
17
+ inputName?: string,
18
+ inputSymbol?: string,
19
+ inputUri?: string
20
+ ): { name: string; symbol: string; uri: string } {
21
+ let name;
22
+ let symbol;
23
+ if (inputToken) {
24
+ const { name: resolvedName, symbol: resolvedSymbol } = resolveMetadataFromToken(inputToken, extra);
25
+ name = inputName ?? resolvedName;
26
+ symbol = inputSymbol ?? resolvedSymbol;
27
+ } else {
28
+ if (!inputSymbol) {
29
+ throw Error('Symbol required');
30
+ }
31
+ if (!inputName) {
32
+ throw Error('Name required');
33
+ }
34
+ name = inputName;
35
+ symbol = inputSymbol;
36
+ }
37
+ const uri = inputUri ?? resolveMetadataUriFromMint(kTokenMint);
38
+
39
+ return { name, symbol, uri };
40
+ }
41
+
42
+ export function resolveMetadataFromToken(token: string, extra: string): { name: string; symbol: string } {
43
+ console.log('token', token);
44
+ console.log('extra', extra);
45
+ const name = `Kamino Vault ${token} ${extra}`;
46
+ const symbol = `kV${token.toUpperCase()}`;
47
+ return { name, symbol };
48
+ }
49
+
50
+ export function resolveMetadataUriFromMint(mint: PublicKey): string {
51
+ return `https://api.kamino.finance/kvault-tokens/${mint.toBase58()}/metadata`;
52
+ }
53
+
54
+ export async function getInitializeKVaultSharesMetadataIx(
55
+ connection: Connection,
56
+ vaultAdmin: PublicKey,
57
+ vault: PublicKey,
58
+ sharesMint: PublicKey,
59
+ baseVaultAuthority: PublicKey,
60
+ name: string,
61
+ symbol: string,
62
+ uri: string
63
+ ): Promise<TransactionInstruction> {
64
+ const [sharesMintMetadata] = getKVaultSharesMetadataPda(sharesMint);
65
+
66
+ const args: InitializeSharesMetadataArgs = {
67
+ name,
68
+ symbol,
69
+ uri,
70
+ };
71
+
72
+ const accounts: InitializeSharesMetadataAccounts = {
73
+ vaultAdminAuthority: vaultAdmin,
74
+ vaultState: vault,
75
+ sharesMint,
76
+ baseVaultAuthority,
77
+ sharesMetadata: sharesMintMetadata,
78
+ systemProgram: SystemProgram.programId,
79
+ rent: SYSVAR_RENT_PUBKEY,
80
+ metadataProgram: METADATA_PROGRAM_ID,
81
+ };
82
+
83
+ const ix = initializeSharesMetadata(args, accounts);
84
+ return ix;
85
+ }
86
+
87
+ export async function getUpdateSharesMetadataIx(
88
+ connection: Connection,
89
+ vaultAdmin: PublicKey,
90
+ vault: PublicKey,
91
+ sharesMint: PublicKey,
92
+ baseVaultAuthority: PublicKey,
93
+ name: string,
94
+ symbol: string,
95
+ uri: string
96
+ ): Promise<TransactionInstruction> {
97
+ const [sharesMintMetadata] = getKVaultSharesMetadataPda(sharesMint);
98
+
99
+ const args: UpdateSharesMetadataArgs = {
100
+ name,
101
+ symbol,
102
+ uri,
103
+ };
104
+
105
+ const accounts: UpdateSharesMetadataAccounts = {
106
+ vaultAdminAuthority: vaultAdmin,
107
+ vaultState: vault,
108
+ baseVaultAuthority,
109
+ sharesMetadata: sharesMintMetadata,
110
+ metadataProgram: METADATA_PROGRAM_ID,
111
+ };
112
+
113
+ const ix = updateSharesMetadata(args, accounts);
114
+ return ix;
115
+ }
@@ -1,6 +1,7 @@
1
1
  import { PublicKey } from '@solana/web3.js';
2
2
  import { PROGRAM_ID } from '../idl_codegen/programId';
3
3
  import { farmsId } from '@kamino-finance/farms-sdk';
4
+ import { METADATA_PROGRAM_ID, METADATA_SEED } from '../classes/vault';
4
5
 
5
6
  /**
6
7
  * Lending market authority seed
@@ -204,3 +205,15 @@ export function obligationFarmStatePda(farm: PublicKey, obligation: PublicKey) {
204
205
  farmsId
205
206
  )[0];
206
207
  }
208
+
209
+ /**
210
+ * Returns the PDA for the kVault shares metadata
211
+ * @param mint
212
+ * @returns [pda, bump]
213
+ */
214
+ export function getKVaultSharesMetadataPda(mint: PublicKey): [PublicKey, number] {
215
+ return PublicKey.findProgramAddressSync(
216
+ [Buffer.from(METADATA_SEED), METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()],
217
+ METADATA_PROGRAM_ID
218
+ );
219
+ }