@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
@@ -1,21 +1,22 @@
1
- import algosdk from 'algosdk';
1
+ import algosdk, { Address } from 'algosdk';
2
2
  import { Config } from '../config.mjs';
3
- import { performAtomicTransactionComposerSimulate } from '../transaction/perform-atomic-transaction-composer-simulate.mjs';
4
- import { encodeLease, sendAtomicTransactionComposer } from '../transaction/transaction.mjs';
3
+ import { encodeLease, sendAtomicTransactionComposer, getABIReturnValue } from '../transaction/transaction.mjs';
5
4
  import { APP_PAGE_MAX_SIZE } from './app.mjs';
6
5
  import { AppManager } from './app-manager.mjs';
7
- import { EventType } from './async-event-emitter.mjs';
6
+ import { EventType } from './lifecycle-events.mjs';
8
7
  import { genesisIdIsLocalNet } from './network-client.mjs';
9
8
 
10
9
  var AtomicTransactionComposer = algosdk.AtomicTransactionComposer;
11
10
  var isTransactionWithSigner = algosdk.isTransactionWithSigner;
12
- var encodeAddress = algosdk.encodeAddress;
13
11
  var modelsv2 = algosdk.modelsv2;
12
+ const address = (address) => {
13
+ return typeof address === 'string' ? Address.fromString(address) : address;
14
+ };
14
15
  const MAX_TRANSACTION_GROUP_SIZE = 16;
