@solana/web3.js 2.0.0-experimental.e8095b1 → 2.0.0-experimental.e9c1b10

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.
Files changed (54) hide show
  1. package/README.md +1153 -43
  2. package/dist/index.browser.cjs +186 -44
  3. package/dist/index.browser.cjs.map +1 -1
  4. package/dist/index.browser.js +148 -45
  5. package/dist/index.browser.js.map +1 -1
  6. package/dist/index.development.js +3579 -2192
  7. package/dist/index.development.js.map +1 -1
  8. package/dist/index.native.js +148 -45
  9. package/dist/index.native.js.map +1 -1
  10. package/dist/index.node.cjs +188 -44
  11. package/dist/index.node.cjs.map +1 -1
  12. package/dist/index.node.js +148 -45
  13. package/dist/index.node.js.map +1 -1
  14. package/dist/index.production.min.js +270 -59
  15. package/dist/types/airdrop-confirmer.d.ts +6 -7
  16. package/dist/types/airdrop-confirmer.d.ts.map +1 -1
  17. package/dist/types/airdrop.d.ts +10 -12
  18. package/dist/types/airdrop.d.ts.map +1 -1
  19. package/dist/types/decode-transaction.d.ts +10 -0
  20. package/dist/types/decode-transaction.d.ts.map +1 -0
  21. package/dist/types/index.d.ts +17 -9
  22. package/dist/types/index.d.ts.map +1 -1
  23. package/dist/types/rpc-default-config.d.ts.map +1 -1
  24. package/dist/types/rpc-integer-overflow-error.d.ts +3 -2
  25. package/dist/types/rpc-integer-overflow-error.d.ts.map +1 -1
  26. package/dist/types/rpc-request-coalescer.d.ts +1 -1
  27. package/dist/types/rpc-request-coalescer.d.ts.map +1 -1
  28. package/dist/types/rpc-subscription-coalescer.d.ts +1 -1
  29. package/dist/types/rpc-subscription-coalescer.d.ts.map +1 -1
  30. package/dist/types/rpc-transport.d.ts +1 -2
  31. package/dist/types/rpc-transport.d.ts.map +1 -1
  32. package/dist/types/rpc-websocket-autopinger.d.ts +1 -1
  33. package/dist/types/rpc-websocket-autopinger.d.ts.map +1 -1
  34. package/dist/types/rpc-websocket-connection-sharding.d.ts +1 -1
  35. package/dist/types/rpc-websocket-connection-sharding.d.ts.map +1 -1
  36. package/dist/types/rpc-websocket-transport.d.ts +1 -2
  37. package/dist/types/rpc-websocket-transport.d.ts.map +1 -1
  38. package/dist/types/rpc.d.ts +1 -1
  39. package/dist/types/rpc.d.ts.map +1 -1
  40. package/dist/types/send-transaction.d.ts +31 -38
  41. package/dist/types/send-transaction.d.ts.map +1 -1
  42. package/dist/types/transaction-confirmation-strategy-blockheight.d.ts +9 -5
  43. package/dist/types/transaction-confirmation-strategy-blockheight.d.ts.map +1 -1
  44. package/dist/types/transaction-confirmation-strategy-nonce.d.ts +4 -6
  45. package/dist/types/transaction-confirmation-strategy-nonce.d.ts.map +1 -1
  46. package/dist/types/transaction-confirmation-strategy-racer.d.ts +9 -5
  47. package/dist/types/transaction-confirmation-strategy-racer.d.ts.map +1 -1
  48. package/dist/types/transaction-confirmation-strategy-recent-signature.d.ts +4 -6
  49. package/dist/types/transaction-confirmation-strategy-recent-signature.d.ts.map +1 -1
  50. package/dist/types/transaction-confirmation-strategy-timeout.d.ts +1 -1
  51. package/dist/types/transaction-confirmation-strategy-timeout.d.ts.map +1 -1
  52. package/dist/types/transaction-confirmation.d.ts +6 -11
  53. package/dist/types/transaction-confirmation.d.ts.map +1 -1
  54. package/package.json +24 -18
@@ -1,13 +1,22 @@
1
+ import { fetchJsonParsedAccounts, assertAccountsDecoded, assertAccountsExist } from '@solana/accounts';
2
+ export * from '@solana/accounts';
1
3
  export * from '@solana/addresses';
4
+ import { getBase58Decoder, getBase64Encoder } from '@solana/codecs';
5
+ export * from '@solana/codecs';
6
+ import { pipe } from '@solana/functional';
7
+ export * from '@solana/functional';
2
8
  export * from '@solana/instructions';
3
9
  export * from '@solana/keys';
