@solana/web3.js 2.0.0-experimental.71a42a7 → 2.0.0-experimental.7297b81

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 (49) hide show
  1. package/README.md +1155 -43
  2. package/dist/index.browser.cjs +295 -72
  3. package/dist/index.browser.cjs.map +1 -1
  4. package/dist/index.browser.js +287 -75
  5. package/dist/index.browser.js.map +1 -1
  6. package/dist/index.development.js +1416 -1270
  7. package/dist/index.development.js.map +1 -1
  8. package/dist/index.native.js +289 -75
  9. package/dist/index.native.js.map +1 -1
  10. package/dist/index.node.cjs +297 -72
  11. package/dist/index.node.cjs.map +1 -1
  12. package/dist/index.node.js +287 -75
  13. package/dist/index.node.js.map +1 -1
  14. package/dist/index.production.min.js +82 -52
  15. package/dist/types/airdrop-confirmer.d.ts +19 -0
  16. package/dist/types/airdrop-confirmer.d.ts.map +1 -0
  17. package/dist/types/airdrop.d.ts +21 -0
  18. package/dist/types/airdrop.d.ts.map +1 -0
  19. package/dist/types/index.d.ts +10 -7
  20. package/dist/types/index.d.ts.map +1 -1
  21. package/dist/types/rpc-request-coalescer.d.ts +1 -1
  22. package/dist/types/rpc-request-coalescer.d.ts.map +1 -1
  23. package/dist/types/rpc-subscription-coalescer.d.ts +1 -1
  24. package/dist/types/rpc-subscription-coalescer.d.ts.map +1 -1
  25. package/dist/types/rpc-transport.d.ts +1 -2
  26. package/dist/types/rpc-transport.d.ts.map +1 -1
  27. package/dist/types/rpc-websocket-autopinger.d.ts +1 -1
  28. package/dist/types/rpc-websocket-autopinger.d.ts.map +1 -1
  29. package/dist/types/rpc-websocket-connection-sharding.d.ts +1 -1
  30. package/dist/types/rpc-websocket-connection-sharding.d.ts.map +1 -1
  31. package/dist/types/rpc-websocket-transport.d.ts +1 -2
  32. package/dist/types/rpc-websocket-transport.d.ts.map +1 -1
  33. package/dist/types/rpc.d.ts +1 -2
  34. package/dist/types/rpc.d.ts.map +1 -1
  35. package/dist/types/send-transaction.d.ts +38 -0
  36. package/dist/types/send-transaction.d.ts.map +1 -0
  37. package/dist/types/transaction-confirmation-strategy-blockheight.d.ts +2 -3
  38. package/dist/types/transaction-confirmation-strategy-blockheight.d.ts.map +1 -1
  39. package/dist/types/transaction-confirmation-strategy-nonce.d.ts +5 -6
  40. package/dist/types/transaction-confirmation-strategy-nonce.d.ts.map +1 -1
  41. package/dist/types/transaction-confirmation-strategy-racer.d.ts +14 -0
  42. package/dist/types/transaction-confirmation-strategy-racer.d.ts.map +1 -0
  43. package/dist/types/transaction-confirmation-strategy-recent-signature.d.ts +5 -6
  44. package/dist/types/transaction-confirmation-strategy-recent-signature.d.ts.map +1 -1
  45. package/dist/types/transaction-confirmation-strategy-timeout.d.ts +8 -0
  46. package/dist/types/transaction-confirmation-strategy-timeout.d.ts.map +1 -0
  47. package/dist/types/transaction-confirmation.d.ts +13 -20
  48. package/dist/types/transaction-confirmation.d.ts.map +1 -1
  49. package/package.json +19 -18
@@ -3,12 +3,13 @@
3
3
  var addresses = require('@solana/addresses');
4
4
  var instructions = require('@solana/instructions');
5
5
  var keys = require('@solana/keys');
6
+ var rpcTypes = require('@solana/rpc-types');
6
7
  var transactions = require('@solana/transactions');
7
8
  var functional = require('@solana/functional');
