@algorandfoundation/algokit-utils 7.0.0 → 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 (148) hide show
  1. package/README.md +14 -3
  2. package/account/account.d.ts +4 -1
  3. package/account/account.js +4 -3
  4. package/account/account.js.map +1 -1
  5. package/account/account.mjs +5 -4
  6. package/account/account.mjs.map +1 -1
  7. package/account/get-dispenser-account.d.ts +1 -1
  8. package/amount.d.ts +1 -0
  9. package/amount.js +3 -2
  10. package/amount.js.map +1 -1
  11. package/amount.mjs +3 -3
  12. package/amount.mjs.map +1 -1
  13. package/app-client.d.ts +4 -4
  14. package/app-client.js +4 -4
  15. package/app-client.js.map +1 -1
  16. package/app-client.mjs +4 -4
  17. package/app-client.mjs.map +1 -1
  18. package/app-deploy.js +23 -5
  19. package/app-deploy.js.map +1 -1
  20. package/app-deploy.mjs +24 -6
  21. package/app-deploy.mjs.map +1 -1
  22. package/app.js +7 -4
  23. package/app.js.map +1 -1
  24. package/app.mjs +7 -4
  25. package/app.mjs.map +1 -1
  26. package/index.js +1 -1
  27. package/index.mjs +2 -2
  28. package/indexer-lookup.d.ts +10 -8
  29. package/indexer-lookup.js +14 -10
  30. package/indexer-lookup.js.map +1 -1
  31. package/indexer-lookup.mjs +14 -10
  32. package/indexer-lookup.mjs.map +1 -1
  33. package/network-client.d.ts +1 -7
  34. package/network-client.js +2 -9
  35. package/network-client.js.map +1 -1
  36. package/network-client.mjs +2 -9
  37. package/network-client.mjs.map +1 -1
  38. package/package.json +2 -2
  39. package/testing/_asset.d.ts +2 -1
  40. package/testing/account.d.ts +4 -3
  41. package/testing/account.js +8 -2
  42. package/testing/account.js.map +1 -1
  43. package/testing/account.mjs +9 -3
  44. package/testing/account.mjs.map +1 -1
  45. package/testing/fixtures/algorand-fixture.js +5 -6
  46. package/testing/fixtures/algorand-fixture.js.map +1 -1
  47. package/testing/fixtures/algorand-fixture.mjs +5 -6
  48. package/testing/fixtures/algorand-fixture.mjs.map +1 -1
  49. package/testing/test-logger.js +7 -1
  50. package/testing/test-logger.js.map +1 -1
  51. package/testing/test-logger.mjs +7 -1
  52. package/testing/test-logger.mjs.map +1 -1
  53. package/transaction/perform-atomic-transaction-composer-simulate.d.ts +4 -1
  54. package/transaction/perform-atomic-transaction-composer-simulate.js +14 -10
  55. package/transaction/perform-atomic-transaction-composer-simulate.js.map +1 -1
  56. package/transaction/perform-atomic-transaction-composer-simulate.mjs +15 -11
  57. package/transaction/perform-atomic-transaction-composer-simulate.mjs.map +1 -1
  58. package/transaction/transaction.d.ts +1 -17
  59. package/transaction/transaction.js +110 -82
  60. package/transaction/transaction.js.map +1 -1
  61. package/transaction/transaction.mjs +112 -83
  62. package/transaction/transaction.mjs.map +1 -1
  63. package/transfer/transfer.js +3 -1
  64. package/transfer/transfer.js.map +1 -1
  65. package/transfer/transfer.mjs +3 -1
  66. package/transfer/transfer.mjs.map +1 -1
  67. package/types/account-manager.d.ts +20 -20
  68. package/types/account-manager.js +27 -20
  69. package/types/account-manager.js.map +1 -1
  70. package/types/account-manager.mjs +28 -21
  71. package/types/account-manager.mjs.map +1 -1
  72. package/types/account.d.ts +8 -8
  73. package/types/account.js +2 -2
  74. package/types/account.js.map +1 -1
  75. package/types/account.mjs +3 -3
  76. package/types/account.mjs.map +1 -1
  77. package/types/algo-http-client-with-retry.d.ts +1 -2
  78. package/types/algo-http-client-with-retry.js +33 -3
  79. package/types/algo-http-client-with-retry.js.map +1 -1
  80. package/types/algo-http-client-with-retry.mjs +32 -2
  81. package/types/algo-http-client-with-retry.mjs.map +1 -1
  82. package/types/algorand-client-transaction-creator.d.ts +11 -11
  83. package/types/algorand-client-transaction-sender.d.ts +97 -97
  84. package/types/algorand-client-transaction-sender.js.map +1 -1
  85. package/types/algorand-client-transaction-sender.mjs.map +1 -1
  86. package/types/algorand-client.d.ts +3 -3
  87. package/types/algorand-client.js +1 -1
  88. package/types/algorand-client.js.map +1 -1
  89. package/types/algorand-client.mjs +1 -1
  90. package/types/algorand-client.mjs.map +1 -1
  91. package/types/app-client.d.ts +280 -279
  92. package/types/app-client.js +10 -10
  93. package/types/app-client.js.map +1 -1
  94. package/types/app-client.mjs +11 -11
  95. package/types/app-client.mjs.map +1 -1
  96. package/types/app-deployer.d.ts +4 -4
  97. package/types/app-deployer.js +22 -23
  98. package/types/app-deployer.js.map +1 -1
  99. package/types/app-deployer.mjs +23 -24
  100. package/types/app-deployer.mjs.map +1 -1
  101. package/types/app-factory.d.ts +128 -138
  102. package/types/app-factory.js +4 -3
  103. package/types/app-factory.js.map +1 -1
  104. package/types/app-factory.mjs +5 -4
  105. package/types/app-factory.mjs.map +1 -1
  106. package/types/app-manager.d.ts +5 -5
  107. package/types/app-manager.js +11 -15
  108. package/types/app-manager.js.map +1 -1
  109. package/types/app-manager.mjs +12 -16
  110. package/types/app-manager.mjs.map +1 -1
  111. package/types/app.d.ts +4 -4
  112. package/types/app.js.map +1 -1
  113. package/types/app.mjs.map +1 -1
  114. package/types/asset-manager.d.ts +5 -5
  115. package/types/asset-manager.js +8 -11
  116. package/types/asset-manager.js.map +1 -1
  117. package/types/asset-manager.mjs +8 -11
  118. package/types/asset-manager.mjs.map +1 -1
  119. package/types/client-manager.d.ts +2 -9
  120. package/types/client-manager.js +9 -19
  121. package/types/client-manager.js.map +1 -1
  122. package/types/client-manager.mjs +9 -19
  123. package/types/client-manager.mjs.map +1 -1
  124. package/types/composer.d.ts +22 -22
  125. package/types/composer.js +73 -83
  126. package/types/composer.js.map +1 -1
  127. package/types/composer.mjs +74 -84
  128. package/types/composer.mjs.map +1 -1
  129. package/types/dispenser-client.d.ts +2 -1
  130. package/types/dispenser-client.js +5 -1
  131. package/types/dispenser-client.js.map +1 -1
  132. package/types/dispenser-client.mjs +5 -1
  133. package/types/dispenser-client.mjs.map +1 -1
  134. package/types/indexer.d.ts +74 -755
  135. package/types/indexer.js.map +1 -1
  136. package/types/indexer.mjs.map +1 -1
  137. package/types/kmd-account-manager.d.ts +2 -2
  138. package/types/kmd-account-manager.js.map +1 -1
  139. package/types/kmd-account-manager.mjs.map +1 -1
  140. package/types/network-client.d.ts +1 -1
  141. package/types/network-client.js.map +1 -1
  142. package/types/network-client.mjs.map +1 -1
  143. package/types/testing.d.ts +5 -6
  144. package/types/urlTokenBaseHTTPClient.d.ts +0 -40
  145. package/types/urlTokenBaseHTTPClient.js +0 -153
  146. package/types/urlTokenBaseHTTPClient.js.map +0 -1
  147. package/types/urlTokenBaseHTTPClient.mjs +0 -151
  148. package/types/urlTokenBaseHTTPClient.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import algosdk from 'algosdk';
