@algorandfoundation/algokit-utils 7.0.0-beta.9 → 8.0.0-beta.1

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 (231) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -3
  3. package/account/account.d.ts +4 -1
  4. package/account/account.js +10 -7
  5. package/account/account.js.map +1 -1
  6. package/account/account.mjs +11 -8
  7. package/account/account.mjs.map +1 -1
  8. package/account/get-account-config-from-environment.js.map +1 -1
  9. package/account/get-account-config-from-environment.mjs.map +1 -1
  10. package/account/get-account.js.map +1 -1
  11. package/account/get-account.mjs.map +1 -1
  12. package/account/get-dispenser-account.d.ts +1 -1
  13. package/account/get-dispenser-account.js.map +1 -1
  14. package/account/get-dispenser-account.mjs.map +1 -1
  15. package/account/mnemonic-account.js.map +1 -1
  16. package/account/mnemonic-account.mjs.map +1 -1
  17. package/amount.d.ts +1 -0
  18. package/amount.js +3 -2
  19. package/amount.js.map +1 -1
  20. package/amount.mjs +3 -3
  21. package/amount.mjs.map +1 -1
  22. package/app-client.d.ts +4 -4
  23. package/app-client.js +4 -4
  24. package/app-client.js.map +1 -1
  25. package/app-client.mjs +4 -4
  26. package/app-client.mjs.map +1 -1
  27. package/app-deploy.js +25 -15
  28. package/app-deploy.js.map +1 -1
  29. package/app-deploy.mjs +27 -17
  30. package/app-deploy.mjs.map +1 -1
  31. package/app.d.ts +2 -2
  32. package/app.js +9 -6
  33. package/app.js.map +1 -1
  34. package/app.mjs +9 -6
  35. package/app.mjs.map +1 -1
  36. package/asset.js.map +1 -1
  37. package/asset.mjs.map +1 -1
  38. package/debugging/debugging.js.map +1 -1
  39. package/debugging/debugging.mjs.map +1 -1
  40. package/dispenser-client.js.map +1 -1
  41. package/dispenser-client.mjs.map +1 -1
  42. package/index.d.ts +1 -0
  43. package/index.js +7 -1
  44. package/index.js.map +1 -1
  45. package/index.mjs +3 -2
  46. package/index.mjs.map +1 -1
  47. package/indexer-lookup.d.ts +10 -8
  48. package/indexer-lookup.js +14 -10
  49. package/indexer-lookup.js.map +1 -1
  50. package/indexer-lookup.mjs +14 -10
  51. package/indexer-lookup.mjs.map +1 -1
  52. package/localnet/get-kmd-wallet-account.js.map +1 -1
  53. package/localnet/get-kmd-wallet-account.mjs.map +1 -1
  54. package/localnet/get-localnet-dispenser-account.js.map +1 -1
  55. package/localnet/get-localnet-dispenser-account.mjs.map +1 -1
  56. package/localnet/get-or-create-kmd-wallet-account.js.map +1 -1
  57. package/localnet/get-or-create-kmd-wallet-account.mjs.map +1 -1
  58. package/localnet/is-localnet.js.map +1 -1
  59. package/localnet/is-localnet.mjs.map +1 -1
  60. package/network-client.d.ts +1 -7
  61. package/network-client.js +2 -9
  62. package/network-client.js.map +1 -1
  63. package/network-client.mjs +2 -9
  64. package/network-client.mjs.map +1 -1
  65. package/package.json +5 -5
  66. package/testing/_asset.d.ts +2 -1
  67. package/testing/account.d.ts +4 -3
  68. package/testing/account.js +8 -2
  69. package/testing/account.js.map +1 -1
  70. package/testing/account.mjs +9 -3
  71. package/testing/account.mjs.map +1 -1
  72. package/testing/fixtures/algokit-log-capture-fixture.js.map +1 -1
  73. package/testing/fixtures/algokit-log-capture-fixture.mjs.map +1 -1
  74. package/testing/fixtures/algorand-fixture.js +5 -6
  75. package/testing/fixtures/algorand-fixture.js.map +1 -1
  76. package/testing/fixtures/algorand-fixture.mjs +5 -6
  77. package/testing/fixtures/algorand-fixture.mjs.map +1 -1
  78. package/testing/indexer.js.map +1 -1
  79. package/testing/indexer.mjs.map +1 -1
  80. package/testing/test-logger.js +7 -1
  81. package/testing/test-logger.js.map +1 -1
  82. package/testing/test-logger.mjs +7 -1
  83. package/testing/test-logger.mjs.map +1 -1
  84. package/testing/transaction-logger.js.map +1 -1
  85. package/testing/transaction-logger.mjs.map +1 -1
  86. package/transaction/legacy-bridge.js +2 -2
  87. package/transaction/legacy-bridge.js.map +1 -1
  88. package/transaction/legacy-bridge.mjs +3 -3
  89. package/transaction/legacy-bridge.mjs.map +1 -1
  90. package/transaction/perform-atomic-transaction-composer-simulate.d.ts +4 -1
  91. package/transaction/perform-atomic-transaction-composer-simulate.js +14 -9
  92. package/transaction/perform-atomic-transaction-composer-simulate.js.map +1 -1
  93. package/transaction/perform-atomic-transaction-composer-simulate.mjs +15 -10
  94. package/transaction/perform-atomic-transaction-composer-simulate.mjs.map +1 -1
  95. package/transaction/transaction.d.ts +13 -22
  96. package/transaction/transaction.js +164 -110
  97. package/transaction/transaction.js.map +1 -1
  98. package/transaction/transaction.mjs +163 -109
  99. package/transaction/transaction.mjs.map +1 -1
  100. package/transfer/transfer-algos.js.map +1 -1
  101. package/transfer/transfer-algos.mjs.map +1 -1
  102. package/transfer/transfer.js +3 -1
  103. package/transfer/transfer.js.map +1 -1
  104. package/transfer/transfer.mjs +3 -1
  105. package/transfer/transfer.mjs.map +1 -1
  106. package/types/account-manager.d.ts +20 -20
  107. package/types/account-manager.js +36 -27
  108. package/types/account-manager.js.map +1 -1
  109. package/types/account-manager.mjs +38 -29
  110. package/types/account-manager.mjs.map +1 -1
  111. package/types/account.d.ts +17 -8
  112. package/types/account.js +2 -2
  113. package/types/account.js.map +1 -1
  114. package/types/account.mjs +3 -3
  115. package/types/account.mjs.map +1 -1
  116. package/types/algo-http-client-with-retry.d.ts +1 -2
  117. package/types/algo-http-client-with-retry.js +33 -3
  118. package/types/algo-http-client-with-retry.js.map +1 -1
  119. package/types/algo-http-client-with-retry.mjs +32 -2
  120. package/types/algo-http-client-with-retry.mjs.map +1 -1
  121. package/types/algorand-client-interface.d.ts +2 -2
  122. package/types/algorand-client-transaction-creator.d.ts +16 -14
  123. package/types/algorand-client-transaction-creator.js +3 -1
  124. package/types/algorand-client-transaction-creator.js.map +1 -1
  125. package/types/algorand-client-transaction-creator.mjs +3 -1
  126. package/types/algorand-client-transaction-creator.mjs.map +1 -1
  127. package/types/algorand-client-transaction-sender.d.ts +109 -105
  128. package/types/algorand-client-transaction-sender.js +6 -2
  129. package/types/algorand-client-transaction-sender.js.map +1 -1
  130. package/types/algorand-client-transaction-sender.mjs +6 -2
  131. package/types/algorand-client-transaction-sender.mjs.map +1 -1
  132. package/types/algorand-client.d.ts +6 -7
  133. package/types/algorand-client.js +3 -6
  134. package/types/algorand-client.js.map +1 -1
  135. package/types/algorand-client.mjs +5 -5
  136. package/types/algorand-client.mjs.map +1 -1
  137. package/types/amount.js.map +1 -1
  138. package/types/amount.mjs.map +1 -1
  139. package/types/app-arc56.d.ts +31 -20
  140. package/types/app-arc56.js.map +1 -1
  141. package/types/app-arc56.mjs.map +1 -1
  142. package/types/app-client.d.ts +298 -286
  143. package/types/app-client.js +148 -41
  144. package/types/app-client.js.map +1 -1
  145. package/types/app-client.mjs +147 -40
  146. package/types/app-client.mjs.map +1 -1
  147. package/types/app-deployer.d.ts +4 -4
  148. package/types/app-deployer.js +23 -24
  149. package/types/app-deployer.js.map +1 -1
  150. package/types/app-deployer.mjs +25 -26
  151. package/types/app-deployer.mjs.map +1 -1
  152. package/types/app-factory.d.ts +130 -130
  153. package/types/app-factory.js +4 -5
  154. package/types/app-factory.js.map +1 -1
  155. package/types/app-factory.mjs +5 -6
  156. package/types/app-factory.mjs.map +1 -1
  157. package/types/app-manager.d.ts +5 -5
  158. package/types/app-manager.js +116 -38
  159. package/types/app-manager.js.map +1 -1
  160. package/types/app-manager.mjs +117 -39
  161. package/types/app-manager.mjs.map +1 -1
  162. package/types/app-spec.js +8 -2
  163. package/types/app-spec.js.map +1 -1
  164. package/types/app-spec.mjs +8 -2
  165. package/types/app-spec.mjs.map +1 -1
  166. package/types/app.d.ts +12 -11
  167. package/types/app.js.map +1 -1
  168. package/types/app.mjs.map +1 -1
  169. package/types/asset-manager.d.ts +9 -9
  170. package/types/asset-manager.js +10 -13
  171. package/types/asset-manager.js.map +1 -1
  172. package/types/asset-manager.mjs +10 -13
  173. package/types/asset-manager.mjs.map +1 -1
  174. package/types/async-event-emitter.d.ts +1 -10
  175. package/types/async-event-emitter.js +0 -5
  176. package/types/async-event-emitter.js.map +1 -1
  177. package/types/async-event-emitter.mjs +1 -6
  178. package/types/async-event-emitter.mjs.map +1 -1
  179. package/types/client-manager.d.ts +2 -9
  180. package/types/client-manager.js +11 -21
  181. package/types/client-manager.js.map +1 -1
  182. package/types/client-manager.mjs +11 -21
  183. package/types/client-manager.mjs.map +1 -1
  184. package/types/composer.d.ts +58 -46
  185. package/types/composer.js +154 -105
  186. package/types/composer.js.map +1 -1
  187. package/types/composer.mjs +156 -105
  188. package/types/composer.mjs.map +1 -1
  189. package/types/config.js.map +1 -1
  190. package/types/config.mjs.map +1 -1
  191. package/types/debugging.d.ts +1 -1
  192. package/types/debugging.js +1 -1
  193. package/types/debugging.js.map +1 -1
  194. package/types/debugging.mjs +1 -1
  195. package/types/debugging.mjs.map +1 -1
  196. package/types/dispenser-client.d.ts +2 -1
  197. package/types/dispenser-client.js +5 -1
  198. package/types/dispenser-client.js.map +1 -1
  199. package/types/dispenser-client.mjs +5 -1
  200. package/types/dispenser-client.mjs.map +1 -1
  201. package/types/indexer.d.ts +74 -755
  202. package/types/indexer.js.map +1 -1
  203. package/types/indexer.mjs.map +1 -1
  204. package/types/kmd-account-manager.d.ts +2 -2
  205. package/types/kmd-account-manager.js +1 -1
  206. package/types/kmd-account-manager.js.map +1 -1
  207. package/types/kmd-account-manager.mjs +2 -2
  208. package/types/kmd-account-manager.mjs.map +1 -1
  209. package/types/lifecycle-events.d.ts +10 -0
  210. package/types/lifecycle-events.js +8 -0
  211. package/types/lifecycle-events.js.map +1 -0
  212. package/types/lifecycle-events.mjs +8 -0
  213. package/types/lifecycle-events.mjs.map +1 -0
  214. package/types/logging.js.map +1 -1
  215. package/types/logging.mjs.map +1 -1
  216. package/types/logic-error.d.ts +2 -3
  217. package/types/logic-error.js +3 -3
  218. package/types/logic-error.js.map +1 -1
  219. package/types/logic-error.mjs +3 -3
  220. package/types/logic-error.mjs.map +1 -1
  221. package/types/network-client.d.ts +1 -1
  222. package/types/network-client.js.map +1 -1
  223. package/types/network-client.mjs.map +1 -1
  224. package/types/testing.d.ts +6 -7
  225. package/util.js.map +1 -1
  226. package/util.mjs.map +1 -1
  227. package/types/urlTokenBaseHTTPClient.d.ts +0 -40
  228. package/types/urlTokenBaseHTTPClient.js +0 -153
  229. package/types/urlTokenBaseHTTPClient.js.map +0 -1
  230. package/types/urlTokenBaseHTTPClient.mjs +0 -151
  231. package/types/urlTokenBaseHTTPClient.mjs.map +0 -1
