@solana/web3.js 2.0.0-experimental.ba46ce1 → 2.0.0-experimental.ba9b4c7

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.
@@ -4,10 +4,11 @@ var addresses = require('@solana/addresses');
4
4
  var instructions = require('@solana/instructions');
5
5
  var keys = require('@solana/keys');
6
6
  var transactions = require('@solana/transactions');
7
- var functional = require('@solana/functional');
8
7
  var rpcCore = require('@solana/rpc-core');
8
+ var functional = require('@solana/functional');
9
9
  var rpcTransport = require('@solana/rpc-transport');
10
10
  var fastStableStringify = require('fast-stable-stringify');
11
+ var umiSerializers = require('@metaplex-foundation/umi-serializers');
11
12
 
12
13
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
14
 
@@ -16,6 +17,159 @@ var fastStableStringify__default = /*#__PURE__*/_interopDefault(fastStableString
16
17
  // ../build-scripts/env-shim.ts
17
18
  var __DEV__ = /* @__PURE__ */ (() => process["env"].NODE_ENV === "development")();
18
19
 
20
+ // src/transaction-confirmation-strategy-racer.ts
21
+ async function raceStrategies(signature, config, getSpecificStrategiesForRace) {
22
+ const { abortSignal: callerAbortSignal, commitment, getRecentSignatureConfirmationPromise } = config;
23
+ callerAbortSignal.throwIfAborted();
24
+ const abortController = new AbortController();
25
+ function handleAbort() {
26
+ abortController.abort();
27
+ }
28
+ callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
29
+ try {
30
+ const specificStrategies = getSpecificStrategiesForRace({
31
+ ...config,
32
+ abortSignal: abortController.signal
33
+ });
34
+ return await Promise.race([
35
+ getRecentSignatureConfirmationPromise({
36
+ abortSignal: abortController.signal,
37
+ commitment,
38
+ signature
39
+ }),
40
+ ...specificStrategies
41
+ ]);
42
+ } finally {
43
+ abortController.abort();
44
+ }
45
+ }
46
+ function createRecentSignatureConfirmationPromiseFactory(rpc, rpcSubscriptions) {
47
+ return async function getRecentSignatureConfirmationPromise({
48
+ abortSignal: callerAbortSignal,
49
+ commitment,
50
+ signature
51
+ }) {
52
+ const abortController = new AbortController();
53
+ function handleAbort() {
54
+ abortController.abort();
55
+ }
56
+ callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
57
+ const signatureStatusNotifications = await rpcSubscriptions.signatureNotifications(signature, { commitment }).subscribe({ abortSignal: abortController.signal });
58
+ const signatureDidCommitPromise = (async () => {
59
+ for await (const signatureStatusNotification of signatureStatusNotifications) {
60
+ if (signatureStatusNotification.value.err) {
61
+ throw new Error(`The transaction with signature \`${signature}\` failed.`, {
62
+ cause: signatureStatusNotification.value.err
63
+ });
64
+ } else {
65
+ return;
66
+ }
67
+ }
68
+ })();
69
+ const signatureStatusLookupPromise = (async () => {
70
+ const { value: signatureStatusResults } = await rpc.getSignatureStatuses([signature]).send({ abortSignal: abortController.signal });
71
+ const signatureStatus = signatureStatusResults[0];
72
+ if (signatureStatus && signatureStatus.confirmationStatus && rpcCore.commitmentComparator(signatureStatus.confirmationStatus, commitment) >= 0) {
73
+ return;
74
+ } else {
75
+ await new Promise(() => {
76
+ });
77
+ }
78
+ })();
79
+ try {
80
+ return await Promise.race([signatureDidCommitPromise, signatureStatusLookupPromise]);
81
+ } finally {
82
+ abortController.abort();
83
+ }
84
+ };
85
+ }
86
+
87
+ // src/transaction-confirmation-strategy-timeout.ts
88
+ async function getTimeoutPromise({ abortSignal: callerAbortSignal, commitment }) {
89
+ return await new Promise((_, reject) => {
90
+ const handleAbort = (e) => {
91
+ clearTimeout(timeoutId);
92
+ const abortError = new DOMException(e.target.reason, "AbortError");
93
+ reject(abortError);
94
+ };
95
+ callerAbortSignal.addEventListener("abort", handleAbort);
96
+ const timeoutMs = commitment === "processed" ? 3e4 : 6e4;
97
+ const startMs = performance.now();
98
+ const timeoutId = (
99
+ // We use `setTimeout` instead of `AbortSignal.timeout()` because we want to measure
100
+ // elapsed time instead of active time.
101
+ // See https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/timeout_static
102
+ setTimeout(() => {
103
+ const elapsedMs = performance.now() - startMs;
104
+ reject(new DOMException(`Timeout elapsed after ${elapsedMs} ms`, "TimeoutError"));
105
+ }, timeoutMs)
106
+ );
107
+ });
108
+ }
109
+
110
+ // src/airdrop-confirmer.ts
111
+ function createDefaultSignatureOnlyRecentTransactionConfirmer({
112
+ rpc,
113
+ rpcSubscriptions
114
+ }) {
115
+ const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory(
116
+ rpc,
117
+ rpcSubscriptions
118
+ );
119
+ return async function confirmSignatureOnlyRecentTransaction(config) {
120
+ await waitForRecentTransactionConfirmationUntilTimeout({
121
+ ...config,
122
+ getRecentSignatureConfirmationPromise,
123
+ getTimeoutPromise
124
+ });
125
+ };
126
+ }
127
+ async function waitForRecentTransactionConfirmationUntilTimeout(config) {
128
+ await raceStrategies(
129
+ config.signature,
130
+ config,
131
+ function getSpecificStrategiesForRace({ abortSignal, commitment, getTimeoutPromise: getTimeoutPromise2 }) {
132
+ return [
133
+ getTimeoutPromise2({
134
+ abortSignal,
135
+ commitment
136
+ })
137
+ ];
138
+ }
139
+ );
140
+ }
141
+
142
+ // src/airdrop.ts
143
+ function createDefaultAirdropRequester({ rpc, rpcSubscriptions }) {
144
+ const confirmSignatureOnlyTransaction = createDefaultSignatureOnlyRecentTransactionConfirmer({
145
+ rpc,
146
+ rpcSubscriptions
147
+ });
148
+ return async function requestAirdrop(config) {
149
+ return await requestAndConfirmAirdrop({
150
+ ...config,
151
+ confirmSignatureOnlyTransaction,
152
+ rpc
153
+ });
154
+ };
155
+ }
156
+ async function requestAndConfirmAirdrop({
157
+ abortSignal,
158
+ commitment,
159
+ confirmSignatureOnlyTransaction,
160
+ lamports,
161
+ recipientAddress,
162
+ rpc
163
+ }) {
164
+ const airdropTransactionSignature = await rpc.requestAirdrop(recipientAddress, lamports, { commitment }).send({ abortSignal });
165
+ await confirmSignatureOnlyTransaction({
166
+ abortSignal,
167
+ commitment,
168
+ signature: airdropTransactionSignature
169
+ });
170
+ return airdropTransactionSignature;
171
+ }
172
+
19
173
  // src/rpc-integer-overflow-error.ts
20
174
  var SolanaJsonRpcIntegerOverflowError = class extends Error {
21
175
  constructor(methodName, keyPath, value) {
@@ -258,6 +412,12 @@ function createSolanaRpcSubscriptions(config) {
258
412
  })
259
413
  );
260
414
  }
