@solana/web3.js 2.0.0-experimental.63683a4 → 2.0.0-experimental.6466d76

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 (50) hide show
  1. package/README.md +61 -21
  2. package/dist/index.browser.cjs +88 -28
  3. package/dist/index.browser.cjs.map +1 -1
  4. package/dist/index.browser.js +79 -28
  5. package/dist/index.browser.js.map +1 -1
  6. package/dist/index.development.js +1271 -968
  7. package/dist/index.development.js.map +1 -1
  8. package/dist/index.native.js +77 -28
  9. package/dist/index.native.js.map +1 -1
  10. package/dist/index.node.cjs +88 -28
  11. package/dist/index.node.cjs.map +1 -1
  12. package/dist/index.node.js +77 -28
  13. package/dist/index.node.js.map +1 -1
  14. package/dist/index.production.min.js +96 -75
  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 +6 -8
  18. package/dist/types/airdrop.d.ts.map +1 -1
  19. package/dist/types/index.d.ts +11 -9
  20. package/dist/types/index.d.ts.map +1 -1
  21. package/dist/types/rpc-default-config.d.ts.map +1 -1
  22. package/dist/types/rpc-integer-overflow-error.d.ts +3 -2
  23. package/dist/types/rpc-integer-overflow-error.d.ts.map +1 -1
  24. package/dist/types/rpc-request-coalescer.d.ts +1 -1
  25. package/dist/types/rpc-request-coalescer.d.ts.map +1 -1
  26. package/dist/types/rpc-subscription-coalescer.d.ts +1 -1
  27. package/dist/types/rpc-subscription-coalescer.d.ts.map +1 -1
  28. package/dist/types/rpc-transport.d.ts +1 -2
  29. package/dist/types/rpc-transport.d.ts.map +1 -1
  30. package/dist/types/rpc-websocket-autopinger.d.ts +1 -1
  31. package/dist/types/rpc-websocket-autopinger.d.ts.map +1 -1
  32. package/dist/types/rpc-websocket-connection-sharding.d.ts +1 -1
  33. package/dist/types/rpc-websocket-connection-sharding.d.ts.map +1 -1
  34. package/dist/types/rpc-websocket-transport.d.ts +1 -2
  35. package/dist/types/rpc-websocket-transport.d.ts.map +1 -1
  36. package/dist/types/rpc.d.ts +1 -2
  37. package/dist/types/rpc.d.ts.map +1 -1
  38. package/dist/types/send-transaction.d.ts +7 -6
  39. package/dist/types/send-transaction.d.ts.map +1 -1
  40. package/dist/types/transaction-confirmation-strategy-blockheight.d.ts +9 -5
  41. package/dist/types/transaction-confirmation-strategy-blockheight.d.ts.map +1 -1
  42. package/dist/types/transaction-confirmation-strategy-nonce.d.ts +2 -3
  43. package/dist/types/transaction-confirmation-strategy-nonce.d.ts.map +1 -1
  44. package/dist/types/transaction-confirmation-strategy-racer.d.ts +3 -3
  45. package/dist/types/transaction-confirmation-strategy-racer.d.ts.map +1 -1
  46. package/dist/types/transaction-confirmation-strategy-recent-signature.d.ts +4 -5
  47. package/dist/types/transaction-confirmation-strategy-recent-signature.d.ts.map +1 -1
  48. package/dist/types/transaction-confirmation.d.ts +6 -11
  49. package/dist/types/transaction-confirmation.d.ts.map +1 -1
  50. package/package.json +18 -17
package/README.md CHANGED
@@ -34,17 +34,17 @@ In response to your feedback, we began a process of modernizing the library to p
34
34
  ### For use in Node.js or a web application
35
35
 
36
36
  ```shell
37
- npm install --save @solana/web3.js@ts
37
+ npm install --save @solana/web3.js@tp
38
38
  ```
39
39
 
40
40
  ### For use in a browser, without a build system
41
41
 