package/types/composer.js CHANGED
@@ -1,25 +1,24 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
3
  var algosdk = require('algosdk');
6
4
  var config = require('../config.js');
7
- var performAtomicTransactionComposerSimulate = require('../transaction/perform-atomic-transaction-composer-simulate.js');
8
5
  var transaction = require('../transaction/transaction.js');
9
6
  var types_app = require('./app.js');
10
7
  var types_appManager = require('./app-manager.js');
11
- var types_asyncEventEmitter = require('./async-event-emitter.js');
8
+ var types_lifecycleEvents = require('./lifecycle-events.js');
12
9
  var types_networkClient = require('./network-client.js');
13
10
 
14
11
  var AtomicTransactionComposer = algosdk.AtomicTransactionComposer;
15
12
  var isTransactionWithSigner = algosdk.isTransactionWithSigner;
16
- var encodeAddress = algosdk.encodeAddress;
17
13
  var modelsv2 = algosdk.modelsv2;
14
+ const address = (address) => {
15
+ return typeof address === 'string' ? algosdk.Address.fromString(address) : address;
16
+ };
18
17
  const MAX_TRANSACTION_GROUP_SIZE = 16;
19
- /** AlgoKit Composer helps you compose and execute transactions as a transaction group. */
20
- class AlgoKitComposer {
18
+ /** TransactionComposer helps you compose and execute transactions as a transaction group. */
19
+ class TransactionComposer {
21
20
  /**
22
- * Create an `AlgoKitComposer`.
21
+ * Create a `TransactionComposer`.
23
22
  * @param params The configuration for this composer
24
23
  */
25
24
  constructor(params) {
@@ -30,7 +29,7 @@ class AlgoKitComposer {
30
29
  /** Transactions that have not yet been composed */
31
30
  this.txns = [];
32
31
  /** The default transaction validity window */
33
- this.defaultValidityWindow = 10;
32
+ this.defaultValidityWindow = 10n;
34
33
  /** Whether the validity window was explicitly set on construction */
35
34
  this.defaultValidityWindowIsExplicit = false;
36
35
  this.algod = params.algod;
@@ -50,7 +49,7 @@ class AlgoKitComposer {
50
49
  addTransaction(transaction, signer) {
51
50
  this.txns.push({
52
51
  txn: transaction,
53
- signer: signer ?? this.getSigner(algosdk.encodeAddress(transaction.from.publicKey)),
52
+ signer: signer ?? this.getSigner(transaction.sender),
54
53
  type: 'txnWithSigner',
55
54
  });
56
55
  return this;
@@ -226,6 +225,15 @@ class AlgoKitComposer {
226
225
  this.txns.push({ ...params, type: 'keyReg' });
227
226
  return this;
228
227
  }
228
+ /**
229
+ * Add an offline key registration transaction to the transaction group.
230
+ * @param params The offline key registration transaction parameters
231
+ * @returns The composer so you can chain method calls
232
+ */
233
+ addOfflineKeyRegistration(params) {
234
+ this.txns.push({ ...params, type: 'keyReg' });
235
+ return this;
236
+ }
229
237
  /**
230
238
  * Add the transactions within an `AtomicTransactionComposer` to the transaction group.
231
239
  * @param atc The `AtomicTransactionComposer` to build transactions from and add to the group
@@ -236,13 +244,11 @@ class AlgoKitComposer {
236
244
  return this;
237
245
  }
238
246
  /** Build an ATC and return transactions ready to be incorporated into a broader set of transactions this composer is composing */
239
- buildAtc(atc, processTransaction) {
247
+ buildAtc(atc) {
240
248
  const group = atc.buildGroup();
241
249
  const txnWithSigners = group.map((ts, idx) => {
242
- // Remove underlying group ID from the transaction since it will be re-grouped when this AlgoKitComposer is built
250
+ // Remove underlying group ID from the transaction since it will be re-grouped when this TransactionComposer is built
243
251
  ts.txn.group = undefined;
244
- // Process transaction if a function is provided
245
- ts.txn = processTransaction?.(ts.txn, idx) ?? ts.txn;
246
252
  // If this was a method call stash the ABIMethod for later
247
253
  if (atc['methodCalls'].get(idx)) {
248
254
  this.txnMethodMap.set(ts.txn.txID(), atc['methodCalls'].get(idx));
@@ -251,39 +257,42 @@ class AlgoKitComposer {
251
257
  });
252
258
  return txnWithSigners;
253
259
  }
254
- commonTxnBuildStep(params, txn, suggestedParams) {
260
+ commonTxnBuildStep(buildTxn, params, txnParams) {
261
+ // We are going to mutate suggested params, let's create a clone first
262
+ txnParams.suggestedParams = { ...txnParams.suggestedParams };
255
263
  if (params.lease)
256
- txn.addLease(transaction.encodeLease(params.lease));
264
+ txnParams.lease = transaction.encodeLease(params.lease);
257
265
  if (params.rekeyTo)
258
- txn.addRekey(params.rekeyTo);
266
+ txnParams.rekeyTo = address(params.rekeyTo);
259
267
  const encoder = new TextEncoder();
260
268
  if (params.note)
261
- txn.note = typeof params.note === 'string' ? encoder.encode(params.note) : params.note;
269
+ txnParams.note = (typeof params.note === 'string' ? encoder.encode(params.note) : params.note);
262
270
  if (params.firstValidRound) {
263
- txn.firstRound = Number(params.firstValidRound);
271
+ txnParams.suggestedParams.firstValid = params.firstValidRound;
264
272
  }
265
273
  if (params.lastValidRound) {
266
- txn.lastRound = Number(params.lastValidRound);
274
+ txnParams.suggestedParams.lastValid = params.lastValidRound;
267
275
  }
268
276
  else {
269
277
  // If the validity window isn't set in this transaction or by default and we are pointing at
270
278
  // LocalNet set a bigger window to avoid dead transactions
271
- const window = params.validityWindow ??
272
- (!this.defaultValidityWindowIsExplicit && types_networkClient.genesisIdIsLocalNet(suggestedParams.genesisID) ? 1000 : this.defaultValidityWindow);
273
- txn.lastRound = txn.firstRound + window;
279
+ const window = params.validityWindow
280
+ ? BigInt(params.validityWindow)
281
+ : !this.defaultValidityWindowIsExplicit && types_networkClient.genesisIdIsLocalNet(txnParams.suggestedParams.genesisID ?? 'unknown')
282
+ ? 1000n
283
+ : this.defaultValidityWindow;
284
+ txnParams.suggestedParams.lastValid = BigInt(txnParams.suggestedParams.firstValid) + window;
274
285
  }
275
286
  if (params.staticFee !== undefined && params.extraFee !== undefined) {
276
287
  throw Error('Cannot set both staticFee and extraFee');
277
288
  }
278
289
  if (params.staticFee !== undefined) {
279
- txn.fee = Number(params.staticFee.microAlgo);
290
+ txnParams.suggestedParams.fee = params.staticFee.microAlgo;
291
+ txnParams.suggestedParams.flatFee = true;
280
292
  }
281
- else {
282
- txn.fee = txn.estimateSize() * suggestedParams.fee || algosdk.ALGORAND_MIN_TX_FEE;
283
- if (params.extraFee)
284
- txn.fee += Number(params.extraFee.microAlgo);
285
- }
286
- txn.flatFee = true;
293
+ const txn = buildTxn(txnParams);
294
+ if (params.extraFee)
295
+ txn.fee += params.extraFee.microAlgo;
287
296
  if (params.maxFee !== undefined && txn.fee > params.maxFee.microAlgo) {
288
297
  throw Error(`Transaction fee ${txn.fee} µALGO is greater than maxFee ${params.maxFee}`);
289
298
  }
@@ -296,14 +305,22 @@ class AlgoKitComposer {
296
305
  */
297
306
  async buildMethodCall(params, suggestedParams, includeSigner) {
298
307
  const methodArgs = [];
308
+ const transactionsForGroup = [];
299
309
  const isAbiValue = (x) => {
300
310
  if (Array.isArray(x))
301
311
  return x.length == 0 || x.every(isAbiValue);
302
312
  return typeof x === 'bigint' || typeof x === 'boolean' || typeof x === 'number' || typeof x === 'string' || x instanceof Uint8Array;
303
313
  };
304
- for (let i = 0; i < (params.args ?? []).length; i++) {
314
+ for (let i = (params.args ?? []).length - 1; i >= 0; i--) {
305
315
  const arg = params.args[i];
306
316
  if (arg === undefined) {
317
+ // An undefined transaction argument signals that the value will be supplied by a method call argument
318
+ if (algosdk.abiTypeIsTransaction(params.method.args[i].type) && transactionsForGroup.length > 0) {
319
+ // Move the last transaction from the group to the method call arguments to appease algosdk
320
+ const placeholderTransaction = transactionsForGroup.splice(-1, 1)[0];
321
+ methodArgs.push(placeholderTransaction);
322
+ continue;
323
+ }
307
324
  throw Error(`No value provided for argument ${i + 1} within call to ${params.method.name}`);
308
325
  }
309
326
  if (isAbiValue(arg)) {
@@ -316,7 +333,10 @@ class AlgoKitComposer {
316
333
  }
317
334
  if ('method' in arg) {
318
335
  const tempTxnWithSigners = await this.buildMethodCall(arg, suggestedParams, includeSigner);
319
- methodArgs.push(...tempTxnWithSigners);
336
+ // If there is any transaction args, add to the atc
337
+ // Everything else should be added as method args
338
+ methodArgs.push(...tempTxnWithSigners.slice(-1)); // Add the method call itself as a method arg
339
+ transactionsForGroup.push(...tempTxnWithSigners.slice(0, -1).reverse()); // Add any transaction arguments to the atc
320
340
  continue;
321
341
  }
322
342
  const txn = await arg;
@@ -327,11 +347,12 @@ class AlgoKitComposer {
327
347
  ? 'signer' in params.signer
328
348
  ? params.signer.signer
329
349
  : params.signer
330
- : this.getSigner(encodeAddress(txn.from.publicKey))
331
- : AlgoKitComposer.NULL_SIGNER,
350
+ : this.getSigner(txn.sender)
351
+ : TransactionComposer.NULL_SIGNER,
332
352
  });
333
353
  }
334
354
  const methodAtc = new algosdk.AtomicTransactionComposer();
355
+ transactionsForGroup.reverse().forEach((txn) => methodAtc.addTransaction(txn));
335
356
  const appId = Number('appId' in params ? params.appId : 0n);
336
357
  const approvalProgram = 'approvalProgram' in params
337
358
  ? typeof params.approvalProgram === 'string'
@@ -343,7 +364,7 @@ class AlgoKitComposer {
343
364
  ? (await this.appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes
344
365
  : params.clearStateProgram
345
366
  : undefined;
346
- methodAtc.addMethodCall({
367
+ const txnParams = {
347
368
  appID: appId,
348
369
  sender: params.sender,
349
370
  suggestedParams,
@@ -361,10 +382,10 @@ class AlgoKitComposer {
361
382
  ? Math.floor((approvalProgram.length + (clearStateProgram?.length ?? 0)) / types_app.APP_PAGE_MAX_SIZE)
362
383
  : 0
363
384
  : undefined,
364
- numLocalInts: appId === 0 ? ('schema' in params ? params.schema?.localInts ?? 0 : 0) : undefined,
365
- numLocalByteSlices: appId === 0 ? ('schema' in params ? params.schema?.localByteSlices ?? 0 : 0) : undefined,
366
- numGlobalInts: appId === 0 ? ('schema' in params ? params.schema?.globalInts ?? 0 : 0) : undefined,
367
- numGlobalByteSlices: appId === 0 ? ('schema' in params ? params.schema?.globalByteSlices ?? 0 : 0) : undefined,
385
+ numLocalInts: appId === 0 ? ('schema' in params ? (params.schema?.localInts ?? 0) : 0) : undefined,
386
+ numLocalByteSlices: appId === 0 ? ('schema' in params ? (params.schema?.localByteSlices ?? 0) : 0) : undefined,
387
+ numGlobalInts: appId === 0 ? ('schema' in params ? (params.schema?.globalInts ?? 0) : 0) : undefined,
388
+ numGlobalByteSlices: appId === 0 ? ('schema' in params ? (params.schema?.globalByteSlices ?? 0) : 0) : undefined,
368
389
  method: params.method,
369
390
  signer: includeSigner
370
391
  ? params.signer
@@ -372,49 +393,51 @@ class AlgoKitComposer {
372
393
  ? params.signer.signer
373
394
  : params.signer
374
395
  : this.getSigner(params.sender)
375
- : AlgoKitComposer.NULL_SIGNER,
376
- methodArgs: methodArgs,
396
+ : TransactionComposer.NULL_SIGNER,
397
+ methodArgs: methodArgs.reverse(),
377
398
  // note, lease, and rekeyTo are set in the common build step
378
399
  note: undefined,
379
400
  lease: undefined,
380
401
  rekeyTo: undefined,
381
- });
402
+ };
403
+ // Build the transaction
404
+ this.commonTxnBuildStep((txnParams) => {
405
+ methodAtc.addMethodCall(txnParams);
406
+ return methodAtc.buildGroup()[methodAtc.count() - 1].txn;
407
+ }, params, txnParams);
382
408
  // Process the ATC to get a set of transactions ready for broader grouping
383
- // and with the common build step to set fees and validity rounds
384
- return this.buildAtc(methodAtc, (txn, idx) => idx === methodAtc.count() - 1 ? this.commonTxnBuildStep(params, txn, suggestedParams) : txn);
409
+ return this.buildAtc(methodAtc);
385
410
  }
386
411
  buildPayment(params, suggestedParams) {
387
- const txn = algosdk.makePaymentTxnWithSuggestedParamsFromObject({
388
- from: params.sender,
389
- to: params.receiver,
412
+ return this.commonTxnBuildStep(algosdk.makePaymentTxnWithSuggestedParamsFromObject, params, {
413
+ sender: params.sender,
414
+ receiver: params.receiver,
390
415
  amount: params.amount.microAlgo,
391
416
  closeRemainderTo: params.closeRemainderTo,
392
417
  suggestedParams,
393
418
  });
394
- return this.commonTxnBuildStep(params, txn, suggestedParams);
395
419
  }
396
420
  buildAssetCreate(params, suggestedParams) {
397
- const txn = algosdk.makeAssetCreateTxnWithSuggestedParamsFromObject({
398
- from: params.sender,
421
+ return this.commonTxnBuildStep(algosdk.makeAssetCreateTxnWithSuggestedParamsFromObject, params, {
422
+ sender: params.sender,
399
423
  total: params.total,
400
424
  decimals: params.decimals ?? 0,
401
425
  assetName: params.assetName,
402
426
  unitName: params.unitName,
403
427
  assetURL: params.url,
404
428
  defaultFrozen: params.defaultFrozen ?? false,
405
- assetMetadataHash: params.metadataHash,
429
+ assetMetadataHash: typeof params.metadataHash === 'string' ? Buffer.from(params.metadataHash, 'utf-8') : params.metadataHash,
406
430
  manager: params.manager,
407
431
  reserve: params.reserve,
408
432
  freeze: params.freeze,
409
433
  clawback: params.clawback,
410
434
  suggestedParams,
411
435
  });
412
- return this.commonTxnBuildStep(params, txn, suggestedParams);
413
436
  }
414
437
  buildAssetConfig(params, suggestedParams) {
415
- const txn = algosdk.makeAssetConfigTxnWithSuggestedParamsFromObject({
416
- from: params.sender,
417
- assetIndex: Number(params.assetId),
438
+ return this.commonTxnBuildStep(algosdk.makeAssetConfigTxnWithSuggestedParamsFromObject, params, {
439
+ sender: params.sender,
440
+ assetIndex: params.assetId,
418
441
  suggestedParams,
419
442
  manager: params.manager,
420
443
  reserve: params.reserve,
@@ -422,40 +445,36 @@ class AlgoKitComposer {
422
445
  clawback: params.clawback,
423
446
  strictEmptyAddressChecking: false,
424
447
  });
425
- return this.commonTxnBuildStep(params, txn, suggestedParams);
426
448
  }
427
449
  buildAssetDestroy(params, suggestedParams) {
428
- const txn = algosdk.makeAssetDestroyTxnWithSuggestedParamsFromObject({
429
- from: params.sender,
430
- assetIndex: Number(params.assetId),
450
+ return this.commonTxnBuildStep(algosdk.makeAssetDestroyTxnWithSuggestedParamsFromObject, params, {
451
+ sender: params.sender,
452
+ assetIndex: params.assetId,
431
453
  suggestedParams,
432
454
  });
433
- return this.commonTxnBuildStep(params, txn, suggestedParams);
434
455
  }
435
456
  buildAssetFreeze(params, suggestedParams) {
436
- const txn = algosdk.makeAssetFreezeTxnWithSuggestedParamsFromObject({
437
- from: params.sender,
438
- assetIndex: Number(params.assetId),
457
+ return this.commonTxnBuildStep(algosdk.makeAssetFreezeTxnWithSuggestedParamsFromObject, params, {
458
+ sender: params.sender,
459
+ assetIndex: params.assetId,
439
460
  freezeTarget: params.account,
440
- freezeState: params.frozen,
461
+ frozen: params.frozen,
441
462
  suggestedParams,
442
463
  });
443
- return this.commonTxnBuildStep(params, txn, suggestedParams);
444
464
  }
445
465
  buildAssetTransfer(params, suggestedParams) {
446
- const txn = algosdk.makeAssetTransferTxnWithSuggestedParamsFromObject({
447
- from: params.sender,
448
- to: params.receiver,
449
- assetIndex: Number(params.assetId),
466
+ return this.commonTxnBuildStep(algosdk.makeAssetTransferTxnWithSuggestedParamsFromObject, params, {
467
+ sender: params.sender,
468
+ receiver: params.receiver,
469
+ assetIndex: params.assetId,
450
470
  amount: params.amount,
451
471
  suggestedParams,
452
472
  closeRemainderTo: params.closeAssetTo,
453
- revocationTarget: params.clawbackTarget,
473
+ assetSender: params.clawbackTarget,
454
474
  });
455
- return this.commonTxnBuildStep(params, txn, suggestedParams);
456
475
  }
457
476
  async buildAppCall(params, suggestedParams) {
458
- const appId = Number('appId' in params ? params.appId : 0n);
477
+ const appId = 'appId' in params ? params.appId : 0n;
459
478
  const approvalProgram = 'approvalProgram' in params
460
479
  ? typeof params.approvalProgram === 'string'
461
480
  ? (await this.appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes
@@ -467,7 +486,7 @@ class AlgoKitComposer {
467
486
  : params.clearStateProgram
468
487
  : undefined;
469
488
  const sdkParams = {
470
- from: params.sender,
489
+ sender: params.sender,
471
490
  suggestedParams,
472
491
  appArgs: params.args,
473
492
  onComplete: params.onComplete ?? algosdk.OnApplicationComplete.NoOpOC,
@@ -478,32 +497,46 @@ class AlgoKitComposer {
478
497
  approvalProgram,
479
498
  clearProgram: clearStateProgram,
480
499
  };
481
- let txn;
482
- if (appId === 0) {
500
+ if (appId === 0n) {
483
501
  if (sdkParams.approvalProgram === undefined || sdkParams.clearProgram === undefined) {
484
502
  throw new Error('approvalProgram and clearStateProgram are required for application creation');
485
503
  }
486
- txn = algosdk.makeApplicationCreateTxnFromObject({
504
+ return this.commonTxnBuildStep(algosdk.makeApplicationCreateTxnFromObject, params, {
487
505
  ...sdkParams,
488
506
  extraPages: 'extraProgramPages' in params
489
- ? params.extraProgramPages ?? Math.floor((approvalProgram.length + clearStateProgram.length) / types_app.APP_PAGE_MAX_SIZE)
507
+ ? (params.extraProgramPages ?? Math.floor((approvalProgram.length + clearStateProgram.length) / types_app.APP_PAGE_MAX_SIZE))
490
508
  : 0,
491
- numLocalInts: 'schema' in params ? params.schema?.localInts ?? 0 : 0,
492
- numLocalByteSlices: 'schema' in params ? params.schema?.localByteSlices ?? 0 : 0,
493
- numGlobalInts: 'schema' in params ? params.schema?.globalInts ?? 0 : 0,
494
- numGlobalByteSlices: 'schema' in params ? params.schema?.globalByteSlices ?? 0 : 0,
509
+ numLocalInts: 'schema' in params ? (params.schema?.localInts ?? 0) : 0,
510
+ numLocalByteSlices: 'schema' in params ? (params.schema?.localByteSlices ?? 0) : 0,
511
+ numGlobalInts: 'schema' in params ? (params.schema?.globalInts ?? 0) : 0,
512
+ numGlobalByteSlices: 'schema' in params ? (params.schema?.globalByteSlices ?? 0) : 0,
495
513
  approvalProgram: approvalProgram,
496
514
  clearProgram: clearStateProgram,
497
515
  });
498
516
  }
499
517
  else {
500
- txn = algosdk.makeApplicationCallTxnFromObject({ ...sdkParams, appIndex: appId });
518
+ return this.commonTxnBuildStep(algosdk.makeApplicationCallTxnFromObject, params, { ...sdkParams, appIndex: appId });
501
519
  }
502
- return this.commonTxnBuildStep(params, txn, suggestedParams);
503
520
  }
504
521
  buildKeyReg(params, suggestedParams) {
505
- const txn = algosdk.makeKeyRegistrationTxnWithSuggestedParams(params.sender, undefined, params.voteKey, params.selectionKey, Number(params.voteFirst), Number(params.voteLast), Number(params.voteKeyDilution), suggestedParams, undefined, false, params.stateProofKey);
506
- return this.commonTxnBuildStep(params, txn, suggestedParams);
522
+ if ('voteKey' in params) {
523
+ return this.commonTxnBuildStep(algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject, params, {
524
+ sender: params.sender,
525
+ voteKey: params.voteKey,
526
+ selectionKey: params.selectionKey,
527
+ voteFirst: params.voteFirst,
528
+ voteLast: params.voteLast,
529
+ voteKeyDilution: params.voteKeyDilution,
530
+ suggestedParams,
531
+ nonParticipation: false,
532
+ stateProofKey: params.stateProofKey,
533
+ });
534
+ }
535
+ return this.commonTxnBuildStep(algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject, params, {
536
+ sender: params.sender,
537
+ suggestedParams,
538
+ nonParticipation: params.preventAccountFromEverParticipatingAgain,
539
+ });
507
540
  }
508
541
  /** Builds all transaction types apart from `txnWithSigner`, `atc` and `methodCall` since those ones can have custom signers that need to be retrieved. */
509
542
  async buildTxn(txn, suggestedParams) {
@@ -569,7 +602,7 @@ class AlgoKitComposer {
569
602
  : [];
570
603
  transactions.push(...transactionsWithSigner.map((ts) => ts.txn));
571
604
  transactionsWithSigner.forEach((ts, idx) => {
572
- if (ts.signer && ts.signer !== AlgoKitComposer.NULL_SIGNER) {
605
+ if (ts.signer && ts.signer !== TransactionComposer.NULL_SIGNER) {
573
606
  signers.set(idx, ts.signer);
574
607
  }
575
608
  });
@@ -636,9 +669,9 @@ class AlgoKitComposer {
636
669
  const group = (await this.build()).transactions;
637
670
  let waitRounds = params?.maxRoundsToWaitForConfirmation;
638
671
  if (waitRounds === undefined) {
639
- const lastRound = group.reduce((max, txn) => Math.max(txn.txn.lastRound, max), 0);
640
- const { firstRound } = await this.getSuggestedParams();
641
- waitRounds = lastRound - firstRound + 1;
672
+ const lastRound = group.reduce((max, txn) => (txn.txn.lastValid > max ? txn.txn.lastValid : BigInt(max)), 0n);
673
+ const { firstValid: firstRound } = await this.getSuggestedParams();
674
+ waitRounds = Number(BigInt(lastRound) - BigInt(firstRound)) + 1;
642
675
  }
643
676
  return await transaction.sendAtomicTransactionComposer({
644
677
  atc: this.atc,
@@ -668,10 +701,11 @@ class AlgoKitComposer {
668
701
  // Build the transactions
669
702
  if (options?.skipSignatures) {
670
703
  options.allowEmptySignatures = true;
704
+ options.fixSigners = true;
671
705
  // Build transactions uses empty signers
672
706
  const transactions = await this.buildTransactions();
673
707
  for (const txn of transactions.transactions) {
674
- atc.addTransaction({ txn, signer: AlgoKitComposer.NULL_SIGNER });
708
+ atc.addTransaction({ txn, signer: TransactionComposer.NULL_SIGNER });
675
709
  }
676
710
  atc['methodCalls'] = transactions.methodCalls;
677
711
  }
@@ -679,21 +713,36 @@ class AlgoKitComposer {
679
713
  // Build creates real signatures
680
714
  await this.build();
681
715
  }
682
- if (config.Config.debug && !config.Config.traceAll) {
683
- // Dump the traces to a file for use with AlgoKit AVM debugger
684
- // Checks for false on traceAll because it should have been already
685
- // executed above
686
- const simulateResponse = await performAtomicTransactionComposerSimulate.performAtomicTransactionComposerSimulate(atc, this.algod);
687
- await config.Config.events.emitAsync(types_asyncEventEmitter.EventType.TxnGroupSimulated, {
688
- simulateResponse,
689
- });
690
- }
691
- const { methodResults, simulateResponse } = await atc.simulate(this.algod, new modelsv2.SimulateRequest({ txnGroups: [], ...options }));
692
- if (simulateResponse && simulateResponse.txnGroups[0].failedAt) {
693
- const error = new Error(`Transaction failed at transaction(s) ${simulateResponse.txnGroups[0].failedAt.join(', ')} in the group. ${simulateResponse.txnGroups.find((x) => x.failureMessage)?.failureMessage}`);
716
+ const { methodResults, simulateResponse } = await atc.simulate(this.algod, new modelsv2.SimulateRequest({
717
+ txnGroups: [],
718
+ ...options,
719
+ ...(config.Config.debug
720
+ ? {
721
+ allowEmptySignatures: true,
722
+ fixSigners: true,
723
+ allowMoreLogging: true,
724
+ execTraceConfig: new modelsv2.SimulateTraceConfig({
725
+ enable: true,
726
+ scratchChange: true,
727
+ stackChange: true,
728
+ stateChange: true,
729
+ }),
730
+ }
731
+ : undefined),
732
+ }));
733
+ const failedGroup = simulateResponse?.txnGroups[0];
734
+ if (failedGroup?.failureMessage) {
735
+ const errorMessage = `Transaction failed at transaction(s) ${failedGroup.failedAt?.join(', ') || 'unknown'} in the group. ${failedGroup.failureMessage}`;
736
+ const error = new Error(errorMessage);
737
+ if (config.Config.debug) {
738
+ await config.Config.events.emitAsync(types_lifecycleEvents.EventType.TxnGroupSimulated, { simulateResponse });
739
+ }
694
740
  error.simulateResponse = simulateResponse;
695
741
  throw error;
696
742
  }
743
+ if (config.Config.debug && config.Config.traceAll) {
744
+ await config.Config.events.emitAsync(types_lifecycleEvents.EventType.TxnGroupSimulated, { simulateResponse });
745
+ }
697
746
  const transactions = atc.buildGroup().map((t) => t.txn);
698
747
  return {
699
748
  confirmations: simulateResponse.txnGroups[0].txnResults.map((t) => t.txnResult),
@@ -701,7 +750,7 @@ class AlgoKitComposer {
701
750
  txIds: transactions.map((t) => t.txID()),
702
751
  groupId: Buffer.from(transactions[0].group ?? new Uint8Array()).toString('base64'),
703
752
  simulateResponse,
704
- returns: methodResults.map((m) => m),
753
+ returns: methodResults.map(transaction.getABIReturnValue),
705
754
  };
706
755
  }
707
756
  /**
@@ -718,8 +767,8 @@ class AlgoKitComposer {
718
767
  }
719
768
  }
720
769
  /** Signer used to represent a lack of signer */
721
- AlgoKitComposer.NULL_SIGNER = algosdk.makeEmptyTransactionSigner();
770
+ TransactionComposer.NULL_SIGNER = algosdk.makeEmptyTransactionSigner();
722
771
 
723
772
  exports.MAX_TRANSACTION_GROUP_SIZE = MAX_TRANSACTION_GROUP_SIZE;
724
- exports.default = AlgoKitComposer;
773
+ exports.TransactionComposer = TransactionComposer;
725
774
  //# sourceMappingURL=composer.js.map