waitForTransaction method
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),
]);
}
}