diff --git a/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerReturnsCached.cs b/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerReturnsCached.cs index a1eccf4b..ddd4716c 100644 --- a/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerReturnsCached.cs +++ b/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerReturnsCached.cs @@ -48,6 +48,11 @@ public Chain GetChain() throw new System.NotImplementedException(); } + public Task GetNativeTokenBalance(string accountAddress) + { + throw new System.NotImplementedException(); + } + public Task GetEtherBalance(string accountAddress) { throw new System.NotImplementedException(); diff --git a/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerReturnsNull.cs b/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerReturnsNull.cs index 2265dca7..d1976298 100644 --- a/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerReturnsNull.cs +++ b/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerReturnsNull.cs @@ -45,6 +45,11 @@ public Chain GetChain() throw new System.NotImplementedException(); } + public Task GetNativeTokenBalance(string accountAddress) + { + throw new System.NotImplementedException(); + } + public Task GetEtherBalance(string accountAddress) { throw new System.NotImplementedException(); diff --git a/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerReturnsProvidedValue.cs b/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerReturnsProvidedValue.cs index 4fd45efd..3617062c 100644 --- a/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerReturnsProvidedValue.cs +++ b/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerReturnsProvidedValue.cs @@ -49,6 +49,11 @@ public Chain GetChain() throw new System.NotImplementedException(); } + public Task GetNativeTokenBalance(string accountAddress) + { + return GetEtherBalance(accountAddress); + } + public async Task GetEtherBalance(string accountAddress) { return new EtherBalance() diff --git a/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerWrongChain.cs b/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerWrongChain.cs index 6c707f97..6e4ddd07 100644 --- a/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerWrongChain.cs +++ b/Assets/SequenceSDK/Marketplace/Mocks/MockIndexerWrongChain.cs @@ -41,6 +41,11 @@ public Chain GetChain() return Chain.None; } + public Task GetNativeTokenBalance(string accountAddress) + { + throw new System.NotImplementedException(); + } + public Task GetEtherBalance(string accountAddress) { throw new System.NotImplementedException(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Common/BoilerplateController.cs b/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Common/BoilerplateController.cs index 8dd8bee5..9b0da63c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Common/BoilerplateController.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Common/BoilerplateController.cs @@ -3,12 +3,10 @@ using Newtonsoft.Json; using Sequence.Boilerplates.Login; using Sequence.Boilerplates.PlayerProfile; -using Sequence.Config; using Sequence.Contracts; using Sequence.EmbeddedWallet; using Sequence.Marketplace; using Sequence.Pay; -using Sequence.Utils.SecureStorage; using UnityEngine; namespace Sequence.Boilerplates @@ -98,22 +96,14 @@ private void HideFeatureSelection() _featureSelection.SetActive(false); } - private void TryRecoverSessionToOpenLoginWindow() + private async void TryRecoverSessionToOpenLoginWindow() { HideFeatureSelection(); - var config = SequenceConfig.GetConfig(); - var storeSessionInfoAndSkipLoginWhenPossible = config.StoreSessionKey(); - var loginHandler = SequenceLogin.GetInstance(); - if (SecureStorageFactory.IsSupportedPlatform() && storeSessionInfoAndSkipLoginWhenPossible) - { - loginHandler.TryToRestoreSession(); - loginHandler.SetupAuthenticator(); - } - else - { - OnFailedToRecoverSession("Secure Storage disabled"); - } + var loginHandler = SequenceLogin.GetInstance(); + var (storageEnabled, wallet) = await loginHandler.TryToRestoreSessionAsync(); + if (!storageEnabled) + OnFailedToRecoverSession("Secure storage is disabled"); } private void OnFailedToRecoverSession(string error) @@ -307,4 +297,4 @@ private async void DoShowCheckoutPanel() new SequenceCheckout(_wallet, Chain.Polygon, saleContract, collection, "1", 1), ShowDefaultWindow); } } -} \ No newline at end of file +} diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceLogin.cs index 65c7a32e..0af9c374 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceLogin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceLogin.cs @@ -157,6 +157,48 @@ public void SetupAuthenticator(IValidator validator = null, IAuthenticator authe _emailConnector = new EmailConnector(_sessionId, _sessionWallet, _connector, _validator); } + /// + /// Recover the current session asynchronously and get the associated wallet. + /// + /// + /// Returns StorageEnabled bool indicating if the SDK is configured to store sessions. + /// Returns Instance of IWallet if the session was recovered. Returns null if no session was found. + /// + public async Task<(bool StorageEnabled, IWallet Wallet)> TryToRestoreSessionAsync() + { + var config = SequenceConfig.GetConfig(); + var storeSessionInfoAndSkipLoginWhenPossible = config.StoreSessionKey(); + if (!SecureStorageFactory.IsSupportedPlatform() || !storeSessionInfoAndSkipLoginWhenPossible) + return (false, null); + + var done = false; + SequenceWallet wallet = null; + SequenceWallet.OnFailedToRecoverSession += HandleFailedToRecover; + SequenceWallet.OnWalletCreated += HandleRecoveredWallet; + + TryToRestoreSession(); + SetupAuthenticator(); + + while (!done) + await Task.Yield(); + + return (true, wallet); + + void HandleRecoveredWallet(SequenceWallet newWallet) + { + wallet = newWallet; + done = true; + + SequenceWallet.OnFailedToRecoverSession -= HandleFailedToRecover; + SequenceWallet.OnWalletCreated -= HandleRecoveredWallet; + } + + void HandleFailedToRecover(string error) + { + HandleRecoveredWallet(null); + } + } + public void TryToRestoreSession() { if (!_storeSessionWallet) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs index 74712aa5..eac2bae6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs @@ -89,10 +89,16 @@ public Chain GetChain() { return ChainDictionaries.ChainById[ChainId]; } + + public Task GetNativeTokenBalance(string accountAddress) + { + return Indexer.GetNativeTokenBalance(ChainId, accountAddress, 0, _customHttpHandler, this); + } + [Obsolete("Call GetNativeTokenBalance instead.")] public Task GetEtherBalance(string accountAddress) { - return Indexer.GetEtherBalance(ChainId, accountAddress, 0, _customHttpHandler, this); + return Indexer.GetNativeTokenBalance(ChainId, accountAddress, 0, _customHttpHandler, this); } public Task GetTokenBalances(GetTokenBalancesArgs args) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs index 0ea0720a..09e4c681 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs @@ -56,6 +56,9 @@ public interface IIndexer /// Retrieve the balance of a network's native token for a given account address /// /// If the network request fails + public Task GetNativeTokenBalance(string accountAddress); + + [Obsolete("Call GetNativeTokenBalance instead.")] public Task GetEtherBalance(string accountAddress); /// diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs index 8e859dcc..d59c19fd 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs @@ -175,14 +175,14 @@ public static async Task GetChainID(BigInteger chainID) [Obsolete] public static async Task GetEtherBalance(BigInteger chainID, string accountAddress) { - return await GetEtherBalance(chainID.ToString(), accountAddress); + return await GetNativeTokenBalance(chainID.ToString(), accountAddress); } /// /// Retrieve the balance of a network's native token for a given account address /// /// If the network request fails - public static async Task GetEtherBalance(string chainID, string accountAddress, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) + public static async Task GetNativeTokenBalance(string chainID, string accountAddress, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) { var responseBody = await HttpPost(chainID, "GetEtherBalance", new GetEtherBalanceArgs(accountAddress), retries, httpHandler, caller); GetEtherBalanceReturn result = BuildResponse(responseBody, caller); diff --git a/Packages/Sequence-Unity/package.json b/Packages/Sequence-Unity/package.json index a813ab1f..7e8e8827 100644 --- a/Packages/Sequence-Unity/package.json +++ b/Packages/Sequence-Unity/package.json @@ -1,6 +1,6 @@ { "name": "xyz.0xsequence.waas-unity", - "version": "4.0.5", + "version": "4.0.6", "displayName": "Sequence Embedded Wallet SDK", "description": "A Unity SDK for Sequence APIs", "unity": "2021.3",