42
42
  ```html
43
43
  <!-- Development (debug mode, unminified) -->
44
- <script src="https://unpkg.com/@solana/web3.js@ts/dist/index.development.js"></script>
44
+ <script src="https://unpkg.com/@solana/web3.js@tp/dist/index.development.js"></script>
45
45
 
46
46
  <!-- Production (minified) -->
47
- <script src="https://unpkg.com/@solana/web3.js@ts/dist/index.production.min.js"></script>
47
+ <script src="https://unpkg.com/@solana/web3.js@tp/dist/index.production.min.js"></script>
48
48
  ```
49
49
 
50
50
  What follows is an overview of *why* the library was re-engineered, what changes have been introduced, and how the JavaScript landscape might look across Solana in the near future.
@@ -80,7 +80,7 @@ The inability to customize web3.js has been a source of frustration for some:
80
80
 
81
81
  ## Lagging Behind Modern JavaScript
82
82
 
83
- The advance of modern JavaScript features presents an opportunity to developers of crypto applcations, such as the ability to use native Ed25519 keys and to express large values as native `bigint`.
83
+ The advance of modern JavaScript features presents an opportunity to developers of crypto applications, such as the ability to use native Ed25519 keys and to express large values as native `bigint`.
84
84
 
85
85
  The Web Incubator Community Group has advocated for the addition of Ed25519 support to the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API), and support has already landed in *most* modern JavaScript runtimes.
86
86
 
@@ -102,7 +102,7 @@ Enter web3.js 2.0. The new API aims to deliver a re-imagined experience of build
102
102
 
103
103
  ## Features
104
104
 
105
- The new (2.0) version of `@solana/web3.js` aims to address shortcomings in the legacy library first, then goes even further .
105
+ The new (2.0) version of `@solana/web3.js` aims to address shortcomings in the legacy library first, then goes even further.
106
106
 
107
107
  ### Tree-Shaking
108
108
 
@@ -251,8 +251,7 @@ const rpc = createJsonRpc<SolanaRpcMethods>({ api, transport });
251
251
  If you want to, you can also reduce the scope of the API’s type-spec so you are left only with the types you need. Keep in mind types don’t affect bundle size, but you may choose to scope the type-spec for a variety of reasons, including reducing TypeScript noise.
252
252
 
253
253
  ```tsx
254
- import { createSolanaRpcApi } from '@solana/rpc-core';
255
- import type { GetAccountInfoApi } from '@solana/rpc-core/dist/types/rpc-methods/getAccountInfo';
254
+ import { createSolanaRpcApi, type GetAccountInfoApi } from '@solana/rpc-core';
256
255
  import { createHttpTransport, createJsonRpc } from '@solana/rpc-transport';
257
256
 
258
257
  const api = createSolanaRpcApi();
@@ -325,8 +324,7 @@ Here’s an example of how someone might implement a “round robin” approach
325
324
 
326
325
  ```tsx
327
326
  import { createSolanaRpcApi } from '@solana/rpc-core';
328
- import { createJsonRpc } from '@solana/rpc-transport';
329
- import { IRpcTransport } from '@solana/rpc-transport/dist/types/transports/transport-types';
327
+ import { createJsonRpc, type IRpcTransport } from '@solana/rpc-transport';
330
328
  import { createDefaultRpcTransport } from '@solana/web3.js';
331
329
 
332
330
  // Create a transport for each RPC server
@@ -364,7 +362,50 @@ Another example of a possible customization for RPC transports is sharding. Here
364
362
  The transport library can also be used to implement custom retry logic on any request:
365
363
 