415
+ function createSolanaRpcSubscriptions_UNSTABLE(config) {
416
+ return rpcTransport.createJsonSubscriptionRpc({
417
+ ...config,
418
+ api: rpcCore.createSolanaRpcSubscriptionsApi_UNSTABLE(DEFAULT_RPC_CONFIG)
419
+ });
420
+ }
261
421
 
262
422
  // src/rpc-request-coalescer.ts
263
423
  function getRpcTransportWithRequestCoalescing(transport, getDeduplicationKey) {
@@ -435,10 +595,285 @@ function createDefaultRpcSubscriptionsTransport(config) {
435
595
  );
436
596
  }
437
597
 
598
+ // src/transaction-confirmation-strategy-blockheight.ts
599
+ function createBlockHeightExceedencePromiseFactory(rpcSubscriptions) {
600
+ return async function getBlockHeightExceedencePromise({ abortSignal: callerAbortSignal, lastValidBlockHeight }) {
601
+ const abortController = new AbortController();
602
+ function handleAbort() {
603
+ abortController.abort();
604
+ }
605
+ callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
606
+ const slotNotifications = await rpcSubscriptions.slotNotifications().subscribe({ abortSignal: abortController.signal });
607
+ try {
608
+ for await (const slotNotification of slotNotifications) {
609
+ if (slotNotification.slot > lastValidBlockHeight) {
610
+ throw new Error(
611
+ "The network has progressed past the last block for which this transaction could have committed."
612
+ );
613
+ }
614
+ }
615
+ } finally {
616
+ abortController.abort();
617
+ }
618
+ };
619
+ }
620
+ var NONCE_VALUE_OFFSET = 4 + // version(u32)
621
+ 4 + // state(u32)
622
+ 32;
623
+ function createNonceInvalidationPromiseFactory(rpc, rpcSubscriptions) {
624
+ return async function getNonceInvalidationPromise({
625
+ abortSignal: callerAbortSignal,
626
+ commitment,
627
+ currentNonceValue,
628
+ nonceAccountAddress
629
+ }) {
630
+ const abortController = new AbortController();
631
+ function handleAbort() {
632
+ abortController.abort();
633
+ }
634
+ callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
635
+ const accountNotifications = await rpcSubscriptions.accountNotifications(nonceAccountAddress, { commitment, encoding: "base64" }).subscribe({ abortSignal: abortController.signal });
636
+ function getNonceFromAccountData([base64EncodedBytes]) {
637
+ const data = umiSerializers.base64.serialize(base64EncodedBytes);
638
+ const nonceValueBytes = data.slice(NONCE_VALUE_OFFSET, NONCE_VALUE_OFFSET + 32);
639
+ return umiSerializers.base58.deserialize(nonceValueBytes)[0];
640
+ }
641
+ const nonceAccountDidAdvancePromise = (async () => {
642
+ for await (const accountNotification of accountNotifications) {
643
+ const nonceValue = getNonceFromAccountData(accountNotification.value.data);
644
+ if (nonceValue !== currentNonceValue) {
645
+ throw new Error(
646
+ `The nonce \`${currentNonceValue}\` is no longer valid. It has advanced to \`${nonceValue}\`.`
647
+ );
648
+ }
649
+ }
650
+ })();
651
+ const nonceIsAlreadyInvalidPromise = (async () => {
652
+ const { value: nonceAccount } = await rpc.getAccountInfo(nonceAccountAddress, {
653
+ commitment,
654
+ dataSlice: { length: 32, offset: NONCE_VALUE_OFFSET },
655
+ encoding: "base58"
656
+ }).send({ abortSignal: abortController.signal });
657
+ if (!nonceAccount) {
658
+ throw new Error(`No nonce account could be found at address \`${nonceAccountAddress}\`.`);
659
+ }
660
+ const nonceValue = (
661
+ // This works because we asked for the exact slice of data representing the nonce
662
+ // value, and furthermore asked for it in `base58` encoding.
663
+ nonceAccount.data[0]
664
+ );
665
+ if (nonceValue !== currentNonceValue) {
666
+ throw new Error(
667
+ `The nonce \`${currentNonceValue}\` is no longer valid. It has advanced to \`${nonceValue}\`.`
668
+ );
669
+ } else {
670
+ await new Promise(() => {
671
+ });
672
+ }
673
+ })();
674
+ try {
675
+ return await Promise.race([nonceAccountDidAdvancePromise, nonceIsAlreadyInvalidPromise]);
676
+ } finally {
677
+ abortController.abort();
678
+ }
679
+ };
680
+ }
681
+
682
+ // src/transaction-confirmation.ts
683
+ function createDefaultDurableNonceTransactionConfirmer({
684
+ rpc,
685
+ rpcSubscriptions
686
+ }) {
687
+ const getNonceInvalidationPromise = createNonceInvalidationPromiseFactory(rpc, rpcSubscriptions);
688
+ const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory(
689
+ rpc,
690
+ rpcSubscriptions
691
+ );
692
+ return async function confirmDurableNonceTransaction(config) {
693
+ await waitForDurableNonceTransactionConfirmation({
694
+ ...config,
695
+ getNonceInvalidationPromise,
696
+ getRecentSignatureConfirmationPromise
697
+ });
698
+ };
699
+ }
700
+ function createDefaultRecentTransactionConfirmer({
701
+ rpc,
702
+ rpcSubscriptions
703
+ }) {
704
+ const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory(rpcSubscriptions);
705
+ const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory(
706
+ rpc,
707
+ rpcSubscriptions
708
+ );
709
+ return async function confirmRecentTransaction(config) {
710
+ await waitForRecentTransactionConfirmation({
711
+ ...config,
712
+ getBlockHeightExceedencePromise,
713
+ getRecentSignatureConfirmationPromise
714
+ });
715
+ };
716
+ }
717
+ async function waitForDurableNonceTransactionConfirmation(config) {
718
+ await raceStrategies(
719
+ transactions.getSignatureFromTransaction(config.transaction),
720
+ config,
721
+ function getSpecificStrategiesForRace({ abortSignal, commitment, getNonceInvalidationPromise, transaction }) {
722
+ return [
723
+ getNonceInvalidationPromise({
724
+ abortSignal,
725
+ commitment,
726
+ currentNonceValue: transaction.lifetimeConstraint.nonce,
727
+ nonceAccountAddress: transaction.instructions[0].accounts[0].address
728
+ })
729
+ ];
730
+ }
731
+ );
732
+ }
733
+ async function waitForRecentTransactionConfirmation(config) {
734
+ await raceStrategies(
735
+ transactions.getSignatureFromTransaction(config.transaction),
736
+ config,
737
+ function getSpecificStrategiesForRace({ abortSignal, getBlockHeightExceedencePromise, transaction }) {
738
+ return [
739
+ getBlockHeightExceedencePromise({
740
+ abortSignal,
741
+ lastValidBlockHeight: transaction.lifetimeConstraint.lastValidBlockHeight
742
+ })
743
+ ];
744
+ }
745
+ );
746
+ }
747
+
748
+ // src/send-transaction.ts
749
+ function getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, config) {
750
+ if (
751
+ // The developer has supplied no value for `preflightCommitment`.
752
+ !config?.preflightCommitment && // The value of `commitment` is lower than the server default of `preflightCommitment`.
753
+ rpcCore.commitmentComparator(
754
+ commitment,
755
+ "finalized"
756
+ /* default value of `preflightCommitment` */
757
+ ) < 0
758
+ ) {
759
+ return {
760
+ ...config,
761
+ // In the common case, it is unlikely that you want to simulate a transaction at
762
+ // `finalized` commitment when your standard of commitment for confirming the
763
+ // transaction is lower. Cap the simulation commitment level to the level of the
764
+ // confirmation commitment.
765
+ preflightCommitment: commitment
766
+ };
767
+ }
768
+ return config;
769
+ }
770
+ async function sendTransaction_INTERNAL({
771
+ abortSignal,
772
+ commitment,
773
+ rpc,
774
+ transaction,
775
+ sendTransactionConfig
776
+ }) {
777
+ const base64EncodedWireTransaction = transactions.getBase64EncodedWireTransaction(transaction);
778
+ return await rpc.sendTransaction(base64EncodedWireTransaction, {
779
+ ...getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, sendTransactionConfig),
780
+ encoding: "base64"
781
+ }).send({ abortSignal });
782
+ }
783
+ function createDefaultDurableNonceTransactionSender({
784
+ rpc,
785
+ rpcSubscriptions
786
+ }) {
787
+ const confirmDurableNonceTransaction = createDefaultDurableNonceTransactionConfirmer({
788
+ rpc,
789
+ rpcSubscriptions
790
+ });
791
+ return async function sendDurableNonceTransaction(transaction, config) {
792
+ await sendAndConfirmDurableNonceTransaction({
793
+ ...config,
794
+ confirmDurableNonceTransaction,
795
+ rpc,
796
+ transaction
797
+ });
798
+ };
799
+ }
800
+ function createDefaultTransactionSender({ rpc, rpcSubscriptions }) {
801
+ const confirmRecentTransaction = createDefaultRecentTransactionConfirmer({
802
+ rpc,
803
+ rpcSubscriptions
804
+ });
805
+ return async function sendTransaction(transaction, config) {
806
+ await sendAndConfirmTransaction({
807
+ ...config,
808
+ confirmRecentTransaction,
809
+ rpc,
810
+ transaction
811
+ });
812
+ };
813
+ }
814
+ async function sendAndConfirmDurableNonceTransaction({
815
+ abortSignal,
816
+ commitment,
817
+ confirmDurableNonceTransaction,
818
+ rpc,
819
+ transaction,
820
+ ...sendTransactionConfig
821
+ }) {
822
+ const transactionSignature = await sendTransaction_INTERNAL({
823
+ abortSignal,
824
+ commitment,
825
+ rpc,
826
+ sendTransactionConfig,
827
+ transaction
828
+ });
829
+ await confirmDurableNonceTransaction({
830
+ abortSignal,
831
+ commitment,
832
+ transaction
833
+ });
834
+ return transactionSignature;
835
+ }
836
+ async function sendAndConfirmTransaction({
837
+ abortSignal,
838
+ commitment,
839
+ confirmRecentTransaction,
840
+ rpc,
841
+ transaction,
842
+ ...sendTransactionConfig
843
+ }) {
844
+ const transactionSignature = await sendTransaction_INTERNAL({
845
+ abortSignal,
846
+ commitment,
847
+ rpc,
848
+ sendTransactionConfig,
849
+ transaction
850
+ });
851
+ await confirmRecentTransaction({
852
+ abortSignal,
853
+ commitment,
854
+ transaction
855
+ });
856
+ return transactionSignature;
857
+ }
858
+
859
+ exports.createBlockHeightExceedencePromiseFactory = createBlockHeightExceedencePromiseFactory;
860
+ exports.createDefaultAirdropRequester = createDefaultAirdropRequester;
861
+ exports.createDefaultDurableNonceTransactionConfirmer = createDefaultDurableNonceTransactionConfirmer;
862
+ exports.createDefaultDurableNonceTransactionSender = createDefaultDurableNonceTransactionSender;
863
+ exports.createDefaultRecentTransactionConfirmer = createDefaultRecentTransactionConfirmer;
438
864
  exports.createDefaultRpcSubscriptionsTransport = createDefaultRpcSubscriptionsTransport;
