From 6cfee7819b43ab94d38bc916a468088681a4b38e Mon Sep 17 00:00:00 2001 From: Jason Elie Bou Kheir <5115126+jasonboukheir@users.noreply.github.com> Date: Wed, 21 Dec 2022 13:18:57 -0800 Subject: [PATCH] feat(accounts): add combined interfaces for `Account` and `Signer` this is useful for abstracting an account that can sign transactions --- .../IWalletConnectAccount.cs | 3 +- Runtime/Algorand.Unity/Accounts/Account.cs | 15 +++++++ .../NodeServices/Kmd/KmdAccount.cs | 3 +- .../Runtime/CallingSmartContractAbi.cs | 41 ++++++++++--------- .../Runtime/SmartContractUI.cs | 16 +++++++- 5 files changed, 52 insertions(+), 26 deletions(-) diff --git a/Runtime/Algorand.Unity.WalletConnect/IWalletConnectAccount.cs b/Runtime/Algorand.Unity.WalletConnect/IWalletConnectAccount.cs index 8bf1d88f3..31b556ec7 100644 --- a/Runtime/Algorand.Unity.WalletConnect/IWalletConnectAccount.cs +++ b/Runtime/Algorand.Unity.WalletConnect/IWalletConnectAccount.cs @@ -3,8 +3,7 @@ namespace Algorand.Unity.WalletConnect { public interface IWalletConnectAccount - : IAsyncSigner - , IAccount + : IAsyncAccountSigner { /// /// The status of the current wallet connected. diff --git a/Runtime/Algorand.Unity/Accounts/Account.cs b/Runtime/Algorand.Unity/Accounts/Account.cs index 8eb59e3f1..cb4bddf95 100644 --- a/Runtime/Algorand.Unity/Accounts/Account.cs +++ b/Runtime/Algorand.Unity/Accounts/Account.cs @@ -14,6 +14,18 @@ public interface IAccount Address Address { get; } } + public interface IAccountSigner : IAccount, ISigner + { + } + + public interface IAsyncAccountSigner : IAccount, IAsyncSigner + { + } + + public interface IAsyncAccountSignerWithProgress : IAccount, IAsyncSignerWithProgress + { + } + /// /// A local, in-memory account. /// @@ -22,6 +34,9 @@ public interface IAccount , ISigner , IAsyncSigner , IAsyncSignerWithProgress + , IAccountSigner + , IAsyncAccountSigner + , IAsyncAccountSignerWithProgress { private readonly PrivateKey privateKey; diff --git a/Runtime/Algorand.Unity/NodeServices/Kmd/KmdAccount.cs b/Runtime/Algorand.Unity/NodeServices/Kmd/KmdAccount.cs index 2b7afd297..a16e6d82d 100644 --- a/Runtime/Algorand.Unity/NodeServices/Kmd/KmdAccount.cs +++ b/Runtime/Algorand.Unity/NodeServices/Kmd/KmdAccount.cs @@ -9,8 +9,7 @@ namespace Algorand.Unity { [Serializable] public struct KmdAccount - : IAccount - , IAsyncSigner + : IAsyncAccountSigner { [SerializeField] private KmdClient client; diff --git a/Samples~/CallingSmartContractAbi/Runtime/CallingSmartContractAbi.cs b/Samples~/CallingSmartContractAbi/Runtime/CallingSmartContractAbi.cs index 1184b566d..52f9e0def 100644 --- a/Samples~/CallingSmartContractAbi/Runtime/CallingSmartContractAbi.cs +++ b/Samples~/CallingSmartContractAbi/Runtime/CallingSmartContractAbi.cs @@ -16,7 +16,7 @@ public class CallingSmartContractAbi : MonoBehaviour public SmartContractUI smartContractUI; - private KmdAccount account; + private IAsyncAccountSigner account; private AlgodClient algod; @@ -41,19 +41,31 @@ private void Awake() indexer = new IndexerClient("http://localhost:8980"); } - private async UniTaskVoid Start() + private void Start() + { + StartAsync().Forget(); + } + + private async UniTaskVoid StartAsync() { smartContractUI.enabled = false; - account = await GetKmdAccount(); - await GetOrCreateContract(); - smartContractUI.account = account; - smartContractUI.algod = algod; - smartContractUI.contractIndex = contractIndex; - smartContractUI.contract = contract; + try + { + account = await GetAccount(); + await GetOrCreateContract(); + smartContractUI.account = account; + smartContractUI.algod = algod; + smartContractUI.contractIndex = contractIndex; + smartContractUI.contract = contract; + } + catch (Exception ex) + { + smartContractUI.error = ex.Message; + } smartContractUI.enabled = true; } - private async UniTask GetKmdAccount() + private async UniTask GetAccount() { var (listWalletsErr, listWalletsResponse) = await kmd.ListWallets(); listWalletsErr.ThrowIfError(); @@ -128,15 +140,4 @@ private async UniTask SendTransaction(byte[] signedTxn) error.ThrowIfError(); return response.TxId; } - - public struct PaymentTxnArgs : IEquatable - { - public Address Receiver; - public MicroAlgos Amount; - - public bool Equals(PaymentTxnArgs other) - { - return Receiver.Equals(other.Receiver) && Amount.Equals(other.Amount); - } - } } diff --git a/Samples~/CallingSmartContractAbi/Runtime/SmartContractUI.cs b/Samples~/CallingSmartContractAbi/Runtime/SmartContractUI.cs index c2e5fd14f..89d597909 100644 --- a/Samples~/CallingSmartContractAbi/Runtime/SmartContractUI.cs +++ b/Samples~/CallingSmartContractAbi/Runtime/SmartContractUI.cs @@ -1,4 +1,3 @@ -using System; using System.Linq; using Algorand.Unity; using Algorand.Unity.Experimental.Abi; @@ -9,10 +8,11 @@ [RequireComponent(typeof(UIDocument))] public class SmartContractUI : MonoBehaviour { - public KmdAccount account { get; set; } + public IAsyncAccountSigner account { get; set; } public AlgodClient algod { get; set; } public AppIndex contractIndex { get; set; } public Contract contract { get; set; } + public string error { get; set; } public UIDocument document { get; protected set; } @@ -30,6 +30,18 @@ private void OnEnable() return; } + if (!string.IsNullOrEmpty(error)) + { + var parent = new VisualElement(); + var title = new Label("An error occurred trying to connect to your Algorand sandbox at localhost."); + var message = new Label(error); + + parent.Add(title); + parent.Add(message); + document.rootVisualElement.Add(parent); + return; + } + if (contractField == null) { contractField = new ContractField(contract, CallContractAsync);