366
364
  ```tsx
367
- // TODO: Your turn; send us a pull request with an example.
365
+ import { createDefaultRpcTransport } from '@solana/web3.js';
366
+ import { createJsonRpc, IRpcTransport } from '@solana/rpc-transport';
367
+ import { createSolanaRpcApi } from '@solana/rpc-core';
368
+
369
+ // Set the maximum number of attempts to retry a request
370
+ const MAX_ATTEMPTS = 4;
371
+
372
+ // Create the default transport
373
+ const defaultTransport = createDefaultRpcTransport({ url: 'https://mainnet-beta.my-server-1.com' });
374
+
375
+ // Sleep function to wait for a given number of milliseconds
376
+ function sleep(ms: number): Promise<void> {
377
+ return new Promise((resolve) => setTimeout(resolve, ms));
378
+ }
379
+
380
+ // Calculate the delay for a given attempt
381
+ function calculateRetryDelay(attempt: number): number {
382
+ // Exponential backoff with a maximum of 1.5 seconds
383
+ return Math.min(100 * Math.pow(2, attempt), 1500);
384
+ }
385
+
386
+ // A retrying transport that will retry up to MAX_ATTEMPTS times before failing
387
+ async function retryingTransport<TResponse>(...args: Parameters<IRpcTransport>): Promise<TResponse> {
388
+ let requestError;
389
+ for (let attempts = 0; attempts < MAX_ATTEMPTS; attempts++) {
390
+ try {
391
+ return await defaultTransport(...args);
392
+ } catch (err) {
393
+ requestError = err;
394
+ // Only sleep if we have more attempts remaining
395
+ if (attempts < MAX_ATTEMPTS - 1) {
396
+ const retryDelay = calculateRetryDelay(attempts);
397
+ await sleep(retryDelay);
398
+ }
399
+ }
400
+ }
401
+ throw requestError;
402
+ }
403
+
404
+ // Create the RPC client
405
+ const rpc = createJsonRpc({
406
+ api: createSolanaRpcApi(),
407
+ transport: retryingTransport,
408
+ });
368
409
  ```
369
410
 
370
411
  ### Failover
@@ -381,15 +422,14 @@ Perhaps your application needs to make a large number of requests, or needs to f
381
422
 
382
423
  ```tsx
383
424
  import { createSolanaRpcApi } from '@solana/rpc-core';
384
- import { createJsonRpc } from '@solana/rpc-transport';
385
- import { IRpcTransport } from '@solana/rpc-transport/dist/types/transports/transport-types';
425
+ import { createJsonRpc, IRpcTransport } from '@solana/rpc-transport';
386
426
  import { createDefaultRpcTransport } from '@solana/web3.js';
387
427
 
388
428
  // Create multiple transports
389
- const transportA = createDefaultRpcTransport({ url: 'https://mainnet-beta.my-server-1.com' }));
390
- const transportB = createDefaultRpcTransport({ url: 'https://mainnet-beta.my-server-2.com' }));
391
- const transportC = createDefaultRpcTransport({ url: 'https://mainnet-beta.my-server-3.com' }));
392
- const transportD = createDefaultRpcTransport({ url: 'https://mainnet-beta.my-server-4.com' }));
429
+ const transportA = createDefaultRpcTransport({ url: 'https://mainnet-beta.my-server-1.com' });
430
+ const transportB = createDefaultRpcTransport({ url: 'https://mainnet-beta.my-server-2.com' });
431
+ const transportC = createDefaultRpcTransport({ url: 'https://mainnet-beta.my-server-3.com' });
432
+ const transportD = createDefaultRpcTransport({ url: 'https://mainnet-beta.my-server-4.com' });
393
433
 
394
434
  // Function to determine which shard to use based on the request method
395
435
  function selectShard(method: string): IRpcTransport {
@@ -507,7 +547,7 @@ for await (const notification of accountNotifications) {
507
547
 
508
548
  One of the most crucial aspects of any subscription API is managing potential missed messages. Missing messages, such as account state updates, could be catastrophic for an application. That’s why the new library provides native support for recovering missed messages using the `AsyncIterator`.
509
549
 
510
- When a connection fails unexpectedly, any messages you miss while disconnected can result in your UI falling behind or becoming corrupt. Because subscription failure is now made explicit in the new API, you can implement ‘catch up’ logic after re-estabilshing the subscription.
550
+ When a connection fails unexpectedly, any messages you miss while disconnected can result in your UI falling behind or becoming corrupt. Because subscription failure is now made explicit in the new API, you can implement ‘catch up’ logic after re-establishing the subscription.
511
551
 
512
552
  Here’s an example of such logic:
513
553
 
@@ -548,7 +588,7 @@ const keyPair: CryptoKeyPair = await generateKeyPair();
548
588
  const message = new Uint8Array(8).fill(0);
549
589
 
550
590
  const signedMessage = await signBytes(keyPair.privateKey, message);
551
- // ^ Ed25519Signature
591
+ // ^ Signature
552
592
 
553
593
  const verified = await verifySignature(keyPair.publicKey, signedMessage, message);
554
594
  ```