439
865
  exports.createDefaultRpcTransport = createDefaultRpcTransport;
866
+ exports.createDefaultTransactionSender = createDefaultTransactionSender;
867
+ exports.createNonceInvalidationPromiseFactory = createNonceInvalidationPromiseFactory;
868
+ exports.createRecentSignatureConfirmationPromiseFactory = createRecentSignatureConfirmationPromiseFactory;
440
869
  exports.createSolanaRpc = createSolanaRpc;
441
870
  exports.createSolanaRpcSubscriptions = createSolanaRpcSubscriptions;
871
+ exports.createSolanaRpcSubscriptions_UNSTABLE = createSolanaRpcSubscriptions_UNSTABLE;
872
+ exports.requestAndConfirmAirdrop = requestAndConfirmAirdrop;
873
+ exports.sendAndConfirmDurableNonceTransaction = sendAndConfirmDurableNonceTransaction;
874
+ exports.sendAndConfirmTransaction = sendAndConfirmTransaction;
875
+ exports.waitForDurableNonceTransactionConfirmation = waitForDurableNonceTransactionConfirmation;
876
+ exports.waitForRecentTransactionConfirmation = waitForRecentTransactionConfirmation;
442
877
  Object.keys(addresses).forEach(function (k) {
443
878
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
444
879
  enumerable: true,