@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];
@@ -591,22 +650,52 @@ function createDefaultRpcSubscriptionsTransport(config) {
591
650
  }
592
651
 
593
652
  // src/transaction-confirmation-strategy-blockheight.ts
594
- function createBlockHeightExceedencePromiseFactory(rpcSubscriptions) {
595
- return async function getBlockHeightExceedencePromise({ abortSignal: callerAbortSignal, lastValidBlockHeight }) {
653
+ function createBlockHeightExceedencePromiseFactory({
654
+ rpc,
655
+ rpcSubscriptions
656
+ }) {
657
+ return async function getBlockHeightExceedencePromise({
658
+ abortSignal: callerAbortSignal,
659
+ commitment,
660
+ lastValidBlockHeight
661
+ }) {
596
662
  const abortController = new AbortController();
597
- function handleAbort() {
663
+ const handleAbort = () => {
598
664
  abortController.abort();
599
- }
665
+ };
600
666
  callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
601
- const slotNotifications = await rpcSubscriptions.slotNotifications().subscribe({ abortSignal: abortController.signal });
667
+ async function getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight() {
668
+ const { absoluteSlot, blockHeight } = await rpc.getEpochInfo({ commitment }).send({ abortSignal: abortController.signal });
669
+ return {
670
+ blockHeight,
671
+ differenceBetweenSlotHeightAndBlockHeight: absoluteSlot - blockHeight
672
+ };
673
+ }
602
674
  try {
603
- for await (const slotNotification of slotNotifications) {
604
- if (slotNotification.slot > lastValidBlockHeight) {
605
- throw new Error(
606
- "The network has progressed past the last block for which this transaction could have committed."
607
- );
675
+ const [slotNotifications, { blockHeight, differenceBetweenSlotHeightAndBlockHeight }] = await Promise.all([
676
+ rpcSubscriptions.slotNotifications().subscribe({ abortSignal: abortController.signal }),
677
+ getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight()
678
+ ]);
679
+ if (blockHeight <= lastValidBlockHeight) {
680
+ let lastKnownDifferenceBetweenSlotHeightAndBlockHeight = differenceBetweenSlotHeightAndBlockHeight;
681
+ for await (const slotNotification of slotNotifications) {
682
+ const { slot } = slotNotification;
683
+ if (slot - lastKnownDifferenceBetweenSlotHeightAndBlockHeight > lastValidBlockHeight) {
684
+ const {
685
+ blockHeight: currentBlockHeight,
686
+ differenceBetweenSlotHeightAndBlockHeight: currentDifferenceBetweenSlotHeightAndBlockHeight
687
+ } = await getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight();
688
+ if (currentBlockHeight > lastValidBlockHeight) {
689
+ break;
690
+ } else {
691
+ lastKnownDifferenceBetweenSlotHeightAndBlockHeight = currentDifferenceBetweenSlotHeightAndBlockHeight;
692
+ }
693
+ }
608
694
  }
609
695
  }
696
+ throw new Error(
697
+ "The network has progressed past the last block for which this transaction could have been committed."
698
+ );
610
699
  } finally {
611
700
  abortController.abort();
612
701
  }
@@ -628,10 +717,12 @@ function createNonceInvalidationPromiseFactory(rpc, rpcSubscriptions) {
628
717
  }
629
718
  callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
630
719
  const accountNotifications = await rpcSubscriptions.accountNotifications(nonceAccountAddress, { commitment, encoding: "base64" }).subscribe({ abortSignal: abortController.signal });
720
+ const base58Decoder = getBase58Decoder();
721
+ const base64Encoder = getBase64Encoder();
631
722
  function getNonceFromAccountData([base64EncodedBytes]) {
632
- const data = base64.serialize(base64EncodedBytes);
723
+ const data = base64Encoder.encode(base64EncodedBytes);
633
724
  const nonceValueBytes = data.slice(NONCE_VALUE_OFFSET, NONCE_VALUE_OFFSET + 32);
634
- return base58.deserialize(nonceValueBytes)[0];
725
+ return base58Decoder.decode(nonceValueBytes);
635
726
  }
636
727
  const nonceAccountDidAdvancePromise = (async () => {
637
728
  for await (const accountNotification of accountNotifications) {
@@ -696,7 +787,10 @@ function createDefaultRecentTransactionConfirmer({
696
787
  rpc,
697
788
  rpcSubscriptions
698
789
  }) {
699
- const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory(rpcSubscriptions);
790
+ const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory({
791
+ rpc,
792
+ rpcSubscriptions
793
+ });
700
794
  const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory(
701
795
  rpc,
702
796
  rpcSubscriptions
@@ -729,10 +823,16 @@ async function waitForRecentTransactionConfirmation(config) {
729
823
  await raceStrategies(
730
824
  getSignatureFromTransaction(config.transaction),
731
825
  config,
732
- function getSpecificStrategiesForRace({ abortSignal, getBlockHeightExceedencePromise, transaction }) {
826
+ function getSpecificStrategiesForRace({
827
+ abortSignal,
828
+ commitment,
829
+ getBlockHeightExceedencePromise,
830
+ transaction
831
+ }) {
733
832
  return [
734
833
  getBlockHeightExceedencePromise({
735
834
  abortSignal,
835
+ commitment,
736
836
  lastValidBlockHeight: transaction.lifetimeConstraint.lastValidBlockHeight
737
837
  })
738
838
  ];
@@ -767,7 +867,7 @@ async function sendTransaction_INTERNAL({
767
867
  commitment,
768
868
  rpc,
769
869
  transaction,
770
- sendTransactionConfig
870
+ ...sendTransactionConfig
771
871
  }) {
772
872
  const base64EncodedWireTransaction = getBase64EncodedWireTransaction(transaction);
773
873
  return await rpc.sendTransaction(base64EncodedWireTransaction, {
@@ -792,7 +892,10 @@ function createDefaultDurableNonceTransactionSender({
792
892
  });
793
893
  };
794
894
  }
795
- function createDefaultTransactionSender({ rpc, rpcSubscriptions }) {
895
+ function createDefaultTransactionSender({
896
+ rpc,
897
+ rpcSubscriptions
898
+ }) {
796
899
  const confirmRecentTransaction = createDefaultRecentTransactionConfirmer({
797
900
  rpc,
798
901
  rpcSubscriptions
@@ -815,10 +918,10 @@ async function sendAndConfirmDurableNonceTransaction({
815
918
  ...sendTransactionConfig
816
919
  }) {
817
920
  const transactionSignature = await sendTransaction_INTERNAL({
921
+ ...sendTransactionConfig,
818
922
  abortSignal,
819
923
  commitment,
820
924
  rpc,
821
- sendTransactionConfig,
822
925
  transaction
823
926
  });
824
927
  await confirmDurableNonceTransaction({
@@ -837,10 +940,10 @@ async function sendAndConfirmTransaction({
837
940
  ...sendTransactionConfig
838
941
  }) {
839
942
  const transactionSignature = await sendTransaction_INTERNAL({
943
+ ...sendTransactionConfig,
840
944
  abortSignal,
841
945
  commitment,
842
946
  rpc,
843
- sendTransactionConfig,
844
947
  transaction
845
948
  });
846
949
  await confirmRecentTransaction({
@@ -851,6 +954,6 @@ async function sendAndConfirmTransaction({
851
954
  return transactionSignature;
852
955
  }
853
956
 
854
- export { createBlockHeightExceedencePromiseFactory, createDefaultAirdropRequester, createDefaultDurableNonceTransactionConfirmer, createDefaultDurableNonceTransactionSender, createDefaultRecentTransactionConfirmer, createDefaultRpcSubscriptionsTransport, createDefaultRpcTransport, createDefaultTransactionSender, createNonceInvalidationPromiseFactory, createRecentSignatureConfirmationPromiseFactory, createSolanaRpc, createSolanaRpcSubscriptions, createSolanaRpcSubscriptions_UNSTABLE, requestAndConfirmAirdrop, sendAndConfirmDurableNonceTransaction, sendAndConfirmTransaction, waitForDurableNonceTransactionConfirmation, waitForRecentTransactionConfirmation };
957
+ export { createBlockHeightExceedencePromiseFactory, createDefaultAirdropRequester, createDefaultDurableNonceTransactionConfirmer, createDefaultDurableNonceTransactionSender, createDefaultRecentTransactionConfirmer, createDefaultRpcSubscriptionsTransport, createDefaultRpcTransport, createDefaultTransactionSender, createNonceInvalidationPromiseFactory, createRecentSignatureConfirmationPromiseFactory, createSolanaRpc, createSolanaRpcSubscriptions, createSolanaRpcSubscriptions_UNSTABLE, decodeTransaction, requestAndConfirmAirdrop, sendAndConfirmDurableNonceTransaction, sendAndConfirmTransaction, waitForDurableNonceTransactionConfirmation, waitForRecentTransactionConfirmation };
855
958
  //# sourceMappingURL=out.js.map
856
959
  //# sourceMappingURL=index.native.js.map