8
9
  var rpcCore = require('@solana/rpc-core');
9
10
  var rpcTransport = require('@solana/rpc-transport');
10
11
  var fastStableStringify = require('fast-stable-stringify');
11
- var umiSerializers = require('@metaplex-foundation/umi-serializers');
12
+ var codecsStrings = require('@solana/codecs-strings');
12
13
 
13
14
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
14
15
 
@@ -17,8 +18,166 @@ var fastStableStringify__default = /*#__PURE__*/_interopDefault(fastStableString
17
18
  // ../build-scripts/env-shim.ts
18
19
  var __DEV__ = /* @__PURE__ */ (() => process["env"].NODE_ENV === "development")();
19
20
 
21
+ // src/transaction-confirmation-strategy-racer.ts
22
+ async function raceStrategies(signature, config, getSpecificStrategiesForRace) {
23
+ const { abortSignal: callerAbortSignal, commitment, getRecentSignatureConfirmationPromise } = config;
24
+ callerAbortSignal?.throwIfAborted();
25
+ const abortController = new AbortController();
26
+ if (callerAbortSignal) {
27
+ const handleAbort = () => {
28
+ abortController.abort();
29
+ };
30
+ callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
31
+ }
32
+ try {
33
+ const specificStrategies = getSpecificStrategiesForRace({
34
+ ...config,
35
+ abortSignal: abortController.signal
36
+ });
37
+ return await Promise.race([
38
+ getRecentSignatureConfirmationPromise({
39
+ abortSignal: abortController.signal,
40
+ commitment,
41
+ signature
42
+ }),
43
+ ...specificStrategies
44
+ ]);
45
+ } finally {
46
+ abortController.abort();
47
+ }
48
+ }
49
+ function createRecentSignatureConfirmationPromiseFactory(rpc, rpcSubscriptions) {
50
+ return async function getRecentSignatureConfirmationPromise({
51
+ abortSignal: callerAbortSignal,
52
+ commitment,
53
+ signature
54
+ }) {
55
+ const abortController = new AbortController();
56
+ function handleAbort() {
57
+ abortController.abort();
58
+ }
59
+ callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
60
+ const signatureStatusNotifications = await rpcSubscriptions.signatureNotifications(signature, { commitment }).subscribe({ abortSignal: abortController.signal });
61
+ const signatureDidCommitPromise = (async () => {
62
+ for await (const signatureStatusNotification of signatureStatusNotifications) {
63
+ if (signatureStatusNotification.value.err) {
64
+ throw new Error(`The transaction with signature \`${signature}\` failed.`, {
65
+ cause: signatureStatusNotification.value.err
66
+ });
67
+ } else {
68
+ return;
69
+ }
70
+ }
71
+ })();
72
+ const signatureStatusLookupPromise = (async () => {
73
+ const { value: signatureStatusResults } = await rpc.getSignatureStatuses([signature]).send({ abortSignal: abortController.signal });
74
+ const signatureStatus = signatureStatusResults[0];
75
+ if (signatureStatus && signatureStatus.confirmationStatus && rpcTypes.commitmentComparator(signatureStatus.confirmationStatus, commitment) >= 0) {
76
+ return;
77
+ } else {
78
+ await new Promise(() => {
79
+ });
80
+ }
81
+ })();
82
+ try {
83
+ return await Promise.race([signatureDidCommitPromise, signatureStatusLookupPromise]);
84
+ } finally {
85
+ abortController.abort();
86
+ }
87
+ };
88
+ }
89
+
90
+ // src/transaction-confirmation-strategy-timeout.ts
91
+ async function getTimeoutPromise({ abortSignal: callerAbortSignal, commitment }) {
92
+ return await new Promise((_, reject) => {
93
+ const handleAbort = (e) => {
94
+ clearTimeout(timeoutId);
95
+ const abortError = new DOMException(e.target.reason, "AbortError");
96
+ reject(abortError);
97
+ };
98
+ callerAbortSignal.addEventListener("abort", handleAbort);
99
+ const timeoutMs = commitment === "processed" ? 3e4 : 6e4;
100
+ const startMs = performance.now();
101
+ const timeoutId = (
102
+ // We use `setTimeout` instead of `AbortSignal.timeout()` because we want to measure
103
+ // elapsed time instead of active time.
104
+ // See https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/timeout_static
105
+ setTimeout(() => {
106
+ const elapsedMs = performance.now() - startMs;
107
+ reject(new DOMException(`Timeout elapsed after ${elapsedMs} ms`, "TimeoutError"));
108
+ }, timeoutMs)
109
+ );
110
+ });
111
+ }
112
+
113
+ // src/airdrop-confirmer.ts
114
+ function createDefaultSignatureOnlyRecentTransactionConfirmer({
115
+ rpc,
116
+ rpcSubscriptions
117
+ }) {
118
+ const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory(
119
+ rpc,
120
+ rpcSubscriptions
121
+ );
122
+ return async function confirmSignatureOnlyRecentTransaction(config) {
123
+ await waitForRecentTransactionConfirmationUntilTimeout({
124
+ ...config,
125
+ getRecentSignatureConfirmationPromise,
126
+ getTimeoutPromise
127
+ });
128
+ };
129
+ }
130
+ async function waitForRecentTransactionConfirmationUntilTimeout(config) {
131
+ await raceStrategies(
132
+ config.signature,
133
+ config,
134
+ function getSpecificStrategiesForRace({ abortSignal, commitment, getTimeoutPromise: getTimeoutPromise2 }) {
135
+ return [
136
+ getTimeoutPromise2({
137
+ abortSignal,
138
+ commitment
139
+ })
140
+ ];
141
+ }
142
+ );
143
+ }
144
+
145
+ // src/airdrop.ts
146
+ function createDefaultAirdropRequester({ rpc, rpcSubscriptions }) {
147
+ const confirmSignatureOnlyTransaction = createDefaultSignatureOnlyRecentTransactionConfirmer({
148
+ rpc,
149
+ rpcSubscriptions
150
+ });
151
+ return async function requestAirdrop(config) {
152
+ return await requestAndConfirmAirdrop({
153
+ ...config,
154
+ confirmSignatureOnlyTransaction,
155
+ rpc
156
+ });
157
+ };
158
+ }
159
+ async function requestAndConfirmAirdrop({
160
+ abortSignal,
161
+ commitment,
162
+ confirmSignatureOnlyTransaction,
163
+ lamports,
164
+ recipientAddress,
165
+ rpc
166
+ }) {
167
+ const airdropTransactionSignature = await rpc.requestAirdrop(recipientAddress, lamports, { commitment }).send({ abortSignal });
168
+ await confirmSignatureOnlyTransaction({
169
+ abortSignal,
170
+ commitment,
171
+ signature: airdropTransactionSignature
172
+ });
173
+ return airdropTransactionSignature;
174
+ }
175
+
20
176
  // src/rpc-integer-overflow-error.ts
21
177
  var SolanaJsonRpcIntegerOverflowError = class extends Error {
178
+ methodName;
179
+ keyPath;
180
+ value;
22
181
  constructor(methodName, keyPath, value) {
23
182
  const argPosition = (typeof keyPath[0] === "number" ? keyPath[0] : parseInt(keyPath[0], 10)) + 1;
24
183
  let ordinal = "";
@@ -207,11 +366,11 @@ function getRpcSubscriptionsWithSubscriptionCoalescing({
207
366
  return {
208
367
  ...iterable,
209
368
  async *[Symbol.asyncIterator]() {
210
- abortPromise || (abortPromise = abortSignal.aborted ? Promise.reject(EXPLICIT_ABORT_TOKEN) : new Promise((_, reject) => {
369
+ abortPromise ||= abortSignal.aborted ? Promise.reject(EXPLICIT_ABORT_TOKEN) : new Promise((_, reject) => {
211
370
  abortSignal.addEventListener("abort", () => {
212
371
  reject(EXPLICIT_ABORT_TOKEN);
213
372
  });
214
- }));
373
+ });
215
374
  try {
216
375
  const iterator = iterable[Symbol.asyncIterator]();
217
376
  while (true) {
@@ -491,10 +650,12 @@ function createNonceInvalidationPromiseFactory(rpc, rpcSubscriptions) {
491
650
  }
492
651
  callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
493
652
  const accountNotifications = await rpcSubscriptions.accountNotifications(nonceAccountAddress, { commitment, encoding: "base64" }).subscribe({ abortSignal: abortController.signal });
653
+ const base58Decoder = codecsStrings.getBase58Decoder();
654
+ const base64Encoder = codecsStrings.getBase64Encoder();
494
655
  function getNonceFromAccountData([base64EncodedBytes]) {
495
- const data = umiSerializers.base64.serialize(base64EncodedBytes);
656
+ const data = base64Encoder.encode(base64EncodedBytes);
496
657
  const nonceValueBytes = data.slice(NONCE_VALUE_OFFSET, NONCE_VALUE_OFFSET + 32);
497
- return umiSerializers.base58.deserialize(nonceValueBytes)[0];
658
+ return base58Decoder.decode(nonceValueBytes);
498
659
  }
499
660
  const nonceAccountDidAdvancePromise = (async () => {
500
661
  for await (const accountNotification of accountNotifications) {
@@ -536,74 +697,8 @@ function createNonceInvalidationPromiseFactory(rpc, rpcSubscriptions) {
536
697
  }
537
698
  };
538
699
  }
539
- function createRecentSignatureConfirmationPromiseFactory(rpc, rpcSubscriptions) {
540
- return async function getRecentSignatureConfirmationPromise({
541
- abortSignal: callerAbortSignal,
542
- commitment,
543
- signature
544
- }) {
545
- const abortController = new AbortController();
546
- function handleAbort() {
547
- abortController.abort();
548
- }
549
- callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
550
- const signatureStatusNotifications = await rpcSubscriptions.signatureNotifications(signature, { commitment }).subscribe({ abortSignal: abortController.signal });
551
- const signatureDidCommitPromise = (async () => {
552
- for await (const signatureStatusNotification of signatureStatusNotifications) {
553
- if (signatureStatusNotification.value.err) {
554
- throw new Error(`The transaction with signature \`${signature}\` failed.`, {
555
- cause: signatureStatusNotification.value.err
556
- });
557
- } else {
558
- return;
559
- }
560
- }
561
- })();
562
- const signatureStatusLookupPromise = (async () => {
563
- const { value: signatureStatusResults } = await rpc.getSignatureStatuses([signature]).send({ abortSignal: abortController.signal });
564
- const signatureStatus = signatureStatusResults[0];
565
- if (signatureStatus && signatureStatus.confirmationStatus && rpcCore.commitmentComparator(signatureStatus.confirmationStatus, commitment) >= 0) {
566
- return;
567
- } else {
568
- await new Promise(() => {
569
- });
570
- }
571
- })();
572
- try {
573
- return await Promise.race([signatureDidCommitPromise, signatureStatusLookupPromise]);
574
- } finally {
575
- abortController.abort();
576
- }
577
- };
578
- }
579
700
 
580
701
  // src/transaction-confirmation.ts
581
- async function raceStrategies(config, getSpecificStrategiesForRace) {
582
- const { abortSignal: callerAbortSignal, commitment, getRecentSignatureConfirmationPromise, transaction } = config;
583
- callerAbortSignal.throwIfAborted();
584
- const signature = transactions.getSignatureFromTransaction(transaction);
585
- const abortController = new AbortController();
586
- function handleAbort() {
587
- abortController.abort();
588
- }
589
- callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
590
- try {
591
- const specificStrategies = getSpecificStrategiesForRace({
592
- ...config,
593
- abortSignal: abortController.signal
594
- });
595
- return await Promise.race([
596
- getRecentSignatureConfirmationPromise({
597
- abortSignal: abortController.signal,
598
- commitment,
599
- signature
600
- }),
601
- ...specificStrategies
602
- ]);
603
- } finally {
604
- abortController.abort();
605
- }
606
- }
607
702
  function createDefaultDurableNonceTransactionConfirmer({
608
703
  rpc,
609
704
  rpcSubscriptions
@@ -613,7 +708,7 @@ function createDefaultDurableNonceTransactionConfirmer({
613
708
  rpc,
614
709
  rpcSubscriptions
615
710
  );
616
- return async function confirmTransaction(config) {
711
+ return async function confirmDurableNonceTransaction(config) {
617
712
  await waitForDurableNonceTransactionConfirmation({
618
713
  ...config,
619
714
  getNonceInvalidationPromise,
@@ -640,6 +735,7 @@ function createDefaultRecentTransactionConfirmer({
640
735
  }
641
736
  async function waitForDurableNonceTransactionConfirmation(config) {
642
737
  await raceStrategies(
738
+ transactions.getSignatureFromTransaction(config.transaction),
643
739
  config,
644
740
  function getSpecificStrategiesForRace({ abortSignal, commitment, getNonceInvalidationPromise, transaction }) {
645
741
  return [
@@ -655,6 +751,7 @@ async function waitForDurableNonceTransactionConfirmation(config) {
655
751
  }
656
752
  async function waitForRecentTransactionConfirmation(config) {
657
753
  await raceStrategies(
754
+ transactions.getSignatureFromTransaction(config.transaction),
658
755
  config,
659
756
  function getSpecificStrategiesForRace({ abortSignal, getBlockHeightExceedencePromise, transaction }) {
660
757
  return [
@@ -667,16 +764,136 @@ async function waitForRecentTransactionConfirmation(config) {
667
764
  );
668
765
  }
669
766
 
767
+ // src/send-transaction.ts
768
+ function getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, config) {
769
+ if (
770
+ // The developer has supplied no value for `preflightCommitment`.
771
+ !config?.preflightCommitment && // The value of `commitment` is lower than the server default of `preflightCommitment`.
772
+ rpcTypes.commitmentComparator(
773
+ commitment,
774
+ "finalized"
775
+ /* default value of `preflightCommitment` */
776
+ ) < 0
777
+ ) {
778
+ return {
779
+ ...config,
780
+ // In the common case, it is unlikely that you want to simulate a transaction at
781
+ // `finalized` commitment when your standard of commitment for confirming the
782
+ // transaction is lower. Cap the simulation commitment level to the level of the
783
+ // confirmation commitment.
784
+ preflightCommitment: commitment
785
+ };
786
+ }
787
+ return config;
788
+ }
789
+ async function sendTransaction_INTERNAL({
790
+ abortSignal,
791
+ commitment,
792
+ rpc,
793
+ transaction,
794
+ ...sendTransactionConfig
795
+ }) {
796
+ const base64EncodedWireTransaction = transactions.getBase64EncodedWireTransaction(transaction);
797
+ return await rpc.sendTransaction(base64EncodedWireTransaction, {
798
+ ...getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, sendTransactionConfig),
799
+ encoding: "base64"
800
+ }).send({ abortSignal });
801
+ }
802
+ function createDefaultDurableNonceTransactionSender({
803
+ rpc,
804
+ rpcSubscriptions
805
+ }) {
806
+ const confirmDurableNonceTransaction = createDefaultDurableNonceTransactionConfirmer({
807
+ rpc,
808
+ rpcSubscriptions
809
+ });
810
+ return async function sendDurableNonceTransaction(transaction, config) {
811
+ await sendAndConfirmDurableNonceTransaction({
812
+ ...config,
813
+ confirmDurableNonceTransaction,
814
+ rpc,
815
+ transaction
816
+ });
817
+ };
818
+ }
819
+ function createDefaultTransactionSender({
820
+ rpc,
821
+ rpcSubscriptions
822
+ }) {
823
+ const confirmRecentTransaction = createDefaultRecentTransactionConfirmer({
824
+ rpc,
825
+ rpcSubscriptions
826
+ });
827
+ return async function sendTransaction(transaction, config) {
828
+ await sendAndConfirmTransaction({
829
+ ...config,
830
+ confirmRecentTransaction,
831
+ rpc,
832
+ transaction
833
+ });
834
+ };
835
+ }
836
+ async function sendAndConfirmDurableNonceTransaction({
837
+ abortSignal,
838
+ commitment,
839
+ confirmDurableNonceTransaction,
840
+ rpc,
841
+ transaction,
842
+ ...sendTransactionConfig
843
+ }) {
844
+ const transactionSignature = await sendTransaction_INTERNAL({
845
+ ...sendTransactionConfig,
846
+ abortSignal,
847
+ commitment,
848
+ rpc,
849
+ transaction
850
+ });
851
+ await confirmDurableNonceTransaction({
852
+ abortSignal,
853
+ commitment,
854
+ transaction
855
+ });
856
+ return transactionSignature;
857
+ }
858
+ async function sendAndConfirmTransaction({
859
+ abortSignal,
860
+ commitment,
861
+ confirmRecentTransaction,
862
+ rpc,
863
+ transaction,
864
+ ...sendTransactionConfig
865
+ }) {
866
+ const transactionSignature = await sendTransaction_INTERNAL({
867
+ ...sendTransactionConfig,
868
+ abortSignal,
869
+ commitment,
870
+ rpc,
871
+ transaction
872
+ });
873
+ await confirmRecentTransaction({
874
+ abortSignal,
875
+ commitment,
876
+ transaction
877
+ });
878
+ return transactionSignature;
879
+ }
880
+
670
881
  exports.createBlockHeightExceedencePromiseFactory = createBlockHeightExceedencePromiseFactory;
882
+ exports.createDefaultAirdropRequester = createDefaultAirdropRequester;
671
883
  exports.createDefaultDurableNonceTransactionConfirmer = createDefaultDurableNonceTransactionConfirmer;
884
+ exports.createDefaultDurableNonceTransactionSender = createDefaultDurableNonceTransactionSender;
672
885
  exports.createDefaultRecentTransactionConfirmer = createDefaultRecentTransactionConfirmer;
673
886
  exports.createDefaultRpcSubscriptionsTransport = createDefaultRpcSubscriptionsTransport;
674
887
  exports.createDefaultRpcTransport = createDefaultRpcTransport;
888
+ exports.createDefaultTransactionSender = createDefaultTransactionSender;
675
889
  exports.createNonceInvalidationPromiseFactory = createNonceInvalidationPromiseFactory;
676
890
  exports.createRecentSignatureConfirmationPromiseFactory = createRecentSignatureConfirmationPromiseFactory;
677
891
  exports.createSolanaRpc = createSolanaRpc;
678
892
  exports.createSolanaRpcSubscriptions = createSolanaRpcSubscriptions;
679
893
  exports.createSolanaRpcSubscriptions_UNSTABLE = createSolanaRpcSubscriptions_UNSTABLE;
894
+ exports.requestAndConfirmAirdrop = requestAndConfirmAirdrop;
895
+ exports.sendAndConfirmDurableNonceTransaction = sendAndConfirmDurableNonceTransaction;
896
+ exports.sendAndConfirmTransaction = sendAndConfirmTransaction;
680
897
  exports.waitForDurableNonceTransactionConfirmation = waitForDurableNonceTransactionConfirmation;
681
898
  exports.waitForRecentTransactionConfirmation = waitForRecentTransactionConfirmation;
682
899
  Object.keys(addresses).forEach(function (k) {
@@ -697,6 +914,12 @@ Object.keys(keys).forEach(function (k) {
697
914
  get: function () { return keys[k]; }
698
915
  });
699
916
  });
917
+ Object.keys(rpcTypes).forEach(function (k) {
918
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
919
+ enumerable: true,
920
+ get: function () { return rpcTypes[k]; }
921
+ });
922
+ });
700
923
  Object.keys(transactions).forEach(function (k) {
701
924
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
702
925
  enumerable: true,