diff --git a/Runtime/Scripts/Tezos/Tezos.cs b/Runtime/Scripts/Tezos/Tezos.cs index bcb70f9f..b6172d04 100644 --- a/Runtime/Scripts/Tezos/Tezos.cs +++ b/Runtime/Scripts/Tezos/Tezos.cs @@ -35,6 +35,7 @@ public Tezos(DAppMetadata providedDAppMetadata = null) }; Wallet = new WalletProvider(dAppMetadata); + Wallet.Connect(WalletProviderType.beacon, false); MessageReceiver = Wallet.MessageReceiver; MessageReceiver.AccountConnected += _ => diff --git a/Runtime/Scripts/Tezos/Wallet/WalletProvider.cs b/Runtime/Scripts/Tezos/Wallet/WalletProvider.cs index f70ee658..59c25d4a 100644 --- a/Runtime/Scripts/Tezos/Wallet/WalletProvider.cs +++ b/Runtime/Scripts/Tezos/Wallet/WalletProvider.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Text.Json; using Beacon.Sdk.Beacon.Sign; +using Beacon.Sdk.Core.Domain.Entities; using TezosSDK.Beacon; using TezosSDK.Helpers; using UnityEngine; @@ -33,22 +34,6 @@ private void InitBeaconConnector() ? unityBeacon.GetComponent() : new GameObject("UnityBeacon").AddComponent(); - // Assign the BeaconConnector depending on the platform. -#if !UNITY_EDITOR && UNITY_WEBGL - _beaconConnector = new BeaconConnectorWebGl(); -#else - _beaconConnector = new BeaconConnectorDotNet(); - (_beaconConnector as BeaconConnectorDotNet)?.SetWalletMessageReceiver(MessageReceiver); - Connect(WalletProviderType.beacon, withRedirectToWallet: false); - - // todo: maybe call RequestTezosPermission from _beaconConnector? - MessageReceiver.PairingCompleted += _ => - { - _beaconConnector.RequestTezosPermission( - networkName: TezosConfig.Instance.Network.ToString(), - networkRPC: TezosConfig.Instance.RpcBaseUrl); - }; -#endif MessageReceiver.HandshakeReceived += handshake => { _handshake = handshake; }; MessageReceiver.AccountConnected += account => { @@ -72,28 +57,35 @@ private void InitBeaconConnector() CoroutineRunner.Instance.StartWrappedCoroutine( new CoroutineWrapper(MessageReceiver.TrackTransaction(transactionHash))); }; + // Assign the BeaconConnector depending on the platform. +#if !UNITY_EDITOR && UNITY_WEBGL + _beaconConnector = new BeaconConnectorWebGl(); +#else + _beaconConnector = new BeaconConnectorDotNet(); + MessageReceiver.PairingCompleted += _ => + { + _beaconConnector.RequestTezosPermission( + networkName: TezosConfig.Instance.Network.ToString(), + networkRPC: TezosConfig.Instance.RpcBaseUrl); + }; + (_beaconConnector as BeaconConnectorDotNet)?.SetWalletMessageReceiver(MessageReceiver); +#endif } - // Below there are some async/wait workarounds and magic numbers, - // we should rewrite the Beacon connector to be coroutine compatible. - private IEnumerator OnOpenWallet(bool withRedirectToWallet) + private IEnumerator OpenWallet(bool withRedirectToWallet) { - if (string.IsNullOrEmpty(_handshake)) - { - //No handshake, Waiting for handshake... - yield return new WaitForSeconds(2.5f); - } + yield return new WaitUntilForSeconds(() => !string.IsNullOrEmpty(_handshake), 2.5f); #if UNITY_ANDROID || UNITY_IOS - if (withRedirectToWallet){ - _beaconConnector.RequestTezosPermission( - networkName: TezosConfig.Instance.Network.ToString(), - networkRPC: TezosConfig.Instance.RpcBaseUrl); - yield return new WaitForSeconds(2.5f); - if (!string.IsNullOrEmpty(_handshake)){ - Application.OpenURL($"tezos://?type=tzip10&data={_handshake}"); - } - } + if (!withRedirectToWallet) yield break; +#if UNITY_IOS + // TODO: improve background peer pairing for iOS, then we can remove this workaround + _beaconConnector.RequestTezosPermission( + networkName: TezosConfig.Instance.Network.ToString(), + networkRPC: TezosConfig.Instance.RpcBaseUrl + ); +#endif + Application.OpenURL($"tezos://?type=tzip10&data={_handshake}"); #endif } @@ -102,16 +94,15 @@ public void OnReady() _beaconConnector.OnReady(); } - public void Connect(WalletProviderType walletProvider, bool withRedirectToWallet) + public void Connect(WalletProviderType walletProvider, bool withRedirectToWallet = true) { _beaconConnector.InitWalletProvider( network: TezosConfig.Instance.Network.ToString(), rpc: TezosConfig.Instance.RpcBaseUrl, walletProviderType: walletProvider, dAppMetadata: _dAppMetadata); - _beaconConnector.ConnectAccount(); - CoroutineRunner.Instance.StartWrappedCoroutine(OnOpenWallet(withRedirectToWallet)); + CoroutineRunner.Instance.StartWrappedCoroutine(OpenWallet(withRedirectToWallet)); } public void Disconnect()