@algorandfoundation/algokit-utils 9.2.0 → 9.2.1-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 (340) hide show
  1. package/_virtual/_rolldown/runtime.js +33 -0
  2. package/_virtual/_rolldown/runtime.mjs +13 -0
  3. package/account/account.d.ts +25 -30
  4. package/account/account.js +151 -146
  5. package/account/account.js.map +1 -1
  6. package/account/account.mjs +149 -144
  7. package/account/account.mjs.map +1 -1
  8. package/account/get-account-config-from-environment.d.ts +7 -2
  9. package/account/get-account-config-from-environment.js +19 -21
  10. package/account/get-account-config-from-environment.js.map +1 -1
  11. package/account/get-account-config-from-environment.mjs +19 -19
  12. package/account/get-account-config-from-environment.mjs.map +1 -1
  13. package/account/get-account.d.ts +14 -12
  14. package/account/get-account.js +56 -59
  15. package/account/get-account.js.map +1 -1
  16. package/account/get-account.mjs +56 -57
  17. package/account/get-account.mjs.map +1 -1
  18. package/account/get-dispenser-account.d.ts +9 -5
  19. package/account/get-dispenser-account.js +20 -18
  20. package/account/get-dispenser-account.js.map +1 -1
  21. package/account/get-dispenser-account.mjs +20 -16
  22. package/account/get-dispenser-account.mjs.map +1 -1
  23. package/account/mnemonic-account.d.ts +7 -3
  24. package/account/mnemonic-account.js +17 -17
  25. package/account/mnemonic-account.js.map +1 -1
  26. package/account/mnemonic-account.mjs +15 -15
  27. package/account/mnemonic-account.mjs.map +1 -1
  28. package/amount.d.ts +40 -35
  29. package/amount.js +33 -34
  30. package/amount.js.map +1 -1
  31. package/amount.mjs +33 -32
  32. package/amount.mjs.map +1 -1
  33. package/app-client.d.ts +10 -6
  34. package/app-client.js +91 -86
  35. package/app-client.js.map +1 -1
  36. package/app-client.mjs +91 -84
  37. package/app-client.mjs.map +1 -1
  38. package/app-deploy.d.ts +26 -24
  39. package/app-deploy.js +235 -253
  40. package/app-deploy.js.map +1 -1
  41. package/app-deploy.mjs +233 -251
  42. package/app-deploy.mjs.map +1 -1
  43. package/app.d.ts +45 -46
  44. package/app.js +253 -271
  45. package/app.js.map +1 -1
  46. package/app.mjs +249 -267
  47. package/app.mjs.map +1 -1
  48. package/asset.d.ts +16 -12
  49. package/asset.js +116 -122
  50. package/asset.js.map +1 -1
  51. package/asset.mjs +116 -120
  52. package/asset.mjs.map +1 -1
  53. package/config.d.ts +7 -2
  54. package/config.js +5 -7
  55. package/config.js.map +1 -1
  56. package/config.mjs +5 -4
  57. package/config.mjs.map +1 -1
  58. package/debugging/debugging.d.ts +5 -1
  59. package/debugging/debugging.js +11 -11
  60. package/debugging/debugging.js.map +1 -1
  61. package/debugging/debugging.mjs +11 -9
  62. package/debugging/debugging.mjs.map +1 -1
  63. package/dispenser-client.d.ts +7 -2
  64. package/dispenser-client.js +23 -24
  65. package/dispenser-client.js.map +1 -1
  66. package/dispenser-client.mjs +23 -22
  67. package/dispenser-client.mjs.map +1 -1
  68. package/index.d.ts +27 -18
  69. package/index.js +140 -143
  70. package/index.mjs +27 -29
  71. package/indexer-lookup.d.ts +18 -11
  72. package/indexer-lookup.js +112 -120
  73. package/indexer-lookup.js.map +1 -1
  74. package/indexer-lookup.mjs +105 -118
  75. package/indexer-lookup.mjs.map +1 -1
  76. package/localnet/get-kmd-wallet-account.d.ts +9 -7
  77. package/localnet/get-kmd-wallet-account.js +28 -26
  78. package/localnet/get-kmd-wallet-account.js.map +1 -1
  79. package/localnet/get-kmd-wallet-account.mjs +28 -24
  80. package/localnet/get-kmd-wallet-account.mjs.map +1 -1
  81. package/localnet/get-localnet-dispenser-account.d.ts +7 -5
  82. package/localnet/get-localnet-dispenser-account.js +17 -15
  83. package/localnet/get-localnet-dispenser-account.js.map +1 -1
  84. package/localnet/get-localnet-dispenser-account.mjs +17 -13
  85. package/localnet/get-localnet-dispenser-account.mjs.map +1 -1
  86. package/localnet/get-or-create-kmd-wallet-account.d.ts +10 -8
  87. package/localnet/get-or-create-kmd-wallet-account.js +28 -26
  88. package/localnet/get-or-create-kmd-wallet-account.js.map +1 -1
  89. package/localnet/get-or-create-kmd-wallet-account.mjs +28 -24
  90. package/localnet/get-or-create-kmd-wallet-account.mjs.map +1 -1
  91. package/localnet/is-localnet.d.ts +7 -3
  92. package/localnet/is-localnet.js +9 -10
  93. package/localnet/is-localnet.js.map +1 -1
  94. package/localnet/is-localnet.mjs +9 -8
  95. package/localnet/is-localnet.mjs.map +1 -1
  96. package/network-client.d.ts +17 -15
  97. package/network-client.js +115 -116
  98. package/network-client.js.map +1 -1
  99. package/network-client.mjs +115 -114
  100. package/network-client.mjs.map +1 -1
  101. package/package.json +12 -3
  102. package/testing/account.d.ts +11 -9
  103. package/testing/account.js +31 -33
  104. package/testing/account.js.map +1 -1
  105. package/testing/account.mjs +29 -31
  106. package/testing/account.mjs.map +1 -1
  107. package/testing/fixtures/algokit-log-capture-fixture.d.ts +7 -2
  108. package/testing/fixtures/algokit-log-capture-fixture.js +36 -41
  109. package/testing/fixtures/algokit-log-capture-fixture.js.map +1 -1
  110. package/testing/fixtures/algokit-log-capture-fixture.mjs +36 -39
  111. package/testing/fixtures/algokit-log-capture-fixture.mjs.map +1 -1
  112. package/testing/fixtures/algorand-fixture.d.ts +9 -4
  113. package/testing/fixtures/algorand-fixture.js +67 -62
  114. package/testing/fixtures/algorand-fixture.js.map +1 -1
  115. package/testing/fixtures/algorand-fixture.mjs +66 -59
  116. package/testing/fixtures/algorand-fixture.mjs.map +1 -1
  117. package/testing/index.d.ts +7 -5
  118. package/testing/index.js +13 -18
  119. package/testing/index.mjs +7 -7
  120. package/testing/indexer.d.ts +5 -1
  121. package/testing/indexer.js +28 -37
  122. package/testing/indexer.js.map +1 -1
  123. package/testing/indexer.mjs +28 -35
  124. package/testing/indexer.mjs.map +1 -1
  125. package/testing/test-logger.d.ts +41 -36
  126. package/testing/test-logger.js +71 -76
  127. package/testing/test-logger.js.map +1 -1
  128. package/testing/test-logger.mjs +71 -74
  129. package/testing/test-logger.mjs.map +1 -1
  130. package/testing/transaction-logger.d.ts +30 -27
  131. package/testing/transaction-logger.js +77 -93
  132. package/testing/transaction-logger.js.map +1 -1
  133. package/testing/transaction-logger.mjs +74 -90
  134. package/testing/transaction-logger.mjs.map +1 -1
  135. package/transaction/legacy-bridge.js +100 -111
  136. package/transaction/legacy-bridge.js.map +1 -1
  137. package/transaction/legacy-bridge.mjs +97 -108
  138. package/transaction/legacy-bridge.mjs.map +1 -1
  139. package/transaction/perform-atomic-transaction-composer-simulate.d.ts +7 -5
  140. package/transaction/perform-atomic-transaction-composer-simulate.js +31 -36
  141. package/transaction/perform-atomic-transaction-composer-simulate.js.map +1 -1
  142. package/transaction/perform-atomic-transaction-composer-simulate.mjs +28 -33
  143. package/transaction/perform-atomic-transaction-composer-simulate.mjs.map +1 -1
  144. package/transaction/transaction.d.ts +34 -35
  145. package/transaction/transaction.js +716 -914
  146. package/transaction/transaction.js.map +1 -1
  147. package/transaction/transaction.mjs +713 -911
  148. package/transaction/transaction.mjs.map +1 -1
  149. package/transfer/transfer-algos.d.ts +9 -5
  150. package/transfer/transfer-algos.js +26 -27
  151. package/transfer/transfer-algos.js.map +1 -1
  152. package/transfer/transfer-algos.mjs +26 -25
  153. package/transfer/transfer-algos.mjs.map +1 -1
  154. package/transfer/transfer.d.ts +11 -8
  155. package/transfer/transfer.js +94 -100
  156. package/transfer/transfer.js.map +1 -1
  157. package/transfer/transfer.mjs +94 -98
  158. package/transfer/transfer.mjs.map +1 -1
  159. package/types/account-manager.d.ts +432 -429
  160. package/types/account-manager.js +591 -602
  161. package/types/account-manager.js.map +1 -1
  162. package/types/account-manager.mjs +587 -599
  163. package/types/account-manager.mjs.map +1 -1
  164. package/types/account.d.ts +192 -202
  165. package/types/account.js +91 -88
  166. package/types/account.js.map +1 -1
  167. package/types/account.mjs +88 -86
  168. package/types/account.mjs.map +1 -1
  169. package/types/algo-http-client-with-retry.d.ts +15 -10
  170. package/types/algo-http-client-with-retry.js +70 -92
  171. package/types/algo-http-client-with-retry.js.map +1 -1
  172. package/types/algo-http-client-with-retry.mjs +69 -90
  173. package/types/algo-http-client-with-retry.mjs.map +1 -1
  174. package/types/algorand-client-transaction-creator.d.ts +778 -771
  175. package/types/algorand-client-transaction-creator.js +733 -732
  176. package/types/algorand-client-transaction-creator.js.map +1 -1
  177. package/types/algorand-client-transaction-creator.mjs +732 -730
  178. package/types/algorand-client-transaction-creator.mjs.map +1 -1
  179. package/types/algorand-client-transaction-sender.d.ts +1090 -1360
  180. package/types/algorand-client-transaction-sender.js +930 -961
  181. package/types/algorand-client-transaction-sender.js.map +1 -1
  182. package/types/algorand-client-transaction-sender.mjs +927 -959
  183. package/types/algorand-client-transaction-sender.mjs.map +1 -1
  184. package/types/algorand-client.d.ts +239 -236
  185. package/types/algorand-client.js +322 -320
  186. package/types/algorand-client.js.map +1 -1
  187. package/types/algorand-client.mjs +321 -318
  188. package/types/algorand-client.mjs.map +1 -1
  189. package/types/amount.d.ts +47 -43
  190. package/types/amount.js +66 -70
  191. package/types/amount.js.map +1 -1
  192. package/types/amount.mjs +63 -68
  193. package/types/amount.mjs.map +1 -1
  194. package/types/app-arc56.d.ts +235 -272
  195. package/types/app-arc56.js +124 -170
  196. package/types/app-arc56.js.map +1 -1
  197. package/types/app-arc56.mjs +121 -168
  198. package/types/app-arc56.mjs.map +1 -1
  199. package/types/app-client.d.ts +1128 -2009
  200. package/types/app-client.js +1633 -1791
  201. package/types/app-client.js.map +1 -1
  202. package/types/app-client.mjs +1624 -1783
  203. package/types/app-client.mjs.map +1 -1
  204. package/types/app-deployer.d.ts +139 -141
  205. package/types/app-deployer.js +344 -384
  206. package/types/app-deployer.js.map +1 -1
  207. package/types/app-deployer.mjs +341 -382
  208. package/types/app-deployer.mjs.map +1 -1
  209. package/types/app-factory.d.ts +762 -932
  210. package/types/app-factory.js +496 -488
  211. package/types/app-factory.js.map +1 -1
  212. package/types/app-factory.mjs +491 -484
  213. package/types/app-factory.mjs.map +1 -1
  214. package/types/app-manager.d.ts +304 -310
  215. package/types/app-manager.js +422 -475
  216. package/types/app-manager.js.map +1 -1
  217. package/types/app-manager.mjs +419 -473
  218. package/types/app-manager.mjs.map +1 -1
  219. package/types/app-spec.d.ts +118 -117
  220. package/types/app-spec.js +125 -135
  221. package/types/app-spec.js.map +1 -1
  222. package/types/app-spec.mjs +121 -132
  223. package/types/app-spec.mjs.map +1 -1
  224. package/types/app.d.ts +229 -241
  225. package/types/app.js +36 -28
  226. package/types/app.js.map +1 -1
  227. package/types/app.mjs +33 -26
  228. package/types/app.mjs.map +1 -1
  229. package/types/asset-manager.d.ts +204 -199
  230. package/types/asset-manager.js +165 -174
  231. package/types/asset-manager.js.map +1 -1
  232. package/types/asset-manager.mjs +164 -172
  233. package/types/asset-manager.mjs.map +1 -1
  234. package/types/asset.d.ts +95 -91
  235. package/types/asset.js +0 -3
  236. package/types/asset.mjs +0 -2
  237. package/types/async-event-emitter.d.ts +18 -13
  238. package/types/async-event-emitter.js +37 -49
  239. package/types/async-event-emitter.js.map +1 -1
  240. package/types/async-event-emitter.mjs +36 -47
  241. package/types/async-event-emitter.mjs.map +1 -1
  242. package/types/client-manager.d.ts +453 -451
  243. package/types/client-manager.js +602 -598
  244. package/types/client-manager.js.map +1 -1
  245. package/types/client-manager.mjs +597 -594
  246. package/types/client-manager.mjs.map +1 -1
  247. package/types/composer.d.ts +1211 -1258
  248. package/types/composer.js +1436 -1498
  249. package/types/composer.js.map +1 -1
  250. package/types/composer.mjs +1430 -1493
  251. package/types/composer.mjs.map +1 -1
  252. package/types/config.d.ts +53 -48
  253. package/types/config.js +78 -77
  254. package/types/config.js.map +1 -1
  255. package/types/config.mjs +77 -75
  256. package/types/config.mjs.map +1 -1
  257. package/types/debugging.d.ts +25 -23
  258. package/types/debugging.js +9 -11
  259. package/types/debugging.js.map +1 -1
  260. package/types/debugging.mjs +8 -9
  261. package/types/debugging.mjs.map +1 -1
  262. package/types/dispenser-client.d.ts +57 -52
  263. package/types/dispenser-client.js +120 -141
  264. package/types/dispenser-client.js.map +1 -1
  265. package/types/dispenser-client.mjs +119 -139
  266. package/types/dispenser-client.mjs.map +1 -1
  267. package/types/expand.d.ts +5 -3
  268. package/types/expand.js +0 -3
  269. package/types/expand.mjs +0 -2
  270. package/types/indexer.d.ts +104 -100
  271. package/types/indexer.js +36 -31
  272. package/types/indexer.js.map +1 -1
  273. package/types/indexer.mjs +32 -30
  274. package/types/indexer.mjs.map +1 -1
  275. package/types/instance-of.d.ts +5 -3
  276. package/types/instance-of.js +0 -3
  277. package/types/instance-of.mjs +0 -2
  278. package/types/kmd-account-manager.d.ts +75 -70
  279. package/types/kmd-account-manager.js +150 -184
  280. package/types/kmd-account-manager.js.map +1 -1
  281. package/types/kmd-account-manager.mjs +147 -182
  282. package/types/kmd-account-manager.mjs.map +1 -1
  283. package/types/lifecycle-events.d.ts +13 -8
  284. package/types/lifecycle-events.js +10 -7
  285. package/types/lifecycle-events.js.map +1 -1
  286. package/types/lifecycle-events.mjs +9 -7
  287. package/types/lifecycle-events.mjs.map +1 -1
  288. package/types/logging.d.ts +15 -11
  289. package/types/logging.js +30 -31
  290. package/types/logging.js.map +1 -1
  291. package/types/logging.mjs +29 -29
  292. package/types/logging.mjs.map +1 -1
  293. package/types/logic-error.d.ts +33 -29
  294. package/types/logic-error.js +50 -49
  295. package/types/logic-error.js.map +1 -1
  296. package/types/logic-error.mjs +49 -47
  297. package/types/logic-error.mjs.map +1 -1
  298. package/types/network-client.d.ts +32 -27
  299. package/types/network-client.js +10 -9
  300. package/types/network-client.js.map +1 -1
  301. package/types/network-client.mjs +9 -7
  302. package/types/network-client.mjs.map +1 -1
  303. package/types/testing.d.ts +131 -132
  304. package/types/testing.js +0 -3
  305. package/types/testing.mjs +0 -2
  306. package/types/transaction.d.ts +110 -110
  307. package/types/transaction.js +0 -3
  308. package/types/transaction.mjs +0 -2
  309. package/types/transfer.d.ts +70 -66
  310. package/types/transfer.js +0 -3
  311. package/types/transfer.mjs +0 -2
  312. package/util.js +73 -118
  313. package/util.js.map +1 -1
  314. package/util.mjs +73 -116
  315. package/util.mjs.map +1 -1
  316. package/account/index.d.ts +0 -5
  317. package/debugging/index.d.ts +0 -1
  318. package/index.js.map +0 -1
  319. package/index.mjs.map +0 -1
  320. package/localnet/index.d.ts +0 -4
  321. package/testing/_asset.d.ts +0 -3
  322. package/testing/fixtures/index.d.ts +0 -2
  323. package/testing/index.js.map +0 -1
  324. package/testing/index.mjs.map +0 -1
  325. package/transaction/index.d.ts +0 -2
  326. package/transaction/legacy-bridge.d.ts +0 -35
  327. package/transfer/index.d.ts +0 -2
  328. package/types/asset.js.map +0 -1
  329. package/types/asset.mjs.map +0 -1
  330. package/types/expand.js.map +0 -1
  331. package/types/expand.mjs.map +0 -1
  332. package/types/instance-of.js.map +0 -1
  333. package/types/instance-of.mjs.map +0 -1
  334. package/types/testing.js.map +0 -1
  335. package/types/testing.mjs.map +0 -1
  336. package/types/transaction.js.map +0 -1
  337. package/types/transaction.mjs.map +0 -1
  338. package/types/transfer.js.map +0 -1
  339. package/types/transfer.mjs.map +0 -1
  340. package/util.d.ts +0 -48