1
+ import algosdk, { Address } from 'algosdk';
2
2
  import { Config } from '../config.mjs';
3
3
  import { encodeLease, sendAtomicTransactionComposer, getABIReturnValue } from '../transaction/transaction.mjs';
4
4
  import { APP_PAGE_MAX_SIZE } from './app.mjs';
@@ -8,8 +8,10 @@ import { genesisIdIsLocalNet } from './network-client.mjs';
8
8
 
9
9
  var AtomicTransactionComposer = algosdk.AtomicTransactionComposer;
10
10
  var isTransactionWithSigner = algosdk.isTransactionWithSigner;
11
- var encodeAddress = algosdk.encodeAddress;
12
11
  var modelsv2 = algosdk.modelsv2;
12
+ const address = (address) => {
13
+ return typeof address === 'string' ? Address.fromString(address) : address;
14
+ };
13
15
  const MAX_TRANSACTION_GROUP_SIZE = 16;
14
16
  /** TransactionComposer helps you compose and execute transactions as a transaction group. */
15
17
  class TransactionComposer {
@@ -25,7 +27,7 @@ class TransactionComposer {
25
27
  /** Transactions that have not yet been composed */
26
28
  this.txns = [];
27
29
  /** The default transaction validity window */
28
- this.defaultValidityWindow = 10;
30
+ this.defaultValidityWindow = 10n;
29
31
  /** Whether the validity window was explicitly set on construction */
30
32
  this.defaultValidityWindowIsExplicit = false;
31
33
  this.algod = params.algod;
@@ -45,7 +47,7 @@ class TransactionComposer {
45
47
  addTransaction(transaction, signer) {
46
48
  this.txns.push({
47
49
  txn: transaction,
48
- signer: signer ?? this.getSigner(algosdk.encodeAddress(transaction.from.publicKey)),
50
+ signer: signer ?? this.getSigner(transaction.sender),
49
51
  type: 'txnWithSigner',
50
52
  });
51
53
  return this;
@@ -240,13 +242,11 @@ class TransactionComposer {
240
242
  return this;
241
243
  }
242
244
  /** Build an ATC and return transactions ready to be incorporated into a broader set of transactions this composer is composing */
243
- buildAtc(atc, processTransaction) {
245
+ buildAtc(atc) {
244
246
  const group = atc.buildGroup();
245
247
  const txnWithSigners = group.map((ts, idx) => {
246
248
  // Remove underlying group ID from the transaction since it will be re-grouped when this TransactionComposer is built
247
249
  ts.txn.group = undefined;
248
- // Process transaction if a function is provided
249
- ts.txn = processTransaction?.(ts.txn, idx) ?? ts.txn;
250
250
  // If this was a method call stash the ABIMethod for later
251
251
  if (atc['methodCalls'].get(idx)) {
252
252
  this.txnMethodMap.set(ts.txn.txID(), atc['methodCalls'].get(idx));
@@ -255,39 +255,42 @@ class TransactionComposer {
255
255
  });
256
256
  return txnWithSigners;
257
257
  }
258
- 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 };
259
261
  if (params.lease)
260
- txn.addLease(encodeLease(params.lease));
262
+ txnParams.lease = encodeLease(params.lease);
261
263
  if (params.rekeyTo)
262
- txn.addRekey(params.rekeyTo);
264
+ txnParams.rekeyTo = address(params.rekeyTo);
263
265
  const encoder = new TextEncoder();
264
266
  if (params.note)
265
- 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);
266
268
  if (params.firstValidRound) {
267
- txn.firstRound = Number(params.firstValidRound);
269
+ txnParams.suggestedParams.firstValid = params.firstValidRound;
268
270
  }
269
271
  if (params.lastValidRound) {
270
- txn.lastRound = Number(params.lastValidRound);
272
+ txnParams.suggestedParams.lastValid = params.lastValidRound;
271
273
  }
272
274
  else {
273
275
  // If the validity window isn't set in this transaction or by default and we are pointing at
274
276
  // LocalNet set a bigger window to avoid dead transactions
275
- const window = params.validityWindow ??
276
- (!this.defaultValidityWindowIsExplicit && genesisIdIsLocalNet(suggestedParams.genesisID) ? 1000 : this.defaultValidityWindow);
277
- 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;
278
283
  }
279
284
  if (params.staticFee !== undefined && params.extraFee !== undefined) {
280
285
  throw Error('Cannot set both staticFee and extraFee');
281
286
  }
282
287
  if (params.staticFee !== undefined) {
283
- txn.fee = Number(params.staticFee.microAlgo);
288
+ txnParams.suggestedParams.fee = params.staticFee.microAlgo;
289
+ txnParams.suggestedParams.flatFee = true;
284
290
  }
285
- else {
286
- txn.fee = txn.estimateSize() * suggestedParams.fee || algosdk.ALGORAND_MIN_TX_FEE;
287
- if (params.extraFee)
288
- txn.fee += Number(params.extraFee.microAlgo);
289
- }
290
- txn.flatFee = true;
291
+ const txn = buildTxn(txnParams);
292
+ if (params.extraFee)
293
+ txn.fee += params.extraFee.microAlgo;
291
294
  if (params.maxFee !== undefined && txn.fee > params.maxFee.microAlgo) {
292
295
  throw Error(`Transaction fee ${txn.fee} µALGO is greater than maxFee ${params.maxFee}`);
293
296
  }
@@ -342,7 +345,7 @@ class TransactionComposer {
342
345
  ? 'signer' in params.signer
343
346
  ? params.signer.signer
344
347
  : params.signer
345
- : this.getSigner(encodeAddress(txn.from.publicKey))
348
+ : this.getSigner(txn.sender)
346
349
  : TransactionComposer.NULL_SIGNER,
347
350
  });
348
351
  }
@@ -359,7 +362,7 @@ class TransactionComposer {
359
362
  ? (await this.appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes
360
363
  : params.clearStateProgram
361
364
  : undefined;
362
- methodAtc.addMethodCall({
365
+ const txnParams = {
363
366
  appID: appId,
364
367
  sender: params.sender,
365
368
  suggestedParams,
@@ -394,43 +397,45 @@ class TransactionComposer {
394
397
  note: undefined,
395
398
  lease: undefined,
396
399
  rekeyTo: undefined,
397
- });
400
+ };
401
+ // Build the transaction
402
+ this.commonTxnBuildStep((txnParams) => {
403
+ methodAtc.addMethodCall(txnParams);
404
+ return methodAtc.buildGroup()[methodAtc.count() - 1].txn;
405
+ }, params, txnParams);
398
406
  // Process the ATC to get a set of transactions ready for broader grouping
399
- // and with the common build step to set fees and validity rounds
400
- return this.buildAtc(methodAtc, (txn, idx) => idx === methodAtc.count() - 1 ? this.commonTxnBuildStep(params, txn, suggestedParams) : txn);
407
+ return this.buildAtc(methodAtc);
401
408
  }
402
409
  buildPayment(params, suggestedParams) {
403
- const txn = algosdk.makePaymentTxnWithSuggestedParamsFromObject({
404
- from: params.sender,
405
- to: params.receiver,
410
+ return this.commonTxnBuildStep(algosdk.makePaymentTxnWithSuggestedParamsFromObject, params, {
411
+ sender: params.sender,
412
+ receiver: params.receiver,
406
413
  amount: params.amount.microAlgo,
407
414
  closeRemainderTo: params.closeRemainderTo,
408
415
  suggestedParams,
409
416
  });
410
- return this.commonTxnBuildStep(params, txn, suggestedParams);
411
417
  }
412
418
  buildAssetCreate(params, suggestedParams) {
413
- const txn = algosdk.makeAssetCreateTxnWithSuggestedParamsFromObject({
414
- from: params.sender,
419
+ return this.commonTxnBuildStep(algosdk.makeAssetCreateTxnWithSuggestedParamsFromObject, params, {
420
+ sender: params.sender,
415
421
  total: params.total,
416
422
  decimals: params.decimals ?? 0,
417
423
  assetName: params.assetName,
418
424
  unitName: params.unitName,
419
425
  assetURL: params.url,
420
426
  defaultFrozen: params.defaultFrozen ?? false,
421
- assetMetadataHash: params.metadataHash,
427
+ assetMetadataHash: typeof params.metadataHash === 'string' ? Buffer.from(params.metadataHash, 'utf-8') : params.metadataHash,
422
428
  manager: params.manager,
423
429
  reserve: params.reserve,
424
430
  freeze: params.freeze,
425
431
  clawback: params.clawback,
426
432
  suggestedParams,
427
433
  });
428
- return this.commonTxnBuildStep(params, txn, suggestedParams);
429
434
  }
430
435
  buildAssetConfig(params, suggestedParams) {
431
- const txn = algosdk.makeAssetConfigTxnWithSuggestedParamsFromObject({
432
- from: params.sender,
433
- assetIndex: Number(params.assetId),
436
+ return this.commonTxnBuildStep(algosdk.makeAssetConfigTxnWithSuggestedParamsFromObject, params, {
437
+ sender: params.sender,
438
+ assetIndex: params.assetId,
434
439
  suggestedParams,
435
440
  manager: params.manager,
436
441
  reserve: params.reserve,
@@ -438,40 +443,36 @@ class TransactionComposer {
438
443
  clawback: params.clawback,
439
444
  strictEmptyAddressChecking: false,
440
445
  });
441
- return this.commonTxnBuildStep(params, txn, suggestedParams);
442
446
  }
443
447
  buildAssetDestroy(params, suggestedParams) {
444
- const txn = algosdk.makeAssetDestroyTxnWithSuggestedParamsFromObject({
445
- from: params.sender,
446
- assetIndex: Number(params.assetId),
448
+ return this.commonTxnBuildStep(algosdk.makeAssetDestroyTxnWithSuggestedParamsFromObject, params, {
449
+ sender: params.sender,
450
+ assetIndex: params.assetId,
447
451
  suggestedParams,
448
452
  });
449
- return this.commonTxnBuildStep(params, txn, suggestedParams);
450
453
  }
451
454
  buildAssetFreeze(params, suggestedParams) {
452
- const txn = algosdk.makeAssetFreezeTxnWithSuggestedParamsFromObject({
453
- from: params.sender,
454
- assetIndex: Number(params.assetId),
455
+ return this.commonTxnBuildStep(algosdk.makeAssetFreezeTxnWithSuggestedParamsFromObject, params, {
456
+ sender: params.sender,
457
+ assetIndex: params.assetId,
455
458
  freezeTarget: params.account,
456
- freezeState: params.frozen,
459
+ frozen: params.frozen,
457
460
  suggestedParams,
458
461
  });
459
- return this.commonTxnBuildStep(params, txn, suggestedParams);
460
462
  }
461
463
  buildAssetTransfer(params, suggestedParams) {
462
- const txn = algosdk.makeAssetTransferTxnWithSuggestedParamsFromObject({
463
- from: params.sender,
464
- to: params.receiver,
465
- assetIndex: Number(params.assetId),
464
+ return this.commonTxnBuildStep(algosdk.makeAssetTransferTxnWithSuggestedParamsFromObject, params, {
465
+ sender: params.sender,
466
+ receiver: params.receiver,
467
+ assetIndex: params.assetId,
466
468
  amount: params.amount,
467
469
  suggestedParams,
468
470
  closeRemainderTo: params.closeAssetTo,
469
- revocationTarget: params.clawbackTarget,
471
+ assetSender: params.clawbackTarget,
470
472
  });
471
- return this.commonTxnBuildStep(params, txn, suggestedParams);
472
473
  }
473
474
  async buildAppCall(params, suggestedParams) {
474
- const appId = Number('appId' in params ? params.appId : 0n);
475
+ const appId = 'appId' in params ? params.appId : 0n;
475
476
  const approvalProgram = 'approvalProgram' in params
476
477
  ? typeof params.approvalProgram === 'string'
477
478
  ? (await this.appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes
@@ -483,7 +484,7 @@ class TransactionComposer {
483
484
  : params.clearStateProgram
484
485
  : undefined;
485
486
  const sdkParams = {
486
- from: params.sender,
487
+ sender: params.sender,
487
488
  suggestedParams,
488
489
  appArgs: params.args,
489
490
  onComplete: params.onComplete ?? algosdk.OnApplicationComplete.NoOpOC,
@@ -494,12 +495,11 @@ class TransactionComposer {
494
495
  approvalProgram,
495
496
  clearProgram: clearStateProgram,
496
497
  };
497
- let txn;
498
- if (appId === 0) {
498
+ if (appId === 0n) {
499
499
  if (sdkParams.approvalProgram === undefined || sdkParams.clearProgram === undefined) {
500
500
  throw new Error('approvalProgram and clearStateProgram are required for application creation');
501
501
  }
502
- txn = algosdk.makeApplicationCreateTxnFromObject({
502
+ return this.commonTxnBuildStep(algosdk.makeApplicationCreateTxnFromObject, params, {
503
503
  ...sdkParams,
504
504
  extraPages: 'extraProgramPages' in params
505
505
  ? (params.extraProgramPages ?? Math.floor((approvalProgram.length + clearStateProgram.length) / APP_PAGE_MAX_SIZE))
@@ -513,38 +513,28 @@ class TransactionComposer {
513
513
  });
514
514
  }
515
515
  else {
516
- txn = algosdk.makeApplicationCallTxnFromObject({ ...sdkParams, appIndex: appId });
516
+ return this.commonTxnBuildStep(algosdk.makeApplicationCallTxnFromObject, params, { ...sdkParams, appIndex: appId });
517
517
  }
518
- return this.commonTxnBuildStep(params, txn, suggestedParams);
519
518
  }
520
519
  buildKeyReg(params, suggestedParams) {
521
- let txn;
522
520
  if ('voteKey' in params) {
523
- // algosdk throws when voteFirst is 0, so we need to set it to 1, then switch back to 0 after creating the transaction
524
- const voteFirst = params.voteFirst === 0n ? 1n : params.voteFirst;
525
- txn = algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject({
526
- from: params.sender,
521
+ return this.commonTxnBuildStep(algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject, params, {
522
+ sender: params.sender,
527
523
  voteKey: params.voteKey,
528
524
  selectionKey: params.selectionKey,
529
- voteFirst: Number(voteFirst),
530
- voteLast: Number(params.voteLast),
531
- voteKeyDilution: Number(params.voteKeyDilution),
525
+ voteFirst: params.voteFirst,
526
+ voteLast: params.voteLast,
527
+ voteKeyDilution: params.voteKeyDilution,
532
528
  suggestedParams,
533
529
  nonParticipation: false,
534
530
  stateProofKey: params.stateProofKey,
535
531
  });
536
- if (params.voteFirst === 0n) {
537
- txn.voteFirst = 0;
538
- }
539
- }
540
- else {
541
- txn = algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject({
542
- from: params.sender,
543
- suggestedParams,
544
- nonParticipation: params.preventAccountFromEverParticipatingAgain,
545
- });
546
532
  }
547
- return this.commonTxnBuildStep(params, txn, suggestedParams);
533
+ return this.commonTxnBuildStep(algosdk.makeKeyRegistrationTxnWithSuggestedParamsFromObject, params, {
534
+ sender: params.sender,
535
+ suggestedParams,
536
+ nonParticipation: params.preventAccountFromEverParticipatingAgain,
537
+ });
548
538
  }
549
539
  /** Builds all transaction types apart from `txnWithSigner`, `atc` and `methodCall` since those ones can have custom signers that need to be retrieved. */
550
540
  async buildTxn(txn, suggestedParams) {
@@ -677,9 +667,9 @@ class TransactionComposer {
677
667
  const group = (await this.build()).transactions;
678
668
  let waitRounds = params?.maxRoundsToWaitForConfirmation;
679
669
  if (waitRounds === undefined) {
680
- const lastRound = group.reduce((max, txn) => Math.max(txn.txn.lastRound, max), 0);
681
- const { firstRound } = await this.getSuggestedParams();
682
- 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;
683
673
  }
684
674
  return await sendAtomicTransactionComposer({
685
675
  atc: this.atc,