@algorandfoundation/algokit-utils 2.3.3-beta.3 → 2.3.3-beta.5

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/cjs/account.d.ts.map +1 -0
  2. package/cjs/account.js.map +1 -0
  3. package/cjs/amount.d.ts.map +1 -0
  4. package/cjs/amount.js.map +1 -0
  5. package/cjs/app-client.d.ts.map +1 -0
  6. package/cjs/app-client.js.map +1 -0
  7. package/cjs/app-deploy.d.ts.map +1 -0
  8. package/cjs/app-deploy.js.map +1 -0
  9. package/cjs/app.d.ts.map +1 -0
  10. package/cjs/app.js.map +1 -0
  11. package/cjs/index.d.ts.map +1 -0
  12. package/cjs/index.js.map +1 -0
  13. package/cjs/indexer-lookup.d.ts.map +1 -0
  14. package/cjs/indexer-lookup.js.map +1 -0
  15. package/cjs/localnet.d.ts.map +1 -0
  16. package/{localnet.js → cjs/localnet.js} +1 -1
  17. package/cjs/localnet.js.map +1 -0
  18. package/cjs/network-client.d.ts.map +1 -0
  19. package/cjs/network-client.js.map +1 -0
  20. package/cjs/testing/account.d.ts.map +1 -0
  21. package/cjs/testing/account.js.map +1 -0
  22. package/cjs/testing/fixtures/algokit-log-capture-fixture.d.ts.map +1 -0
  23. package/cjs/testing/fixtures/algokit-log-capture-fixture.js.map +1 -0
  24. package/cjs/testing/fixtures/algorand-fixture.d.ts.map +1 -0
  25. package/cjs/testing/fixtures/algorand-fixture.js.map +1 -0
  26. package/cjs/testing/fixtures/index.d.ts.map +1 -0
  27. package/cjs/testing/fixtures/index.js.map +1 -0
  28. package/cjs/testing/index.d.ts.map +1 -0
  29. package/cjs/testing/index.js.map +1 -0
  30. package/cjs/testing/indexer.d.ts.map +1 -0
  31. package/cjs/testing/indexer.js.map +1 -0
  32. package/cjs/testing/test-logger.d.ts.map +1 -0
  33. package/{testing → cjs/testing}/test-logger.js +2 -0
  34. package/cjs/testing/test-logger.js.map +1 -0
  35. package/cjs/testing/transaction-logger.d.ts.map +1 -0
  36. package/{testing → cjs/testing}/transaction-logger.js +2 -3
  37. package/cjs/testing/transaction-logger.js.map +1 -0
  38. package/cjs/transaction.d.ts.map +1 -0
  39. package/cjs/transaction.js.map +1 -0
  40. package/cjs/transfer.d.ts.map +1 -0
  41. package/cjs/transfer.js.map +1 -0
  42. package/cjs/types/account.d.ts +66 -0
  43. package/cjs/types/account.d.ts.map +1 -0
  44. package/{types → cjs/types}/account.js +7 -0
  45. package/cjs/types/account.js.map +1 -0
  46. package/cjs/types/algo-http-client-with-retry.d.ts.map +1 -0
  47. package/{types → cjs/types}/algo-http-client-with-retry.js +16 -16
  48. package/cjs/types/algo-http-client-with-retry.js.map +1 -0
  49. package/cjs/types/amount.d.ts +24 -0
  50. package/cjs/types/amount.d.ts.map +1 -0
  51. package/{types → cjs/types}/amount.js +1 -0
  52. package/cjs/types/amount.js.map +1 -0
  53. package/cjs/types/app-client.d.ts +408 -0
  54. package/cjs/types/app-client.d.ts.map +1 -0
  55. package/{types → cjs/types}/app-client.js +13 -0
  56. package/cjs/types/app-client.js.map +1 -0
  57. package/cjs/types/app-spec.d.ts.map +1 -0
  58. package/{types → cjs/types}/app-spec.js.map +1 -1
  59. package/cjs/types/app.d.ts +308 -0
  60. package/cjs/types/app.d.ts.map +1 -0
  61. package/cjs/types/app.js.map +1 -0
  62. package/cjs/types/config.d.ts.map +1 -0
  63. package/{types → cjs/types}/config.js +1 -0
  64. package/cjs/types/config.js.map +1 -0
  65. package/cjs/types/indexer.d.ts.map +1 -0
  66. package/cjs/types/indexer.js.map +1 -0
  67. package/cjs/types/logging.d.ts.map +1 -0
  68. package/cjs/types/logging.js.map +1 -0
  69. package/cjs/types/logic-error.d.ts.map +1 -0
  70. package/{types → cjs/types}/logic-error.js +5 -2
  71. package/cjs/types/logic-error.js.map +1 -0
  72. package/cjs/types/network-client.d.ts +20 -0
  73. package/cjs/types/network-client.d.ts.map +1 -0
  74. package/cjs/types/network-client.js.map +1 -0
  75. package/cjs/types/testing.d.ts.map +1 -0
  76. package/{types → cjs/types}/testing.js.map +1 -1
  77. package/cjs/types/transaction.d.ts +111 -0
  78. package/cjs/types/transaction.d.ts.map +1 -0
  79. package/{types → cjs/types}/transaction.js.map +1 -1
  80. package/cjs/types/transfer.d.ts +32 -0
  81. package/cjs/types/transfer.d.ts.map +1 -0
  82. package/{types → cjs/types}/transfer.js.map +1 -1
  83. package/cjs/types/urlTokenBaseHTTPClient.d.ts.map +1 -0
  84. package/{types → cjs/types}/urlTokenBaseHTTPClient.js +4 -0
  85. package/cjs/types/urlTokenBaseHTTPClient.js.map +1 -0
  86. package/cjs/util.d.ts.map +1 -0
  87. package/cjs/util.js.map +1 -0
  88. package/esm/account.js +170 -0
  89. package/esm/account.js.map +1 -0
  90. package/esm/amount.js +27 -0
  91. package/esm/amount.js.map +1 -0
  92. package/esm/app-client.js +76 -0
  93. package/esm/app-client.js.map +1 -0
  94. package/esm/app-deploy.js +446 -0
  95. package/esm/app-deploy.js.map +1 -0
  96. package/esm/app.js +572 -0
  97. package/esm/app.js.map +1 -0
  98. package/esm/index.js +14 -0
  99. package/esm/index.js.map +1 -0
  100. package/esm/indexer-lookup.js +98 -0
  101. package/esm/indexer-lookup.js.map +1 -0
  102. package/esm/localnet.js +111 -0
  103. package/esm/localnet.js.map +1 -0
  104. package/esm/network-client.js +179 -0
  105. package/esm/network-client.js.map +1 -0
  106. package/esm/testing/account.js +24 -0
  107. package/esm/testing/account.js.map +1 -0
  108. package/esm/testing/fixtures/algokit-log-capture-fixture.js +39 -0
  109. package/esm/testing/fixtures/algokit-log-capture-fixture.js.map +1 -0
  110. package/esm/testing/fixtures/algorand-fixture.js +53 -0
  111. package/esm/testing/fixtures/algorand-fixture.js.map +1 -0
  112. package/esm/testing/fixtures/index.js +3 -0
  113. package/esm/testing/fixtures/index.js.map +1 -0
  114. package/esm/testing/index.js +6 -0
  115. package/esm/testing/index.js.map +1 -0
  116. package/esm/testing/indexer.js +36 -0
  117. package/esm/testing/indexer.js.map +1 -0
  118. package/esm/testing/test-logger.js +69 -0
  119. package/esm/testing/test-logger.js.map +1 -0
  120. package/esm/testing/transaction-logger.js +66 -0
  121. package/esm/testing/transaction-logger.js.map +1 -0
  122. package/esm/transaction.js +365 -0
  123. package/esm/transaction.js.map +1 -0
  124. package/esm/transfer.js +59 -0
  125. package/esm/transfer.js.map +1 -0
  126. package/esm/types/account.js +90 -0
  127. package/esm/types/account.js.map +1 -0
  128. package/esm/types/algo-http-client-with-retry.js +58 -0
  129. package/esm/types/algo-http-client-with-retry.js.map +1 -0
  130. package/esm/types/amount.js +35 -0
  131. package/esm/types/amount.js.map +1 -0
  132. package/esm/types/app-client.js +624 -0
  133. package/esm/types/app-client.js.map +1 -0
  134. package/esm/types/app-spec.js +2 -0
  135. package/esm/types/app-spec.js.map +1 -0
  136. package/esm/types/app.js +33 -0
  137. package/esm/types/app.js.map +1 -0
  138. package/esm/types/config.js +50 -0
  139. package/esm/types/config.js.map +1 -0
  140. package/esm/types/indexer.js +31 -0
  141. package/esm/types/indexer.js.map +1 -0
  142. package/esm/types/logging.js +24 -0
  143. package/esm/types/logging.js.map +1 -0
  144. package/esm/types/logic-error.js +49 -0
  145. package/esm/types/logic-error.js.map +1 -0
  146. package/esm/types/network-client.js +2 -0
  147. package/esm/types/network-client.js.map +1 -0
  148. package/esm/types/testing.js +2 -0
  149. package/esm/types/testing.js.map +1 -0
  150. package/esm/types/transaction.js +2 -0
  151. package/esm/types/transaction.js.map +1 -0
  152. package/esm/types/transfer.js +2 -0
  153. package/esm/types/transfer.js.map +1 -0
  154. package/esm/types/urlTokenBaseHTTPClient.js +151 -0
  155. package/esm/types/urlTokenBaseHTTPClient.js.map +1 -0
  156. package/esm/util.js +20 -0
  157. package/esm/util.js.map +1 -0
  158. package/package.json +42 -6
  159. package/types/account.d.ts +125 -63
  160. package/types/account.d.ts.map +1 -1
  161. package/types/amount.d.ts +18 -22
  162. package/types/amount.d.ts.map +1 -1
  163. package/types/app-client.d.ts +70 -407
  164. package/types/app-client.d.ts.map +1 -1
  165. package/types/app-deploy.d.ts +101 -0
  166. package/types/app-deploy.d.ts.map +1 -0
  167. package/types/app.d.ts +145 -290
  168. package/types/app.d.ts.map +1 -1
  169. package/types/index.d.ts +14 -0
  170. package/types/index.d.ts.map +1 -0
  171. package/types/indexer-lookup.d.ts +38 -0
  172. package/types/indexer-lookup.d.ts.map +1 -0
  173. package/types/localnet.d.ts +54 -0
  174. package/types/localnet.d.ts.map +1 -0
  175. package/types/network-client.d.ts +96 -19
  176. package/types/network-client.d.ts.map +1 -1
  177. package/types/testing/account.d.ts +14 -0
  178. package/types/testing/account.d.ts.map +1 -0
  179. package/types/testing/fixtures/algokit-log-capture-fixture.d.ts +19 -0
  180. package/types/testing/fixtures/algokit-log-capture-fixture.d.ts.map +1 -0
  181. package/types/testing/fixtures/algorand-fixture.d.ts +48 -0
  182. package/types/testing/fixtures/algorand-fixture.d.ts.map +1 -0
  183. package/types/testing/fixtures/index.d.ts +3 -0
  184. package/types/testing/fixtures/index.d.ts.map +1 -0
  185. package/types/testing/index.d.ts +6 -0
  186. package/types/testing/index.d.ts.map +1 -0
  187. package/types/testing/indexer.d.ts +12 -0
  188. package/types/testing/indexer.d.ts.map +1 -0
  189. package/types/testing/test-logger.d.ts +41 -0
  190. package/types/testing/test-logger.d.ts.map +1 -0
  191. package/types/testing/transaction-logger.d.ts +29 -0
  192. package/types/testing/transaction-logger.d.ts.map +1 -0
  193. package/types/transaction.d.ts +133 -106
  194. package/types/transaction.d.ts.map +1 -1
  195. package/types/transfer.d.ts +21 -31
  196. package/types/transfer.d.ts.map +1 -1
  197. package/types/types/account.d.ts +66 -0
  198. package/types/types/account.d.ts.map +1 -0
  199. package/types/types/algo-http-client-with-retry.d.ts +14 -0
  200. package/types/types/algo-http-client-with-retry.d.ts.map +1 -0
  201. package/types/types/amount.d.ts +24 -0
  202. package/types/types/amount.d.ts.map +1 -0
  203. package/types/types/app-client.d.ts +408 -0
  204. package/types/types/app-client.d.ts.map +1 -0
  205. package/types/types/app-spec.d.ts +154 -0
  206. package/types/types/app-spec.d.ts.map +1 -0
  207. package/types/types/app.d.ts +308 -0
  208. package/types/types/app.d.ts.map +1 -0
  209. package/types/types/config.d.ts +32 -0
  210. package/types/types/config.d.ts.map +1 -0
  211. package/types/types/indexer.d.ts +623 -0
  212. package/types/types/indexer.d.ts.map +1 -0
  213. package/types/types/logging.d.ts +13 -0
  214. package/types/types/logging.d.ts.map +1 -0
  215. package/types/types/logic-error.d.ts +37 -0
  216. package/types/types/logic-error.d.ts.map +1 -0
  217. package/types/types/network-client.d.ts +20 -0
  218. package/types/types/network-client.d.ts.map +1 -0
  219. package/types/types/testing.d.ts +89 -0
  220. package/types/types/testing.d.ts.map +1 -0
  221. package/types/types/transaction.d.ts +111 -0
  222. package/types/types/transaction.d.ts.map +1 -0
  223. package/types/types/transfer.d.ts +32 -0
  224. package/types/types/transfer.d.ts.map +1 -0
  225. package/types/types/urlTokenBaseHTTPClient.d.ts +41 -0
  226. package/types/types/urlTokenBaseHTTPClient.d.ts.map +1 -0
  227. package/types/util.d.ts +10 -0
  228. package/types/util.d.ts.map +1 -0
  229. package/account.d.ts.map +0 -1
  230. package/account.js.map +0 -1
  231. package/amount.d.ts.map +0 -1
  232. package/amount.js.map +0 -1
  233. package/app-client.d.ts.map +0 -1
  234. package/app-client.js.map +0 -1
  235. package/app-deploy.d.ts.map +0 -1
  236. package/app-deploy.js.map +0 -1
  237. package/app.d.ts.map +0 -1
  238. package/app.js.map +0 -1
  239. package/index.d.ts.map +0 -1
  240. package/index.js.map +0 -1
  241. package/indexer-lookup.d.ts.map +0 -1
  242. package/indexer-lookup.js.map +0 -1
  243. package/localnet.d.ts.map +0 -1
  244. package/localnet.js.map +0 -1
  245. package/network-client.d.ts.map +0 -1
  246. package/network-client.js.map +0 -1
  247. package/testing/account.d.ts.map +0 -1
  248. package/testing/account.js.map +0 -1
  249. package/testing/fixtures/algokit-log-capture-fixture.d.ts.map +0 -1
  250. package/testing/fixtures/algokit-log-capture-fixture.js.map +0 -1
  251. package/testing/fixtures/algorand-fixture.d.ts.map +0 -1
  252. package/testing/fixtures/algorand-fixture.js.map +0 -1
  253. package/testing/fixtures/index.d.ts.map +0 -1
  254. package/testing/fixtures/index.js.map +0 -1
  255. package/testing/index.d.ts.map +0 -1
  256. package/testing/index.js.map +0 -1
  257. package/testing/indexer.d.ts.map +0 -1
  258. package/testing/indexer.js.map +0 -1
  259. package/testing/test-logger.d.ts.map +0 -1
  260. package/testing/test-logger.js.map +0 -1
  261. package/testing/transaction-logger.d.ts.map +0 -1
  262. package/testing/transaction-logger.js.map +0 -1
  263. package/transaction.d.ts.map +0 -1
  264. package/transaction.js.map +0 -1
  265. package/transfer.d.ts.map +0 -1
  266. package/transfer.js.map +0 -1
  267. package/types/account.js.map +0 -1
  268. package/types/algo-http-client-with-retry.d.ts.map +0 -1
  269. package/types/algo-http-client-with-retry.js.map +0 -1
  270. package/types/amount.js.map +0 -1
  271. package/types/app-client.js.map +0 -1
  272. package/types/app-spec.d.ts.map +0 -1
  273. package/types/app.js.map +0 -1
  274. package/types/config.d.ts.map +0 -1
  275. package/types/config.js.map +0 -1
  276. package/types/indexer.d.ts.map +0 -1
  277. package/types/indexer.js.map +0 -1
  278. package/types/logging.d.ts.map +0 -1
  279. package/types/logging.js.map +0 -1
  280. package/types/logic-error.d.ts.map +0 -1
  281. package/types/logic-error.js.map +0 -1
  282. package/types/network-client.js.map +0 -1
  283. package/types/testing.d.ts.map +0 -1
  284. package/types/urlTokenBaseHTTPClient.d.ts.map +0 -1
  285. package/types/urlTokenBaseHTTPClient.js.map +0 -1
  286. package/util.d.ts.map +0 -1
  287. package/util.js.map +0 -1
  288. /package/{account.d.ts → cjs/account.d.ts} +0 -0
  289. /package/{account.js → cjs/account.js} +0 -0
  290. /package/{amount.d.ts → cjs/amount.d.ts} +0 -0
  291. /package/{amount.js → cjs/amount.js} +0 -0
  292. /package/{app-client.d.ts → cjs/app-client.d.ts} +0 -0
  293. /package/{app-client.js → cjs/app-client.js} +0 -0
  294. /package/{app-deploy.d.ts → cjs/app-deploy.d.ts} +0 -0
  295. /package/{app-deploy.js → cjs/app-deploy.js} +0 -0
  296. /package/{app.d.ts → cjs/app.d.ts} +0 -0
  297. /package/{app.js → cjs/app.js} +0 -0
  298. /package/{index.d.ts → cjs/index.d.ts} +0 -0
  299. /package/{index.js → cjs/index.js} +0 -0
  300. /package/{indexer-lookup.d.ts → cjs/indexer-lookup.d.ts} +0 -0
  301. /package/{indexer-lookup.js → cjs/indexer-lookup.js} +0 -0
  302. /package/{localnet.d.ts → cjs/localnet.d.ts} +0 -0
  303. /package/{network-client.d.ts → cjs/network-client.d.ts} +0 -0
  304. /package/{network-client.js → cjs/network-client.js} +0 -0
  305. /package/{testing → cjs/testing}/account.d.ts +0 -0
  306. /package/{testing → cjs/testing}/account.js +0 -0
  307. /package/{testing → cjs/testing}/fixtures/algokit-log-capture-fixture.d.ts +0 -0
  308. /package/{testing → cjs/testing}/fixtures/algokit-log-capture-fixture.js +0 -0
  309. /package/{testing → cjs/testing}/fixtures/algorand-fixture.d.ts +0 -0
  310. /package/{testing → cjs/testing}/fixtures/algorand-fixture.js +0 -0
  311. /package/{testing → cjs/testing}/fixtures/index.d.ts +0 -0
  312. /package/{testing → cjs/testing}/fixtures/index.js +0 -0
  313. /package/{testing → cjs/testing}/index.d.ts +0 -0
  314. /package/{testing → cjs/testing}/index.js +0 -0
  315. /package/{testing → cjs/testing}/indexer.d.ts +0 -0
  316. /package/{testing → cjs/testing}/indexer.js +0 -0
  317. /package/{testing → cjs/testing}/test-logger.d.ts +0 -0
  318. /package/{testing → cjs/testing}/transaction-logger.d.ts +0 -0
  319. /package/{transaction.d.ts → cjs/transaction.d.ts} +0 -0
  320. /package/{transaction.js → cjs/transaction.js} +0 -0
  321. /package/{transfer.d.ts → cjs/transfer.d.ts} +0 -0
  322. /package/{transfer.js → cjs/transfer.js} +0 -0
  323. /package/{types → cjs/types}/algo-http-client-with-retry.d.ts +0 -0
  324. /package/{types → cjs/types}/app-spec.d.ts +0 -0
  325. /package/{types → cjs/types}/app-spec.js +0 -0
  326. /package/{types → cjs/types}/app.js +0 -0
  327. /package/{types → cjs/types}/config.d.ts +0 -0
  328. /package/{types → cjs/types}/indexer.d.ts +0 -0
  329. /package/{types → cjs/types}/indexer.js +0 -0
  330. /package/{types → cjs/types}/logging.d.ts +0 -0
  331. /package/{types → cjs/types}/logging.js +0 -0
  332. /package/{types → cjs/types}/logic-error.d.ts +0 -0
  333. /package/{types → cjs/types}/network-client.js +0 -0
  334. /package/{types → cjs/types}/testing.d.ts +0 -0
  335. /package/{types → cjs/types}/testing.js +0 -0
  336. /package/{types → cjs/types}/transaction.js +0 -0
  337. /package/{types → cjs/types}/transfer.js +0 -0
  338. /package/{types → cjs/types}/urlTokenBaseHTTPClient.d.ts +0 -0
  339. /package/{util.d.ts → cjs/util.d.ts} +0 -0
  340. /package/{util.js → cjs/util.js} +0 -0
