waitForTransaction method

Future<ExecutedTransaction> waitForTransaction(
  1. String digest, {
  2. Duration timeout = const Duration(seconds: 60),
  3. Duration pollInterval = const Duration(milliseconds: 500),
  4. List<String>? readMask,
  5. CancelToken? cancelToken,
})

Poll getTransaction until digest is available or timeout elapses.

Implementation

Future<ExecutedTransaction> waitForTransaction(
  String digest, {
  Duration timeout = const Duration(seconds: 60),
  Duration pollInterval = const Duration(milliseconds: 500),
  List<String>? readMask,
  CancelToken? cancelToken,
}) async {
  if (timeout <= Duration.zero || pollInterval <= Duration.zero) {
    throw ArgumentError('Timeout and poll interval must be positive');
  }
  final elapsed = Stopwatch()..start();
  while (true) {
    if (cancelToken?.isCancelled ?? false) throw cancelToken!.cancelError!;
    final remaining = timeout - elapsed.elapsed;
    if (remaining <= Duration.zero) {
      throw TimeoutException(
        'waitForTransaction($digest) timed out',
        timeout,
      );
    }
    try {
      final request = getTransaction(
        digest,
        readMask: readMask,
        cancelToken: cancelToken,
      ).timeout(remaining);
      final tx = cancelToken == null
          ? await request
          : await Future.any([
              request,
              cancelToken.whenCancel.then<ExecutedTransaction>(
                (error) => throw error,
              ),
            ]);
      if (tx.digest.isNotEmpty) return tx;
    } on SuiTransactionException {
      // Only a missing transaction is retryable; preserve transport failures.
    }
    final delay = timeout - elapsed.elapsed;
    if (delay <= Duration.zero) {
      throw TimeoutException(
        'waitForTransaction($digest) timed out',
        timeout,
      );
    }
    await Future.any<void>([
      Future<void>.delayed(delay < pollInterval ? delay : pollInterval),
      if (cancelToken != null)
        cancelToken.whenCancel.then<void>((error) => throw error),
    ]);
  }
}