diff --git a/Runtime/CareBoo.AlgoSdk/Services/Algod/AlgodClient.cs b/Runtime/CareBoo.AlgoSdk/Services/Algod/AlgodClient.cs index 25e94d332..5b6d8e667 100644 --- a/Runtime/CareBoo.AlgoSdk/Services/Algod/AlgodClient.cs +++ b/Runtime/CareBoo.AlgoSdk/Services/Algod/AlgodClient.cs @@ -1,6 +1,8 @@ using System; +using System.Threading; using AlgoSdk.Algod; using AlgoSdk.LowLevel; +using Cysharp.Threading.Tasks; using Unity.Collections; using UnityEngine; @@ -55,6 +57,38 @@ public AlgodClient(string address, params Header[] headers) : this(address, null public Header[] Headers => headers; + public AlgoApiRequest.Sent SendTransaction(SignedTxn txn) + where T : struct, ITransaction, IEquatable + { + using var data = AlgoApiSerializer.SerializeMessagePack(txn, Allocator.Persistent); + return RawTransaction(data.ToArray()); + } + + /// + /// Utility method to wait for a transaction to be confirmed given a transaction id. + /// + /// The transaction id to wait for. + /// An optional to control how often this method polls the algod service. + /// An optional token for cancelling this task early. + /// The algod response that either caused an error or showed a confirmed round. + public async UniTask> WaitForConfirmation( + string txid, + Optional pollInterval = default, + CancellationToken cancellationToken = default + ) + { + await UniTask.Delay(TimeSpan.FromSeconds(4), cancellationToken: cancellationToken); + var pollInt = pollInterval.Else(TimeSpan.FromMilliseconds(100)); + var response = await PendingTransactionInformation(txid) + .WithCancellation(cancellationToken); + while (!response.Error && response.Payload.ConfirmedRound == default) + { + await UniTask.Delay(pollInt, cancellationToken: cancellationToken); + response = await PendingTransactionInformation(txid) + .WithCancellation(cancellationToken); + } + return response; + } [Obsolete("Call AlgodClient.GetGenesis instead.")] public AlgoApiRequest.Sent GetGenesisInformation() @@ -155,14 +189,6 @@ public AlgoApiRequest.Sent GetStatusAfterWaitingForRound(ulo return WaitForBlock(round); } - [Obsolete("Call RawTransaction instead.")] - public AlgoApiRequest.Sent SendTransaction(SignedTxn txn) - where T : struct, ITransaction, IEquatable - { - using var data = AlgoApiSerializer.SerializeMessagePack(txn, Allocator.Persistent); - return RawTransaction(data.ToArray()); - } - [Obsolete("Call RawTransaction instead.")] public AlgoApiRequest.Sent SendTransaction(byte[] txn) {