@@ -710,7 +750,7 @@ const transactionSignedWithFeePayer = await signTransaction([signer], transactio
710
750
 
711
751
  Transaction objects are also ********frozen by these functions******** to prevent transactions from being mutated in place by functions you pass them to.
712
752
 
713
- Building transactions in this manner might feel different to what you’re used to. Also, we certainly wouldn’t want you to have to bind transformed transactions to a new variable at each step, so we have released a functional programming library dubbed `@solana/functional` that lets you build transactions in **********************************pipelines**********************************. Here’s how it can be used:
753
+ Building transactions in this manner might feel different from what you’re used to. Also, we certainly wouldn’t want you to have to bind transformed transactions to a new variable at each step, so we have released a functional programming library dubbed `@solana/functional` that lets you build transactions in **********************************pipelines**********************************. Here’s how it can be used:
714
754
 
715
755
  ```tsx
716
756
  import { pipe } from '@solana/functional';
@@ -770,7 +810,7 @@ const myToken = {
770
810
  };
771
811
 
772
812
  const myEncodedToken: Uint8Array = structCodec.encode(myToken);
773
- const myDecodedToken = structCodec.decode(myEncodedToken)[0];
813
+ const myDecodedToken = structCodec.decode(myEncodedToken);
774
814
 
775
815
  myDecodedToken satisfies {
776
816
  amount: bigint;
@@ -869,7 +909,7 @@ const blockWithRewardsAndTransactionsResponse = await rpc.getBlock(0n, {
869
909
 
870
910
  ### Catching Compile-Time Bugs with TypeScript
871
911
 
872
- As previously mentioned, the type coverage in web3.js 2.0 allow developers to catch common bugs at compile time, rather than runtime.
912
+ As previously mentioned, the type coverage in web3.js 2.0 allows developers to catch common bugs at compile time, rather than runtime.
873
913
 
874
914
  In the example below, a transaction is created and then attempted to be compiled without setting the fee payer. This would result in a runtime error from the RPC, but instead you will see a type error from TypeScript as you type:
875
915
 
@@ -1,11 +1,12 @@
1
1
  'use strict';
2
2
 
3
+ var accounts = require('@solana/accounts');
3
4
  var addresses = require('@solana/addresses');
5
+ var functional = require('@solana/functional');
4
6
  var instructions = require('@solana/instructions');
5
7
  var keys = require('@solana/keys');
6
8
  var rpcTypes = require('@solana/rpc-types');
7
9
  var transactions = require('@solana/transactions');
8
- var functional = require('@solana/functional');
9
10
  var rpcCore = require('@solana/rpc-core');
10
11
  var rpcTransport = require('@solana/rpc-transport');
11
12
  var fastStableStringify = require('fast-stable-stringify');
@@ -175,23 +176,30 @@ async function requestAndConfirmAirdrop({
175
176
 
176
177
  // src/rpc-integer-overflow-error.ts
177
178
  var SolanaJsonRpcIntegerOverflowError = class extends Error {
179
+ methodName;
180
+ keyPath;
181
+ value;
178
182
  constructor(methodName, keyPath, value) {
179
- const argPosition = (typeof keyPath[0] === "number" ? keyPath[0] : parseInt(keyPath[0], 10)) + 1;
180
- let ordinal = "";
181
- const lastDigit = argPosition % 10;
182
- const lastTwoDigits = argPosition % 100;
183
- if (lastDigit == 1 && lastTwoDigits != 11) {
184
- ordinal = argPosition + "st";
185
- } else if (lastDigit == 2 && lastTwoDigits != 12) {
186
- ordinal = argPosition + "nd";
187
- } else if (lastDigit == 3 && lastTwoDigits != 13) {
188
- ordinal = argPosition + "rd";
183
+ let argumentLabel = "";
184
+ if (typeof keyPath[0] === "number") {
185
+ const argPosition = keyPath[0] + 1;
186
+ const lastDigit = argPosition % 10;
187
+ const lastTwoDigits = argPosition % 100;
188
+ if (lastDigit == 1 && lastTwoDigits != 11) {
189
+ argumentLabel = argPosition + "st";
190
+ } else if (lastDigit == 2 && lastTwoDigits != 12) {
191
+ argumentLabel = argPosition + "nd";
192
+ } else if (lastDigit == 3 && lastTwoDigits != 13) {
193
+ argumentLabel = argPosition + "rd";
194
+ } else {
195
+ argumentLabel = argPosition + "th";
196
+ }
189
197
  } else {
190
- ordinal = argPosition + "th";
198
+ argumentLabel = `\`${keyPath[0].toString()}\``;
191
199
  }
