@jpool/bond-sdk 0.9.0-next.24 → 0.9.0-next.25

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.mjs CHANGED
@@ -1,8 +1,9 @@
1
1
  import { Program, AnchorProvider, BN } from '@coral-xyz/anchor';
2
+ import { bs58 } from '@coral-xyz/anchor/dist/cjs/utils/bytes';
2
3
  import { getStakePoolAccount, STAKE_POOL_PROGRAM_ID, StakePoolInstruction } from '@solana/spl-stake-pool';
3
4
  import { TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, ACCOUNT_SIZE, AccountLayout } from '@solana/spl-token';
4
5
  import { PublicKey, Transaction, SystemProgram, LAMPORTS_PER_SOL } from '@solana/web3.js';
5
- import bs58 from 'bs58';
6
+ import bs58$1 from 'bs58';
6
7
 
7
8
  var __create = Object.create;
8
9
  var __defProp = Object.defineProperty;
@@ -4716,23 +4717,12 @@ var HistoryManager = class {
4716
4717
  if (!type || amount <= 0) {
4717
4718
  continue;
4718
4719
  }
4719
- let beforeBalance;
4720
- let afterBalance;
4721
- const accIdx = tx.transaction.message.accountKeys.findIndex(
4722
- (k) => k.pubkey.equals(validatorBondAccount)
4723
- );
4724
- if (accIdx !== -1 && tx.meta.preBalances && tx.meta.postBalances) {
4725
- beforeBalance = Number(tx.meta.preBalances[accIdx] ?? 0) / LAMPORTS_PER_SOL;
4726
- afterBalance = Number(tx.meta.postBalances[accIdx] ?? 0) / LAMPORTS_PER_SOL;
4727
- }
4728
4720
  history.push({
4729
4721
  signature: sig,
4730
4722
  slot,
4731
4723
  epoch: slotToEpoch(slot, cluster),
4732
4724
  type,
4733
- amount,
4734
- beforeBalance,
4735
- afterBalance
4725
+ amount
4736
4726
  });
4737
4727
  }
4738
4728
  }
@@ -4775,7 +4765,7 @@ var HistoryManager = class {
4775
4765
  return { type: null, amount: 0 };
4776
4766
  }
4777
4767
  try {
4778
- const buf = bs58.decode(data);
4768
+ const buf = bs58$1.decode(data);
4779
4769
  if (buf.length < 16) {
4780
4770
  return { type: null, amount: 0 };
4781
4771
  }
@@ -7069,6 +7059,186 @@ var JBondClient = class _JBondClient {
7069
7059
  }
7070
7060
  });
7071
7061
  }