15
- /** AlgoKit Composer helps you compose and execute transactions as a transaction group. */
16
- class AlgoKitComposer {
16
+ /** TransactionComposer helps you compose and execute transactions as a transaction group. */
17
+ class TransactionComposer {
17
18
  /**
18
- * Create an `AlgoKitComposer`.
19
+ * Create a `TransactionComposer`.
19
20
  * @param params The configuration for this composer
20
21
  */
21
22
  constructor(params) {
@@ -26,7 +27,7 @@ class AlgoKitComposer {
26
27
  /** Transactions that have not yet been composed */
27
28
  this.txns = [];
28
29
  /** The default transaction validity window */
29
- this.defaultValidityWindow = 10;
30
+ this.defaultValidityWindow = 10n;
30
31
  /** Whether the validity window was explicitly set on construction */
31
32
  this.defaultValidityWindowIsExplicit = false;
32
33
  this.algod = params.algod;
@@ -46,7 +47,7 @@ class AlgoKitComposer {
46
47
  addTransaction(transaction, signer) {
47
48
  this.txns.push({
48
49
  txn: transaction,
49
- signer: signer ?? this.getSigner(algosdk.encodeAddress(transaction.from.publicKey)),
50
+ signer: signer ?? this.getSigner(transaction.sender),
50
51
  type: 'txnWithSigner',
51
52
  });
52
53
  return this;
@@ -222,6 +223,15 @@ class AlgoKitComposer {
222
223
  this.txns.push({ ...params, type: 'keyReg' });
223
224
  return this;
224
225
  }
226
+ /**
227
+ * Add an offline key registration transaction to the transaction group.
228
+ * @param params The offline key registration transaction parameters
229
+ * @returns The composer so you can chain method calls
230
+ */
231
+ addOfflineKeyRegistration(params) {
232
+ this.txns.push({ ...params, type: 'keyReg' });
233
+ return this;
234
+ }
225
235
  /**
226
236
  * Add the transactions within an `AtomicTransactionComposer` to the transaction group.
227
237
  * @param atc The `AtomicTransactionComposer` to build transactions from and add to the group
@@ -232,13 +242,11 @@ class AlgoKitComposer {
232
242
  return this;
233
243
  }
234
244
  /** Build an ATC and return transactions ready to be incorporated into a broader set of transactions this composer is composing */
235
- buildAtc(atc, processTransaction) {
245
+ buildAtc(atc) {
236
246
  const group = atc.buildGroup();
237
247
  const txnWithSigners = group.map((ts, idx) => {
238
- // Remove underlying group ID from the transaction since it will be re-grouped when this AlgoKitComposer is built
248
+ // Remove underlying group ID from the transaction since it will be re-grouped when this TransactionComposer is built
239
249
  ts.txn.group = undefined;
240
- // Process transaction if a function is provided
241
- ts.txn = processTransaction?.(ts.txn, idx) ?? ts.txn;
242
250
  // If this was a method call stash the ABIMethod for later
243
251
  if (atc['methodCalls'].get(idx)) {
244
252
  this.txnMethodMap.set(ts.txn.txID(), atc['methodCalls'].get(idx));
@@ -247,39 +255,42 @@ class AlgoKitComposer {
247
255
  });
248
256
  return txnWithSigners;
249
257
  }
250
- commonTxnBuildStep(params, txn, suggestedParams) {
258
+ commonTxnBuildStep(buildTxn, params, txnParams) {
259
+ // We are going to mutate suggested params, let's create a clone first
260
+ txnParams.suggestedParams = { ...txnParams.suggestedParams };
251
261
  if (params.lease)
252
- txn.addLease(encodeLease(params.lease));
262
+ txnParams.lease = encodeLease(params.lease);
253
263
  if (params.rekeyTo)
254
- txn.addRekey(params.rekeyTo);
264
+ txnParams.rekeyTo = address(params.rekeyTo);
255
265
  const encoder = new TextEncoder();
256
266
  if (params.note)
257
- txn.note = typeof params.note === 'string' ? encoder.encode(params.note) : params.note;
267
+ txnParams.note = (typeof params.note === 'string' ? encoder.encode(params.note) : params.note);
258
268
  if (params.firstValidRound) {
259
- txn.firstRound = Number(params.firstValidRound);
269
+ txnParams.suggestedParams.firstValid = params.firstValidRound;
260
270
  }
261
271
  if (params.lastValidRound) {
262
- txn.lastRound = Number(params.lastValidRound);
272
+ txnParams.suggestedParams.lastValid = params.lastValidRound;
263
273
  }
264
274
  else {
265
275
  // If the validity window isn't set in this transaction or by default and we are pointing at
266
276
  // LocalNet set a bigger window to avoid dead transactions
267
- const window = params.validityWindow ??
268
- (!this.defaultValidityWindowIsExplicit && genesisIdIsLocalNet(suggestedParams.genesisID) ? 1000 : this.defaultValidityWindow);
269
- txn.lastRound = txn.firstRound + window;
277
+ const window = params.validityWindow
278
+ ? BigInt(params.validityWindow)
279
+ : !this.defaultValidityWindowIsExplicit && genesisIdIsLocalNet(txnParams.suggestedParams.genesisID ?? 'unknown')
280
+ ? 1000n
281
+ : this.defaultValidityWindow;
282
+ txnParams.suggestedParams.lastValid = BigInt(txnParams.suggestedParams.firstValid) + window;
270
283
  }
271
284
  if (params.staticFee !== undefined && params.extraFee !== undefined) {
272
285
  throw Error('Cannot set both staticFee and extraFee');
273
286
  }
274
287
  if (params.staticFee !== undefined) {
275
- txn.fee = Number(params.staticFee.microAlgo);
276
- }
277
- else {
278
- txn.fee = txn.estimateSize() * suggestedParams.fee || algosdk.ALGORAND_MIN_TX_FEE;
279
- if (params.extraFee)
280
- txn.fee += Number(params.extraFee.microAlgo);
288
+ txnParams.suggestedParams.fee = params.staticFee.microAlgo;
289
+ txnParams.suggestedParams.flatFee = true;
281
290
  }
282
- txn.flatFee = true;
291
+ const txn = buildTxn(txnParams);
292
+ if (params.extraFee)
293
+ txn.fee += params.extraFee.microAlgo;
283
294
  if (params.maxFee !== undefined && txn.fee > params.maxFee.microAlgo) {
284
295
  throw Error(`Transaction fee ${txn.fee} µALGO is greater than maxFee ${params.maxFee}`);
285
296
  }
@@ -292,14 +303,22 @@ class AlgoKitComposer {
292
303
  */
293
304
  async buildMethodCall(params, suggestedParams, includeSigner) {
294
305
  const methodArgs = [];
306
+ const transactionsForGroup = [];
295
307
  const isAbiValue = (x) => {
296
308
  if (Array.isArray(x))
297
309
  return x.length == 0 || x.every(isAbiValue);
298
310
  return typeof x === 'bigint' || typeof x === 'boolean' || typeof x === 'number' || typeof x === 'string' || x instanceof Uint8Array;
299
311
  };
300
- for (let i = 0; i < (params.args ?? []).length; i++) {
312
+ for (let i = (params.args ?? []).length - 1; i >= 0; i--) {
301
313
  const arg = params.args[i];
302
314
  if (arg === undefined) {
315
+ // An undefined transaction argument signals that the value will be supplied by a method call argument
316
+ if (algosdk.abiTypeIsTransaction(params.method.args[i].type) && transactionsForGroup.length > 0) {
317
+ // Move the last transaction from the group to the method call arguments to appease algosdk
318
+ const placeholderTransaction = transactionsForGroup.splice(-1, 1)[0];
319
+ methodArgs.push(placeholderTransaction);
320
+ continue;
321
+ }
303
322
  throw Error(`No value provided for argument ${i + 1} within call to ${params.method.name}`);
304
323
  }
305
324
  if (isAbiValue(arg)) {
@@ -312,7 +331,10 @@ class AlgoKitComposer {
312
331
  }
313
332
  if ('method' in arg) {
314
333
  const tempTxnWithSigners = await this.buildMethodCall(arg, suggestedParams, includeSigner);
315
- methodArgs.push(...tempTxnWithSigners);
334
+ // If there is any transaction args, add to the atc
335
+ // Everything else should be added as method args
336
+ methodArgs.push(...tempTxnWithSigners.slice(-1)); // Add the method call itself as a method arg
337
+ transactionsForGroup.push(...tempTxnWithSigners.slice(0, -1).reverse()); // Add any transaction arguments to the atc
316
338
  continue;
317
339
  }
318
340
  const txn = await arg;
@@ -323,11 +345,12 @@ class AlgoKitComposer {
323
345
  ? 'signer' in params.signer
324
346
  ? params.signer.signer
325
347
  : params.signer
326
- : this.getSigner(encodeAddress(txn.from.publicKey))
327
- : AlgoKitComposer.NULL_SIGNER,
348
+ : this.getSigner(txn.sender)
349
+ : TransactionComposer.NULL_SIGNER,
328
350
  });
329
351
  }
330
352
  const methodAtc = new algosdk.AtomicTransactionComposer();
353
+ transactionsForGroup.reverse().forEach((txn) => methodAtc.addTransaction(txn));
331
354
  const appId = Number('appId' in params ? params.appId : 0n);
332
355
  const approvalProgram = 'approvalProgram' in params
333
356
  ? typeof params.approvalProgram === 'string'
@@ -339,7 +362,7 @@ class AlgoKitComposer {
339
362
  ? (await this.appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes
340
363
  : params.clearStateProgram
341
364
  : undefined;
342
- methodAtc.addMethodCall({
365
+ const txnParams = {
343
366
  appID: appId,
344
367
  sender: params.sender,
345
368
  suggestedParams,
@@ -357,10 +380,10 @@ class AlgoKitComposer {
357
380
  ? Math.floor((approvalProgram.length + (clearStateProgram?.length ?? 0)) / APP_PAGE_MAX_SIZE)
358
381
  : 0
359
382
  : undefined,
360
- numLocalInts: appId === 0 ? ('schema' in params ? params.schema?.localInts ?? 0 : 0) : undefined,
361
- numLocalByteSlices: appId === 0 ? ('schema' in params ? params.schema?.localByteSlices ?? 0 : 0) : undefined,
362
- numGlobalInts: appId === 0 ? ('schema' in params ? params.schema?.globalInts ?? 0 : 0) : undefined,
363
- numGlobalByteSlices: appId === 0 ? ('schema' in params ? params.schema?.globalByteSlices ?? 0 : 0) : undefined,
383
+ numLocalInts: appId === 0 ? ('schema' in params ? (params.schema?.localInts ?? 0) : 0) : undefined,
384
+ numLocalByteSlices: appId === 0 ? ('schema' in params ? (params.schema?.localByteSlices ?? 0) : 0) : undefined,
385
+ numGlobalInts: appId === 0 ? ('schema' in params ? (params.schema?.globalInts ?? 0) : 0) : undefined,
386
+ numGlobalByteSlices: appId === 0 ? ('schema' in params ? (params.schema?.globalByteSlices ?? 0) : 0) : undefined,
364
387
  method: params.method,
365
388
  signer: includeSigner
366
389
  ? params.signer
@@ -368,49 +391,51 @@ class AlgoKitComposer {
368
391
  ? params.signer.signer
369
392
  : params.signer
370
393
  : this.getSigner(params.sender)
371
- : AlgoKitComposer.NULL_SIGNER,
372
- methodArgs: methodArgs,
394
+ : TransactionComposer.NULL_SIGNER,
395
+ methodArgs: methodArgs.reverse(),
373
396
  // note, lease, and rekeyTo are set in the common build step
374
397
  note: undefined,
375
398
  lease: undefined,
376
399
  rekeyTo: undefined,
377
- });
400
+ };
401
+ // Build the transaction
402
+ this.commonTxnBuildStep((txnParams) => {
403
+ methodAtc.addMethodCall(txnParams);
404
+ return methodAtc.buildGroup()[methodAtc.count() - 1].txn;
405
+ }, params, txnParams);
378
406
  // Process the ATC to get a set of transactions ready for broader grouping
379
- // and with the common build step to set fees and validity rounds
380
- return this.buildAtc(methodAtc, (txn, idx) => idx === methodAtc.count() - 1 ? this.commonTxnBuildStep(params, txn, suggestedParams) : txn);
407
+ return this.buildAtc(methodAtc);
381
408
  }
382
409
  buildPayment(params, suggestedParams) {
383
- const txn = algosdk.makePaymentTxnWithSuggestedParamsFromObject({
384
- from: params.sender,
385
- to: params.receiver,
410
+ return this.commonTxnBuildStep(algosdk.makePaymentTxnWithSuggestedParamsFromObject, params, {
411
+ sender: params.sender,
412
+ receiver: params.receiver,
386
413
  amount: params.amount.microAlgo,
387
414
  closeRemainderTo: params.closeRemainderTo,
388
415
  suggestedParams,
389
416
  });
390
- return this.commonTxnBuildStep(params, txn, suggestedParams);
391
417
  }
392
418
  buildAssetCreate(params, suggestedParams) {
393
- const txn = algosdk.makeAssetCreateTxnWithSuggestedParamsFromObject({
394
- from: params.sender,
419
+ return this.commonTxnBuildStep(algosdk.makeAssetCreateTxnWithSuggestedParamsFromObject, params, {
420
+ sender: params.sender,
395
421
  total: params.total,
396
422
  decimals: params.decimals ?? 0,
397
423
  assetName: params.assetName,
398
424
  unitName: params.unitName,
399
425
  assetURL: params.url,
400
426
  defaultFrozen: params.defaultFrozen ?? false,
401
- assetMetadataHash: params.metadataHash,
427
+ assetMetadataHash: typeof params.metadataHash === 'string' ? Buffer.from(params.metadataHash, 'utf-8') : params.metadataHash,
402
428
  manager: params.manager,
403
429
  reserve: params.reserve,
404
430
  freeze: params.freeze,
405
431
  clawback: params.clawback,
406
432
  suggestedParams,
407
433
  });
408
- return this.commonTxnBuildStep(params, txn, suggestedParams);
409
434
  }
410
435
  buildAssetConfig(params, suggestedParams) {
411
- const txn = algosdk.makeAssetConfigTxnWithSuggestedParamsFromObject({
412
- from: params.sender,
413
- assetIndex: Number(params.assetId),
436
+ return this.commonTxnBuildStep(algosdk.makeAssetConfigTxnWithSuggestedParamsFromObject, params, {
437
+ sender: params.sender,
438
+ assetIndex: params.assetId,
414
439
  suggestedParams,
415
440
  manager: params.manager,
416
441
  reserve: params.reserve,
@@ -418,40 +443,36 @@ class AlgoKitComposer {
418
443
  clawback: params.clawback,
419
444
  strictEmptyAddressChecking: false,
420
445
  });
421
- return this.commonTxnBuildStep(params, txn, suggestedParams);
422
446
  }
423
447
  buildAssetDestroy(params, suggestedParams) {
424
- const txn = algosdk.makeAssetDestroyTxnWithSuggestedParamsFromObject({
425
- from: params.sender,
426
- assetIndex: Number(params.assetId),
448
+ return this.commonTxnBuildStep(algosdk.makeAssetDestroyTxnWithSuggestedParamsFromObject, params, {
449
+ sender: params.sender,
450
+ assetIndex: params.assetId,
427
451
  suggestedParams,
428
452
  });
429
- return this.commonTxnBuildStep(params, txn, suggestedParams);
430
453
  }
431
454
  buildAssetFreeze(params, suggestedParams) {
432
- const txn = algosdk.makeAssetFreezeTxnWithSuggestedParamsFromObject({
433
- from: params.sender,
434
- assetIndex: Number(params.assetId),
455
+ return this.commonTxnBuildStep(algosdk.makeAssetFreezeTxnWithSuggestedParamsFromObject, params, {
456
+ sender: params.sender,
457
+ assetIndex: params.assetId,
435
458
  freezeTarget: params.account,
436
- freezeState: params.frozen,
459
+ frozen: params.frozen,
437
460
  suggestedParams,
438
461
  });
439
- return this.commonTxnBuildStep(params, txn, suggestedParams);
440
462
  }
441
463
  buildAssetTransfer(params, suggestedParams) {
442
- const txn = algosdk.makeAssetTransferTxnWithSuggestedParamsFromObject({
443
- from: params.sender,
444
- to: params.receiver,
445
- assetIndex: Number(params.assetId),
464
+ return this.commonTxnBuildStep(algosdk.makeAssetTransferTxnWithSuggestedParamsFromObject, params, {
465
+ sender: params.sender,
466
+ receiver: params.receiver,
467
+ assetIndex: params.assetId,
446
468
  amount: params.amount,
447
469
  suggestedParams,
448
470
  closeRemainderTo: params.closeAssetTo,
449
- revocationTarget: params.clawbackTarget,
471
+ assetSender: params.clawbackTarget,
450
472
  });
451
- return this.commonTxnBuildStep(params, txn, suggestedParams);
452
473
  }
453
474
  async buildAppCall(params, suggestedParams) {
454
- const appId = Number('appId' in params ? params.appId : 0n);
475
+ const appId = 'appId' in params ? params.appId : 0n;
455
476
  const approvalProgram = 'approvalProgram' in params
456
477
  ? typeof params.approvalProgram === 'string'
457
478
  ? (await this.appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes
@@ -463,7 +484,7 @@ class AlgoKitComposer {
463
484
  : params.clearStateProgram
464
485
  : undefined;
465
486
  const sdkParams = {
466
- from: params.sender,
487
+ sender: params.sender,
467
488
  suggestedParams,
468
489
  appArgs: params.args,
469
490
  onComplete: params.onComplete ?? algosdk.OnApplicationComplete.NoOpOC,
@@ -474,32 +495,46 @@ class AlgoKitComposer {
474
495
  approvalProgram,
475
496
  clearProgram: clearStateProgram,
476
497
  };
477
- let txn;
478
- if (appId === 0) {
498
+ if (appId === 0n) {
479
499
  if (sdkParams.approvalProgram === undefined || sdkParams.clearProgram === undefined) {
480
500
  throw new Error('approvalProgram and clearStateProgram are required for application creation');
481
501
  }
482
- txn = algosdk.makeApplicationCreateTxnFromObject({
502
+ return this.commonTxnBuildStep(algosdk.makeApplicationCreateTxnFromObject, params, {
483
503
  ...sdkParams,
484
504
  extraPages: 'extraProgramPages' in params
485
- ? params.extraProgramPages ?? Math.floor((approvalProgram.length + clearStateProgram.length) / APP_PAGE_MAX_SIZE)
505
+ ? (params.extraProgramPages ?? Math.floor((approvalProgram.length + clearStateProgram.length) / APP_PAGE_MAX_SIZE))
486
506
  : 0,
487
- numLocalInts: 'schema' in params ? params.schema?.localInts ?? 0 : 0,
488
- numLocalByteSlices: 'schema' in params ? params.schema?.localByteSlices ?? 0 : 0,
489
- numGlobalInts: 'schema' in params ? params.schema?.globalInts ?? 0 : 0,
490
- numGlobalByteSlices: 'schema' in params ? params.schema?.globalByteSlices ?? 0 : 0,
507
+ numLocalInts: 'schema' in params ? (params.schema?.localInts ?? 0) : 0,
508
+ numLocalByteSlices: 'schema' in params ? (params.schema?.localByteSlices ?? 0) : 0,
509
+ numGlobalInts: 'schema' in params ? (params.schema?.globalInts ?? 0) : 0,
510
+ numGlobalByteSlices: 'schema' in params ? (params.schema?.globalByteSlices ?? 0) : 0,
491
511
  approvalProgram: approvalProgram,
492
512
  clearProgram: clearStateProgram,
493
513
  });
494
514
  }
495
515
  else {
496
- txn = algosdk.makeApplicationCallTxnFromObject({ ...sdkParams, appIndex: appId });
516
+ return this.commonTxnBuildStep(algosdk.makeApplicationCallTxnFromObject, params, { ...sdkParams, appIndex: appId });
497
517
  }
498
- return this.commonTxnBuildStep(params, txn, suggestedParams);
499
518
  }
500
519
  buildKeyReg(params, suggestedParams) {
501
- 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);
502
- return this.commonTxnBuildStep(params, txn, suggestedParams);
520
+ if ('voteKey' in params) {
521
+ return this.commonTxnBuildStep(algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject, params, {
522
+ sender: params.sender,
523
+ voteKey: params.voteKey,
524
+ selectionKey: params.selectionKey,
525
+ voteFirst: params.voteFirst,
526
+ voteLast: params.voteLast,
527
+ voteKeyDilution: params.voteKeyDilution,
528
+ suggestedParams,
529
+ nonParticipation: false,
530
+ stateProofKey: params.stateProofKey,
531
+ });
532
+ }
533
+ return this.commonTxnBuildStep(algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject, params, {
534
+ sender: params.sender,
535
+ suggestedParams,
536
+ nonParticipation: params.preventAccountFromEverParticipatingAgain,
537
+ });
503
538
  }
504
539
  /** Builds all transaction types apart from `txnWithSigner`, `atc` and `methodCall` since those ones can have custom signers that need to be retrieved. */
505
540
  async buildTxn(txn, suggestedParams) {
@@ -565,7 +600,7 @@ class AlgoKitComposer {
565
600
  : [];
566
601
  transactions.push(...transactionsWithSigner.map((ts) => ts.txn));
567
602
  transactionsWithSigner.forEach((ts, idx) => {
568
- if (ts.signer && ts.signer !== AlgoKitComposer.NULL_SIGNER) {
603
+ if (ts.signer && ts.signer !== TransactionComposer.NULL_SIGNER) {
569
604
  signers.set(idx, ts.signer);
570
605
  }
571
606
  });
@@ -632,9 +667,9 @@ class AlgoKitComposer {
632
667
  const group = (await this.build()).transactions;
633
668
  let waitRounds = params?.maxRoundsToWaitForConfirmation;
634
669
  if (waitRounds === undefined) {
635
- const lastRound = group.reduce((max, txn) => Math.max(txn.txn.lastRound, max), 0);
636
- const { firstRound } = await this.getSuggestedParams();
637
- waitRounds = lastRound - firstRound + 1;
670
+ const lastRound = group.reduce((max, txn) => (txn.txn.lastValid > max ? txn.txn.lastValid : BigInt(max)), 0n);
671
+ const { firstValid: firstRound } = await this.getSuggestedParams();
672
+ waitRounds = Number(BigInt(lastRound) - BigInt(firstRound)) + 1;
638
673
  }
639
674
  return await sendAtomicTransactionComposer({
640
675
  atc: this.atc,
@@ -664,10 +699,11 @@ class AlgoKitComposer {
664
699
  // Build the transactions
665
700
  if (options?.skipSignatures) {
666
701
  options.allowEmptySignatures = true;
702
+ options.fixSigners = true;
667
703
  // Build transactions uses empty signers
668
704
  const transactions = await this.buildTransactions();
669
705
  for (const txn of transactions.transactions) {
670
- atc.addTransaction({ txn, signer: AlgoKitComposer.NULL_SIGNER });
706
+ atc.addTransaction({ txn, signer: TransactionComposer.NULL_SIGNER });
671
707
  }
672
708
  atc['methodCalls'] = transactions.methodCalls;
673
709
  }
@@ -675,21 +711,36 @@ class AlgoKitComposer {
675
711
  // Build creates real signatures
676
712
  await this.build();
677
713
  }
678
- if (Config.debug && !Config.traceAll) {
679
- // Dump the traces to a file for use with AlgoKit AVM debugger
680
- // Checks for false on traceAll because it should have been already
681
- // executed above
682
- const simulateResponse = await performAtomicTransactionComposerSimulate(atc, this.algod);
683
- await Config.events.emitAsync(EventType.TxnGroupSimulated, {
684
- simulateResponse,
685
- });
686
- }
687
- const { methodResults, simulateResponse } = await atc.simulate(this.algod, new modelsv2.SimulateRequest({ txnGroups: [], ...options }));
688
- if (simulateResponse && simulateResponse.txnGroups[0].failedAt) {
689
- const error = new Error(`Transaction failed at transaction(s) ${simulateResponse.txnGroups[0].failedAt.join(', ')} in the group. ${simulateResponse.txnGroups.find((x) => x.failureMessage)?.failureMessage}`);
714
+ const { methodResults, simulateResponse } = await atc.simulate(this.algod, new modelsv2.SimulateRequest({
715
+ txnGroups: [],
716
+ ...options,
717
+ ...(Config.debug
718
+ ? {
719
+ allowEmptySignatures: true,
720
+ fixSigners: true,
721
+ allowMoreLogging: true,
722
+ execTraceConfig: new modelsv2.SimulateTraceConfig({
723
+ enable: true,
724
+ scratchChange: true,
725
+ stackChange: true,
726
+ stateChange: true,
727
+ }),
728
+ }
729
+ : undefined),
730
+ }));
731
+ const failedGroup = simulateResponse?.txnGroups[0];
732
+ if (failedGroup?.failureMessage) {
733
+ const errorMessage = `Transaction failed at transaction(s) ${failedGroup.failedAt?.join(', ') || 'unknown'} in the group. ${failedGroup.failureMessage}`;
734
+ const error = new Error(errorMessage);
735
+ if (Config.debug) {
736
+ await Config.events.emitAsync(EventType.TxnGroupSimulated, { simulateResponse });
737
+ }
690
738
  error.simulateResponse = simulateResponse;
691
739
  throw error;
692
740
  }
741
+ if (Config.debug && Config.traceAll) {
742
+ await Config.events.emitAsync(EventType.TxnGroupSimulated, { simulateResponse });
743
+ }
693
744
  const transactions = atc.buildGroup().map((t) => t.txn);
694
745
  return {
695
746
  confirmations: simulateResponse.txnGroups[0].txnResults.map((t) => t.txnResult),
@@ -697,7 +748,7 @@ class AlgoKitComposer {
697
748
  txIds: transactions.map((t) => t.txID()),
698
749
  groupId: Buffer.from(transactions[0].group ?? new Uint8Array()).toString('base64'),
699
750
  simulateResponse,
700
- returns: methodResults.map((m) => m),
751
+ returns: methodResults.map(getABIReturnValue),
701
752
  };
702
753
  }
703
754
  /**
@@ -714,7 +765,7 @@ class AlgoKitComposer {
714
765
  }
715
766
  }
716
767
  /** Signer used to represent a lack of signer */
717
- AlgoKitComposer.NULL_SIGNER = algosdk.makeEmptyTransactionSigner();
768
+ TransactionComposer.NULL_SIGNER = algosdk.makeEmptyTransactionSigner();
718
769
 
719
- export { MAX_TRANSACTION_GROUP_SIZE, AlgoKitComposer as default };
770
+ export { MAX_TRANSACTION_GROUP_SIZE, TransactionComposer };
720
771
  //# sourceMappingURL=composer.mjs.map