@@ -1,186 +1,152 @@
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_clientManager = require('./client-manager.js');
8
- var types_composer = require('./composer.js');
9
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_runtime = require("../_virtual/_rolldown/runtime.js");
3
+ const require_config = require("../config.js");
4
+ const require_account = require("./account.js");
5
+ const require_amount = require("./amount.js");
6
+ const require_composer = require("./composer.js");
7
+ const require_client_manager = require("./client-manager.js");
8
+ let algosdk = require("algosdk");
9
+ algosdk = require_runtime.__toESM(algosdk);
10
+ //#region src/types/kmd-account-manager.ts
10
11
  /** Provides abstractions over a [KMD](https://github.com/algorand/go-algorand/blob/master/daemon/kmd/README.md) instance
11
- * that makes it easier to get and manage accounts using KMD. */
12
- class KmdAccountManager {
13
- /**
14
- * Create a new KMD manager.
15
- * @param clientManager A ClientManager client to use for algod and kmd clients
16
- */
17
- constructor(clientManager) {
18
- this._clientManager = clientManager;
19
- try {
20
- this._kmd = clientManager.kmd;
21
- }
22
- catch {
23
- this._kmd = undefined;
24
- }
25
- }
26
- async kmd() {
27
- if (this._kmd === undefined) {
28
- if (await this._clientManager.isLocalNet()) {
29
- const { kmdConfig } = types_clientManager.ClientManager.getConfigFromEnvironmentOrLocalNet();
30
- if (kmdConfig) {
31
- this._kmd = types_clientManager.ClientManager.getKmdClient(kmdConfig);
32
- return this._kmd;
33
- }
34
- }
35
- this._kmd = null;
36
- }
37
- if (!this._kmd) {
38
- throw new Error('Attempt to use Kmd client in AlgoKit instance with no Kmd configured');
39
- }
40
- return this._kmd;
41
- }
42
- /**
43
- * Returns an Algorand signing account with private key loaded from the given KMD wallet (identified by name).
44
- *
45
- * @param walletName The name of the wallet to retrieve an account from
46
- * @param predicate An optional filter to use to find the account (otherwise it will return a random account from the wallet)
47
- * @param sender The optional sender address to use this signer for (aka a rekeyed account)
48
- * @example Get default funded account in a LocalNet
49
- *
50
- * ```typescript
51
- * const defaultDispenserAccount = await kmdAccountManager.getWalletAccount(
52
- * 'unencrypted-default-wallet',
53
- * a => a.status !== 'Offline' && a.amount > 1_000_000_000
54
- * )
55
- * ```
56
- * @returns The signing account (with private key loaded) or undefined if no matching wallet or account was found
57
- */
58
- async getWalletAccount(walletName,
59
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
- predicate, sender) {
61
- return this.findWalletAccount(walletName, predicate, sender);
62
- }
63
- async findWalletAccount(walletName,
64
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
65
- predicateOrAddress, sender) {
66
- const kmd = await this.kmd();
67
- const walletsResponse = await kmd.listWallets();
68
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
- const wallet = walletsResponse.wallets.filter((w) => w.name === walletName);
70
- if (wallet.length === 0) {
71
- return undefined;
72
- }
73
- const walletId = wallet[0].id;
74
- const walletHandle = (await kmd.initWalletHandle(walletId, '')).wallet_handle_token;
75
- let matchedAddress = undefined;
76
- if (predicateOrAddress && typeof predicateOrAddress === 'string') {
77
- matchedAddress = predicateOrAddress;
78
- }
79
- else {
80
- const addresses = (await kmd.listKeys(walletHandle)).addresses;
81
- if (addresses.length > 0) {
82
- if (predicateOrAddress && typeof predicateOrAddress === 'function') {
83
- for (let i = 0; i < addresses.length; i++) {
84
- const account = await this._clientManager.algod.accountInformation(addresses[i]).do();
85
- if (predicateOrAddress(account)) {
86
- matchedAddress = addresses[i];
87
- break;
88
- }
89
- }
90
- }
91
- else {
92
- matchedAddress = addresses[0];
93
- }
94
- }
95
- }
96
- if (!matchedAddress) {
97
- return undefined;
98
- }
99
- const accountKey = (await kmd.exportKey(walletHandle, '', matchedAddress)).private_key;
100
- const accountMnemonic = algosdk.secretKeyToMnemonic(accountKey);
101
- const account = algosdk.mnemonicToSecretKey(accountMnemonic);
102
- const signingAccount = new types_account.SigningAccount(account, sender);
103
- return {
104
- account: signingAccount,
105
- addr: signingAccount.addr,
106
- signer: signingAccount.signer,
107
- };
108
- }
109
- /**
110
- * 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.
111
- *
112
- * This is useful to get idempotent accounts from LocalNet without having to specify the private key (which will change when resetting the LocalNet).
113
- *
114
- * 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.
115
- *
116
- * If this is used via `mnemonicAccountFromEnvironment`, then you can even use the same code that runs on production without changes for local development!
117
- *
118
- * @param name The name of the wallet to retrieve / create
119
- * @param fundWith The number of Algo to fund the account with when it gets created, if not specified then 1000 ALGO will be funded from the dispenser account
120
- *
121
- * @example
122
- * ```typescript
123
- * // Idempotently get (if exists) or create (if it doesn't exist yet) an account by name using KMD
124
- * // if creating it then fund it with 2 ALGO from the default dispenser account
125
- * const newAccount = await kmdAccountManager.getOrCreateWalletAccount('account1', (2).algo())
126
- * // This will return the same account as above since the name matches
127
- * const existingAccount = await kmdAccountManager.getOrCreateWalletAccount('account1')
128
- * ```
129
- *
130
- * @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
131
- */
132
- async getOrCreateWalletAccount(name, fundWith) {
133
- // Get an existing account from the KMD wallet
134
- const existing = await this.getWalletAccount(name);
135
- if (existing) {
136
- return existing;
137
- }
138
- const kmd = await this.kmd();
139
- // None existed: create the KMD wallet instead
140
- const walletId = (await kmd.createWallet(name, '')).wallet.id;
141
- const walletHandle = (await kmd.initWalletHandle(walletId, '')).wallet_handle_token;
142
- await kmd.generateKey(walletHandle);
143
- // Get the account from the new KMD wallet
144
- const account = (await this.getWalletAccount(name));
145
- config.Config.logger.info(`LocalNet account '${name}' doesn't yet exist; created account ${account.addr} with keys stored in KMD and funding with ${fundWith?.algo ?? 1000} ALGO`);
146
- // Fund the account from the dispenser
147
- const dispenser = await this.getLocalNetDispenserAccount();
148
- await new types_composer.TransactionComposer({
149
- algod: this._clientManager.algod,
150
- getSigner: () => dispenser.signer,
151
- getSuggestedParams: () => this._clientManager.algod.getTransactionParams().do(),
152
- })
153
- .addPayment({
154
- amount: fundWith ?? types_amount.AlgoAmount.Algo(1000),
155
- receiver: account.addr,
156
- sender: dispenser.addr,
157
- })
158
- .send();
159
- return account;
160
- }
161
- /**
162
- * Returns an Algorand account with private key loaded for the default LocalNet dispenser account (that can be used to fund other accounts).
163
- * @example
164
- * ```typescript
165
- * const dispenser = await kmdAccountManager.getLocalNetDispenserAccount()
166
- * ```
167
- * @returns The default LocalNet dispenser account
168
- */
169
- async getLocalNetDispenserAccount() {
170
- if (!(await this._clientManager.isLocalNet())) {
171
- throw new Error("Can't get LocalNet dispenser account from non LocalNet network");
172
- }
173
- const genesisResponse = JSON.parse(await this._clientManager.algod.genesis().do());
174
- const dispenserAddresses = genesisResponse.alloc.filter((a) => a.comment === 'Wallet1').map((a) => a.addr);
175
- if (dispenserAddresses.length > 0) {
176
- const dispenser = await this.findWalletAccount('unencrypted-default-wallet', dispenserAddresses[0]);
177
- if (dispenser) {
178
- return dispenser;
179
- }
180
- }
181
- throw new Error("Error retrieving LocalNet dispenser account; couldn't find the default account in KMD");
182
- }
183
- }
184
-
12
+ * that makes it easier to get and manage accounts using KMD. */
13
+ var KmdAccountManager = class {
14
+ _clientManager;
15
+ _kmd;
16
+ /**
17
+ * Create a new KMD manager.
18
+ * @param clientManager A ClientManager client to use for algod and kmd clients
19
+ */
20
+ constructor(clientManager) {
21
+ this._clientManager = clientManager;
22
+ try {
23
+ this._kmd = clientManager.kmd;
24
+ } catch {
25
+ this._kmd = void 0;
26
+ }
27
+ }
28
+ async kmd() {
29
+ if (this._kmd === void 0) {
30
+ if (await this._clientManager.isLocalNet()) {
31
+ const { kmdConfig } = require_client_manager.ClientManager.getConfigFromEnvironmentOrLocalNet();
32
+ if (kmdConfig) {
33
+ this._kmd = require_client_manager.ClientManager.getKmdClient(kmdConfig);
34
+ return this._kmd;
35
+ }
36
+ }
37
+ this._kmd = null;
38
+ }
39
+ if (!this._kmd) throw new Error("Attempt to use Kmd client in AlgoKit instance with no Kmd configured");
40
+ return this._kmd;
41
+ }
42
+ /**
43
+ * Returns an Algorand signing account with private key loaded from the given KMD wallet (identified by name).
44
+ *
45
+ * @param walletName The name of the wallet to retrieve an account from
46
+ * @param predicate An optional filter to use to find the account (otherwise it will return a random account from the wallet)
47
+ * @param sender The optional sender address to use this signer for (aka a rekeyed account)
48
+ * @example Get default funded account in a LocalNet
49
+ *
50
+ * ```typescript
51
+ * const defaultDispenserAccount = await kmdAccountManager.getWalletAccount(
52
+ * 'unencrypted-default-wallet',
53
+ * a => a.status !== 'Offline' && a.amount > 1_000_000_000
54
+ * )
55
+ * ```
56
+ * @returns The signing account (with private key loaded) or undefined if no matching wallet or account was found
57
+ */
58
+ async getWalletAccount(walletName, predicate, sender) {
59
+ return this.findWalletAccount(walletName, predicate, sender);
60
+ }
61
+ async findWalletAccount(walletName, predicateOrAddress, sender) {
62
+ const kmd = await this.kmd();
63
+ const wallet = (await kmd.listWallets()).wallets.filter((w) => w.name === walletName);
64
+ if (wallet.length === 0) return;
65
+ const walletHandle = (await kmd.initWalletHandle(wallet[0].id, "")).wallet_handle_token;
66
+ let matchedAddress = void 0;
67
+ if (predicateOrAddress && typeof predicateOrAddress === "string") matchedAddress = predicateOrAddress;
68
+ else {
69
+ const addresses = (await kmd.listKeys(walletHandle)).addresses;
70
+ if (addresses.length > 0) if (predicateOrAddress && typeof predicateOrAddress === "function") {
71
+ for (let i = 0; i < addresses.length; i++) if (predicateOrAddress(await this._clientManager.algod.accountInformation(addresses[i]).do())) {
72
+ matchedAddress = addresses[i];
73
+ break;
74
+ }
75
+ } else matchedAddress = addresses[0];
76
+ }
77
+ if (!matchedAddress) return;
78
+ const accountKey = (await kmd.exportKey(walletHandle, "", matchedAddress)).private_key;
79
+ const accountMnemonic = algosdk.default.secretKeyToMnemonic(accountKey);
80
+ const signingAccount = new require_account.SigningAccount(algosdk.default.mnemonicToSecretKey(accountMnemonic), sender);
81
+ return {
82
+ account: signingAccount,
83
+ addr: signingAccount.addr,
84
+ signer: signingAccount.signer
85
+ };
86
+ }
87
+ /**
88
+ * 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.
89
+ *
90
+ * This is useful to get idempotent accounts from LocalNet without having to specify the private key (which will change when resetting the LocalNet).
91
+ *
92
+ * 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.
93
+ *
94
+ * If this is used via `mnemonicAccountFromEnvironment`, then you can even use the same code that runs on production without changes for local development!
95
+ *
96
+ * @param name The name of the wallet to retrieve / create
97
+ * @param fundWith The number of Algo to fund the account with when it gets created, if not specified then 1000 ALGO will be funded from the dispenser account
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * // Idempotently get (if exists) or create (if it doesn't exist yet) an account by name using KMD
102
+ * // if creating it then fund it with 2 ALGO from the default dispenser account
103
+ * const newAccount = await kmdAccountManager.getOrCreateWalletAccount('account1', (2).algo())
104
+ * // This will return the same account as above since the name matches
105
+ * const existingAccount = await kmdAccountManager.getOrCreateWalletAccount('account1')
106
+ * ```
107
+ *
108
+ * @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
109
+ */
110
+ async getOrCreateWalletAccount(name, fundWith) {
111
+ const existing = await this.getWalletAccount(name);
112
+ if (existing) return existing;
113
+ const kmd = await this.kmd();
114
+ const walletId = (await kmd.createWallet(name, "")).wallet.id;
115
+ const walletHandle = (await kmd.initWalletHandle(walletId, "")).wallet_handle_token;
116
+ await kmd.generateKey(walletHandle);
117
+ const account = await this.getWalletAccount(name);
118
+ require_config.Config.logger.info(`LocalNet account '${name}' doesn't yet exist; created account ${account.addr} with keys stored in KMD and funding with ${fundWith?.algo ?? 1e3} ALGO`);
119
+ const dispenser = await this.getLocalNetDispenserAccount();
120
+ await new require_composer.TransactionComposer({
121
+ algod: this._clientManager.algod,
122
+ getSigner: () => dispenser.signer,
123
+ getSuggestedParams: () => this._clientManager.algod.getTransactionParams().do()
124
+ }).addPayment({
125
+ amount: fundWith ?? require_amount.AlgoAmount.Algo(1e3),
126
+ receiver: account.addr,
127
+ sender: dispenser.addr
128
+ }).send();
129
+ return account;
130
+ }
131
+ /**
132
+ * Returns an Algorand account with private key loaded for the default LocalNet dispenser account (that can be used to fund other accounts).
133
+ * @example
134
+ * ```typescript
135
+ * const dispenser = await kmdAccountManager.getLocalNetDispenserAccount()
136
+ * ```
137
+ * @returns The default LocalNet dispenser account
138
+ */
139
+ async getLocalNetDispenserAccount() {
140
+ if (!await this._clientManager.isLocalNet()) throw new Error("Can't get LocalNet dispenser account from non LocalNet network");
141
+ const dispenserAddresses = JSON.parse(await this._clientManager.algod.genesis().do()).alloc.filter((a) => a.comment === "Wallet1").map((a) => a.addr);
142
+ if (dispenserAddresses.length > 0) {
143
+ const dispenser = await this.findWalletAccount("unencrypted-default-wallet", dispenserAddresses[0]);
144
+ if (dispenser) return dispenser;
145
+ }
146
+ throw new Error("Error retrieving LocalNet dispenser account; couldn't find the default account in KMD");
147
+ }
148
+ };
149
+ //#endregion
185
150
  exports.KmdAccountManager = KmdAccountManager;