7062
+ /**
7063
+ * Get transaction history for a specific validator bond account
7064
+ */
7065
+ async getHistory(bondType, bondName, vote, options) {
7066
+ const [legacyValidatorBondAccount] = PublicKey.findProgramAddressSync(
7067
+ [
7068
+ Buffer.from("validator_bond" /* ValidatorBond */),
7069
+ new PublicKey(vote).toBuffer()
7070
+ ],
7071
+ this.programId
7072
+ );
7073
+ const validatorBond = this.pda.validatorBond(bondType, bondName, vote);
7074
+ console.log("Derived legacy validator bond account:", legacyValidatorBondAccount.toBase58());
7075
+ console.log("Derived new validator bond account:", validatorBond[0].toBase58());
7076
+ console.log("Fetching history for legacy validator bond account:", legacyValidatorBondAccount.toBase58());
7077
+ console.log("Fetching history for new validator bond account:", validatorBond[0].toBase58());
7078
+ const legacySignatures = (await this.connection.getSignaturesForAddress(
7079
+ legacyValidatorBondAccount,
7080
+ {
7081
+ limit: options?.limit || 1e3,
7082
+ before: options?.before,
7083
+ until: options?.until
7084
+ },
7085
+ "confirmed"
7086
+ )).filter((sig) => !sig.err);
7087
+ const newSignatures = (await this.connection.getSignaturesForAddress(
7088
+ validatorBond[0],
7089
+ {
7090
+ limit: options?.limit || 1e3,
7091
+ before: options?.before,
7092
+ until: options?.until
7093
+ },
7094
+ "confirmed"
7095
+ )).filter((sig) => !sig.err);
7096
+ const signatureStrings = legacySignatures.map((sig) => sig.signature);
7097
+ signatureStrings.push(...newSignatures.map((sig) => sig.signature));
7098
+ const signatures = [...legacySignatures, ...newSignatures];
7099
+ const BATCH_SIZE = 100;
7100
+ const allTransactions = [];
7101
+ for (let i = 0; i < signatureStrings.length; i += BATCH_SIZE) {
7102
+ const batch = signatureStrings.slice(i, i + BATCH_SIZE);
7103
+ const transactions = await this.connection.getParsedTransactions(
7104
+ batch,
7105
+ {
7106
+ maxSupportedTransactionVersion: 0,
7107
+ commitment: "confirmed"
7108
+ }
7109
+ );
7110
+ allTransactions.push(...transactions);
7111
+ }
7112
+ const cluster = options?.cluster || "mainnet-beta";
7113
+ const history = [];
7114
+ for (const [idx, tx] of allTransactions.entries()) {
7115
+ const sigInfo = signatures[idx];
7116
+ if (!tx || !tx.meta || tx.meta.err !== null) {
7117
+ continue;
7118
+ }
7119
+ try {
7120
+ const slot = tx.slot || 0;
7121
+ const instructions = tx.transaction.message.instructions;
7122
+ for (const instruction of instructions) {
7123
+ if ("programId" in instruction && instruction.programId.equals(this.options.programId ?? this.program.programId)) {
7124
+ const ixData = instruction;
7125
+ if ("parsed" in ixData && ixData.parsed) {
7126
+ continue;
7127
+ }
7128
+ const data = ixData.data;
7129
+ if (!data) {
7130
+ continue;
7131
+ }
7132
+ let type = null;
7133
+ let amount = 0;
7134
+ try {
7135
+ const dataBuffer = bs58.decode(data);
7136
+ if (dataBuffer.length >= 8) {
7137
+ const discriminator = dataBuffer.subarray(0, 8);
7138
+ const legacyRegisterDiscriminator = this.getInstructionDiscriminator("register");
7139
+ const legacyTopUpDiscriminator = this.getInstructionDiscriminator("topUp");
7140
+ const legacyClaimDiscriminator = this.getInstructionDiscriminator("claim");
7141
+ const legacyWithdrawDiscriminator = this.getInstructionDiscriminator("withdraw");
7142
+ const bondRegisterDiscriminator = this.getInstructionDiscriminator("bondRegister");
7143
+ const bondTopUpDiscriminator = this.getInstructionDiscriminator("bondTopUp");
7144
+ const bondClaimDiscriminator = this.getInstructionDiscriminator("bondClaim");
7145
+ const bondWithdrawDiscriminator = this.getInstructionDiscriminator("bondWithdraw");
7146
+ console.log("Discriminator:", Buffer.from(discriminator).toString("hex"));
7147
+ if (Buffer.from(discriminator).equals(Buffer.from(legacyRegisterDiscriminator)) || Buffer.from(discriminator).equals(Buffer.from(bondRegisterDiscriminator))) {
7148
+ type = "deposit" /* Deposit */;
7149
+ if (dataBuffer.length >= 16 && Buffer.from(discriminator).equals(Buffer.from(legacyRegisterDiscriminator))) {
7150
+ const amountBytes = dataBuffer.subarray(8, 16);
7151
+ const amountBN = new import_bn2.BN(amountBytes, "le");
7152
+ amount = amountBN.toNumber() / LAMPORTS_PER_SOL;
7153
+ } else {
7154
+ amount = 0;
7155
+ }
7156
+ } else if (dataBuffer.length >= 16) {
7157
+ const amountBytes = dataBuffer.subarray(8, 16);
7158
+ const amountBN = new import_bn2.BN(amountBytes, "le");
7159
+ amount = amountBN.toNumber() / LAMPORTS_PER_SOL;
7160
+ if (Buffer.from(discriminator).equals(Buffer.from(legacyTopUpDiscriminator)) || Buffer.from(discriminator).equals(Buffer.from(bondTopUpDiscriminator))) {
7161
+ type = "deposit" /* Deposit */;
7162
+ } else if (Buffer.from(discriminator).equals(Buffer.from(legacyClaimDiscriminator)) || Buffer.from(discriminator).equals(Buffer.from(bondClaimDiscriminator))) {
7163
+ type = "compensation" /* Compensation */;
7164
+ } else if (Buffer.from(discriminator).equals(Buffer.from(legacyWithdrawDiscriminator)) || Buffer.from(discriminator).equals(Buffer.from(bondWithdrawDiscriminator))) {
7165
+ type = "withdrawal" /* Withdrawal */;
7166
+ }
7167
+ }
7168
+ }
7169
+ } catch (e) {
7170
+ console.warn("Failed to decode instruction data:", e);
7171
+ }
7172
+ if (type && (amount > 0 || type === "deposit" /* Deposit */)) {
7173
+ history.push({
7174
+ signature: sigInfo.signature,
7175
+ slot,
7176
+ epoch: slotToEpoch(slot, cluster),
7177
+ type,
7178
+ amount
7179
+ });
7180
+ }
7181
+ }
7182
+ }
7183
+ } catch (error) {
7184
+ console.error(`Error processing transaction ${sigInfo.signature}:`, error);
7185
+ }
7186
+ }
7187
+ return history.toSorted((a, b) => b.slot - a.slot);
7188
+ }
7189
+ /**
7190
+ * Get full transaction history by paginating through results
7191
+ * @param bondType
7192
+ * @param bondName
7193
+ * @param voteAccount
7194
+ * @param pageSize
7195
+ */
7196
+ async getFullHistory(bondType, bondName, voteAccount, pageSize = 100) {
7197
+ const allHistory = [];
7198
+ let before;
7199
+ while (true) {
7200
+ const batch = await this.getHistory(bondType, bondName, voteAccount, {
7201
+ limit: pageSize,
7202
+ before
7203
+ });
7204
+ if (batch.length === 0) {
7205
+ break;
7206
+ }
7207
+ allHistory.push(...batch);
7208
+ before = batch.at(-1)?.signature;
7209
+ if (batch.length < pageSize) {
7210
+ break;
7211
+ }
7212
+ }
7213
+ return allHistory;
7214
+ }
7215
+ /**
7216
+ * Get instruction discriminator from IDL
7217
+ * @param instructionName
7218
+ * @private
7219
+ */
7220
+ getInstructionDiscriminator(instructionName) {
7221
+ const legacyDiscriminators = {
7222
+ register: [211, 124, 67, 15, 211, 194, 178, 240],
7223
+ topUp: [181, 157, 89, 67, 143, 182, 52, 72],
7224
+ claim: [62, 198, 214, 193, 213, 159, 108, 210],
7225
+ withdraw: [183, 18, 70, 156, 148, 109, 161, 34]
7226
+ };
7227
+ if (legacyDiscriminators[instructionName]) {
7228
+ return new Uint8Array(legacyDiscriminators[instructionName]);
7229
+ }
7230
+ if (instructionName.startsWith("bond")) {
7231
+ const instruction = this.program.idl.instructions.find((ix) => ix.name === instructionName);
7232
+ if (!instruction) {
7233
+ throw new Error(`Instruction ${instructionName} not found in IDL`);
7234
+ }
7235
+ if (!instruction.discriminator || !Array.isArray(instruction.discriminator)) {
7236
+ throw new Error(`Discriminator not found for instruction ${instructionName}`);
7237
+ }
7238
+ return new Uint8Array(instruction.discriminator);
7239
+ }
7240
+ throw new Error(`Unknown instruction: ${instructionName}`);
7241
+ }
7072
7242
  /**
7073
7243
  * Get bond state stats
7074
7244
  * @param state