4
- import { getSignatureFromTransaction, getBase64EncodedWireTransaction } from '@solana/transactions';
10
+ export * from '@solana/programs';
11
+ export * from '@solana/rpc-parsed-types';
12
+ import { commitmentComparator } from '@solana/rpc-types';
13
+ export * from '@solana/rpc-types';
14
+ export * from '@solana/signers';
15
+ import { getCompiledTransactionDecoder, decompileTransaction, getSignatureFromTransaction, getBase64EncodedWireTransaction } from '@solana/transactions';
5
16
  export * from '@solana/transactions';
6
- import { commitmentComparator, createSolanaRpcApi, createSolanaRpcSubscriptionsApi, createSolanaRpcSubscriptionsApi_UNSTABLE } from '@solana/rpc-core';
7
- import { pipe } from '@solana/functional';
17
+ import { createSolanaRpcApi, createSolanaRpcSubscriptionsApi, createSolanaRpcSubscriptionsApi_UNSTABLE } from '@solana/rpc-core';
8
18
  import { createJsonRpc, createJsonSubscriptionRpc, createHttpTransport, createWebSocketTransport } from '@solana/rpc-transport';
9
19
  import fastStableStringify from 'fast-stable-stringify';
10
- import { base64, base58 } from '@metaplex-foundation/umi-serializers';
11
20
 
12
21
  // ../build-scripts/env-shim.ts
13
22
  var __DEV__ = /* @__PURE__ */ (() => process["env"].NODE_ENV === "development")();
