@algorandfoundation/algokit-utils 6.1.0-beta.1 → 6.1.0-beta.3

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 (121) hide show
  1. package/README.md +8 -0
  2. package/account/account.d.ts +24 -3
  3. package/account/account.d.ts.map +1 -1
  4. package/account/account.js +29 -53
  5. package/account/account.js.map +1 -1
  6. package/account/account.mjs +29 -53
  7. package/account/account.mjs.map +1 -1
  8. package/account/get-account.d.ts +2 -2
  9. package/account/get-account.d.ts.map +1 -1
  10. package/account/get-account.js +9 -29
  11. package/account/get-account.js.map +1 -1
  12. package/account/get-account.mjs +4 -24
  13. package/account/get-account.mjs.map +1 -1
  14. package/account/get-dispenser-account.d.ts +7 -2
  15. package/account/get-dispenser-account.d.ts.map +1 -1
  16. package/account/get-dispenser-account.js +7 -8
  17. package/account/get-dispenser-account.js.map +1 -1
  18. package/account/get-dispenser-account.mjs +7 -8
  19. package/account/get-dispenser-account.mjs.map +1 -1
  20. package/account/mnemonic-account.d.ts +4 -1
  21. package/account/mnemonic-account.d.ts.map +1 -1
  22. package/account/mnemonic-account.js +4 -1
  23. package/account/mnemonic-account.js.map +1 -1
  24. package/account/mnemonic-account.mjs +4 -1
  25. package/account/mnemonic-account.mjs.map +1 -1
  26. package/dispenser-client.d.ts +2 -0
  27. package/dispenser-client.d.ts.map +1 -1
  28. package/dispenser-client.js +2 -0
  29. package/dispenser-client.js.map +1 -1
  30. package/dispenser-client.mjs +2 -0
  31. package/dispenser-client.mjs.map +1 -1
  32. package/index.d.ts +7 -7
  33. package/index.d.ts.map +1 -1
  34. package/index.js +31 -31
  35. package/index.mjs +9 -9
  36. package/localnet/get-kmd-wallet-account.d.ts +2 -0
  37. package/localnet/get-kmd-wallet-account.d.ts.map +1 -1
  38. package/localnet/get-kmd-wallet-account.js +5 -30
  39. package/localnet/get-kmd-wallet-account.js.map +1 -1
  40. package/localnet/get-kmd-wallet-account.mjs +5 -30
  41. package/localnet/get-kmd-wallet-account.mjs.map +1 -1
  42. package/localnet/get-localnet-dispenser-account.d.ts +2 -0
  43. package/localnet/get-localnet-dispenser-account.d.ts.map +1 -1
  44. package/localnet/get-localnet-dispenser-account.js +5 -7
  45. package/localnet/get-localnet-dispenser-account.js.map +1 -1
  46. package/localnet/get-localnet-dispenser-account.mjs +5 -7
  47. package/localnet/get-localnet-dispenser-account.mjs.map +1 -1
  48. package/localnet/get-or-create-kmd-wallet-account.d.ts +2 -0
  49. package/localnet/get-or-create-kmd-wallet-account.d.ts.map +1 -1
  50. package/localnet/get-or-create-kmd-wallet-account.js +5 -27
  51. package/localnet/get-or-create-kmd-wallet-account.js.map +1 -1
  52. package/localnet/get-or-create-kmd-wallet-account.mjs +5 -27
  53. package/localnet/get-or-create-kmd-wallet-account.mjs.map +1 -1
  54. package/localnet/is-localnet.d.ts +4 -1
  55. package/localnet/is-localnet.d.ts.map +1 -1
  56. package/localnet/is-localnet.js +7 -3
  57. package/localnet/is-localnet.js.map +1 -1
  58. package/localnet/is-localnet.mjs +7 -3
  59. package/localnet/is-localnet.mjs.map +1 -1
  60. package/network-client.d.ts +36 -8
  61. package/network-client.d.ts.map +1 -1
  62. package/network-client.js +49 -88
  63. package/network-client.js.map +1 -1
  64. package/network-client.mjs +49 -88
  65. package/network-client.mjs.map +1 -1
  66. package/package.json +3 -2
  67. package/testing/account.d.ts +3 -5
  68. package/testing/account.d.ts.map +1 -1
  69. package/testing/account.js +6 -9
  70. package/testing/account.js.map +1 -1
  71. package/testing/account.mjs +6 -9
  72. package/testing/account.mjs.map +1 -1
  73. package/testing/fixtures/algorand-fixture.d.ts +20 -2
  74. package/testing/fixtures/algorand-fixture.d.ts.map +1 -1
  75. package/testing/fixtures/algorand-fixture.js +11 -30
  76. package/testing/fixtures/algorand-fixture.js.map +1 -1
  77. package/testing/fixtures/algorand-fixture.mjs +11 -30
  78. package/testing/fixtures/algorand-fixture.mjs.map +1 -1
  79. package/transaction/transaction.d.ts.map +1 -1
  80. package/transaction/transaction.js +8 -8
  81. package/transaction/transaction.js.map +1 -1
  82. package/transaction/transaction.mjs +8 -8
  83. package/transaction/transaction.mjs.map +1 -1
  84. package/transfer/transfer.js +4 -4
  85. package/transfer/transfer.js.map +1 -1
  86. package/transfer/transfer.mjs +4 -4
  87. package/transfer/transfer.mjs.map +1 -1
  88. package/types/account-manager.d.ts +108 -24
  89. package/types/account-manager.d.ts.map +1 -1
  90. package/types/account-manager.js +167 -34
  91. package/types/account-manager.js.map +1 -1
  92. package/types/account-manager.mjs +166 -34
  93. package/types/account-manager.mjs.map +1 -1
  94. package/types/account.d.ts +13 -11
  95. package/types/account.d.ts.map +1 -1
  96. package/types/algorand-client.d.ts +12 -6
  97. package/types/algorand-client.d.ts.map +1 -1
  98. package/types/algorand-client.js +20 -15
  99. package/types/algorand-client.js.map +1 -1
  100. package/types/algorand-client.mjs +20 -15
  101. package/types/algorand-client.mjs.map +1 -1
  102. package/types/client-manager.d.ts +197 -4
  103. package/types/client-manager.d.ts.map +1 -1
  104. package/types/client-manager.js +284 -7
  105. package/types/client-manager.js.map +1 -1
  106. package/types/client-manager.mjs +284 -7
  107. package/types/client-manager.mjs.map +1 -1
  108. package/types/indexer.d.ts +11 -2
  109. package/types/indexer.d.ts.map +1 -1
  110. package/types/indexer.js.map +1 -1
  111. package/types/indexer.mjs.map +1 -1
  112. package/types/kmd-account-manager.d.ts +70 -0
  113. package/types/kmd-account-manager.d.ts.map +1 -0
  114. package/types/kmd-account-manager.js +144 -0
  115. package/types/kmd-account-manager.js.map +1 -0
  116. package/types/kmd-account-manager.mjs +142 -0
  117. package/types/kmd-account-manager.mjs.map +1 -0
  118. package/types/network-client.d.ts +2 -2
  119. package/types/network-client.d.ts.map +1 -1
  120. package/types/testing.d.ts +9 -6
  121. package/types/testing.d.ts.map +1 -1
