@algorandfoundation/algokit-utils 6.0.5 → 6.1.0-beta.2

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 (117) 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 +22 -9
  81. package/transaction/transaction.js.map +1 -1
  82. package/transaction/transaction.mjs +22 -9
  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/kmd-account-manager.d.ts +70 -0
  109. package/types/kmd-account-manager.d.ts.map +1 -0
  110. package/types/kmd-account-manager.js +144 -0
  111. package/types/kmd-account-manager.js.map +1 -0
  112. package/types/kmd-account-manager.mjs +142 -0
  113. package/types/kmd-account-manager.mjs.map +1 -0
  114. package/types/network-client.d.ts +2 -2
  115. package/types/network-client.d.ts.map +1 -1
  116. package/types/testing.d.ts +9 -6
  117. package/types/testing.d.ts.map +1 -1
@@ -1,20 +1,40 @@
1
- import { getTestNetDispenserApiClient } from '../dispenser-client.mjs';
2
- import { getAlgoClient, getAlgoIndexerClient, getAlgoKmdClient } from '../network-client.mjs';
1
+ import algosdk from 'algosdk';
2
+ import { AlgoHttpClientWithRetry } from './algo-http-client-with-retry.mjs';
3
3
  import { ApplicationClient } from './app-client.mjs';
4
+ import { TestNetDispenserApiClient } from './dispenser-client.mjs';
4
5
 
6
+ var Kmd = algosdk.Kmd;
7
+ var Indexer = algosdk.Indexer;
8
+ var IntDecoding = algosdk.IntDecoding;
5
9
  /** Exposes access to various API clients. */