@@ -15,12 +24,14 @@ var __DEV__ = /* @__PURE__ */ (() => process["env"].NODE_ENV === "development")(
15
24
  // src/transaction-confirmation-strategy-racer.ts
16
25
  async function raceStrategies(signature, config, getSpecificStrategiesForRace) {
17
26
  const { abortSignal: callerAbortSignal, commitment, getRecentSignatureConfirmationPromise } = config;
18
- callerAbortSignal.throwIfAborted();
27
+ callerAbortSignal?.throwIfAborted();
19
28
  const abortController = new AbortController();
20
- function handleAbort() {
21
- abortController.abort();
29
+ if (callerAbortSignal) {
30
+ const handleAbort = () => {
31
+ abortController.abort();
32
+ };
33
+ callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
22
34
  }
23
- callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
24
35
  try {
25
36
  const specificStrategies = getSpecificStrategiesForRace({
26
37
  ...config,
@@ -164,26 +175,63 @@ async function requestAndConfirmAirdrop({
164
175
  });
165
176
  return airdropTransactionSignature;
166
177
  }
178
+ var compiledTransactionDecoder = void 0;
179
+ async function fetchLookupTables(lookupTableAddresses, rpc, config) {
180
+ const fetchedLookupTables = await fetchJsonParsedAccounts(
181
+ rpc,
182
+ lookupTableAddresses,
183
+ config
184
+ );
185
+ assertAccountsDecoded(fetchedLookupTables);
186
+ assertAccountsExist(fetchedLookupTables);
187
+ return fetchedLookupTables.reduce((acc, lookup) => {
188
+ return {
189
+ ...acc,
190
+ [lookup.address]: lookup.data.addresses
191
+ };
192
+ }, {});
193
+ }
194
+ async function decodeTransaction(encodedTransaction, rpc, config) {
195
+ const { lastValidBlockHeight, ...fetchAccountsConfig } = config ?? {};
196
+ if (!compiledTransactionDecoder)
197
+ compiledTransactionDecoder = getCompiledTransactionDecoder();
198
+ const compiledTransaction = compiledTransactionDecoder.decode(encodedTransaction);
199
+ const { compiledMessage } = compiledTransaction;
200
+ const lookupTables = "addressTableLookups" in compiledMessage && compiledMessage.addressTableLookups !== void 0 && compiledMessage.addressTableLookups.length > 0 ? compiledMessage.addressTableLookups : [];
201
+ const lookupTableAddresses = lookupTables.map((l) => l.lookupTableAddress);
202
+ const fetchedLookupTables = lookupTableAddresses.length > 0 ? await fetchLookupTables(lookupTableAddresses, rpc, fetchAccountsConfig) : {};
203
+ return decompileTransaction(compiledTransaction, {
204
+ addressesByLookupTableAddress: fetchedLookupTables,
205
+ lastValidBlockHeight
206
+ });
207
+ }
167
208
 
168
209
  // src/rpc-integer-overflow-error.ts
169
210
  var SolanaJsonRpcIntegerOverflowError = class extends Error {
211
+ methodName;
212
+ keyPath;
213
+ value;
170
214
  constructor(methodName, keyPath, value) {
171
- const argPosition = (typeof keyPath[0] === "number" ? keyPath[0] : parseInt(keyPath[0], 10)) + 1;
172
- let ordinal = "";
173
- const lastDigit = argPosition % 10;
174
- const lastTwoDigits = argPosition % 100;
175
- if (lastDigit == 1 && lastTwoDigits != 11) {
176
- ordinal = argPosition + "st";
177
- } else if (lastDigit == 2 && lastTwoDigits != 12) {
178
- ordinal = argPosition + "nd";
179
- } else if (lastDigit == 3 && lastTwoDigits != 13) {
180
- ordinal = argPosition + "rd";
215
+ let argumentLabel = "";
216
+ if (typeof keyPath[0] === "number") {
217
+ const argPosition = keyPath[0] + 1;
218
+ const lastDigit = argPosition % 10;
219
+ const lastTwoDigits = argPosition % 100;
220
+ if (lastDigit == 1 && lastTwoDigits != 11) {
221
+ argumentLabel = argPosition + "st";
222
+ } else if (lastDigit == 2 && lastTwoDigits != 12) {
223
+ argumentLabel = argPosition + "nd";
224
+ } else if (lastDigit == 3 && lastTwoDigits != 13) {
225
+ argumentLabel = argPosition + "rd";
226
+ } else {
227
+ argumentLabel = argPosition + "th";
228
+ }
181
229
  } else {
182
- ordinal = argPosition + "th";
230
+ argumentLabel = `\`${keyPath[0].toString()}\``;
183
231
  }
184
232
  const path = keyPath.length > 1 ? keyPath.slice(1).map((pathPart) => typeof pathPart === "number" ? `[${pathPart}]` : pathPart).join(".") : null;
185
233
  super(
186
- `The ${ordinal} argument to the \`${methodName}\` RPC method${path ? ` at path \`${path}\`` : ""} was \`${value}\`. This number is unsafe for use with the Solana JSON-RPC because it exceeds \`Number.MAX_SAFE_INTEGER\`.`
234
+ `The ${argumentLabel} argument to the \`${methodName}\` RPC method${path ? ` at path \`${path}\`` : ""} was \`${value}\`. This number is unsafe for use with the Solana JSON-RPC because it exceeds \`Number.MAX_SAFE_INTEGER\`.`
187
235
  );
188
236
  this.keyPath = keyPath;
189
237
  this.methodName = methodName;
@@ -196,6 +244,7 @@ var SolanaJsonRpcIntegerOverflowError = class extends Error {
196
244
 
197
245
  // src/rpc-default-config.ts
198
246
  var DEFAULT_RPC_CONFIG = {
247
+ defaultCommitment: "confirmed",
199
248
  onIntegerOverflow(methodName, keyPath, value) {
200
249
  throw new SolanaJsonRpcIntegerOverflowError(methodName, keyPath, value);
201
250
  }
@@ -355,11 +404,11 @@ function getRpcSubscriptionsWithSubscriptionCoalescing({
355
404
  return {
356
405
  ...iterable,
357
406
  async *[Symbol.asyncIterator]() {
358
- abortPromise || (abortPromise = abortSignal.aborted ? Promise.reject(EXPLICIT_ABORT_TOKEN) : new Promise((_, reject) => {
407
+ abortPromise ||= abortSignal.aborted ? Promise.reject(EXPLICIT_ABORT_TOKEN) : new Promise((_, reject) => {
359
408
  abortSignal.addEventListener("abort", () => {
360
409
  reject(EXPLICIT_ABORT_TOKEN);
361
410
  });
362
- }));
411
+ });
363
412
  try {
364
413
  const iterator = iterable[Symbol.asyncIterator]();
365
414
  while (true) {
@@ -431,13 +480,23 @@ function getRpcTransportWithRequestCoalescing(transport, getDeduplicationKey) {
431
480
  }
432
481
  if (coalescedRequestsByDeduplicationKey[deduplicationKey] == null) {
433
482
  const abortController = new AbortController();
483
+ const responsePromise = (async () => {
484
+ try {
485
+ return await transport({
486
+ ...config,
487
+ signal: abortController.signal
488
+ });
489
+ } catch (e) {
490
+ if (e && typeof e === "object" && "name" in e && e.name === "AbortError") {
491
+ return;
492
+ }
493
+ throw e;
494
+ }
495
+ })();
434
496
  coalescedRequestsByDeduplicationKey[deduplicationKey] = {
435
497
  abortController,
436
498
  numConsumers: 0,
437
- responsePromise: transport({
438
- ...config,
439
- signal: abortController.signal
440
- })
499
+ responsePromise
441
500
  };
442
501
  }
443
502
  const coalescedRequest = coalescedRequestsByDeduplicationKey[deduplicationKey];
@@ -602,22 +661,52 @@ function createDefaultRpcSubscriptionsTransport(config) {
602
661
  }
603
662
 
604
663
  // src/transaction-confirmation-strategy-blockheight.ts
605
- function createBlockHeightExceedencePromiseFactory(rpcSubscriptions) {
606
- return async function getBlockHeightExceedencePromise({ abortSignal: callerAbortSignal, lastValidBlockHeight }) {
664
+ function createBlockHeightExceedencePromiseFactory({
665
+ rpc,
666
+ rpcSubscriptions
667
+ }) {
668
+ return async function getBlockHeightExceedencePromise({
669
+ abortSignal: callerAbortSignal,
670
+ commitment,
671
+ lastValidBlockHeight
672
+ }) {
607
673
  const abortController = new AbortController();
608
- function handleAbort() {
674
+ const handleAbort = () => {
609
675
  abortController.abort();
610
- }
676
+ };
611
677
  callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
612
- const slotNotifications = await rpcSubscriptions.slotNotifications().subscribe({ abortSignal: abortController.signal });
678
+ async function getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight() {
679
+ const { absoluteSlot, blockHeight } = await rpc.getEpochInfo({ commitment }).send({ abortSignal: abortController.signal });
680
+ return {
681
+ blockHeight,
682
+ differenceBetweenSlotHeightAndBlockHeight: absoluteSlot - blockHeight
683
+ };
684
+ }
613
685
  try {
614
- for await (const slotNotification of slotNotifications) {
615
- if (slotNotification.slot > lastValidBlockHeight) {
616
- throw new Error(
617
- "The network has progressed past the last block for which this transaction could have committed."
618
- );
686
+ const [slotNotifications, { blockHeight, differenceBetweenSlotHeightAndBlockHeight }] = await Promise.all([
687
+ rpcSubscriptions.slotNotifications().subscribe({ abortSignal: abortController.signal }),
688
+ getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight()
689
+ ]);
690
+ if (blockHeight <= lastValidBlockHeight) {
691
+ let lastKnownDifferenceBetweenSlotHeightAndBlockHeight = differenceBetweenSlotHeightAndBlockHeight;
692
+ for await (const slotNotification of slotNotifications) {
693
+ const { slot } = slotNotification;
694
+ if (slot - lastKnownDifferenceBetweenSlotHeightAndBlockHeight > lastValidBlockHeight) {
695
+ const {
696
+ blockHeight: currentBlockHeight,
697
+ differenceBetweenSlotHeightAndBlockHeight: currentDifferenceBetweenSlotHeightAndBlockHeight
698
+ } = await getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight();
699
+ if (currentBlockHeight > lastValidBlockHeight) {
700
+ break;
701
+ } else {
702
+ lastKnownDifferenceBetweenSlotHeightAndBlockHeight = currentDifferenceBetweenSlotHeightAndBlockHeight;
703
+ }
704
+ }
619
705
  }
620
706
  }
707
+ throw new Error(
708
+ "The network has progressed past the last block for which this transaction could have been committed."
709
+ );
621
710
  } finally {
622
711
  abortController.abort();
623
712
  }
@@ -639,10 +728,12 @@ function createNonceInvalidationPromiseFactory(rpc, rpcSubscriptions) {
639
728
  }
640
729
  callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
641
730
  const accountNotifications = await rpcSubscriptions.accountNotifications(nonceAccountAddress, { commitment, encoding: "base64" }).subscribe({ abortSignal: abortController.signal });
731
+ const base58Decoder = getBase58Decoder();
732
+ const base64Encoder = getBase64Encoder();
642
733
  function getNonceFromAccountData([base64EncodedBytes]) {
643
- const data = base64.serialize(base64EncodedBytes);
734
+ const data = base64Encoder.encode(base64EncodedBytes);
644
735
  const nonceValueBytes = data.slice(NONCE_VALUE_OFFSET, NONCE_VALUE_OFFSET + 32);
645
- return base58.deserialize(nonceValueBytes)[0];
736
+ return base58Decoder.decode(nonceValueBytes);
646
737
  }
647
738
  const nonceAccountDidAdvancePromise = (async () => {
648
739
  for await (const accountNotification of accountNotifications) {
@@ -707,7 +798,10 @@ function createDefaultRecentTransactionConfirmer({
707
798
  rpc,
708
799
  rpcSubscriptions
709
800
  }) {
710
- const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory(rpcSubscriptions);
801
+ const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory({
802
+ rpc,
803
+ rpcSubscriptions
804
+ });
711
805
  const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory(
712
806
  rpc,
713
807
  rpcSubscriptions
@@ -740,10 +834,16 @@ async function waitForRecentTransactionConfirmation(config) {
740
834
  await raceStrategies(
741
835
  getSignatureFromTransaction(config.transaction),
742
836
  config,
743
- function getSpecificStrategiesForRace({ abortSignal, getBlockHeightExceedencePromise, transaction }) {
837
+ function getSpecificStrategiesForRace({
838
+ abortSignal,
839
+ commitment,
840
+ getBlockHeightExceedencePromise,
841
+ transaction
842
+ }) {
744
843
  return [
745
844
  getBlockHeightExceedencePromise({
746
845
  abortSignal,
846
+ commitment,
747
847
  lastValidBlockHeight: transaction.lifetimeConstraint.lastValidBlockHeight
748
848
  })
749
849
  ];
@@ -778,7 +878,7 @@ async function sendTransaction_INTERNAL({
778
878
  commitment,
779
879
  rpc,
780
880
  transaction,
781
- sendTransactionConfig
881
+ ...sendTransactionConfig
782
882
  }) {
783
883
  const base64EncodedWireTransaction = getBase64EncodedWireTransaction(transaction);
784
884
  return await rpc.sendTransaction(base64EncodedWireTransaction, {
@@ -803,7 +903,10 @@ function createDefaultDurableNonceTransactionSender({
803
903
  });
804
904
  };
805
905
  }
806
- function createDefaultTransactionSender({ rpc, rpcSubscriptions }) {
906
+ function createDefaultTransactionSender({
907
+ rpc,
908
+ rpcSubscriptions
909
+ }) {
807
910
  const confirmRecentTransaction = createDefaultRecentTransactionConfirmer({
808
911
  rpc,
809
912
  rpcSubscriptions
@@ -826,10 +929,10 @@ async function sendAndConfirmDurableNonceTransaction({
826
929
  ...sendTransactionConfig
827
930
  }) {
828
931
  const transactionSignature = await sendTransaction_INTERNAL({
932
+ ...sendTransactionConfig,
829
933
  abortSignal,
830
934
  commitment,
831
935
  rpc,
832
- sendTransactionConfig,
833
936
  transaction
834
937
  });
835
938
  await confirmDurableNonceTransaction({
@@ -848,10 +951,10 @@ async function sendAndConfirmTransaction({
848
951
  ...sendTransactionConfig
849
952
  }) {
850
953
  const transactionSignature = await sendTransaction_INTERNAL({
954
+ ...sendTransactionConfig,
851
955
  abortSignal,
852
956
  commitment,
853
957
  rpc,
854
- sendTransactionConfig,
855
958
  transaction
856
959
  });
857
960
  await confirmRecentTransaction({
@@ -862,6 +965,6 @@ async function sendAndConfirmTransaction({
862
965
  return transactionSignature;
863
966
  }
864
967
 
865
- export { createBlockHeightExceedencePromiseFactory, createDefaultAirdropRequester, createDefaultDurableNonceTransactionConfirmer, createDefaultDurableNonceTransactionSender, createDefaultRecentTransactionConfirmer, createDefaultRpcSubscriptionsTransport, createDefaultRpcTransport, createDefaultTransactionSender, createNonceInvalidationPromiseFactory, createRecentSignatureConfirmationPromiseFactory, createSolanaRpc, createSolanaRpcSubscriptions, createSolanaRpcSubscriptions_UNSTABLE, requestAndConfirmAirdrop, sendAndConfirmDurableNonceTransaction, sendAndConfirmTransaction, waitForDurableNonceTransactionConfirmation, waitForRecentTransactionConfirmation };
968
+ export { createBlockHeightExceedencePromiseFactory, createDefaultAirdropRequester, createDefaultDurableNonceTransactionConfirmer, createDefaultDurableNonceTransactionSender, createDefaultRecentTransactionConfirmer, createDefaultRpcSubscriptionsTransport, createDefaultRpcTransport, createDefaultTransactionSender, createNonceInvalidationPromiseFactory, createRecentSignatureConfirmationPromiseFactory, createSolanaRpc, createSolanaRpcSubscriptions, createSolanaRpcSubscriptions_UNSTABLE, decodeTransaction, requestAndConfirmAirdrop, sendAndConfirmDurableNonceTransaction, sendAndConfirmTransaction, waitForDurableNonceTransactionConfirmation, waitForRecentTransactionConfirmation };
866
969
  //# sourceMappingURL=out.js.map
867
970
  //# sourceMappingURL=index.browser.js.map