@@ -0,0 +1,144 @@
1
+ 'use strict';
2
+
3
+ var algosdk = require('algosdk');
4
+ var config = require('../config.js');
5
+ var types_account = require('./account.js');
6
+ var types_amount = require('./amount.js');
7
+ var types_composer = require('./composer.js');
8
+
9
+ /** Provides abstractions over a [KMD](https://github.com/algorand/go-algorand/blob/master/daemon/kmd/README.md) instance
10
+ * that makes it easier to get and manage accounts using KMD. */
11
+ class KmdAccountManager {
12
+ /**
13
+ * Create a new KMD manager.
14
+ * @param clientManager A ClientManager client to use for algod and kmd clients
15
+ */
16
+ constructor(clientManager) {
17
+ this._clientManager = clientManager;
18
+ }
19
+ /**
20
+ * Returns an Algorand signing account with private key loaded from the given KMD wallet (identified by name).
21
+ *
22
+ * @param walletName The name of the wallet to retrieve an account from
23
+ * @param predicate An optional filter to use to find the account (otherwise it will return a random account from the wallet)
24
+ * @param sender The optional sender address to use this signer for (aka a rekeyed account)
25
+ * @example Get default funded account in a LocalNet
26
+ *
27
+ * ```typescript
28
+ * const defaultDispenserAccount = await kmdAccountManager.getWalletAccount(
29
+ * 'unencrypted-default-wallet',
30
+ * a => a.status !== 'Offline' && a.amount > 1_000_000_000
31
+ * )
32
+ * ```
33
+ * @returns The signing account (with private key loaded) or undefined if no matching wallet or account was found
34
+ */
35
+ async getWalletAccount(walletName,
36
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
+ predicate, sender) {
38
+ const walletsResponse = await this._clientManager.kmd.listWallets();
39
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
40
+ const wallet = walletsResponse.wallets.filter((w) => w.name === walletName);
41
+ if (wallet.length === 0) {
42
+ return undefined;
43
+ }
44
+ const walletId = wallet[0].id;
45
+ const walletHandle = (await this._clientManager.kmd.initWalletHandle(walletId, '')).wallet_handle_token;
46
+ const addresses = (await this._clientManager.kmd.listKeys(walletHandle)).addresses;
47
+ let i = 0;
48
+ if (predicate) {
49
+ for (i = 0; i < addresses.length; i++) {
50
+ const address = addresses[i];
51
+ const account = await this._clientManager.algod.accountInformation(address).do();
52
+ if (predicate(account)) {
53
+ break;
54
+ }
55
+ }
56
+ }
57
+ if (i >= addresses.length) {
58
+ return undefined;
59
+ }
60
+ const accountKey = (await this._clientManager.kmd.exportKey(walletHandle, '', addresses[i])).private_key;
61
+ const accountMnemonic = algosdk.secretKeyToMnemonic(accountKey);
62
+ const account = algosdk.mnemonicToSecretKey(accountMnemonic);
63
+ const signingAccount = new types_account.SigningAccount(account, sender);
64
+ return {
65
+ account: signingAccount,
66
+ addr: signingAccount.addr,
67
+ signer: signingAccount.signer,
68
+ };
69
+ }
70
+ /**
71
+ * Gets an account with private key loaded from a KMD wallet of the given name, or alternatively creates one with funds in it via a KMD wallet of the given name.
72
+ *
73
+ * This is useful to get idempotent accounts from LocalNet without having to specify the private key (which will change when resetting the LocalNet).
74
+ *
75
+ * This significantly speeds up local dev time and improves experience since you can write code that *just works* first go without manual config in a fresh LocalNet.
76
+ *
77
+ * If this is used via `mnemonicAccountFromEnvironment`, then you can even use the same code that runs on production without changes for local development!
78
+ *
79
+ * @param name The name of the wallet to retrieve / create
80
+ * @param fundWith The number of Algos to fund the account with when it gets created, if not specified then 1000 Algos will be funded from the dispenser account
81
+ *
82
+ * @example
83
+ * ```typescript
84
+ * // Idempotently get (if exists) or crate (if it doesn't exist yet) an account by name using KMD
85
+ * // if creating it then fund it with 2 Algos from the default dispenser account
86
+ * const newAccount = await kmdAccountManager.getOrCreateWalletAccount('account1', (2).algos())
87
+ * // This will return the same account as above since the name matches
88
+ * const existingAccount = await kmdAccountManager.getOrCreateWalletAccount('account1')
89
+ * ```
90
+ *
91
+ * @returns An Algorand account with private key loaded - either one that already existed in the given KMD wallet, or a new one that is funded for you
92
+ */
93
+ async getOrCreateWalletAccount(name, fundWith) {
94
+ // Get an existing account from the KMD wallet
95
+ const existing = await this.getWalletAccount(name);
96
+ if (existing) {
97
+ return existing;
98
+ }
99
+ // None existed: create the KMD wallet instead
100
+ const walletId = (await this._clientManager.kmd.createWallet(name, '')).wallet.id;
101
+ const walletHandle = (await this._clientManager.kmd.initWalletHandle(walletId, '')).wallet_handle_token;
102
+ await this._clientManager.kmd.generateKey(walletHandle);
103
+ // Get the account from the new KMD wallet
104
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
105
+ const account = (await this.getWalletAccount(name));
106
+ config.Config.logger.info(`LocalNet account '${name}' doesn't yet exist; created account ${account.addr} with keys stored in KMD and funding with ${fundWith?.algos ?? 1000} ALGOs`);
107
+ // Fund the account from the dispenser
108
+ const dispenser = await this.getLocalNetDispenserAccount();
109
+ await new types_composer({
110
+ algod: this._clientManager.algod,
111
+ getSigner: () => dispenser.signer,
112
+ getSuggestedParams: () => this._clientManager.algod.getTransactionParams().do(),
113
+ })
114
+ .addPayment({
115
+ amount: fundWith ?? types_amount.AlgoAmount.Algos(1000),
116
+ receiver: account.addr,
117
+ sender: dispenser.addr,
118
+ })
119
+ .execute();
120
+ return account;
121
+ }
122
+ /**
123
+ * Returns an Algorand account with private key loaded for the default LocalNet dispenser account (that can be used to fund other accounts).
124
+ * @example
125
+ * ```typescript
126
+ * const dispenser = await kmdAccountManager.getLocalNetDispenserAccount()
127
+ * ```
128
+ * @returns The default LocalNet dispenser account
129
+ */
130
+ async getLocalNetDispenserAccount() {
131
+ if (!(await this._clientManager.isLocalNet())) {
132
+ throw new Error("Can't get LocalNet dispenser account from non LocalNet network");
133
+ }
134
+ const dispenser = await this.getWalletAccount('unencrypted-default-wallet', (a) => a.status !== 'Offline' && a.amount > 1000000000);
135
+ if (!dispenser) {
136
+ throw new Error("Error retrieving LocalNet dispenser account; couldn't find the default account in KMD");
137
+ }
138
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
139
+ return dispenser;
140
+ }
141
+ }
142
+
143
+ exports.KmdAccountManager = KmdAccountManager;
144
+ //# sourceMappingURL=kmd-account-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kmd-account-manager.js","sources":["../../src/types/kmd-account-manager.ts"],"sourcesContent":[null],"names":["SigningAccount","Config","AlgokitComposer","AlgoAmount"],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ import algosdk from 'algosdk';
2
+ import { Config } from '../config.mjs';
3
+ import { SigningAccount } from './account.mjs';
4
+ import { AlgoAmount } from './amount.mjs';
5
+ import AlgokitComposer from './composer.mjs';
6
+
7
+ /** Provides abstractions over a [KMD](https://github.com/algorand/go-algorand/blob/master/daemon/kmd/README.md) instance
8
+ * that makes it easier to get and manage accounts using KMD. */
9
+ class KmdAccountManager {
10
+ /**
11
+ * Create a new KMD manager.
12
+ * @param clientManager A ClientManager client to use for algod and kmd clients
13
+ */
14
+ constructor(clientManager) {
15
+ this._clientManager = clientManager;
16
+ }
17
+ /**
18
+ * Returns an Algorand signing account with private key loaded from the given KMD wallet (identified by name).
19
+ *
20
+ * @param walletName The name of the wallet to retrieve an account from
21
+ * @param predicate An optional filter to use to find the account (otherwise it will return a random account from the wallet)
22
+ * @param sender The optional sender address to use this signer for (aka a rekeyed account)
23
+ * @example Get default funded account in a LocalNet
24
+ *
25
+ * ```typescript
26
+ * const defaultDispenserAccount = await kmdAccountManager.getWalletAccount(
27
+ * 'unencrypted-default-wallet',
28
+ * a => a.status !== 'Offline' && a.amount > 1_000_000_000
29
+ * )
30
+ * ```
31
+ * @returns The signing account (with private key loaded) or undefined if no matching wallet or account was found
32
+ */
33
+ async getWalletAccount(walletName,
34
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
+ predicate, sender) {
36
+ const walletsResponse = await this._clientManager.kmd.listWallets();
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ const wallet = walletsResponse.wallets.filter((w) => w.name === walletName);
39
+ if (wallet.length === 0) {
40
+ return undefined;
41
+ }
42
+ const walletId = wallet[0].id;
43
+ const walletHandle = (await this._clientManager.kmd.initWalletHandle(walletId, '')).wallet_handle_token;
44
+ const addresses = (await this._clientManager.kmd.listKeys(walletHandle)).addresses;
45
+ let i = 0;
46
+ if (predicate) {
47
+ for (i = 0; i < addresses.length; i++) {
48
+ const address = addresses[i];
49
+ const account = await this._clientManager.algod.accountInformation(address).do();
50
+ if (predicate(account)) {
51
+ break;
52
+ }
53
+ }
54
+ }
55
+ if (i >= addresses.length) {
56
+ return undefined;
57
+ }
58
+ const accountKey = (await this._clientManager.kmd.exportKey(walletHandle, '', addresses[i])).private_key;
59
+ const accountMnemonic = algosdk.secretKeyToMnemonic(accountKey);
60
+ const account = algosdk.mnemonicToSecretKey(accountMnemonic);
61
+ const signingAccount = new SigningAccount(account, sender);
62
+ return {
63
+ account: signingAccount,
64
+ addr: signingAccount.addr,
65
+ signer: signingAccount.signer,
66
+ };
67
+ }
68
+ /**
69
+ * Gets an account with private key loaded from a KMD wallet of the given name, or alternatively creates one with funds in it via a KMD wallet of the given name.
70
+ *
71
+ * This is useful to get idempotent accounts from LocalNet without having to specify the private key (which will change when resetting the LocalNet).
72
+ *
73
+ * This significantly speeds up local dev time and improves experience since you can write code that *just works* first go without manual config in a fresh LocalNet.
74
+ *
75
+ * If this is used via `mnemonicAccountFromEnvironment`, then you can even use the same code that runs on production without changes for local development!
76
+ *
77
+ * @param name The name of the wallet to retrieve / create
78
+ * @param fundWith The number of Algos to fund the account with when it gets created, if not specified then 1000 Algos will be funded from the dispenser account
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * // Idempotently get (if exists) or crate (if it doesn't exist yet) an account by name using KMD
83
+ * // if creating it then fund it with 2 Algos from the default dispenser account
84
+ * const newAccount = await kmdAccountManager.getOrCreateWalletAccount('account1', (2).algos())
85
+ * // This will return the same account as above since the name matches
86
+ * const existingAccount = await kmdAccountManager.getOrCreateWalletAccount('account1')
87
+ * ```
88
+ *
89
+ * @returns An Algorand account with private key loaded - either one that already existed in the given KMD wallet, or a new one that is funded for you
90
+ */
91
+ async getOrCreateWalletAccount(name, fundWith) {
92
+ // Get an existing account from the KMD wallet
93
+ const existing = await this.getWalletAccount(name);
94
+ if (existing) {
95
+ return existing;
96
+ }
97
+ // None existed: create the KMD wallet instead
98
+ const walletId = (await this._clientManager.kmd.createWallet(name, '')).wallet.id;
99
+ const walletHandle = (await this._clientManager.kmd.initWalletHandle(walletId, '')).wallet_handle_token;
100
+ await this._clientManager.kmd.generateKey(walletHandle);
101
+ // Get the account from the new KMD wallet
102
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
103
+ const account = (await this.getWalletAccount(name));
104
+ Config.logger.info(`LocalNet account '${name}' doesn't yet exist; created account ${account.addr} with keys stored in KMD and funding with ${fundWith?.algos ?? 1000} ALGOs`);
105
+ // Fund the account from the dispenser
106
+ const dispenser = await this.getLocalNetDispenserAccount();
107
+ await new AlgokitComposer({
108
+ algod: this._clientManager.algod,
109
+ getSigner: () => dispenser.signer,
110
+ getSuggestedParams: () => this._clientManager.algod.getTransactionParams().do(),
111
+ })
112
+ .addPayment({
113
+ amount: fundWith ?? AlgoAmount.Algos(1000),
114
+ receiver: account.addr,
115
+ sender: dispenser.addr,
116
+ })
117
+ .execute();
118
+ return account;
119
+ }
120
+ /**
121
+ * Returns an Algorand account with private key loaded for the default LocalNet dispenser account (that can be used to fund other accounts).
122
+ * @example
123
+ * ```typescript
124
+ * const dispenser = await kmdAccountManager.getLocalNetDispenserAccount()
125
+ * ```
126
+ * @returns The default LocalNet dispenser account
127
+ */
128
+ async getLocalNetDispenserAccount() {
129
+ if (!(await this._clientManager.isLocalNet())) {
130
+ throw new Error("Can't get LocalNet dispenser account from non LocalNet network");
131
+ }
132
+ const dispenser = await this.getWalletAccount('unencrypted-default-wallet', (a) => a.status !== 'Offline' && a.amount > 1000000000);
133
+ if (!dispenser) {
134
+ throw new Error("Error retrieving LocalNet dispenser account; couldn't find the default account in KMD");
135
+ }
136
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
137
+ return dispenser;
138
+ }
139
+ }
140
+
141
+ export { KmdAccountManager };
142
+ //# sourceMappingURL=kmd-account-manager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kmd-account-manager.mjs","sources":["../../src/types/kmd-account-manager.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { TokenHeader } from 'algosdk/dist/types/client/urlTokenBaseHTTPClient';
2
- /** Config for an Algorand SDK client */
2
+ /** Config for an Algorand SDK client. */
3
3
  export interface AlgoClientConfig {
4
4
  /** Base URL of the server e.g. http://localhost, https://testnet-api.algonode.cloud/, etc. */
5
5
  server: string;
@@ -8,7 +8,7 @@ export interface AlgoClientConfig {
8
8
  /** The token to use for API authentication (or undefined if none needed) - can be a string, or an object with the header key => value */
9
9
  token?: string | TokenHeader;
10
10
  }
11
- /** Config for an algo config */
11
+ /** Configuration for algod, indexer and kmd clients. */
12
12
  export interface AlgoConfig {
13
13
  /** Algo client configuration */
14
14
  algodConfig: AlgoClientConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"network-client.d.ts","sourceRoot":"","sources":["../../src/types/network-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAA;AAEnF,wCAAwC;AACxC,MAAM,WAAW,gBAAgB;IAC/B,8FAA8F;IAC9F,MAAM,EAAE,MAAM,CAAA;IACd,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,yIAAyI;IACzI,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;CAC7B;AAED,gCAAgC;AAChC,MAAM,WAAW,UAAU;IACzB,gCAAgC;IAChC,WAAW,EAAE,gBAAgB,CAAA;IAC7B,mCAAmC;IACnC,aAAa,CAAC,EAAE,gBAAgB,CAAA;IAChC,wBAAwB;IACxB,SAAS,CAAC,EAAE,gBAAgB,CAAA;CAC7B"}
1
+ {"version":3,"file":"network-client.d.ts","sourceRoot":"","sources":["../../src/types/network-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAA;AAEnF,yCAAyC;AACzC,MAAM,WAAW,gBAAgB;IAC/B,8FAA8F;IAC9F,MAAM,EAAE,MAAM,CAAA;IACd,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,yIAAyI;IACzI,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;CAC7B;AAED,wDAAwD;AACxD,MAAM,WAAW,UAAU;IACzB,gCAAgC;IAChC,WAAW,EAAE,gBAAgB,CAAA;IAC7B,mCAAmC;IACnC,aAAa,CAAC,EAAE,gBAAgB,CAAA;IAChC,wBAAwB;IACxB,SAAS,CAAC,EAAE,gBAAgB,CAAA;CAC7B"}
@@ -6,6 +6,7 @@ import { SendTransactionFrom } from '../types/transaction';
6
6
  import { TransactionSignerAccount } from './account';
7
7
  import AlgorandClient from './algorand-client';
8
8
  import { TransactionLookupResult } from './indexer';
9
+ import { AlgoConfig } from './network-client';
9
10
  import Account = algosdk.Account;
10
11
  import Algodv2 = algosdk.Algodv2;
11
12
  import Indexer = algosdk.Indexer;
@@ -15,6 +16,8 @@ import Transaction = algosdk.Transaction;
15
16
  * Test automation context.
16
17
  */
17
18
  export interface AlgorandTestAutomationContext {
19
+ /** An AlgorandClient instance loaded with the current context, including testAccount and any generated accounts loaded as signers */
20
+ algorand: AlgorandClient;
18
21
  /** Algod client instance that will log transactions in `transactionLogger` */
19
22
  algod: Algodv2;
20
23
  /** Indexer client instance */
@@ -40,16 +43,16 @@ export interface GetTestAccountParams {
40
43
  initialFunds: AlgoAmount;
41
44
  /** Whether to suppress the log (which includes a mnemonic) or not (default: do not suppress the log) */
42
45
  suppressLog?: boolean;
43
- /** Optional override for how to get an account; this allows you to retrieve accounts from a known or cached list of accounts. */
44
- accountGetter?: (algod: Algodv2, kmd?: Kmd) => Promise<Account>;
46
+ /** Optional override for how to get a test account; this allows you to retrieve accounts from a known or cached list of accounts. */
47
+ accountGetter?: (algorand: AlgorandClient) => Promise<Account>;
45
48
  }
46
49
  /** Configuration for creating an Algorand testing fixture. */
47
- export interface AlgorandFixtureConfig {
48
- /** An optional algod client, if not specified then it will create one against environment variables defined network (if present) or default LocalNet. */
50
+ export interface AlgorandFixtureConfig extends Partial<AlgoConfig> {
51
+ /** An optional algod client, if not specified then it will create one against `algodConfig` (if present) then environment variables defined network (if present) or default LocalNet. */
49
52
  algod?: Algodv2;
50
- /** An optional indexer client, if not specified then it will create one against environment variables defined network (if present) or default LocalNet. */
53
+ /** An optional indexer client, if not specified then it will create one against `indexerConfig` (if present) then environment variables defined network (if present) or default LocalNet. */
51
54
  indexer?: Indexer;
52
- /** An optional kmd client, if not specified then it will create one against environment variables defined network (if present) or default LocalNet. */
55
+ /** An optional kmd client, if not specified then it will create one against `kmdConfig` (if present) then environment variables defined network (if present) or default LocalNet. */
53
56
  kmd?: Kmd;
54
57
  /** The amount of funds to allocate to the default testing account, if not specified then it will get 10 ALGOs. */
55
58
  testAccountFunding?: AlgoAmount;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/types/testing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/types/testing.ts"],"names":[],"mappings":"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"}