diff --git a/src/Packages/Marketplace/README.md b/src/Packages/Marketplace/README.md index c42ab0dd..37bd3f16 100644 --- a/src/Packages/Marketplace/README.md +++ b/src/Packages/Marketplace/README.md @@ -1,65 +1,17 @@ -# Immutable.Marketplace - C# library for Immutable X Marketplace +
+

+ + + +

+
-This C# library provides functionality for interacting with the Immutable X Marketplace, including on-ramp services. +--- -## Version Support +# Immutable Unity SDK - Marketplace -This library supports: +The Immutable SDK Commerce package for Unity simplifies integrating marketplace functionality, such as adding funds to a player's wallet. -- Unity 2020.3 (LTS) and up -- .NET Standard 2.1 / .NET Framework +## Documentation -## Dependencies - -- [UniTask](https://github.com/Cysharp/UniTask) - For asynchronous operations -- Unity Engine - -## Installation - -Add the dependencies to your Unity project. You can do this through the Package Manager or by adding them to your `Packages/manifest.json`: - -```json -{ - "dependencies": { - "com.cysharp.unitask": "https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask", - "com.unity.nuget.newtonsoft-json": "3.0.2" - } -} -``` - -## Usage - -Here's an example of how to use the OnRamp functionality with Immutable Passport: - -```csharp -using Immutable.Marketplace.OnRamp; -using Immutable.Passport; -using Immutable.Passport.Model; -using System.Collections.Generic; -using UnityEngine; - -public class MarketplaceExample : MonoBehaviour -{ - async void Start() - { - string environment = Environment.SANDBOX; - string email = await Passport.Instance.GetEmail(); - List walletAddresses = await Passport.Instance.ZkEvmRequestAccounts(); - - OnRamp onRamp = new OnRamp(environment, email, walletAddresses.FirstOrDefault()); - - try - { - string link = await onRamp.GetLink(); - Debug.Log($"onRamp.GetOnRampLink: {link}"); - - // Open the generated link in the default browser - Application.OpenURL(link); - } - catch (System.Exception e) - { - Debug.LogError($"Error getting on-ramp link: {e.Message}"); - } - } -} -``` \ No newline at end of file +- [Immutable zkEVM Documentation](https://docs.immutable.com/docs/zkEVM/sdks/unity) \ No newline at end of file diff --git a/src/Packages/Passport/README.md b/src/Packages/Passport/README.md index 39eb07e8..094e7cc3 100644 --- a/src/Packages/Passport/README.md +++ b/src/Packages/Passport/README.md @@ -8,9 +8,9 @@ --- -# Immutable Unity SDK +# Immutable Unity SDK - Passport -The Immutable SDK for Unity helps you integrate your game with Immutable Passport. +The Immutable SDK Passport package for Unity helps you integrate your game with Immutable Passport. # Documentation diff --git a/src/Packages/Passport/Runtime/Scripts/Private/Model/Request/InitRequest.cs b/src/Packages/Passport/Runtime/Scripts/Private/Model/Request/InitRequest.cs index 61ceb5ce..da20f9c7 100644 --- a/src/Packages/Passport/Runtime/Scripts/Private/Model/Request/InitRequest.cs +++ b/src/Packages/Passport/Runtime/Scripts/Private/Model/Request/InitRequest.cs @@ -1,5 +1,4 @@ using System; -using Immutable.Passport.Model; namespace Immutable.Passport.Model { diff --git a/src/Packages/Passport/Runtime/Scripts/Private/PassportImpl.cs b/src/Packages/Passport/Runtime/Scripts/Private/PassportImpl.cs index b7437ac7..31e3646f 100644 --- a/src/Packages/Passport/Runtime/Scripts/Private/PassportImpl.cs +++ b/src/Packages/Passport/Runtime/Scripts/Private/PassportImpl.cs @@ -22,16 +22,16 @@ public class PassportImpl { private const string TAG = "[Passport Implementation]"; public readonly IBrowserCommunicationsManager communicationsManager; - private PassportAnalytics analytics = new PassportAnalytics(); + private PassportAnalytics analytics = new(); // Used for device code auth - private DeviceConnectResponse deviceConnectResponse; + private DeviceConnectResponse? deviceConnectResponse; // Used for PKCE - private bool pkceLoginOnly = false; // Used to differentiate between a login and connect - private UniTaskCompletionSource pkceCompletionSource; - private string redirectUri = null; - private string logoutRedirectUri = null; + private bool pkceLoginOnly; // Used to differentiate between a login and connect + private UniTaskCompletionSource? pkceCompletionSource; + private string? redirectUri; + private string? logoutRedirectUri; #if UNITY_ANDROID // Used for the PKCE callback @@ -42,15 +42,15 @@ public class PassportImpl // Used to prevent calling login/connect functions multiple times private bool isLoggedIn = false; - public event OnAuthEventDelegate OnAuthEvent; + public event OnAuthEventDelegate? OnAuthEvent; public PassportImpl(IBrowserCommunicationsManager communicationsManager) { this.communicationsManager = communicationsManager; } - public async UniTask Init(string clientId, string environment, string redirectUri = null, - string logoutRedirectUri = null, string deeplink = null) + public async UniTask Init(string clientId, string environment, string? redirectUri = null, + string? logoutRedirectUri = null, string? deeplink = null) { this.redirectUri = redirectUri; this.logoutRedirectUri = logoutRedirectUri; @@ -85,7 +85,7 @@ public async UniTask Init(string clientId, string environment, string redirectUr } else { - InitRequest request = new InitRequest() + InitRequest request = new InitRequest { clientId = clientId, environment = environment, @@ -113,34 +113,32 @@ public async UniTask Init(string clientId, string environment, string redirectUr public async UniTask Login(bool useCachedSession = false, Nullable timeoutMs = null) { - string functionName = "Login"; if (useCachedSession) { return await Relogin(); } - else + + try { - try - { - Track(PassportAnalytics.EventName.START_LOGIN); - SendAuthEvent(PassportAuthEvent.LoggingIn); - - await InitialiseDeviceCodeAuth(functionName); - await ConfirmCode( - PassportAuthEvent.LoginOpeningBrowser, PassportAuthEvent.PendingBrowserLogin, functionName, - PassportFunction.LOGIN_CONFIRM_CODE, timeoutMs); - - Track(PassportAnalytics.EventName.COMPLETE_LOGIN, success: true); - SendAuthEvent(PassportAuthEvent.LoginSuccess); - isLoggedIn = true; - return true; - } - catch (Exception ex) - { - Track(PassportAnalytics.EventName.COMPLETE_LOGIN, success: false); - SendAuthEvent(PassportAuthEvent.LoginFailed); - throw ex; - } + const string functionName = "Login"; + Track(PassportAnalytics.EventName.START_LOGIN); + SendAuthEvent(PassportAuthEvent.LoggingIn); + + await InitialiseDeviceCodeAuth(functionName); + await ConfirmCode( + PassportAuthEvent.LoginOpeningBrowser, PassportAuthEvent.PendingBrowserLogin, functionName, + PassportFunction.LOGIN_CONFIRM_CODE, timeoutMs); + + Track(PassportAnalytics.EventName.COMPLETE_LOGIN, success: true); + SendAuthEvent(PassportAuthEvent.LoginSuccess); + isLoggedIn = true; + return true; + } + catch (Exception ex) + { + Track(PassportAnalytics.EventName.COMPLETE_LOGIN, success: false); + SendAuthEvent(PassportAuthEvent.LoginFailed); + throw ex; } } @@ -176,49 +174,47 @@ private async UniTask Relogin() return false; } - public async UniTask ConnectImx(bool useCachedSession = false, Nullable timeoutMs = null) + public async UniTask ConnectImx(bool useCachedSession = false, long? timeoutMs = null) { - string functionName = "ConnectImx"; if (useCachedSession) { return await Reconnect(); } - else + + // If the user called Login before and then ConnectImx, there is no point triggering device flow again + bool hasCredsSaved = await HasCredentialsSaved(); + if (hasCredsSaved) { - // If the user called Login before and then ConnectImx, there is no point triggering device flow again - bool hasCredsSaved = await HasCredentialsSaved(); - if (hasCredsSaved) + bool reconnected = await Reconnect(); + if (reconnected) { - bool reconnected = await Reconnect(); - if (reconnected) - { - // Successfully reconnected - return reconnected; - } - // Otherwise fallback to device code flow + // Successfully reconnected + return reconnected; } + // Otherwise fallback to device code flow + } - try - { - Track(PassportAnalytics.EventName.START_CONNECT_IMX); - SendAuthEvent(PassportAuthEvent.ConnectingImx); - - await InitialiseDeviceCodeAuth(functionName); - await ConfirmCode( - PassportAuthEvent.ConnectImxOpeningBrowser, PassportAuthEvent.PendingBrowserLoginAndProviderSetup, - functionName, PassportFunction.CONNECT_CONFIRM_CODE, timeoutMs); - - Track(PassportAnalytics.EventName.COMPLETE_CONNECT_IMX, success: true); - SendAuthEvent(PassportAuthEvent.ConnectImxSuccess); - isLoggedIn = true; - return true; - } - catch (Exception ex) - { - Track(PassportAnalytics.EventName.COMPLETE_CONNECT_IMX, success: false); - SendAuthEvent(PassportAuthEvent.ConnectImxFailed); - throw ex; - } + try + { + const string functionName = "ConnectImx"; + Track(PassportAnalytics.EventName.START_CONNECT_IMX); + SendAuthEvent(PassportAuthEvent.ConnectingImx); + + await InitialiseDeviceCodeAuth(functionName); + await ConfirmCode( + PassportAuthEvent.ConnectImxOpeningBrowser, PassportAuthEvent.PendingBrowserLoginAndProviderSetup, + functionName, PassportFunction.CONNECT_CONFIRM_CODE, timeoutMs); + + Track(PassportAnalytics.EventName.COMPLETE_CONNECT_IMX, success: true); + SendAuthEvent(PassportAuthEvent.ConnectImxSuccess); + isLoggedIn = true; + return true; + } + catch (Exception ex) + { + Track(PassportAnalytics.EventName.COMPLETE_CONNECT_IMX, success: false); + SendAuthEvent(PassportAuthEvent.ConnectImxFailed); + throw ex; } } @@ -274,7 +270,7 @@ private async UniTask InitialiseDeviceCodeAuth(string callingFu private async UniTask ConfirmCode( PassportAuthEvent openingBrowserAuthEvent, PassportAuthEvent pendingAuthEvent, - string callingFunction, string functionToCall, Nullable timeoutMs = null) + string callingFunction, string functionToCall, long? timeoutMs) { if (deviceConnectResponse != null) { @@ -553,9 +549,9 @@ public async UniTask Logout(bool hardLogout = true) { SendAuthEvent(PassportAuthEvent.LoggingOut); - string logoutUrl = await GetLogoutUrl(); if (hardLogout) { + var logoutUrl = await GetLogoutUrl(); OpenUrl(logoutUrl); } @@ -859,10 +855,7 @@ private void TrySetPKCECanceled() private void SendAuthEvent(PassportAuthEvent authEvent) { PassportLogger.Debug($"{TAG} Send auth event: {authEvent}"); - if (OnAuthEvent != null) - { - OnAuthEvent.Invoke(authEvent); - } + OnAuthEvent?.Invoke(authEvent); } protected virtual void OpenUrl(string url) diff --git a/src/Packages/Passport/Runtime/Scripts/Public/Passport.cs b/src/Packages/Passport/Runtime/Scripts/Public/Passport.cs index cdae9617..e5d28579 100644 --- a/src/Packages/Passport/Runtime/Scripts/Public/Passport.cs +++ b/src/Packages/Passport/Runtime/Scripts/Public/Passport.cs @@ -257,7 +257,7 @@ public void SetCallTimeout(int ms) /// /// Returns true if login is successful, otherwise false. /// - public async UniTask Login(bool useCachedSession = false, Nullable timeoutMs = null) + public async UniTask Login(bool useCachedSession = false, long? timeoutMs = null) { return await GetPassportImpl().Login(useCachedSession, timeoutMs); } @@ -268,7 +268,7 @@ public async UniTask Login(bool useCachedSession = false, Nullable t /// If true, the saved access token or refresh token will be used to connect the user. If this fails, it will not fallback to device code auth. /// (Optional) The maximum time, in milliseconds, the function is allowed to take before a TimeoutException is thrown. If not set, the function will wait indefinitely. /// - public async UniTask ConnectImx(bool useCachedSession = false, Nullable timeoutMs = null) + public async UniTask ConnectImx(bool useCachedSession = false, long? timeoutMs = null) { return await GetPassportImpl().ConnectImx(useCachedSession, timeoutMs); }