192
200
  const path = keyPath.length > 1 ? keyPath.slice(1).map((pathPart) => typeof pathPart === "number" ? `[${pathPart}]` : pathPart).join(".") : null;
193
201
  super(
194
- `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\`.`
202
+ `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\`.`
195
203
  );
196
204
  this.keyPath = keyPath;
197
205
  this.methodName = methodName;
@@ -204,6 +212,7 @@ var SolanaJsonRpcIntegerOverflowError = class extends Error {
204
212
 
205
213
  // src/rpc-default-config.ts
206
214
  var DEFAULT_RPC_CONFIG = {
215
+ defaultCommitment: "confirmed",
207
216
  onIntegerOverflow(methodName, keyPath, value) {
208
217
  throw new SolanaJsonRpcIntegerOverflowError(methodName, keyPath, value);
209
218
  }
@@ -363,11 +372,11 @@ function getRpcSubscriptionsWithSubscriptionCoalescing({
363
372
  return {
364
373
  ...iterable,
365
374
  async *[Symbol.asyncIterator]() {
366
- abortPromise || (abortPromise = abortSignal.aborted ? Promise.reject(EXPLICIT_ABORT_TOKEN) : new Promise((_, reject) => {
375
+ abortPromise ||= abortSignal.aborted ? Promise.reject(EXPLICIT_ABORT_TOKEN) : new Promise((_, reject) => {
367
376
  abortSignal.addEventListener("abort", () => {
368
377
  reject(EXPLICIT_ABORT_TOKEN);
369
378
  });
370
- }));
379
+ });
371
380
  try {
372
381
  const iterator = iterable[Symbol.asyncIterator]();
373
382
  while (true) {
@@ -610,22 +619,52 @@ function createDefaultRpcSubscriptionsTransport(config) {
610
619
  }
611
620
 
612
621
  // src/transaction-confirmation-strategy-blockheight.ts
613
- function createBlockHeightExceedencePromiseFactory(rpcSubscriptions) {
614
- return async function getBlockHeightExceedencePromise({ abortSignal: callerAbortSignal, lastValidBlockHeight }) {
622
+ function createBlockHeightExceedencePromiseFactory({
623
+ rpc,
624
+ rpcSubscriptions
625
+ }) {
626
+ return async function getBlockHeightExceedencePromise({
627
+ abortSignal: callerAbortSignal,
628
+ commitment,
629
+ lastValidBlockHeight
630
+ }) {
615
631
  const abortController = new AbortController();
616
- function handleAbort() {
632
+ const handleAbort = () => {
617
633
  abortController.abort();
618
- }
634
+ };
619
635
  callerAbortSignal.addEventListener("abort", handleAbort, { signal: abortController.signal });
620
- const slotNotifications = await rpcSubscriptions.slotNotifications().subscribe({ abortSignal: abortController.signal });
636
+ async function getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight() {
637
+ const { absoluteSlot, blockHeight } = await rpc.getEpochInfo({ commitment }).send({ abortSignal: abortController.signal });
638
+ return {
639
+ blockHeight,
640
+ differenceBetweenSlotHeightAndBlockHeight: absoluteSlot - blockHeight
641
+ };
642
+ }
621
643
  try {
622
- for await (const slotNotification of slotNotifications) {
623
- if (slotNotification.slot > lastValidBlockHeight) {
624
- throw new Error(
625
- "The network has progressed past the last block for which this transaction could have committed."
626
- );
644
+ const [slotNotifications, { blockHeight, differenceBetweenSlotHeightAndBlockHeight }] = await Promise.all([
645
+ rpcSubscriptions.slotNotifications().subscribe({ abortSignal: abortController.signal }),
646
+ getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight()
647
+ ]);
648
+ if (blockHeight <= lastValidBlockHeight) {
649
+ let lastKnownDifferenceBetweenSlotHeightAndBlockHeight = differenceBetweenSlotHeightAndBlockHeight;
650
+ for await (const slotNotification of slotNotifications) {
651
+ const { slot } = slotNotification;
652
+ if (slot - lastKnownDifferenceBetweenSlotHeightAndBlockHeight > lastValidBlockHeight) {
653
+ const {
654
+ blockHeight: currentBlockHeight,
655
+ differenceBetweenSlotHeightAndBlockHeight: currentDifferenceBetweenSlotHeightAndBlockHeight
656
+ } = await getBlockHeightAndDifferenceBetweenSlotHeightAndBlockHeight();
657
+ if (currentBlockHeight > lastValidBlockHeight) {
658
+ break;
659
+ } else {
660
+ lastKnownDifferenceBetweenSlotHeightAndBlockHeight = currentDifferenceBetweenSlotHeightAndBlockHeight;
661
+ }
662
+ }
627
663
  }
628
664
  }
665
+ throw new Error(
666
+ "The network has progressed past the last block for which this transaction could have been committed."
667
+ );
629
668
  } finally {
630
669
  abortController.abort();
631
670
  }
@@ -652,7 +691,7 @@ function createNonceInvalidationPromiseFactory(rpc, rpcSubscriptions) {
652
691
  function getNonceFromAccountData([base64EncodedBytes]) {
653
692
  const data = base64Encoder.encode(base64EncodedBytes);
654
693
  const nonceValueBytes = data.slice(NONCE_VALUE_OFFSET, NONCE_VALUE_OFFSET + 32);
655
- return base58Decoder.decode(nonceValueBytes)[0];
694
+ return base58Decoder.decode(nonceValueBytes);
656
695
  }
657
696
  const nonceAccountDidAdvancePromise = (async () => {
658
697
  for await (const accountNotification of accountNotifications) {
@@ -717,7 +756,10 @@ function createDefaultRecentTransactionConfirmer({
717
756
  rpc,
718
757
  rpcSubscriptions
719
758
  }) {
720
- const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory(rpcSubscriptions);
759
+ const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory({
760
+ rpc,
761
+ rpcSubscriptions
762
+ });
721
763
  const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory(
722
764
  rpc,
723
765
  rpcSubscriptions
@@ -750,10 +792,16 @@ async function waitForRecentTransactionConfirmation(config) {
750
792
  await raceStrategies(
751
793
  transactions.getSignatureFromTransaction(config.transaction),
752
794
  config,
753
- function getSpecificStrategiesForRace({ abortSignal, getBlockHeightExceedencePromise, transaction }) {
795
+ function getSpecificStrategiesForRace({
796
+ abortSignal,
797
+ commitment,
798
+ getBlockHeightExceedencePromise,
799
+ transaction
800
+ }) {
754
801
  return [
755
802
  getBlockHeightExceedencePromise({
756
803
  abortSignal,
804
+ commitment,
757
805
  lastValidBlockHeight: transaction.lifetimeConstraint.lastValidBlockHeight
758
806
  })
759
807
  ];
@@ -893,12 +941,24 @@ exports.sendAndConfirmDurableNonceTransaction = sendAndConfirmDurableNonceTransa
893
941
  exports.sendAndConfirmTransaction = sendAndConfirmTransaction;
894
942
  exports.waitForDurableNonceTransactionConfirmation = waitForDurableNonceTransactionConfirmation;
895
943
  exports.waitForRecentTransactionConfirmation = waitForRecentTransactionConfirmation;
944
+ Object.keys(accounts).forEach(function (k) {
945
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
946
+ enumerable: true,
947
+ get: function () { return accounts[k]; }
948
+ });
949
+ });
896
950
  Object.keys(addresses).forEach(function (k) {
897
951
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
898
952
  enumerable: true,
899
953
  get: function () { return addresses[k]; }
900
954
  });
901
955
  });
956
+ Object.keys(functional).forEach(function (k) {
957
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
958
+ enumerable: true,
959
+ get: function () { return functional[k]; }
960
+ });
961
+ });
902
962
  Object.keys(instructions).forEach(function (k) {
903
963
  if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
904
964
  enumerable: true,