@0dotxyz/p0-ts-sdk 2.1.1 → 2.2.0-alpha.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.
package/dist/index.cjs CHANGED
@@ -15162,9 +15162,48 @@ var MintLayout = bufferLayout.struct([
15162
15162
  bufferLayoutUtils.publicKey("freezeAuthority")
15163
15163
  ]);
15164
15164
  MintLayout.span;
15165
+ var approveInstructionData = bufferLayout.struct([
15166
+ bufferLayout.u8("instruction"),
15167
+ bufferLayoutUtils.u64("amount")
15168
+ ]);
15169
+ function createApproveInstruction(account, delegate, owner, amount, multiSigners = [], programId = TOKEN_PROGRAM_ID) {
15170
+ const keys = addSigners(
15171
+ [
15172
+ { pubkey: account, isSigner: false, isWritable: true },
15173
+ { pubkey: delegate, isSigner: false, isWritable: false }
15174
+ ],
15175
+ owner,
15176
+ multiSigners
15177
+ );
15178
+ const data = buffer.Buffer.alloc(approveInstructionData.span);
15179
+ approveInstructionData.encode(
15180
+ {
15181
+ instruction: 4 /* Approve */,
15182
+ amount: BigInt(amount)
15183
+ },
15184
+ data
15185
+ );
15186
+ return new web3_js.TransactionInstruction({ keys, programId, data });
15187
+ }
15165
15188
  bufferLayout.struct([
15166
15189
  bufferLayout.u8("instruction")
15167
15190
  ]);