6
10
  class ClientManager {
7
11
  /**
8
12
  * algosdk clients or config for interacting with the official Algorand APIs.
9
13
  * @param clientsOrConfig The clients or config to use
14
+ * @example Algod client only
15
+ * ```typescript
16
+ * const clientManager = new ClientManager({ algod: algodClient })
17
+ * ```
18
+ * @example All clients
19
+ * ```typescript
20
+ * const clientManager = new ClientManager({ algod: algodClient, indexer: indexerClient, kmd: kmdClient })
21
+ * ```
22
+ * @example Algod config only
23
+ * ```typescript
24
+ * const clientManager = new ClientManager({ algodConfig })
25
+ * ```
26
+ * @example All client configs
27
+ * ```typescript
28
+ * const clientManager = new ClientManager({ algodConfig, indexerConfig, kmdConfig })
29
+ * ```
10
30
  */
11
31
  constructor(clientsOrConfig) {
12
32
  const _clients = 'algod' in clientsOrConfig
13
33
  ? clientsOrConfig
14
34
  : {
15
- algod: getAlgoClient(clientsOrConfig.algodConfig),
16
- indexer: clientsOrConfig.indexerConfig ? getAlgoIndexerClient(clientsOrConfig.indexerConfig) : undefined,
17
- kmd: clientsOrConfig.kmdConfig ? getAlgoKmdClient(clientsOrConfig.kmdConfig) : undefined,
35
+ algod: ClientManager.getAlgodClient(clientsOrConfig.algodConfig),
36
+ indexer: clientsOrConfig.indexerConfig ? ClientManager.getIndexerClient(clientsOrConfig.indexerConfig) : undefined,
37
+ kmd: clientsOrConfig.kmdConfig ? ClientManager.getKmdClient(clientsOrConfig.kmdConfig) : undefined,
18
38
  };
19
39
  this._algod = _clients.algod;
20
40
  this._indexer = _clients.indexer;
@@ -36,6 +56,49 @@ class ClientManager {
36
56
  throw new Error('Attempt to use Kmd client in AlgoKit instance with no Kmd configured');
37
57
  return this._kmd;
38
58
  }
59
+ /**
60
+ * Get details about the current network.
61
+ * @example Getting genesis ID
62
+ * ```typescript
63
+ * const network = await networkClient.network()
64
+ * const genesisId = network.genesisId
65
+ * ```
66
+ * @returns The current network details
67
+ */
68
+ async network() {
69
+ if (!this._getNetworkPromise) {
70
+ this._getNetworkPromise = this._algod.getTransactionParams().do();
71
+ }
72
+ const params = await this._getNetworkPromise;
73
+ return {
74
+ isTestNet: ['testnet-v1.0', 'testnet-v1', 'testnet'].includes(params.genesisID),
75
+ isMainNet: ['mainnet-v1.0', 'mainnet-v1', 'mainnet'].includes(params.genesisID),
76
+ isLocalNet: params.genesisID === 'devnet-v1' || params.genesisID === 'sandnet-v1' || params.genesisID === 'dockernet-v1',
77
+ genesisId: params.genesisID,
78
+ genesisHash: params.genesisHash,
79
+ };
80
+ }
81
+ /**
82
+ * Returns true if the current network is LocalNet.
83
+ * @returns True if the current network is LocalNet.
84
+ */
85
+ async isLocalNet() {
86
+ return (await this.network()).isLocalNet;
87
+ }
88
+ /**
89
+ * Returns true if the current network is TestNet.
90
+ * @returns True if the current network is TestNet.
91
+ */
92
+ async isTestNet() {
93
+ return (await this.network()).isTestNet;
94
+ }
95
+ /**
96
+ * Returns true if the current network is MainNet.
97
+ * @returns True if the current network is MainNet.
98
+ */
99
+ async isMainNet() {
100
+ return (await this.network()).isMainNet;
101
+ }
39
102
  /**
40
103
  * Returns a TestNet Dispenser API client.
41
104
  * Refer to [docs](https://github.com/algorandfoundation/algokit/blob/main/docs/testnet_api.md) on guidance to obtain an access token.
@@ -43,7 +106,7 @@ class ClientManager {
43
106
  * @param params An object containing parameters for the TestNetDispenserApiClient class.
44
107
  * Or null if you want the client to load the access token from the environment variable `ALGOKIT_DISPENSER_ACCESS_TOKEN`.
45
108
  * @example
46
- * const client = algokit.getTestNetDispenserApiClient(
109
+ * const client = clientManager.getTestNetDispenser(
47
110
  * {
48
111
  * authToken: 'your_auth_token',
49
112
  * requestTimeout: 15,
@@ -53,7 +116,7 @@ class ClientManager {
53
116
  * @returns An instance of the TestNetDispenserApiClient class.
54
117
  */
55
118
  getTestNetDispenser(params = null) {
56
- return getTestNetDispenserApiClient(params);
119
+ return new TestNetDispenserApiClient(params);
57
120
  }
58
121
  /**
59
122
  * Returns a new `ApplicationClient` client, resolving the app by creator address and name.
@@ -91,6 +154,220 @@ class ClientManager {
91
154
  getTypedAppClientById(typedClient, details) {
92
155
  return new typedClient({ ...details, resolveBy: 'id' }, this._algod);
93
156
  }
157
+ /**
158
+ * Retrieve client configurations from environment variables when defined or get defaults (expects to be called from a Node.js environment)
159
+ *
160
+ * If `process.env.ALGOD_SERVER` is defined it will use that along with optional `process.env.ALGOD_PORT` and `process.env.ALGOD_TOKEN`.
161
+ *
162
+ * If `process.env.INDEXER_SERVER` is defined it will use that along with optional `process.env.INDEXER_PORT` and `process.env.INDEXER_TOKEN`.
163
+ *
164
+ * If either aren't defined it will use the default LocalNet config, noting if `process.env.ALGOD_SERVER` is specified, but
165
+ * `process.env.INDEXER_SERVER` isn't then it will leave indexer as `undefined`.
166
+ *
167
+ * It will return a KMD configuration that uses `process.env.KMD_PORT` (or port 4002) if `process.env.ALGOD_SERVER` is defined,
168
+ * otherwise it will use the default LocalNet config unless it detects testnet or mainnet.
169
+ * @example
170
+ * ```typescript
171
+ * const config = ClientManager.getConfigFromEnvironmentOrLocalNet()
172
+ * ```
173
+ * @returns The config for algod, indexer and kmd
174
+ */
175
+ static getConfigFromEnvironmentOrLocalNet() {
176
+ if (!process || !process.env) {
177
+ throw new Error('Attempt to get default client configuration from a non Node.js context; supply the config instead');
178
+ }
179
+ const algodConfig = !process.env.ALGOD_SERVER
180
+ ? ClientManager.getDefaultLocalNetConfig('algod')
181
+ : ClientManager.getAlgodConfigFromEnvironment();
182
+ const indexerConfig = !process.env.INDEXER_SERVER
183
+ ? ClientManager.getDefaultLocalNetConfig('indexer')
184
+ : !process.env.ALGOD_SERVER
185
+ ? ClientManager.getIndexerConfigFromEnvironment()
186
+ : undefined;
187
+ return {
188
+ algodConfig,
189
+ indexerConfig,
190
+ kmdConfig: process.env.ALGOD_SERVER
191
+ ? process.env.ALGOD_SERVER.includes('mainnet') || process.env.ALGOD_SERVER.includes('testnet')
192
+ ? undefined
193
+ : { ...algodConfig, port: process?.env?.KMD_PORT ?? '4002' }
194
+ : ClientManager.getDefaultLocalNetConfig('kmd'),
195
+ };
196
+ }
197
+ /** Retrieve the algod configuration from environment variables (expects to be called from a Node.js environment)
198
+ *
199
+ * Expects `process.env.ALGOD_SERVER` to be defined, and you can also specify `process.env.ALGOD_PORT` and `process.env.ALGOD_TOKEN`.
200
+ */
201
+ static getAlgodConfigFromEnvironment() {
202
+ if (!process || !process.env) {
203
+ throw new Error('Attempt to get default algod configuration from a non Node.js context; supply the config instead');
204
+ }
205
+ if (!process.env.ALGOD_SERVER) {
206
+ throw new Error('Attempt to get default algod configuration without specifying ALGOD_SERVER in the environment variables');
207
+ }
208
+ return {
209
+ server: process.env.ALGOD_SERVER,
210
+ port: process.env.ALGOD_PORT,
211
+ token: process.env.ALGOD_TOKEN,
212
+ };
213
+ }
214
+ /**
215
+ * Retrieve the indexer configuration from environment variables (expects to be called from a Node.js environment).
216
+ *
217
+ * Expects `process.env.INDEXER_SERVER` to be defined, and you can also specify `process.env.INDEXER_PORT` and `process.env.INDEXER_TOKEN`.
218
+ */
219
+ static getIndexerConfigFromEnvironment() {
220
+ if (!process || !process.env) {
221
+ throw new Error('Attempt to get default indexer configuration from a non Node.js context; supply the config instead');
222
+ }
223
+ if (!process.env.INDEXER_SERVER) {
224
+ throw new Error('Attempt to get default indexer configuration without specifying INDEXER_SERVER in the environment variables');
225
+ }
226
+ return {
227
+ server: process.env.INDEXER_SERVER,
228
+ port: process.env.INDEXER_PORT,
229
+ token: process.env.INDEXER_TOKEN,
230
+ };
231
+ }
232
+ /** Returns the Algorand configuration to point to the free tier of the AlgoNode service.
233
+ *
234
+ * @param network Which network to connect to - TestNet or MainNet
235
+ * @param config Which algod config to return - Algod or Indexer
236
+ */
237
+ static getAlgoNodeConfig(network, config) {
238
+ return {
239
+ server: `https://${network}-${config === 'algod' ? 'api' : 'idx'}.algonode.cloud/`,
240
+ port: 443,
241
+ };
242
+ }
243
+ /** Returns the Algorand configuration to point to the default LocalNet.
244
+ *
245
+ * @param configOrPort Which algod config to return - algod, kmd, or indexer OR a port number
246
+ */
247
+ static getDefaultLocalNetConfig(configOrPort) {
248
+ return {
249
+ server: `http://localhost`,
250
+ port: configOrPort === 'algod' ? 4001 : configOrPort === 'indexer' ? 8980 : configOrPort === 'kmd' ? 4002 : configOrPort,
251
+ token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
252
+ };
253
+ }
254
+ /**
255
+ * Returns an algod SDK client that automatically retries on idempotent calls.
256
+ *
257
+ * @param config The config of the client
258
+ * @example AlgoNode (testnet)
259
+ * ```typescript
260
+ * const algod = ClientManager.getAlgodClient(ClientManager.getAlgoNodeConfig('testnet', 'algod'))
261
+ * await algod.healthCheck().do()
262
+ * ```
263
+ * @example AlgoNode (mainnet)
264
+ * ```typescript
265
+ * const algod = ClientManager.getAlgodClient(ClientManager.getAlgoNodeConfig('mainnet', 'algod'))
266
+ * await algod.healthCheck().do()
267
+ * ```
268
+ * @example Custom (e.g. default LocalNet)
269
+ * ```typescript
270
+ * const algod = ClientManager.getAlgodClient({server: 'http://localhost', port: '4001', token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})
271
+ * await algod.healthCheck().do()
272
+ * ```
273
+ */
274
+ static getAlgodClient(config) {
275
+ const { token, server, port } = config;
276
+ const tokenHeader = typeof token === 'string' ? { 'X-Algo-API-Token': token } : token ?? {};
277
+ const httpClientWithRetry = new AlgoHttpClientWithRetry(tokenHeader, server, port);
278
+ return new algosdk.Algodv2(httpClientWithRetry, server);
279
+ }
280
+ /**
281
+ * Returns an algod SDK client that automatically retries on idempotent calls loaded from environment variables (expects to be called from a Node.js environment).
282
+ *
283
+ * @example
284
+ * ```typescript
285
+ * // Uses process.env.ALGOD_SERVER, process.env.ALGOD_PORT and process.env.ALGOD_TOKEN
286
+ * const algod = ClientManager.getAlgodClientFromEnvironment()
287
+ * await algod.healthCheck().do()
288
+ * ```
289
+ */
290
+ static getAlgodClientFromEnvironment() {
291
+ return ClientManager.getAlgodClient(ClientManager.getAlgodConfigFromEnvironment());
292
+ }
293
+ /**
294
+ * Returns an indexer SDK client that automatically retries on idempotent calls
295
+ *
296
+ * @param config The config of the client
297
+ * @param overrideIntDecoding Override the default int decoding for responses, uses MIXED by default to avoid lost precision for big integers
298
+ * @example AlgoNode (testnet)
299
+ * ```typescript
300
+ * const indexer = ClientManager.getIndexerClient(ClientManager.getAlgoNodeConfig('testnet', 'indexer'))
301
+ * await indexer.makeHealthCheck().do()
302
+ * ```
303
+ * @example AlgoNode (mainnet)
304
+ * ```typescript
305
+ * const indexer = ClientManager.getIndexerClient(ClientManager.getAlgoNodeConfig('mainnet', 'indexer'))
306
+ * await indexer.makeHealthCheck().do()
307
+ * ```
308
+ * @example Custom (e.g. default LocalNet, although we recommend loading this into a .env and using the Default option instead)
309
+ * ```typescript
310
+ * const indexer = ClientManager.getIndexerClient({server: 'http://localhost', port: '8980', token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})
311
+ * await indexer.makeHealthCheck().do()
312
+ * ```
313
+ * @example Override int decoding for responses
314
+ * ```typescript
315
+ * const indexer = ClientManager.getIndexerClient(config, IntDecoding.BIGINT)
316
+ * ```
317
+ */
318
+ static getIndexerClient(config, overrideIntDecoding) {
319
+ const { token, server, port } = config;
320
+ const tokenHeader = typeof token === 'string' ? { 'X-Indexer-API-Token': token } : token ?? {};
321
+ const httpClientWithRetry = new AlgoHttpClientWithRetry(tokenHeader, server, port);
322
+ const indexer = new Indexer(httpClientWithRetry);
323
+ // Use mixed int decoding by default so bigints don't have lost precision
324
+ indexer.setIntEncoding(overrideIntDecoding ?? IntDecoding.MIXED);
325
+ return indexer;
326
+ }
327
+ /**
328
+ * Returns an indexer SDK client that automatically retries on idempotent calls loaded from environment variables (expects to be called from a Node.js environment).
329
+ *
330
+ * @param overrideIntDecoding Override the default int decoding for responses, uses MIXED by default to avoid lost precision for big integers
331
+ * @example
332
+ *
333
+ * ```typescript
334
+ * // Uses process.env.INDEXER_SERVER, process.env.INDEXER_PORT and process.env.INDEXER_TOKEN
335
+ * const indexer = ClientManager.getIndexerClientFromEnvironment()
336
+ * await indexer.makeHealthCheck().do()
337
+ * ```
338
+ */
339
+ static getIndexerClientFromEnvironment(overrideIntDecoding) {
340
+ return ClientManager.getIndexerClient(ClientManager.getIndexerConfigFromEnvironment(), overrideIntDecoding);
341
+ }
342
+ /**
343
+ * Returns a KMD SDK client.
344
+ *
345
+ * KMD client allows you to export private keys, which is useful to (for instance) get the default account in a LocalNet network.
346
+ *
347
+ * @param config The config for the client
348
+ * @example Custom (e.g. default LocalNet, although we recommend loading this into a .env and using the Default option instead)
349
+ * ```typescript
350
+ * const kmd = ClientManager.getKmdClient({server: 'http://localhost', port: '4002', token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})
351
+ * ```
352
+ */
353
+ static getKmdClient(config) {
354
+ const { token, server, port } = config;
355
+ return new Kmd(token, server, port);
356
+ }
357
+ /**
358
+ * Returns a KMD SDK client that automatically retries on idempotent calls loaded from environment variables (expects to be called from a Node.js environment).
359
+ *
360
+ * @example
361
+ * ```typescript
362
+ * // Uses process.env.ALGOD_SERVER, process.env.KMD_PORT (or if not specified: port 4002) and process.env.ALGOD_TOKEN
363
+ * const kmd = ClientManager.getKmdClientFromEnvironment()
364
+ * ```
365
+ */
366
+ static getKmdClientFromEnvironment() {
367
+ // We can only use Kmd on the LocalNet otherwise it's not exposed so this makes some assumptions
368
+ // (e.g. same token and server as algod and port 4002 by default)
369
+ return ClientManager.getKmdClient({ ...ClientManager.getAlgodConfigFromEnvironment(), port: process?.env?.KMD_PORT ?? '4002' });
370
+ }
94
371
  }
95
372
 
96
373
  export { ClientManager };
@@ -1 +1 @@
1
- {"version":3,"file":"client-manager.mjs","sources":["../../src/types/client-manager.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAyBA;MACa,aAAa,CAAA;AAKxB;;;AAGG;AACH,IAAA,WAAA,CAAY,eAA4C,EAAA;AACtD,QAAA,MAAM,QAAQ,GACZ,OAAO,IAAI,eAAe;AACxB,cAAE,eAAe;AACjB,cAAE;AACE,gBAAA,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,WAAW,CAAC;AACjD,gBAAA,OAAO,EAAE,eAAe,CAAC,aAAa,GAAG,oBAAoB,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,SAAS;AACxG,gBAAA,GAAG,EAAE,eAAe,CAAC,SAAS,GAAG,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,SAAS;aACzF,CAAA;AACP,QAAA,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAA;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAA;AAChC,QAAA,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAA;KACzB;;AAGD,IAAA,IAAW,KAAK,GAAA;QACd,OAAO,IAAI,CAAC,MAAM,CAAA;KACnB;;AAGD,IAAA,IAAW,OAAO,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAA;QACnH,OAAO,IAAI,CAAC,QAAQ,CAAA;KACrB;;AAGD,IAAA,IAAW,GAAG,GAAA;QACZ,IAAI,CAAC,IAAI,CAAC,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAA;QACvG,OAAO,IAAI,CAAC,IAAI,CAAA;KACjB;AAED;;;;;;;;;;;;;;;AAeG;IACI,mBAAmB,CAAC,SAAiD,IAAI,EAAA;AAC9E,QAAA,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAA;KAC5C;AAED;;;;;AAKG;IACI,4BAA4B,CAAC,OAAyC,EAAE,eAA2B,EAAA;QACxG,OAAO,IAAI,iBAAiB,CAC1B,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAC/F,IAAI,CAAC,MAAM,CACZ,CAAA;KACF;AAED;;;;AAIG;AACI,IAAA,gBAAgB,CAAC,OAA6B,EAAA;AACnD,QAAA,OAAO,IAAI,iBAAiB,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;KAC3E;AAED;;;;;;AAMG;AACI,IAAA,iCAAiC,CACtC,WAAoC,EACpC,OAA8C,EAC9C,eAA2B,EAAA;QAE3B,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;KACrI;AAED;;;;;AAKG;IACI,qBAAqB,CAAU,WAAoC,EAAE,OAAkC,EAAA;AAC5G,QAAA,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;KACrE;AACF;;;;"}
1
+ {"version":3,"file":"client-manager.mjs","sources":["../../src/types/client-manager.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { SigningAccount, TransactionSignerAccount } from './account';
2
+ import { AlgoAmount } from './amount';
3
+ import { ClientManager } from './client-manager';
4
+ /** Provides abstractions over a [KMD](https://github.com/algorand/go-algorand/blob/master/daemon/kmd/README.md) instance
5
+ * that makes it easier to get and manage accounts using KMD. */
6
+ export declare class KmdAccountManager {
7
+ private _clientManager;
8
+ /**
9
+ * Create a new KMD manager.
10
+ * @param clientManager A ClientManager client to use for algod and kmd clients
11
+ */
12
+ constructor(clientManager: ClientManager);
13
+ /**
14
+ * Returns an Algorand signing account with private key loaded from the given KMD wallet (identified by name).
15
+ *
16
+ * @param walletName The name of the wallet to retrieve an account from
17
+ * @param predicate An optional filter to use to find the account (otherwise it will return a random account from the wallet)
18
+ * @param sender The optional sender address to use this signer for (aka a rekeyed account)
19
+ * @example Get default funded account in a LocalNet
20
+ *
21
+ * ```typescript
22
+ * const defaultDispenserAccount = await kmdAccountManager.getWalletAccount(
23
+ * 'unencrypted-default-wallet',
24
+ * a => a.status !== 'Offline' && a.amount > 1_000_000_000
25
+ * )
26
+ * ```
27
+ * @returns The signing account (with private key loaded) or undefined if no matching wallet or account was found
28
+ */
29
+ getWalletAccount(walletName: string, predicate?: (account: Record<string, any>) => boolean, sender?: string): Promise<(TransactionSignerAccount & {
30
+ account: SigningAccount;
31
+ }) | undefined>;
32
+ /**
33
+ * 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.
34
+ *
35
+ * This is useful to get idempotent accounts from LocalNet without having to specify the private key (which will change when resetting the LocalNet).
36
+ *
37
+ * 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.
38
+ *
39
+ * If this is used via `mnemonicAccountFromEnvironment`, then you can even use the same code that runs on production without changes for local development!
40
+ *
41
+ * @param name The name of the wallet to retrieve / create
42
+ * @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
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * // Idempotently get (if exists) or crate (if it doesn't exist yet) an account by name using KMD
47
+ * // if creating it then fund it with 2 Algos from the default dispenser account
48
+ * const newAccount = await kmdAccountManager.getOrCreateWalletAccount('account1', (2).algos())
49
+ * // This will return the same account as above since the name matches
50
+ * const existingAccount = await kmdAccountManager.getOrCreateWalletAccount('account1')
51
+ * ```
52
+ *
53
+ * @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
54
+ */
55
+ getOrCreateWalletAccount(name: string, fundWith?: AlgoAmount): Promise<TransactionSignerAccount & {
56
+ account: SigningAccount;
57
+ }>;
58
+ /**
59
+ * Returns an Algorand account with private key loaded for the default LocalNet dispenser account (that can be used to fund other accounts).
60
+ * @example
61
+ * ```typescript
62
+ * const dispenser = await kmdAccountManager.getLocalNetDispenserAccount()
63
+ * ```
64
+ * @returns The default LocalNet dispenser account
65
+ */
66
+ getLocalNetDispenserAccount(): Promise<TransactionSignerAccount & {
67
+ account: SigningAccount;
68
+ }>;
69
+ }
70
+ //# sourceMappingURL=kmd-account-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kmd-account-manager.d.ts","sourceRoot":"","sources":["../../src/types/kmd-account-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAA;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGhD;gEACgE;AAChE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,cAAc,CAAe;IAErC;;;OAGG;gBACS,aAAa,EAAE,aAAa;IAIxC;;;;;;;;;;;;;;;OAeG;IACU,gBAAgB,CAC3B,UAAU,EAAE,MAAM,EAElB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,EACrD,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,CAAC,wBAAwB,GAAG;QAAE,OAAO,EAAE,cAAc,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;IA2ChF;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACU,wBAAwB,CACnC,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,UAAU,GACpB,OAAO,CAAC,wBAAwB,GAAG;QAAE,OAAO,EAAE,cAAc,CAAA;KAAE,CAAC;IAuClE;;;;;;;OAOG;IACU,2BAA2B;;;CAazC"}
@@ -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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"}