186
- //# sourceMappingURL=kmd-account-manager.js.map
151
+
152
+ //# sourceMappingURL=kmd-account-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"kmd-account-manager.js","sources":["../../src/types/kmd-account-manager.ts"],"sourcesContent":["import algosdk, { Address } from 'algosdk'\nimport { Config } from '../config'\nimport { SigningAccount, TransactionSignerAccount } from './account'\nimport { AlgoAmount } from './amount'\nimport { ClientManager } from './client-manager'\nimport { TransactionComposer } from './composer'\n\n/** Provides abstractions over a [KMD](https://github.com/algorand/go-algorand/blob/master/daemon/kmd/README.md) instance\n * that makes it easier to get and manage accounts using KMD. */\nexport class KmdAccountManager {\n private _clientManager: Omit<ClientManager, 'kmd'>\n private _kmd?: algosdk.Kmd | null\n\n /**\n * Create a new KMD manager.\n * @param clientManager A ClientManager client to use for algod and kmd clients\n */\n constructor(clientManager: ClientManager) {\n this._clientManager = clientManager\n try {\n this._kmd = clientManager.kmd\n } catch {\n this._kmd = undefined\n }\n }\n\n async kmd(): Promise<algosdk.Kmd> {\n if (this._kmd === undefined) {\n if (await this._clientManager.isLocalNet()) {\n const { kmdConfig } = ClientManager.getConfigFromEnvironmentOrLocalNet()\n if (kmdConfig) {\n this._kmd = ClientManager.getKmdClient(kmdConfig)\n return this._kmd\n }\n }\n this._kmd = null\n }\n\n if (!this._kmd) {\n throw new Error('Attempt to use Kmd client in AlgoKit instance with no Kmd configured')\n }\n\n return this._kmd\n }\n\n /**\n * Returns an Algorand signing account with private key loaded from the given KMD wallet (identified by name).\n *\n * @param walletName The name of the wallet to retrieve an account from\n * @param predicate An optional filter to use to find the account (otherwise it will return a random account from the wallet)\n * @param sender The optional sender address to use this signer for (aka a rekeyed account)\n * @example Get default funded account in a LocalNet\n *\n * ```typescript\n * const defaultDispenserAccount = await kmdAccountManager.getWalletAccount(\n * 'unencrypted-default-wallet',\n * a => a.status !== 'Offline' && a.amount > 1_000_000_000\n * )\n * ```\n * @returns The signing account (with private key loaded) or undefined if no matching wallet or account was found\n */\n public async getWalletAccount(\n walletName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n predicate?: (account: Record<string, any>) => boolean,\n sender?: string | Address,\n ): Promise<(TransactionSignerAccount & { account: SigningAccount }) | undefined> {\n return this.findWalletAccount(walletName, predicate, sender)\n }\n\n private async findWalletAccount(\n walletName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n predicateOrAddress?: ((account: Record<string, any>) => boolean) | string,\n sender?: string | Address,\n ): Promise<(TransactionSignerAccount & { account: SigningAccount }) | undefined> {\n const kmd = await this.kmd()\n const walletsResponse = await kmd.listWallets()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wallet = walletsResponse.wallets.filter((w: any) => w.name === walletName)\n if (wallet.length === 0) {\n return undefined\n }\n const walletId = wallet[0].id\n const walletHandle = (await kmd.initWalletHandle(walletId, '')).wallet_handle_token\n\n let matchedAddress: string | undefined = undefined\n if (predicateOrAddress && typeof predicateOrAddress === 'string') {\n matchedAddress = predicateOrAddress\n } else {\n const addresses = (await kmd.listKeys(walletHandle)).addresses\n if (addresses.length > 0) {\n if (predicateOrAddress && typeof predicateOrAddress === 'function') {\n for (let i = 0; i < addresses.length; i++) {\n const account = await this._clientManager.algod.accountInformation(addresses[i]).do()\n if (predicateOrAddress(account)) {\n matchedAddress = addresses[i]\n break\n }\n }\n } else {\n matchedAddress = addresses[0]\n }\n }\n }\n\n if (!matchedAddress) {\n return undefined\n }\n\n const accountKey = (await kmd.exportKey(walletHandle, '', matchedAddress)).private_key\n const accountMnemonic = algosdk.secretKeyToMnemonic(accountKey)\n const account = algosdk.mnemonicToSecretKey(accountMnemonic)\n const signingAccount = new SigningAccount(account, sender)\n\n return {\n account: signingAccount,\n addr: signingAccount.addr,\n signer: signingAccount.signer,\n }\n }\n\n /**\n * 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.\n *\n * This is useful to get idempotent accounts from LocalNet without having to specify the private key (which will change when resetting the LocalNet).\n *\n * 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.\n *\n * If this is used via `mnemonicAccountFromEnvironment`, then you can even use the same code that runs on production without changes for local development!\n *\n * @param name The name of the wallet to retrieve / create\n * @param fundWith The number of Algo to fund the account with when it gets created, if not specified then 1000 ALGO will be funded from the dispenser account\n *\n * @example\n * ```typescript\n * // Idempotently get (if exists) or create (if it doesn't exist yet) an account by name using KMD\n * // if creating it then fund it with 2 ALGO from the default dispenser account\n * const newAccount = await kmdAccountManager.getOrCreateWalletAccount('account1', (2).algo())\n * // This will return the same account as above since the name matches\n * const existingAccount = await kmdAccountManager.getOrCreateWalletAccount('account1')\n * ```\n *\n * @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\n */\n public async getOrCreateWalletAccount(\n name: string,\n fundWith?: AlgoAmount,\n ): Promise<TransactionSignerAccount & { account: SigningAccount }> {\n // Get an existing account from the KMD wallet\n const existing = await this.getWalletAccount(name)\n if (existing) {\n return existing\n }\n\n const kmd = await this.kmd()\n\n // None existed: create the KMD wallet instead\n const walletId = (await kmd.createWallet(name, '')).wallet.id\n const walletHandle = (await kmd.initWalletHandle(walletId, '')).wallet_handle_token\n await kmd.generateKey(walletHandle)\n\n // Get the account from the new KMD wallet\n const account = (await this.getWalletAccount(name))!\n\n Config.logger.info(\n `LocalNet account '${name}' doesn't yet exist; created account ${account.addr} with keys stored in KMD and funding with ${\n fundWith?.algo ?? 1000\n } ALGO`,\n )\n\n // Fund the account from the dispenser\n const dispenser = await this.getLocalNetDispenserAccount()\n await new TransactionComposer({\n algod: this._clientManager.algod,\n getSigner: () => dispenser.signer,\n getSuggestedParams: () => this._clientManager.algod.getTransactionParams().do(),\n })\n .addPayment({\n amount: fundWith ?? AlgoAmount.Algo(1000),\n receiver: account.addr,\n sender: dispenser.addr,\n })\n .send()\n\n return account\n }\n\n /**\n * Returns an Algorand account with private key loaded for the default LocalNet dispenser account (that can be used to fund other accounts).\n * @example\n * ```typescript\n * const dispenser = await kmdAccountManager.getLocalNetDispenserAccount()\n * ```\n * @returns The default LocalNet dispenser account\n */\n public async getLocalNetDispenserAccount() {\n if (!(await this._clientManager.isLocalNet())) {\n throw new Error(\"Can't get LocalNet dispenser account from non LocalNet network\")\n }\n const genesisResponse = JSON.parse(await this._clientManager.algod.genesis().do()) as {\n alloc: Array<{ addr: string; comment: string }>\n }\n const dispenserAddresses = genesisResponse.alloc.filter((a) => a.comment === 'Wallet1').map((a) => a.addr)\n if (dispenserAddresses.length > 0) {\n const dispenser = await this.findWalletAccount('unencrypted-default-wallet', dispenserAddresses[0])\n if (dispenser) {\n return dispenser\n }\n }\n\n throw new Error(\"Error retrieving LocalNet dispenser account; couldn't find the default account in KMD\")\n }\n}\n"],"names":["ClientManager","SigningAccount","Config","TransactionComposer","AlgoAmount"],"mappings":"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"}
1
+ {"version":3,"file":"kmd-account-manager.js","names":["ClientManager","SigningAccount","TransactionComposer","AlgoAmount"],"sources":["../../src/types/kmd-account-manager.ts"],"sourcesContent":["import algosdk, { Address } from 'algosdk'\nimport { Config } from '../config'\nimport { SigningAccount, TransactionSignerAccount } from './account'\nimport { AlgoAmount } from './amount'\nimport { ClientManager } from './client-manager'\nimport { TransactionComposer } from './composer'\n\n/** Provides abstractions over a [KMD](https://github.com/algorand/go-algorand/blob/master/daemon/kmd/README.md) instance\n * that makes it easier to get and manage accounts using KMD. */\nexport class KmdAccountManager {\n private _clientManager: Omit<ClientManager, 'kmd'>\n private _kmd?: algosdk.Kmd | null\n\n /**\n * Create a new KMD manager.\n * @param clientManager A ClientManager client to use for algod and kmd clients\n */\n constructor(clientManager: ClientManager) {\n this._clientManager = clientManager\n try {\n this._kmd = clientManager.kmd\n } catch {\n this._kmd = undefined\n }\n }\n\n async kmd(): Promise<algosdk.Kmd> {\n if (this._kmd === undefined) {\n if (await this._clientManager.isLocalNet()) {\n const { kmdConfig } = ClientManager.getConfigFromEnvironmentOrLocalNet()\n if (kmdConfig) {\n this._kmd = ClientManager.getKmdClient(kmdConfig)\n return this._kmd\n }\n }\n this._kmd = null\n }\n\n if (!this._kmd) {\n throw new Error('Attempt to use Kmd client in AlgoKit instance with no Kmd configured')\n }\n\n return this._kmd\n }\n\n /**\n * Returns an Algorand signing account with private key loaded from the given KMD wallet (identified by name).\n *\n * @param walletName The name of the wallet to retrieve an account from\n * @param predicate An optional filter to use to find the account (otherwise it will return a random account from the wallet)\n * @param sender The optional sender address to use this signer for (aka a rekeyed account)\n * @example Get default funded account in a LocalNet\n *\n * ```typescript\n * const defaultDispenserAccount = await kmdAccountManager.getWalletAccount(\n * 'unencrypted-default-wallet',\n * a => a.status !== 'Offline' && a.amount > 1_000_000_000\n * )\n * ```\n * @returns The signing account (with private key loaded) or undefined if no matching wallet or account was found\n */\n public async getWalletAccount(\n walletName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n predicate?: (account: Record<string, any>) => boolean,\n sender?: string | Address,\n ): Promise<(TransactionSignerAccount & { account: SigningAccount }) | undefined> {\n return this.findWalletAccount(walletName, predicate, sender)\n }\n\n private async findWalletAccount(\n walletName: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n predicateOrAddress?: ((account: Record<string, any>) => boolean) | string,\n sender?: string | Address,\n ): Promise<(TransactionSignerAccount & { account: SigningAccount }) | undefined> {\n const kmd = await this.kmd()\n const walletsResponse = await kmd.listWallets()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wallet = walletsResponse.wallets.filter((w: any) => w.name === walletName)\n if (wallet.length === 0) {\n return undefined\n }\n const walletId = wallet[0].id\n const walletHandle = (await kmd.initWalletHandle(walletId, '')).wallet_handle_token\n\n let matchedAddress: string | undefined = undefined\n if (predicateOrAddress && typeof predicateOrAddress === 'string') {\n matchedAddress = predicateOrAddress\n } else {\n const addresses = (await kmd.listKeys(walletHandle)).addresses\n if (addresses.length > 0) {\n if (predicateOrAddress && typeof predicateOrAddress === 'function') {\n for (let i = 0; i < addresses.length; i++) {\n const account = await this._clientManager.algod.accountInformation(addresses[i]).do()\n if (predicateOrAddress(account)) {\n matchedAddress = addresses[i]\n break\n }\n }\n } else {\n matchedAddress = addresses[0]\n }\n }\n }\n\n if (!matchedAddress) {\n return undefined\n }\n\n const accountKey = (await kmd.exportKey(walletHandle, '', matchedAddress)).private_key\n const accountMnemonic = algosdk.secretKeyToMnemonic(accountKey)\n const account = algosdk.mnemonicToSecretKey(accountMnemonic)\n const signingAccount = new SigningAccount(account, sender)\n\n return {\n account: signingAccount,\n addr: signingAccount.addr,\n signer: signingAccount.signer,\n }\n }\n\n /**\n * 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.\n *\n * This is useful to get idempotent accounts from LocalNet without having to specify the private key (which will change when resetting the LocalNet).\n *\n * 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.\n *\n * If this is used via `mnemonicAccountFromEnvironment`, then you can even use the same code that runs on production without changes for local development!\n *\n * @param name The name of the wallet to retrieve / create\n * @param fundWith The number of Algo to fund the account with when it gets created, if not specified then 1000 ALGO will be funded from the dispenser account\n *\n * @example\n * ```typescript\n * // Idempotently get (if exists) or create (if it doesn't exist yet) an account by name using KMD\n * // if creating it then fund it with 2 ALGO from the default dispenser account\n * const newAccount = await kmdAccountManager.getOrCreateWalletAccount('account1', (2).algo())\n * // This will return the same account as above since the name matches\n * const existingAccount = await kmdAccountManager.getOrCreateWalletAccount('account1')\n * ```\n *\n * @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\n */\n public async getOrCreateWalletAccount(\n name: string,\n fundWith?: AlgoAmount,\n ): Promise<TransactionSignerAccount & { account: SigningAccount }> {\n // Get an existing account from the KMD wallet\n const existing = await this.getWalletAccount(name)\n if (existing) {\n return existing\n }\n\n const kmd = await this.kmd()\n\n // None existed: create the KMD wallet instead\n const walletId = (await kmd.createWallet(name, '')).wallet.id\n const walletHandle = (await kmd.initWalletHandle(walletId, '')).wallet_handle_token\n await kmd.generateKey(walletHandle)\n\n // Get the account from the new KMD wallet\n const account = (await this.getWalletAccount(name))!\n\n Config.logger.info(\n `LocalNet account '${name}' doesn't yet exist; created account ${account.addr} with keys stored in KMD and funding with ${\n fundWith?.algo ?? 1000\n } ALGO`,\n )\n\n // Fund the account from the dispenser\n const dispenser = await this.getLocalNetDispenserAccount()\n await new TransactionComposer({\n algod: this._clientManager.algod,\n getSigner: () => dispenser.signer,\n getSuggestedParams: () => this._clientManager.algod.getTransactionParams().do(),\n })\n .addPayment({\n amount: fundWith ?? AlgoAmount.Algo(1000),\n receiver: account.addr,\n sender: dispenser.addr,\n })\n .send()\n\n return account\n }\n\n /**\n * Returns an Algorand account with private key loaded for the default LocalNet dispenser account (that can be used to fund other accounts).\n * @example\n * ```typescript\n * const dispenser = await kmdAccountManager.getLocalNetDispenserAccount()\n * ```\n * @returns The default LocalNet dispenser account\n */\n public async getLocalNetDispenserAccount() {\n if (!(await this._clientManager.isLocalNet())) {\n throw new Error(\"Can't get LocalNet dispenser account from non LocalNet network\")\n }\n const genesisResponse = JSON.parse(await this._clientManager.algod.genesis().do()) as {\n alloc: Array<{ addr: string; comment: string }>\n }\n const dispenserAddresses = genesisResponse.alloc.filter((a) => a.comment === 'Wallet1').map((a) => a.addr)\n if (dispenserAddresses.length > 0) {\n const dispenser = await this.findWalletAccount('unencrypted-default-wallet', dispenserAddresses[0])\n if (dispenser) {\n return dispenser\n }\n }\n\n throw new Error(\"Error retrieving LocalNet dispenser account; couldn't find the default account in KMD\")\n }\n}\n"],"mappings":"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"}