15191
+ function createAssociatedTokenAccountInstruction(payer, associatedToken, owner, mint, programId = TOKEN_PROGRAM_ID, associatedTokenProgramId = ASSOCIATED_TOKEN_PROGRAM_ID) {
15192
+ const keys = [
15193
+ { pubkey: payer, isSigner: true, isWritable: true },
15194
+ { pubkey: associatedToken, isSigner: false, isWritable: true },
15195
+ { pubkey: owner, isSigner: false, isWritable: false },
15196
+ { pubkey: mint, isSigner: false, isWritable: false },
15197
+ { pubkey: web3_js.SystemProgram.programId, isSigner: false, isWritable: false },
15198
+ { pubkey: programId, isSigner: false, isWritable: false },
15199
+ { pubkey: web3_js.SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }
15200
+ ];
15201
+ return new web3_js.TransactionInstruction({
15202
+ keys,
15203
+ programId: associatedTokenProgramId,
15204
+ data: buffer.Buffer.alloc(0)
15205
+ });
15206
+ }
15168
15207
  function createAssociatedTokenAccountIdempotentInstruction(payer, associatedToken, owner, mint, programId = TOKEN_PROGRAM_ID, associatedTokenProgramId = ASSOCIATED_TOKEN_PROGRAM_ID) {
15169
15208
  return buildAssociatedTokenAccountInstruction(
15170
15209
  payer,
@@ -43379,6 +43418,169 @@ new Fraction(new BN11__default.default(0));
43379
43418
  function roundNearest(decimal) {
43380
43419
  return decimal.toDecimalPlaces(0, Decimal3__default.default.ROUND_HALF_CEIL);
43381
43420
  }
43421
+ var SinglePoolInstruction = {
43422
+ initializePool: (voteAccount) => {
43423
+ const pool = findPoolAddress(voteAccount);
43424
+ const stake = findPoolStakeAddress(pool);
43425
+ const mint = findPoolMintAddress(pool);
43426
+ const stakeAuthority = findPoolStakeAuthorityAddress(pool);
43427
+ const mintAuthority = findPoolMintAuthorityAddress(pool);
43428
+ return createTransactionInstruction(
43429
+ SINGLE_POOL_PROGRAM_ID,
43430
+ [
43431
+ { pubkey: voteAccount, isSigner: false, isWritable: false },
43432
+ { pubkey: pool, isSigner: false, isWritable: true },
43433
+ { pubkey: stake, isSigner: false, isWritable: true },
43434
+ { pubkey: mint, isSigner: false, isWritable: true },
43435
+ { pubkey: stakeAuthority, isSigner: false, isWritable: false },
43436
+ { pubkey: mintAuthority, isSigner: false, isWritable: false },
43437
+ { pubkey: SYSVAR_RENT_ID, isSigner: false, isWritable: false },
43438
+ { pubkey: SYSVAR_CLOCK_ID, isSigner: false, isWritable: false },
43439
+ { pubkey: SYSVAR_STAKE_HISTORY_ID, isSigner: false, isWritable: false },
43440
+ { pubkey: web3_js.STAKE_CONFIG_ID, isSigner: false, isWritable: false },
43441
+ { pubkey: SYSTEM_PROGRAM_ID, isSigner: false, isWritable: false },
43442
+ { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
43443
+ { pubkey: STAKE_PROGRAM_ID, isSigner: false, isWritable: false }
43444
+ ],
43445
+ Buffer.from([0 /* InitializePool */])
43446
+ );
43447
+ },
43448
+ initializeOnRamp: (pool) => {
43449
+ const onRamp = findPoolOnRampAddress(pool);
43450
+ const stakeAuthority = findPoolStakeAuthorityAddress(pool);
43451
+ return createTransactionInstruction(
43452
+ SINGLE_POOL_PROGRAM_ID,
43453
+ [
43454
+ { pubkey: pool, isSigner: false, isWritable: false },
43455
+ { pubkey: onRamp, isSigner: false, isWritable: true },
43456
+ { pubkey: stakeAuthority, isSigner: false, isWritable: false },
43457
+ { pubkey: SYSVAR_RENT_ID, isSigner: false, isWritable: false },
43458
+ { pubkey: SYSTEM_PROGRAM_ID, isSigner: false, isWritable: false },
43459
+ { pubkey: STAKE_PROGRAM_ID, isSigner: false, isWritable: false }
43460
+ ],
43461
+ Buffer.from([6 /* InitializeOnRamp */])
43462
+ );
43463
+ },
43464
+ depositStake: async (pool, userStakeAccount, userTokenAccount, userLamportAccount) => {
43465
+ const stake = findPoolStakeAddress(pool);
43466
+ const mint = findPoolMintAddress(pool);
43467
+ const stakeAuthority = findPoolStakeAuthorityAddress(pool);
43468
+ const mintAuthority = findPoolMintAuthorityAddress(pool);
43469
+ return createTransactionInstruction(
43470
+ SINGLE_POOL_PROGRAM_ID,
43471
+ [
43472
+ { pubkey: pool, isSigner: false, isWritable: false },
43473
+ { pubkey: stake, isSigner: false, isWritable: true },
43474
+ { pubkey: mint, isSigner: false, isWritable: true },
43475
+ { pubkey: stakeAuthority, isSigner: false, isWritable: false },
43476
+ { pubkey: mintAuthority, isSigner: false, isWritable: false },
43477
+ { pubkey: userStakeAccount, isSigner: false, isWritable: true },
43478
+ { pubkey: userTokenAccount, isSigner: false, isWritable: true },
43479
+ { pubkey: userLamportAccount, isSigner: false, isWritable: true },
43480
+ { pubkey: SYSVAR_CLOCK_ID, isSigner: false, isWritable: false },
43481
+ { pubkey: SYSVAR_STAKE_HISTORY_ID, isSigner: false, isWritable: false },
43482
+ { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
43483
+ { pubkey: STAKE_PROGRAM_ID, isSigner: false, isWritable: false }
43484
+ ],
43485
+ Buffer.from([2 /* DepositStake */])
43486
+ );
43487
+ },
43488
+ withdrawStake: async (pool, userStakeAccount, userStakeAuthority, userTokenAccount, tokenAmount) => {
43489
+ const stake = findPoolStakeAddress(pool);
43490
+ const mint = findPoolMintAddress(pool);
43491
+ const stakeAuthority = findPoolStakeAuthorityAddress(pool);
43492
+ const mintAuthority = findPoolMintAuthorityAddress(pool);
43493
+ const rawAmount = BigInt(tokenAmount.multipliedBy(1e9).toString());
43494
+ const data = Buffer.concat([
43495
+ Buffer.from([3 /* WithdrawStake */]),
43496
+ userStakeAuthority.toBuffer(),
43497
+ Buffer.from(new BN11.BN(rawAmount.toString()).toArray("le", 8))
43498
+ ]);
43499
+ return createTransactionInstruction(
43500
+ SINGLE_POOL_PROGRAM_ID,
43501
+ [
43502
+ { pubkey: pool, isSigner: false, isWritable: false },
43503
+ { pubkey: stake, isSigner: false, isWritable: true },
43504
+ { pubkey: mint, isSigner: false, isWritable: true },
43505
+ { pubkey: stakeAuthority, isSigner: false, isWritable: false },
43506
+ { pubkey: mintAuthority, isSigner: false, isWritable: false },
43507
+ { pubkey: userStakeAccount, isSigner: false, isWritable: true },
43508
+ { pubkey: userTokenAccount, isSigner: false, isWritable: true },
43509
+ { pubkey: SYSVAR_CLOCK_ID, isSigner: false, isWritable: false },
43510
+ { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
43511
+ { pubkey: STAKE_PROGRAM_ID, isSigner: false, isWritable: false }
43512
+ ],
43513
+ data
43514
+ );
43515
+ },
43516
+ createTokenMetadata: async (pool, payer) => {
43517
+ const mint = findPoolMintAddress(pool);
43518
+ const [mintAuthority, mplAuthority, mplMetadata] = await Promise.all([
43519
+ findPoolMintAuthorityAddress(pool),
43520
+ findPoolMplAuthorityAddress(pool),
43521
+ findMplMetadataAddress(mint)
43522
+ ]);
43523
+ return createTransactionInstruction(
43524
+ SINGLE_POOL_PROGRAM_ID,
43525
+ [
43526
+ { pubkey: pool, isSigner: false, isWritable: false },
43527
+ { pubkey: mint, isSigner: false, isWritable: false },
43528
+ { pubkey: mintAuthority, isSigner: false, isWritable: false },
43529
+ { pubkey: mplAuthority, isSigner: false, isWritable: false },
43530
+ { pubkey: payer, isSigner: true, isWritable: true },
43531
+ { pubkey: mplMetadata, isSigner: false, isWritable: true },
43532
+ { pubkey: MPL_METADATA_PROGRAM_ID, isSigner: false, isWritable: false },
43533
+ { pubkey: SYSTEM_PROGRAM_ID, isSigner: false, isWritable: false }
43534
+ ],
43535
+ Buffer.from([4 /* CreateTokenMetadata */])
43536
+ );
43537
+ },
43538
+ updateTokenMetadata: async (voteAccount, authorizedWithdrawer, tokenName, tokenSymbol, tokenUri = "") => {
43539
+ if (tokenName.length > 32) {
43540
+ throw new Error("maximum token name length is 32 characters");
43541
+ }
43542
+ if (tokenSymbol.length > 10) {
43543
+ throw new Error("maximum token symbol length is 10 characters");
43544
+ }
43545
+ if (tokenUri.length > 200) {
43546
+ throw new Error("maximum token uri length is 200 characters");
43547
+ }
43548
+ const pool = findPoolAddress(voteAccount);
43549
+ const [mint, mplAuthority] = await Promise.all([
43550
+ findPoolMintAddress(pool),
43551
+ findPoolMplAuthorityAddress(pool)
43552
+ ]);
43553
+ const mplMetadata = await findMplMetadataAddress(mint);
43554
+ const data = Buffer.concat([
43555
+ Buffer.from([5 /* UpdateTokenMetadata */]),
43556
+ Buffer.from(new Uint32Array([tokenName.length]).buffer),
43557
+ Buffer.from(tokenName),
43558
+ Buffer.from(new Uint32Array([tokenSymbol.length]).buffer),
43559
+ Buffer.from(tokenSymbol),
43560
+ Buffer.from(new Uint32Array([tokenUri.length]).buffer),
43561
+ Buffer.from(tokenUri)
43562
+ ]);
43563
+ return createTransactionInstruction(
43564
+ SINGLE_POOL_PROGRAM_ID,
43565
+ [
43566
+ { pubkey: voteAccount, isSigner: false, isWritable: false },
43567
+ { pubkey: pool, isSigner: false, isWritable: false },
43568
+ { pubkey: mplAuthority, isSigner: false, isWritable: false },
43569
+ { pubkey: authorizedWithdrawer, isSigner: true, isWritable: false },
43570
+ { pubkey: mplMetadata, isSigner: false, isWritable: true },
43571
+ { pubkey: MPL_METADATA_PROGRAM_ID, isSigner: false, isWritable: false }
43572
+ ],
43573
+ data
43574
+ );
43575
+ }
43576
+ };
43577
+ var createTransactionInstruction = (programId, keys, data) => {
43578
+ return {
43579
+ programId,
43580
+ keys,
43581
+ data
43582
+ };
43583
+ };
43382
43584
  var findPda = (baseAddress, prefix, programId = SINGLE_POOL_PROGRAM_ID) => {
43383
43585
  const [pda] = web3_js.PublicKey.findProgramAddressSync(
43384
43586
  [Buffer.from(prefix), baseAddress.toBuffer()],
@@ -43389,7 +43591,17 @@ var findPda = (baseAddress, prefix, programId = SINGLE_POOL_PROGRAM_ID) => {
43389
43591
  var findPoolAddress = (voteAccountAddress) => findPda(voteAccountAddress, "pool");
43390
43592
  var findPoolMintAddress = (poolAddress) => findPda(poolAddress, "mint");
43391
43593
  var findPoolStakeAddress = (poolAddress) => findPda(poolAddress, "stake");
43594
+ var findPoolStakeAuthorityAddress = (poolAddress) => findPda(poolAddress, "stake_authority");
43595
+ var findPoolMintAuthorityAddress = (poolAddress) => findPda(poolAddress, "mint_authority");
43596
+ var findPoolMplAuthorityAddress = (poolAddress) => findPda(poolAddress, "mpl_authority");
43392
43597
  var findPoolOnRampAddress = (poolAddress) => findPda(poolAddress, "onramp");
43598
+ var findMplMetadataAddress = async (poolMintAddress) => {
43599
+ const [pda] = web3_js.PublicKey.findProgramAddressSync(
43600
+ [Buffer.from("metadata"), MPL_METADATA_PROGRAM_ID.toBuffer(), poolMintAddress.toBuffer()],
43601
+ MPL_METADATA_PROGRAM_ID
43602
+ );
43603
+ return pda;
43604
+ };
43393
43605
  BigInt(33);
43394
43606
  BigInt(200);
43395
43607
  BigInt(82);
@@ -48025,6 +48237,179 @@ async function buildSwapDebtFlashloanTx({
48025
48237
  }
48026
48238
  throw new Error("Failed to build swap debt flashloan tx");
48027
48239
  }
48240
+ var SYSVAR_CLOCK_ID2 = new web3_js.PublicKey("SysvarC1ock11111111111111111111111111111111");
48241
+ async function makeMintStakedLstIx(params) {
48242
+ const { amount, authority, stakeAccountPk, validator, connection } = params;
48243
+ const pool = findPoolAddress(validator);
48244
+ const lstMint = findPoolMintAddress(pool);
48245
+ const poolStakeAuth = findPoolStakeAuthorityAddress(pool);
48246
+ const lstAta = getAssociatedTokenAddressSync(lstMint, authority);
48247
+ const [lstAccInfo, stakeAccInfoParsed, rentExemptReserve] = await Promise.all([
48248
+ connection.getAccountInfo(lstAta),
48249
+ connection.getParsedAccountInfo(stakeAccountPk),
48250
+ connection.getMinimumBalanceForRentExemption(web3_js.StakeProgram.space)
48251
+ ]);
48252
+ const stakeAccParsed = stakeAccInfoParsed?.value?.data;
48253
+ const amountLamports = Math.round(Number(amount) * web3_js.LAMPORTS_PER_SOL);
48254
+ const stakeAccLamports = Number(stakeAccParsed?.parsed?.info?.stake?.delegation?.stake ?? 0);
48255
+ const isFullStake = amountLamports >= stakeAccLamports;
48256
+ const instructions2 = [];
48257
+ const signers = [];
48258
+ if (!lstAccInfo) {
48259
+ instructions2.push(
48260
+ createAssociatedTokenAccountInstruction(authority, lstAta, authority, lstMint)
48261
+ );
48262
+ }
48263
+ let targetStakePubkey;
48264
+ if (!isFullStake) {
48265
+ const splitStakeAccount = web3_js.Keypair.generate();
48266
+ signers.push(splitStakeAccount);
48267
+ targetStakePubkey = splitStakeAccount.publicKey;
48268
+ instructions2.push(
48269
+ ...web3_js.StakeProgram.split(
48270
+ {
48271
+ stakePubkey: stakeAccountPk,
48272
+ authorizedPubkey: authority,
48273
+ splitStakePubkey: splitStakeAccount.publicKey,
48274
+ lamports: amountLamports
48275
+ },
48276
+ rentExemptReserve
48277
+ ).instructions
48278
+ );
48279
+ } else {
48280
+ targetStakePubkey = stakeAccountPk;
48281
+ }
48282
+ const [authorizeStakerIx, authorizeWithdrawIx] = await Promise.all([
48283
+ web3_js.StakeProgram.authorize({
48284
+ stakePubkey: targetStakePubkey,
48285
+ authorizedPubkey: authority,
48286
+ newAuthorizedPubkey: poolStakeAuth,
48287
+ stakeAuthorizationType: web3_js.StakeAuthorizationLayout.Staker
48288
+ }).instructions,
48289
+ web3_js.StakeProgram.authorize({
48290
+ stakePubkey: targetStakePubkey,
48291
+ authorizedPubkey: authority,
48292
+ newAuthorizedPubkey: poolStakeAuth,
48293
+ stakeAuthorizationType: web3_js.StakeAuthorizationLayout.Withdrawer
48294
+ }).instructions
48295
+ ]);
48296
+ [authorizeStakerIx[0], authorizeWithdrawIx[0]].forEach((ix) => {
48297
+ if (ix) {
48298
+ ix.keys = ix.keys.map((key) => ({
48299
+ ...key,
48300
+ isWritable: key.pubkey.equals(SYSVAR_CLOCK_ID2) ? false : key.isWritable
48301
+ }));
48302
+ }
48303
+ });
48304
+ instructions2.push(...authorizeStakerIx, ...authorizeWithdrawIx);
48305
+ const depositStakeIx = await SinglePoolInstruction.depositStake(
48306
+ pool,
48307
+ targetStakePubkey,
48308
+ lstAta,
48309
+ authority
48310
+ );
48311
+ instructions2.push(depositStakeIx);
48312
+ return { instructions: instructions2, keys: signers };
48313
+ }
48314
+ async function makeMintStakedLstTx(params) {
48315
+ const { connection, luts, blockhash: providedBlockhash } = params;
48316
+ const { instructions: instructions2, keys } = await makeMintStakedLstIx(params);
48317
+ const blockhash = providedBlockhash ?? (await connection.getLatestBlockhash("confirmed")).blockhash;
48318
+ const message = new web3_js.TransactionMessage({
48319
+ payerKey: params.authority,
48320
+ recentBlockhash: blockhash,
48321
+ instructions: instructions2
48322
+ }).compileToV0Message(luts);
48323
+ const tx = new web3_js.VersionedTransaction(message);
48324
+ return addTransactionMetadata(tx, {
48325
+ signers: keys,
48326
+ addressLookupTables: luts,
48327
+ type: "DEPOSIT_STAKE" /* DEPOSIT_STAKE */
48328
+ });
48329
+ }
48330
+ async function makeRedeemStakedLstIx(params) {
48331
+ const { amount, authority, validator, connection } = params;
48332
+ const pool = findPoolAddress(validator);
48333
+ const lstMint = findPoolMintAddress(pool);
48334
+ const mintAuthority = findPoolMintAuthorityAddress(pool);
48335
+ const lstAta = getAssociatedTokenAddressSync(lstMint, authority);
48336
+ const rentExemption = await connection.getMinimumBalanceForRentExemption(
48337
+ web3_js.StakeProgram.space
48338
+ );
48339
+ const stakeAmount = new BigNumber3__default.default(new BigNumber3__default.default(amount).toString());
48340
+ const instructions2 = [];
48341
+ const signers = [];
48342
+ const stakeAccount = web3_js.Keypair.generate();
48343
+ signers.push(stakeAccount);
48344
+ instructions2.push(
48345
+ web3_js.SystemProgram.createAccount({
48346
+ fromPubkey: authority,
48347
+ newAccountPubkey: stakeAccount.publicKey,
48348
+ lamports: rentExemption,
48349
+ space: web3_js.StakeProgram.space,
48350
+ programId: web3_js.StakeProgram.programId
48351
+ })
48352
+ );
48353
+ instructions2.push(
48354
+ createApproveInstruction(
48355
+ lstAta,
48356
+ mintAuthority,
48357
+ authority,
48358
+ BigInt(stakeAmount.multipliedBy(1e9).toFixed(0))
48359
+ )
48360
+ );
48361
+ const withdrawStakeIx = await SinglePoolInstruction.withdrawStake(
48362
+ pool,
48363
+ stakeAccount.publicKey,
48364
+ authority,
48365
+ lstAta,
48366
+ stakeAmount
48367
+ );
48368
+ instructions2.push(withdrawStakeIx);
48369
+ return { instructions: instructions2, keys: signers };
48370
+ }
48371
+ async function makeRedeemStakedLstTx(params) {
48372
+ const { connection, luts, blockhash: providedBlockhash } = params;
48373
+ const { instructions: instructions2, keys } = await makeRedeemStakedLstIx(params);
48374
+ const blockhash = providedBlockhash ?? (await connection.getLatestBlockhash("confirmed")).blockhash;
48375
+ const message = new web3_js.TransactionMessage({
48376
+ payerKey: params.authority,
48377
+ recentBlockhash: blockhash,
48378
+ instructions: instructions2
48379
+ }).compileToV0Message(luts);
48380
+ const tx = new web3_js.VersionedTransaction(message);
48381
+ return addTransactionMetadata(tx, {
48382
+ signers: keys,
48383
+ addressLookupTables: luts,
48384
+ type: "WITHDRAW_STAKE" /* WITHDRAW_STAKE */
48385
+ });
48386
+ }
48387
+ async function makeMergeStakeAccountsTx(params) {
48388
+ const {
48389
+ authority,
48390
+ sourceStakeAccount,
48391
+ destinationStakeAccount,
48392
+ connection,
48393
+ luts,
48394
+ blockhash: providedBlockhash
48395
+ } = params;
48396
+ const mergeIx = web3_js.StakeProgram.merge({
48397
+ stakePubkey: destinationStakeAccount,
48398
+ sourceStakePubKey: sourceStakeAccount,
48399
+ authorizedPubkey: authority
48400
+ }).instructions;
48401
+ const blockhash = providedBlockhash ?? (await connection.getLatestBlockhash("confirmed")).blockhash;
48402
+ const message = new web3_js.TransactionMessage({
48403
+ payerKey: authority,
48404
+ recentBlockhash: blockhash,
48405
+ instructions: mergeIx
48406
+ }).compileToV0Message(luts);
48407
+ const tx = new web3_js.VersionedTransaction(message);
48408
+ return addTransactionMetadata(tx, {
48409
+ addressLookupTables: luts,
48410
+ type: "MERGE_STAKE_ACCOUNTS" /* MERGE_STAKE_ACCOUNTS */
48411
+ });
48412
+ }
48028
48413
 
48029
48414
  // src/services/account/services/account-simulation.service.ts
48030
48415
  async function simulateAccountHealthCacheWithFallback(params) {
@@ -49435,18 +49820,15 @@ var fetchPythOracleData = async (banks, opts) => {
49435
49820
  bankOraclePriceMap: /* @__PURE__ */ new Map()
49436
49821
  };
49437
49822
  }
49438
- pythStakedCollateralBanks.map((bank) => [
49439
- opts.validatorVoteAccountByBank?.[bank.address.toBase58()] ?? "",
49440
- bank.mint.toBase58()
49441
- ]);
49442
- const priceCoeffByBank = {};
49443
49823
  const combinedPythBanks = [
49444
49824
  ...pythPushBanks,
49825
+ ...pythStakedCollateralBanks,
49445
49826
  ...pythPushKaminosBanks,
49446
49827
  ...driftPythPullBanks,
49447
49828
  ...solendPythPullBanks,
49448
49829
  ...juplendPythPullBanks
49449
49830
  ];
49831
+ const priceCoeffByBank = {};
49450
49832
  const pythOracleKeys = extractPythOracleKeys(combinedPythBanks);
49451
49833
  const uniquePythOracleKeys = Array.from(new Set(pythOracleKeys));
49452
49834
  let oraclePrices;
@@ -50651,6 +51033,389 @@ function dtoToValidatorStakeGroup(validatorStakeGroupDto) {
50651
51033
  }))
50652
51034
  };
50653
51035
  }
51036
+
51037
+ // src/services/native-stake/utils/metadata.data.ts
51038
+ var STAKED_BANK_METADATA_JSON = [
51039
+ {
51040
+ bankAddress: "8g5qG6PVygcVSXV1cJnjXaD1yhrDwcWAMQCY2wR9VuAf",
51041
+ validatorVoteAccount: "CooLbbZy5Xmdt7DiHPQ3ss2uRXawnTXXVgpMS8E8jDzr",
51042
+ tokenAddress: "BADo3D6nMtGnsAaTv3iEes8mMcq92TuFoBWebFe8kzeA",
51043
+ tokenName: "Cavey Cool",
51044
+ tokenSymbol: "COOL"
51045
+ },
51046
+ {
51047
+ bankAddress: "BuCckNm1djpp3vZVhvh1CrrniirY6sr2hwUmeP5kTcGz",
51048
+ validatorVoteAccount: "mrgn4t2JabSgvGnrCaHXMvz8ocr4F52scsxJnkQMQsQ",
51049
+ tokenAddress: "FUyAyVbYrMfiaN1QEQYFZTuBNzW5EJf3jWzjjymGqKLv",
51050
+ tokenName: "Project 0 Meridian",
51051
+ tokenSymbol: "MERIDIAN"
51052
+ },
51053
+ {
51054
+ bankAddress: "Hco1P3dGRXz3ZGFvMkbDgghZQy47Tp7vp7koSYRvP6nm",
51055
+ validatorVoteAccount: "mrgn6ETrBDM8mjjYN8rbVwFqVwF8z6rtmvGLbdGuVUU",
51056
+ tokenAddress: "A4B5MGQvcZCUqeiUEAB4ckZ2tvH2UmEg31vF7TiERDkH",
51057
+ tokenName: "MRGN 3",
51058
+ tokenSymbol: "MRGN3"
51059
+ },
51060
+ {
51061
+ bankAddress: "EPh2abWP8DusPH8myWnECAAeQUZgAz927aMbmwXt3eRY",
51062
+ validatorVoteAccount: "mrgn2vsZ5EJ8YEfAMNPXmRux7th9cNfBasQ1JJvVwPn",
51063
+ tokenAddress: "6Mt7tBWLUJfDxqCFTsjoRXF9wD55g4Lhs5nAyYp244pX",
51064
+ tokenName: "Project 0 Horizon",
51065
+ tokenSymbol: "HORIZON"
51066
+ },
51067
+ {
51068
+ bankAddress: "6wjAwhnxTMEzHk8NNHVXgkx1jSrb6TX1bC17j3S56FfB",
51069
+ validatorVoteAccount: "3N7s9zXMZ4QqvHQR15t5GNHyqc89KduzMP7423eWiD5g",
51070
+ tokenAddress: "DKPvRV4dxUejjGpr2XwFmzZbbbTD7vx9Jmt1kk43n4d5",
51071
+ tokenName: "Binance",
51072
+ tokenSymbol: "BINANCE"
51073
+ },
51074
+ {
51075
+ bankAddress: "J9tksvZEDSwtNtZ6yxYjWDDkzhPbwDMnihU61NkFG9FE",
51076
+ validatorVoteAccount: "he1iusunGwqrNtafDtLdhsUQDFvo13z9sUa36PauBtk",
51077
+ tokenAddress: "2k79y8CApbU9jAvWhLS2j6uRbaVjpLJTUzstBTho9vGq",
51078
+ tokenName: "Helius",
51079
+ tokenSymbol: "HELIUS"
51080
+ },
51081
+ {
51082
+ bankAddress: "Dfr6Sf44ftecaJaoJMzFQABdkt3CEHfBwut1WyacRzaE",
51083
+ validatorVoteAccount: "SLaYv7tCwetrFGbPCRnqpHswG5qqKino78EYpbGF7xY",
51084
+ tokenAddress: "Vsw4JT33S7bLbhjySMMyrP3JKvTAcNi9WG5Doekrmgg",
51085
+ tokenName: "Solayer",
51086
+ tokenSymbol: "SOLAYER"
51087
+ },
51088
+ {
51089
+ bankAddress: "BZAm4qGscR8gg5bmWrEq6BTofgaZPbg7Fwfa7rFghEXL",
51090
+ validatorVoteAccount: "J1to3PQfXidUUhprQWgdKkQAMWPJAEqSJ7amkBDE9qhF",
51091
+ tokenAddress: "6B8hZSupE5mcACmjzozP6C1DR2uaCCtmrGqcYWC6SBCc",
51092
+ tokenName: "Bonk",
51093
+ tokenSymbol: "BONK"
51094
+ },
51095
+ {
51096
+ bankAddress: "3UrMZ26NRKu2y6c2dPE7gZVHwEmhpwKLcWACg3tjCVEt",
51097
+ validatorVoteAccount: "J2nUHEAgZFRyuJbFjdqPrAa9gyWDuc7hErtDQHPhsYRp",
51098
+ tokenAddress: "9M7oMo4oL6RDPG7WbAX3Zz4dPzbMgpiCzwrQPMwG4Wgq",
51099
+ tokenName: "Phantom",
51100
+ tokenSymbol: "PHANTOM"
51101
+ },
51102
+ {
51103
+ bankAddress: "8c269gkonvATm93nviuYiriCQ829f7ypx3aScYDR1YoQ",
51104
+ validatorVoteAccount: "D3QPJm7BDzzPeRG51YZSEz3LfV7GvFNu9NkcibzURxuj",
51105
+ tokenAddress: "8hXCCQmYFcDhU5Mkuvyixp2Q11sbyQComkceSSh3GY4a",
51106
+ tokenName: "Starke Finance",
51107
+ tokenSymbol: "STARKE"
51108
+ },
51109
+ {
51110
+ bankAddress: "37tiA2NTF6YCt85XzCidPo9ZVpuqkkmfVJCYQ5Yx5Uhs",
51111
+ validatorVoteAccount: "SBLZib4npE7svxFA7AsD3ytdQAfYNb39c8zsU82AA2E",
51112
+ tokenAddress: "96rXgCFy1Er49169XoKHkeLiKC2k4bTy1641q1TVrMm2",
51113
+ tokenName: "SolBlaze Validator",
51114
+ tokenSymbol: "SOLBLAZE"
51115
+ },
51116
+ {
51117
+ bankAddress: "J9trpcrVdFjVNg6VFrdF1XPGgjftQKZhbbWsxertdv9V",
51118
+ validatorVoteAccount: "FACqsS19VScz8oo2YhdMg35EsAy6xsCZ9Y58eJXGv8QJ",
51119
+ tokenAddress: "AH6fxpHS2gtMtJgBy8y8pEAPkqyop2pSugF6REs9NaTp",
51120
+ tokenName: "Lantern",
51121
+ tokenSymbol: "LNTRN"
51122
+ },
51123
+ {
51124
+ bankAddress: "EGTfrYiuWpPPZ4yfY9tCxnK6QMkY7pzVie9DxK772iGe",
51125
+ validatorVoteAccount: "EfnywDKqArxK6N6FS9ctsuzNdxfx3pzfXEQE5EevQ1SV",
51126
+ tokenAddress: "FcXEwHku68ZquqtSj1eSWS1SVWkhAZSyb4usfpiuEJAL",
51127
+ tokenName: "PROJECT SUPER",
51128
+ tokenSymbol: "SUPER"
51129
+ },
51130
+ {
51131
+ bankAddress: "A5e7UTE3g11ZfKgftqRCvxAgcDuFGyeDjMka96zJWSWe",
51132
+ validatorVoteAccount: "3ZUQekqiZoybB57y49eqtvSaoonqDwuNbeqEGwN88JkQ",
51133
+ tokenAddress: "F1XPjtpsEy23Q7po4JkWjp1jkDZcvFYSrqD8TR1YL3EF",
51134
+ tokenName: "Paws",
51135
+ tokenSymbol: "PAWS"
51136
+ },
51137
+ {
51138
+ bankAddress: "91jkdp4cF8vCDhjwude3SGSGrmVWFk5vTAtR6fsGVAfy",
51139
+ validatorVoteAccount: "gangtRyGPTvYWb8K3xS2feJQaCks4iJ7rytFUPtVqSY",
51140
+ tokenAddress: "6ZS7ZVDw91BVAC8gsz3SZBSeVeF2GtXtL2BHK31Kvyjm",
51141
+ tokenName: "Lotus Validator",
51142
+ tokenSymbol: "LOTUS"
51143
+ },
51144
+ {
51145
+ bankAddress: "72BS34HkCgq8RWQR7kuVVmiJMtKqSxG4CHX6ZXpSCwg7",
51146
+ validatorVoteAccount: "oRAnGeU5h8h2UkvbfnE5cjXnnAa4rBoaxmS4kbFymSe",
51147
+ tokenAddress: "9yF8pXctzicum2P73uuk4Dhqf2MVz6tzRAe8THGXCJcp",
51148
+ tokenName: "Orangefin Ventures",
51149
+ tokenSymbol: "ORANGEFIN"
51150
+ },
51151
+ {
51152
+ bankAddress: "8F4DsU3NMFunUxBZkWrpYR8zwhAfoAt7QuiEPMtyhWvX",
51153
+ validatorVoteAccount: "3xjfK9C9YNcta8MvK1US4sQ3bc6DEjoJoR3qLExGf9xE",
51154
+ tokenAddress: "Akib1NYJzzh9HkiDH41S2LUefUmR1bKsk65xgqUcW5C5",
51155
+ tokenName: "pico\u{1F644}.sol",
51156
+ tokenSymbol: "PICO"
51157
+ },
51158
+ {
51159
+ bankAddress: "GdtggomQth6cxuYPdiVhBbcX7VC9rnDDwLMfxipxE2Po",
51160
+ validatorVoteAccount: "oPaLTmyvoUhW26QCMwLA5JNUeBYy72PDpFoXQF8SeX4",
51161
+ tokenAddress: "C71A3W7g5XALUNwTDWTwHX3qhfypaYZ41aNZjBpcaC9D",
51162
+ tokenName: "Temporal Opal",
51163
+ tokenSymbol: "OPAL"
51164
+ },
51165
+ {
51166
+ bankAddress: "5sJCKePwAhyD3mzrzLRDM2PkFMc85nnvvarxHLsvWvpg",
51167
+ validatorVoteAccount: "9jYFwBfbjYmvasFbJyES9apLJDTkwtbgSDRWanHEvcRw",
51168
+ tokenAddress: "Hj69K1WbnfZFipLbrzdxgGhDqCR47q48bN5nUHt6xQZo",
51169
+ tokenName: "WATCHTOWER",
51170
+ tokenSymbol: "WATCHTOWER"
51171
+ },
51172
+ {
51173
+ bankAddress: "3F3QXT3BtkegaBfFjn2odKLurFYLHJHJ99xKV2TRTvrk",
51174
+ validatorVoteAccount: "6JfBwvcz5QUKQJ37BMKTLrf968DDJBtwoZLw19aHwFtQ",
51175
+ tokenAddress: "8FqX86cQofBHReetZgxrxxvzN4iqMVsj2hbiv7pj2h73",
51176
+ tokenName: "Spectrum Staking",
51177
+ tokenSymbol: "SPECTRUM"
51178
+ },
51179
+ {
51180
+ bankAddress: "CFmvdtEPQJPVqS1QRkeRcdQm2itAPk6k8hSJbmt88Sjc",
51181
+ validatorVoteAccount: "Haz7b47sZBpxh9SwggGndN3fAyNQ1S949BPdxWXS3ab6",
51182
+ tokenAddress: "38ZUTefZnKSUJU3wxpUe3xpiw2j5WQPnmzSTNbS1JqLA",
51183
+ tokenName: "Temporal Emerald",
51184
+ tokenSymbol: "EMERALD"
51185
+ },
51186
+ {
51187
+ bankAddress: "CmBDHSVuodmUnanbBVFvY9cauLeosbdFQn9bJANMVYUG",
51188
+ validatorVoteAccount: "mintrNtxN3PhAB45Pt41XqyKghTTpqcoBkQTZqh96iR",
51189
+ tokenAddress: "GxGmv7s7s2co3pLZukns946fr5zmR8c5buWRD9prGd6v",
51190
+ tokenName: "Hanabi Staking",
51191
+ tokenSymbol: "haSOLmrgn"
51192
+ },
51193
+ {
51194
+ bankAddress: "7bLfrb4fWVYkVpZ9rg7dBUwKRAqLyiivCW4ahMMGcKyS",
51195
+ validatorVoteAccount: "76DafWkJ6pGK2hoD41HjrM4xTBhfKqrDYDazv13n5ir1",
51196
+ tokenAddress: "GT7n9uZbYzHv52YqDBowtZ5ZVW91umaBQTNPFQNeLUpR",
51197
+ tokenName: "Solana Japan Validator",
51198
+ tokenSymbol: "SolJAPAn"
51199
+ },
51200
+ {
51201
+ bankAddress: "6q5DB86DhCBQt5bqzZwgopV8EA96aCnngu5ebR1ooDFq",
51202
+ validatorVoteAccount: "Cue647T8jgwpRSDUb8ttTYx7NiEfJCRZNiiw1qmchXsG",
51203
+ tokenAddress: "EAR6LenhNstHxR9289rWakm82WgLJYvHD7NawfXtuyUx",
51204
+ tokenName: "KIWAMI",
51205
+ tokenSymbol: "KIWAMI"
51206
+ },
51207
+ {
51208
+ bankAddress: "GLSCJ39N82Xo21621jMheinvjQLrBrkG7gzo2C5L1y6y",
51209
+ validatorVoteAccount: "7emL18Bnve7wbYE9Az7vYJjikxN6YPU81igf6rVU5FN8",
51210
+ tokenAddress: "EQuMUgLZArKwWUk6uGPmTGYUgNbfgJrbBaNR7CQyZ5uf",
51211
+ tokenName: "Temporal Topaz",
51212
+ tokenSymbol: "TOPAZ"
51213
+ },
51214
+ {
51215
+ bankAddress: "4irzCCsU53ffh9XB7NxGzbbHjvSR7FTfPbn6KoXkt7kX",
51216
+ validatorVoteAccount: "2iWXwF2Q5W6o7yntV2mkbxncB4rYHnX61y3NU8a8EFMJ",
51217
+ tokenAddress: "14Pets6QpE9iXKkXg8Ri4GcDazRMfWR3guM6LZXnFChc",
51218
+ tokenName: "Bull Moose SOL",
51219
+ tokenSymbol: "bmsSOL"
51220
+ },
51221
+ {
51222
+ bankAddress: "C96do7nkEaaFjHq8jHzPpyPTdJSea5xEGwxDzDSepCzf",
51223
+ validatorVoteAccount: "voteRnv6PBzmiGP8NicWtQiqEJTwKKq2SxtqtdLUJjd",
51224
+ tokenAddress: "3YEDiJ4r4xRGNhq6nudRnkwrdKHG7PAtDim24CjTMtBH",
51225
+ tokenName: "diman",
51226
+ tokenSymbol: "DIMAN"
51227
+ },
51228
+ {
51229
+ bankAddress: "9dZiyG51FBR4BWpAs69XbDpr7GfVAEB1ZB89v38maV36",
51230
+ validatorVoteAccount: "Simpj3KyRQmpRkXuBvCQFS7DBBG6vqw93SkZb9UD1hp",
51231
+ tokenAddress: "77YLpVLQXr2KU66GM2JykbT9g5du7LarWgehbWD3CJaB",
51232
+ tokenName: "SIMPDIGIT",
51233
+ tokenSymbol: "SIMPDIGIT"
51234
+ },
51235
+ {
51236
+ bankAddress: "2foqT8wWzWRduyV37uRdj81DijkNMKzYD3D6JPfir7La",
51237
+ validatorVoteAccount: "48oxpSHQkM4sdXUY9NQ8KnEtebzZbyk8uUT7JRdVQNuf",
51238
+ tokenAddress: "42m7Ygk5VxREdKfcFrsH1HnuoqCke8BcVcxNeywMCfp2",
51239
+ tokenName: "Infinite Lux",
51240
+ tokenSymbol: "LUX"
51241
+ },
51242
+ {
51243
+ bankAddress: "FsdWEJzHXkUXejWnb7c1p9UJtF69hVWQNNoakjoXyRCJ",
51244
+ validatorVoteAccount: "4AUED4uj6nSTuANzaAUnGBPJQRmhpDYDwoWJNkoUUBBW",
51245
+ tokenAddress: "CiyQTfHJ9PbTwC7TGf4pXZk8szcWGJ8TeFhhCuUwybqi",
51246
+ tokenName: "Anagram",
51247
+ tokenSymbol: "ANAGRAM"
51248
+ },
51249
+ {
51250
+ bankAddress: "2hs1pHAzDWGqnn1d8VQkc8bZRfQ45grYvzfau8dnWFUk",
51251
+ validatorVoteAccount: "2NxEEbhqqj1Qptq5LXLbDTP5tLa9f7PqkU8zNgxbGU9P",
51252
+ tokenAddress: "9yQLxEzusZ7QiZNafDNdzbEaTCPuJToGjMhLRJtZbgsd",
51253
+ tokenName: "NANSEN",
51254
+ tokenSymbol: "NANSEN"
51255
+ },
51256
+ {
51257
+ bankAddress: "FCi8unSVCwJd3QkrhTtv6LTTjw1c4zV65D5cG5N1rAG6",
51258
+ validatorVoteAccount: "Va1idkzkB6LEmVFmxWbWU8Ao9qehC62Tjmf68L3uYKj",
51259
+ tokenAddress: "AExKb8oJ6mGPYJUyfiX49DMMi226h2AnWeG1G6neQBEz",
51260
+ tokenName: "VALIDATOR",
51261
+ tokenSymbol: "VALID"
51262
+ },
51263
+ {
51264
+ bankAddress: "HzS8RqaQ5syk6EHbVi7h9rFYN48PpxykUXEs6w9wNfNP",
51265
+ validatorVoteAccount: "sTach38ebT8jnGH8i2D1g8NDAS6An19whVMnSSWPXt4",
51266
+ tokenAddress: "AFDVYBqxADagPfN9DdbrNrf9zZqugub7CV4kUJEUrK6J",
51267
+ tokenName: "Stache Node",
51268
+ tokenSymbol: "STACHE"
51269
+ },
51270
+ {
51271
+ bankAddress: "9Hs4E6ACNw6Hmwjvm1duXzbaWmvXxSxN11agw4updEn1",
51272
+ validatorVoteAccount: "EtMSc3MvcDXUr6ChK5GxyFVwTxYA3zqP5XzjE9jwKvSV",
51273
+ tokenAddress: "ENKFyZQZHzNNSxcKYoaVsNLi2xoGPoStZH4A9xxezjbC",
51274
+ tokenName: "Mad Lads CN",
51275
+ tokenSymbol: "MadLadsCN"
51276
+ },
51277
+ {
51278
+ bankAddress: "4watsWcjTBAwsrZpArwQbnNX4bQ1yeHBxgdbrGT4eMu9",
51279
+ validatorVoteAccount: "EARNynHRWg6GfyJCmrrizcZxARB3HVzcaasvNa8kBS72",
51280
+ tokenAddress: "8fhkWcm2n28JuadzY7mRR8FFDZZfnaPfWgw7pLNVZCbE",
51281
+ tokenName: "Solana Compass Stake",
51282
+ tokenSymbol: "compaStake"
51283
+ },
51284
+ {
51285
+ bankAddress: "9d7MTvcz1VMB1rK6H73quMxkR26dLPz5HDaac2eGRjQx",
51286
+ validatorVoteAccount: "nymsndUdAZyUPpWYz5VEg8Ghj9cFvwTRgciLogpmYaQ",
51287
+ tokenAddress: "FWFeaqpkgDr3ejVSY3HjiUmUg3u9fcr5d66HvimnDLWE",
51288
+ tokenName: "Hypo Nyms",
51289
+ tokenSymbol: "NYMS"
51290
+ },
51291
+ {
51292
+ bankAddress: "6V4vCK3n3JVncfpS16mW8ceLoNPatvu61pKxFmWx8adi",
51293
+ validatorVoteAccount: "BT8LZUvQVwFHRGw2Dwv7UeqDUq7btfjegLpuz5bwgziD",
51294
+ tokenAddress: "9YRS7Stf9dVibTT1M4uVEAuRMcoS4MH1QxqXy9Lssrab",
51295
+ tokenName: "private",
51296
+ tokenSymbol: "private"
51297
+ },
51298
+ {
51299
+ bankAddress: "CK8qRAcmvkDXaqX2S5GkgTCZT5pCz34me1neQhpJYe1Z",
51300
+ validatorVoteAccount: "Ac1beBKixfNdrTAac7GRaTsJTxLyvgGvJjvy4qQfvyfc",
51301
+ tokenAddress: "DLTAbTL5NXhbqX6LX3ie3tf52pdtGpxe2DrZUr1RhgY6",
51302
+ tokenName: "Stronghold",
51303
+ tokenSymbol: "Stronghold"
51304
+ },
51305
+ {
51306
+ bankAddress: "H6CT1aiCgSNw9S6aq38npEhdoN2UPhSKe8Lj9fQqqjuu",
51307
+ validatorVoteAccount: "FREEL1BCzmPpNneC7FHCtBqzeWYrHRbtisFvi4N8XUP9",
51308
+ tokenAddress: "AKFuMoM5rjSpQSL4p6TBoc7D4dmEem9QrHhuSDCBYyZ8",
51309
+ tokenName: "Ross",
51310
+ tokenSymbol: "Ross"
51311
+ },
51312
+ {
51313
+ bankAddress: "G46aHuakgStymbE2WsLbja61mH5UXBPdSdpwf6Ci3saG",
51314
+ validatorVoteAccount: "mnvkHm47ZmRKoSWuQZAfXLRiDPiKCq8PWkMWrp1Wwqe",
51315
+ tokenAddress: "Cq9S5UB9BviPn5yoGkEDk3m7neQag4KJnhPWGyuev9W8",
51316
+ tokenName: "gripto staked sol",
51317
+ tokenSymbol: "GRIPTO"
51318
+ },
51319
+ {
51320
+ bankAddress: "75UmeEMdqVnGn3JHx8yVZEn7viybJ73XYSjhYCYfyhp2",
51321
+ validatorVoteAccount: "4m1PbxzwLdUnEwog3T9UKxgjktgriHgE1CfAhMqDw7Xx",
51322
+ tokenAddress: "432SogPNunjZMneDV6goZ8ZcCQz282GxoSJ4rwqx95pT",
51323
+ tokenName: "kumasol",
51324
+ tokenSymbol: "kumasol"
51325
+ },
51326
+ {
51327
+ bankAddress: "3zk6EmXANYQK12bwy9dySRAM4cT2vT5cDcAB79j8G33B",
51328
+ validatorVoteAccount: "HvsD9L5t62MGv3QBD2K7xjkipGYr9UZN7BtsW8NuSPpg",
51329
+ tokenAddress: "5vmwd6JHDCmX9W2XT1n2QpvYGA2kk4Xf7qWSayDU6caT",
51330
+ tokenName: "ArgenTerraSOL",
51331
+ tokenSymbol: "atSOL"
51332
+ },
51333
+ {
51334
+ bankAddress: "4C2vPweGNpiE6kTEbYvcbUBHNWxrn4ErQYaqWm5zDexx",
51335
+ validatorVoteAccount: "FnAPJkzf19s87sm24Qhv6bHZMZvZ43gjNUBRgjwXpD4v",
51336
+ tokenAddress: "6q4kVnwUpkE3i7W32dqaX6V12pbsrCnMqZ7TWz9yp1m5",
51337
+ tokenName: "BLOCKPORT",
51338
+ tokenSymbol: "BPT"
51339
+ },
51340
+ {
51341
+ bankAddress: "E5hZu5QQ1pRmGvyS4JHGXVQwzdUPaYM4yEiNKr64YzyG",
51342
+ validatorVoteAccount: "nfGcSJkP35SkPa5475iBChmq1UNcj7JE1uQHrrasymm",
51343
+ tokenAddress: "AQpQoJ3tJKGH9Yn8GSzoUsVcHPJjj3xYfQFp9XVr74F6",
51344
+ tokenName: "Test01",
51345
+ tokenSymbol: "TEST01"
51346
+ },
51347
+ {
51348
+ bankAddress: "3VCkXWAmE5DSwYRpqGFnkUz7vvD2RKbhFvrhzLuE8msu",
51349
+ validatorVoteAccount: "abc1zP7ihWsgQW8z5YmfQNqMckJE5Dfx8fwUNMNVNkY",
51350
+ tokenAddress: "BNisp3omkr6Rg5nHESWafjUbeCpGPy6MYq1iRJRgSAsh",
51351
+ tokenName: "ALGO STAKE",
51352
+ tokenSymbol: "ALGO"
51353
+ },
51354
+ {
51355
+ bankAddress: "7BHHMWw3P1AyebLhX9A8wnDeeGy8jgFXqqHuEZt7BVmW",
51356
+ validatorVoteAccount: "8Pep3GmYiijRALqrMKpez92cxvF4YPTzoZg83uXh14pW",
51357
+ tokenAddress: "zBH13AzXYCqHZKS8NGa4KR8zQhWiyvFdDY15nmfrHgS",
51358
+ tokenName: "8Pep",
51359
+ tokenSymbol: "8Pep"
51360
+ },
51361
+ {
51362
+ bankAddress: "9QWUatjtJtc98yts4ufWnmNeaWQRmaaLjFwbK3iMdS47",
51363
+ validatorVoteAccount: "CatzoSMUkTRidT5DwBxAC2pEtnwMBTpkCepHkFgZDiqb",
51364
+ tokenAddress: "98B1NMLYaNJQNxiQGr53vbjNFMNTYFmDqoCgj7qD9Vhm",
51365
+ tokenName: "JUPITER ",
51366
+ tokenSymbol: "JUPITER"
51367
+ },
51368
+ {
51369
+ bankAddress: "5q1wJkGqqRh6mSBtjG8sfjBsgJSGdA2QoXTWv4UQbHGk",
51370
+ validatorVoteAccount: "shft7Fry1js37Hm9wq4dfwcZSp2DyKszeWMvEpjYCQ1",
51371
+ tokenAddress: "C1KwBJZNwUaodUcP5kXqD52NCuZzThNAG2cw3vt5H6iE",
51372
+ tokenName: "BLUESHIFT",
51373
+ tokenSymbol: "SHIFT"
51374
+ },
51375
+ {
51376
+ bankAddress: "FZaHyfg9hmNMKpfUJ474wNKPaPdXMpnJouasKnndECiZ",
51377
+ validatorVoteAccount: "DdCNGDpP7qMgoAy6paFzhhak2EeyCZcgjH7ak5u5v28m",
51378
+ tokenAddress: "PhxXAYTkFZS23ZWvFcz6H6Uq4VnVBMa6hniiAyudjaW",
51379
+ tokenName: "KILN1",
51380
+ tokenSymbol: "KILN1"
51381
+ },
51382
+ {
51383
+ bankAddress: "5CBocarwfJeWGNozGemWktRYSz6kPikRPdfH8ZHSFrsg",
51384
+ validatorVoteAccount: "8zuMRTXThoPTTPLLvaiKiJshLLCqGMt9BdRjjCL19xBc",
51385
+ tokenAddress: "BDsEuxFWznAP5cUCannnfjyjDtTwqN57CkGfDbjx2nNZ",
51386
+ tokenName: "DawnLabs",
51387
+ tokenSymbol: "DawnLabs"
51388
+ },
51389
+ {
51390
+ bankAddress: "9ivswG37QpCUmkPkLMpRZT7PMyP64V9dDpZdteM254ec",
51391
+ validatorVoteAccount: "gaToR246dheK1DGAMEqxMdBJZwU4qFyt7DzhSwAHFWF",
51392
+ tokenAddress: "TjA2rtxoUFzyPVAw35VQGEQnNXiwcmNjKSk29nmkq1P",
51393
+ tokenName: "Valigator Open",
51394
+ tokenSymbol: "Valigator"
51395
+ }
51396
+ ];
51397
+
51398
+ // src/services/native-stake/utils/metadata.utils.ts
51399
+ var _metadataMap = null;
51400
+ var _voteAccountByBank = null;
51401
+ function getStakedBankMetadataMap() {
51402
+ if (!_metadataMap) {
51403
+ _metadataMap = /* @__PURE__ */ new Map();
51404
+ for (const entry of STAKED_BANK_METADATA_JSON) {
51405
+ _metadataMap.set(entry.bankAddress, entry);
51406
+ }
51407
+ }
51408
+ return _metadataMap;
51409
+ }
51410
+ function getValidatorVoteAccountByBank() {
51411
+ if (!_voteAccountByBank) {
51412
+ _voteAccountByBank = {};
51413
+ for (const entry of STAKED_BANK_METADATA_JSON) {
51414
+ _voteAccountByBank[entry.bankAddress] = entry.validatorVoteAccount;
51415
+ }
51416
+ }
51417
+ return _voteAccountByBank;
51418
+ }
50654
51419
  async function getKaminoMetadata(options) {
50655
51420
  const kaminoBanks = options.banks.filter((b) => b.config.assetTag === 3 /* KAMINO */);
50656
51421
  const DEFAULT_PUBKEY = web3_js.PublicKey.default;
@@ -53099,6 +53864,66 @@ var MarginfiAccountWrapper = class {
53099
53864
  return this.account.getHealthCheckAccounts(this.client.bankMap, mandatoryBanks, excludedBanks);
53100
53865
  }
53101
53866
  // ----------------------------------------------------------------------------
53867
+ // Native stake actions
53868
+ // Note: These call standalone action functions directly rather than routing
53869
+ // through this.account because they interact with the SPL stake pool program,
53870
+ // not the marginfi program. No MarginfiAccount state is needed.
53871
+ // ----------------------------------------------------------------------------
53872
+ /**
53873
+ * Creates a transaction to mint LST from a native stake account.
53874
+ *
53875
+ * Converts a native stake account (or a portion of it) into LST tokens
53876
+ * by depositing the stake into the single-validator pool.
53877
+ *
53878
+ * @param amount - SOL amount to convert (in UI units)
53879
+ * @param stakeAccountPk - The stake account to convert
53880
+ * @param validator - The validator vote account
53881
+ */
53882
+ async makeMintStakedLstTx(amount, stakeAccountPk, validator) {
53883
+ return makeMintStakedLstTx({
53884
+ amount,
53885
+ authority: this.authority,
53886
+ stakeAccountPk,
53887
+ validator,
53888
+ connection: this.client.program.provider.connection,
53889
+ luts: this.client.addressLookupTables
53890
+ });
53891
+ }
53892
+ /**
53893
+ * Creates a transaction to redeem LST tokens back to a native stake account.
53894
+ *
53895
+ * Burns LST tokens and withdraws the underlying stake into a new stake account.
53896
+ *
53897
+ * @param amount - LST amount to redeem (in UI units)
53898
+ * @param validator - The validator vote account
53899
+ */
53900
+ async makeRedeemStakedLstTx(amount, validator) {
53901
+ return makeRedeemStakedLstTx({
53902
+ amount,
53903
+ authority: this.authority,
53904
+ validator,
53905
+ connection: this.client.program.provider.connection,
53906
+ luts: this.client.addressLookupTables
53907
+ });
53908
+ }
53909
+ /**
53910
+ * Creates a transaction to merge two stake accounts.
53911
+ *
53912
+ * Both accounts must share the same authorized staker/withdrawer and vote account.
53913
+ *
53914
+ * @param sourceStakeAccount - The stake account to merge from (will be consumed)
53915
+ * @param destinationStakeAccount - The stake account to merge into
53916
+ */
53917
+ async makeMergeStakeAccountsTx(sourceStakeAccount, destinationStakeAccount) {
53918
+ return makeMergeStakeAccountsTx({
53919
+ authority: this.authority,
53920
+ sourceStakeAccount,
53921
+ destinationStakeAccount,
53922
+ connection: this.client.program.provider.connection,
53923
+ luts: this.client.addressLookupTables
53924
+ });
53925
+ }
53926
+ // ----------------------------------------------------------------------------
53102
53927
  // Helper methods
53103
53928
  // ----------------------------------------------------------------------------
53104
53929
  /**
@@ -53360,7 +54185,6 @@ var Project0Client = class _Project0Client {
53360
54185
  assetShareMultiplierByBank.set(bank.address.toBase58(), new BigNumber3__default.default(1));
53361
54186
  break;
53362
54187
  case 2 /* STAKED */:
53363
- assetShareMultiplierByBank.set(bank.address.toBase58(), new BigNumber3__default.default(1));
53364
54188
  break;
53365
54189
  case 0 /* DEFAULT */:
53366
54190
  case 1 /* SOL */:
@@ -53369,6 +54193,56 @@ var Project0Client = class _Project0Client {
53369
54193
  break;
53370
54194
  }
53371
54195
  });
54196
+ const stakedBanks = banksArray.filter((b) => b.config.assetTag === 2 /* STAKED */);
54197
+ if (stakedBanks.length > 0) {
54198
+ const metadataMap = getStakedBankMetadataMap();
54199
+ const stakedBankAddresses = [];
54200
+ const poolStakeAddresses = [];
54201
+ const lstMintAddresses = [];
54202
+ for (const bank of stakedBanks) {
54203
+ const metadata = metadataMap.get(bank.address.toBase58());
54204
+ if (!metadata) {
54205
+ assetShareMultiplierByBank.set(bank.address.toBase58(), new BigNumber3__default.default(1));
54206
+ continue;
54207
+ }
54208
+ const pool = findPoolAddress(new web3_js.PublicKey(metadata.validatorVoteAccount));
54209
+ stakedBankAddresses.push(bank.address.toBase58());
54210
+ poolStakeAddresses.push(findPoolStakeAddress(pool));
54211
+ lstMintAddresses.push(findPoolMintAddress(pool));
54212
+ }
54213
+ if (stakedBankAddresses.length > 0) {
54214
+ const allAddresses = [
54215
+ ...poolStakeAddresses.map((a) => a.toBase58()),
54216
+ ...lstMintAddresses.map((a) => a.toBase58())
54217
+ ];
54218
+ const accountInfos = await chunkedGetRawMultipleAccountInfoOrdered(
54219
+ connection,
54220
+ allAddresses
54221
+ );
54222
+ const poolStakeInfos = accountInfos.slice(0, poolStakeAddresses.length);
54223
+ const lstMintInfos = accountInfos.slice(poolStakeAddresses.length);
54224
+ for (let i = 0; i < stakedBankAddresses.length; i++) {
54225
+ const bankAddr = stakedBankAddresses[i];
54226
+ const poolStakeInfo = poolStakeInfos[i];
54227
+ const lstMintInfo = lstMintInfos[i];
54228
+ if (!poolStakeInfo || !lstMintInfo) {
54229
+ assetShareMultiplierByBank.set(bankAddr, new BigNumber3__default.default(1));
54230
+ continue;
54231
+ }
54232
+ const stakeLamports = poolStakeInfo.lamports;
54233
+ const supplyBuffer = lstMintInfo.data.slice(36, 44);
54234
+ const lstMintSupply = Number(Buffer.from(supplyBuffer).readBigUInt64LE(0));
54235
+ if (lstMintSupply === 0) {
54236
+ assetShareMultiplierByBank.set(bankAddr, new BigNumber3__default.default(1));
54237
+ continue;
54238
+ }
54239
+ const LAMPORTS_PER_SOL5 = 1e9;
54240
+ const adjustedStake = Math.max(stakeLamports - LAMPORTS_PER_SOL5, 0);
54241
+ const multiplier = new BigNumber3__default.default(adjustedStake).dividedBy(lstMintSupply);
54242
+ assetShareMultiplierByBank.set(bankAddr, multiplier);
54243
+ }
54244
+ }
54245
+ }
53372
54246
  const emodePairs = getEmodePairs(banksArray);
53373
54247
  return new _Project0Client(
53374
54248
  program,
@@ -53641,9 +54515,11 @@ exports.getOracleSourceFromOracleSetup = getOracleSourceFromOracleSetup;
53641
54515
  exports.getOracleSourceNameFromKey = getOracleSourceNameFromKey;
53642
54516
  exports.getPrice = getPrice;
53643
54517
  exports.getPriceWithConfidence = getPriceWithConfidence;
54518
+ exports.getStakedBankMetadataMap = getStakedBankMetadataMap;
53644
54519
  exports.getTotalAssetQuantity = getTotalAssetQuantity;
53645
54520
  exports.getTotalLiabilityQuantity = getTotalLiabilityQuantity;
53646
54521
  exports.getTxSize = getTxSize;
54522
+ exports.getValidatorVoteAccountByBank = getValidatorVoteAccountByBank;
53647
54523
  exports.groupToDto = groupToDto;
53648
54524
  exports.hasAccountFlag = hasAccountFlag;
53649
54525
  exports.hasEmodeEntryFlag = hasEmodeEntryFlag;
@@ -53683,11 +54559,16 @@ exports.makeKaminoDepositTx = makeKaminoDepositTx;
53683
54559
  exports.makeKaminoWithdrawIx = makeKaminoWithdrawIx3;
53684
54560
  exports.makeKaminoWithdrawTx = makeKaminoWithdrawTx;
53685
54561
  exports.makeLoopTx = makeLoopTx;
54562
+ exports.makeMergeStakeAccountsTx = makeMergeStakeAccountsTx;
54563
+ exports.makeMintStakedLstIx = makeMintStakedLstIx;
54564
+ exports.makeMintStakedLstTx = makeMintStakedLstTx;
53686
54565
  exports.makePoolAddBankIx = makePoolAddBankIx3;
53687
54566
  exports.makePoolConfigureBankIx = makePoolConfigureBankIx3;
53688
54567
  exports.makePriorityFeeIx = makePriorityFeeIx;
53689
54568
  exports.makePriorityFeeMicroIx = makePriorityFeeMicroIx;
53690
54569
  exports.makePulseHealthIx = makePulseHealthIx2;
54570
+ exports.makeRedeemStakedLstIx = makeRedeemStakedLstIx;
54571
+ exports.makeRedeemStakedLstTx = makeRedeemStakedLstTx;
53691
54572
  exports.makeRefreshKaminoBanksIxs = makeRefreshKaminoBanksIxs;
53692
54573
  exports.makeRepayIx = makeRepayIx3;
53693
54574
  exports.makeRepayTx = makeRepayTx;