@@ -0,0 +1,98 @@
1
+ const DEFAULT_INDEXER_MAX_API_RESOURCES_PER_ACCOUNT = 1000; //MaxAPIResourcesPerAccount: This is the default maximum, though may be provider specific
2
+ /**
3
+ * Looks up a transaction by ID using Indexer.
4
+ * @param transactionId The ID of the transaction to look up
5
+ * @param indexer An indexer client
6
+ * @returns The result of the look-up
7
+ */
8
+ export async function lookupTransactionById(transactionId, indexer) {
9
+ return (await indexer.lookupTransactionByID(transactionId).do());
10
+ }
11
+ /**
12
+ * Looks up an account by address using Indexer.
13
+ * @param transactionId The address of the account to look up
14
+ * @param indexer An indexer client
15
+ * @returns The result of the look-up
16
+ */
17
+ export async function lookupAccountByAddress(accountAddress, indexer) {
18
+ return (await indexer.lookupAccountByID(accountAddress).do());
19
+ }
20
+ /**
21
+ * Looks up applications that were created by the given address.
22
+ * @param indexer An indexer instance
23
+ * @param address The address of the creator to look up
24
+ * @param getAll Whether or not to include deleted applications
25
+ * @param paginationLimit The number of records to return per paginated request, default 1000
26
+ * @returns The list of application results
27
+ */
28
+ export async function lookupAccountCreatedApplicationByAddress(indexer, address, getAll = undefined, paginationLimit) {
29
+ return await executePaginatedRequest((response) => {
30
+ if ('message' in response) {
31
+ throw { status: 404, ...response };
32
+ }
33
+ return response.applications;
34
+ }, (nextToken) => {
35
+ let s = indexer
36
+ .lookupAccountCreatedApplications(address)
37
+ .includeAll(getAll)
38
+ .limit(paginationLimit ?? DEFAULT_INDEXER_MAX_API_RESOURCES_PER_ACCOUNT);
39
+ if (nextToken) {
40
+ s = s.nextToken(nextToken);
41
+ }
42
+ return s;
43
+ });
44
+ }
45
+ /**
46
+ * Allows transactions to be searched for the given criteria.
47
+ * @param indexer An indexer client
48
+ * @param searchCriteria The criteria to search for
49
+ * @param paginationLimit The number of records to return per paginated request, default 1000
50
+ * @returns The search results
51
+ */
52
+ export async function searchTransactions(indexer, searchCriteria, paginationLimit) {
53
+ let currentRound = 0;
54
+ const transactions = await executePaginatedRequest((response) => {
55
+ if ('message' in response) {
56
+ throw { status: 404, ...response };
57
+ }
58
+ if (response['current-round'] > currentRound) {
59
+ currentRound = response['current-round'];
60
+ }
61
+ return response.transactions;
62
+ }, (nextToken) => {
63
+ let s = searchCriteria(indexer.searchForTransactions()).limit(paginationLimit ?? DEFAULT_INDEXER_MAX_API_RESOURCES_PER_ACCOUNT);
64
+ if (nextToken) {
65
+ s = s.nextToken(nextToken);
66
+ }
67
+ return s;
68
+ });
69
+ return {
70
+ 'current-round': currentRound,
71
+ 'next-token': '',
72
+ transactions: transactions,
73
+ };
74
+ }
75
+ // https://developer.algorand.org/docs/get-details/indexer/#paginated-results
76
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
+ export async function executePaginatedRequest(
78
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
+ extractItems, buildRequest) {
80
+ const results = [];
81
+ let nextToken = undefined;
82
+ // eslint-disable-next-line no-constant-condition
83
+ while (true) {
84
+ const request = buildRequest(nextToken);
85
+ const response = await request.do();
86
+ const items = extractItems(response);
87
+ if (items == null || items.length === 0) {
88
+ break;
89
+ }
90
+ results.push(...items);
91
+ nextToken = response['next-token'];
92
+ if (!nextToken) {
93
+ break;
94
+ }
95
+ }
96
+ return results;
97
+ }
98
+ //# sourceMappingURL=indexer-lookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer-lookup.js","sourceRoot":"","sources":["../../src/indexer-lookup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import algosdk from 'algosdk';
2
+ import { Config } from './';
3
+ import { getDispenserAccount, mnemonicAccount } from './account';
4
+ import { getAlgoKmdClient } from './network-client';
5
+ import { transferAlgos } from './transfer';
6
+ import { AlgoAmount } from './types/amount';
7
+ /** Returns true if the algod client is pointing to a LocalNet Algorand network */
8
+ export async function isLocalNet(algod) {
9
+ const params = await algod.getTransactionParams().do();
10
+ return params.genesisID === 'devnet-v1' || params.genesisID === 'sandnet-v1' || params.genesisID === 'dockernet-v1';
11
+ }
12
+ /**
13
+ * 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.
14
+ *
15
+ * This is useful to get idempotent accounts from LocalNet without having to specify the private key (which will change when resetting the LocalNet).
16
+ *
17
+ * 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.
18
+ *
19
+ * If this is used via `getAccount`, then you can even use the same code that runs on production without changes for local development!
20
+ *
21
+ * @param walletAccount The wallet details with:
22
+ * * `name`: The name of the wallet to retrieve / create
23
+ * * `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
24
+ * @param algod An algod client
25
+ * @param kmdClient A KMD client, if not specified then a default KMD client will be loaded from environment variables
26
+ *
27
+ * @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
28
+ */
29
+ export async function getOrCreateKmdWalletAccount(walletAccount, algod, kmdClient) {
30
+ const kmd = kmdClient ?? getAlgoKmdClient();
31
+ // Get an existing account from the KMD wallet
32
+ const existing = await getKmdWalletAccount(walletAccount, algod, kmd);
33
+ if (existing) {
34
+ return existing;
35
+ }
36
+ // None existed: create the KMD wallet instead
37
+ const walletId = (await kmd.createWallet(walletAccount.name, '')).wallet.id;
38
+ const walletHandle = (await kmd.initWalletHandle(walletId, '')).wallet_handle_token;
39
+ await kmd.generateKey(walletHandle);
40
+ // Get the account from the new KMD wallet
41
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
42
+ const account = (await getKmdWalletAccount(walletAccount, algod, kmd));
43
+ Config.logger.info(`LocalNet account '${walletAccount.name}' doesn't yet exist; created account ${account.addr} with keys stored in KMD and funding with ${walletAccount.fundWith?.algos ?? 1000} ALGOs`);
44
+ // Fund the account from the dispenser
45
+ await transferAlgos({
46
+ amount: walletAccount.fundWith ?? AlgoAmount.Algos(1000),
47
+ from: await getDispenserAccount(algod, kmd),
48
+ to: account.addr,
49
+ }, algod);
50
+ return account;
51
+ }
52
+ /**
53
+ * Returns an Algorand account with private key loaded from the given KMD wallet (identified by name).
54
+ *
55
+ * @param walletAccount The details of the wallet, with:
56
+ * * `name`: The name of the wallet to retrieve an account from
57
+ * * `predicate`: An optional filter to use to find the account (otherwise it will return a random account from the wallet)
58
+ * @param algod An algod client
59
+ * @param kmdClient A KMD client, if not specified then a default KMD client will be loaded from environment variables
60
+ * @example Get default funded account in a LocalNet
61
+ *
62
+ * ```typescript
63
+ * const defaultDispenserAccount = await getKmdWalletAccount(algod,
64
+ * 'unencrypted-default-wallet',
65
+ * a => a.status !== 'Offline' && a.amount > 1_000_000_000
66
+ * )
67
+ * ```
68
+ */
69
+ export async function getKmdWalletAccount(walletAccount, algod, kmdClient) {
70
+ const { name, predicate } = walletAccount;
71
+ const kmd = kmdClient ?? getAlgoKmdClient();
72
+ const wallets = await kmd.listWallets();
73
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
74
+ const wallet = wallets.wallets.filter((w) => w.name === name);
75
+ if (wallet.length === 0) {
76
+ return undefined;
77
+ }
78
+ const walletId = wallet[0].id;
79
+ const walletHandle = (await kmd.initWalletHandle(walletId, '')).wallet_handle_token;
80
+ const keyIds = (await kmd.listKeys(walletHandle)).addresses;
81
+ let i = 0;
82
+ if (predicate) {
83
+ for (i = 0; i < keyIds.length; i++) {
84
+ const key = keyIds[i];
85
+ const account = await algod.accountInformation(key).do();
86
+ if (predicate(account)) {
87
+ break;
88
+ }
89
+ }
90
+ }
91
+ if (i >= keyIds.length) {
92
+ return undefined;
93
+ }
94
+ const accountKey = (await kmd.exportKey(walletHandle, '', keyIds[i])).private_key;
95
+ const accountMnemonic = algosdk.secretKeyToMnemonic(accountKey);
96
+ return mnemonicAccount(accountMnemonic);
97
+ }
98
+ /**
99
+ * Returns an Algorand account with private key loaded for the default LocalNet dispenser account (that can be used to fund other accounts)
100
+ *
101
+ * @param algod An algod client
102
+ * @param kmd A KMD client, if not specified then a default KMD client will be loaded from environment variables
103
+ */
104
+ export async function getLocalNetDispenserAccount(algod, kmd) {
105
+ if (!(await isLocalNet(algod))) {
106
+ throw "Can't get default account from non LocalNet network";
107
+ }
108
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
109
+ return (await getKmdWalletAccount({ name: 'unencrypted-default-wallet', predicate: (a) => a.status !== 'Offline' && a.amount > 1_000_000_000 }, algod, kmd));
110
+ }
111
+ //# sourceMappingURL=localnet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localnet.js","sourceRoot":"","sources":["../../src/localnet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ import algosdk, { Indexer, Kmd } from 'algosdk';
2
+ import { AlgoHttpClientWithRetry } from './types/algo-http-client-with-retry';
3
+ /** Retrieve configurations from environment variables when defined or get defaults (expects to be called from a Node.js environment not algod-side) */
4
+ export function getConfigFromEnvOrDefaults() {
5
+ if (!process || !process.env) {
6
+ throw new Error('Attempt to get default algod configuration from a non Node.js context; supply the config instead');
7
+ }
8
+ const algodConfig = !process.env.ALGOD_SERVER
9
+ ? getDefaultLocalNetConfig('algod')
10
+ : { server: process.env.ALGOD_SERVER, port: process.env.ALGOD_PORT, token: process.env.ALGOD_TOKEN };
11
+ const indexerConfig = !process.env.INDEXER_SERVER
12
+ ? getDefaultLocalNetConfig('indexer')
13
+ : {
14
+ server: process.env.INDEXER_SERVER,
15
+ port: process.env.INDEXER_PORT,
16
+ token: process.env.INDEXER_TOKEN,
17
+ };
18
+ return {
19
+ algodConfig,
20
+ indexerConfig,
21
+ kmdConfig: process && process.env && process.env.ALGOD_SERVER
22
+ ? { ...algodConfig, port: process?.env?.KMD_PORT ?? '4002' }
23
+ : getDefaultLocalNetConfig('kmd'),
24
+ };
25
+ }
26
+ /** Retrieve the algod configuration from environment variables (expects to be called from a Node.js environment not algod-side) */
27
+ export function getAlgodConfigFromEnvironment() {
28
+ if (!process || !process.env) {
29
+ throw new Error('Attempt to get default algod configuration from a non Node.js context; supply the config instead');
30
+ }
31
+ if (!process.env.ALGOD_SERVER) {
32
+ throw new Error('Attempt to get default algod configuration without specifying ALGOD_SERVER in the environment variables');
33
+ }
34
+ return {
35
+ server: process.env.ALGOD_SERVER,
36
+ port: process.env.ALGOD_PORT,
37
+ token: process.env.ALGOD_TOKEN,
38
+ };
39
+ }
40
+ /** Retrieve the indexer configuration from environment variables (expects to be called from a Node.js environment not algod-side) */
41
+ export function getIndexerConfigFromEnvironment() {
42
+ if (!process || !process.env) {
43
+ throw new Error('Attempt to get default indexer configuration from a non Node.js context; supply the config instead');
44
+ }
45
+ if (!process.env.INDEXER_SERVER) {
46
+ throw new Error('Attempt to get default indexer configuration without specifying INDEXER_SERVER in the environment variables');
47
+ }
48
+ return {
49
+ server: process.env.INDEXER_SERVER,
50
+ port: process.env.INDEXER_PORT,
51
+ token: process.env.INDEXER_TOKEN,
52
+ };
53
+ }
54
+ /** Returns the Algorand configuration to point to the AlgoNode service
55
+ *
56
+ * @param network Which network to connect to - TestNet or MainNet
57
+ * @param config Which algod config to return - Algod or Indexer
58
+ */
59
+ export function getAlgoNodeConfig(network, config) {
60
+ return {
61
+ server: `https://${network}-${config === 'algod' ? 'api' : 'idx'}.algonode.cloud/`,
62
+ port: 443,
63
+ };
64
+ }
65
+ /** Returns the Algorand configuration to point to the default LocalNet
66
+ *
67
+ * @param configOrPort Which algod config to return - algod, kmd, or indexer OR a port number
68
+ */
69
+ export function getDefaultLocalNetConfig(configOrPort) {
70
+ return {
71
+ server: `http://localhost`,
72
+ port: configOrPort === 'algod' ? 4001 : configOrPort === 'indexer' ? 8980 : configOrPort === 'kmd' ? 4002 : configOrPort,
73
+ token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
74
+ };
75
+ }
76
+ function getAlgoTokenHeader(server, token, defaultHeader) {
77
+ // Purestake uses a slightly different API key header than the default
78
+ if (server.includes('purestake.io') && typeof token === 'string')
79
+ return { 'X-API-Key': token };
80
+ // Because we override the default HTTP Client construction (to get retries) we need to put a string token into the standard header ourselves
81
+ return typeof token === 'string' ? { [defaultHeader ?? 'X-Algo-API-Token']: token } : token ?? {};
82
+ }
83
+ /** Returns an algod SDK client that automatically retries on idempotent calls
84
+ *
85
+ * @param config The config if you want to override the default (getting config from process.env)
86
+ * @example Default (load from environment variables)
87
+ *
88
+ * ```typescript
89
+ * // Uses process.env.ALGOD_SERVER, process.env.ALGOD_PORT and process.env.ALGOD_TOKEN
90
+ * // Automatically detects if you are using PureStake to switch in the right header name for ALGOD_TOKEN
91
+ * const algod = getAlgoClient()
92
+ * await algod.healthCheck().do()
93
+ * ```
94
+ * @example AlgoNode (testnet)
95
+ * ```typescript
96
+ * const algod = getAlgoClient(getAlgoNodeConfig('testnet', 'algod'))
97
+ * await algod.healthCheck().do()
98
+ * ```
99
+ * @example AlgoNode (mainnet)
100
+ * ```typescript
101
+ * const algod = getAlgoClient(getAlgoNodeConfig('mainnet', 'algod'))
102
+ * await algod.healthCheck().do()
103
+ * ```
104
+ * @example Custom (e.g. default LocalNet, although we recommend loading this into a .env and using the Default option instead)
105
+ * ```typescript
106
+ * const algod = getAlgoClient({server: 'http://localhost', port: '4001', token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})
107
+ * await algod.healthCheck().do()
108
+ * ```
109
+ */
110
+ export function getAlgoClient(config) {
111
+ const { token, server, port } = config ?? getAlgodConfigFromEnvironment();
112
+ const httpClientWithRetry = new AlgoHttpClientWithRetry(getAlgoTokenHeader(server, token), server, port);
113
+ return new algosdk.Algodv2(httpClientWithRetry, server);
114
+ }
115
+ /** Returns an indexer SDK client that automatically retries on idempotent calls
116
+ *
117
+ * @param config The config if you want to override the default (getting config from process.env)
118
+ * @example Default (load from environment variables)
119
+ *
120
+ * ```typescript
121
+ * // Uses process.env.INDEXER_SERVER, process.env.INDEXER_PORT and process.env.INDEXER_TOKEN
122
+ * // Automatically detects if you are using PureStake to switch in the right header name for INDEXER_TOKEN
123
+ * const indexer = getAlgoIndexerClient()
124
+ * await indexer.makeHealthCheck().do()
125
+ * ```
126
+ * @example AlgoNode (testnet)
127
+ * ```typescript
128
+ * const indexer = getAlgoIndexerClient(getAlgoNodeConfig('testnet', 'indexer'))
129
+ * await indexer.makeHealthCheck().do()
130
+ * ```
131
+ * @example AlgoNode (mainnet)
132
+ * ```typescript
133
+ * const indexer = getAlgoIndexerClient(getAlgoNodeConfig('mainnet', 'indexer'))
134
+ * await indexer.makeHealthCheck().do()
135
+ * ```
136
+ * @example Custom (e.g. default LocalNet, although we recommend loading this into a .env and using the Default option instead)
137
+ * ```typescript
138
+ * const indexer = getAlgoIndexerClient({server: 'http://localhost', port: '8980', token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})
139
+ * await indexer.makeHealthCheck().do()
140
+ * ```
141
+ */
142
+ export function getAlgoIndexerClient(config) {
143
+ const { token, server, port } = config ?? getIndexerConfigFromEnvironment();
144
+ const httpClientWithRetry = new AlgoHttpClientWithRetry(getAlgoTokenHeader(server, token, 'X-Indexer-API-Token'), server, port);
145
+ return new Indexer(httpClientWithRetry);
146
+ }
147
+ /**
148
+ * Returns a KMD SDK client that automatically retries on idempotent calls
149
+ *
150
+ * KMD client allows you to export private keys, which is useful to get the default account in a LocalNet network.
151
+ *
152
+ * @param config The config if you want to override the default (getting config from process.env)
153
+ * @example Default (load from environment variables)
154
+ *
155
+ * ```typescript
156
+ * // Uses process.env.ALGOD_SERVER, process.env.KMD_PORT (or if not specified: port 4002) and process.env.ALGOD_TOKEN
157
+ * const kmd = getAlgoKmdClient()
158
+ * ```
159
+ * @example Custom (e.g. default LocalNet, although we recommend loading this into a .env and using the Default option instead)
160
+ * ```typescript
161
+ * const kmd = getAlgoKmdClient({server: 'http://localhost', port: '4002', token: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})
162
+ * ```
163
+ */
164
+ export function getAlgoKmdClient(config) {
165
+ const { token, server } = config ?? getAlgodConfigFromEnvironment();
166
+ // We can only use Kmd on the LocalNet otherwise it's not exposed so this makes some assumptions
167
+ // (e.g. same token and server as algod and port 4002 by default)
168
+ return new Kmd(token, server, process?.env?.KMD_PORT ?? '4002');
169
+ }
170
+ export async function isTestNet(algod) {
171
+ const params = await algod.getTransactionParams().do();
172
+ return params.genesisID === 'testnet-v1';
173
+ }
174
+ export async function isMainNet(algod) {
175
+ const params = await algod.getTransactionParams().do();
176
+ return params.genesisID === 'mainnet-v1';
177
+ }
178
+ export { isLocalNet } from './localnet';
179
+ //# sourceMappingURL=network-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-client.js","sourceRoot":"","sources":["../../src/network-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import algosdk from 'algosdk';
2
+ import { Config } from '../';
3
+ import { getDispenserAccount } from '../account';
4
+ import { transferAlgos } from '../transfer';
5
+ /**
6
+ * Creates an ephemeral Algorand account for the purposes of testing.
7
+ * Returns a newly created random test account that is funded from the dispenser
8
+ * DO NOT USE THIS TO CREATE A MAINNET ACCOUNT!
9
+ * Note: By default this will log the mnemonic of the account.
10
+ * @param param0 The config for the test account to generate
11
+ * @param algod An algod client
12
+ * @param kmd A KMD client, if not specified then a default KMD client will be loaded from environment variables
13
+ * @returns The account, with private key loaded
14
+ */
15
+ export async function getTestAccount({ suppressLog, initialFunds }, algod, kmd) {
16
+ const account = algosdk.generateAccount();
17
+ Config.getLogger(suppressLog).info(`New test account created with address '${account.addr}' and mnemonic '${algosdk.secretKeyToMnemonic(account.sk)}'.`);
18
+ const dispenser = await getDispenserAccount(algod, kmd);
19
+ await transferAlgos({ from: dispenser, to: account.addr, amount: initialFunds, note: 'Funding test account', suppressLog }, algod);
20
+ const accountInfo = await algod.accountInformation(account.addr).do();
21
+ Config.getLogger(suppressLog).info('Test account funded; account balance: %d µAlgos', accountInfo.amount);
22
+ return account;
23
+ }
24
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../../../src/testing/account.ts"],"names":[],"mappings":"AAAA,OAAO,OAAkC,MAAM,SAAS,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAG3C;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAE,WAAW,EAAE,YAAY,EAAwB,EAAE,KAAc,EAAE,GAAS;IACjH,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAA;IAEzC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAChC,0CAA0C,OAAO,CAAC,IAAI,mBAAmB,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CACrH,CAAA;IAED,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAEvD,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,CAAA;IAElI,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAA;IAErE,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iDAAiD,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAEzG,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { Config } from '../../';
2
+ import { TestLogger } from '../test-logger';
3
+ /**
4
+ * Creates a test fixture for capturing AlgoKit logs.
5
+ *
6
+ * @example ```typescript
7
+ * const logs = algoKitLogCaptureFixture()
8
+ *
9
+ * beforeEach(logs.beforeEach)
10
+ * afterEach(logs.afterEach)
11
+ *
12
+ * test('My test', () => {
13
+ * const capturedLogs = logs.testLogger.capturedLogs
14
+ * })
15
+ * ```
16
+ *
17
+ * @returns The fixture
18
+ */
19
+ export const algoKitLogCaptureFixture = () => {
20
+ const originalLogger = Config.logger;
21
+ let hybridLogger;
22
+ return {
23
+ get testLogger() {
24
+ return hybridLogger;
25
+ },
26
+ beforeEach: () => {
27
+ hybridLogger = new TestLogger(originalLogger);
28
+ Config.configure({
29
+ logger: hybridLogger,
30
+ });
31
+ },
32
+ afterEach: () => {
33
+ Config.configure({
34
+ logger: originalLogger,
35
+ });
36
+ },
37
+ };
38
+ };
39
+ //# sourceMappingURL=algokit-log-capture-fixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algokit-log-capture-fixture.js","sourceRoot":"","sources":["../../../../src/testing/fixtures/algokit-log-capture-fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAmC,GAAG,EAAE;IAC3E,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAA;IAEpC,IAAI,YAAwB,CAAA;IAE5B,OAAO;QACL,IAAI,UAAU;YACZ,OAAO,YAAY,CAAA;QACrB,CAAC;QACD,UAAU,EAAE,GAAG,EAAE;YACf,YAAY,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,CAAA;YAC7C,MAAM,CAAC,SAAS,CAAC;gBACf,MAAM,EAAE,YAAY;aACrB,CAAC,CAAA;QACJ,CAAC;QACD,SAAS,EAAE,GAAG,EAAE;YACd,MAAM,CAAC,SAAS,CAAC;gBACf,MAAM,EAAE,cAAc;aACvB,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,53 @@
1
+ import { getTestAccount, runWhenIndexerCaughtUp, TransactionLogger } from '../';
2
+ import { algos, Config, getAlgoClient, getAlgoIndexerClient, getAlgoKmdClient, getConfigFromEnvOrDefaults, lookupTransactionById, } from '../../';
3
+ /**
4
+ * Creates a test fixture for automated testing against Algorand.
5
+ * By default it tests against an environment variable specified client
6
+ * if the standard environment variables are specified, otherwise against
7
+ * a default LocalNet instance, but you can pass in an algod, indexer
8
+ * and/or kmd if you want to test against an explicitly defined network.
9
+ *
10
+ * @example ```typescript
11
+ * const algorand = algorandFixture(undefined, getConfigFromEnvOrDefaults())
12
+ *
13
+ * beforeEach(algorand.beforeEach, 10_000)
14
+ *
15
+ * test('My test', async () => {
16
+ * const {algod, indexer, testAccount, ...} = algorand.context
17
+ * // test things...
18
+ * })
19
+ * ```
20
+ *
21
+ * @param fixtureConfig The fixture configuration
22
+ * @param config The algo configuration
23
+ * @returns The fixture
24
+ */
25
+ export function algorandFixture(fixtureConfig, config) {
26
+ config = config || getConfigFromEnvOrDefaults();
27
+ const algod = fixtureConfig?.algod ?? getAlgoClient(config.algodConfig);
28
+ const indexer = fixtureConfig?.indexer ?? getAlgoIndexerClient(config.indexerConfig);
29
+ const kmd = fixtureConfig?.kmd ?? getAlgoKmdClient(config.kmdConfig);
30
+ let context;
31
+ const beforeEach = async () => {
32
+ Config.configure({ debug: true });
33
+ const transactionLogger = new TransactionLogger();
34
+ const transactionLoggerAlgod = transactionLogger.capture(algod);
35
+ context = {
36
+ algod: transactionLoggerAlgod,
37
+ indexer: indexer,
38
+ kmd: kmd,
39
+ testAccount: await getTestAccount({ initialFunds: fixtureConfig?.testAccountFunding ?? algos(10), suppressLog: true }, transactionLoggerAlgod, kmd),
40
+ generateAccount: (params) => getTestAccount(params, transactionLoggerAlgod, kmd),
41
+ transactionLogger: transactionLogger,
42
+ waitForIndexer: () => transactionLogger.waitForIndexer(indexer),
43
+ waitForIndexerTransaction: (transactionId) => runWhenIndexerCaughtUp(() => lookupTransactionById(transactionId, indexer)),
44
+ };
45
+ };
46
+ return {
47
+ get context() {
48
+ return context;
49
+ },
50
+ beforeEach,
51
+ };
52
+ }
53
+ //# sourceMappingURL=algorand-fixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algorand-fixture.js","sourceRoot":"","sources":["../../../../src/testing/fixtures/algorand-fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,KAAK,CAAA;AAC/E,OAAO,EACL,KAAK,EACL,MAAM,EACN,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,QAAQ,CAAA;AAmDf;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,eAAe,CAAC,aAAqC,EAAE,MAAmB;IACxF,MAAM,GAAG,MAAM,IAAI,0BAA0B,EAAE,CAAA;IAE/C,MAAM,KAAK,GAAG,aAAa,EAAE,KAAK,IAAI,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IACvE,MAAM,OAAO,GAAG,aAAa,EAAE,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IACpF,MAAM,GAAG,GAAG,aAAa,EAAE,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACpE,IAAI,OAAsC,CAAA;IAE1C,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,MAAM,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACjC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAA;QACjD,MAAM,sBAAsB,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC/D,OAAO,GAAG;YACR,KAAK,EAAE,sBAAsB;YAC7B,OAAO,EAAE,OAAO;YAChB,GAAG,EAAE,GAAG;YACR,WAAW,EAAE,MAAM,cAAc,CAC/B,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,EACnF,sBAAsB,EACtB,GAAG,CACJ;YACD,eAAe,EAAE,CAAC,MAA4B,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,sBAAsB,EAAE,GAAG,CAAC;YACtG,iBAAiB,EAAE,iBAAiB;YACpC,cAAc,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC;YAC/D,yBAAyB,EAAE,CAAC,aAAqB,EAAE,EAAE,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;SAClI,CAAA;IACH,CAAC,CAAA;IAED,OAAO;QACL,IAAI,OAAO;YACT,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,UAAU;KACX,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './algokit-log-capture-fixture';
2
+ export * from './algorand-fixture';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/testing/fixtures/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAA;AAC7C,cAAc,oBAAoB,CAAA"}
@@ -0,0 +1,6 @@
1
+ export * from './account';
2
+ export * from './fixtures';
3
+ export * from './indexer';
4
+ export * from './test-logger';
5
+ export * from './transaction-logger';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Runs the given indexer call until a 404 error is no longer returned.
3
+ * Tried every 200ms up to 20 times.
4
+ * Very rudimentary implementation designed for automated testing.
5
+ * @example ```typescript
6
+ * const transaction = await runWhenIndexerCaughtUp(() => indexer.lookupTransactionByID(txnId).do())
7
+ * ```
8
+ * @param run The code to run
9
+ * @returns The result (as a promise), or throws if the indexer didn't catch up in time
10
+ */
11
+ export async function runWhenIndexerCaughtUp(run) {
12
+ let result = null;
13
+ let ok = false;
14
+ let tries = 0;
15
+ while (!ok) {
16
+ try {
17
+ result = await run();
18
+ ok = true;
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ }
21
+ catch (e) {
22
+ if (e?.status === 404) {
23
+ tries++;
24
+ if (tries > 20) {
25
+ throw e;
26
+ }
27
+ await new Promise((resolve) => setTimeout(resolve, 200));
28
+ }
29
+ else {
30
+ throw e;
31
+ }
32
+ }
33
+ }
34
+ return result;
35
+ }
36
+ //# sourceMappingURL=indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../../src/testing/indexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAI,GAAqB;IACnE,IAAI,MAAM,GAAa,IAAI,CAAA;IAC3B,IAAI,EAAE,GAAG,KAAK,CAAA;IACd,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,OAAO,CAAC,EAAE,EAAE;QACV,IAAI;YACF,MAAM,GAAG,MAAM,GAAG,EAAE,CAAA;YACpB,EAAE,GAAG,IAAI,CAAA;YACT,8DAA8D;SAC/D;QAAC,OAAO,CAAM,EAAE;YACf,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,EAAE;gBACrB,KAAK,EAAE,CAAA;gBACP,IAAI,KAAK,GAAG,EAAE,EAAE;oBACd,MAAM,CAAC,CAAA;iBACR;gBACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;aAC/D;iBAAM;gBACL,MAAM,CAAC,CAAA;aACR;SACF;KACF;IAED,OAAO,MAAW,CAAA;AACpB,CAAC"}