@cityofzion/bs-solana 3.1.9 → 3.1.11

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.
@@ -1,7 +1,8 @@
1
- import { type TBSAccount, type TGetLedgerTransport, type IBlockchainDataService, type IExchangeDataService, type IExplorerService, type INftDataService, type ITokenService, type TBSNetwork, type TBSToken, type TPingNetworkResponse, type TTransferParams, type IWalletConnectService, type TTransactionDefault } from '@cityofzion/blockchain-service';
1
+ import { type TBSAccount, type TGetLedgerTransport, type IBlockchainDataService, type IExchangeDataService, type IExplorerService, type INftDataService, type ITokenService, type TBSNetwork, type TBSToken, type TPingNetworkResponse, type TTransferParams, type TTransactionDefault } from '@cityofzion/blockchain-service';
2
2
  import { Web3LedgerServiceSolana } from './services/ledger/Web3LedgerServiceSolana';
3
3
  import type { IBSSolana, TBSSolanaName, TBSSolanaNetworkId } from './types';
4
4
  import * as solanaKit from '@solana/kit';
5
+ import { WalletConnectServiceSolana } from './services/wallet-connect/WalletConnectServiceSolana';
5
6
  export declare class BSSolana implements IBSSolana {
6
7
  #private;
7
8
  readonly name = "solana";
@@ -21,7 +22,7 @@ export declare class BSSolana implements IBSSolana {
21
22
  nftDataService: INftDataService;
22
23
  explorerService: IExplorerService;
23
24
  tokenService: ITokenService;
24
- walletConnectService: IWalletConnectService<TBSSolanaName>;
25
+ walletConnectService: WalletConnectServiceSolana;
25
26
  _solanaKitRpc: solanaKit.Rpc<solanaKit.SolanaRpcApi>;
26
27
  constructor(network?: TBSNetwork<TBSSolanaNetworkId>, getLedgerTransport?: TGetLedgerTransport<TBSSolanaName>);
27
28
  _signTransaction(transaction: solanaKit.Transaction, senderAccount: TBSAccount<TBSSolanaName>): Promise<solanaKit.Base64EncodedWireTransaction>;
package/dist/BSSolana.js CHANGED
@@ -234,8 +234,7 @@ _BSSolana_instances = new WeakSet(), _BSSolana_buildTransferParams = async funct
234
234
  const signer = solanaKit.createNoopSigner(solanaKit.address(params.senderAccount.address));
235
235
  const instructions = [];
236
236
  for (const intent of params.intents) {
237
- const amountBn = blockchain_service_1.BSBigNumberHelper.fromNumber(intent.amount);
238
- const amount = Number(blockchain_service_1.BSBigNumberHelper.toDecimals(amountBn, intent.token.decimals));
237
+ const amount = new blockchain_service_1.BSBigHumanAmount(intent.amount, intent.token.decimals).toUnit().toBigInt();
239
238
  const receiverAddress = solanaKit.address(intent.receiverAddress);
240
239
  const isNative = this.tokenService.predicate(intent.token, BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN);
241
240
  if (isNative) {
@@ -292,6 +291,5 @@ _BSSolana_instances = new WeakSet(), _BSSolana_buildTransferParams = async funct
292
291
  if (!feeResponse.value) {
293
292
  throw new blockchain_service_1.BSError('Failed to calculate fee', 'NO_CALCULATE_FEE');
294
293
  }
295
- const feeBn = blockchain_service_1.BSBigNumberHelper.fromDecimals(feeResponse.value.toString(), this.feeToken.decimals);
296
- return blockchain_service_1.BSBigNumberHelper.format(feeBn, { decimals: this.feeToken.decimals });
294
+ return new blockchain_service_1.BSBigUnitAmount(feeResponse.value.toString(), this.feeToken.decimals).toHuman().toFormatted();
297
295
  };
@@ -55,6 +55,7 @@ const solanaKit = __importStar(require("@solana/kit"));
55
55
  const solanaToken = __importStar(require("@solana-program/token"));
56
56
  const solanaSystem = __importStar(require("@solana-program/system"));
57
57
  const axios_1 = __importDefault(require("axios"));
58
+ const blockchain_service_2 = require("@cityofzion/blockchain-service");
58
59
  class RpcBDSSolana {
59
60
  constructor(service) {
60
61
  _RpcBDSSolana_instances.add(this);
@@ -144,15 +145,16 @@ class RpcBDSSolana {
144
145
  const splBalance = await __classPrivateFieldGet(this, _RpcBDSSolana_service, "f")._solanaKitRpc
145
146
  .getTokenAccountsByOwner(solanaKitAddress, { programId: solanaToken.TOKEN_PROGRAM_ADDRESS }, { encoding: 'jsonParsed' })
146
147
  .send();
147
- const nativeBalanceBn = blockchain_service_1.BSBigNumberHelper.fromDecimals(nativeBalance.value, BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN.decimals);
148
- const nativeBalanceAmount = blockchain_service_1.BSBigNumberHelper.toNumber(nativeBalanceBn);
148
+ const nativeBalanceAmount = new blockchain_service_1.BSBigUnitAmount(nativeBalance.value, BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN.decimals)
149
+ .toHuman()
150
+ .toFormatted();
149
151
  const balances = [{ amount: nativeBalanceAmount, token: BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN }];
150
152
  const promises = splBalance.value.map(async (item) => {
151
153
  const token = await this.getTokenInfo(item.account.data.parsed.info.mint);
152
- const amountBn = blockchain_service_1.BSBigNumberHelper.fromDecimals(item.account.data.parsed.info.tokenAmount.amount, token.decimals);
154
+ const amountBn = new blockchain_service_1.BSBigUnitAmount(item.account.data.parsed.info.tokenAmount.amount, token.decimals);
153
155
  if (amountBn.isNaN() || amountBn.isLessThanOrEqualTo(0))
154
156
  return;
155
- const amount = blockchain_service_1.BSBigNumberHelper.format(amountBn, { decimals: token.decimals });
157
+ const amount = amountBn.toHuman().toFormatted();
156
158
  balances.push({
157
159
  amount,
158
160
  token,
@@ -163,7 +165,7 @@ class RpcBDSSolana {
163
165
  }
164
166
  async getBlockHeight() {
165
167
  const blockHeight = await __classPrivateFieldGet(this, _RpcBDSSolana_service, "f")._solanaKitRpc.getBlockHeight().send();
166
- return blockchain_service_1.BSBigNumberHelper.fromNumber(blockHeight).toNumber();
168
+ return blockchain_service_2.BSBigNumber.ensureNumber(blockHeight);
167
169
  }
168
170
  }
169
171
  exports.RpcBDSSolana = RpcBDSSolana;
@@ -201,7 +203,7 @@ _RpcBDSSolana_service = new WeakMap(), _RpcBDSSolana_tokenCache = new WeakMap(),
201
203
  token = {
202
204
  symbol: 'UNKNOWN',
203
205
  name: 'Unknown Token',
204
- decimals: blockchain_service_1.BSBigNumberHelper.fromNumber(info.tokenAmount.decimals).toNumber(),
206
+ decimals: blockchain_service_2.BSBigNumber.ensureNumber(info.tokenAmount.decimals),
205
207
  hash: contractHash,
206
208
  };
207
209
  }
@@ -235,8 +237,7 @@ _RpcBDSSolana_service = new WeakMap(), _RpcBDSSolana_tokenCache = new WeakMap(),
235
237
  nft,
236
238
  };
237
239
  }
238
- const amountBn = blockchain_service_1.BSBigNumberHelper.fromDecimals(tokenAmount, token.decimals);
239
- const amount = blockchain_service_1.BSBigNumberHelper.format(amountBn, { decimals: token.decimals });
240
+ const amount = new blockchain_service_1.BSBigUnitAmount(tokenAmount, token.decimals).toHuman().toFormatted();
240
241
  return {
241
242
  eventType: 'token',
242
243
  amount,
@@ -292,8 +293,7 @@ _RpcBDSSolana_service = new WeakMap(), _RpcBDSSolana_tokenCache = new WeakMap(),
292
293
  nft,
293
294
  };
294
295
  }
295
- const amountBn = blockchain_service_1.BSBigNumberHelper.fromDecimals(info.amount, token.decimals);
296
- const amount = blockchain_service_1.BSBigNumberHelper.format(amountBn, { decimals: token.decimals });
296
+ const amount = new blockchain_service_1.BSBigUnitAmount(info.amount, token.decimals).toHuman().toFormatted();
297
297
  return {
298
298
  eventType: 'token',
299
299
  amount,
@@ -310,8 +310,7 @@ _RpcBDSSolana_service = new WeakMap(), _RpcBDSSolana_tokenCache = new WeakMap(),
310
310
  const method = instruction.parsed.type;
311
311
  if (!info || method !== 'transfer' || !info.lamports || !info.source || !info.destination)
312
312
  return;
313
- const amountBn = blockchain_service_1.BSBigNumberHelper.fromDecimals(info.lamports, BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN.decimals);
314
- const amount = blockchain_service_1.BSBigNumberHelper.format(amountBn, { decimals: BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN.decimals });
313
+ const amount = new blockchain_service_1.BSBigUnitAmount(info.lamports, BSSolanaConstants_1.BSSolanaConstants.NATIVE_TOKEN.decimals).toHuman().toFormatted();
315
314
  const from = info.source;
316
315
  const to = info.destination;
317
316
  return {
@@ -361,9 +360,11 @@ _RpcBDSSolana_service = new WeakMap(), _RpcBDSSolana_tokenCache = new WeakMap(),
361
360
  relatedAddress,
362
361
  txId,
363
362
  txIdUrl,
364
- block: blockchain_service_1.BSBigNumberHelper.fromNumber(block).toNumber(),
365
- date: new Date(blockchain_service_1.BSBigNumberHelper.fromNumber(blockTime).multipliedBy(1000).toNumber()).toJSON(),
366
- networkFeeAmount: blockchain_service_1.BSBigNumberHelper.format(blockchain_service_1.BSBigNumberHelper.fromDecimals(transaction.meta.fee, __classPrivateFieldGet(this, _RpcBDSSolana_service, "f").feeToken.decimals), { decimals: __classPrivateFieldGet(this, _RpcBDSSolana_service, "f").feeToken.decimals }),
363
+ block: blockchain_service_2.BSBigNumber.ensureNumber(block),
364
+ date: new Date(new blockchain_service_2.BSBigNumber(blockTime).multipliedBy(1000).toNumber()).toJSON(),
365
+ networkFeeAmount: new blockchain_service_1.BSBigUnitAmount(transaction.meta.fee, __classPrivateFieldGet(this, _RpcBDSSolana_service, "f").feeToken.decimals)
366
+ .toHuman()
367
+ .toFormatted(),
367
368
  view: 'default',
368
369
  events,
369
370
  };
@@ -1,34 +1,43 @@
1
- import { type IWalletConnectService, type TWalletConnectServiceRequestMethodParams } from '@cityofzion/blockchain-service';
2
- import type { IBSSolana, TBSSolanaName, TBSSolanaNetworkId } from '../../types';
3
- import * as solanaKit from '@solana/kit';
4
- export declare class WalletConnectServiceSolana implements IWalletConnectService<TBSSolanaName> {
1
+ import { type IWalletConnectService, type TWalletConnectServiceHandlers, type TWalletConnectServiceRequestMethodParams } from '@cityofzion/blockchain-service';
2
+ import type { IBSSolana, TBSSolanaName, TBSSolanaNetworkId, TWalletConnectServiceSolanaMethod } from '../../types';
3
+ import z from 'zod';
4
+ declare const signMessageParamsSchema: z.ZodObject<{
5
+ message: z.ZodString;
6
+ pubkey: z.ZodString;
7
+ }, z.core.$strip>;
8
+ declare const signTransactionParamsSchema: z.ZodObject<{
9
+ transaction: z.ZodString;
10
+ }, z.core.$strip>;
11
+ declare const signAndSendTransactionParamsSchema: z.ZodObject<{
12
+ transactions: z.ZodArray<z.ZodString>;
13
+ }, z.core.$strip>;
14
+ declare const signAndSendTransactionOptionsSchema: z.ZodObject<{
15
+ transaction: z.ZodString;
16
+ sendOptions: z.ZodOptional<z.ZodObject<{
17
+ maxRetries: z.ZodOptional<z.ZodBigInt>;
18
+ preflightCommitment: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"confirmed">, z.ZodLiteral<"finalized">, z.ZodLiteral<"processed">]>>;
19
+ minContextSlot: z.ZodOptional<z.ZodBigInt>;
20
+ skipPreflight: z.ZodOptional<z.ZodBoolean>;
21
+ }, z.core.$strip>>;
22
+ }, z.core.$strip>;
23
+ export declare class WalletConnectServiceSolana implements IWalletConnectService<TBSSolanaName, TWalletConnectServiceSolanaMethod> {
5
24
  #private;
6
25
  static networkIdByNetworkType: Record<TBSSolanaNetworkId, string>;
7
26
  readonly namespace = "solana";
8
27
  readonly chain: string;
9
- readonly supportedMethods: string[];
28
+ readonly supportedMethods: TWalletConnectServiceSolanaMethod[];
10
29
  readonly supportedEvents: string[];
11
- readonly calculableMethods: string[];
12
- readonly autoApproveMethods: string[];
13
- constructor(service: IBSSolana);
14
- [methodName: string]: any;
15
- solana_getAccounts(args: TWalletConnectServiceRequestMethodParams<TBSSolanaName>): Promise<{
16
- pubkey: string;
17
- }[]>;
18
- solana_requestAccounts(args: TWalletConnectServiceRequestMethodParams<TBSSolanaName>): Promise<{
19
- pubkey: string;
20
- }[]>;
21
- solana_signMessage(args: TWalletConnectServiceRequestMethodParams<TBSSolanaName>): Promise<{
22
- signature: string;
23
- }>;
24
- solana_signTransaction(args: TWalletConnectServiceRequestMethodParams<TBSSolanaName>): Promise<{
25
- transaction: solanaKit.Base64EncodedWireTransaction;
26
- }>;
27
- solana_signAllTransactions(args: TWalletConnectServiceRequestMethodParams<TBSSolanaName>): Promise<{
28
- transactions: solanaKit.Base64EncodedWireTransaction[];
29
- }>;
30
- solana_signAndSendTransaction(args: TWalletConnectServiceRequestMethodParams<TBSSolanaName>): Promise<{
31
- signature: solanaKit.Signature;
30
+ readonly calculableMethods: TWalletConnectServiceSolanaMethod[];
31
+ readonly autoApproveMethods: TWalletConnectServiceSolanaMethod[];
32
+ handlers: TWalletConnectServiceHandlers<TBSSolanaName, {
33
+ solana_getAccounts: unknown;
34
+ solana_requestAccounts: unknown;
35
+ solana_signMessage: z.infer<typeof signMessageParamsSchema>;
36
+ solana_signTransaction: z.infer<typeof signTransactionParamsSchema>;
37
+ solana_signAllTransactions: z.infer<typeof signAndSendTransactionParamsSchema>;
38
+ solana_signAndSendTransaction: z.infer<typeof signAndSendTransactionOptionsSchema>;
32
39
  }>;
40
+ constructor(service: IBSSolana);
33
41
  calculateRequestFee(args: TWalletConnectServiceRequestMethodParams<TBSSolanaName>): Promise<string>;
34
42
  }
43
+ export {};
@@ -43,94 +43,117 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
43
43
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
44
44
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
45
45
  };
46
- var _WalletConnectServiceSolana_instances, _WalletConnectServiceSolana_service, _WalletConnectServiceSolana_parseTransaction;
46
+ var __importDefault = (this && this.__importDefault) || function (mod) {
47
+ return (mod && mod.__esModule) ? mod : { "default": mod };
48
+ };
49
+ var _WalletConnectServiceSolana_instances, _WalletConnectServiceSolana_service, _WalletConnectServiceSolana_getAccountsHandler, _WalletConnectServiceSolana_signMessageHandler, _WalletConnectServiceSolana_signTransactionHandler, _WalletConnectServiceSolana_signAllTransactionsHandler, _WalletConnectServiceSolana_signAndSendTransactionHandler, _WalletConnectServiceSolana_parseTransaction;
47
50
  Object.defineProperty(exports, "__esModule", { value: true });
48
51
  exports.WalletConnectServiceSolana = void 0;
49
52
  const blockchain_service_1 = require("@cityofzion/blockchain-service");
50
53
  const solanaKit = __importStar(require("@solana/kit"));
54
+ const zod_1 = __importDefault(require("zod"));
55
+ const signMessageParamsSchema = zod_1.default.object({ message: zod_1.default.string(), pubkey: zod_1.default.string() });
56
+ const signTransactionParamsSchema = zod_1.default.object({ transaction: zod_1.default.string() });
57
+ const signAndSendTransactionParamsSchema = zod_1.default.object({ transactions: zod_1.default.array(zod_1.default.string()) });
58
+ const signAndSendTransactionOptionsSchema = zod_1.default.object({
59
+ transaction: zod_1.default.string(),
60
+ sendOptions: zod_1.default
61
+ .object({
62
+ maxRetries: zod_1.default.bigint().optional(),
63
+ preflightCommitment: zod_1.default.union([zod_1.default.literal('confirmed'), zod_1.default.literal('finalized'), zod_1.default.literal('processed')]).optional(),
64
+ minContextSlot: zod_1.default.bigint().optional(),
65
+ skipPreflight: zod_1.default.boolean().optional(),
66
+ })
67
+ .optional(),
68
+ });
51
69
  class WalletConnectServiceSolana {
52
70
  constructor(service) {
53
71
  _WalletConnectServiceSolana_instances.add(this);
54
72
  this.namespace = 'solana';
73
+ // prettier-ignore
55
74
  this.supportedMethods = [
56
- 'solana_getAccounts',
57
- 'solana_requestAccounts',
58
- 'solana_signMessage',
59
- 'solana_signTransaction',
60
- 'solana_signAllTransactions',
61
- 'solana_signAndSendTransaction',
75
+ 'solana_getAccounts', 'solana_requestAccounts', 'solana_signMessage', 'solana_signTransaction',
76
+ 'solana_signAllTransactions', 'solana_signAndSendTransaction',
62
77
  ];
63
78
  this.supportedEvents = [];
64
79
  this.calculableMethods = ['solana_signAndSendTransaction'];
65
80
  this.autoApproveMethods = ['solana_getAccounts', 'solana_requestAccounts'];
66
81
  _WalletConnectServiceSolana_service.set(this, void 0);
82
+ _WalletConnectServiceSolana_getAccountsHandler.set(this, {
83
+ validate: async () => { },
84
+ process: async (args) => {
85
+ return [{ pubkey: args.account.address }];
86
+ },
87
+ });
88
+ _WalletConnectServiceSolana_signMessageHandler.set(this, {
89
+ validate: async (params) => await signMessageParamsSchema.parseAsync(params),
90
+ process: async (args) => {
91
+ if (args.params.pubkey !== args.account.address) {
92
+ throw new blockchain_service_1.BSError('Public key does not match account address', 'PUBKEY_MISMATCH');
93
+ }
94
+ const messageBytes = solanaKit.getBase58Codec().encode(args.params.message);
95
+ const keypair = await solanaKit.createKeyPairFromBytes(solanaKit.getBase58Encoder().encode(args.account.key));
96
+ const signatureBuffer = await crypto.subtle.sign('Ed25519', keypair.privateKey, new Uint8Array(messageBytes));
97
+ const signature = solanaKit.getBase58Codec().decode(new Uint8Array(signatureBuffer));
98
+ return { signature };
99
+ },
100
+ });
101
+ _WalletConnectServiceSolana_signTransactionHandler.set(this, {
102
+ validate: async (params) => await signTransactionParamsSchema.parseAsync(params),
103
+ process: async (args) => {
104
+ const parsedTransaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, args.params.transaction);
105
+ const signedTransaction = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._signTransaction(parsedTransaction, args.account);
106
+ return { transaction: signedTransaction };
107
+ },
108
+ });
109
+ _WalletConnectServiceSolana_signAllTransactionsHandler.set(this, {
110
+ validate: async (params) => await signAndSendTransactionParamsSchema.parseAsync(params),
111
+ process: async (args) => {
112
+ const signedTransactions = [];
113
+ for (const transaction of args.params.transactions) {
114
+ const parsedTransaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, transaction);
115
+ const signedTransaction = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._signTransaction(parsedTransaction, args.account);
116
+ signedTransactions.push(signedTransaction);
117
+ }
118
+ return {
119
+ transactions: signedTransactions,
120
+ };
121
+ },
122
+ });
123
+ _WalletConnectServiceSolana_signAndSendTransactionHandler.set(this, {
124
+ validate: async (params) => await signAndSendTransactionOptionsSchema.parseAsync(params),
125
+ process: async (args) => {
126
+ const options = args.params.sendOptions ?? {};
127
+ const parsedTransaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, args.params.transaction);
128
+ const signedTransaction = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._signTransaction(parsedTransaction, args.account);
129
+ const signature = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._solanaKitRpc
130
+ .sendTransaction(signedTransaction, {
131
+ maxRetries: options.maxRetries,
132
+ preflightCommitment: options.preflightCommitment,
133
+ minContextSlot: options.minContextSlot,
134
+ skipPreflight: options.skipPreflight,
135
+ })
136
+ .send();
137
+ return { signature };
138
+ },
139
+ });
67
140
  __classPrivateFieldSet(this, _WalletConnectServiceSolana_service, service, "f");
68
141
  const networkId = WalletConnectServiceSolana.networkIdByNetworkType[__classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f").network.id];
69
142
  this.chain = `${this.namespace}:${networkId}`;
70
- }
71
- async solana_getAccounts(args) {
72
- return [{ pubkey: args.account.address }];
73
- }
74
- async solana_requestAccounts(args) {
75
- return await this.solana_getAccounts(args);
76
- }
77
- async solana_signMessage(args) {
78
- if (typeof args.params.message !== 'string' || typeof args.params.pubkey !== 'string') {
79
- throw new Error('Invalid params');
80
- }
81
- if (args.params.pubkey !== args.account.address) {
82
- throw new Error('Public key does not match account address');
83
- }
84
- const messageBytes = solanaKit.getBase58Codec().encode(args.params.message);
85
- const keypair = await solanaKit.createKeyPairFromBytes(solanaKit.getBase58Encoder().encode(args.account.key));
86
- const signatureBuffer = await crypto.subtle.sign('Ed25519', keypair.privateKey, new Uint8Array(messageBytes));
87
- const signature = solanaKit.getBase58Codec().decode(new Uint8Array(signatureBuffer));
88
- return { signature };
89
- }
90
- async solana_signTransaction(args) {
91
- if (typeof args.params.transaction !== 'string') {
92
- throw new Error('Invalid params');
93
- }
94
- const parsedTransaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, args.params.transaction);
95
- const signedTransaction = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._signTransaction(parsedTransaction, args.account);
96
- return { transaction: signedTransaction };
97
- }
98
- async solana_signAllTransactions(args) {
99
- if (!Array.isArray(args.params.transactions)) {
100
- throw new Error('Invalid params');
101
- }
102
- const signedTransactions = [];
103
- for (const transaction of args.params.transactions) {
104
- const parsedTransaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, transaction);
105
- const signedTransaction = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._signTransaction(parsedTransaction, args.account);
106
- signedTransactions.push(signedTransaction);
107
- }
108
- return {
109
- transactions: signedTransactions,
143
+ this.handlers = {
144
+ solana_getAccounts: __classPrivateFieldGet(this, _WalletConnectServiceSolana_getAccountsHandler, "f"),
145
+ solana_requestAccounts: __classPrivateFieldGet(this, _WalletConnectServiceSolana_getAccountsHandler, "f"),
146
+ solana_signMessage: __classPrivateFieldGet(this, _WalletConnectServiceSolana_signMessageHandler, "f"),
147
+ solana_signTransaction: __classPrivateFieldGet(this, _WalletConnectServiceSolana_signTransactionHandler, "f"),
148
+ solana_signAllTransactions: __classPrivateFieldGet(this, _WalletConnectServiceSolana_signAllTransactionsHandler, "f"),
149
+ solana_signAndSendTransaction: __classPrivateFieldGet(this, _WalletConnectServiceSolana_signAndSendTransactionHandler, "f"),
110
150
  };
111
151
  }
112
- async solana_signAndSendTransaction(args) {
113
- if (typeof args.params.transaction !== 'string') {
114
- throw new Error('Invalid params');
115
- }
116
- const options = args.params.sendOptions ?? {};
117
- const parsedTransaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, args.params.transaction);
118
- const signedTransaction = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._signTransaction(parsedTransaction, args.account);
119
- const signature = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._solanaKitRpc
120
- .sendTransaction(signedTransaction, {
121
- maxRetries: options.maxRetries,
122
- preflightCommitment: options.preflightCommitment,
123
- minContextSlot: options.minContextSlot,
124
- skipPreflight: options.skipPreflight,
125
- })
126
- .send();
127
- return { signature };
128
- }
129
152
  async calculateRequestFee(args) {
130
- if (typeof args.params.transaction !== 'string') {
131
- throw new Error('Invalid params');
132
- }
133
- const transaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, args.params.transaction);
153
+ const params = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_signAndSendTransactionHandler, "f").validate(args.params).catch(error => {
154
+ throw new blockchain_service_1.BSError('Params validation failed: ' + error.message, 'INVALID_PARAMS');
155
+ });
156
+ const transaction = __classPrivateFieldGet(this, _WalletConnectServiceSolana_instances, "m", _WalletConnectServiceSolana_parseTransaction).call(this, params.transaction);
134
157
  const messageBase64 = solanaKit.getBase64Decoder().decode(transaction.messageBytes);
135
158
  const feeResponse = await __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f")._solanaKitRpc
136
159
  .getFeeForMessage(messageBase64, { commitment: 'confirmed' })
@@ -138,12 +161,11 @@ class WalletConnectServiceSolana {
138
161
  if (!feeResponse.value) {
139
162
  throw new Error('Failed to calculate fee');
140
163
  }
141
- const feeBn = blockchain_service_1.BSBigNumberHelper.fromDecimals(feeResponse.value.toString(), __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f").feeToken.decimals);
142
- return blockchain_service_1.BSBigNumberHelper.toNumber(feeBn).toString();
164
+ return new blockchain_service_1.BSBigUnitAmount(feeResponse.value.toString(), __classPrivateFieldGet(this, _WalletConnectServiceSolana_service, "f").feeToken.decimals).toHuman().toFormatted();
143
165
  }
144
166
  }
145
167
  exports.WalletConnectServiceSolana = WalletConnectServiceSolana;
146
- _WalletConnectServiceSolana_service = new WeakMap(), _WalletConnectServiceSolana_instances = new WeakSet(), _WalletConnectServiceSolana_parseTransaction = function _WalletConnectServiceSolana_parseTransaction(encodedTransaction) {
168
+ _WalletConnectServiceSolana_service = new WeakMap(), _WalletConnectServiceSolana_getAccountsHandler = new WeakMap(), _WalletConnectServiceSolana_signMessageHandler = new WeakMap(), _WalletConnectServiceSolana_signTransactionHandler = new WeakMap(), _WalletConnectServiceSolana_signAllTransactionsHandler = new WeakMap(), _WalletConnectServiceSolana_signAndSendTransactionHandler = new WeakMap(), _WalletConnectServiceSolana_instances = new WeakSet(), _WalletConnectServiceSolana_parseTransaction = function _WalletConnectServiceSolana_parseTransaction(encodedTransaction) {
147
169
  const transactionBytes = solanaKit.getBase64Encoder().encode(encodedTransaction);
148
170
  const transaction = solanaKit.getTransactionCodec().decode(transactionBytes);
149
171
  return transaction;
package/dist/types.d.ts CHANGED
@@ -82,3 +82,4 @@ export type TMetaplexAssetResponse = {
82
82
  export type TRpcBDSSolanaParsedInstruction = Extract<TransactionForFullJsonParsed<'legacy'>['transaction']['message']['instructions'][number], {
83
83
  parsed: any;
84
84
  }>;
85
+ export type TWalletConnectServiceSolanaMethod = 'solana_getAccounts' | 'solana_requestAccounts' | 'solana_signMessage' | 'solana_signTransaction' | 'solana_signAllTransactions' | 'solana_signAndSendTransaction';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cityofzion/bs-solana",
3
- "version": "3.1.9",
3
+ "version": "3.1.11",
4
4
  "repository": "https://github.com/CityOfZion/blockchain-services",
5
5
  "license": "MIT",
6
6
  "author": "Coz",
@@ -15,9 +15,10 @@
15
15
  "@solana-program/system": "~0.12.0",
16
16
  "@solana-program/token": "~0.11.0",
17
17
  "@solana/kit": "~6.1.0",
18
- "axios": "~1.13.5",
18
+ "axios": "~1.15.0",
19
19
  "date-fns": "~4.1.0",
20
- "@cityofzion/blockchain-service": "3.1.9"
20
+ "zod": "~4.3.6",
21
+ "@cityofzion/blockchain-service": "3.1.11"
21
22
  },
22
23
  "devDependencies": {
23
24
  "@ledgerhq/hw-transport-node-hid": "~6.30.0",