@kamino-finance/klend-sdk 5.13.2 → 5.13.5

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.
@@ -8,6 +8,7 @@ export type InitVaultIxs = {
8
8
  createLUTIx: TransactionInstruction;
9
9
  populateLUTIxs: TransactionInstruction[];
10
10
  cleanupIxs: TransactionInstruction[];
11
+ initSharesMetadataIx: TransactionInstruction;
11
12
  };
12
13
 
13
14
  export type AcceptVaultOwnershipIxs = {
@@ -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);
@@ -286,7 +290,7 @@ async function main() {
286
290
  const _createVaultSig = await processTxn(
287
291
  env.client,
288
292
  env.payer,
289
- [...instructions.initVaultIxs, instructions.createLUTIx],
293
+ [...instructions.initVaultIxs, instructions.createLUTIx, instructions.initSharesMetadataIx],
290
294
  mode,
291
295
  2500,
292
296
  [vaultKp]
@@ -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')
@@ -1054,12 +1086,15 @@ async function main() {
1054
1086
  vaultState.sharesMintDecimals.toString()
1055
1087
  );
1056
1088
 
1089
+ const vaultOverview = await kaminoManager.getVaultOverview(vaultState, new Decimal(1.0), slot);
1090
+
1057
1091
  console.log('farm', vaultState.vaultFarm.toString());
1058
1092
  console.log('vault token mint', vaultState.tokenMint.toBase58());
1059
1093
  console.log('Name: ', kaminoManager.getDecodedVaultName(kaminoVault.state!));
1060
1094
  console.log('Shares issued: ', sharesIssued);
1061
1095
  printHoldings(holdings);
1062
1096
  console.log(`Tokens per share for vault ${vaultAddress.toBase58()}: ${tokensPerShare}`);
1097
+ console.log('vaultOverview', vaultOverview);
1063
1098
  });
1064
1099
 
1065
1100
  commands.command('get-oracle-mappings').action(async () => {
@@ -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 = `kVault ${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
+ }