From b5356375f1185121a4798a0efbf3e91696a9b59f Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 14 Sep 2023 11:30:11 +0300 Subject: [PATCH 001/167] Revert "automated duplicating imported samples modifications (#595)" This reverts commit a5558941827a91df51e2dd200648dcd13a1231c8. --- .github/workflows/duplicate_sample.yaml | 28 ------------------- duplicate_package_sample.sh | 14 ---------- .../Samples~/Web3.Unity/Prefabs.meta | 8 ------ .../Samples~/Web3.Unity/Scenes.meta | 8 ------ .../Samples~/Web3.Unity/Scripts.meta | 8 ------ .../Samples~/Web3.Unity/Sprites.meta | 8 ------ 6 files changed, 74 deletions(-) delete mode 100644 .github/workflows/duplicate_sample.yaml delete mode 100644 duplicate_package_sample.sh delete mode 100644 src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Prefabs.meta delete mode 100644 src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes.meta delete mode 100644 src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts.meta delete mode 100644 src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Sprites.meta diff --git a/.github/workflows/duplicate_sample.yaml b/.github/workflows/duplicate_sample.yaml deleted file mode 100644 index 793149e56..000000000 --- a/.github/workflows/duplicate_sample.yaml +++ /dev/null @@ -1,28 +0,0 @@ -name: Duplicate-Package-Sample - -on: - push: - branches: - - main - -jobs: - duplicate: - name: duplicate package sample - runs-on: ubuntu-latest - - steps: - - name: Checkout Repository - uses: actions/checkout@v2 - - - name: Run duplicate script file - run: bash ${GITHUB_WORKSPACE}/duplicate_package_sample.sh - - - name: Commit and Push - run: | - git config --global user.email $git_email - git config --global user.name "${{ github.actor }}" - git add ./src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f - git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Package Samples" - git push - env: - git_email: "${{ github.actor }}@users.noreply.github.com" \ No newline at end of file diff --git a/duplicate_package_sample.sh b/duplicate_package_sample.sh deleted file mode 100644 index f3a677742..000000000 --- a/duplicate_package_sample.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -# Specify the source directory and the destination directory -SOURCE_DIRECTORY="src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/" -DESTINATION_DIRECTORY="src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - -# clear destination directory first -rm -r "$DESTINATION_DIRECTORY" - -# Copy source to the destination -cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" - -#add all modified files -git add "src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/." -f \ No newline at end of file diff --git a/src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Prefabs.meta b/src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Prefabs.meta deleted file mode 100644 index 5b35daff8..000000000 --- a/src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Prefabs.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 45a04d2621549e3458049c6c447c3941 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes.meta b/src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes.meta deleted file mode 100644 index 5488a62ed..000000000 --- a/src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f39f8dda9616349489a7803d7e0aff30 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts.meta b/src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts.meta deleted file mode 100644 index 9a1e8b8d4..000000000 --- a/src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: eaef630f284e6e04a88b5939e0eb1cc5 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Sprites.meta b/src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Sprites.meta deleted file mode 100644 index 7175ee89d..000000000 --- a/src/UnityPackages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Sprites.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0c06517aee7843642a091a67c72b1379 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: From e04fa1d4c6b2e7be3bb0aef1a3168418a36710d4 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Wed, 20 Sep 2023 16:11:55 +0300 Subject: [PATCH 002/167] wc integration working --- .../ChainSafe.Gaming.Unity.csproj | 1 + src/UnitySampleProject/Assets/Chain.cs | 29 + src/UnitySampleProject/Assets/Chain.cs.meta | 11 + .../Assets/MainThreadDispatcher.cs | 51 ++ .../Assets/MainThreadDispatcher.cs.meta | 11 + .../Assets/QrCodePreviewer.cs | 24 + .../Assets/QrCodePreviewer.cs.meta | 11 + src/UnitySampleProject/Assets/WCTest.unity | 530 ++++++++++++++++++ .../Assets/WCTest.unity.meta | 7 + .../Assets/WCUnityLogger.cs | 21 + .../Assets/WCUnityLogger.cs.meta | 11 + src/UnitySampleProject/Assets/Wallet.cs | 71 +++ src/UnitySampleProject/Assets/Wallet.cs.meta | 11 + .../Assets/WalletConnectUnity.cs | 187 ++++++ .../Assets/WalletConnectUnity.cs.meta | 11 + 15 files changed, 987 insertions(+) create mode 100644 src/UnitySampleProject/Assets/Chain.cs create mode 100644 src/UnitySampleProject/Assets/Chain.cs.meta create mode 100644 src/UnitySampleProject/Assets/MainThreadDispatcher.cs create mode 100644 src/UnitySampleProject/Assets/MainThreadDispatcher.cs.meta create mode 100644 src/UnitySampleProject/Assets/QrCodePreviewer.cs create mode 100644 src/UnitySampleProject/Assets/QrCodePreviewer.cs.meta create mode 100644 src/UnitySampleProject/Assets/WCTest.unity create mode 100644 src/UnitySampleProject/Assets/WCTest.unity.meta create mode 100644 src/UnitySampleProject/Assets/WCUnityLogger.cs create mode 100644 src/UnitySampleProject/Assets/WCUnityLogger.cs.meta create mode 100644 src/UnitySampleProject/Assets/Wallet.cs create mode 100644 src/UnitySampleProject/Assets/Wallet.cs.meta create mode 100644 src/UnitySampleProject/Assets/WalletConnectUnity.cs create mode 100644 src/UnitySampleProject/Assets/WalletConnectUnity.cs.meta diff --git a/src/ChainSafe.Gaming.Unity/ChainSafe.Gaming.Unity.csproj b/src/ChainSafe.Gaming.Unity/ChainSafe.Gaming.Unity.csproj index 80c5243d5..1a949fb6d 100644 --- a/src/ChainSafe.Gaming.Unity/ChainSafe.Gaming.Unity.csproj +++ b/src/ChainSafe.Gaming.Unity/ChainSafe.Gaming.Unity.csproj @@ -29,6 +29,7 @@ + diff --git a/src/UnitySampleProject/Assets/Chain.cs b/src/UnitySampleProject/Assets/Chain.cs new file mode 100644 index 000000000..4a11eba22 --- /dev/null +++ b/src/UnitySampleProject/Assets/Chain.cs @@ -0,0 +1,29 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public struct Chain +{ + public const string EvmNamespace = "eip155"; + + public static readonly Chain Ethereum = new Chain(EvmNamespace, "1", nameof(Ethereum)); + + public static readonly Chain Goerli = new Chain(EvmNamespace, "5", "Ethereum Goerli"); + + public string ChainNamespace { get; private set; } + + public string ChainId { get; private set; } + + public string Name { get; private set; } + + public string FullChainId => $"{ChainNamespace}:{ChainId}"; + + public Chain(string chainNamespace, string chainId, string name) + { + ChainNamespace = chainNamespace; + + ChainId = chainId; + + Name = name; + } +} diff --git a/src/UnitySampleProject/Assets/Chain.cs.meta b/src/UnitySampleProject/Assets/Chain.cs.meta new file mode 100644 index 000000000..dfbd20db2 --- /dev/null +++ b/src/UnitySampleProject/Assets/Chain.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: de7ed2e45ca6a9d448b9c1c720e5d2f7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/MainThreadDispatcher.cs b/src/UnitySampleProject/Assets/MainThreadDispatcher.cs new file mode 100644 index 000000000..2ba72d356 --- /dev/null +++ b/src/UnitySampleProject/Assets/MainThreadDispatcher.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using UnityEngine; + +public class MainThreadDispatcher : MonoBehaviour +{ + #region Instance + + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] + private static void Init() + { + var obj = new GameObject("Main Thread Dispatcher"); + DontDestroyOnLoad(obj); + Instance = obj.AddComponent(); + } + + public static MainThreadDispatcher Instance { get; private set; } + + #endregion + + private readonly ConcurrentQueue _pending = new ConcurrentQueue(); + + public void Invoke(Action fn) => _pending.Enqueue(fn); + + public static void Enqueue(Action a) + { + if (Instance == null) return; + + Instance.Invoke(a); + } + + private void Update() + { + while (_pending.TryDequeue(out var action)) + { + try + { + action(); + } + + catch (Exception e) + { + Debug.LogError( + $"An error has occurred during processing one of the queued actions in the main thread dispatcher:\n{e}", + this); + } + } + } +} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/MainThreadDispatcher.cs.meta b/src/UnitySampleProject/Assets/MainThreadDispatcher.cs.meta new file mode 100644 index 000000000..d5b73512a --- /dev/null +++ b/src/UnitySampleProject/Assets/MainThreadDispatcher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f068087dcb08d2641a16143b4ab481ee +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/QrCodePreviewer.cs b/src/UnitySampleProject/Assets/QrCodePreviewer.cs new file mode 100644 index 000000000..6fb076998 --- /dev/null +++ b/src/UnitySampleProject/Assets/QrCodePreviewer.cs @@ -0,0 +1,24 @@ +using UnityEngine; +using UnityEngine.UI; + +public class QrCodePreviewer : MonoBehaviour +{ + [SerializeField] private Image _qrCodeImage; + + [SerializeField] private WalletConnectUnity _walletConnect; + + private void Start() + { + _walletConnect.OnConnected += data => + { + Debug.LogError(data.Uri); + }; + + _walletConnect.OnSessionApproved += session => + { + Debug.LogError(session.Peer.PublicKey); + + Debug.LogError(session.Self.PublicKey); + }; + } +} diff --git a/src/UnitySampleProject/Assets/QrCodePreviewer.cs.meta b/src/UnitySampleProject/Assets/QrCodePreviewer.cs.meta new file mode 100644 index 000000000..312ee2bc1 --- /dev/null +++ b/src/UnitySampleProject/Assets/QrCodePreviewer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fb890e484538c444da09be8d0f89dcd8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/WCTest.unity b/src/UnitySampleProject/Assets/WCTest.unity new file mode 100644 index 000000000..6ea0c6df6 --- /dev/null +++ b/src/UnitySampleProject/Assets/WCTest.unity @@ -0,0 +1,530 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &358373747 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 358373750} + - component: {fileID: 358373749} + - component: {fileID: 358373748} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &358373748 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 358373747} + m_Enabled: 1 +--- !u!20 &358373749 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 358373747} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &358373750 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 358373747} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &601964846 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 601964847} + - component: {fileID: 601964849} + - component: {fileID: 601964848} + - component: {fileID: 601964850} + m_Layer: 5 + m_Name: QrImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &601964847 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 601964846} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1333275950} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 750, y: 750} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &601964848 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 601964846} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &601964849 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 601964846} + m_CullTransparentMesh: 1 +--- !u!114 &601964850 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 601964846} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fb890e484538c444da09be8d0f89dcd8, type: 3} + m_Name: + m_EditorClassIdentifier: + _qrCodeImage: {fileID: 601964848} + _walletConnect: {fileID: 1258762730} +--- !u!1 &1258762728 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1258762729} + - component: {fileID: 1258762730} + m_Layer: 0 + m_Name: WCTest + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1258762729 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1258762728} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1258762730 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1258762728} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 475ba7b2c12e60247b357b9311e53d5e, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: f4bff60eb260841f46b1c77588cd8acb + k__BackingField: Web3.Unity + k__BackingField: + Name: Web3.Unity + Description: web3.unity is an open-source gaming SDK written in C# and developed + by ChainSafe Gaming. It connects games built in the Unity game engine to the + blockchain. The library currently supports games built for web browsers (WebGL), + iOS/Android mobile, and desktop. web3.unity is compatible with most EVM-based + chains such as Ethereum, Polygon, Moonbeam, Cronos, Nervos, and Binance Smart + Chain, letting developers easily choose and switch between them to create the + best in-game experience. + Url: https://chainsafe.io/ + Icons: [] + Redirect: + Native: + Universal: + VerifyUrl: +--- !u!1 &1333275946 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1333275950} + - component: {fileID: 1333275949} + - component: {fileID: 1333275948} + - component: {fileID: 1333275947} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1333275947 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333275946} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1333275948 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333275946} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1333275949 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333275946} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1333275950 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1333275946} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 601964847} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1973251817 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1973251820} + - component: {fileID: 1973251819} + - component: {fileID: 1973251818} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1973251818 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1973251817} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1973251819 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1973251817} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1973251820 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1973251817} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/src/UnitySampleProject/Assets/WCTest.unity.meta b/src/UnitySampleProject/Assets/WCTest.unity.meta new file mode 100644 index 000000000..300d3e354 --- /dev/null +++ b/src/UnitySampleProject/Assets/WCTest.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4552617924d2bb441af2d772571bfaa7 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/WCUnityLogger.cs b/src/UnitySampleProject/Assets/WCUnityLogger.cs new file mode 100644 index 000000000..7fcb9d6cb --- /dev/null +++ b/src/UnitySampleProject/Assets/WCUnityLogger.cs @@ -0,0 +1,21 @@ +using System; +using UnityEngine; +using ILogger = WalletConnectSharp.Common.Logging.ILogger; + +public class WCUnityLogger : ILogger +{ + public void Log(string message) + { + MainThreadDispatcher.Enqueue(() => Debug.Log(message)); + } + + public void LogError(string message) + { + MainThreadDispatcher.Enqueue(() => Debug.LogError(message)); + } + + public void LogError(Exception e) + { + MainThreadDispatcher.Enqueue(() => Debug.LogError(e)); + } +} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/WCUnityLogger.cs.meta b/src/UnitySampleProject/Assets/WCUnityLogger.cs.meta new file mode 100644 index 000000000..11f9fc824 --- /dev/null +++ b/src/UnitySampleProject/Assets/WCUnityLogger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f047c918909d28346b84df99549bea90 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/Wallet.cs b/src/UnitySampleProject/Assets/Wallet.cs new file mode 100644 index 000000000..117d78228 --- /dev/null +++ b/src/UnitySampleProject/Assets/Wallet.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Newtonsoft.Json; +using UnityEngine; +using WalletConnectSharp.Sign.Models.Engine; + +[Serializable] +public struct Wallet +{ + [JsonProperty("mobile")] public WalletLink Mobile; + + [JsonProperty("desktop")] public WalletLink Desktop; + + public void OpenDeeplink(ConnectedData data, bool useNative = false) + { + string uri = string.Empty; + +#if UNITY_ANDROID + uri = data.Uri; // Android OS should handle wc: protocol +#elif UNITY_IOS + // on iOS, we need to use one of the wallet links + WalletLink linkData = Application.isMobilePlatform ? Mobile : Desktop; + + var universalUrl = useNative ? linkData.NativeProtocol : linkData.UniversalUrl; + + uri = data.Uri; + + if (!string.IsNullOrWhiteSpace(universalUrl)) + { + uri = data.Uri; + + if (useNative) + uri = $"{universalUrl}//{uri}"; + + else if (universalUrl.EndsWith("/")) + uri = $"{universalUrl}{uri}"; + + else + uri = $"{universalUrl}/{uri}"; + } + + if (string.IsNullOrWhiteSpace(uri)) throw new Exception("Got empty URI when attempting to create WC deeplink"); +#endif + + Debug.Log($"Opening URL {uri}"); + + Application.OpenURL(uri); + } + + public void OpenWallet() + { + WalletLink linkData = Application.isMobilePlatform ? Mobile : Desktop; + + var universalUrl = linkData.UniversalUrl; + + if (string.IsNullOrWhiteSpace(universalUrl)) + throw new Exception("Got empty URI when attempting to create WC deeplink"); + + Application.OpenURL(universalUrl); + } +} + +public struct WalletLink +{ + [JsonProperty("native")] + public string NativeProtocol; + + [JsonProperty("universal")] + public string UniversalUrl; +} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Wallet.cs.meta b/src/UnitySampleProject/Assets/Wallet.cs.meta new file mode 100644 index 000000000..582311b61 --- /dev/null +++ b/src/UnitySampleProject/Assets/Wallet.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d33c8514710630343ac91aaf41761474 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/WalletConnectUnity.cs b/src/UnitySampleProject/Assets/WalletConnectUnity.cs new file mode 100644 index 000000000..b9edc1e38 --- /dev/null +++ b/src/UnitySampleProject/Assets/WalletConnectUnity.cs @@ -0,0 +1,187 @@ +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Newtonsoft.Json; +using UnityEngine; +using UnityEngine.Networking; +using WalletConnectSharp.Common.Logging; +using WalletConnectSharp.Core; +using WalletConnectSharp.Core.Models; +using WalletConnectSharp.Sign; +using WalletConnectSharp.Sign.Models; +using WalletConnectSharp.Sign.Models.Engine; +using WalletConnectSharp.Storage; +using WalletConnectSharp.Storage.Interfaces; + +public class WalletConnectUnity : MonoBehaviour +{ + public delegate void Connected(ConnectedData connectedData); + + public event Connected OnConnected; + + private void InvokeConnected(ConnectedData connectedData) + { + OnConnected?.Invoke(connectedData); + } + + public delegate void SessionApproved(SessionStruct session); + + public event SessionApproved OnSessionApproved; + + private void InvokeSessionApproved(SessionStruct session) + { + OnSessionApproved?.Invoke(session); + } + + [field: SerializeField] public string ProjectId { get; private set; } + [field: SerializeField] public string ProjectName { get; private set; } = "Web3.Unity"; + + [field: SerializeField] + public Metadata ClientMetadata { get; private set; } = new Metadata + { + Name = "Web3.Unity", + //from package.json + Description = "web3.unity is an open-source gaming SDK written in C# and developed by ChainSafe Gaming. It connects games built in the Unity game engine to the blockchain. The library currently supports games built for web browsers (WebGL), iOS/Android mobile, and desktop. web3.unity is compatible with most EVM-based chains such as Ethereum, Polygon, Moonbeam, Cronos, Nervos, and Binance Smart Chain, letting developers easily choose and switch between them to create the best in-game experience.", + Url = "https://chainsafe.io/" + }; + + public WalletConnectCore Core { get; private set; } + + public WalletConnectSignClient SignClient { get; private set; } + + private Dictionary _supportedWallets = new Dictionary(); + + private Wallet _defaultWallet; + + public const string BaseContext = "unity-game"; + + private async void Awake() + { + await Initialize(); + } + + internal async Task Initialize() + { + WCLogger.Logger = new WCUnityLogger(); + + StartCoroutine(FetchSupportedWallets()); + + Core = new WalletConnectCore(new CoreOptions() + { + Name = ProjectName, + ProjectId = ProjectId, + Storage = BuildStorage(), + BaseContext = BaseContext + }); + + await Core.Start(); + + await InitializeSignClient(); + } + + private void Update() + { + if (Input.GetKeyDown(KeyCode.C)) + { + ConnectClient(); + } + } + + public IKeyValueStorage BuildStorage() + { + string path = Path.Combine(Application.persistentDataPath, "wallet_connect.json"); + return new FileSystemStorage(path); + } + + public async Task InitializeSignClient() + { + SignClient = await WalletConnectSignClient.Init(new SignClientOptions() + { + BaseContext = BaseContext, + Core = Core, + Metadata = ClientMetadata, + Name = ProjectName, + ProjectId = ProjectId, + Storage = Core.Storage, + }); + } + + public async Task ConnectClient() + { + RequiredNamespaces requiredNamespaces = new RequiredNamespaces(); + + var methods = new string[] + { + "eth_sendTransaction", + "eth_signTransaction", + "eth_sign", + "personal_sign", + "eth_signTypedData", + }; + + var events = new string[] + { + "chainChanged", "accountsChanged" + }; + + requiredNamespaces.Add(Chain.EvmNamespace, new ProposedNamespace + { + Chains = new string[] + { + Chain.Goerli.FullChainId, + }, + Events = events, + Methods = methods + }); + + //start connecting + ConnectedData connectData = await SignClient.Connect(new ConnectOptions + { + RequiredNamespaces = requiredNamespaces + }); + + InvokeConnected(connectData); + + SessionStruct sessionResult = await connectData.Approval; + + InvokeSessionApproved(sessionResult); + + string nativeUrl = sessionResult.Peer.Metadata.Redirect.Native.Replace("//", string.Empty); + + string defaultWalletId = _supportedWallets.FirstOrDefault(t => t.Value.Mobile.NativeProtocol == nativeUrl || t.Value.Desktop.NativeProtocol == nativeUrl).Key; + + _defaultWallet = _supportedWallets[defaultWalletId]; + + if (Application.isMobilePlatform) + _defaultWallet.OpenDeeplink(connectData); + + return connectData; + } + + private IEnumerator FetchSupportedWallets() + { + using (UnityWebRequest webRequest = UnityWebRequest.Get("https://registry.walletconnect.org/data/wallets.json")) + { + // Request and wait for the desired page. + yield return webRequest.SendWebRequest(); + + if (webRequest.result != UnityWebRequest.Result.Success) + { + Debug.LogError("Error Getting Supported Wallets: " + webRequest.error); + + yield return null; + } + + else + { + var json = webRequest.downloadHandler.text; + + _supportedWallets = JsonConvert.DeserializeObject>(json); + + Debug.Log($"Fetched {_supportedWallets.Count} Supported Wallets."); + } + } + } +} diff --git a/src/UnitySampleProject/Assets/WalletConnectUnity.cs.meta b/src/UnitySampleProject/Assets/WalletConnectUnity.cs.meta new file mode 100644 index 000000000..f629f34aa --- /dev/null +++ b/src/UnitySampleProject/Assets/WalletConnectUnity.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 475ba7b2c12e60247b357b9311e53d5e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From a151490f641751c43ed258f057779e743852acff Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 21 Sep 2023 13:33:02 +0300 Subject: [PATCH 003/167] signing/transacting implemented --- .../Assets/QrCodePreviewer.cs | 7 +- src/UnitySampleProject/Assets/Transaction.cs | 39 +++++++++++ .../Assets/Transaction.cs.meta | 11 +++ .../Assets/WalletConnectSigner.cs | 67 +++++++++++++++++++ .../Assets/WalletConnectSigner.cs.meta | 11 +++ 5 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 src/UnitySampleProject/Assets/Transaction.cs create mode 100644 src/UnitySampleProject/Assets/Transaction.cs.meta create mode 100644 src/UnitySampleProject/Assets/WalletConnectSigner.cs create mode 100644 src/UnitySampleProject/Assets/WalletConnectSigner.cs.meta diff --git a/src/UnitySampleProject/Assets/QrCodePreviewer.cs b/src/UnitySampleProject/Assets/QrCodePreviewer.cs index 6fb076998..3583dfa53 100644 --- a/src/UnitySampleProject/Assets/QrCodePreviewer.cs +++ b/src/UnitySampleProject/Assets/QrCodePreviewer.cs @@ -16,9 +16,12 @@ private void Start() _walletConnect.OnSessionApproved += session => { - Debug.LogError(session.Peer.PublicKey); + MainThreadDispatcher.Instance.Invoke(delegate + { + Debug.LogError(session.Peer.PublicKey); - Debug.LogError(session.Self.PublicKey); + Debug.LogError(session.Self.PublicKey); + }); }; } } diff --git a/src/UnitySampleProject/Assets/Transaction.cs b/src/UnitySampleProject/Assets/Transaction.cs new file mode 100644 index 000000000..d56b276c6 --- /dev/null +++ b/src/UnitySampleProject/Assets/Transaction.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using UnityEngine.Scripting; +using WalletConnectSharp.Common.Utils; +using WalletConnectSharp.Network.Models; + +public class Transaction +{ + [JsonProperty("from")] + public string From { get; set; } + + [JsonProperty("to")] + public string To { get; set; } + + [JsonProperty("gas", NullValueHandling = NullValueHandling.Ignore)] + public string Gas { get; set; } + + [JsonProperty("gasPrice", NullValueHandling = NullValueHandling.Ignore)] + public string GasPrice { get; set; } + + [JsonProperty("value")] + public string Value { get; set; } + + [JsonProperty("data", NullValueHandling = NullValueHandling.Ignore)] + public string Data { get; set; } = "0x"; +} + +[RpcMethod("eth_sendTransaction"), RpcRequestOptions(Clock.ONE_MINUTE, 99997)] +public class EthSendTransaction : List +{ + public EthSendTransaction(params Transaction[] transactions) : base(transactions) + { + } + + [Preserve] //Needed for JSON.NET serialization + public EthSendTransaction() + { + } +} diff --git a/src/UnitySampleProject/Assets/Transaction.cs.meta b/src/UnitySampleProject/Assets/Transaction.cs.meta new file mode 100644 index 000000000..66247ed81 --- /dev/null +++ b/src/UnitySampleProject/Assets/Transaction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 47ef6f5b2ca190e4cbde0751e87f75cd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/WalletConnectSigner.cs b/src/UnitySampleProject/Assets/WalletConnectSigner.cs new file mode 100644 index 000000000..5c22fa4df --- /dev/null +++ b/src/UnitySampleProject/Assets/WalletConnectSigner.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using UnityEngine; +using WalletConnectSharp.Common.Utils; +using WalletConnectSharp.Network.Models; +using WalletConnectSharp.Sign.Models; + +public class WalletConnectSigner : MonoBehaviour +{ + [SerializeField] private WalletConnectUnity _walletConnect; + + public async void SendSignRequest() + { + var (session, address, chainId) = GetCurrentAddress(); + if (string.IsNullOrWhiteSpace(address)) + return; + + var request = new EthSendTransaction(new Transaction() + { + From = address, + To = address, + Value = "0" + }); + + var result = + await _walletConnect.SignClient.Request(session.Topic, request, chainId); + + MainThreadDispatcher.Instance.Invoke(delegate + { + Debug.LogError("Got result from request: " + result); + }); + } + + public (SessionStruct, string, string) GetCurrentAddress() + { + var currentSession = _walletConnect.SignClient.Session.Get(_walletConnect.SignClient.Session.Keys[0]); + + var defaultChain = currentSession.Namespaces.Keys.FirstOrDefault(); + + if (string.IsNullOrWhiteSpace(defaultChain)) + return (default, null, null); + + var defaultNamespace = currentSession.Namespaces[defaultChain]; + + if (defaultNamespace.Accounts.Length == 0) + return (default, null, null); + + var fullAddress = defaultNamespace.Accounts[0]; + var addressParts = fullAddress.Split(":"); + + var address = addressParts[2]; + var chainId = string.Join(':', addressParts.Take(2)); + + return (currentSession, address, chainId); + } + + private void Update() + { + if (Input.GetKeyDown(KeyCode.S)) + { + SendSignRequest(); + } + } +} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/WalletConnectSigner.cs.meta b/src/UnitySampleProject/Assets/WalletConnectSigner.cs.meta new file mode 100644 index 000000000..2bac4b8be --- /dev/null +++ b/src/UnitySampleProject/Assets/WalletConnectSigner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dea1e9b9b510e914bbb475034d6f8016 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 6ee5df758925ef56ea4ef5ced3f1131f2a743bd6 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 21 Sep 2023 14:29:15 +0300 Subject: [PATCH 004/167] checkpoint --- src/ChainSafe.Gaming.Unity/ChainSafe.Gaming.Unity.csproj | 1 - .../ChainSafe.Gaming.WebPageWallet.csproj | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ChainSafe.Gaming.Unity/ChainSafe.Gaming.Unity.csproj b/src/ChainSafe.Gaming.Unity/ChainSafe.Gaming.Unity.csproj index 1a949fb6d..80c5243d5 100644 --- a/src/ChainSafe.Gaming.Unity/ChainSafe.Gaming.Unity.csproj +++ b/src/ChainSafe.Gaming.Unity/ChainSafe.Gaming.Unity.csproj @@ -29,7 +29,6 @@ - diff --git a/src/ChainSafe.Gaming.WebPageWallet/ChainSafe.Gaming.WebPageWallet.csproj b/src/ChainSafe.Gaming.WebPageWallet/ChainSafe.Gaming.WebPageWallet.csproj index 2419a9997..547f8fab6 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/ChainSafe.Gaming.WebPageWallet.csproj +++ b/src/ChainSafe.Gaming.WebPageWallet/ChainSafe.Gaming.WebPageWallet.csproj @@ -19,6 +19,7 @@ + From 26cd014754b360131240ee00901aa83a9a6f56e0 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 21 Sep 2023 23:27:22 +0300 Subject: [PATCH 005/167] checkpoint --- src/UnitySampleProject/Assets/Transaction.cs | 16 ++++++++ src/UnitySampleProject/Assets/WCTest.unity | 14 +++++++ .../Assets/WalletConnectSigner.cs | 40 ++++++++++++++++--- .../Assets/WalletConnectUnity.cs | 6 +-- 4 files changed, 67 insertions(+), 9 deletions(-) diff --git a/src/UnitySampleProject/Assets/Transaction.cs b/src/UnitySampleProject/Assets/Transaction.cs index d56b276c6..a86d4848f 100644 --- a/src/UnitySampleProject/Assets/Transaction.cs +++ b/src/UnitySampleProject/Assets/Transaction.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Numerics; using Newtonsoft.Json; using UnityEngine.Scripting; using WalletConnectSharp.Common.Utils; @@ -37,3 +38,18 @@ public EthSendTransaction() { } } + +[RpcMethod("personal_sign"), RpcRequestOptions(Clock.ONE_MINUTE, 99998)] +public class EthSignMessage : List +{ + public EthSignMessage(string message, string address) : base(new string[]{message, address}) + { + + } + + [Preserve] //Needed for JSON.NET serialization + public EthSignMessage() + { + + } +} diff --git a/src/UnitySampleProject/Assets/WCTest.unity b/src/UnitySampleProject/Assets/WCTest.unity index 6ea0c6df6..24b7dbdb2 100644 --- a/src/UnitySampleProject/Assets/WCTest.unity +++ b/src/UnitySampleProject/Assets/WCTest.unity @@ -308,6 +308,7 @@ GameObject: m_Component: - component: {fileID: 1258762729} - component: {fileID: 1258762730} + - component: {fileID: 1258762731} m_Layer: 0 m_Name: WCTest m_TagString: Untagged @@ -359,6 +360,19 @@ MonoBehaviour: Native: Universal: VerifyUrl: +--- !u!114 &1258762731 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1258762728} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dea1e9b9b510e914bbb475034d6f8016, type: 3} + m_Name: + m_EditorClassIdentifier: + _walletConnect: {fileID: 1258762730} --- !u!1 &1333275946 GameObject: m_ObjectHideFlags: 0 diff --git a/src/UnitySampleProject/Assets/WalletConnectSigner.cs b/src/UnitySampleProject/Assets/WalletConnectSigner.cs index 5c22fa4df..6031c2cd5 100644 --- a/src/UnitySampleProject/Assets/WalletConnectSigner.cs +++ b/src/UnitySampleProject/Assets/WalletConnectSigner.cs @@ -7,12 +7,23 @@ using WalletConnectSharp.Common.Utils; using WalletConnectSharp.Network.Models; using WalletConnectSharp.Sign.Models; +using WalletConnectSharp.Sign.Models.Engine; public class WalletConnectSigner : MonoBehaviour { [SerializeField] private WalletConnectUnity _walletConnect; + + private ConnectedData _cachedConnectedData; - public async void SendSignRequest() + private void Start() + { + _walletConnect.OnConnected += data => + { + _cachedConnectedData = data; + }; + } + + public async void SendTransaction(string to, string value) { var (session, address, chainId) = GetCurrentAddress(); if (string.IsNullOrWhiteSpace(address)) @@ -21,16 +32,33 @@ public async void SendSignRequest() var request = new EthSendTransaction(new Transaction() { From = address, - To = address, - Value = "0" + To = to, + Value = value }); - + var result = await _walletConnect.SignClient.Request(session.Topic, request, chainId); MainThreadDispatcher.Instance.Invoke(delegate { - Debug.LogError("Got result from request: " + result); + Debug.Log($"eth_sendTransaction result: {result}"); + }); + } + + public async void SignMessage(string message) + { + var (session, address, chainId) = GetCurrentAddress(); + if (string.IsNullOrWhiteSpace(address)) + return; + + var request = new EthSignMessage(message, address); + + var result = + await _walletConnect.SignClient.Request(session.Topic, request, chainId); + + MainThreadDispatcher.Instance.Invoke(delegate + { + Debug.Log($"personal_sign result: {result}"); }); } @@ -61,7 +89,7 @@ private void Update() { if (Input.GetKeyDown(KeyCode.S)) { - SendSignRequest(); + SignMessage("message to sign"); } } } \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/WalletConnectUnity.cs b/src/UnitySampleProject/Assets/WalletConnectUnity.cs index b9edc1e38..b3d786a1f 100644 --- a/src/UnitySampleProject/Assets/WalletConnectUnity.cs +++ b/src/UnitySampleProject/Assets/WalletConnectUnity.cs @@ -120,17 +120,17 @@ public async Task ConnectClient() "personal_sign", "eth_signTypedData", }; - + var events = new string[] { "chainChanged", "accountsChanged" }; - + requiredNamespaces.Add(Chain.EvmNamespace, new ProposedNamespace { Chains = new string[] { - Chain.Goerli.FullChainId, + Chain.Goerli.FullChainId }, Events = events, Methods = methods From 0cb3645ce107ff2f916b2dd77643c089012fb149 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 22 Sep 2023 13:26:49 +0300 Subject: [PATCH 006/167] checkpoint --- .../Runtime/Scripts/MainThreadDispatcher.cs | 54 ++ .../Scripts}/MainThreadDispatcher.cs.meta | 0 .../Runtime/Scripts/WalletConnect.meta | 3 +- .../Scripts/WalletConnect/UnityWallet.cs | 61 ++ .../Scripts/WalletConnect/UnityWallet.cs.meta | 0 .../Scripts/WalletConnect/WCUnityLogger.cs | 24 + .../WalletConnect}/WCUnityLogger.cs.meta | 0 .../ChainSafe.Gaming.WebPageWallet.csproj | 7 +- .../WalletConnect/Chain.cs | 28 + .../WalletConnect/Methods/EthSignMessage.cs | 22 + .../WalletConnect/Wallet.cs | 19 + .../WalletConnect/WalletConnectConfig.cs | 26 + .../WalletConnect/WalletConnectUnity.cs | 123 ++++ .../WalletConnect/WalletLink.cs | 13 + .../WebPageWallet.cs | 101 +++- .../WebPageWalletConfig.cs | 3 + src/UnitySampleProject/Assets/Chain.cs | 29 - src/UnitySampleProject/Assets/Chain.cs.meta | 11 - .../Assets/MainThreadDispatcher.cs | 51 -- .../Assets/QrCodePreviewer.cs | 27 - .../Scenes/SampleLogin.unity | 69 +++ .../Scripts/Scenes/Login.cs | 92 ++- .../Scripts/Utilities/QrCodePreviewer.cs | 50 ++ .../Utilities}/QrCodePreviewer.cs.meta | 0 src/UnitySampleProject/Assets/Transaction.cs | 55 -- .../Assets/Transaction.cs.meta | 11 - src/UnitySampleProject/Assets/WCTest.unity | 544 ------------------ .../Assets/WCUnityLogger.cs | 21 - src/UnitySampleProject/Assets/Wallet.cs | 71 --- .../Assets/WalletConnectSigner.cs | 95 --- .../Assets/WalletConnectSigner.cs.meta | 11 - .../Assets/WalletConnectUnity.cs | 187 ------ .../Assets/WalletConnectUnity.cs.meta | 11 - 33 files changed, 678 insertions(+), 1141 deletions(-) create mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs rename {src/UnitySampleProject/Assets => Packages/io.chainsafe.web3-unity/Runtime/Scripts}/MainThreadDispatcher.cs.meta (100%) rename src/UnitySampleProject/Assets/WCTest.unity.meta => Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect.meta (67%) create mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWallet.cs rename src/UnitySampleProject/Assets/Wallet.cs.meta => Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWallet.cs.meta (100%) create mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs rename {src/UnitySampleProject/Assets => Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect}/WCUnityLogger.cs.meta (100%) create mode 100644 src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Chain.cs create mode 100644 src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignMessage.cs create mode 100644 src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Wallet.cs create mode 100644 src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs create mode 100644 src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs create mode 100644 src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletLink.cs delete mode 100644 src/UnitySampleProject/Assets/Chain.cs delete mode 100644 src/UnitySampleProject/Assets/Chain.cs.meta delete mode 100644 src/UnitySampleProject/Assets/MainThreadDispatcher.cs delete mode 100644 src/UnitySampleProject/Assets/QrCodePreviewer.cs create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs rename src/UnitySampleProject/Assets/{ => Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities}/QrCodePreviewer.cs.meta (100%) delete mode 100644 src/UnitySampleProject/Assets/Transaction.cs delete mode 100644 src/UnitySampleProject/Assets/Transaction.cs.meta delete mode 100644 src/UnitySampleProject/Assets/WCTest.unity delete mode 100644 src/UnitySampleProject/Assets/WCUnityLogger.cs delete mode 100644 src/UnitySampleProject/Assets/Wallet.cs delete mode 100644 src/UnitySampleProject/Assets/WalletConnectSigner.cs delete mode 100644 src/UnitySampleProject/Assets/WalletConnectSigner.cs.meta delete mode 100644 src/UnitySampleProject/Assets/WalletConnectUnity.cs delete mode 100644 src/UnitySampleProject/Assets/WalletConnectUnity.cs.meta diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs new file mode 100644 index 000000000..03626c3fc --- /dev/null +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using UnityEngine; + +namespace Web3Unity.Scripts +{ + public class MainThreadDispatcher : MonoBehaviour + { + #region Instance + + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] + private static void Init() + { + var obj = new GameObject("Main Thread Dispatcher"); + DontDestroyOnLoad(obj); + Instance = obj.AddComponent(); + } + + public static MainThreadDispatcher Instance { get; private set; } + + #endregion + + private readonly ConcurrentQueue _pending = new ConcurrentQueue(); + + public void Invoke(Action fn) => _pending.Enqueue(fn); + + public static void Enqueue(Action a) + { + if (Instance == null) return; + + Instance.Invoke(a); + } + + private void Update() + { + while (_pending.TryDequeue(out var action)) + { + try + { + action(); + } + + catch (Exception e) + { + Debug.LogError( + $"An error has occurred during processing one of the queued actions in the main thread dispatcher:\n{e}", + this); + } + } + } + } +} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/MainThreadDispatcher.cs.meta b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs.meta similarity index 100% rename from src/UnitySampleProject/Assets/MainThreadDispatcher.cs.meta rename to Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs.meta diff --git a/src/UnitySampleProject/Assets/WCTest.unity.meta b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect.meta similarity index 67% rename from src/UnitySampleProject/Assets/WCTest.unity.meta rename to Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect.meta index 300d3e354..9ee791f1c 100644 --- a/src/UnitySampleProject/Assets/WCTest.unity.meta +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect.meta @@ -1,5 +1,6 @@ fileFormatVersion: 2 -guid: 4552617924d2bb441af2d772571bfaa7 +guid: 059adb9b73c08dc4085f23fcce99b636 +folderAsset: yes DefaultImporter: externalObjects: {} userData: diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWallet.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWallet.cs new file mode 100644 index 000000000..6bf559ff3 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWallet.cs @@ -0,0 +1,61 @@ +using System; +using ChainSafe.Gaming.Wallets.WalletConnect; +using UnityEngine; +using WalletConnectSharp.Sign.Models.Engine; + +namespace Web3Unity.Scripts.WalletConnect +{ + [Serializable] + public class UnityWallet : Wallet + { + public override void OpenDeeplink(ConnectedData data, bool useNative = false) + { + string uri = string.Empty; + +#if UNITY_ANDROID + uri = data.Uri; // Android OS should handle wc: protocol +#elif UNITY_IOS + // on iOS, we need to use one of the wallet links + WalletLink linkData = Application.isMobilePlatform ? Mobile : Desktop; + + var universalUrl = useNative ? linkData.NativeProtocol : linkData.UniversalUrl; + + uri = data.Uri; + + if (!string.IsNullOrWhiteSpace(universalUrl)) + { + uri = data.Uri; + + if (useNative) + uri = $"{universalUrl}//{uri}"; + + else if (universalUrl.EndsWith("/")) + uri = $"{universalUrl}{uri}"; + + else + uri = $"{universalUrl}/{uri}"; + } + + if (string.IsNullOrWhiteSpace(uri)) throw new Exception("Got empty URI when attempting to create WC deeplink"); +#endif + MainThreadDispatcher.Instance.Invoke(delegate + { + Debug.Log($"Opening URL {uri}"); + }); + + Application.OpenURL(uri); + } + + public override void OpenWallet() + { + WalletLink linkData = Application.isMobilePlatform ? Mobile : Desktop; + + var universalUrl = linkData.UniversalUrl; + + if (string.IsNullOrWhiteSpace(universalUrl)) + throw new Exception("Got empty URI when attempting to create WC deeplink"); + + Application.OpenURL(universalUrl); + } + } +} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Wallet.cs.meta b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWallet.cs.meta similarity index 100% rename from src/UnitySampleProject/Assets/Wallet.cs.meta rename to Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWallet.cs.meta diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs new file mode 100644 index 000000000..f3892c663 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs @@ -0,0 +1,24 @@ +using System; +using UnityEngine; +using ILogger = WalletConnectSharp.Common.Logging.ILogger; + +namespace Web3Unity.Scripts.WalletConnect +{ + public class WCUnityLogger : ILogger + { + public void Log(string message) + { + MainThreadDispatcher.Enqueue(() => Debug.Log(message)); + } + + public void LogError(string message) + { + MainThreadDispatcher.Enqueue(() => Debug.LogError(message)); + } + + public void LogError(Exception e) + { + MainThreadDispatcher.Enqueue(() => Debug.LogError(e)); + } + } +} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/WCUnityLogger.cs.meta b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs.meta similarity index 100% rename from src/UnitySampleProject/Assets/WCUnityLogger.cs.meta rename to Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs.meta diff --git a/src/ChainSafe.Gaming.WebPageWallet/ChainSafe.Gaming.WebPageWallet.csproj b/src/ChainSafe.Gaming.WebPageWallet/ChainSafe.Gaming.WebPageWallet.csproj index 547f8fab6..d76517bf2 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/ChainSafe.Gaming.WebPageWallet.csproj +++ b/src/ChainSafe.Gaming.WebPageWallet/ChainSafe.Gaming.WebPageWallet.csproj @@ -2,10 +2,9 @@ netstandard2.1 - enable 9.0 ChainSafe.Gaming.WebPageWallet - True + False True ../../global.ruleset ChainSafe.Gaming.MetaMaskBrowserWallet @@ -27,4 +26,8 @@ + + + + diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Chain.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Chain.cs new file mode 100644 index 000000000..8b5498c35 --- /dev/null +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Chain.cs @@ -0,0 +1,28 @@ +namespace ChainSafe.Gaming.Wallets.WalletConnect +{ + public class Chain + { + public const string EvmNamespace = "eip155"; + + public static readonly Chain Ethereum = new Chain(EvmNamespace, "1", nameof(Ethereum)); + + public static readonly Chain Goerli = new Chain(EvmNamespace, "5", "Ethereum Goerli"); + + public Chain(string chainNamespace, string chainId, string name) + { + ChainNamespace = chainNamespace; + + ChainId = chainId; + + Name = name; + } + + public string ChainNamespace { get; private set; } + + public string ChainId { get; private set; } + + public string Name { get; private set; } + + public string FullChainId => $"{ChainNamespace}:{ChainId}"; + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignMessage.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignMessage.cs new file mode 100644 index 000000000..181342ccc --- /dev/null +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignMessage.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using UnityEngine.Scripting; +using WalletConnectSharp.Common.Utils; +using WalletConnectSharp.Network.Models; + +namespace ChainSafe.Gaming.Wallets.WalletConnect.Methods +{ + [RpcMethod("personal_sign")] + [RpcRequestOptions(Clock.ONE_MINUTE, 99998)] + public class EthSignMessage : List + { + public EthSignMessage(string message, string address) + : base(new string[] { message, address }) + { + } + + [Preserve] // Needed for JSON.NET serialization + public EthSignMessage() + { + } + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Wallet.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Wallet.cs new file mode 100644 index 000000000..2bf72c755 --- /dev/null +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Wallet.cs @@ -0,0 +1,19 @@ +using System; +using Newtonsoft.Json; +using WalletConnectSharp.Sign.Models.Engine; + +namespace ChainSafe.Gaming.Wallets.WalletConnect +{ + public abstract class Wallet + { + [JsonProperty("mobile")] + public WalletLink Mobile { get; private set; } + + [JsonProperty("desktop")] + public WalletLink Desktop { get; private set; } + + public abstract void OpenDeeplink(ConnectedData data, bool useNative = false); + + public abstract void OpenWallet(); + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs new file mode 100644 index 000000000..d6f0cbcf5 --- /dev/null +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using WalletConnectSharp.Common.Logging; +using WalletConnectSharp.Core; + +namespace ChainSafe.Gaming.Wallets.WalletConnect +{ + public struct WalletConnectConfig + { + public string ProjectId { get; set; } + + public string ProjectName { get; set; } + + public string BaseContext { get; set; } + + public string StoragePath { get; set; } + + public Metadata Metadata { get; set; } + + public ILogger Logger { get; set; } + + public bool IsMobilePlatform { get; set; } + + public Dictionary SupportedWallets { get; set; } + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs new file mode 100644 index 000000000..15464dd3c --- /dev/null +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs @@ -0,0 +1,123 @@ +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Newtonsoft.Json; +using WalletConnectSharp.Common.Logging; +using WalletConnectSharp.Core; +using WalletConnectSharp.Core.Models; +using WalletConnectSharp.Sign; +using WalletConnectSharp.Sign.Models; +using WalletConnectSharp.Sign.Models.Engine; +using WalletConnectSharp.Storage; +using WalletConnectSharp.Storage.Interfaces; + +namespace ChainSafe.Gaming.Wallets.WalletConnect +{ + public class WalletConnectUnity + { + public delegate void Connected(ConnectedData connectedData); + + public delegate void SessionApproved(SessionStruct session); + + public event Connected OnConnected; + + public event SessionApproved OnSessionApproved; + + public WalletConnectCore Core { get; private set; } + + public WalletConnectSignClient SignClient { get; private set; } + + public WalletConnectConfig Config { get; private set; } + + public async Task Initialize(WalletConnectConfig config) + { + Config = config; + + if (Config.Logger != null) + { + WCLogger.Logger = Config.Logger; + } + + Core = new WalletConnectCore(new CoreOptions() + { + Name = Config.ProjectName, ProjectId = Config.ProjectId, Storage = BuildStorage(Config.StoragePath), BaseContext = Config.BaseContext, + }); + + await Core.Start(); + + SignClient = await WalletConnectSignClient.Init(new SignClientOptions() + { + BaseContext = Config.BaseContext, + Core = Core, + Metadata = Config.Metadata, + Name = Config.ProjectName, + ProjectId = Config.ProjectId, + Storage = Core.Storage, + }); + } + + private IKeyValueStorage BuildStorage(string path) + { + path = Path.Combine(path); + return new FileSystemStorage(path); + } + + public async Task ConnectClient() + { + RequiredNamespaces requiredNamespaces = new RequiredNamespaces(); + + var methods = new string[] + { + "eth_sendTransaction", "eth_signTransaction", "eth_sign", "personal_sign", "eth_signTypedData", + }; + + var events = new string[] { "chainChanged", "accountsChanged" }; + + requiredNamespaces.Add( + Chain.EvmNamespace, + new ProposedNamespace + { + Chains = new string[] { Chain.Goerli.FullChainId }, Events = events, Methods = methods, + }); + + // start connecting + ConnectedData connectData = await SignClient.Connect(new ConnectOptions + { + RequiredNamespaces = requiredNamespaces, + }); + + InvokeConnected(connectData); + + SessionStruct sessionResult = await connectData.Approval; + + InvokeSessionApproved(sessionResult); + + string nativeUrl = sessionResult.Peer.Metadata.Redirect.Native.Replace("//", string.Empty); + + string defaultWalletId = Config.SupportedWallets.FirstOrDefault(t => + t.Value.Mobile.NativeProtocol == nativeUrl || t.Value.Desktop.NativeProtocol == nativeUrl) + .Key; + + var defaultWallet = Config.SupportedWallets[defaultWalletId]; + + if (Config.IsMobilePlatform) + { + defaultWallet.OpenDeeplink(connectData); + } + + return connectData; + } + + private void InvokeConnected(ConnectedData connectedData) + { + OnConnected?.Invoke(connectedData); + } + + private void InvokeSessionApproved(SessionStruct session) + { + OnSessionApproved?.Invoke(session); + } + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletLink.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletLink.cs new file mode 100644 index 000000000..c7f6e037d --- /dev/null +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletLink.cs @@ -0,0 +1,13 @@ +using Newtonsoft.Json; + +namespace ChainSafe.Gaming.Wallets.WalletConnect +{ + public struct WalletLink + { + [JsonProperty("native")] + public string NativeProtocol; + + [JsonProperty("universal")] + public string UniversalUrl; + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs b/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs index be89ea978..2f289cf02 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs @@ -1,9 +1,12 @@ using System; +using System.Linq; using System.Text; using System.Threading.Tasks; using ChainSafe.Gaming.Evm.Providers; using ChainSafe.Gaming.Evm.Signers; using ChainSafe.Gaming.Evm.Transactions; +using ChainSafe.Gaming.Wallets.WalletConnect; +using ChainSafe.Gaming.Wallets.WalletConnect.Methods; using ChainSafe.Gaming.Web3; using ChainSafe.Gaming.Web3.Core; using ChainSafe.Gaming.Web3.Core.Debug; @@ -13,6 +16,9 @@ using Nethereum.Signer; using Nethereum.Util; using Newtonsoft.Json; +using UnityEngine; +using WalletConnectSharp.Sign.Models; +using WalletConnectSharp.Sign.Models.Engine; using AddressExtensions = ChainSafe.Gaming.Web3.Core.Debug.AddressExtensions; namespace ChainSafe.Gaming.Wallets @@ -21,6 +27,24 @@ public class WebPageWallet : ISigner, ITransactionExecutor, ILifecycleParticipan { public delegate string ConnectMessageBuildDelegate(DateTime expirationTime); + public delegate void Connected(ConnectedData connectedData); + + public delegate void SessionApproved(SessionStruct session); + + public static event Connected OnConnected; + + public static event SessionApproved OnSessionApproved; + + private static void InvokeConnected(ConnectedData connectedData) + { + OnConnected?.Invoke(connectedData); + } + + private static void InvokeSessionApproved(SessionStruct session) + { + OnSessionApproved?.Invoke(session); + } + #pragma warning disable SA1201 private static readonly TimeSpan MinClipboardCheckPeriod = TimeSpan.FromMilliseconds(10); #pragma warning restore SA1201 @@ -30,7 +54,9 @@ public class WebPageWallet : ISigner, ITransactionExecutor, ILifecycleParticipan private readonly IOperatingSystemMediator operatingSystem; private readonly IRpcProvider provider; - private string? address; + public string Address { get; private set; } + + public WalletConnectUnity WalletConnectUnity { get; private set; } = new WalletConnectUnity(); public WebPageWallet(IRpcProvider provider, WebPageWalletConfig configuration, IOperatingSystemMediator operatingSystem, IChainConfig chainConfig) { @@ -47,7 +73,13 @@ public WebPageWallet(IRpcProvider provider, WebPageWalletConfig configuration, I public async ValueTask WillStartAsync() { configuration.SavedUserAddress?.AssertIsPublicAddress(nameof(configuration.SavedUserAddress)); - address = configuration.SavedUserAddress ?? await GetAccountVerifyUserOwns(); + + // Wallet Connect + WalletConnectUnity.OnConnected += InvokeConnected; + WalletConnectUnity.OnSessionApproved += InvokeSessionApproved; + await WalletConnectUnity.Initialize(configuration.WalletConnectConfig); + + Address = configuration.SavedUserAddress ?? await GetAccountVerifyUserOwns(); } public ValueTask WillStopAsync() @@ -57,14 +89,29 @@ public ValueTask WillStopAsync() public Task GetAddress() { - address.AssertNotNull(nameof(address)); - return Task.FromResult(address!); + Address.AssertNotNull(nameof(Address)); + return Task.FromResult(Address!); } public async Task SignMessage(string message) { var pageUrl = BuildUrl(); - var hash = await OpenPageWaitResponse(pageUrl, ValidateResponse); + + // Wallet connect + SessionStruct session = GetSession(); + + var (address, chainId) = GetCurrentAddress(); + + if (string.IsNullOrWhiteSpace(address)) + { + return null; + } + + var request = new EthSignMessage(message, address); + + string hash = + await WalletConnectUnity.SignClient.Request(session.Topic, request, chainId); + // TODO: log event on success return hash; @@ -168,6 +215,38 @@ bool ValidateResponse(string response) } } + private SessionStruct GetSession() + { + return WalletConnectUnity.SignClient.Session.Get(WalletConnectUnity.SignClient.Session.Keys[0]); + } + + private (string, string) GetCurrentAddress() + { + var currentSession = GetSession(); + + var defaultChain = currentSession.Namespaces.Keys.FirstOrDefault(); + + if (string.IsNullOrWhiteSpace(defaultChain)) + { + return (null, null); + } + + var defaultNamespace = currentSession.Namespaces[defaultChain]; + + if (defaultNamespace.Accounts.Length == 0) + { + return (null, null); + } + + var fullAddress = defaultNamespace.Accounts[0]; + var addressParts = fullAddress.Split(":"); + + var address = addressParts[2]; + var chainId = string.Join(':', addressParts.Take(2)); + + return (address, chainId); + } + // TODO: extract hash from deeplink instead of clipboard private async Task OpenPageWaitResponse(string pageUrl, Func validator) { @@ -209,14 +288,14 @@ private async Task GetAccountVerifyUserOwns() { // sign current time var expirationTime = DateTime.Now + configuration.ConnectRequestExpiresAfter; - var message = configuration.ConnectMessageBuilder(expirationTime); - var signature = await SignMessage(message); - var publicAddress = ExtractPublicAddress(signature, message); + ConnectedData connectedData = await WalletConnectUnity.ConnectClient(); + + var (address, _) = GetCurrentAddress(); - if (!AddressExtensions.IsPublicAddress(publicAddress)) + if (!AddressExtensions.IsPublicAddress(address)) { throw new Web3Exception( - $"Public address recovered from signature is not valid. Public address: {publicAddress}"); + $"Public address recovered from signature is not valid. Public address: {address}"); } if (DateTime.Now > expirationTime) @@ -224,7 +303,7 @@ private async Task GetAccountVerifyUserOwns() throw new Web3Exception("Signature has already expired. Try again."); } - return publicAddress; + return address; string ExtractPublicAddress(string sig, string originalMessage) { diff --git a/src/ChainSafe.Gaming.WebPageWallet/WebPageWalletConfig.cs b/src/ChainSafe.Gaming.WebPageWallet/WebPageWalletConfig.cs index e972a9db1..5753d9da1 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WebPageWalletConfig.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WebPageWalletConfig.cs @@ -1,4 +1,5 @@ using System; +using ChainSafe.Gaming.Wallets.WalletConnect; namespace ChainSafe.Gaming.Wallets { @@ -15,5 +16,7 @@ public class WebPageWalletConfig public WebPageWallet.ConnectMessageBuildDelegate ConnectMessageBuilder { get; set; } = time => $"Sign this message to connect your account. This request will expire at {time:hh:mm:ss}."; + + public WalletConnectConfig WalletConnectConfig { get; set; } } } \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Chain.cs b/src/UnitySampleProject/Assets/Chain.cs deleted file mode 100644 index 4a11eba22..000000000 --- a/src/UnitySampleProject/Assets/Chain.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -public struct Chain -{ - public const string EvmNamespace = "eip155"; - - public static readonly Chain Ethereum = new Chain(EvmNamespace, "1", nameof(Ethereum)); - - public static readonly Chain Goerli = new Chain(EvmNamespace, "5", "Ethereum Goerli"); - - public string ChainNamespace { get; private set; } - - public string ChainId { get; private set; } - - public string Name { get; private set; } - - public string FullChainId => $"{ChainNamespace}:{ChainId}"; - - public Chain(string chainNamespace, string chainId, string name) - { - ChainNamespace = chainNamespace; - - ChainId = chainId; - - Name = name; - } -} diff --git a/src/UnitySampleProject/Assets/Chain.cs.meta b/src/UnitySampleProject/Assets/Chain.cs.meta deleted file mode 100644 index dfbd20db2..000000000 --- a/src/UnitySampleProject/Assets/Chain.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: de7ed2e45ca6a9d448b9c1c720e5d2f7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/MainThreadDispatcher.cs b/src/UnitySampleProject/Assets/MainThreadDispatcher.cs deleted file mode 100644 index 2ba72d356..000000000 --- a/src/UnitySampleProject/Assets/MainThreadDispatcher.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Concurrent; -using System.Collections.Generic; -using UnityEngine; - -public class MainThreadDispatcher : MonoBehaviour -{ - #region Instance - - [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] - private static void Init() - { - var obj = new GameObject("Main Thread Dispatcher"); - DontDestroyOnLoad(obj); - Instance = obj.AddComponent(); - } - - public static MainThreadDispatcher Instance { get; private set; } - - #endregion - - private readonly ConcurrentQueue _pending = new ConcurrentQueue(); - - public void Invoke(Action fn) => _pending.Enqueue(fn); - - public static void Enqueue(Action a) - { - if (Instance == null) return; - - Instance.Invoke(a); - } - - private void Update() - { - while (_pending.TryDequeue(out var action)) - { - try - { - action(); - } - - catch (Exception e) - { - Debug.LogError( - $"An error has occurred during processing one of the queued actions in the main thread dispatcher:\n{e}", - this); - } - } - } -} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/QrCodePreviewer.cs b/src/UnitySampleProject/Assets/QrCodePreviewer.cs deleted file mode 100644 index 3583dfa53..000000000 --- a/src/UnitySampleProject/Assets/QrCodePreviewer.cs +++ /dev/null @@ -1,27 +0,0 @@ -using UnityEngine; -using UnityEngine.UI; - -public class QrCodePreviewer : MonoBehaviour -{ - [SerializeField] private Image _qrCodeImage; - - [SerializeField] private WalletConnectUnity _walletConnect; - - private void Start() - { - _walletConnect.OnConnected += data => - { - Debug.LogError(data.Uri); - }; - - _walletConnect.OnSessionApproved += session => - { - MainThreadDispatcher.Instance.Invoke(delegate - { - Debug.LogError(session.Peer.PublicKey); - - Debug.LogError(session.Self.PublicKey); - }); - }; - } -} diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scenes/SampleLogin.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scenes/SampleLogin.unity index 42dbbe383..1b43c8193 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scenes/SampleLogin.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scenes/SampleLogin.unity @@ -1060,6 +1060,56 @@ MonoBehaviour: m_EditorClassIdentifier: m_HorizontalFit: 0 m_VerticalFit: 2 +--- !u!1 &395689439 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 395689440} + - component: {fileID: 395689441} + m_Layer: 5 + m_Name: QrPreviewer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &395689440 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 395689439} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1880270956} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &395689441 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 395689439} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fb890e484538c444da09be8d0f89dcd8, type: 3} + m_Name: + m_EditorClassIdentifier: + _qrCodeImage: {fileID: 0} --- !u!1001 &452118933 PrefabInstance: m_ObjectHideFlags: 0 @@ -1740,6 +1790,24 @@ MonoBehaviour: Provider: 3 - Button: {fileID: 1508551058} Provider: 4 + k__BackingField: f4bff60eb260841f46b1c77588cd8acb + k__BackingField: Web3.Unity + k__BackingField: unity-game + k__BackingField: + Name: Web3.Unity + Description: web3.unity is an open-source gaming SDK written in C# and developed + by ChainSafe Gaming. It connects games built in the Unity game engine to the + blockchain. The library currently supports games built for web browsers (WebGL), + iOS/Android mobile, and desktop. web3.unity is compatible with most EVM-based + chains such as Ethereum, Polygon, Moonbeam, Cronos, Nervos, and Binance Smart + Chain, letting developers easily choose and switch between them to create the + best in-game experience. + Url: https://chainsafe.io/ + Icons: [] + Redirect: + Native: + Universal: + VerifyUrl: --- !u!1 &1434038407 GameObject: m_ObjectHideFlags: 0 @@ -2383,6 +2451,7 @@ RectTransform: - {fileID: 920270120} - {fileID: 1434038408} - {fileID: 1701305867} + - {fileID: 395689440} m_Father: {fileID: 0} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Scenes/Login.cs index a8935759d..7cec5c5d1 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -6,16 +7,20 @@ using ChainSafe.Gaming.Evm.JsonRpc; using ChainSafe.Gaming.UnityPackage; using ChainSafe.Gaming.Wallets; +using ChainSafe.Gaming.Wallets.WalletConnect; using ChainSafe.Gaming.Web3; using ChainSafe.Gaming.Web3.Build; using ChainSafe.Gaming.Web3.Unity; using ChainSafe.GamingSdk.Gelato; using ChainSafe.GamingSdk.Web3Auth; - +using Newtonsoft.Json; using UnityEngine; using UnityEngine.Assertions; +using UnityEngine.Networking; using UnityEngine.SceneManagement; using UnityEngine.UI; +using WalletConnectSharp.Core; +using Web3Unity.Scripts.WalletConnect; namespace Scenes @@ -51,7 +56,31 @@ public class Login : MonoBehaviour private bool useWebPageWallet; - private void Awake() + public WalletConnectConfig WalletConnectConfig { get; private set; } + + #region Wallet Connect + + [field: Header("Wallet Connect")] + + [field: SerializeField] public string ProjectId { get; private set; } + + [field: SerializeField] public string ProjectName { get; private set; } + + [field: SerializeField] public string BaseContext { get; private set; } + + [field: SerializeField] public Metadata Metadata { get; private set; } = new Metadata + { + Name = "Web3.Unity", + //from package.json + Description = "web3.unity is an open-source gaming SDK written in C# and developed by ChainSafe Gaming. It connects games built in the Unity game engine to the blockchain. The library currently supports games built for web browsers (WebGL), iOS/Android mobile, and desktop. web3.unity is compatible with most EVM-based chains such as Ethereum, Polygon, Moonbeam, Cronos, Nervos, and Binance Smart Chain, letting developers easily choose and switch between them to create the best in-game experience.", + Url = "https://chainsafe.io/" + }; + + public string StoragePath => $"{Application.persistentDataPath}/wc_storage.json"; + + #endregion + + private IEnumerator Start() { Assert.IsNotNull(Web3AuthButtons); Assert.IsTrue(Web3AuthButtons.Count > 0); @@ -63,7 +92,12 @@ private void Awake() // Remember me only works with the WebPageWallet RememberMeToggle.gameObject.SetActive(useWebPageWallet); + + // Wallet Connect + yield return FetchSupportedWallets(); + WalletConnectConfig = BuildConfig(); + #if UNITY_WEBGL ProcessWeb3Auth(); #endif @@ -97,6 +131,7 @@ private async void TryAutoLogin() new WebPageWalletConfig { SavedUserAddress = savedAccount, + WalletConnectConfig = WalletConnectConfig }); }); @@ -116,7 +151,11 @@ private async void LoginWithExistingAccount() */ if (useWebPageWallet) { - services.UseWebPageWallet(); + services.UseWebPageWallet( + new WebPageWalletConfig + { + WalletConnectConfig = WalletConnectConfig + }); } else { @@ -231,5 +270,52 @@ private void ConfigureCommonServices(IWeb3ServiceCollection services) "0x1d6f31b71e12a1a584ca20853495161c48ba491f")); } + + #region Wallet Connect + + private Dictionary _supportedWallets; + + private WalletConnectConfig BuildConfig() + { + return new WalletConnectConfig + { + ProjectId = ProjectId, + ProjectName = ProjectName, + BaseContext = BaseContext, + StoragePath = StoragePath, + Metadata = Metadata, + SupportedWallets = _supportedWallets, + IsMobilePlatform = Application.isMobilePlatform, + Logger = new WCUnityLogger() + }; + } + + private IEnumerator FetchSupportedWallets() + { + using (UnityWebRequest webRequest = UnityWebRequest.Get("https://registry.walletconnect.org/data/wallets.json")) + { + // Request and wait for the desired page. + yield return webRequest.SendWebRequest(); + + if (webRequest.result != UnityWebRequest.Result.Success) + { + Debug.LogError("Error Getting Supported Wallets: " + webRequest.error); + + yield return null; + } + + else + { + var json = webRequest.downloadHandler.text; + + _supportedWallets = JsonConvert.DeserializeObject>(json) + .ToDictionary(w => w.Key, w => (Wallet)w.Value); + + Debug.Log($"Fetched {_supportedWallets.Count} Supported Wallets."); + } + } + } + + #endregion } } \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs new file mode 100644 index 000000000..55916b75e --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs @@ -0,0 +1,50 @@ +using System; +using ChainSafe.Gaming.UnityPackage; +using ChainSafe.Gaming.Wallets; +using ChainSafe.Gaming.Wallets.WalletConnect; +using ChainSafe.Gaming.Web3; +using Scenes; +using UnityEngine; +using UnityEngine.UI; +using Web3Unity.Scripts; + +public class QrCodePreviewer : MonoBehaviour +{ + [SerializeField] private Image _qrCodeImage; + + private void Start() + { + // Initialize when web3 is initialized + Web3Accessor.Instance.OnWeb3Initialized += Initialize; + } + + public void Initialize() + { + WebPageWallet wallet = Web3Accessor.Web3.Signer as WebPageWallet; + + if (wallet == null) + { + Debug.LogError("Wallet not Initialized"); + + return; + } + + wallet.WalletConnectUnity.OnConnected += data => + { + MainThreadDispatcher.Instance.Invoke(delegate + { + Debug.LogError(data.Uri); + }); + }; + + wallet.WalletConnectUnity.OnSessionApproved += session => + { + MainThreadDispatcher.Instance.Invoke(delegate + { + Debug.LogError(session.Peer.PublicKey); + + Debug.LogError(session.Self.PublicKey); + }); + }; + } +} diff --git a/src/UnitySampleProject/Assets/QrCodePreviewer.cs.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs.meta similarity index 100% rename from src/UnitySampleProject/Assets/QrCodePreviewer.cs.meta rename to src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs.meta diff --git a/src/UnitySampleProject/Assets/Transaction.cs b/src/UnitySampleProject/Assets/Transaction.cs deleted file mode 100644 index a86d4848f..000000000 --- a/src/UnitySampleProject/Assets/Transaction.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.Collections.Generic; -using System.Numerics; -using Newtonsoft.Json; -using UnityEngine.Scripting; -using WalletConnectSharp.Common.Utils; -using WalletConnectSharp.Network.Models; - -public class Transaction -{ - [JsonProperty("from")] - public string From { get; set; } - - [JsonProperty("to")] - public string To { get; set; } - - [JsonProperty("gas", NullValueHandling = NullValueHandling.Ignore)] - public string Gas { get; set; } - - [JsonProperty("gasPrice", NullValueHandling = NullValueHandling.Ignore)] - public string GasPrice { get; set; } - - [JsonProperty("value")] - public string Value { get; set; } - - [JsonProperty("data", NullValueHandling = NullValueHandling.Ignore)] - public string Data { get; set; } = "0x"; -} - -[RpcMethod("eth_sendTransaction"), RpcRequestOptions(Clock.ONE_MINUTE, 99997)] -public class EthSendTransaction : List -{ - public EthSendTransaction(params Transaction[] transactions) : base(transactions) - { - } - - [Preserve] //Needed for JSON.NET serialization - public EthSendTransaction() - { - } -} - -[RpcMethod("personal_sign"), RpcRequestOptions(Clock.ONE_MINUTE, 99998)] -public class EthSignMessage : List -{ - public EthSignMessage(string message, string address) : base(new string[]{message, address}) - { - - } - - [Preserve] //Needed for JSON.NET serialization - public EthSignMessage() - { - - } -} diff --git a/src/UnitySampleProject/Assets/Transaction.cs.meta b/src/UnitySampleProject/Assets/Transaction.cs.meta deleted file mode 100644 index 66247ed81..000000000 --- a/src/UnitySampleProject/Assets/Transaction.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 47ef6f5b2ca190e4cbde0751e87f75cd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/WCTest.unity b/src/UnitySampleProject/Assets/WCTest.unity deleted file mode 100644 index 24b7dbdb2..000000000 --- a/src/UnitySampleProject/Assets/WCTest.unity +++ /dev/null @@ -1,544 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 3 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 1 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 0 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 512 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 256 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 1 - m_PVRDenoiserTypeDirect: 1 - m_PVRDenoiserTypeIndirect: 1 - m_PVRDenoiserTypeAO: 1 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 0} - m_LightingSettings: {fileID: 0} ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - maxJobWorkers: 0 - preserveTilesOutsideBounds: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &358373747 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 358373750} - - component: {fileID: 358373749} - - component: {fileID: 358373748} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &358373748 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 358373747} - m_Enabled: 1 ---- !u!20 &358373749 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 358373747} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 1 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &358373750 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 358373747} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &601964846 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 601964847} - - component: {fileID: 601964849} - - component: {fileID: 601964848} - - component: {fileID: 601964850} - m_Layer: 5 - m_Name: QrImage - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &601964847 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 601964846} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1333275950} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 750, y: 750} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &601964848 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 601964846} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &601964849 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 601964846} - m_CullTransparentMesh: 1 ---- !u!114 &601964850 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 601964846} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fb890e484538c444da09be8d0f89dcd8, type: 3} - m_Name: - m_EditorClassIdentifier: - _qrCodeImage: {fileID: 601964848} - _walletConnect: {fileID: 1258762730} ---- !u!1 &1258762728 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1258762729} - - component: {fileID: 1258762730} - - component: {fileID: 1258762731} - m_Layer: 0 - m_Name: WCTest - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1258762729 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1258762728} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1258762730 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1258762728} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 475ba7b2c12e60247b357b9311e53d5e, type: 3} - m_Name: - m_EditorClassIdentifier: - k__BackingField: f4bff60eb260841f46b1c77588cd8acb - k__BackingField: Web3.Unity - k__BackingField: - Name: Web3.Unity - Description: web3.unity is an open-source gaming SDK written in C# and developed - by ChainSafe Gaming. It connects games built in the Unity game engine to the - blockchain. The library currently supports games built for web browsers (WebGL), - iOS/Android mobile, and desktop. web3.unity is compatible with most EVM-based - chains such as Ethereum, Polygon, Moonbeam, Cronos, Nervos, and Binance Smart - Chain, letting developers easily choose and switch between them to create the - best in-game experience. - Url: https://chainsafe.io/ - Icons: [] - Redirect: - Native: - Universal: - VerifyUrl: ---- !u!114 &1258762731 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1258762728} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dea1e9b9b510e914bbb475034d6f8016, type: 3} - m_Name: - m_EditorClassIdentifier: - _walletConnect: {fileID: 1258762730} ---- !u!1 &1333275946 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1333275950} - - component: {fileID: 1333275949} - - component: {fileID: 1333275948} - - component: {fileID: 1333275947} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1333275947 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1333275946} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1333275948 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1333275946} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 - m_PresetInfoIsWorld: 0 ---- !u!223 &1333275949 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1333275946} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!224 &1333275950 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1333275946} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 601964847} - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!1 &1973251817 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1973251820} - - component: {fileID: 1973251819} - - component: {fileID: 1973251818} - m_Layer: 0 - m_Name: EventSystem - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1973251818 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1973251817} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} - m_Name: - m_EditorClassIdentifier: - m_SendPointerHoverToParent: 1 - m_HorizontalAxis: Horizontal - m_VerticalAxis: Vertical - m_SubmitButton: Submit - m_CancelButton: Cancel - m_InputActionsPerSecond: 10 - m_RepeatDelay: 0.5 - m_ForceModuleActive: 0 ---- !u!114 &1973251819 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1973251817} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_FirstSelected: {fileID: 0} - m_sendNavigationEvents: 1 - m_DragThreshold: 10 ---- !u!4 &1973251820 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1973251817} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/src/UnitySampleProject/Assets/WCUnityLogger.cs b/src/UnitySampleProject/Assets/WCUnityLogger.cs deleted file mode 100644 index 7fcb9d6cb..000000000 --- a/src/UnitySampleProject/Assets/WCUnityLogger.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using UnityEngine; -using ILogger = WalletConnectSharp.Common.Logging.ILogger; - -public class WCUnityLogger : ILogger -{ - public void Log(string message) - { - MainThreadDispatcher.Enqueue(() => Debug.Log(message)); - } - - public void LogError(string message) - { - MainThreadDispatcher.Enqueue(() => Debug.LogError(message)); - } - - public void LogError(Exception e) - { - MainThreadDispatcher.Enqueue(() => Debug.LogError(e)); - } -} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Wallet.cs b/src/UnitySampleProject/Assets/Wallet.cs deleted file mode 100644 index 117d78228..000000000 --- a/src/UnitySampleProject/Assets/Wallet.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using Newtonsoft.Json; -using UnityEngine; -using WalletConnectSharp.Sign.Models.Engine; - -[Serializable] -public struct Wallet -{ - [JsonProperty("mobile")] public WalletLink Mobile; - - [JsonProperty("desktop")] public WalletLink Desktop; - - public void OpenDeeplink(ConnectedData data, bool useNative = false) - { - string uri = string.Empty; - -#if UNITY_ANDROID - uri = data.Uri; // Android OS should handle wc: protocol -#elif UNITY_IOS - // on iOS, we need to use one of the wallet links - WalletLink linkData = Application.isMobilePlatform ? Mobile : Desktop; - - var universalUrl = useNative ? linkData.NativeProtocol : linkData.UniversalUrl; - - uri = data.Uri; - - if (!string.IsNullOrWhiteSpace(universalUrl)) - { - uri = data.Uri; - - if (useNative) - uri = $"{universalUrl}//{uri}"; - - else if (universalUrl.EndsWith("/")) - uri = $"{universalUrl}{uri}"; - - else - uri = $"{universalUrl}/{uri}"; - } - - if (string.IsNullOrWhiteSpace(uri)) throw new Exception("Got empty URI when attempting to create WC deeplink"); -#endif - - Debug.Log($"Opening URL {uri}"); - - Application.OpenURL(uri); - } - - public void OpenWallet() - { - WalletLink linkData = Application.isMobilePlatform ? Mobile : Desktop; - - var universalUrl = linkData.UniversalUrl; - - if (string.IsNullOrWhiteSpace(universalUrl)) - throw new Exception("Got empty URI when attempting to create WC deeplink"); - - Application.OpenURL(universalUrl); - } -} - -public struct WalletLink -{ - [JsonProperty("native")] - public string NativeProtocol; - - [JsonProperty("universal")] - public string UniversalUrl; -} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/WalletConnectSigner.cs b/src/UnitySampleProject/Assets/WalletConnectSigner.cs deleted file mode 100644 index 6031c2cd5..000000000 --- a/src/UnitySampleProject/Assets/WalletConnectSigner.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Numerics; -using UnityEngine; -using WalletConnectSharp.Common.Utils; -using WalletConnectSharp.Network.Models; -using WalletConnectSharp.Sign.Models; -using WalletConnectSharp.Sign.Models.Engine; - -public class WalletConnectSigner : MonoBehaviour -{ - [SerializeField] private WalletConnectUnity _walletConnect; - - private ConnectedData _cachedConnectedData; - - private void Start() - { - _walletConnect.OnConnected += data => - { - _cachedConnectedData = data; - }; - } - - public async void SendTransaction(string to, string value) - { - var (session, address, chainId) = GetCurrentAddress(); - if (string.IsNullOrWhiteSpace(address)) - return; - - var request = new EthSendTransaction(new Transaction() - { - From = address, - To = to, - Value = value - }); - - var result = - await _walletConnect.SignClient.Request(session.Topic, request, chainId); - - MainThreadDispatcher.Instance.Invoke(delegate - { - Debug.Log($"eth_sendTransaction result: {result}"); - }); - } - - public async void SignMessage(string message) - { - var (session, address, chainId) = GetCurrentAddress(); - if (string.IsNullOrWhiteSpace(address)) - return; - - var request = new EthSignMessage(message, address); - - var result = - await _walletConnect.SignClient.Request(session.Topic, request, chainId); - - MainThreadDispatcher.Instance.Invoke(delegate - { - Debug.Log($"personal_sign result: {result}"); - }); - } - - public (SessionStruct, string, string) GetCurrentAddress() - { - var currentSession = _walletConnect.SignClient.Session.Get(_walletConnect.SignClient.Session.Keys[0]); - - var defaultChain = currentSession.Namespaces.Keys.FirstOrDefault(); - - if (string.IsNullOrWhiteSpace(defaultChain)) - return (default, null, null); - - var defaultNamespace = currentSession.Namespaces[defaultChain]; - - if (defaultNamespace.Accounts.Length == 0) - return (default, null, null); - - var fullAddress = defaultNamespace.Accounts[0]; - var addressParts = fullAddress.Split(":"); - - var address = addressParts[2]; - var chainId = string.Join(':', addressParts.Take(2)); - - return (currentSession, address, chainId); - } - - private void Update() - { - if (Input.GetKeyDown(KeyCode.S)) - { - SignMessage("message to sign"); - } - } -} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/WalletConnectSigner.cs.meta b/src/UnitySampleProject/Assets/WalletConnectSigner.cs.meta deleted file mode 100644 index 2bac4b8be..000000000 --- a/src/UnitySampleProject/Assets/WalletConnectSigner.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dea1e9b9b510e914bbb475034d6f8016 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/WalletConnectUnity.cs b/src/UnitySampleProject/Assets/WalletConnectUnity.cs deleted file mode 100644 index b3d786a1f..000000000 --- a/src/UnitySampleProject/Assets/WalletConnectUnity.cs +++ /dev/null @@ -1,187 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Newtonsoft.Json; -using UnityEngine; -using UnityEngine.Networking; -using WalletConnectSharp.Common.Logging; -using WalletConnectSharp.Core; -using WalletConnectSharp.Core.Models; -using WalletConnectSharp.Sign; -using WalletConnectSharp.Sign.Models; -using WalletConnectSharp.Sign.Models.Engine; -using WalletConnectSharp.Storage; -using WalletConnectSharp.Storage.Interfaces; - -public class WalletConnectUnity : MonoBehaviour -{ - public delegate void Connected(ConnectedData connectedData); - - public event Connected OnConnected; - - private void InvokeConnected(ConnectedData connectedData) - { - OnConnected?.Invoke(connectedData); - } - - public delegate void SessionApproved(SessionStruct session); - - public event SessionApproved OnSessionApproved; - - private void InvokeSessionApproved(SessionStruct session) - { - OnSessionApproved?.Invoke(session); - } - - [field: SerializeField] public string ProjectId { get; private set; } - [field: SerializeField] public string ProjectName { get; private set; } = "Web3.Unity"; - - [field: SerializeField] - public Metadata ClientMetadata { get; private set; } = new Metadata - { - Name = "Web3.Unity", - //from package.json - Description = "web3.unity is an open-source gaming SDK written in C# and developed by ChainSafe Gaming. It connects games built in the Unity game engine to the blockchain. The library currently supports games built for web browsers (WebGL), iOS/Android mobile, and desktop. web3.unity is compatible with most EVM-based chains such as Ethereum, Polygon, Moonbeam, Cronos, Nervos, and Binance Smart Chain, letting developers easily choose and switch between them to create the best in-game experience.", - Url = "https://chainsafe.io/" - }; - - public WalletConnectCore Core { get; private set; } - - public WalletConnectSignClient SignClient { get; private set; } - - private Dictionary _supportedWallets = new Dictionary(); - - private Wallet _defaultWallet; - - public const string BaseContext = "unity-game"; - - private async void Awake() - { - await Initialize(); - } - - internal async Task Initialize() - { - WCLogger.Logger = new WCUnityLogger(); - - StartCoroutine(FetchSupportedWallets()); - - Core = new WalletConnectCore(new CoreOptions() - { - Name = ProjectName, - ProjectId = ProjectId, - Storage = BuildStorage(), - BaseContext = BaseContext - }); - - await Core.Start(); - - await InitializeSignClient(); - } - - private void Update() - { - if (Input.GetKeyDown(KeyCode.C)) - { - ConnectClient(); - } - } - - public IKeyValueStorage BuildStorage() - { - string path = Path.Combine(Application.persistentDataPath, "wallet_connect.json"); - return new FileSystemStorage(path); - } - - public async Task InitializeSignClient() - { - SignClient = await WalletConnectSignClient.Init(new SignClientOptions() - { - BaseContext = BaseContext, - Core = Core, - Metadata = ClientMetadata, - Name = ProjectName, - ProjectId = ProjectId, - Storage = Core.Storage, - }); - } - - public async Task ConnectClient() - { - RequiredNamespaces requiredNamespaces = new RequiredNamespaces(); - - var methods = new string[] - { - "eth_sendTransaction", - "eth_signTransaction", - "eth_sign", - "personal_sign", - "eth_signTypedData", - }; - - var events = new string[] - { - "chainChanged", "accountsChanged" - }; - - requiredNamespaces.Add(Chain.EvmNamespace, new ProposedNamespace - { - Chains = new string[] - { - Chain.Goerli.FullChainId - }, - Events = events, - Methods = methods - }); - - //start connecting - ConnectedData connectData = await SignClient.Connect(new ConnectOptions - { - RequiredNamespaces = requiredNamespaces - }); - - InvokeConnected(connectData); - - SessionStruct sessionResult = await connectData.Approval; - - InvokeSessionApproved(sessionResult); - - string nativeUrl = sessionResult.Peer.Metadata.Redirect.Native.Replace("//", string.Empty); - - string defaultWalletId = _supportedWallets.FirstOrDefault(t => t.Value.Mobile.NativeProtocol == nativeUrl || t.Value.Desktop.NativeProtocol == nativeUrl).Key; - - _defaultWallet = _supportedWallets[defaultWalletId]; - - if (Application.isMobilePlatform) - _defaultWallet.OpenDeeplink(connectData); - - return connectData; - } - - private IEnumerator FetchSupportedWallets() - { - using (UnityWebRequest webRequest = UnityWebRequest.Get("https://registry.walletconnect.org/data/wallets.json")) - { - // Request and wait for the desired page. - yield return webRequest.SendWebRequest(); - - if (webRequest.result != UnityWebRequest.Result.Success) - { - Debug.LogError("Error Getting Supported Wallets: " + webRequest.error); - - yield return null; - } - - else - { - var json = webRequest.downloadHandler.text; - - _supportedWallets = JsonConvert.DeserializeObject>(json); - - Debug.Log($"Fetched {_supportedWallets.Count} Supported Wallets."); - } - } - } -} diff --git a/src/UnitySampleProject/Assets/WalletConnectUnity.cs.meta b/src/UnitySampleProject/Assets/WalletConnectUnity.cs.meta deleted file mode 100644 index f629f34aa..000000000 --- a/src/UnitySampleProject/Assets/WalletConnectUnity.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 475ba7b2c12e60247b357b9311e53d5e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From edd398c9e8de7f7ebc829dcfcf471f2cc4561bb5 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 22 Sep 2023 13:46:37 +0300 Subject: [PATCH 007/167] checkpoint --- .../Scripts/Utilities/QrCodePreviewer.cs | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs index 55916b75e..442bfff78 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs @@ -12,24 +12,9 @@ public class QrCodePreviewer : MonoBehaviour { [SerializeField] private Image _qrCodeImage; - private void Start() + public void Start() { - // Initialize when web3 is initialized - Web3Accessor.Instance.OnWeb3Initialized += Initialize; - } - - public void Initialize() - { - WebPageWallet wallet = Web3Accessor.Web3.Signer as WebPageWallet; - - if (wallet == null) - { - Debug.LogError("Wallet not Initialized"); - - return; - } - - wallet.WalletConnectUnity.OnConnected += data => + WebPageWallet.OnConnected += data => { MainThreadDispatcher.Instance.Invoke(delegate { @@ -37,7 +22,7 @@ public void Initialize() }); }; - wallet.WalletConnectUnity.OnSessionApproved += session => + WebPageWallet.OnSessionApproved += session => { MainThreadDispatcher.Instance.Invoke(delegate { From 7f100c36b156fa8cb5878deac51dff7445ba09e5 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 22 Sep 2023 14:57:37 +0300 Subject: [PATCH 008/167] checkpoint --- .../Web3.Unity Samples/Libraries.meta | 8 + .../Libraries/QRCoder.Unity.dll | Bin 0 -> 6144 bytes .../Libraries/QRCoder.Unity.dll.meta | 33 + .../Web3.Unity Samples/Libraries/QRCoder.dll | Bin 0 -> 124416 bytes .../Libraries/QRCoder.dll.meta | 33 + .../Scenes/SampleLogin.unity | 752 +++++++++++++++++- .../Scripts/Utilities/QrCodePreviewer.cs | 35 - .../Scripts/Utilities/WalletConnectModal.cs | 99 +++ ...wer.cs.meta => WalletConnectModal.cs.meta} | 0 9 files changed, 906 insertions(+), 54 deletions(-) create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries.meta create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.Unity.dll create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.Unity.dll.meta create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.dll create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.dll.meta delete mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs rename src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/{QrCodePreviewer.cs.meta => WalletConnectModal.cs.meta} (100%) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries.meta new file mode 100644 index 000000000..0ffb507b3 --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e022dc06aabcc8f448b3d82b4c4988a3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.Unity.dll b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.Unity.dll new file mode 100644 index 0000000000000000000000000000000000000000..535f8d24f43dec9ef1be5fa9374c1381722e9849 GIT binary patch literal 6144 zcmeHLU2Ggz6+Sbwf7#fZuAMml>Eusx;(DItsRhIf4-MbBv+JL@ zKzTqasCPZzoOABE=bn4cnLBqpe(o7Eh$w>V?p>nWxN{p&_^;tAx>NW6C`Gqc-PwLy zJ9cOL^o;GBRq2(bRWS>e>w1Bi7pAPartO-;C#KAbR}`7n*5s~+>4_1dW12x*ZvFLq zbGEl=hq+qofpJI@p>(JlcN5nDE~5Jst%rWIfc;nPDiCsR1`T|kRrzo6-e6gT_U;2j zCzu!@nprTyf=0VU)B^H$7txlc?1S9R1=p2!0{qb><1&Gm3&0<31)xu@wc$57)l8yG z8R^RcIOW>_h!`%l9^4yk0N!V$a6BlouXG6)+v>ozqzw=aEnyY8i{pyMzUdUD$PPj} zi8Lks&taS1iL52}?$C|SHB3AL0{$jD(+u!Fws%rDBAroCQH7xpQ?>U*=u5a`?zAp} zRT&3(Z5S!x(-PKehYUr4ilwC9vB6u5yJ=w2o$FY#;as#*a zOU4s1e?59THvsmsZ!!7?Cc_MAy>lak-X@040OMRT7Tet6qdt>!>J6gI{$Dp99-u+5>8ofS zQBDJ6h{8M~vIlq{^(s81a8O}R;Yo#O6_(z7&p;%8r4nUYh=>5=t=4V zO1&4@sqd%n($DBH=)?LDy#oDF;HQn_82bxZsEM`c)qtOY#kKSc<9n2$)$~VTJG}$kOerlxJ83c{H z2b`iG0?*TLfd%><@G`~q-E@kcqsQq6MXrYRiy$`IJmS2_5&eLUs~!!JU3|$rzf`3$ zGOQjj$80~i)Js{<@#MZf`uMn4tU2Ogn#OyhCPm*c`SulYM&VgHIhnk z%4I9>h(%e}tDLrddzoy|_eCY|)TixWsp^7QT18Q@BleZlNeX)0_ju3|XFHO}rKiG*mwL`Mz�gu6K**O$vo0{xltf8qw<$2 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

?fs37K_TXgUdmULR~;MMaHC2NS->Wh+YdC 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 diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.dll.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.dll.meta deleted file mode 100644 index c41105a28..000000000 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.dll.meta +++ /dev/null @@ -1,33 +0,0 @@ -fileFormatVersion: 2 -guid: 6277c3373576a9d4abbcf8883313f233 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/zxing.unity.dll b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/zxing.unity.dll new file mode 100644 index 0000000000000000000000000000000000000000..8459dfba18a1ed9264b75618f6f75b968e2aa7a8 GIT binary patch literal 473600 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

F8NBN0w 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


o65LHO;C-`@D4j^vv#{ubcZyAXe5 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 z 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 Date: Fri, 22 Sep 2023 21:49:28 +0300 Subject: [PATCH 010/167] chain selection working --- .../WalletConnect/Chain.cs | 4 - .../WalletConnect/WalletConnectConfig.cs | 2 + .../WalletConnect/WalletConnectUnity.cs | 2 +- .../Scenes/SampleLogin.unity | 1427 ++++++++++++++++- .../Scripts/Scenes/Login.cs | 35 +- 5 files changed, 1392 insertions(+), 78 deletions(-) diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Chain.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Chain.cs index 8b5498c35..111445ad2 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Chain.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Chain.cs @@ -4,10 +4,6 @@ public class Chain { public const string EvmNamespace = "eip155"; - public static readonly Chain Ethereum = new Chain(EvmNamespace, "1", nameof(Ethereum)); - - public static readonly Chain Goerli = new Chain(EvmNamespace, "5", "Ethereum Goerli"); - public Chain(string chainNamespace, string chainId, string name) { ChainNamespace = chainNamespace; diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs index d6f0cbcf5..d9fe32876 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs @@ -13,6 +13,8 @@ public struct WalletConnectConfig public string BaseContext { get; set; } + public Chain Chain { get; set; } + public string StoragePath { get; set; } public Metadata Metadata { get; set; } diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs index 15464dd3c..11e141ae0 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs @@ -79,7 +79,7 @@ public async Task ConnectClient() Chain.EvmNamespace, new ProposedNamespace { - Chains = new string[] { Chain.Goerli.FullChainId }, Events = events, Methods = methods, + Chains = new string[] { Config.Chain.FullChainId }, Events = events, Methods = methods, }); // start connecting diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scenes/SampleLogin.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scenes/SampleLogin.unity index 95d634851..735a33336 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scenes/SampleLogin.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scenes/SampleLogin.unity @@ -771,7 +771,7 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 311857775} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -1372,7 +1372,7 @@ RectTransform: m_Children: - {fileID: 1278821651} m_Father: {fileID: 1880270956} - m_RootOrder: 3 + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -1393,8 +1393,143 @@ MonoBehaviour: m_EditorClassIdentifier: _qrCodeImage: {fileID: 125483106} _copyToClipboardButton: {fileID: 212403314} - _backButton: {fileID: 1561876542} + _backButton: {fileID: 1993078182} _container: {fileID: 1278821651} +--- !u!1 &400348267 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 400348268} + - component: {fileID: 400348270} + - component: {fileID: 400348269} + m_Layer: 5 + m_Name: Item Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &400348268 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 400348267} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1792992066} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 5, y: -0.5} + m_SizeDelta: {x: -30, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &400348269 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 400348267} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Select Chain + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &400348270 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 400348267} + m_CullTransparentMesh: 1 --- !u!1001 &452118933 PrefabInstance: m_ObjectHideFlags: 0 @@ -1537,6 +1672,43 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 +--- !u!1 &458235389 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 458235390} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &458235390 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 458235389} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1792992066} + m_Father: {fileID: 1087053796} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 28} + m_Pivot: {x: 0.5, y: 1} --- !u!1 &492023254 GameObject: m_ObjectHideFlags: 0 @@ -1638,7 +1810,7 @@ RectTransform: - {fileID: 351786045} - {fileID: 1791429089} m_Father: {fileID: 2036998554} - m_RootOrder: 1 + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1713,6 +1885,119 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 +--- !u!1 &736475702 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 736475703} + - component: {fileID: 736475705} + - component: {fileID: 736475704} + m_Layer: 5 + m_Name: Item Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &736475703 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 736475702} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1792992066} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &736475704 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 736475702} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &736475705 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 736475702} + m_CullTransparentMesh: 1 +--- !u!1 &786838048 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 786838049} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &786838049 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 786838048} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1327341033} + m_Father: {fileID: 990863038} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &786896300 GameObject: m_ObjectHideFlags: 0 @@ -1810,7 +2095,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_RootOrder - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_AnchorMax.x @@ -2243,7 +2528,7 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 1} ---- !u!1 &1062946085 +--- !u!1 &990863037 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2251,35 +2536,497 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1062946086} + - component: {fileID: 990863038} + - component: {fileID: 990863041} + - component: {fileID: 990863040} + - component: {fileID: 990863039} m_Layer: 5 - m_Name: Column - Web3Auth + m_Name: Scrollbar m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1062946086 +--- !u!224 &990863038 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1062946085} + m_GameObject: {fileID: 990863037} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 387303608} - m_Father: {fileID: 1434038408} - m_RootOrder: 0 + - {fileID: 786838049} + m_Father: {fileID: 1182349767} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &990863039 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 990863037} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1327341034} + m_HandleRect: {fileID: 1327341033} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &990863040 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 990863037} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &990863041 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 990863037} + m_CullTransparentMesh: 1 +--- !u!1 &1062946085 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1062946086} + m_Layer: 5 + m_Name: Column - Web3Auth + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1062946086 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1062946085} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 387303608} + m_Father: {fileID: 1434038408} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0.5, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -50, y: 0} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1082413007 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1082413008} + - component: {fileID: 1082413010} + - component: {fileID: 1082413009} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1082413008 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1082413007} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1479042108} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -7.5, y: -0.5} + m_SizeDelta: {x: -35, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1082413009 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1082413007} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 14 + m_fontSizeMax: 18 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1082413010 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1082413007} + m_CullTransparentMesh: 1 +--- !u!1 &1087053795 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1087053796} + - component: {fileID: 1087053799} + - component: {fileID: 1087053798} + - component: {fileID: 1087053797} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1087053796 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1087053795} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 458235390} + m_Father: {fileID: 1182349767} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -17, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1087053797 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1087053795} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1087053798 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1087053795} + m_CullTransparentMesh: 1 +--- !u!114 &1087053799 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1087053795} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &1182349766 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1182349767} + - component: {fileID: 1182349770} + - component: {fileID: 1182349769} + - component: {fileID: 1182349768} + m_Layer: 5 + m_Name: Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1182349767 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1182349766} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1087053796} + - {fileID: 990863038} + m_Father: {fileID: 1479042108} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 2} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1182349768 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1182349766} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 458235390} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 1087053796} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 990863039} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1182349769 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1182349766} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1182349770 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1182349766} + m_CullTransparentMesh: 1 --- !u!1 &1278821650 GameObject: m_ObjectHideFlags: 0 @@ -2315,8 +3062,84 @@ RectTransform: m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1327341032 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1327341033} + - component: {fileID: 1327341035} + - component: {fileID: 1327341034} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1327341033 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1327341032} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 786838049} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1327341034 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1327341032} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1327341035 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1327341032} + m_CullTransparentMesh: 1 --- !u!1 &1334079840 GameObject: m_ObjectHideFlags: 0 @@ -2400,6 +3223,7 @@ MonoBehaviour: Native: Universal: VerifyUrl: + _chainDropdown: {fileID: 1479042110} --- !u!1 &1434038407 GameObject: m_ObjectHideFlags: 0 @@ -2581,6 +3405,177 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 +--- !u!1 &1479042107 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1479042108} + - component: {fileID: 1479042112} + - component: {fileID: 1479042111} + - component: {fileID: 1479042110} + - component: {fileID: 1479042109} + - component: {fileID: 1479042113} + m_Layer: 5 + m_Name: ChainDropdown + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1479042108 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1479042107} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1082413008} + - {fileID: 1528831652} + - {fileID: 1182349767} + m_Father: {fileID: 2036998554} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1479042109 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1479042107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1479042110 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1479042107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1479042111} + m_Template: {fileID: 1182349767} + m_CaptionText: {fileID: 1082413009} + m_CaptionImage: {fileID: 0} + m_Placeholder: {fileID: 0} + m_ItemText: {fileID: 400348269} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_AlphaFadeSpeed: 0.15 +--- !u!114 &1479042111 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1479042107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.054901965, g: 0.054901965, b: 0.054901965, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1479042112 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1479042107} + m_CullTransparentMesh: 1 +--- !u!114 &1479042113 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1479042107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 1, g: 1, b: 1, a: 0.2} + m_EffectDistance: {x: 1, y: 1} + m_UseGraphicAlpha: 1 --- !u!1 &1491563361 GameObject: m_ObjectHideFlags: 0 @@ -2761,7 +3756,7 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 ---- !u!1 &1561876540 +--- !u!1 &1528831651 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2769,82 +3764,114 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1561876541} - - component: {fileID: 1561876544} - - component: {fileID: 1561876543} - - component: {fileID: 1561876542} + - component: {fileID: 1528831652} + - component: {fileID: 1528831654} + - component: {fileID: 1528831653} m_Layer: 5 - m_Name: Backdrop + m_Name: Arrow m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1561876541 +--- !u!224 &1528831652 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1561876540} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1528831651} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 311857776} - m_Father: {fileID: 1278821651} - m_RootOrder: 0 + m_Children: [] + m_Father: {fileID: 1479042108} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -15, y: 0} + m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1561876542 +--- !u!114 &1528831653 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1561876540} + m_GameObject: {fileID: 1528831651} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1561876543} - m_OnClick: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] + m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1528831654 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1528831651} + m_CullTransparentMesh: 1 +--- !u!1 &1561876540 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1561876541} + - component: {fileID: 1561876544} + - component: {fileID: 1561876543} + m_Layer: 5 + m_Name: Backdrop + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1561876541 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1561876540} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 311857776} + - {fileID: 1993078179} + m_Father: {fileID: 1278821651} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1561876543 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2915,7 +3942,7 @@ RectTransform: - {fileID: 108583392} - {fileID: 279245843} m_Father: {fileID: 1880270956} - m_RootOrder: 2 + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -3070,6 +4097,93 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &1792992065 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1792992066} + - component: {fileID: 1792992067} + m_Layer: 5 + m_Name: Item + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1792992066 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792992065} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 736475703} + - {fileID: 400348268} + m_Father: {fileID: 458235390} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1792992067 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792992065} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 736475704} + toggleTransition: 1 + graphic: {fileID: 0} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 --- !u!1 &1880270952 GameObject: m_ObjectHideFlags: 0 @@ -3164,8 +4278,8 @@ RectTransform: m_Children: - {fileID: 920270120} - {fileID: 1434038408} - - {fileID: 1701305867} - {fileID: 395689440} + - {fileID: 1701305867} m_Father: {fileID: 0} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -3250,6 +4364,186 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1900245908} m_CullTransparentMesh: 1 +--- !u!1 &1993078178 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1993078179} + - component: {fileID: 1993078181} + - component: {fileID: 1993078180} + - component: {fileID: 1993078182} + m_Layer: 5 + m_Name: CloseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1993078179 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993078178} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1561876541} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 50, y: 50} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1993078180 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993078178} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: X + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 31.3 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: -15, y: 15, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1993078181 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993078178} + m_CullTransparentMesh: 1 +--- !u!114 &1993078182 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993078178} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1561876543} + m_OnClick: + m_PersistentCalls: + m_Calls: [] --- !u!1001 &1996606957 PrefabInstance: m_ObjectHideFlags: 0 @@ -3422,6 +4716,7 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: + - {fileID: 1479042108} - {fileID: 787012149} - {fileID: 724612375} m_Father: {fileID: 1434038408} diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Scenes/Login.cs index 7cec5c5d1..d9027c4e0 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -14,6 +14,7 @@ using ChainSafe.GamingSdk.Gelato; using ChainSafe.GamingSdk.Web3Auth; using Newtonsoft.Json; +using TMPro; using UnityEngine; using UnityEngine.Assertions; using UnityEngine.Networking; @@ -56,8 +57,6 @@ public class Login : MonoBehaviour private bool useWebPageWallet; - public WalletConnectConfig WalletConnectConfig { get; private set; } - #region Wallet Connect [field: Header("Wallet Connect")] @@ -76,8 +75,17 @@ public class Login : MonoBehaviour Url = "https://chainsafe.io/" }; + [field: SerializeField] private TMP_Dropdown _chainDropdown; + public string StoragePath => $"{Application.persistentDataPath}/wc_storage.json"; + // chain id, name pairs + public static Dictionary SupportedChains { get; private set; } = new Dictionary() + { + {1, "Ethereum"}, + {5, "Goerli"}, + }; + #endregion private IEnumerator Start() @@ -94,9 +102,9 @@ private IEnumerator Start() RememberMeToggle.gameObject.SetActive(useWebPageWallet); // Wallet Connect + PopulateChainDropDown(); + yield return FetchSupportedWallets(); - - WalletConnectConfig = BuildConfig(); #if UNITY_WEBGL ProcessWeb3Auth(); @@ -131,7 +139,7 @@ private async void TryAutoLogin() new WebPageWalletConfig { SavedUserAddress = savedAccount, - WalletConnectConfig = WalletConnectConfig + WalletConnectConfig = BuildConfig() }); }); @@ -154,7 +162,7 @@ private async void LoginWithExistingAccount() services.UseWebPageWallet( new WebPageWalletConfig { - WalletConnectConfig = WalletConnectConfig + WalletConnectConfig = BuildConfig() }); } else @@ -275,13 +283,26 @@ private void ConfigureCommonServices(IWeb3ServiceCollection services) private Dictionary _supportedWallets; + private void PopulateChainDropDown() + { + _chainDropdown.AddOptions(SupportedChains.Values.ToList()); + } + private WalletConnectConfig BuildConfig() { + // build chain + int index = _chainDropdown.value; + + int key = SupportedChains.Keys.ToArray()[index]; + + Chain chain = new Chain(Chain.EvmNamespace, $"{key}", SupportedChains[key]); + return new WalletConnectConfig { ProjectId = ProjectId, ProjectName = ProjectName, - BaseContext = BaseContext, + BaseContext = BaseContext, + Chain = chain, StoragePath = StoragePath, Metadata = Metadata, SupportedWallets = _supportedWallets, From dbc54e056d39aeac222665519c7468618a40835c Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 22 Sep 2023 21:56:11 +0300 Subject: [PATCH 011/167] main thread dispatcher simplified and WalletConnectModal.cs login error fix --- .../Runtime/Scripts/MainThreadDispatcher.cs | 12 +++++------- .../Scripts/Utilities/WalletConnectModal.cs | 3 --- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs index 03626c3fc..b65c75322 100644 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs @@ -22,15 +22,15 @@ private static void Init() #endregion - private readonly ConcurrentQueue _pending = new ConcurrentQueue(); + private readonly Queue _pending = new Queue(); - public void Invoke(Action fn) => _pending.Enqueue(fn); + public void Invoke(Action action) => _pending.Enqueue(action); - public static void Enqueue(Action a) + public static void Enqueue(Action action) { if (Instance == null) return; - Instance.Invoke(a); + Instance.Invoke(action); } private void Update() @@ -44,9 +44,7 @@ private void Update() catch (Exception e) { - Debug.LogError( - $"An error has occurred during processing one of the queued actions in the main thread dispatcher:\n{e}", - this); + Debug.LogError($"{nameof(MainThreadDispatcher)} exception:\n{e}", this); } } } diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs index a06babc2a..f310c0169 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs @@ -43,9 +43,6 @@ private void SessionApproved(SessionStruct session) { MainThreadDispatcher.Instance.Invoke(delegate { - // disable display - Disable(); - Debug.Log($"{session.Topic} Approved"); }); } From 7bb962d39918d93a69617f8ce30446a14ead36a7 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 22 Sep 2023 22:40:50 +0300 Subject: [PATCH 012/167] updated scripts path and added remove extra dll before moving to package lib --- scripts/debug-publish-to-unity-package.bat | 1 + scripts/debug-publish-to-unity-package.sh | 1 + scripts/publish-to-unity-package.bat | 3 ++- scripts/publish-to-unity-package.sh | 3 ++- scripts/release-web3-auth.sh | 2 +- scripts/release-web3-unity.sh | 4 ++-- scripts/setup.bat | 2 +- scripts/setup.sh | 2 +- 8 files changed, 11 insertions(+), 7 deletions(-) diff --git a/scripts/debug-publish-to-unity-package.bat b/scripts/debug-publish-to-unity-package.bat index a489298bc..244b207a6 100644 --- a/scripts/debug-publish-to-unity-package.bat +++ b/scripts/debug-publish-to-unity-package.bat @@ -19,6 +19,7 @@ pushd bin\debug\netstandard2.1\publish del Newtonsoft.Json.dll del UnityEngine.dll +del Microsoft.CSharp.dll if not exist ..\..\..\..\..\..\Packages\io.chainsafe.web3-unity\Runtime\Libraries mkdir ..\..\..\..\..\..\Packages\io.chainsafe.web3-unity\Runtime\Libraries\ del ..\..\..\..\..\..\Packages\io.chainsafe.web3-unity\Runtime\Libraries\* /F /Q copy *.dll ..\..\..\..\..\..\Packages\io.chainsafe.web3-unity\Runtime\Libraries diff --git a/scripts/debug-publish-to-unity-package.sh b/scripts/debug-publish-to-unity-package.sh index 5fc0e1bdd..3213534f3 100644 --- a/scripts/debug-publish-to-unity-package.sh +++ b/scripts/debug-publish-to-unity-package.sh @@ -19,6 +19,7 @@ echo Moving files to Unity package... cd bin/debug/netstandard2.1/publish rm Newtonsoft.Json.dll rm UnityEngine.dll +rm Microsoft.CSharp.dll mkdir -p ../../../../../../Packages/io.chainsafe.web3-unity/Runtime/Libraries rm -f ../../../../../../Packages/io.chainsafe.web3-unity/Runtime/Libraries/* cp *.dll ../../../../../../Packages/io.chainsafe.web3-unity/Runtime/Libraries diff --git a/scripts/publish-to-unity-package.bat b/scripts/publish-to-unity-package.bat index 76ee5265a..890f3ab36 100644 --- a/scripts/publish-to-unity-package.bat +++ b/scripts/publish-to-unity-package.bat @@ -1,7 +1,7 @@ @ECHO OFF echo Building project... -pushd src/ChainSafe.Gaming.Unity +pushd ..\src\ChainSafe.Gaming.Unity del obj /F /Q del bin /F /Q @@ -19,6 +19,7 @@ echo Moving files to Unity package... pushd bin\release\netstandard2.1\publish del Newtonsoft.Json.dll del UnityEngine.dll +del Microsoft.CSharp.dll if not exist ..\..\..\..\..\..\Packages\io.chainsafe.web3-unity\Runtime\Libraries mkdir ..\..\..\..\..\..\Packages\io.chainsafe.web3-unity\Runtime\Libraries\ del ..\..\..\..\..\..\Packages\io.chainsafe.web3-unity\Runtime\Libraries\* /F /Q copy *.dll ..\..\..\..\..\..\Packages\io.chainsafe.web3-unity\Runtime\Libraries diff --git a/scripts/publish-to-unity-package.sh b/scripts/publish-to-unity-package.sh index d3add43ea..a9f86cbb2 100755 --- a/scripts/publish-to-unity-package.sh +++ b/scripts/publish-to-unity-package.sh @@ -2,7 +2,7 @@ set -e echo Building project... -pushd src/ChainSafe.Gaming.Unity +pushd ../src/ChainSafe.Gaming.Unity rm -rf obj rm -rf bin @@ -17,6 +17,7 @@ echo Moving files to Unity package... pushd bin/release/netstandard2.1/publish rm Newtonsoft.Json.dll rm UnityEngine.dll +rm Microsoft.CSharp.dll rm -rf ../../../../../../Packages/io.chainsafe.web3-unity/Runtime/Libraries mkdir -p ../../../../../../Packages/io.chainsafe.web3-unity/Runtime/Libraries cp *.dll ../../../../../../Packages/io.chainsafe.web3-unity/Runtime/Libraries diff --git a/scripts/release-web3-auth.sh b/scripts/release-web3-auth.sh index bdc59c023..6d7f4b2b8 100644 --- a/scripts/release-web3-auth.sh +++ b/scripts/release-web3-auth.sh @@ -2,7 +2,7 @@ ./scripts/setup.sh -git add ./Packages/io.chainsafe.web3-unity.web3auth/. +git add ../Packages/io.chainsafe.web3-unity.web3auth/. MESSAGE="release-v$1" diff --git a/scripts/release-web3-unity.sh b/scripts/release-web3-unity.sh index 9454148c4..6ad9f67ae 100644 --- a/scripts/release-web3-unity.sh +++ b/scripts/release-web3-unity.sh @@ -2,9 +2,9 @@ ./scripts/setup.sh -git add ./Packages/io.chainsafe.web3-unity/. +git add ../Packages/io.chainsafe.web3-unity/. -git add ./Packages/io.chainsafe.web3-unity/Runtime/Libraries/. -f +git add ../Packages/io.chainsafe.web3-unity/Runtime/Libraries/. -f MESSAGE="release-v$1" diff --git a/scripts/setup.bat b/scripts/setup.bat index 8beeaed81..cb975be4f 100644 --- a/scripts/setup.bat +++ b/scripts/setup.bat @@ -4,4 +4,4 @@ REM clone submodules git submodule update --init REM publish DLLs to unity package -.\scripts\publish-to-unity-package.bat +.\publish-to-unity-package.bat diff --git a/scripts/setup.sh b/scripts/setup.sh index 0a7545933..ab5d507a0 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -4,4 +4,4 @@ git submodule update --init # publish DLLs to unity package -./scripts/publish-to-unity-package.sh +./publish-to-unity-package.sh From a4df0c119d969c0be2967724a8be75a98cbe5e71 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 22 Sep 2023 23:02:16 +0300 Subject: [PATCH 013/167] more path updates and refactor to support testing --- .github/workflows/unity_tests.yml | 1 + .../Tests/Runtime/SampleTestsBase.cs | 9 ++--- .../WebPageWallet.cs | 33 +++++++++++++++---- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/.github/workflows/unity_tests.yml b/.github/workflows/unity_tests.yml index 6c03ff4fb..3526f463f 100644 --- a/.github/workflows/unity_tests.yml +++ b/.github/workflows/unity_tests.yml @@ -43,6 +43,7 @@ jobs: - name: Publish to Unity Package run: | rm -f ${{ matrix.publishPath }}/UnityEngine.dll + rm -f ${{ matrix.publishPath }}/Microsoft.CSharp.dll mkdir -p ${{ matrix.packageLibraryPath }} rm -f ${{ matrix.packageLibraryPath }}/* cp ${{ matrix.publishPath }}/*.dll ${{ matrix.packageLibraryPath }}/ diff --git a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs index c3a8019f1..9546db2bb 100644 --- a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs +++ b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs @@ -17,10 +17,13 @@ public class SampleTestsBase [UnitySetUp] public virtual IEnumerator Setup() { - //wait for some time to initialize + // wait for some time to initialize yield return new WaitForSeconds(5f); - //For whatever reason, in github this won't load + // set wallet to testing + WebPageWallet.Testing = true; + + // For whatever reason, in github this won't load var projectConfigScriptableObject = ProjectConfigUtilities.Load(); if (projectConfigScriptableObject == null) { @@ -50,8 +53,6 @@ public virtual IEnumerator Setup() yield return new WaitUntil(() => buildWeb3.IsCompleted); Web3Result = buildWeb3.Result; - - WebPageWallet.Testing = true; } [UnityTearDown] diff --git a/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs b/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs index 2f289cf02..392d50289 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs @@ -74,6 +74,14 @@ public async ValueTask WillStartAsync() { configuration.SavedUserAddress?.AssertIsPublicAddress(nameof(configuration.SavedUserAddress)); + // if testing just don't initialize wallet connect + if (Testing) + { + Address = configuration.SavedUserAddress; + + return; + } + // Wallet Connect WalletConnectUnity.OnConnected += InvokeConnected; WalletConnectUnity.OnSessionApproved += InvokeSessionApproved; @@ -95,7 +103,12 @@ public Task GetAddress() public async Task SignMessage(string message) { - var pageUrl = BuildUrl(); + if (Testing) + { + return TestResponse; + } + + // var pageUrl = BuildUrl(); // Wallet connect SessionStruct session = GetSession(); @@ -113,15 +126,21 @@ public async Task SignMessage(string message) await WalletConnectUnity.SignClient.Request(session.Topic, request, chainId); + var isValid = ValidateResponse(hash); + if (!isValid) + { + throw new Web3Exception("Incorrect response format extracted from clipboard."); + } + // TODO: log event on success return hash; - string BuildUrl() - { - return $"{configuration.ServiceUrl}" + - "?action=sign" + - $"&message={Uri.EscapeDataString(message)}"; - } + // string BuildUrl() + // { + // return $"{configuration.ServiceUrl}" + + // "?action=sign" + + // $"&message={Uri.EscapeDataString(message)}"; + // } // TODO: validate with regex bool ValidateResponse(string response) From 9520ba4b25e39d773d7d1ea4f338e3c34d833699 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 22 Sep 2023 20:11:16 +0000 Subject: [PATCH 014/167] Auto-duplicate Package Samples --- .../Samples~/Web3.Unity/Libraries.meta | 8 + .../Web3.Unity/Libraries/zxing.unity.dll | Bin 0 -> 473600 bytes .../Web3.Unity/Libraries/zxing.unity.dll.meta | 33 + .../Web3.Unity/Scenes/SampleLogin.unity | 2266 ++++++++++++++++- .../Web3.Unity/Scripts/Scenes/Login.cs | 115 +- .../Scripts/Utilities/WalletConnectModal.cs | 90 + .../Utilities/WalletConnectModal.cs.meta | 11 + 7 files changed, 2425 insertions(+), 98 deletions(-) create mode 100644 Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Libraries.meta create mode 100644 Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Libraries/zxing.unity.dll create mode 100644 Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Libraries/zxing.unity.dll.meta create mode 100644 Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs create mode 100644 Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs.meta diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Libraries.meta b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Libraries.meta new file mode 100644 index 000000000..063137848 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Libraries.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ce13820d6d63df9428e5c3e09c97446c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Libraries/zxing.unity.dll b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Libraries/zxing.unity.dll new file mode 100644 index 0000000000000000000000000000000000000000..8459dfba18a1ed9264b75618f6f75b968e2aa7a8 GIT binary patch literal 473600 zcmeFa378yLbw65DRbACx-90m<9#zjGO^t0v6m8>`rDr5fkB#ks0ke3adxR}nvW+DJ zZK`b+4>O3(Y_`F+fJ8Wgh_D30PS{BtAebE+5_Yo$2n5JV60(5&|NYLn)m<}^S^od` zz4yKMz4@fR_nv$1x#!+{?z!i#_2{KnSdL{`F8<$puVsAzF8>zg_t*dINAz&~p<(O2 zrOzMtfuToz{c(7GG#tqw;UynxG(C)~TTTNcwmA*0a~Lp&0vpt733}Cuhd8P=fwn5#fjTLzZ>& zwO2gzT7+M)!<36^ix3`DNE$W?7%O8^|pCm*DPV9Sr^!E$fbx(_XpU@bnzv3_u( zV+{%PcmKKAP70P4*iQ0o+wyET`7WHsw7tA}$Z{LU+s=x30GQ4I;(4C!xXHJeq>w-# zdG@eNLU0QSrI{qalade*0PO!lQ#=45r2@n=t-Lh0*v?oIkcef~PAymuLVElQo$fya z7&tcC8Q==1u~zSo5P=u^GV|`eE^4%?k^m*L_hD z*%#~WS}`n!{>^(^-?{hRdrRHdg11ul5Aj>9_x1s&Rw{M>2*Fwq26HI66_&=sp!-Zj zmAbEIL^&**h>5T)5n(AVgLSZp5_Z879SDclgRbxlO2ccU{T3bu94!n5%U0U}hpmK^ z+6LkQ0L`cX@c;m#3J}j(Dca(i1pa{f$OR1%p~gcX5`|%REI}=>>Ckq*^(wevF;g3>SvIOR(csI^-%4>^*Z|bc;LKHbJdW^25SXXM6{w$SoSLUkcqGdXQHuMzvDt*MjDw zkVOQ^@M@LjiST=2IV^Se17{A@Er?tt3?PSv?h615%aFq|K!tX#5|;he=OK$>3BVGu z+K|0cvGu0}7W-|AHgv7u12M=#2xS1euG75-RTDK|<1IOartX>uC@sh*D_Zyf=s-9II$7w;GT2Le_*E)e6nCfKr@Ve1nv* z(3#o>UaTgSf*ls7lH)*t-EFFk-ssJ5F=%mF@hXZJmjyA7+r*8_K#ppD^FaoCdK-nr zLvE}{(4AJg#n26lcXuHR!4?3Sg^wEZ(aF8m$5B^)WffB47P~dJXOrSyoLEGOtjQ*F zwx((&-oA>%Vs{FkKU8UGTh24a1K2-DAhV1a67y3@< z`ckcjOdGj=8+yVowZ4sp@_G+-*m=+^&>-C=0!A|HejM-IUGLONQ7u4!YBrT%`2hM! zWsY2-*Oa7^#~NX!zLkBOpn6AIIt(BZf$3l6V(SiMSM-;{pmP&++fc0<)rOdkw%YIh8)?0>%XHDm+P&)O7`=-Gqz zEqik;Y+Uvym)cE=bv#UOr6>(h^}XbHB++uZ-rNbmV4oEwPStZLEPw}iN*Miq0xp_M zK*5kWUL4<1@5CcJme3>NN1yWWOXb!)87N^11Kh|CR4kNTSn8l!im1_g=a7Wk47Ka+ zLq>xE*!nccqx~YN!~X^aZ;s;Shvm-XQe0{`*^nkwY1gV@d3>ohTm;?WPHiNrjW*xL zY)1hNquPe%EeyG6=CB=ZXgeiT--h-9I-~6aqGfMq^mtfZYUgkeSqewO4V@g$!48^R6attYW9M-hS)h1J%13|7MGG%6B$9dIZSzjZ|VI{K|+ zB`66BA4Y*wZbGqGUVV39`?t)YbHU#Zpwh~|Gb2`#-;R5^#ti>)l*KtsGdstW%X3kuc~J_{ib?G((kBeH2uDM!t_V#*^vHJ zJ+<_o)H9a;Ts<4pU#KTa|3^Lb6mw}5BOXtkA@NM4zIrCpvU;Y{5%p|JYwFpYo}ixT z^bGaHDOA}thxc<7yYDKxK#(WWCx|-6`&-bdR{3(C4r#A-zpKwe;2M8B1TIo{i~i)f1(! zR}WfPJ!oR}ppDgoMph46Sv_cG_1t$AK_Y)m6@6BcPo!TIcQXC5xKrs@#od&CQ{2tz zcf_4ezb`JT=tt@a(x0lQoc@z~D(TPFQ%!%Np5Y8KlKziEM$>!M6Q+(W^|>MS)l*B$ z>KRK%)Uz?IsV7S7>Zzww>KRXC^-QEEsAn?0zj~(96V;QGqEi$yown4INfA2Qpo&&u z{|4-6T8#1ZF@ijiUL-E0NZhIPGI2MVGHo_Rn$Aj8%1RVuB`T*+k|c2@y;?oh6!Qv- z({S2T&q(?V^^B&=>Iu{5sAog^eD&1Q7pZ3~eVKYTrY~1dl-{PEdirYhjHj&*tX}a8qn7C+kPCqN|boxbcAw^$SPmq39J>~S9>ZxRHN{ehEB1MFqe_w8k{>`q>C(D>@@fqy*bpP)Z^APDrQ z3LtnA!kpt7qL};G%P>aqi;BfB`hweo>C&HP?nVH0hdD}gFo9L?&4F*rcIqYsW)K=T zAsPm@Goc~LBWjG>%V;NeDVP+~W;P-zr1uh-Bi^CeI*EZo79J-#(8$6QB#0y?T()5w zVdV8zSPxno(KZgKQ6t({iK;SvGnG?9B^;=kGR|>`E^gjk!Q`X9Cw|V(eeFsUtXai4 z5a9TpneSr0x>KU#oo&Qp8doh%w%&&EyQnplJOFvq@X9h(@EoQYoZoEPQ*W=Z7U7Ru zI}u>THX&S$jmx>{nR|U?W-#igR@xL#1tJ6!HigZyVCH8PO9x;@jCWvpNk6 zdlS1uw;c$3MOc8eO1=8dxV+n|?`gx@E;PxIw~CD2uyEkAtd7~hWKSz)1(8IO~# zZy@1D$=kJFj7YR#=!k8;IT$ZDIVFsPV6yD_orG-(stN1(0&&qgb6Gy&fRryC6#+L6h}7j`mx zECVDDMrs9Ky;SmY!SVLhOFJ-)FFpAL;NtJct=9eE3;_Su+FkJ|8T1V4w+R)lgfhtMe=jZi7&5lT4(lSLK184Go@ zQOL0~EFYd74=aafC&KFCtiw-quFkwyCzxm%ol>w)LZPrAgSinkTJjStUZC|eMTh0R zpAmw!fH`y|toua=1IWff)Z_TUO6X4K{^v>L`dQ)S)8G1Bue6{Sb>sNMgF#Z3ABsqpq=(F z?nu7JQlaghBY6A;o;XEy@^}R;PCSCSP$Bv0|3(#E!z%iJc_py$(ngp&^<~LU9!h~% zk*b|KW?e@q!N0`A;zOX(Wna3-;tuUOS9dDw0PU*h__6t|PUi`TU2ri?JW6_Q-DZJ zF$5%wFD@z>K@YvHoYix{&1&~*ul1Lx z-V!qA^4Ia7|J>)cKa7n5|CLu>**X(y4n~QIIpRS5hn_5K)ny5j!>)|^Zzth?yA;}i zvN`Ow%d)uQ0pv4edwy~TYGO{t94VLQ3w!R?ud<~J9U^whO<93JvR{|tTPB4J^1qS( zH-Rm*Jzskyd3UWk#%I`7p$p|@Ejmj(0y{b=LT`_&+bI)587G8pr?MWWEva`@*JBzu z7AHL)t3j?;TrwkAfsl?s%!uUKb(8T#KVv{7V?a#C>u~xRufx3WjQyiBF7}7Q0*6AM zL!rl^uz0xfNhfM?naEMWlEG>l#wp8<7Dnk9I7h7`?ukQDCKJaYQe}bzipU|vf`t%& zUlbbG+tLqh5%;{5C*KE6Mw5UoNmcI{GJnfxX~Xl77ypbU3v=I^)TzJ{7W5nHo!q_# zKGJSvI8e+qcqcp4JL>JFc8sV?jjeyzw2J{AMr^R3hG=83E4me8j6JjMaJX3pV^z1p z!~+1*C_p@qw-d2=>_j@X7%|HG*}^&Y18#y8%CecvC+nKvMi}2iXpea2M&u9Qgi`#c$!5}dCJIfu;@dSE79!I=Oo+91ZZ|c=0NP z>}6siuN??DaXi)SqNy|J0(he`6r8vdk4kJ4vnEWNXzlmo67-rt6E~?T`w<-lI#8YD z&1>H>EkwBBZt`jE#b8DKP|!0?NPd)lki<7aUZ@|^?}*lzP?E|XHjIv~CK`5pTqIl7 zQXii6Vb`)CuA$xAiDD$X@Dq65T`0D*6komrIu!fU4EpVgJ9ik|U@GWV-30v0j(cg& z18`E?Wk%{K{UJDVg#j)nna%RhEhSF``C4HW%So7PAKbkEHmbeIz@rn8MLIKgueZ=uHwzqOECJWTOJm)%l-b(bWWI<_;aHY)~GNK@_|wF=e*!b);6;pTV*4}NezPI}F- z_^}r_tb3v(rMU-?@^Ec5!hRtY3ig`tcLTp$Sk#5fGHTq5)&%zg%_@C~CZAkhgob=IUr73Whz zyftMWKc9SZZSqZPllL?3CkMXa1I!ziH=*)2g`37(BdohggeJquaH93E+|C;hC%DTu z9@YV`hxO2Hy^HXu#GSz82@sLeoUB$wY`v-EB0!qAD&GKX7C=2?kfGYN3|7zWTbfOx!Ji$efqEi&8;E339SoQ_A^wdruPika+2 z_ZBJ8GvQ3Bdlr1*OgP#-TRm>~T=i7C7@imvb-^G!YD>Kp%+ltBUI(J(c$i2~Mr|Kn z<%3?sk_{jZeNiCbZ5yv{d3x;y%BVLEmF%|O122Y}4*q5M@U_vfdmAt^MFdW#*;G5_T!hXK{dYFOg#n={q<|z`6-A z{Sf$$z)hCGb8j2gOv;YCqhjNXRtJ!(Un+W??gHSBi(@F#h_b$p6E!p)N_qs4_8?bS zb;R>DZp|4$o<_miHtitSx&r7hRYO;lH;zClBhHRW^BhD)I6LCXnWPd#dI@XkT7$GS z>NxOXmQrM%9__-~EffPrHAfD2d4B1TG)l4cUgT+PFWY(?67$cV?3}|Pk)si;bMF6$ zOAW#>i$WJu5=)lpWv#p+XMGxSrl%n%cN%hHr!j^iNtxaW7lU^u=TfufI&7?+yT?1+ zEns7yTwML9MODJ-Gk+Ua&n>Kf7jh*;aUlCRJ|)XVD401*;>b}CoQ>OAT;u@FV{$tk zZH0QL+7wL<(7cJP@5)88#7JNu4)#s_R#&R$zRo@Dj*rtVp}XS#H1R~3HCkTJ!m20h zD4fc+Atzk!W7gAIamUls#GOdDi#wSfXO_7 zl%q|CAOrP$U_2j~$Ok6#fvGGYEFO$!>WAVpgC=Jm%Jo6di_h$gw-1R~9WO2X5KXE4 zEB0mO0e1bM@5h%BTe?Mj{Q!Ghu}`fGu*VM;i}9(%#&M-eF`iq4eNtRGB>5oa$#L~i zteno?g+|w<1nIhzKtY>02s`dT=pM@YC=W#aEtrjC)An1kgglz)HD{2L7U6+tfn7t0 zOdb?S=p71CUT#K&1(5k0mYG$o$EU>FEQY0n+?&{#KsrzCpOWGx+;=nd=-^~@ND|g_ zz9`L&1GDEc~zfJ(QQ ziGTB6?d=i(^cK}$RgLv;p$dyn>YU>s(V6(qKlB!8$+#-JPVmfcg|%QcFT@W<4_U4p zS27i`3NRB8;6w&IO)wRxXEUQplXHv=b1K86S&caSTE%FA^KTv)-UCNYO37L$7c4K! zAlSv#VznkvwPUq{*L?trjkAd~OJK{Rf&$Kf=Ba#eUboPcVZ!S^g}SI9&Nj@>Bo6q{ zF2VdKKaUy$2!* zR^-S}MJA|4;Rf5&u9xfvg`(!hesd2e3q_ga6*Vs}!2rcfG>@t^dpfs$bq@bMxHHH@ z*>P`~xfg()cLyS>PIn(t9)$QFv2jKpT7MO>5>*0}O&l#e383P95x%yEMMY?p{Rq>B443~Lgsjl(5IAvIX?25LQeSz|aJXlbt-WIn~ zC~9%1u&(rT#2??6pB|QL0+=S0qH6Oah%1Q{Rj|$NcTWM->q68a2ktskDqzvY{Q*jS0GSD~@q3cZQ#vqk3^6QL#(6{KbJ|oE^CyG#5b%VRFrL< zYCYmvJZ3=uAuIW0=C4_I|3Ldde)$O;$nq2NcN^zp5l8^b42oSs8R9z6W8g;8XNXX@ z1%u{Iy|WW%ga+YVLA*^Ceb)e!!&oG*cjr(#vnI?1=b&+G|8Nh2uI;V>1N^LDd4d~V zE8F05F^*um#G=c1x)M+Rt^|Lu`Ov2c!ckyimQfz2+=_~^R?%Eo(_;9bbD-iEXLt{B zXE7e#(|sn|y6n-5&7pD8zvdWx)ptu8?K_cIYWMa66_vs~9}lYclRTLj@+9pwsmq@9 z@_w$qkiwj8%6K#;Qm*~>)EfF91^wCe^vjA{(Ug;0D?rL}2C^2@KNuaTdL=DkDJx-6 zq_K=&^p|1%;Jle3{19I>rk|)Y~}wp`5a-2yA8=+HjG~ zgavj?Dn&-B{J0j@JuR5GXdhCLqf0h+KBVG2G!vm6b-K?&S}rxRI!)DN)sA|1tTt$= zEV8ZFw5y~!pzSC$qXl+dB`iw}>UAViR?a-k;R4SQxse6825o{KQb9|HJuntvA@}CJ z35%p+)f_=Ab_S6>`}8vqz)7>8qF>7Fs^WD~T&z6GxV6Deu#}7&LPe*0June&Aw17R zJle_KBN1xdbn+tlv5bq`tu1@B@4hd+2!{762GLA@RR(1BQp=+YnTw#?IDZwHyAc+g zDXROSP~66OcJC(F^2S!L21bHWBxszB6@$W9f`L5HHgcp7pu1B!vbSV0QYWyW-`1gir3u%IF{(2NXKydZiFvoczGv&=c&Kfklh97mJAt@ z%%A+iA_AY6AvW;J_Ot2n9ojF!wL@rgkCzZn3_O34vujf)_ni)7^lwN9AwhmHel$ON zvix9ABR}`p`5il*8LAZb=cIm}?)w z0pU!ljzbR#G+Hn>12%Fp6PN3{*+*%cglWxYUlXr)H!=RN1MfnDEzO@2zRa$qrl)9g zoCACXx`8ghDJR7o&F-T_*z3{*y?N9YNJA+FbC7Dw>GqIzj#HDYVAld5r88ywKg$nF z8<||gOv;i8>qYk?FgElvecIYgvx#R|XjRZjyt(HA*Xv%3qRf+`hxO!mX-QO|Tpw+s zUmJvacbQpC4FEaZXCq4P>?pCiak?vj%f_SNwr8$FPrXFRGYQTXV@e=8#OL0` zxxd=`b5uP-hLUf`)wRfx&qGOZ!HL?M_ z?!IJ0W=GggxJ(4&%|O(9rm}I0!>78IFpw3TEh?>*6)1VmP$^A0VaXr^WDyp$OdmNz z8Hfv!kCK)(D;WF0Cd3B<4DrF-%$9v@%s`;CpU+0vh76qU3*gn|AHVxT_%Z4**6ZGY zUo*>=IRe|smwB(5V>i@x*kHlDW~8;-5U#+lUPq{44_ZbtX?FEG-4}s8v=D7uDkJJl z=P1Rv%&}drBX?g6-#|6~?&(DAZyr11y#$1MFU8OPm*EG18wt3HfSd8dL;q?tOxwK* zPX#t;z4TszM$2rQRj4i8;YQ!}8cT@HMgf8g$yua=dCyufj>Mt=295KO<9;OUoy{DX zf_M4d-Wy5(c#Qn#C=*U{Zsz&D%=2)1aNyz*8Q?qvcw`26lmR?C1DtOFkI4X!HGs!u z0L&}`jHFV_$ps8Zfw?Iz1L6O(3|%x}=wfAW2TYZ4v*jcPvqry|3iLx1gQHqwzbNB6LiiHI)4aU?EpXT+Y1nfLjZ#$ zV?8AZy3C;aTKqIVrcp;Flmv!@v3!E_?BwN0X!rgEOeC)$4NBcDndjEba~nOtJ^{08L)Uss{tqmmCGb zKlbVNv4pOi*}#Iarx)~v@~DjkWtwxmWkf2Dx8%2Pxm_0Zz1H7>D`_-gz|e(0v>x22 zi&ZdCSAMu8h5%N#m}AB6?u8?3_t0W;nfU>5v1o<8HVpqR*O_ppGxXb7k<>&>*tNRl z_H1`bVXe=Ajm+fIEL!gX2n)x>?hmM4(cM#I)d=)XO~HC2@_7h&bP8>yv3&#(7bj{p zy`F5r;SqC021k+mMIh5z5s<#hR5jPtt%U6$CXzU`(0oGA<*euYO zN^oJGw{1*ubf2LB+u%dOJu+4H!8ZP3Ai0!-bQrFPT z0+jk+N8$5%3RjZ?km+`R!n(@>KV@KEW3X=fBL;7_m!AwoS>u&D;^aZlXkwf(k zDzct{GaFHjOKn*m8EXbeR5x3w_F<_<*P_0|I0BlO<5+h5#O@zMTi|A83%%R2yKh6N zjF%BaK~{=(_ig|pulpr9TcRp1vNWMjdD=kU%D~GJx(8E;pSX1t5nPNGg$G^A!q@wI z=)N3ZDyn+3RX&`--g$gkYam*7${kW?|>3y8|w&B*^z=* zny4*QqTl^GQkVTmUtf70fWB4@9z2j@z;wojkKg@&f3DHX9TVT_uOasA5?s0olg(f>ugiikvWW^oWHAO{6|ezquD7sQu73 zG_+#`UUC!CutG@MZlEP9#c}OD)sh$a+Hrgo{oSM&y0?+{_{7Cw1hG@9ouvsg3)9$m zc5#Is7bIGWFl!KY0WLBzTXSzqUdSrJ=}9bk55joxBWkhl;O5*m+OnnCq{fpuIO%ko zl42n9@)jlrEb}0bY{cTkh~i}eSZtk(YSb5`xE5fG-MqlMkT-_py%^iS4LkZLZe{jG z6oa+lH;e)C9i-3hn*JCO{ENqKIt3Lr8})FL1h*#YyE0iS8<%=-QBTmrYYd2q%e~jCr_#GZJ=NZSt7o|P7wQ@5 z;avqHkM^!sPuP35dN%YPr=D65ZyW6<#ccxl1I`$d0*9HUk!fXCp7 zumX%~Nozpy;%Yr1&2oBNK3GXlL2$yWC%*)>YWmPzsOF|;DsCi6YlZZ2`LtY~G2Nkz zth3Ps*Ia78pFAI#jTK8{p*uE)a}@rV{Pl)dF7~ZUkz^6&84K#=CJKfFg|b=|&)>Ki zsz!F&Z~~zqS>v5646S-DDz6BzMVa+&-&vr|lwBA#-553a3lvQH>8SN>(16W5s6!4) zUW!*H^$jS~ebcL1%zE;li0og+$A!}b{oJdhPt(}{LI4kd3{X*DFUf@p>8lxv5+c^T z^!2$oKYg2qBo6n)rjr{`G4oU_W3^)X!5nTW{df*HC~D1OG(feYYOxPHh9|{}V_|7b zYgcWnQ$b4XgZQLutZ8wu>yIwx`iqV6TQuoBgs5Q;4x1!hHWf_Cw@_3$`w|ZTf1EpX__8AE-$$rhUva}C%y%)zE* z#$iY-Gbh3R2A&DT0VEn^Jhcs8LY^6vKRlH<##i@-QSrmxu*!5IA}zY_mJBaSa6AXI zvz4cysxY&CDxCs1m}Gz*>vq>19(_5jkQcp*qUU8E_tC#Ug(k+y5xl}d7(>Q=#m$@ z6R3 zTrxj7$?#c<%+C^JesZ7Tld}v??lL$z%-}4g!qvP-35)`v4!#@wV=-;L{`frlr@SGz zPJgg-m(%YIdN20xlL%$4rav42p*DV+3l-9T(Gax{)W$Dzaen%%T&S2jzUV3DQ!AyV zTqr21ni%8hSUiBY5xGK57$CF;l?PRGrZS{`(BJs}V5nA>EeD}6UBOft$DC>Q;zlw9 zt_EBQc-=Pv)Yp?n@!qVqkkfEvh_IWqSZt$n9MSIix^=82#6SG#x*b8G*3|9hK`G05 zJvn#^F*;Z+B_BnBO>>m|-n$Tj5KiF@wws|R9)W!9>8y|LN1Nl;;Vf`go(sPi#8|h6 z4ly@u3iDTiJ1o53A2>M7746%`;%u;wY$(O z?g!v@KZqanxepO{1ET%aRnREDs+4>fpnXg2vW%$$#kl(C7+3wqWO@NA7tR%QzMZ}V zjxmnO!PHIL(ekr*-9J01yPq`E@nRo~4W@IBOOPkW6}xWwbn-w{GWzr>bPCC7bkKdz zfE!Pnu_rkRAu|RfC+Ga94*aSF`eW$Jm?JGA@j!}h%mCs6;HC^99sq960OH9EdhpBj zufKr%Xz-oc^hRNM-H)Q$(u+}4eVP=b9#4Tlte|Jj+Cillwa|YoKPrk`m3^7km%Zf0 z;J-R1Tdt+K(}Ih>-=1qQXExTtHECdz%i_AtV`r_N-+!1jOS|l=0O1OWx)0o z9*Q|0%!@_O>C z(5nT?(tFGNRp>|AtN2D;>)F8QWQ zj_HzDy5y2B`J+qD=#nS8lJCW7P_nMs4?%F#QTlGtSY3~)ojPKD+OfF)4Bec{ddrM8 zV_6~@W0+-f4MrZrS3Nr>7o#zAAFGwdYQb2oJXWiW)u4rkd!I&m^~u{ufn+%9Cl{ar zc{SLmdt4_C#cmsK%QLfnav>3LCpg?7a6r=tOom}{Cy2@6>~KT1`AZl8>87J1Dos4{ zVWr3CBG?(i4OnOVG-HyZV+zf8Fy`c=W4z`o8S|i{WBleaW6;z3oSA%z&C3{r1>7uV z9<64j=j8w}$gK3j9N-xQT$%%1Nx)S(02M}><^b$@>9ccyGYGgL2RNR9SL6U80S5;F zF`iI0rB%uT9+nO#WSqsz)PD$ln*Q+sRm<@996-wOfgC`}@Ua{~%J8`yK+5oy96-wO z-5fy5@RJ-s%J6SFfRy3L05B*6rFcylzRuzngF!n8^$j_IP~VgT2=y%kfGpFXhVVAC zshVo@c_e%40B2sv&gTF^_Us%$$eup{%rS`(@JX{&8E!B+RKg9>gqStBYCp)f%p|;C zzoGjXbOiJz=^w2({gNyCFbjBLOJ}@T665pxeCB(kH;?{A-A{XW8Sdjj2Ae(`K?7$w zlB`$TX5XdU`z&I3i>3u+zoeU4ye9PkIb3eGsSrN3RVPbsJhz<_LYy!+EAlo%V-4BY zH$46sw7y9wbM32uaRJgwUIDn7L!Pv+7ZHK288TNb#mVCR5XQC-mBu_X0mCMf0z&eL zWV1+kNx`~&r4=JLQFT*|_QWHA#y@*1vy-0ys<4wgbPCB1Iwe^ zsUOdO4%U_ah>DXov3Q_g4`%@J0Py+@ARYkzI0J|WfH!0S@c{6~3?LrVmv4O+e4m5* zGG8meyy=~&p|lN&s+(ti?Brr_b|V^X=y3OQh~0v#_s2( zL|EG0ARaqmK@_^a2q-*cW`Id#p=g z1jl#;vp&F_0ZmJ!ZG)415oxl8C{48g;zc=YQp$pNoSDyZ{FsE?JfYAvNv~YoK8m~s z;kBeD2BdUyz7@#IZZ0avZedL>g?=FogQ8)Jy^A0qjq}nkpz5)+_7N0tKWh$6d*NXbiFz2(BjFOhO*89@nUHgV`uFLAk)ZdXQ>9o7Gl-F{q%h7wCS=SI)LS; z7x%-aDtkEp?D0UPlRSgIr}yV{$+O6sn=G&8@BodNbC3c%i(}=N7kC1q8_Y5*dl`wP?Eeqns;+#c`z3$Z5Htgg5>?Y(B}c2_Ngo zJt#s;0y2AN0&=rs z8)ZNJWLAT6zrokCYU7Pn9No0UD}33OsdG5ue zomR>dfu=X5aXheuKz@i}jzx3+$WC63&|Cr(^%f6`)OhJ#tR$g`^Qc71l86Ok3*T5R zd=**|=S~ric{-n#vZWLnz`~WxuyL$|BMRhAhq02p66~el%I85Enjz51kUmo7#aqnS zm;N}9&bnGN4nisXd8QP^1HfNo0Pz5DM+OiN0DqYQ!~?*`GJtrpE=<|m51w|Q&a?Hv z^uIGXn%ACNtYm8Mc%XV|)DLUVy8*yK5t<%v(lnOx-pdTSd<@ip###u%|- z@df4L8Z;_TzQ(R-)na7OD!GM6jJmM*3%dR&I+>=r^pj0lKY0U+0zHopX|SLC37pJ! zbadIbU{-(g(vSA}c-B7R0pJrEKs*5aRR$1GR$Hn+UJO1i$<^1~3;VT-s{UEMA zfe==cFGn6`HJSC$??6B&Z_uMW?=t8^Jl~{Z;c&*S zIA-PihV<4!SxGZ}?;yChPX>iuxw4!7Fj>uNK>I_|4;w8K&u{8iyMp{p+dUA| zv#Z`Ff0G&v6_2AnXV18;thJT(NbcEx4*lk`LH?_lBCNIdW#iPBdN4a`=|jMbSC5j9 zqq4EDJceB5(?xWs+YH_(5x@sElshhTtbPT#l%no;z?Gch#3nxvT4e-qlHul1Hd0JJ1=4aj zNqvRn(*$@L@-$RU?j+Dx$D}E0TuFg}I%Rb#ntWt%ehiQ0QZKDJhx#qR(mzHa?DW0( zO}>ljuge4lA1z&Q!68nUmP?M`{T^auNBte}=-IM2A~8l9_6InB3#ZLbe!d@`+}y5K zz*;Xpgom|WeC+aVteL-N%@nkm<&$-FV=d=gm64r2mJ&r@T4Fv%1^2)&;FKA>eUygm=59<`LckBILzcoXXMzz_aCO+jV3~)hfQIxEWp5 z4@VY4xSp7G_1+Iqbe!F7u@4UNt1f1Z>4YOlVx|tGdV>Xz8-5eX@X0oR?qsCHLV7Xz z1SNj7Fvp42>ff;TN9AKx-5&zg;5VOu$X}1LdY2?!ML`2eS{q%xdmS}^zNDZCjbgAM z3Dcl%Bmrxf;F6NyVe$X(;L7VNIHU{kj|A)q7%ig@x6^}D%bS1Ie_PJ6{uu=KpnN(c z1)i+TlzTr$dM=;9B*i0dgVoERa}KMG)35B0eoS??Zw=sSUdx{s;-}<|ceX)mBDs+a zIhb7CN@>7RO2gc=6_Md=Mv~S@m0POBh5eS@l zD#YYx@Ou$XU3dQhzH;*<03G?xZ4P=5`P;G{7t>Eri}pp`e?(Hek+83ejnn{V*MS~v z!FbC%s}^oON9R}(ma^q+Jp0lWy^?ed_P>%E)D=&EbQzH8GLA+59R5o4IK&jY{{}y778!%G!x@sdY9RA! z(qE%?kM$Cj9D>(-xm&DZ4**3mU zrfJ30Ih-BT@=FsKMq%W5C46N-J>!`t$~=?C1NEX;2u0zEqA{D&56fz3&8D=Ga~sui z=U;2xybm9!)y2dZT)MgQw)lFU_Ffk#{eD8b^e`~_mu^9mW=n=&K0Ao0_veTyz z!gn$Jf$Gx1+x_#=b(uOgf?UZ=3V z^*jtjd(qC>eBAUotU4o^nAh3mja-l*x zoeOy>_MbD%^8= z`T0_LXyOEIq5r(MmMv|=Ta`yC!m?Qkl%=0_#`R8+rC?O85cPjZdoMi4^mALqm6pN$V^>%sBlZ%_|dy!a}eLh^MwSmgVr zxP{~%alPa_;`+(=#4RS@7q^uB5H4hS`D>JEZqA7ZfUjo&@c;k?qZr}=02)mJ;sM}W z89+P$piLA*JOIFCR)BZ_fNocScmVir1`v;w8QNLa6#Dx~cJdW)EqWtUBv=>x+A(0? z=)=r4X*>BAK=LU+B%yyjneP$?jT7WZ|1DwA^Lf}0`e_Ymvn!X)C^;Sn))r3RijZvSPY*}TQ&6smkBDv}8m!Lbr$~*h}zg5A!}tv$pJdtHP`|%N@|TWOo|&^r8b$j8nUDNp7U! z15|j#x=Oq_RKyw(d;gAdU%!gDZ5|VxYPaturY3Kjc+KzQK;WMppVQ(PZpRPb&J`4d zJ2Q8nskOWsb-sx@uQT%r6ZKem#Bb))2qKHe8yXiH#K(7LK4TCsHc=fDb#Z6r^Cs#v z6E$a|PV3CvZKBRJQD>W|GdnZikf>wTAnOlmh2NeGVUDu(1G_FR79mg5$E+_v;X3%g z6aVSw|NP(e2zc>%opSCyP{9qN9<5Pt*97MqiYBx7N`mVo z!MSTQ`;aEMz(7qI?~nv%lLblZ$EV7~{iqUtQV^%suwshwIf+6HW)U}}UqZ+jM&E;y zO20h_Q)%hTdr|T)=-YZ$_Gw6X4rL=Q>6qmvKc}K_l7FXDNPa;FW7dDcjUSsGy8c&$ zvNhm;%lZGK?;pX-f?!y?^RbtRzfX=htceHX%MUVucmVie1`rPbf0qHoGf?MZ4?G`b z>54wryOn8iG+UjtrGC;e0K9msUWCL^>kpwjWUGaf`M8Q+?a5HhdoJk=a5xP}PtGIb zRmJ}Rp)DmJbAq1K?H9~DhP`RL@3Ml~EWd2}Gdjx>Sf(Gd(HTVJeIZP2Mw6n9ts@ z@ba#KCY2#b`2#K+j8tn%01j*$IQpB$s@S221kP)UCTww0dKo zbKN3%l!*bqX?QI|i3R@DwsZKFqU7 z{MQ$?E?BYkwmE?lKhUg}RDi2&nQo@-fG>5xQeK;3_ZJj6E`ws-jn8oz14qWohXNb@ z8s98Bg6@b%#s41JB_k+}++^~Em3ijosc6XIYEK2s@J&SxE7$OC>YaqMf>hyGa8_$d zmP%aVbs3NAjb;E^nr!}gLP6w83b(+HSzptXa)>Z%-Fhczo+W7pa+7b-e)?la8(R3P zG53+)k9umZtm8mX)^Z?32ON}h9B6YZ2kP&qA4o$!+R!pBMGknZ-AM{)4LRHn|9_$_ zxhR4A>9NvV~HaG*wrfm`y*GV?8@!4eXPr@HG zIilh{C<&OR&zhF@W7dS*G);}^DTQ`22CpN(h7xRVtj7_ok%p$xI?B;`Ig(rz0vk-A zd`;v4Q-GqaM0LniEu*Xvd7|~jNA#)A3sJ+HFiWB+pX72B(X14CqP)+3jJlj3zhOJas_B+e28lgJK}=hdTGm+7Kl3%q zrpc;Wn_arCA$hE}XJ<2_Bh(CUQf8rM06A)gH>IYWYh7LnS|YQmfQHeuGLv=&VR=7L zf(<(<0l|^qWD~_eOQ_t)>8VUEVC`nAi}T~&ub}2Qa7a&*uEQ?Hu0tTZk$C*f!%ilU zB0aDo+zb$8o^s}?(4+GLsx~dpPpD8gB8E>Xiq2gZ7Y*WE>q|(N4)iha-&LEeT~CIP zQf{15e;Z#PGI98Ry&0Y9+fkO43Nv1Q6xu|+Re8WQPwqER&|yXvYHF#IVm?)#SBKFXy4Z6fGSp>@rlA&?(SeEp2f;j$&Xk| z?W3yw4J?y>f|1;`_(2Hpa?*gjk}S0=Ss~WRZ8cvSc_a$8zVN^S0aH+Xmc$5L=&q4C zM(n^lQ;kcdD)-Z*sqd4Xzn{GkgQ{AjGoJ#{n;v9YQ!D>SI6|}|kAsVuS?EmdfnH&Z zcMzA|*=W%|xzgl2@ysQ!QhZn5zj^vP{MmUn(-xCFp3$qVmBYodq;+50=$ri=RPf4w zAr~0m|4nCE0?YKHeRr__qm}e_gGnk!OsBJQ10&4ve9o9b`TL1jo8^*??ZT|s}jucEw>MS!?DH~)&?Ohfgw!b*t zCFCcWicDxywf#|k<^vhFo`Jg8y67DTe5_>QwBoZ7fn%3k#J~y?Rc;oVTc9u&Wy3Io zJy33W;8~gqqS6Op#x~Y_B4}N&9eovJgqu8)g*VqUaEX7g0+pcnL4p(0Uh)VsAg391 zyS?>H)QIg%5$)cf7Q8_%fZ0LGi=LFcI4HRgQ*={umix2d^O^l}?$l z0GAI6kk3@b12w%JNRD?4-Ue$U={BbEr*}g%0k{R<7uTkr6&`0RrhSXP3Zs0@56R@g z!g^IcF_xEEs6sZIQH7Wxii~trvTS4(;X_0UixxbDOY8HvZ(tD1{^Z(p488GL*IIVce`g}};(Ve>1Xbt;tpH7UCW%OKeJ8ya>C$Rw zU9(~6NW=uPzL;ROD7XvuW1bvpa7YAGh8!)AeBjXZ(dV+9EQd(Ae)mQSQ|}%DIgv9* z0FeNcX{B>j_gbH)7Jn3?!e zhQZue3c!sl86O?)y;|2JooMvHXmj>+Xm5^Bq@kTAsUkZ+spD78E`J7XW$hEVfc0qt z(`I)t4{fFHyf zl>C7tVJbKtT@u-_`9>t~q+!l|0^%{}{&z5+JdC-}#`jcYDBhTJL+ssb&P~6mkHMUq zK+~RLg-h!CqRzP)nYD(J6-{Vxv`l8sEvU~!rg?ej&zT1zB9mCocnKQJxsNR={q)C< zHnfhObFa&ebM67CKj&5svN`uaj8s-tq$CTbKX&we&AHj;$C`7W4tO@_CQg3Ny_{=P zRkee8BI7vcmRgp6t=@zcj`zCR_-4-iSor&MZV6y6!*rUuzNm9T4HgoPg(X2|MF}g_5ORn zH}i4^dC5Z^={Z!ILm0W#-pcWEUwNOimMp$f+H&4YiKrQc~Z(5zofocMBW$+X}IEhVX)Zo{4HU4tdX#?6K&^dFf*p?K@9WH zI)#{$Umh?Kne4J`CP@jeQg~7%F@0Bmf%cbR+4rP)QXi}TK`@1Mo;S4cb}iS>s2)WA zR9(m?!ZIZ!c|UqXzXJ3zF(-Mn6lK)%P!<)Xvq_c9+WoWq_kixopd7!JuFe=tMV5_Q z5opyF=WzvfEH-n>T3G#}#mKvX~1yGS-jcAe(xIJaNnJW7P;K zic>9Uu;Tg>1{rnpWtAC)+EcFeR?}vV*1SlZ)ZN<#b(aagC6_svZw7S7K>oqFu-u^4c3OC1mmi=#W&VZn2Vqrfc>#FCa8_E>*KH~ZciE~WstXiw=M=GMa7Kw=uEL0j(B~h?yYpGw?A|*C+)~#0e{ryU9zoMk%$I z#h5ip!q%=)E`gi;TsYrCSfgBD_qjDna+9r5o}Ob`veY$7VeXjn++V2_D*Uu6S1M`U zo3fkYmS%FDfs2(|2U1xkPSz`tkp1ouT&y32QpvEg1iMp43F*^CjNEj_%z+hBbaqH_ zi_Rq#-AI(v_=f$Z{4}VId!XC?3QVi$t(THXaA9EbJ>0btqx!?O9LNMFjj$QWTUiC6 zqUF_AC>p`5?`!Wca^u@2Rr)kSYDFg>!Yxni<5C82ytUvJlP9R8;rMhe4eo!39wIM7 zzn0s%ID2J5eD zaUv1=YZkUb8P^=%1C{lS0?*TNkTzoJwsYE27i{DVp{G|pgd2bHi{R$I6PT%Nl#Tt& z>-pe>iaBUL^4Dh8@jEjjgl&A0RV3PNuaW8cJ`>ylN#i0?VSzg+SzfTGtQWAF3%DPt z1f)Pp)W{V|A;9)pDDDQagSH_Z%(-B&43Yt6NOj{*Z7$9 zi2a<77)xzGN3?OZOZU_E#L~YEwEMYY+jzWLB99-dtNgzt5PdAS#y`n5e!`Ej#y@(D zHU1oae~n*~$D?c3_(w0n8b2PRa1$Goo5nuFNwnhfyF>Mx(7lFM(0km*yEV$GZ045}dGFNjh5JDklqXajp^=Br4QX@& z2cKF~X4Cu3;4)@F+hhu~WL@$KduKd*36Ea50C^jif>pe3=z0g(UV2ad2IYe#m3Jjf zp>>;v*?R}@sgkU$_0E+$%gy6S3|~bsoZh@w7Wz#}Wsj-mzD7MbwcAgwq@?0QCsLsc zY!UU!t=ppPZ9v~yzXdN>9>vTFzYQ};Huu%vk{f)chvh~MxQDc!-hwP%#D40?*;PHt z>N-63VKuN^H)^xG+^Icfye#r80E?ci!AJ6mD%M@K=*y+&I2Mo#5T9J2F@kGjvCJtq z;*(Ze0EqCt7u<5;G6p_pg!ecgW4mz02Q|*yJ)yh6WAe&m(Fj>s*ma>kShcWU6%701 zEJ&07@{ma!)f#AZ9$aMPAftFEXuIB3MSA}fs1a&}sPkm?o$WZbW@S_9fcFwe= z?>eFz*k+F89vJpLC4}LRB4gv`?QWzN5~dC1k$uFmUq9aPm$kcN^vG7xg+m)NU5Ej0 z6Uj-mXX-(by#tqBXtp9)Y-~(@CF9ZM`^nN*k$x+);+DY-3E|_$U`ua;*Ebhg*xkFz zxc)ynB+@zE`Z}n%1+VRY>2@JM?6$IfD%aYD4)x-kyox@Dl96`kpnIXLyg~9R<|Ry* z4(y}BT;DTu5&rh=#E0Y5Q%9FU#Q2_>Gw>%7>KWIF$vrb8_>&0rOlrjRo|${Cdo77j z&$LG1yW%=xG82A1e&5b`lu;f&q7%A%56Q`pVrvgds4N%bnWe2L5ALANU@&JXI<-Pw z?mf%W3%c~~`Yv>8lnXEK_;HL6w#ld9ya=*RQ3<`BwPGFjlTHI2+l8&C!1V^kMfAdb+UGN5%Q+yRjo-&Br^5|21vL5!# z^Z9X-*DWeDx^_W4xE9@IN{iCl3At|Uj%TILX79q6wA}>9fP?)UPic}k$ud#U{~W$W zEq|E}A_J>yOpzD$yB`i-dq@p?!>5CB0*$g#q~BhqgD>TYMN@*majP+Q)+Q<_J|0sR zB-kt@N!x`q`B^#1LPFa8X9xK!E_H^3Tbo9wY1T^^(P)&Cs&~K)|CiS@TZd^1{8pUk z!Gb(xg{>4ay(VR*TQmD%U<2L%*W|Z86%CuU;~Ck?k7o=YYdkB+4T%ZJ9dtFN0L#Fl z1plUA3&U<*VhW~x>QSa1@kzpfpCl~fi;b+!?Oc|_gpoC>3V&xG*R3?qLM%)ise`J6 zE4mzhwFa?niR#RX#Sz~OGTDt=uk~ffppM|Oh=Xyazrd@AE$O!pboT%QKOn+goVB++_|5C z89~H1y*&9sX%?dXomoOJF3NI69M_6U1KJmNO)*hMyI(%{4}AhfU}CI?nTK@vwq>RN zHBMn!uIy(up#^QlNL=(fwNlCNU?{*VR7Da9viqcys-Pn8&}`j5G&>%a4$V%4!6C6* zFxRx$7cg$id_a#iXkXfEc8N<@J2iX5HiY|C%=miMT|CvC$hIl z&8aowNwY0(6oA&9XXCEeJhlqyibz83qHNL zE*edVw0Mcd)2o~qGi5`l0TS~zMncB^&DIuq2Wm~T41GMNM)c? zc6^xyIx+*{8+KxSE3S_`^|f`U>(SzR7$Qf8i=R;A@0B0QH$fP zJ<~dC#9F|l$x7cdiHC*c8+8ey%%_3unHN9_>%(BlAFz4HIOZ3uhf_D>uLp4q_E$l? z2MG`M55pIwccQV9R|CC1Za%`AqP?%drw-FEBkFMS`-mGKpiTT5w8?(lkC+rBe$^*2 z)sGA78h3xXLVi;}4zKq}y2th7HuvMMFmcQMxaoe}%T3%H`f+ioANfHO`NctG(2xAS ziTtlYWVs(%9anZvpewA#m5HpHGF~4lNaN{a21wODg)0n&l|kf4Kk_yc`PM3T0(paCuBPFt)UNnf@*pJ+6BA-8q zjQWwcn8>#dA_p?`K@<7qLF9Np<@ZeF{|q7rVpW20Q*@^2YMl?{>NFF%eGoa7{vHA% z!ZUAym=A*SrnHkq#hWLycH3iU^u!%cpDXS}3ga@%a3EN(Hpp-2M>ZBPN&jbb3d}l2 zOivY;W8iUM;N{f)PVbdK30B$NZ0KclxK(yI$Lpf|o9~`G@>U?mP2fidk51tX9(y=g zmgK%B?@#N#5B=15USCB}1GIF2*POf1X+h&$No#kZXo4;{3ZQJ{^VSIs|Q zlaoI)=aSoXt~_0#%XKLBAt`q9Iy!~qFdf{h{bO;x~}kJ+6Vc>W^qNg%_R=H+=v?g>d5w#iK^d-B?O!s27Lg!ffQuClB>G+@2T#ts@^mzwWhiy z&8TJYIE@U(?9zBfEn^eFVaI@46JvV}gkhXC8LC|_n(>g1i);CC}b)IxQl|ni#pU!h!=dhi+ zdks#}kLx4)Zhi48zgFE~sHkr-Jmh2OxNkA6aE%6iOE2F>-`XATe0>WJ8ENXCL%kL` ze4Gtmb#7c|Y++l^fKp$4pa+f^4eE<1M#TAuzF)U}i8eZ~w{b!6@@S4rE!{fS1?QS!eZc{0vex!(r*4Q z;#1Cl7Wuo1k^2f@HN;?7Uz|O4UyYXjUM4@yoHp33JSx{;K>0`>FS+)%%4y_eCL@!X zbTmJ{3Y2o~4aeJ+GSebYbnW{F+Ld7X<}M|u?sI$mYP8~Zr74HJ_N|)XZS8JgmTv1b zO)o%{Rml^|HS`K6fF{*_cEzG-=a^)L=PP({x`li^5!qvKiXROBiR`tcm=eV*s zPU6T6VeN}&Ho>u?ggNQJaeJM(UA$!DPnbMh4XBdJ%;fT2dmpI$D1>z5uBn8+7`xJ7?D@9icD0L2)((w4T5=+uqeVFq60e8=D(iop7N9>d`*! z92c{ls2HqLAUJbN+i}#c1+^5FNDU#=Q+2gLt#d>FFQJ5VtnQ01sgGWSgDG4Bw!;8- z=T9|!JR&9$*P=LVIdF5enlwhIJa#PXb0FhrHbZWDC2&lA;*+(dOn3df{+qT-xX7AZP%d=tfS0E#Y9tHU2x zpdw2o8;8~SqKU}dTg4L<6CK3W!~c5b-~S!afsMO2Qa+OXP!emM8<<Mp61Ko$%ZL`Dzftxjmw!p7cp}usoZMfuxV^^@M2T8iLQIJ zZ2h}?wEuZZ)QuUBAtnpp%zsUJi9EIHQ4mU+A9cZu%Hx)D7RH}y) z1BiUMsigfz)aC%q;Sb}x(PnnoPm3}I zn$no@4p)_FyT0^tS~l}ahwJrJ-$7i9(*Bp>N{%R(wKP!6BBK0STYHHPv3fTs1D#r6 z64@RZ-IitdeQJ&VU9CVqW+^J3O_u~}?v6`>(a)05KHiduT@tY+At=M6B@tT^wZMva zpd_;QEQ$YVNwu_mXlugb4G<2&?;Xfo zF`4u&c)C5+X}2>XanfFc2tTnWGL=jfh_oTnPTCofshr4kr@hY+iB81HzO@rkvTv9Z znNFq)MD{^sU$QSFGMy7iJMB(Jq?WK~jP#RbCr#16L00(2^J!T(XLc#C*mwn z4K_8HXgqTRWfN@XDW()ZgU~ebge?ydO4{a7b~~jvD{Y&{8M(AlXs|Hh(X3dgRkcvN zQng^4>BIp-UWDF`P>HD*+1hUP=;b#+JfFTp#+uWEVG`MM%~)YZk6lnJ_|t<7+D$4R zyXu}Ed&Uu2b2Nqyy0|NewQrb&kHjisXA)V`K8fMZBq*b@-MgW6-b7_t^Iy5Xqz#HI z?a-HX0Hm{MHa(RUsSnMTt=uS}a>JX=Uk=sOKMplT2w3j3dg1;Px>02dC2u9bzk^vn z+=qbXj!NmPq=6kb`>4MJms{1JQBhslp>?Mnk4%jjovjlOqJF@7TDox&A3dFz46&kZ zy2}e7%?k2nr%=HHFR9MtmSJmGXY*@hTDjU(*e{P)=W&`vV>y|ch?r?FLsDaJ^=DrZT#L_HNg2)zK6afh!MctUm0HcdyH;mN0rPy=8a)o8jn2 zGJ~g3+l-)jiY==yb7pU}G=vYlUa!v`rKu(i^LZIG;0I_N^HW=*&9P0Xjk&ER^&Q3F zIZI;OV`vAWUD({*gF8hUcL}=Pp*Hwsh0rgRH_m7TQ6Dbb*>77@SiW9!yll=Fg7QuG zVPj*B35|CP9$cA(>8;jIdkX_;r(N6nXFlHsm*w>8z${Br#v3MI({y5_uwAo5ehCvZ zftG%v6^-9|!-xO|8F@nUXUEL!ChVnqfWRgL^?#5=+ewU;e_d6ZgpOLo(hXzJ%m6I3 z(H|52l{yh)wlLLZV(#7JVK{q(Z9CINHjcw~V;=>gmzLQ+B`p%6ypoA^b}X&odK4tB z?csWx+eMP5ORUA>U@x&+ibVu-EK*JyGsmv(EZ#S@(mJjFX9uLLd>PJN@9Gd!>7=~_iAnz?~1@D5yS=TTkh#ek}D z29hIpo%c&PyU=fwYCGh%K5e(#kq2v+)t?l5Nwg&f%>e|Lx0Qeyz}iPx`V-Q<9bRb# z9~28S$Cy**hp28%q7us;)KBuEHiP1}I?t{}>DomnNfir%Zh2tq+x6a!5z3bk6@9Nqi0jx!4j#uPA9C zw&+j602l~q29KxNx}kP(Z?)i)fwN35yAz!ivp%laid+XcwbpzrOumgWU@gC1UXv#O zG9U;nF60q}an=`G6V-COR*BYX)iVKR?baK;@uuVowqs#GRgdOvaDu$ie3juI@`QCpDad98uJ6& zXEng!GG!4H?2$?=-hTrtL6_u_D@7UkMSC(%S01E5HC?$kPuXwYl2o_5-0i1MzrDWZ zL26sw8(2EBz;wAw+LMNrOx`L9lSE79!MjNwMbGNiz=Gk{sy%C4m-A$7h)b73^Br*S)O1ef)}NvI z)^|(Z`dy%$Y97t;ByP3zPU6xR6C{sph{O;ZBJsm)Ep~8oBX(q9A$Hm<`os=`olWtB zU}aPMFyL;AAGcjnU6zyj8`=$ik(#xe%)7Llq`AIEuWh#g)63TB_JTxfN$coshRW4H z8c+p|4Vu)EvLRXu2Rdx1xuYt-R^r=urr{q`YS9}wZ~O+h71J?x65_J9zUJ6svM9r; zvZrs#k$qDZ5DFf>t-@F3T3?k<`>KrDSL;pTKQ zi^fSdOA+Us6;{~3)u?@pX2l5{w=Zp!z9#$0uv;*(d7))`UdRI))2nc&aLWa)=hn@KjIZPpWv*a@19q`s6}lhEI;V;pJ%= zVn*HYhOS1)yUO9YjFS4##V#8SpV_kUq^2gW%9fTwN~UZDkRw_uIihipBl;{U?XoMC z98o<>6qWZpY0(-dtuh!V?GSx-9b%TWL(GzPh(2kDXr)PF4lzqw1(+wT*yE&yGEUkd z`lKCVmb636l6HtbX@{64?GRnkt`>eWA2T0AYK)PO)}y-hSRR$soRkOs19`g*t$)5k z{WI7Us@vLpk0KQT%zc%PCQnwbRIR>8A*_ymZ7KR35=G2Cw9G7*m4NxFk+=T--Ol%Soh$MHaw zxv8g_R`@KkN}MNhu&LN64Sh(l7}MREmX|B<_5l;@5YGH5DigN&m>d+ba>4ks!eIqV zdvPi#Uys#_r>PPtZ*vaMkt!N^SWfx&vpc@sQ+ha;e^-L8M9SMkrq0Db^|-bS9XoZh zdhzreer1~$=t}LHZJCGYT~Aebwg%FCs(r{D#|=69m!AB6XMf|Wt3Fja8STN?=U%Xc zG{1MxS0h~CgGk>|Gn2U656<@P;o$vwDH&CMKLlO^20xMsxPE{|V6iI7TaO1(7W!ewE)=Vz+lQ_r2F?Is)WnccXd*SNV9g>Lg&;-8 z5u#C#oNZoB{4M?X^=UM8Jw_nSje4f;@tWgipYGh%xk#!QVc?3^p1KW6+F*;dt;3q= zoD~>n?VK+(I>wjZ+po-Ig%ZcGmG;g=uBDjRMm#oUb#9Xh(G%k2TkSiKG4E@9|`j{;l$F zx$@jgjOR#N+sN_(j~sqhEjD8mu2BtF36=q;a(x)F;1rvGu9;lACn0U>w6=4PZAUWU z9iW#0b&By9?^Vq+&x<+BA`d^Q##fNPYzs-L-o*crIA! zj8wNtwbDoVLZx#PsQMT3u#mf6k#|LXuIsg1-SQ7y|5^)lsav0mbukG*WUzFINbD{< zEVY#k;(^BYNX0&sh|wJ};pj)w!@d3K3IJFYXmC^H&(2uuH)=P$s6EqL-V{+EC{5|wz{ zjc{_y&OCY*U)Vrjc6f}zMCGf6lI*y1th`)j2Ws#EaOPS`HmtUAo#HBx@z2S3!hyVs zWZCdp%djnFH^}=8sau)}L>428ed5{V^AM3+yffe9Jdx4~HZEb^y7eTzZtAz36|&zY zjPA{M)=;tZecY`LK4)WT^V*V;l_x)kmEB)_B&oGg4_eyRm} zt7A-!WWIS%^%kzR3UcbEB~3K>r%C^b?Jui587pO<=KU9Tyqv?N)xUkKq{=Tgh%>;Qa%9w48jqflyq6Kg+XWnwEj;&y;G(gu`s2niFHLWn>l!k-J6r&_2Y* zwL^RPrMtxTFh38fYhSoEI|ryjuz8tb+#KRy%%FvfL|HDmK;GBIO@ou`I;S&Ww@4XK&#IcasxSqfrUJI<%E(ET2g< z<>sWl*X-SqgDv}D9GqHH3gBt)cQsG_*S{}adUQX2PV4hYoiaKt>L+#T=JYymM#>_) z3ze5u-6ucBNKpW?(d1g8)5;!VlZ~e_0Bl`Hz>TZ&8Zh0z0-#I3Qu?3J_+?6}vaB}F zC_=&3m+#4YS(m7W{fB_ujPprTwBpgz0oG4l%X?$#zB%s37U2FVe)5ZRgH1)KjqXB; z=3>=Gf6jX&vjPl9Zy^|t-pp^*TiAGpY#X>N?5%{QM{xC9>9X#A9-qR|+w_5P%72() z5ugt!X!AV%865q0@)V3-2{LzUzlul0`M`~QPQqX+=zlk?X5r3uE9z{UDPp@CrFL!` zBel+2jEI?iwR_XG=uWd4XBN4bb8<8qkv?a+CD@l%&T9>A?e`G4LG+Kwh>d+q7ZDCX zZ2?J|1*;L1Li8l3iuUTEBr@f0-ofI*FK9J`F}c=&S3&6& z_joNlO$i**d1hoDRiahWtJ6h<8tL}%>dIAC2I-<{WM?q|J*}F}ZO$L)q~p{5t0*ql zZmOmC(#GGbwEMrJ2BX3Hcvvs-t#hX)kMX?OhDx(OnIK4Zcd{-T>b<^Cb-&u6p0s&vKB&?Qhx`< zKeto|G*vybPXVb{xxMfHbhTwkTX=r}@7S|)=W3BaV;DB6 zAVtuKopBvVr~i+FG_-c^e_XGuZ&^lvjaMFD=dtl_fzdRMeo;VLSpR!?Va??3s$m~V z`%wh!kQAX&9{mfC^5|dr-S|>O?{`KC)06=wqMPrbZCrCmqlL3MFn>NQEio|YUL)=8 zKM=>yh~8Mkk#u$}Xp=2ov}AKjRNnk0BZ!1i3)EVt5MN>TSS)1z8_X0wBv~{UyE8OF zo-t85iwT>jlPDa#miDhzcAg8D8DeV;Gp^z#wc6c$BsQTZvCoIRS2#M%dn~h}!DpD9 z;{GFG()Evuou8*?Fa~{v;$RH=GLJ?WnK=Qwo0rldnU(Kn30IbSJTd&PjJ^t5$IdC} zhHXC@c-dZL-fe835DtC|CSr{PW!>{yuy1vCt@Uu;u8a*AUdPuXYD=u~QOD?h+H(KV zu)1{v1s`nccli?F@@f4f!LJuQ*wn-9V*TqWST^>zj`2nEPDLfdS|_U5YL;K2kzX0q zlHdMGS16Ll)tIAM+98iq#L+YPVg?{|1}7lmkv zZHOq$uB|SMLf0BhQpNd?F%h3d;t9J*#7kc!qGQ5H98%4T!tAP%sGUXPiMvSDmfqz^ zn7K7xIBX)>R9)2k06z_aFA8@*d;f7eh{SH(MV@N@O{AEq&8)QmtNsBW{&r{*xjSr; zCtJ(b(!=tZ63+mpj{zP$R_iy?dN@yZl6j?HrnMR#HL||)2!i?#EsaJ2eBey(smxYq z*A84eT$>D-C73@-sD%lXXD6rz`>-dl%(E%9In%WmZ^O>`RxSM@v1pgb)q`?(Nd2SZ z?X#f?m)W?`9j;^Re$0LAobOxb8^q(=H;Q+j)XvYx`Kd`ey^C|}ch%DG6!O>^rnsp* zM+Q5?&iOuc&-o#R$@6^Zocluu=Fb_Ud%h1d=lWpvR?O4P`SR2~--q*+LRy(UH-{gil%qBi=U%Hw&m+c{sQpR;by(f+1hr`>T|+()k~Z8-B>T zkr4xFiw$4j&pRt5&2gdgZT2?StX>P|P<{XuL_&tnZYper>>w&p?Wj!rFvVnTR9lzp zy~NF?cEDok4YUsql&w2?F>6i?!9bI=Wa(P>t-H3)>AjY0RM{$E`GrJe=>ZPYeVfFf zzl=rygxgh^xS^QgRb*)+96eu!5jzp2Nhg@0Z$WQ1+T_Dp z!!Hvl806cZB!%dv>sW}Gs48}LR8O$XC-qxYPHwlE#G@Ayy^R_2^LQprnbNV81P&Q0(K_N<6dYb@9^EZ`|*BqBYt0T*K3QBBfQm3>%<(F!0 zTkeut+r>zx5JoBC6){+6!ehgId13y~h}K-U&Pl5&G}T>+$37NBDVkk+gmG3wt?fVriKF=?CHa3r5i z>5+#~4zX9NX;aOfy2d8VY2AXz0<{tQ#JU+JOxupJHofsiV!L%tx%AVN&-=+>TCaAl z4(3Pyg>T$PsU*|I$mDTHFu-7aqUE{+;A|W5^Bqp1MzjuyFXpT5;;X5JKTG(CR&LS4 zOZerI)n47a#FcxOx`^C%_z}3hXlV`>qJ_WA33QEsl&y~7ehYt2;R$}qy#rpA_bEcr z!sq$5VJ}+vf^bwtOTTTOw7zwhFV>gdW01cVMENP7j1FW9N*pM46ksO;JFhmxzZoMQ zI1l0thWI5RTGN;{K22zB;Ta1fu=3yMEd13hymWVq|F`^_WHnkiqfZjS2UfvOF}Uag z>5*$$v07o<{_5u`v=3Ol&19Muhd95gxJoS7M%Dpq9vbzpr+rBjjh29;4wY?8 z86Tn*s5rl#zt{4oa~8JEU}JK)4nRX=bLk=WcIs(1Hkp?|drzvb#|Y9ql5j-bTF#np zBN&|1FmHJBAW0C)JEZ(@fKo>Z$K5q^ozO8)Z~{1I;33=|(cMo!Y2t8vSe~BqFtB6nl_}NiS?V~nZaABw5$TZ zmv^r#Etft-+5Y-}Lj6gu`wi<4Qzi0tj{19gp&a%8AE-aI^>Oi>-dQ|n)gRe~lmDaj z_b8X-ahFw@lAqGMvKnWM$GaPzYpStpGBg6;Slwe>wXY~t?d4Xrl6!obG=778x?YLQ zK|}SfKH2bHT@)EReV+_npKLCv>xJ>Qw|*%1TE6ja0Qc4p<=&zPK3Tx7Z_g_p_;3Md zJaEAS?=N6)!cO>>YrT7Bt=5ciYQ28;;ePoCmt!-PoEbcW$tG*b7x7L@)_&Gh6680S zKUT)@s2(n?GASQzRMP0yFtWfp&|V)9o;WLABBA(;s^<@j1W+BC&NwD5IcCSZu1!*2sb z3tt0_E5O}Ea5<4#Q^d9kG;28(fTwHTJkv#FYiGs1^G#WUiwAOJh}r_v;Ck8AIekjH zUK?Ss>*xHtBy4F{Pu`0e3#k)RNqqzU>o4dm?vWG&?fm|al%^Tg_DDXa(U8WTEc_@h z<#jtzat&Dz!eJwFE=3}DO5cnm*Ib>sdq_mB*S|@Yn+HF7kK7HkCWYRd2QTJejng^y z#W`5R4#yiEk$dJ~bxco3DbMW(%u%IO(?6W(<`BHVZZ)hEj?

F8NBN0w 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


o65LHO;C-`@D4j^vv#{ubcZyAXe5 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 z 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 zWB<1;JN3)k__BackingField: f4bff60eb260841f46b1c77588cd8acb + k__BackingField: Web3.Unity + k__BackingField: unity-game + k__BackingField: + Name: Web3.Unity + Description: web3.unity is an open-source gaming SDK written in C# and developed + by ChainSafe Gaming. It connects games built in the Unity game engine to the + blockchain. The library currently supports games built for web browsers (WebGL), + iOS/Android mobile, and desktop. web3.unity is compatible with most EVM-based + chains such as Ethereum, Polygon, Moonbeam, Cronos, Nervos, and Binance Smart + Chain, letting developers easily choose and switch between them to create the + best in-game experience. + Url: https://chainsafe.io/ + Icons: [] + Redirect: + Native: + Universal: + VerifyUrl: + _chainDropdown: {fileID: 1479042110} --- !u!1 &1434038407 GameObject: m_ObjectHideFlags: 0 @@ -1921,6 +3405,177 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 +--- !u!1 &1479042107 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1479042108} + - component: {fileID: 1479042112} + - component: {fileID: 1479042111} + - component: {fileID: 1479042110} + - component: {fileID: 1479042109} + - component: {fileID: 1479042113} + m_Layer: 5 + m_Name: ChainDropdown + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1479042108 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1479042107} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1082413008} + - {fileID: 1528831652} + - {fileID: 1182349767} + m_Father: {fileID: 2036998554} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1479042109 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1479042107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1479042110 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1479042107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1479042111} + m_Template: {fileID: 1182349767} + m_CaptionText: {fileID: 1082413009} + m_CaptionImage: {fileID: 0} + m_Placeholder: {fileID: 0} + m_ItemText: {fileID: 400348269} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_AlphaFadeSpeed: 0.15 +--- !u!114 &1479042111 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1479042107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.054901965, g: 0.054901965, b: 0.054901965, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1479042112 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1479042107} + m_CullTransparentMesh: 1 +--- !u!114 &1479042113 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1479042107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 1, g: 1, b: 1, a: 0.2} + m_EffectDistance: {x: 1, y: 1} + m_UseGraphicAlpha: 1 --- !u!1 &1491563361 GameObject: m_ObjectHideFlags: 0 @@ -2087,20 +3742,174 @@ MonoBehaviour: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1508551059} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 + m_GameObject: {fileID: 1508551059} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &1528831651 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1528831652} + - component: {fileID: 1528831654} + - component: {fileID: 1528831653} + m_Layer: 5 + m_Name: Arrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1528831652 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1528831651} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1479042108} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -15, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1528831653 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1528831651} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1528831654 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1528831651} + m_CullTransparentMesh: 1 +--- !u!1 &1561876540 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1561876541} + - component: {fileID: 1561876544} + - component: {fileID: 1561876543} + m_Layer: 5 + m_Name: Backdrop + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1561876541 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1561876540} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 311857776} + - {fileID: 1993078179} + m_Father: {fileID: 1278821651} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1561876543 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1561876540} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.5019608} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1561876544 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1561876540} + m_CullTransparentMesh: 1 --- !u!1 &1701305866 GameObject: m_ObjectHideFlags: 0 @@ -2133,7 +3942,7 @@ RectTransform: - {fileID: 108583392} - {fileID: 279245843} m_Father: {fileID: 1880270956} - m_RootOrder: 2 + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -2288,6 +4097,93 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &1792992065 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1792992066} + - component: {fileID: 1792992067} + m_Layer: 5 + m_Name: Item + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1792992066 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792992065} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 736475703} + - {fileID: 400348268} + m_Father: {fileID: 458235390} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1792992067 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792992065} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 736475704} + toggleTransition: 1 + graphic: {fileID: 0} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 --- !u!1 &1880270952 GameObject: m_ObjectHideFlags: 0 @@ -2382,6 +4278,7 @@ RectTransform: m_Children: - {fileID: 920270120} - {fileID: 1434038408} + - {fileID: 395689440} - {fileID: 1701305867} m_Father: {fileID: 0} m_RootOrder: 3 @@ -2467,6 +4364,186 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1900245908} m_CullTransparentMesh: 1 +--- !u!1 &1993078178 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1993078179} + - component: {fileID: 1993078181} + - component: {fileID: 1993078180} + - component: {fileID: 1993078182} + m_Layer: 5 + m_Name: CloseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1993078179 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993078178} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1561876541} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 50, y: 50} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1993078180 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993078178} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: X + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 31.3 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: -15, y: 15, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1993078181 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993078178} + m_CullTransparentMesh: 1 +--- !u!114 &1993078182 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993078178} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1561876543} + m_OnClick: + m_PersistentCalls: + m_Calls: [] --- !u!1001 &1996606957 PrefabInstance: m_ObjectHideFlags: 0 @@ -2639,6 +4716,7 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: + - {fileID: 1479042108} - {fileID: 787012149} - {fileID: 724612375} m_Father: {fileID: 1434038408} diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs index a8935759d..d9027c4e0 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -6,16 +7,21 @@ using ChainSafe.Gaming.Evm.JsonRpc; using ChainSafe.Gaming.UnityPackage; using ChainSafe.Gaming.Wallets; +using ChainSafe.Gaming.Wallets.WalletConnect; using ChainSafe.Gaming.Web3; using ChainSafe.Gaming.Web3.Build; using ChainSafe.Gaming.Web3.Unity; using ChainSafe.GamingSdk.Gelato; using ChainSafe.GamingSdk.Web3Auth; - +using Newtonsoft.Json; +using TMPro; using UnityEngine; using UnityEngine.Assertions; +using UnityEngine.Networking; using UnityEngine.SceneManagement; using UnityEngine.UI; +using WalletConnectSharp.Core; +using Web3Unity.Scripts.WalletConnect; namespace Scenes @@ -51,7 +57,38 @@ public class Login : MonoBehaviour private bool useWebPageWallet; - private void Awake() + #region Wallet Connect + + [field: Header("Wallet Connect")] + + [field: SerializeField] public string ProjectId { get; private set; } + + [field: SerializeField] public string ProjectName { get; private set; } + + [field: SerializeField] public string BaseContext { get; private set; } + + [field: SerializeField] public Metadata Metadata { get; private set; } = new Metadata + { + Name = "Web3.Unity", + //from package.json + Description = "web3.unity is an open-source gaming SDK written in C# and developed by ChainSafe Gaming. It connects games built in the Unity game engine to the blockchain. The library currently supports games built for web browsers (WebGL), iOS/Android mobile, and desktop. web3.unity is compatible with most EVM-based chains such as Ethereum, Polygon, Moonbeam, Cronos, Nervos, and Binance Smart Chain, letting developers easily choose and switch between them to create the best in-game experience.", + Url = "https://chainsafe.io/" + }; + + [field: SerializeField] private TMP_Dropdown _chainDropdown; + + public string StoragePath => $"{Application.persistentDataPath}/wc_storage.json"; + + // chain id, name pairs + public static Dictionary SupportedChains { get; private set; } = new Dictionary() + { + {1, "Ethereum"}, + {5, "Goerli"}, + }; + + #endregion + + private IEnumerator Start() { Assert.IsNotNull(Web3AuthButtons); Assert.IsTrue(Web3AuthButtons.Count > 0); @@ -63,7 +100,12 @@ private void Awake() // Remember me only works with the WebPageWallet RememberMeToggle.gameObject.SetActive(useWebPageWallet); - + + // Wallet Connect + PopulateChainDropDown(); + + yield return FetchSupportedWallets(); + #if UNITY_WEBGL ProcessWeb3Auth(); #endif @@ -97,6 +139,7 @@ private async void TryAutoLogin() new WebPageWalletConfig { SavedUserAddress = savedAccount, + WalletConnectConfig = BuildConfig() }); }); @@ -116,7 +159,11 @@ private async void LoginWithExistingAccount() */ if (useWebPageWallet) { - services.UseWebPageWallet(); + services.UseWebPageWallet( + new WebPageWalletConfig + { + WalletConnectConfig = BuildConfig() + }); } else { @@ -231,5 +278,65 @@ private void ConfigureCommonServices(IWeb3ServiceCollection services) "0x1d6f31b71e12a1a584ca20853495161c48ba491f")); } + + #region Wallet Connect + + private Dictionary _supportedWallets; + + private void PopulateChainDropDown() + { + _chainDropdown.AddOptions(SupportedChains.Values.ToList()); + } + + private WalletConnectConfig BuildConfig() + { + // build chain + int index = _chainDropdown.value; + + int key = SupportedChains.Keys.ToArray()[index]; + + Chain chain = new Chain(Chain.EvmNamespace, $"{key}", SupportedChains[key]); + + return new WalletConnectConfig + { + ProjectId = ProjectId, + ProjectName = ProjectName, + BaseContext = BaseContext, + Chain = chain, + StoragePath = StoragePath, + Metadata = Metadata, + SupportedWallets = _supportedWallets, + IsMobilePlatform = Application.isMobilePlatform, + Logger = new WCUnityLogger() + }; + } + + private IEnumerator FetchSupportedWallets() + { + using (UnityWebRequest webRequest = UnityWebRequest.Get("https://registry.walletconnect.org/data/wallets.json")) + { + // Request and wait for the desired page. + yield return webRequest.SendWebRequest(); + + if (webRequest.result != UnityWebRequest.Result.Success) + { + Debug.LogError("Error Getting Supported Wallets: " + webRequest.error); + + yield return null; + } + + else + { + var json = webRequest.downloadHandler.text; + + _supportedWallets = JsonConvert.DeserializeObject>(json) + .ToDictionary(w => w.Key, w => (Wallet)w.Value); + + Debug.Log($"Fetched {_supportedWallets.Count} Supported Wallets."); + } + } + } + + #endregion } } \ No newline at end of file diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs new file mode 100644 index 000000000..f310c0169 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs @@ -0,0 +1,90 @@ +using ChainSafe.Gaming.Wallets; +using UnityEngine; +using UnityEngine.UI; +using WalletConnectSharp.Sign.Models; +using WalletConnectSharp.Sign.Models.Engine; +using Web3Unity.Scripts; +using ZXing; +using ZXing.QrCode; + +public class WalletConnectModal : MonoBehaviour +{ + [SerializeField] private Image _qrCodeImage; + [SerializeField] private Button _copyToClipboardButton; + [SerializeField] private Button _backButton; + + [SerializeField] private Transform _container; + + private void Start() + { + _backButton.onClick.AddListener(Disable); + + WebPageWallet.OnConnected += WalletConnected; + + WebPageWallet.OnSessionApproved += SessionApproved; + } + + private void WalletConnected(ConnectedData data) + { + MainThreadDispatcher.Instance.Invoke(delegate + { + // enable display + _container.gameObject.SetActive(true); + + string uri = data.Uri; + + GenerateQrCode(uri); + + SetClipboard(uri); + }); + } + + private void SessionApproved(SessionStruct session) + { + MainThreadDispatcher.Instance.Invoke(delegate + { + Debug.Log($"{session.Topic} Approved"); + }); + } + + private void SetClipboard(string uri) + { + _copyToClipboardButton.onClick.RemoveAllListeners(); + + _copyToClipboardButton.onClick.AddListener(delegate { GUIUtility.systemCopyBuffer = uri; }); + } + + private static Color32[] Encode(string textForEncoding, int width, int height) + { + var writer = new BarcodeWriter + { + Format = BarcodeFormat.QR_CODE, Options = new QrCodeEncodingOptions { Height = height, Width = width } + }; + return writer.Write(textForEncoding); + } + + private void GenerateQrCode(string text) + { + var encoded = new Texture2D(256, 256); + var color32 = Encode(text, encoded.width, encoded.height); + encoded.SetPixels32(color32); + encoded.Apply(); + + // Convert the texture into a sprite and assign it to our QR code image + var qrCodeSprite = Sprite.Create(encoded, new Rect(0, 0, encoded.width, encoded.height), + new Vector2(0.5f, 0.5f), 100f); + _qrCodeImage.sprite = qrCodeSprite; + } + + private void Disable() + { + _container.gameObject.SetActive(false); + } + + private void OnDisable() + { + WebPageWallet.OnConnected -= WalletConnected; + + WebPageWallet.OnSessionApproved -= SessionApproved; + } +} \ No newline at end of file diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs.meta b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs.meta new file mode 100644 index 000000000..312ee2bc1 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fb890e484538c444da09be8d0f89dcd8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 2e215258b7ae923eec9507ff790353fd7b8af7f4 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 22 Sep 2023 23:18:27 +0300 Subject: [PATCH 015/167] made some lint changes --- .../WebPageWallet.cs | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs b/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs index 392d50289..b080676c4 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs @@ -25,6 +25,14 @@ namespace ChainSafe.Gaming.Wallets { public class WebPageWallet : ISigner, ITransactionExecutor, ILifecycleParticipant { + public WebPageWallet(IRpcProvider provider, WebPageWalletConfig configuration, IOperatingSystemMediator operatingSystem, IChainConfig chainConfig) + { + this.provider = provider; + this.operatingSystem = operatingSystem; + this.chainConfig = chainConfig; + this.configuration = configuration; + } + public delegate string ConnectMessageBuildDelegate(DateTime expirationTime); public delegate void Connected(ConnectedData connectedData); @@ -35,6 +43,10 @@ public class WebPageWallet : ISigner, ITransactionExecutor, ILifecycleParticipan public static event SessionApproved OnSessionApproved; + public static bool Testing { get; set; } = false; + + public static string TestResponse { get; set; } = string.Empty; + private static void InvokeConnected(ConnectedData connectedData) { OnConnected?.Invoke(connectedData); @@ -58,18 +70,6 @@ private static void InvokeSessionApproved(SessionStruct session) public WalletConnectUnity WalletConnectUnity { get; private set; } = new WalletConnectUnity(); - public WebPageWallet(IRpcProvider provider, WebPageWalletConfig configuration, IOperatingSystemMediator operatingSystem, IChainConfig chainConfig) - { - this.provider = provider; - this.operatingSystem = operatingSystem; - this.chainConfig = chainConfig; - this.configuration = configuration; - } - - public static bool Testing { get; set; } = false; - - public static string TestResponse { get; set; } = string.Empty; - public async ValueTask WillStartAsync() { configuration.SavedUserAddress?.AssertIsPublicAddress(nameof(configuration.SavedUserAddress)); @@ -125,7 +125,6 @@ public async Task SignMessage(string message) string hash = await WalletConnectUnity.SignClient.Request(session.Topic, request, chainId); - var isValid = ValidateResponse(hash); if (!isValid) { @@ -307,7 +306,7 @@ private async Task GetAccountVerifyUserOwns() { // sign current time var expirationTime = DateTime.Now + configuration.ConnectRequestExpiresAfter; - ConnectedData connectedData = await WalletConnectUnity.ConnectClient(); + await WalletConnectUnity.ConnectClient(); var (address, _) = GetCurrentAddress(); @@ -324,21 +323,21 @@ private async Task GetAccountVerifyUserOwns() return address; - string ExtractPublicAddress(string sig, string originalMessage) - { - try - { - var msg = "\x19" + "Ethereum Signed Message:\n" + originalMessage.Length + originalMessage; - var msgHash = new Sha3Keccack().CalculateHash(Encoding.UTF8.GetBytes(msg)); - var ecdsaSignature = MessageSigner.ExtractEcdsaSignature(sig); - var key = EthECKey.RecoverFromSignature(ecdsaSignature, msgHash); - return key.GetPublicAddress(); - } - catch - { - throw new Web3Exception("Invalid signature"); - } - } + // string ExtractPublicAddress(string sig, string originalMessage) + // { + // try + // { + // var msg = "\x19" + "Ethereum Signed Message:\n" + originalMessage.Length + originalMessage; + // var msgHash = new Sha3Keccack().CalculateHash(Encoding.UTF8.GetBytes(msg)); + // var ecdsaSignature = MessageSigner.ExtractEcdsaSignature(sig); + // var key = EthECKey.RecoverFromSignature(ecdsaSignature, msgHash); + // return key.GetPublicAddress(); + // } + // catch + // { + // throw new Web3Exception("Invalid signature"); + // } + // } } /* From 7c30b81144b9d9fe07fbe767d29c458c26228379 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 22 Sep 2023 23:25:25 +0300 Subject: [PATCH 016/167] more lint fixes --- .../WalletConnect/WalletConnectConfig.cs | 18 +++++++++--------- .../WalletConnect/WalletConnectUnity.cs | 11 +++++------ 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs index d9fe32876..f6a240a8b 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs @@ -7,22 +7,22 @@ namespace ChainSafe.Gaming.Wallets.WalletConnect { public struct WalletConnectConfig { - public string ProjectId { get; set; } + public string ProjectId { get; set; } - public string ProjectName { get; set; } + public string ProjectName { get; set; } - public string BaseContext { get; set; } + public string BaseContext { get; set; } - public Chain Chain { get; set; } + public Chain Chain { get; set; } - public string StoragePath { get; set; } + public string StoragePath { get; set; } - public Metadata Metadata { get; set; } + public Metadata Metadata { get; set; } - public ILogger Logger { get; set; } + public ILogger Logger { get; set; } - public bool IsMobilePlatform { get; set; } + public bool IsMobilePlatform { get; set; } - public Dictionary SupportedWallets { get; set; } + public Dictionary SupportedWallets { get; set; } } } \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs index 11e141ae0..e2c9b4eab 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs @@ -1,9 +1,6 @@ -using System.Collections; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; -using Newtonsoft.Json; using WalletConnectSharp.Common.Logging; using WalletConnectSharp.Core; using WalletConnectSharp.Core.Models; @@ -42,7 +39,10 @@ public async Task Initialize(WalletConnectConfig config) Core = new WalletConnectCore(new CoreOptions() { - Name = Config.ProjectName, ProjectId = Config.ProjectId, Storage = BuildStorage(Config.StoragePath), BaseContext = Config.BaseContext, + Name = Config.ProjectName, + ProjectId = Config.ProjectId, + Storage = BuildStorage(Config.StoragePath), + BaseContext = Config.BaseContext, }); await Core.Start(); @@ -75,8 +75,7 @@ public async Task ConnectClient() var events = new string[] { "chainChanged", "accountsChanged" }; - requiredNamespaces.Add( - Chain.EvmNamespace, + requiredNamespaces.Add(Chain.EvmNamespace, new ProposedNamespace { Chains = new string[] { Config.Chain.FullChainId }, Events = events, Methods = methods, From be0a9e86c1556edcc4b77619db040815cea289da Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 22 Sep 2023 23:29:57 +0300 Subject: [PATCH 017/167] even more lint fixes --- .../WalletConnect/WalletConnectUnity.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs index e2c9b4eab..d609fcacf 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs @@ -75,10 +75,16 @@ public async Task ConnectClient() var events = new string[] { "chainChanged", "accountsChanged" }; - requiredNamespaces.Add(Chain.EvmNamespace, + requiredNamespaces.Add( + Chain.EvmNamespace, new ProposedNamespace { - Chains = new string[] { Config.Chain.FullChainId }, Events = events, Methods = methods, + Chains = new string[] + { + Config.Chain.FullChainId, + }, + Events = events, + Methods = methods, }); // start connecting From 78ab21d56ddccca64dd568acba91d98e2ffca098 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 25 Sep 2023 15:58:57 +0300 Subject: [PATCH 018/167] disconnect and logout implemented --- .../WalletConnect/WalletConnectConfig.cs | 2 -- .../WalletConnect/WalletConnectUnity.cs | 24 +++++++++++++------ .../WebPageWallet.cs | 21 +++++++++------- .../Scripts/Prefabs/Logout.cs | 7 ++++++ .../Scripts/Scenes/Login.cs | 5 +--- 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs index f6a240a8b..ce5d1d4e6 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs @@ -15,8 +15,6 @@ public struct WalletConnectConfig public Chain Chain { get; set; } - public string StoragePath { get; set; } - public Metadata Metadata { get; set; } public ILogger Logger { get; set; } diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs index d609fcacf..9d1d8175d 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs @@ -2,8 +2,10 @@ using System.Linq; using System.Threading.Tasks; using WalletConnectSharp.Common.Logging; +using WalletConnectSharp.Common.Model.Errors; using WalletConnectSharp.Core; using WalletConnectSharp.Core.Models; +using WalletConnectSharp.Network.Models; using WalletConnectSharp.Sign; using WalletConnectSharp.Sign.Models; using WalletConnectSharp.Sign.Models.Engine; @@ -26,10 +28,19 @@ public class WalletConnectUnity public WalletConnectSignClient SignClient { get; private set; } + public SessionStruct Session => SignClient.Session.Get(SignClient.Session.Keys[0]); + public WalletConnectConfig Config { get; private set; } public async Task Initialize(WalletConnectConfig config) { + if (Core != null && Core.Initialized) + { + WCLogger.Log("Core already initialized"); + + return; + } + Config = config; if (Config.Logger != null) @@ -41,7 +52,7 @@ public async Task Initialize(WalletConnectConfig config) { Name = Config.ProjectName, ProjectId = Config.ProjectId, - Storage = BuildStorage(Config.StoragePath), + Storage = new InMemoryStorage(), BaseContext = Config.BaseContext, }); @@ -58,12 +69,6 @@ public async Task Initialize(WalletConnectConfig config) }); } - private IKeyValueStorage BuildStorage(string path) - { - path = Path.Combine(path); - return new FileSystemStorage(path); - } - public async Task ConnectClient() { RequiredNamespaces requiredNamespaces = new RequiredNamespaces(); @@ -115,6 +120,11 @@ public async Task ConnectClient() return connectData; } + public void Disconnect() + { + SignClient.Disconnect(Session.Topic, Error.FromErrorType(ErrorType.USER_DISCONNECTED)); + } + private void InvokeConnected(ConnectedData connectedData) { OnConnected?.Invoke(connectedData); diff --git a/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs b/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs index b080676c4..27f34c7c5 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs @@ -47,6 +47,9 @@ public WebPageWallet(IRpcProvider provider, WebPageWalletConfig configuration, I public static string TestResponse { get; set; } = string.Empty; + // static to keep instance through runtime - related to logout/disconnect + public static WalletConnectUnity WalletConnectUnity { get; private set; } = new WalletConnectUnity(); + private static void InvokeConnected(ConnectedData connectedData) { OnConnected?.Invoke(connectedData); @@ -68,8 +71,6 @@ private static void InvokeSessionApproved(SessionStruct session) public string Address { get; private set; } - public WalletConnectUnity WalletConnectUnity { get; private set; } = new WalletConnectUnity(); - public async ValueTask WillStartAsync() { configuration.SavedUserAddress?.AssertIsPublicAddress(nameof(configuration.SavedUserAddress)); @@ -111,7 +112,7 @@ public async Task SignMessage(string message) // var pageUrl = BuildUrl(); // Wallet connect - SessionStruct session = GetSession(); + SessionStruct session = WalletConnectUnity.Session; var (address, chainId) = GetCurrentAddress(); @@ -233,14 +234,9 @@ bool ValidateResponse(string response) } } - private SessionStruct GetSession() - { - return WalletConnectUnity.SignClient.Session.Get(WalletConnectUnity.SignClient.Session.Keys[0]); - } - private (string, string) GetCurrentAddress() { - var currentSession = GetSession(); + var currentSession = WalletConnectUnity.Session; var defaultChain = currentSession.Namespaces.Keys.FirstOrDefault(); @@ -340,6 +336,13 @@ private async Task GetAccountVerifyUserOwns() // } } + public void Disconnect() + { + configuration.SavedUserAddress = null; + + WalletConnectUnity.Disconnect(); + } + /* Storing this here just to know, how events for analytics were constructed diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs index 9c4e129f3..c2a6cf672 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs @@ -1,4 +1,5 @@ using ChainSafe.Gaming.UnityPackage; +using ChainSafe.Gaming.Wallets; using Scenes; using UnityEngine; using UnityEngine.SceneManagement; @@ -10,6 +11,12 @@ public async void OnLogout() // Remove the saved "remember me" data, if any PlayerPrefs.DeleteKey(Login.PlayerAccountKey); + // disconnect wallet + if (Web3Accessor.Web3.Signer is WebPageWallet wallet) + { + wallet.Disconnect(); + } + // Terminate Web3 await Web3Accessor.Web3.TerminateAsync(); diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index d9027c4e0..a99f852d3 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -77,8 +77,6 @@ public class Login : MonoBehaviour [field: SerializeField] private TMP_Dropdown _chainDropdown; - public string StoragePath => $"{Application.persistentDataPath}/wc_storage.json"; - // chain id, name pairs public static Dictionary SupportedChains { get; private set; } = new Dictionary() { @@ -109,7 +107,7 @@ private IEnumerator Start() #if UNITY_WEBGL ProcessWeb3Auth(); #endif - TryAutoLogin(); + //TryAutoLogin(); ExistingWalletButton.onClick.AddListener(LoginWithExistingAccount); @@ -303,7 +301,6 @@ private WalletConnectConfig BuildConfig() ProjectName = ProjectName, BaseContext = BaseContext, Chain = chain, - StoragePath = StoragePath, Metadata = Metadata, SupportedWallets = _supportedWallets, IsMobilePlatform = Application.isMobilePlatform, From ed0a3f099be5c471aa42ce064812a544836cf121 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 25 Sep 2023 16:38:34 +0300 Subject: [PATCH 019/167] Changes Made + chain selection reverted/fetched from project config + wallet disconnected if application exits mid run + disconnect method for wallet now async --- .../WalletConnect/WalletConnectUnity.cs | 4 +- .../WebPageWallet.cs | 4 +- .../Scenes/SampleLogin.unity | 1200 +---------------- .../Scripts/Prefabs/Logout.cs | 2 +- .../Scripts/Scenes/Login.cs | 37 +- 5 files changed, 43 insertions(+), 1204 deletions(-) diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs index 9d1d8175d..d489f46be 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs @@ -120,9 +120,9 @@ public async Task ConnectClient() return connectData; } - public void Disconnect() + public async Task Disconnect() { - SignClient.Disconnect(Session.Topic, Error.FromErrorType(ErrorType.USER_DISCONNECTED)); + await SignClient.Disconnect(Session.Topic, Error.FromErrorType(ErrorType.USER_DISCONNECTED)); } private void InvokeConnected(ConnectedData connectedData) diff --git a/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs b/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs index 27f34c7c5..9375e62b3 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs @@ -336,11 +336,11 @@ private async Task GetAccountVerifyUserOwns() // } } - public void Disconnect() + public async Task Disconnect() { configuration.SavedUserAddress = null; - WalletConnectUnity.Disconnect(); + await WalletConnectUnity.Disconnect(); } /* diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity index 0d3f1afa0..52cc93149 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity @@ -1395,141 +1395,6 @@ MonoBehaviour: _copyToClipboardButton: {fileID: 212403314} _backButton: {fileID: 1993078182} _container: {fileID: 1278821651} ---- !u!1 &400348267 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 400348268} - - component: {fileID: 400348270} - - component: {fileID: 400348269} - m_Layer: 5 - m_Name: Item Label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &400348268 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 400348267} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1792992066} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 5, y: -0.5} - m_SizeDelta: {x: -30, y: -3} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &400348269 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 400348267} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Select Chain - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4281479730 - m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 14 - m_fontSizeBase: 14 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &400348270 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 400348267} - m_CullTransparentMesh: 1 --- !u!1001 &452118933 PrefabInstance: m_ObjectHideFlags: 0 @@ -1672,43 +1537,6 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 ---- !u!1 &458235389 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 458235390} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &458235390 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 458235389} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1792992066} - m_Father: {fileID: 1087053796} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 28} - m_Pivot: {x: 0.5, y: 1} --- !u!1 &492023254 GameObject: m_ObjectHideFlags: 0 @@ -1810,7 +1638,7 @@ RectTransform: - {fileID: 351786045} - {fileID: 1791429089} m_Father: {fileID: 2036998554} - m_RootOrder: 2 + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1885,119 +1713,6 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 ---- !u!1 &736475702 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 736475703} - - component: {fileID: 736475705} - - component: {fileID: 736475704} - m_Layer: 5 - m_Name: Item Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &736475703 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 736475702} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1792992066} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &736475704 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 736475702} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &736475705 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 736475702} - m_CullTransparentMesh: 1 ---- !u!1 &786838048 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 786838049} - m_Layer: 5 - m_Name: Sliding Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &786838049 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 786838048} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1327341033} - m_Father: {fileID: 990863038} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -20, y: -20} - m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &786896300 GameObject: m_ObjectHideFlags: 0 @@ -2095,7 +1810,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_RootOrder - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_AnchorMax.x @@ -2528,7 +2243,7 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 1} ---- !u!1 &990863037 +--- !u!1 &1062946085 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2536,497 +2251,35 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 990863038} - - component: {fileID: 990863041} - - component: {fileID: 990863040} - - component: {fileID: 990863039} + - component: {fileID: 1062946086} m_Layer: 5 - m_Name: Scrollbar + m_Name: Column - Web3Auth m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &990863038 +--- !u!224 &1062946086 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 990863037} + m_GameObject: {fileID: 1062946085} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 786838049} - m_Father: {fileID: 1182349767} - m_RootOrder: 1 + - {fileID: 387303608} + m_Father: {fileID: 1434038408} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 0} - m_Pivot: {x: 1, y: 1} ---- !u!114 &990863039 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 990863037} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1327341034} - m_HandleRect: {fileID: 1327341033} - m_Direction: 2 - m_Value: 0 - m_Size: 1 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &990863040 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 990863037} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &990863041 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 990863037} - m_CullTransparentMesh: 1 ---- !u!1 &1062946085 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1062946086} - m_Layer: 5 - m_Name: Column - Web3Auth - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1062946086 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1062946085} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 387303608} - m_Father: {fileID: 1434038408} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0.5, y: 1} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.5, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -50, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1082413007 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1082413008} - - component: {fileID: 1082413010} - - component: {fileID: 1082413009} - m_Layer: 5 - m_Name: Label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1082413008 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1082413007} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1479042108} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -7.5, y: -0.5} - m_SizeDelta: {x: -35, y: -13} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1082413009 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1082413007} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 14 - m_fontSizeBase: 14 - m_fontWeight: 400 - m_enableAutoSizing: 1 - m_fontSizeMin: 14 - m_fontSizeMax: 18 - m_fontStyle: 1 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1082413010 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1082413007} - m_CullTransparentMesh: 1 ---- !u!1 &1087053795 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1087053796} - - component: {fileID: 1087053799} - - component: {fileID: 1087053798} - - component: {fileID: 1087053797} - m_Layer: 5 - m_Name: Viewport - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1087053796 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1087053795} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 458235390} - m_Father: {fileID: 1182349767} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -17, y: 0} - m_Pivot: {x: 0, y: 1} ---- !u!114 &1087053797 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1087053795} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1087053798 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1087053795} - m_CullTransparentMesh: 1 ---- !u!114 &1087053799 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1087053795} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!1 &1182349766 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1182349767} - - component: {fileID: 1182349770} - - component: {fileID: 1182349769} - - component: {fileID: 1182349768} - m_Layer: 5 - m_Name: Template - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &1182349767 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1182349766} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1087053796} - - {fileID: 990863038} - m_Father: {fileID: 1479042108} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 2} - m_SizeDelta: {x: 0, y: 150} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &1182349768 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1182349766} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 458235390} - m_Horizontal: 0 - m_Vertical: 1 - m_MovementType: 2 - m_Elasticity: 0.1 - m_Inertia: 1 - m_DecelerationRate: 0.135 - m_ScrollSensitivity: 1 - m_Viewport: {fileID: 1087053796} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 990863039} - m_HorizontalScrollbarVisibility: 0 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: 0 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &1182349769 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1182349766} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1182349770 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1182349766} - m_CullTransparentMesh: 1 --- !u!1 &1278821650 GameObject: m_ObjectHideFlags: 0 @@ -3064,82 +2317,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1327341032 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1327341033} - - component: {fileID: 1327341035} - - component: {fileID: 1327341034} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1327341033 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1327341032} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 786838049} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1327341034 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1327341032} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1327341035 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1327341032} - m_CullTransparentMesh: 1 --- !u!1 &1334079840 GameObject: m_ObjectHideFlags: 0 @@ -3223,7 +2400,7 @@ MonoBehaviour: Native: Universal: VerifyUrl: - _chainDropdown: {fileID: 1479042110} + _chainDropdown: {fileID: 0} --- !u!1 &1434038407 GameObject: m_ObjectHideFlags: 0 @@ -3371,91 +2548,27 @@ RectTransform: m_PrefabAsset: {fileID: 0} --- !u!114 &1452765489 stripped MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1452765487} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1452765490} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1452765490 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1452765487} - m_PrefabAsset: {fileID: 0} ---- !u!114 &1452765491 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 1452765487} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1452765490} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!1 &1479042107 +--- !u!1 &1452765490 stripped GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1479042108} - - component: {fileID: 1479042112} - - component: {fileID: 1479042111} - - component: {fileID: 1479042110} - - component: {fileID: 1479042109} - - component: {fileID: 1479042113} - m_Layer: 5 - m_Name: ChainDropdown - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1479042108 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 1452765487} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1479042107} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1082413008} - - {fileID: 1528831652} - - {fileID: 1182349767} - m_Father: {fileID: 2036998554} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1479042109 +--- !u!114 &1452765491 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1479042107} + m_GameObject: {fileID: 1452765490} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} @@ -3469,113 +2582,6 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 ---- !u!114 &1479042110 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1479042107} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1479042111} - m_Template: {fileID: 1182349767} - m_CaptionText: {fileID: 1082413009} - m_CaptionImage: {fileID: 0} - m_Placeholder: {fileID: 0} - m_ItemText: {fileID: 400348269} - m_ItemImage: {fileID: 0} - m_Value: 0 - m_Options: - m_Options: [] - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_AlphaFadeSpeed: 0.15 ---- !u!114 &1479042111 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1479042107} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.054901965, g: 0.054901965, b: 0.054901965, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1479042112 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1479042107} - m_CullTransparentMesh: 1 ---- !u!114 &1479042113 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1479042107} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} - m_Name: - m_EditorClassIdentifier: - m_EffectColor: {r: 1, g: 1, b: 1, a: 0.2} - m_EffectDistance: {x: 1, y: 1} - m_UseGraphicAlpha: 1 --- !u!1 &1491563361 GameObject: m_ObjectHideFlags: 0 @@ -3756,82 +2762,6 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 ---- !u!1 &1528831651 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1528831652} - - component: {fileID: 1528831654} - - component: {fileID: 1528831653} - m_Layer: 5 - m_Name: Arrow - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1528831652 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1528831651} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1479042108} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: -15, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1528831653 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1528831651} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1528831654 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1528831651} - m_CullTransparentMesh: 1 --- !u!1 &1561876540 GameObject: m_ObjectHideFlags: 0 @@ -4097,93 +3027,6 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!1 &1792992065 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1792992066} - - component: {fileID: 1792992067} - m_Layer: 5 - m_Name: Item - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1792992066 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1792992065} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 736475703} - - {fileID: 400348268} - m_Father: {fileID: 458235390} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1792992067 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1792992065} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 736475704} - toggleTransition: 1 - graphic: {fileID: 0} - m_Group: {fileID: 0} - onValueChanged: - m_PersistentCalls: - m_Calls: [] - m_IsOn: 1 --- !u!1 &1880270952 GameObject: m_ObjectHideFlags: 0 @@ -4716,7 +3559,6 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1479042108} - {fileID: 787012149} - {fileID: 724612375} m_Father: {fileID: 1434038408} diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs index c2a6cf672..ed5bc8e6f 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs @@ -14,7 +14,7 @@ public async void OnLogout() // disconnect wallet if (Web3Accessor.Web3.Signer is WebPageWallet wallet) { - wallet.Disconnect(); + await wallet.Disconnect(); } // Terminate Web3 diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index a99f852d3..c20cca61d 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -75,17 +75,23 @@ public class Login : MonoBehaviour Url = "https://chainsafe.io/" }; - [field: SerializeField] private TMP_Dropdown _chainDropdown; - - // chain id, name pairs - public static Dictionary SupportedChains { get; private set; } = new Dictionary() - { - {1, "Ethereum"}, - {5, "Goerli"}, - }; - #endregion + [RuntimeInitializeOnLoadMethod] + static void DisconnectWallet() + { + Application.quitting += async delegate + { + Debug.Log("Disconnecting wallet..."); + + //if already connected + if (Web3Accessor.Web3 != null && Web3Accessor.Web3.Signer is WebPageWallet wallet) + { + await wallet.Disconnect(); + } + }; + } + private IEnumerator Start() { Assert.IsNotNull(Web3AuthButtons); @@ -100,8 +106,6 @@ private IEnumerator Start() RememberMeToggle.gameObject.SetActive(useWebPageWallet); // Wallet Connect - PopulateChainDropDown(); - yield return FetchSupportedWallets(); #if UNITY_WEBGL @@ -281,19 +285,12 @@ private void ConfigureCommonServices(IWeb3ServiceCollection services) private Dictionary _supportedWallets; - private void PopulateChainDropDown() - { - _chainDropdown.AddOptions(SupportedChains.Values.ToList()); - } - private WalletConnectConfig BuildConfig() { // build chain - int index = _chainDropdown.value; + var projectConfig = ProjectConfigUtilities.Load(); - int key = SupportedChains.Keys.ToArray()[index]; - - Chain chain = new Chain(Chain.EvmNamespace, $"{key}", SupportedChains[key]); + Chain chain = new Chain(Chain.EvmNamespace, projectConfig.ChainId, projectConfig.Network); return new WalletConnectConfig { From 3499df70a7e791545d1cd85b4cd74653fe952109 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 25 Sep 2023 13:42:02 +0000 Subject: [PATCH 020/167] Auto-duplicate Package Samples --- .../Web3.Unity/Scenes/SampleLogin.unity | 1200 +---------------- .../Web3.Unity/Scripts/Prefabs/Logout.cs | 7 + .../Web3.Unity/Scripts/Scenes/Login.cs | 40 +- 3 files changed, 45 insertions(+), 1202 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity index 0d3f1afa0..52cc93149 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity @@ -1395,141 +1395,6 @@ MonoBehaviour: _copyToClipboardButton: {fileID: 212403314} _backButton: {fileID: 1993078182} _container: {fileID: 1278821651} ---- !u!1 &400348267 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 400348268} - - component: {fileID: 400348270} - - component: {fileID: 400348269} - m_Layer: 5 - m_Name: Item Label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &400348268 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 400348267} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1792992066} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 5, y: -0.5} - m_SizeDelta: {x: -30, y: -3} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &400348269 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 400348267} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Select Chain - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4281479730 - m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 14 - m_fontSizeBase: 14 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &400348270 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 400348267} - m_CullTransparentMesh: 1 --- !u!1001 &452118933 PrefabInstance: m_ObjectHideFlags: 0 @@ -1672,43 +1537,6 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 ---- !u!1 &458235389 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 458235390} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &458235390 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 458235389} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1792992066} - m_Father: {fileID: 1087053796} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 28} - m_Pivot: {x: 0.5, y: 1} --- !u!1 &492023254 GameObject: m_ObjectHideFlags: 0 @@ -1810,7 +1638,7 @@ RectTransform: - {fileID: 351786045} - {fileID: 1791429089} m_Father: {fileID: 2036998554} - m_RootOrder: 2 + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1885,119 +1713,6 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 ---- !u!1 &736475702 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 736475703} - - component: {fileID: 736475705} - - component: {fileID: 736475704} - m_Layer: 5 - m_Name: Item Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &736475703 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 736475702} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1792992066} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &736475704 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 736475702} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &736475705 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 736475702} - m_CullTransparentMesh: 1 ---- !u!1 &786838048 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 786838049} - m_Layer: 5 - m_Name: Sliding Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &786838049 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 786838048} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1327341033} - m_Father: {fileID: 990863038} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -20, y: -20} - m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &786896300 GameObject: m_ObjectHideFlags: 0 @@ -2095,7 +1810,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_RootOrder - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_AnchorMax.x @@ -2528,7 +2243,7 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 1} ---- !u!1 &990863037 +--- !u!1 &1062946085 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2536,497 +2251,35 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 990863038} - - component: {fileID: 990863041} - - component: {fileID: 990863040} - - component: {fileID: 990863039} + - component: {fileID: 1062946086} m_Layer: 5 - m_Name: Scrollbar + m_Name: Column - Web3Auth m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &990863038 +--- !u!224 &1062946086 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 990863037} + m_GameObject: {fileID: 1062946085} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 786838049} - m_Father: {fileID: 1182349767} - m_RootOrder: 1 + - {fileID: 387303608} + m_Father: {fileID: 1434038408} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 0} - m_Pivot: {x: 1, y: 1} ---- !u!114 &990863039 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 990863037} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1327341034} - m_HandleRect: {fileID: 1327341033} - m_Direction: 2 - m_Value: 0 - m_Size: 1 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &990863040 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 990863037} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &990863041 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 990863037} - m_CullTransparentMesh: 1 ---- !u!1 &1062946085 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1062946086} - m_Layer: 5 - m_Name: Column - Web3Auth - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1062946086 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1062946085} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 387303608} - m_Father: {fileID: 1434038408} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0.5, y: 1} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.5, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -50, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1082413007 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1082413008} - - component: {fileID: 1082413010} - - component: {fileID: 1082413009} - m_Layer: 5 - m_Name: Label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1082413008 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1082413007} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1479042108} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -7.5, y: -0.5} - m_SizeDelta: {x: -35, y: -13} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1082413009 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1082413007} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 14 - m_fontSizeBase: 14 - m_fontWeight: 400 - m_enableAutoSizing: 1 - m_fontSizeMin: 14 - m_fontSizeMax: 18 - m_fontStyle: 1 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1082413010 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1082413007} - m_CullTransparentMesh: 1 ---- !u!1 &1087053795 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1087053796} - - component: {fileID: 1087053799} - - component: {fileID: 1087053798} - - component: {fileID: 1087053797} - m_Layer: 5 - m_Name: Viewport - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1087053796 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1087053795} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 458235390} - m_Father: {fileID: 1182349767} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -17, y: 0} - m_Pivot: {x: 0, y: 1} ---- !u!114 &1087053797 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1087053795} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1087053798 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1087053795} - m_CullTransparentMesh: 1 ---- !u!114 &1087053799 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1087053795} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!1 &1182349766 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1182349767} - - component: {fileID: 1182349770} - - component: {fileID: 1182349769} - - component: {fileID: 1182349768} - m_Layer: 5 - m_Name: Template - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &1182349767 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1182349766} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1087053796} - - {fileID: 990863038} - m_Father: {fileID: 1479042108} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 2} - m_SizeDelta: {x: 0, y: 150} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &1182349768 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1182349766} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 458235390} - m_Horizontal: 0 - m_Vertical: 1 - m_MovementType: 2 - m_Elasticity: 0.1 - m_Inertia: 1 - m_DecelerationRate: 0.135 - m_ScrollSensitivity: 1 - m_Viewport: {fileID: 1087053796} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 990863039} - m_HorizontalScrollbarVisibility: 0 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: 0 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &1182349769 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1182349766} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1182349770 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1182349766} - m_CullTransparentMesh: 1 --- !u!1 &1278821650 GameObject: m_ObjectHideFlags: 0 @@ -3064,82 +2317,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1327341032 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1327341033} - - component: {fileID: 1327341035} - - component: {fileID: 1327341034} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1327341033 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1327341032} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 786838049} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1327341034 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1327341032} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1327341035 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1327341032} - m_CullTransparentMesh: 1 --- !u!1 &1334079840 GameObject: m_ObjectHideFlags: 0 @@ -3223,7 +2400,7 @@ MonoBehaviour: Native: Universal: VerifyUrl: - _chainDropdown: {fileID: 1479042110} + _chainDropdown: {fileID: 0} --- !u!1 &1434038407 GameObject: m_ObjectHideFlags: 0 @@ -3371,91 +2548,27 @@ RectTransform: m_PrefabAsset: {fileID: 0} --- !u!114 &1452765489 stripped MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1452765487} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1452765490} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1452765490 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1452765487} - m_PrefabAsset: {fileID: 0} ---- !u!114 &1452765491 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 1452765487} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1452765490} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!1 &1479042107 +--- !u!1 &1452765490 stripped GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1479042108} - - component: {fileID: 1479042112} - - component: {fileID: 1479042111} - - component: {fileID: 1479042110} - - component: {fileID: 1479042109} - - component: {fileID: 1479042113} - m_Layer: 5 - m_Name: ChainDropdown - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1479042108 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 1452765487} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1479042107} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1082413008} - - {fileID: 1528831652} - - {fileID: 1182349767} - m_Father: {fileID: 2036998554} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1479042109 +--- !u!114 &1452765491 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1479042107} + m_GameObject: {fileID: 1452765490} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} @@ -3469,113 +2582,6 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 ---- !u!114 &1479042110 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1479042107} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1479042111} - m_Template: {fileID: 1182349767} - m_CaptionText: {fileID: 1082413009} - m_CaptionImage: {fileID: 0} - m_Placeholder: {fileID: 0} - m_ItemText: {fileID: 400348269} - m_ItemImage: {fileID: 0} - m_Value: 0 - m_Options: - m_Options: [] - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_AlphaFadeSpeed: 0.15 ---- !u!114 &1479042111 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1479042107} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.054901965, g: 0.054901965, b: 0.054901965, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1479042112 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1479042107} - m_CullTransparentMesh: 1 ---- !u!114 &1479042113 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1479042107} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} - m_Name: - m_EditorClassIdentifier: - m_EffectColor: {r: 1, g: 1, b: 1, a: 0.2} - m_EffectDistance: {x: 1, y: 1} - m_UseGraphicAlpha: 1 --- !u!1 &1491563361 GameObject: m_ObjectHideFlags: 0 @@ -3756,82 +2762,6 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 ---- !u!1 &1528831651 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1528831652} - - component: {fileID: 1528831654} - - component: {fileID: 1528831653} - m_Layer: 5 - m_Name: Arrow - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1528831652 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1528831651} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1479042108} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: -15, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1528831653 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1528831651} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1528831654 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1528831651} - m_CullTransparentMesh: 1 --- !u!1 &1561876540 GameObject: m_ObjectHideFlags: 0 @@ -4097,93 +3027,6 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!1 &1792992065 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1792992066} - - component: {fileID: 1792992067} - m_Layer: 5 - m_Name: Item - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1792992066 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1792992065} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 736475703} - - {fileID: 400348268} - m_Father: {fileID: 458235390} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1792992067 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1792992065} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 736475704} - toggleTransition: 1 - graphic: {fileID: 0} - m_Group: {fileID: 0} - onValueChanged: - m_PersistentCalls: - m_Calls: [] - m_IsOn: 1 --- !u!1 &1880270952 GameObject: m_ObjectHideFlags: 0 @@ -4716,7 +3559,6 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1479042108} - {fileID: 787012149} - {fileID: 724612375} m_Father: {fileID: 1434038408} diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs index 9c4e129f3..ed5bc8e6f 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs @@ -1,4 +1,5 @@ using ChainSafe.Gaming.UnityPackage; +using ChainSafe.Gaming.Wallets; using Scenes; using UnityEngine; using UnityEngine.SceneManagement; @@ -10,6 +11,12 @@ public async void OnLogout() // Remove the saved "remember me" data, if any PlayerPrefs.DeleteKey(Login.PlayerAccountKey); + // disconnect wallet + if (Web3Accessor.Web3.Signer is WebPageWallet wallet) + { + await wallet.Disconnect(); + } + // Terminate Web3 await Web3Accessor.Web3.TerminateAsync(); diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs index d9027c4e0..c20cca61d 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs @@ -75,18 +75,22 @@ public class Login : MonoBehaviour Url = "https://chainsafe.io/" }; - [field: SerializeField] private TMP_Dropdown _chainDropdown; - - public string StoragePath => $"{Application.persistentDataPath}/wc_storage.json"; + #endregion - // chain id, name pairs - public static Dictionary SupportedChains { get; private set; } = new Dictionary() + [RuntimeInitializeOnLoadMethod] + static void DisconnectWallet() { - {1, "Ethereum"}, - {5, "Goerli"}, - }; - - #endregion + Application.quitting += async delegate + { + Debug.Log("Disconnecting wallet..."); + + //if already connected + if (Web3Accessor.Web3 != null && Web3Accessor.Web3.Signer is WebPageWallet wallet) + { + await wallet.Disconnect(); + } + }; + } private IEnumerator Start() { @@ -102,14 +106,12 @@ private IEnumerator Start() RememberMeToggle.gameObject.SetActive(useWebPageWallet); // Wallet Connect - PopulateChainDropDown(); - yield return FetchSupportedWallets(); #if UNITY_WEBGL ProcessWeb3Auth(); #endif - TryAutoLogin(); + //TryAutoLogin(); ExistingWalletButton.onClick.AddListener(LoginWithExistingAccount); @@ -283,19 +285,12 @@ private void ConfigureCommonServices(IWeb3ServiceCollection services) private Dictionary _supportedWallets; - private void PopulateChainDropDown() - { - _chainDropdown.AddOptions(SupportedChains.Values.ToList()); - } - private WalletConnectConfig BuildConfig() { // build chain - int index = _chainDropdown.value; + var projectConfig = ProjectConfigUtilities.Load(); - int key = SupportedChains.Keys.ToArray()[index]; - - Chain chain = new Chain(Chain.EvmNamespace, $"{key}", SupportedChains[key]); + Chain chain = new Chain(Chain.EvmNamespace, projectConfig.ChainId, projectConfig.Network); return new WalletConnectConfig { @@ -303,7 +298,6 @@ private WalletConnectConfig BuildConfig() ProjectName = ProjectName, BaseContext = BaseContext, Chain = chain, - StoragePath = StoragePath, Metadata = Metadata, SupportedWallets = _supportedWallets, IsMobilePlatform = Application.isMobilePlatform, From 45a0644014728e1a47c2a2501a73bc705c975cfa Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 26 Sep 2023 11:51:34 +0300 Subject: [PATCH 021/167] sign typed data checkpoint --- .../Methods/EthSignTypedMessage.cs | 28 +++++++++++++++++++ .../WalletConnect/Methods/TypedDataRequest.cs | 22 +++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedMessage.cs create mode 100644 src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedDataRequest.cs diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedMessage.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedMessage.cs new file mode 100644 index 000000000..a45c3bb6d --- /dev/null +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedMessage.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using Nethereum.ABI.EIP712; +using Newtonsoft.Json; +using UnityEngine.Scripting; +using WalletConnectSharp.Common.Utils; +using WalletConnectSharp.Network.Models; + +namespace ChainSafe.Gaming.Wallets.WalletConnect.Methods +{ + [RpcMethod("eth_signTypedData")] + [RpcRequestOptions(Clock.ONE_MINUTE, 99998)] + public class EthSignTypedMessage : List> + { + public EthSignTypedMessage(TTypedData message) + : base(new TypedDataRequest[] + { + new TypedDataRequest(JsonConvert.SerializeObject(MemberDescriptionFactory.GetTypesMemberDescription(typeof(TTypedData))), message), + }) + { + } + + [Preserve] // Needed for JSON.NET serialization + public EthSignTypedMessage() + { + } + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedDataRequest.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedDataRequest.cs new file mode 100644 index 000000000..b756cc114 --- /dev/null +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedDataRequest.cs @@ -0,0 +1,22 @@ +using System; +using Newtonsoft.Json; + +namespace ChainSafe.Gaming.Wallets.WalletConnect.Methods +{ + [Serializable] + public struct TypedDataRequest + { + public TypedDataRequest(string types, TTypedData message) + { + Types = types; + + Message = message; + } + + [JsonProperty("types")] + public string Types { get; private set; } + + [JsonProperty("message")] + public TTypedData Message { get; private set; } + } +} \ No newline at end of file From 44e073a42c0ce47864a77d40409cf6ac56c20404 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 26 Sep 2023 14:57:03 +0300 Subject: [PATCH 022/167] sign typed data implemented with Wallet Connect --- ...ignTypedMessage.cs => EthSignTypedData.cs} | 12 ++++---- .../WalletConnect/Methods/TypedDataRequest.cs | 17 +++++++++-- .../WebPageWallet.cs | 29 ++++++++++++------- 3 files changed, 41 insertions(+), 17 deletions(-) rename src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/{EthSignTypedMessage.cs => EthSignTypedData.cs} (52%) diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedMessage.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedData.cs similarity index 52% rename from src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedMessage.cs rename to src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedData.cs index a45c3bb6d..bd81755cf 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedMessage.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedData.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using ChainSafe.Gaming.Web3.Core.Evm; using Nethereum.ABI.EIP712; using Newtonsoft.Json; using UnityEngine.Scripting; @@ -10,18 +11,19 @@ namespace ChainSafe.Gaming.Wallets.WalletConnect.Methods { [RpcMethod("eth_signTypedData")] [RpcRequestOptions(Clock.ONE_MINUTE, 99998)] - public class EthSignTypedMessage : List> + public class EthSignTypedData : List { - public EthSignTypedMessage(TTypedData message) - : base(new TypedDataRequest[] + public EthSignTypedData(string address, SerializableDomain domain, TTypedData message) + : base(new string[] { - new TypedDataRequest(JsonConvert.SerializeObject(MemberDescriptionFactory.GetTypesMemberDescription(typeof(TTypedData))), message), + address, + JsonConvert.SerializeObject(new TypedDataRequest(MemberDescriptionFactory.GetTypesMemberDescription(typeof(TTypedData)), domain, message)), }) { } [Preserve] // Needed for JSON.NET serialization - public EthSignTypedMessage() + public EthSignTypedData() { } } diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedDataRequest.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedDataRequest.cs index b756cc114..aeb1b0d99 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedDataRequest.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedDataRequest.cs @@ -1,4 +1,7 @@ using System; +using System.Collections.Generic; +using ChainSafe.Gaming.Web3.Core.Evm; +using Nethereum.ABI.EIP712; using Newtonsoft.Json; namespace ChainSafe.Gaming.Wallets.WalletConnect.Methods @@ -6,15 +9,25 @@ namespace ChainSafe.Gaming.Wallets.WalletConnect.Methods [Serializable] public struct TypedDataRequest { - public TypedDataRequest(string types, TTypedData message) + public TypedDataRequest(Dictionary types, SerializableDomain domain, TTypedData message) { Types = types; + PrimaryType = typeof(TTypedData).Name; + + Domain = domain; + Message = message; } [JsonProperty("types")] - public string Types { get; private set; } + public Dictionary Types { get; private set; } + + [JsonProperty("primaryType")] + public string PrimaryType { get; private set; } + + [JsonProperty("domain")] + public SerializableDomain Domain { get; private set; } [JsonProperty("message")] public TTypedData Message { get; private set; } diff --git a/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs b/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs index 9375e62b3..dbe941290 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs @@ -16,7 +16,6 @@ using Nethereum.Signer; using Nethereum.Util; using Newtonsoft.Json; -using UnityEngine; using WalletConnectSharp.Sign.Models; using WalletConnectSharp.Sign.Models.Engine; using AddressExtensions = ChainSafe.Gaming.Web3.Core.Debug.AddressExtensions; @@ -151,17 +150,25 @@ bool ValidateResponse(string response) public async Task SignTypedData(SerializableDomain domain, TStructType message) { - var pageUrl = BuildUrl(); - return await OpenPageWaitResponse(pageUrl, ValidateResponse); + // Wallet connect + SessionStruct session = WalletConnectUnity.Session; - string BuildUrl() + var (address, chainId) = GetCurrentAddress(); + + if (string.IsNullOrWhiteSpace(address)) { - return $"{configuration.ServiceUrl}" + - "?action=sign-typed-data" + - "&domain=" + Uri.EscapeDataString(JsonConvert.SerializeObject(domain)) + - "&types=" + Uri.EscapeDataString(JsonConvert.SerializeObject( - MemberDescriptionFactory.GetTypesMemberDescription(typeof(TStructType)))) + - "&message=" + Uri.EscapeDataString(JsonConvert.SerializeObject(message)); + return null; + } + + var request = new EthSignTypedData(address, domain, message); + + string hash = + await WalletConnectUnity.SignClient.Request, string>(session.Topic, request, chainId); + + var isValid = ValidateResponse(hash); + if (!isValid) + { + throw new Web3Exception("Incorrect response format extracted from clipboard."); } // TODO: validate with regex @@ -169,6 +176,8 @@ bool ValidateResponse(string response) { return response.StartsWith("0x") && response.Length == 132; } + + return hash; } public async Task SendTransaction(TransactionRequest transaction) From aeb008a3556295f62708b910fd6dfc6b7a65e697 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 29 Sep 2023 08:52:58 +0300 Subject: [PATCH 023/167] reverted unwanted changes --- .../Packages/packages-lock.json | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/UnitySampleProject/Packages/packages-lock.json b/src/UnitySampleProject/Packages/packages-lock.json index cfce5c873..1352c7840 100644 --- a/src/UnitySampleProject/Packages/packages-lock.json +++ b/src/UnitySampleProject/Packages/packages-lock.json @@ -1,7 +1,7 @@ { "dependencies": { "com.unity.2d.animation": { - "version": "7.0.9", + "version": "7.0.10", "depth": 1, "source": "registry", "dependencies": { @@ -39,12 +39,12 @@ "url": "https://packages.unity.com" }, "com.unity.2d.psdimporter": { - "version": "6.0.6", + "version": "6.0.7", "depth": 1, "source": "registry", "dependencies": { - "com.unity.2d.animation": "7.0.8", - "com.unity.2d.common": "6.0.5", + "com.unity.2d.animation": "7.0.9", + "com.unity.2d.common": "6.0.6", "com.unity.2d.sprite": "1.0.0" }, "url": "https://packages.unity.com" @@ -56,12 +56,12 @@ "dependencies": {} }, "com.unity.2d.spriteshape": { - "version": "7.0.6", + "version": "7.0.7", "depth": 1, "source": "registry", "dependencies": { "com.unity.mathematics": "1.1.0", - "com.unity.2d.common": "6.0.4", + "com.unity.2d.common": "6.0.6", "com.unity.2d.path": "5.0.2", "com.unity.modules.physics2d": "1.0.0" }, @@ -74,7 +74,7 @@ "dependencies": {} }, "com.unity.2d.tilemap.extras": { - "version": "2.2.3", + "version": "2.2.5", "depth": 1, "source": "registry", "dependencies": { @@ -113,13 +113,13 @@ "depth": 0, "source": "builtin", "dependencies": { - "com.unity.2d.animation": "7.0.9", + "com.unity.2d.animation": "7.0.10", "com.unity.2d.pixel-perfect": "5.0.3", - "com.unity.2d.psdimporter": "6.0.6", + "com.unity.2d.psdimporter": "6.0.7", "com.unity.2d.sprite": "1.0.0", - "com.unity.2d.spriteshape": "7.0.6", + "com.unity.2d.spriteshape": "7.0.7", "com.unity.2d.tilemap": "1.0.0", - "com.unity.2d.tilemap.extras": "2.2.3" + "com.unity.2d.tilemap.extras": "2.2.5" } }, "com.unity.ide.rider": { From cc3a7f3f55a7ae1e3de90630a58e8a402cbc8aa3 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 29 Sep 2023 13:33:36 +0300 Subject: [PATCH 024/167] error fixes - SceneIndexer.cs doesn't double up scenes - WalletConnectUnity.cs error fix on trust wallet --- .../WalletConnect/WalletConnectUnity.cs | 28 +++++++++++++------ .../Scripts/Utilities/SceneIndexer.cs | 2 +- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs index d489f46be..3d3682ec6 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs @@ -1,3 +1,4 @@ +using System; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -104,17 +105,26 @@ public async Task ConnectClient() InvokeSessionApproved(sessionResult); - string nativeUrl = sessionResult.Peer.Metadata.Redirect.Native.Replace("//", string.Empty); - - string defaultWalletId = Config.SupportedWallets.FirstOrDefault(t => - t.Value.Mobile.NativeProtocol == nativeUrl || t.Value.Desktop.NativeProtocol == nativeUrl) - .Key; - - var defaultWallet = Config.SupportedWallets[defaultWalletId]; - if (Config.IsMobilePlatform) { - defaultWallet.OpenDeeplink(connectData); + // this doesn't work for all wallets, hence the try catch + try + { + string nativeUrl = sessionResult.Peer.Metadata.Redirect.Native.Replace("//", string.Empty); + + string defaultWalletId = Config.SupportedWallets.FirstOrDefault(t => + t.Value.Mobile.NativeProtocol == nativeUrl || t.Value.Desktop.NativeProtocol == nativeUrl) + .Key; + + if (Config.SupportedWallets.TryGetValue(defaultWalletId, out Wallet wallet)) + { + wallet.OpenDeeplink(connectData); + } + } + catch (Exception e) + { + WCLogger.Log($"Can't open deepLink for wallet {e}"); + } } return connectData; diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/SceneIndexer.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/SceneIndexer.cs index 415f0c799..8b36dab4b 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/SceneIndexer.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/SceneIndexer.cs @@ -47,7 +47,7 @@ static SceneIndexer() importPath = Path.Combine(importPath, "Scenes"); //scenes already added to build settings - if (EditorBuildSettings.scenes.Any(s => s.path.Contains(importPath))) + if (EditorBuildSettings.scenes.Any(s => Path.GetFullPath(s.path).Contains(importPath))) { SessionState.SetBool(ScenesIndexedKey, true); From 1e381b051125e3ab5fef440594d008f6ee3b438f Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 29 Sep 2023 15:17:28 +0300 Subject: [PATCH 025/167] sign typed data successful --- .../WalletConnect/Methods/EthSignTypedData.cs | 8 ++++---- .../{TypedDataRequest.cs => TypedData.cs} | 17 ++++++++++++----- 2 files changed, 16 insertions(+), 9 deletions(-) rename src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/{TypedDataRequest.cs => TypedData.cs} (53%) diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedData.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedData.cs index bd81755cf..b80ca2dc5 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedData.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedData.cs @@ -11,13 +11,13 @@ namespace ChainSafe.Gaming.Wallets.WalletConnect.Methods { [RpcMethod("eth_signTypedData")] [RpcRequestOptions(Clock.ONE_MINUTE, 99998)] - public class EthSignTypedData : List + public class EthSignTypedData : List { - public EthSignTypedData(string address, SerializableDomain domain, TTypedData message) - : base(new string[] + public EthSignTypedData(string address, SerializableDomain domain, TStruct message) + : base(new object[] { address, - JsonConvert.SerializeObject(new TypedDataRequest(MemberDescriptionFactory.GetTypesMemberDescription(typeof(TTypedData)), domain, message)), + new TypedData(domain, message), }) { } diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedDataRequest.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedData.cs similarity index 53% rename from src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedDataRequest.cs rename to src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedData.cs index aeb1b0d99..2428b7b5b 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedDataRequest.cs +++ b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedData.cs @@ -2,18 +2,25 @@ using System.Collections.Generic; using ChainSafe.Gaming.Web3.Core.Evm; using Nethereum.ABI.EIP712; +using Nethereum.ABI.FunctionEncoding.Attributes; using Newtonsoft.Json; namespace ChainSafe.Gaming.Wallets.WalletConnect.Methods { [Serializable] - public struct TypedDataRequest + [JsonObject(MemberSerialization.OptIn)] + public struct TypedData { - public TypedDataRequest(Dictionary types, SerializableDomain domain, TTypedData message) + public TypedData(SerializableDomain domain, TStruct message) { - Types = types; + Types = MemberDescriptionFactory.GetTypesMemberDescription(typeof(SerializableDomain), typeof(TStruct)); - PrimaryType = typeof(TTypedData).Name; + PrimaryType = typeof(TStruct).Name; + + if (StructAttribute.IsStructType(message)) + { + PrimaryType = StructAttribute.GetAttribute(message).Name; + } Domain = domain; @@ -30,6 +37,6 @@ public TypedDataRequest(Dictionary types, Serializa public SerializableDomain Domain { get; private set; } [JsonProperty("message")] - public TTypedData Message { get; private set; } + public TStruct Message { get; private set; } } } \ No newline at end of file From fb0425d105bea0cb77c5d5f6baa2b453e0728e3b Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 29 Sep 2023 12:39:50 +0000 Subject: [PATCH 026/167] Auto-duplicate Package Samples --- .../Samples~/Web3.Unity/Scripts/Utilities/SceneIndexer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/SceneIndexer.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/SceneIndexer.cs index 415f0c799..8b36dab4b 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/SceneIndexer.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/SceneIndexer.cs @@ -47,7 +47,7 @@ static SceneIndexer() importPath = Path.Combine(importPath, "Scenes"); //scenes already added to build settings - if (EditorBuildSettings.scenes.Any(s => s.path.Contains(importPath))) + if (EditorBuildSettings.scenes.Any(s => Path.GetFullPath(s.path).Contains(importPath))) { SessionState.SetBool(ScenesIndexedKey, true); From 556e6f7d99bf1f8697ae83c8d3163c006a70698a Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 2 Oct 2023 21:10:24 +0300 Subject: [PATCH 027/167] Requested Changes Made + WebPageWallet refactored into WalletConnectWallet + Small refactors and renames based on requested PR changes --- ChainSafe.Gaming.sln | 2 +- .../Runtime/Scripts/MainThreadDispatcher.cs | 52 ---- .../Scripts/MainThreadDispatcher.cs.meta | 11 - ...et.cs => UnityWalletConnectWalletModel.cs} | 8 +- ... => UnityWalletConnectWalletModel.cs.meta} | 0 .../Scripts/WalletConnect/WCUnityLogger.cs | 7 +- .../Tests/Runtime/MiscTests.cs | 28 +-- .../Tests/Runtime/SampleTestsBase.cs | 8 +- .../chainsafe.web3-unity.RuntimeTests.asmdef | 4 +- .../ChainSafe.Gaming.Unity.csproj | 2 +- src/ChainSafe.Gaming.Unity/link.xml | 2 +- .../Chain.cs | 2 +- .../ChainSafe.Gaming.WalletConnect.csproj} | 6 +- .../Methods/EthSignMessage.cs | 2 +- .../Methods/EthSignTypedData.cs | 2 +- .../Methods/TypedData.cs | 2 +- .../WalletConnectConfig.cs | 4 +- .../WalletConnectWallet.cs} | 232 +++++++++++------- .../WalletConnectWalletExtensions.cs} | 18 +- .../WalletConnectWalletModel.cs} | 4 +- .../WalletLink.cs | 2 +- .../WebPageWalletConfig.cs | 8 +- .../WalletConnect/WalletConnectUnity.cs | 148 ----------- .../Scenes/SampleLogin.unity | 45 +++- .../Scripts/Prefabs/Logout.cs | 13 +- .../Scripts/Scenes/Login.cs | 33 +-- .../Scripts/Utilities/WalletConnectModal.cs | 15 +- 27 files changed, 277 insertions(+), 383 deletions(-) delete mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs delete mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs.meta rename Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/{UnityWallet.cs => UnityWalletConnectWalletModel.cs} (87%) rename Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/{UnityWallet.cs.meta => UnityWalletConnectWalletModel.cs.meta} (100%) rename src/{ChainSafe.Gaming.WebPageWallet/WalletConnect => ChainSafe.Gaming.WalletConnect}/Chain.cs (91%) rename src/{ChainSafe.Gaming.WebPageWallet/ChainSafe.Gaming.WebPageWallet.csproj => ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj} (86%) rename src/{ChainSafe.Gaming.WebPageWallet/WalletConnect => ChainSafe.Gaming.WalletConnect}/Methods/EthSignMessage.cs (90%) rename src/{ChainSafe.Gaming.WebPageWallet/WalletConnect => ChainSafe.Gaming.WalletConnect}/Methods/EthSignTypedData.cs (93%) rename src/{ChainSafe.Gaming.WebPageWallet/WalletConnect => ChainSafe.Gaming.WalletConnect}/Methods/TypedData.cs (95%) rename src/{ChainSafe.Gaming.WebPageWallet/WalletConnect => ChainSafe.Gaming.WalletConnect}/WalletConnectConfig.cs (79%) rename src/{ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs => ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs} (64%) rename src/{ChainSafe.Gaming.WebPageWallet/WebPageWalletExtensions.cs => ChainSafe.Gaming.WalletConnect/WalletConnectWalletExtensions.cs} (71%) rename src/{ChainSafe.Gaming.WebPageWallet/WalletConnect/Wallet.cs => ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs} (81%) rename src/{ChainSafe.Gaming.WebPageWallet/WalletConnect => ChainSafe.Gaming.WalletConnect}/WalletLink.cs (81%) rename src/{ChainSafe.Gaming.WebPageWallet => ChainSafe.Gaming.WalletConnect}/WebPageWalletConfig.cs (69%) delete mode 100644 src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs diff --git a/ChainSafe.Gaming.sln b/ChainSafe.Gaming.sln index 4785f0a83..43bb89450 100644 --- a/ChainSafe.Gaming.sln +++ b/ChainSafe.Gaming.sln @@ -21,7 +21,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChainSafe.Gaming.Unity.ThirdParty", "src\ChainSafe.Gaming.Unity.ThirdParty\ChainSafe.Gaming.Unity.ThirdParty.csproj", "{9EC71CB4-9401-4E02-AC63-FC13B3D1AA53}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChainSafe.Gaming.WebPageWallet", "src\ChainSafe.Gaming.WebPageWallet\ChainSafe.Gaming.WebPageWallet.csproj", "{99E7A645-CAC5-441B-848D-1253405D6400}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChainSafe.Gaming.WalletConnect", "src\ChainSafe.Gaming.WalletConnect\ChainSafe.Gaming.WalletConnect.csproj", "{99E7A645-CAC5-441B-848D-1253405D6400}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChainSafe.Gaming.InProcessSigner", "src\ChainSafe.Gaming.InProcessSigner\ChainSafe.Gaming.InProcessSigner.csproj", "{3C01FD36-4D44-4886-A971-4786D99CBFCC}" EndProject diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs deleted file mode 100644 index b65c75322..000000000 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Concurrent; -using System.Collections.Generic; -using UnityEngine; - -namespace Web3Unity.Scripts -{ - public class MainThreadDispatcher : MonoBehaviour - { - #region Instance - - [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] - private static void Init() - { - var obj = new GameObject("Main Thread Dispatcher"); - DontDestroyOnLoad(obj); - Instance = obj.AddComponent(); - } - - public static MainThreadDispatcher Instance { get; private set; } - - #endregion - - private readonly Queue _pending = new Queue(); - - public void Invoke(Action action) => _pending.Enqueue(action); - - public static void Enqueue(Action action) - { - if (Instance == null) return; - - Instance.Invoke(action); - } - - private void Update() - { - while (_pending.TryDequeue(out var action)) - { - try - { - action(); - } - - catch (Exception e) - { - Debug.LogError($"{nameof(MainThreadDispatcher)} exception:\n{e}", this); - } - } - } - } -} \ No newline at end of file diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs.meta b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs.meta deleted file mode 100644 index d5b73512a..000000000 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/MainThreadDispatcher.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f068087dcb08d2641a16143b4ab481ee -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWallet.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWalletConnectWalletModel.cs similarity index 87% rename from Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWallet.cs rename to Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWalletConnectWalletModel.cs index 6bf559ff3..126ada71b 100644 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWallet.cs +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWalletConnectWalletModel.cs @@ -1,12 +1,14 @@ using System; -using ChainSafe.Gaming.Wallets.WalletConnect; +using ChainSafe.Gaming.Evm.Unity; +using ChainSafe.Gaming.WalletConnect; +using ChainSafe.Gaming.Wallets; using UnityEngine; using WalletConnectSharp.Sign.Models.Engine; namespace Web3Unity.Scripts.WalletConnect { [Serializable] - public class UnityWallet : Wallet + public class UnityWalletConnectWalletModel : WalletConnectWalletModel { public override void OpenDeeplink(ConnectedData data, bool useNative = false) { @@ -38,7 +40,7 @@ public override void OpenDeeplink(ConnectedData data, bool useNative = false) if (string.IsNullOrWhiteSpace(uri)) throw new Exception("Got empty URI when attempting to create WC deeplink"); #endif - MainThreadDispatcher.Instance.Invoke(delegate + Dispatcher.Instance().Enqueue(delegate { Debug.Log($"Opening URL {uri}"); }); diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWallet.cs.meta b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWalletConnectWalletModel.cs.meta similarity index 100% rename from Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWallet.cs.meta rename to Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWalletConnectWalletModel.cs.meta diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs index f3892c663..4e4fa0c05 100644 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs @@ -1,4 +1,5 @@ using System; +using ChainSafe.Gaming.Evm.Unity; using UnityEngine; using ILogger = WalletConnectSharp.Common.Logging.ILogger; @@ -8,17 +9,17 @@ public class WCUnityLogger : ILogger { public void Log(string message) { - MainThreadDispatcher.Enqueue(() => Debug.Log(message)); + Dispatcher.Instance()?.Enqueue(() => Debug.Log(message)); } public void LogError(string message) { - MainThreadDispatcher.Enqueue(() => Debug.LogError(message)); + Dispatcher.Instance()?.Enqueue(() => Debug.LogError(message)); } public void LogError(Exception e) { - MainThreadDispatcher.Enqueue(() => Debug.LogError(e)); + Dispatcher.Instance()?.Enqueue(() => Debug.LogError(e)); } } } \ No newline at end of file diff --git a/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs b/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs index de9582bbd..21396b252 100644 --- a/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs +++ b/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs @@ -1,7 +1,7 @@ using System.Collections; using System.Collections.Generic; using System.Numerics; -using ChainSafe.Gaming.Wallets; +using ChainSafe.Gaming.WalletConnect; using NUnit.Framework; using UnityEngine; using UnityEngine.TestTools; @@ -64,7 +64,7 @@ public override IEnumerator Setup() [UnityTest] public IEnumerator TestContractSend() { - WebPageWallet.TestResponse = "0x9de3bb69db4bd93babef923f5da1f53cdb287d9ebab9b4177ba2fb25e6a09225"; + WalletConnectWallet.TestResponse = "0x9de3bb69db4bd93babef923f5da1f53cdb287d9ebab9b4177ba2fb25e6a09225"; var sendContract = _sample.ContractSend(ContractSendMethodName, Abi, ContractAddress); @@ -127,7 +127,7 @@ public IEnumerator TestGetGasPrice() [UnityTest] public IEnumerator TestGetGasNonce() { - WebPageWallet.TestResponse = "0x527fcd7356738389d29a96342b5fba92ab1348b744409d5bf4ce0ca2fbc2f25e"; + WalletConnectWallet.TestResponse = "0x527fcd7356738389d29a96342b5fba92ab1348b744409d5bf4ce0ca2fbc2f25e"; var getGasNonce = _sample.GetNonce(); @@ -140,7 +140,7 @@ public IEnumerator TestGetGasNonce() [UnityTest] public IEnumerator TestTransactionStatus() { - WebPageWallet.TestResponse = "0x1e989dbcc43e078b19ea8ea201af195e74397b494b7acd4afcca67e65e5c3339"; + WalletConnectWallet.TestResponse = "0x1e989dbcc43e078b19ea8ea201af195e74397b494b7acd4afcca67e65e5c3339"; var getTransactionStatus = _sample.GetTransactionStatus(); @@ -153,7 +153,7 @@ public IEnumerator TestTransactionStatus() [UnityTest] public IEnumerator TestMint721() { - WebPageWallet.TestResponse = "0xa9f953f9845e7d49d778d6fed622d566daf09e8e1c793297c7cab54782e1aae9"; + WalletConnectWallet.TestResponse = "0xa9f953f9845e7d49d778d6fed622d566daf09e8e1c793297c7cab54782e1aae9"; var mint721 = _sample.Mint721(Mint721Abi, Mint721Address, MintUri); @@ -179,7 +179,7 @@ public IEnumerator TestUseRegisteredContract() [UnityTest] public IEnumerator TestSendArray() { - WebPageWallet.TestResponse = "0x6a33280f3b2b907da613b18b09f863cd835f1977a4131001ace5602899fc98c7"; + WalletConnectWallet.TestResponse = "0x6a33280f3b2b907da613b18b09f863cd835f1977a4131001ace5602899fc98c7"; var sendArray = _sample.SendArray(SendArrayMethodName, SendArrayAbi, SendArrayAddress, ArrayToSend.ToArray()); @@ -193,7 +193,7 @@ public IEnumerator TestSendArray() [UnityTest] public IEnumerator TestSendTransaction() { - WebPageWallet.TestResponse = "0xa60bef1df91bedcd2f3f79e6609716ef245fd1202d66c6e35694b43529bf2e71"; + WalletConnectWallet.TestResponse = "0xa60bef1df91bedcd2f3f79e6609716ef245fd1202d66c6e35694b43529bf2e71"; var sendTransaction = _sample.SendTransaction(SendToAddress); @@ -201,7 +201,7 @@ public IEnumerator TestSendTransaction() Assert.IsTrue(sendTransaction.IsCompletedSuccessfully); - Assert.AreEqual(sendTransaction.Result, WebPageWallet.TestResponse); + Assert.AreEqual(sendTransaction.Result, WalletConnectWallet.TestResponse); } [UnityTest] @@ -217,7 +217,7 @@ public IEnumerator TestSha3() [UnityTest] public IEnumerator TestSignMessage() { - WebPageWallet.TestResponse = + WalletConnectWallet.TestResponse = "0x87dfaa646f476ca53ba8b6e8d122839571e52866be0984ec0497617ad3e988b7401c6b816858df27625166cb98a688f99ba92fa593da3c86c78b19c78c1f51cc1c"; var signMessage = _sample.SignMessage("The right man in the wrong place can make all the difference in the world."); @@ -226,13 +226,13 @@ public IEnumerator TestSignMessage() Assert.IsTrue(signMessage.IsCompletedSuccessfully); - Assert.AreEqual(signMessage.Result, WebPageWallet.TestResponse); + Assert.AreEqual(signMessage.Result, WalletConnectWallet.TestResponse); } [UnityTest] public IEnumerator TestSignVerify() { - WebPageWallet.TestResponse = + WalletConnectWallet.TestResponse = "0x5c996d43c2e804a0d0de7f8b07cc660bbae638aa7ea137df6156621abe5e1fbb1727ebb06f7e0067537cb0f942825fa15ead9dea6d74e4d17fa6e69007cb59561c"; var signVerify = _sample.SignVerify("A man chooses, a slave obeys."); @@ -247,7 +247,7 @@ public IEnumerator TestSignVerify() [UnityTest] public IEnumerator TestTransferErc20() { - WebPageWallet.TestResponse = "0xba90b6fb8cbee5fd0ad423cc74bb4a365bb88b260601933aac86b947945c5465"; + WalletConnectWallet.TestResponse = "0xba90b6fb8cbee5fd0ad423cc74bb4a365bb88b260601933aac86b947945c5465"; var transferErc20 = _sample.TransferErc20(TransferErc20ContractAddress, SendToAddress, "1000000000000000"); @@ -261,7 +261,7 @@ public IEnumerator TestTransferErc20() [UnityTest] public IEnumerator TestTransferErc721() { - WebPageWallet.TestResponse = "0x0e292ae8c5ab005d87581f32fd791e1b18b0cfa944d6877b41edbdb740ee8586"; + WalletConnectWallet.TestResponse = "0x0e292ae8c5ab005d87581f32fd791e1b18b0cfa944d6877b41edbdb740ee8586"; var transferErc721 = _sample.TransferErc721(TransferErc721ContractAddress, SendToAddress, 0); @@ -275,7 +275,7 @@ public IEnumerator TestTransferErc721() [UnityTest] public IEnumerator TestTransferErc1155() { - WebPageWallet.TestResponse = "0xb018a043ac0affe05159a53daa8656dbbad61c839eaf89622d7813226f222876"; + WalletConnectWallet.TestResponse = "0xb018a043ac0affe05159a53daa8656dbbad61c839eaf89622d7813226f222876"; var transferErc1155 = _sample.TransferErc1155(TransferErc1155ContractAddress, 101, 1, SendToAddress); diff --git a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs index 9546db2bb..760b30429 100644 --- a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs +++ b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs @@ -2,7 +2,7 @@ using ChainSafe.Gaming.Evm.Contracts; using ChainSafe.Gaming.Evm.JsonRpc; using ChainSafe.Gaming.UnityPackage; -using ChainSafe.Gaming.Wallets; +using ChainSafe.Gaming.WalletConnect; using ChainSafe.Gaming.Web3; using ChainSafe.Gaming.Web3.Build; using ChainSafe.Gaming.Web3.Unity; @@ -21,7 +21,7 @@ public virtual IEnumerator Setup() yield return new WaitForSeconds(5f); // set wallet to testing - WebPageWallet.Testing = true; + WalletConnectWallet.Testing = true; // For whatever reason, in github this won't load var projectConfigScriptableObject = ProjectConfigUtilities.Load(); @@ -37,7 +37,7 @@ public virtual IEnumerator Setup() services.UseGelato("_UzPz_Yk_WTjWMfcl45fLvQNGQ9ISx5ZE8TnwnVKYrE_"); services.UseRpcProvider(); - services.UseWebPageWallet(new WebPageWalletConfig { SavedUserAddress = "0x55ffe9E30347266f02b9BdAe20aD3a86493289ea" }); + services.UseWalletConnectWallet(new WebPageWalletConfig { SavedUserAddress = "0x55ffe9E30347266f02b9BdAe20aD3a86493289ea" }); //add any contracts we would want to use services.ConfigureRegisteredContracts(contracts => @@ -58,7 +58,7 @@ public virtual IEnumerator Setup() [UnityTearDown] public virtual IEnumerator TearDown() { - WebPageWallet.Testing = false; + WalletConnectWallet.Testing = false; yield return null; } diff --git a/Packages/io.chainsafe.web3-unity/Tests/Runtime/chainsafe.web3-unity.RuntimeTests.asmdef b/Packages/io.chainsafe.web3-unity/Tests/Runtime/chainsafe.web3-unity.RuntimeTests.asmdef index c01263721..a631ee9f2 100644 --- a/Packages/io.chainsafe.web3-unity/Tests/Runtime/chainsafe.web3-unity.RuntimeTests.asmdef +++ b/Packages/io.chainsafe.web3-unity/Tests/Runtime/chainsafe.web3-unity.RuntimeTests.asmdef @@ -16,8 +16,8 @@ "Microsoft.Extensions.DependencyInjection.Abstractions.dll", "ChainSafe.Gaming.dll", "ChainSafe.Gaming.Unity.dll", - "ChainSafe.Gaming.WebPageWallet.dll", - "ChainSafe.Gaming.Gelato.dll" + "ChainSafe.Gaming.Gelato.dll", + "ChainSafe.Gaming.WalletConnect.dll" ], "autoReferenced": false, "defineConstraints": [ diff --git a/src/ChainSafe.Gaming.Unity/ChainSafe.Gaming.Unity.csproj b/src/ChainSafe.Gaming.Unity/ChainSafe.Gaming.Unity.csproj index f2a15f449..8caedd62b 100644 --- a/src/ChainSafe.Gaming.Unity/ChainSafe.Gaming.Unity.csproj +++ b/src/ChainSafe.Gaming.Unity/ChainSafe.Gaming.Unity.csproj @@ -18,7 +18,7 @@ - + diff --git a/src/ChainSafe.Gaming.Unity/link.xml b/src/ChainSafe.Gaming.Unity/link.xml index 8bb680be5..91129f0f6 100644 --- a/src/ChainSafe.Gaming.Unity/link.xml +++ b/src/ChainSafe.Gaming.Unity/link.xml @@ -19,7 +19,7 @@ - + diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Chain.cs b/src/ChainSafe.Gaming.WalletConnect/Chain.cs similarity index 91% rename from src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Chain.cs rename to src/ChainSafe.Gaming.WalletConnect/Chain.cs index 111445ad2..9ccd9c53d 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Chain.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Chain.cs @@ -1,4 +1,4 @@ -namespace ChainSafe.Gaming.Wallets.WalletConnect +namespace ChainSafe.Gaming.WalletConnect { public class Chain { diff --git a/src/ChainSafe.Gaming.WebPageWallet/ChainSafe.Gaming.WebPageWallet.csproj b/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj similarity index 86% rename from src/ChainSafe.Gaming.WebPageWallet/ChainSafe.Gaming.WebPageWallet.csproj rename to src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj index 2c9654cf9..1c269c7d2 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/ChainSafe.Gaming.WebPageWallet.csproj +++ b/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj @@ -3,7 +3,7 @@ netstandard2.1 9.0 - ChainSafe.Gaming.WebPageWallet + ChainSafe.Gaming.WalletConnect False True ../../global.ruleset @@ -23,5 +23,9 @@ + + + + diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignMessage.cs b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignMessage.cs similarity index 90% rename from src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignMessage.cs rename to src/ChainSafe.Gaming.WalletConnect/Methods/EthSignMessage.cs index 181342ccc..f2baa9897 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignMessage.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignMessage.cs @@ -3,7 +3,7 @@ using WalletConnectSharp.Common.Utils; using WalletConnectSharp.Network.Models; -namespace ChainSafe.Gaming.Wallets.WalletConnect.Methods +namespace ChainSafe.Gaming.WalletConnect.Methods { [RpcMethod("personal_sign")] [RpcRequestOptions(Clock.ONE_MINUTE, 99998)] diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedData.cs b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignTypedData.cs similarity index 93% rename from src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedData.cs rename to src/ChainSafe.Gaming.WalletConnect/Methods/EthSignTypedData.cs index b80ca2dc5..1b1d8bc7b 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/EthSignTypedData.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignTypedData.cs @@ -7,7 +7,7 @@ using WalletConnectSharp.Common.Utils; using WalletConnectSharp.Network.Models; -namespace ChainSafe.Gaming.Wallets.WalletConnect.Methods +namespace ChainSafe.Gaming.WalletConnect.Methods { [RpcMethod("eth_signTypedData")] [RpcRequestOptions(Clock.ONE_MINUTE, 99998)] diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedData.cs b/src/ChainSafe.Gaming.WalletConnect/Methods/TypedData.cs similarity index 95% rename from src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedData.cs rename to src/ChainSafe.Gaming.WalletConnect/Methods/TypedData.cs index 2428b7b5b..f32e14b38 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Methods/TypedData.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Methods/TypedData.cs @@ -5,7 +5,7 @@ using Nethereum.ABI.FunctionEncoding.Attributes; using Newtonsoft.Json; -namespace ChainSafe.Gaming.Wallets.WalletConnect.Methods +namespace ChainSafe.Gaming.WalletConnect.Methods { [Serializable] [JsonObject(MemberSerialization.OptIn)] diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs similarity index 79% rename from src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs rename to src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs index ce5d1d4e6..d675302cd 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectConfig.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs @@ -3,7 +3,7 @@ using WalletConnectSharp.Common.Logging; using WalletConnectSharp.Core; -namespace ChainSafe.Gaming.Wallets.WalletConnect +namespace ChainSafe.Gaming.WalletConnect { public struct WalletConnectConfig { @@ -21,6 +21,6 @@ public struct WalletConnectConfig public bool IsMobilePlatform { get; set; } - public Dictionary SupportedWallets { get; set; } + public Dictionary SupportedWallets { get; set; } } } \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs similarity index 64% rename from src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs rename to src/ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs index dbe941290..fb76fc05f 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WebPageWallet.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs @@ -1,30 +1,39 @@ -using System; +using System; using System.Linq; using System.Text; using System.Threading.Tasks; using ChainSafe.Gaming.Evm.Providers; using ChainSafe.Gaming.Evm.Signers; using ChainSafe.Gaming.Evm.Transactions; -using ChainSafe.Gaming.Wallets.WalletConnect; -using ChainSafe.Gaming.Wallets.WalletConnect.Methods; +using ChainSafe.Gaming.WalletConnect; +using ChainSafe.Gaming.WalletConnect.Methods; using ChainSafe.Gaming.Web3; using ChainSafe.Gaming.Web3.Core; using ChainSafe.Gaming.Web3.Core.Debug; using ChainSafe.Gaming.Web3.Core.Evm; using ChainSafe.Gaming.Web3.Environment; -using Nethereum.ABI.EIP712; -using Nethereum.Signer; -using Nethereum.Util; -using Newtonsoft.Json; +using WalletConnectSharp.Common.Logging; +using WalletConnectSharp.Common.Model.Errors; +using WalletConnectSharp.Core; +using WalletConnectSharp.Core.Models; +using WalletConnectSharp.Network.Models; +using WalletConnectSharp.Sign; using WalletConnectSharp.Sign.Models; using WalletConnectSharp.Sign.Models.Engine; -using AddressExtensions = ChainSafe.Gaming.Web3.Core.Debug.AddressExtensions; +using WalletConnectSharp.Storage; -namespace ChainSafe.Gaming.Wallets +namespace ChainSafe.Gaming.WalletConnect { - public class WebPageWallet : ISigner, ITransactionExecutor, ILifecycleParticipant + public class WalletConnectWallet : ISigner, ITransactionExecutor, ILifecycleParticipant { - public WebPageWallet(IRpcProvider provider, WebPageWalletConfig configuration, IOperatingSystemMediator operatingSystem, IChainConfig chainConfig) + private static readonly TimeSpan MinClipboardCheckPeriod = TimeSpan.FromMilliseconds(10); + + private readonly IChainConfig chainConfig; + private readonly WebPageWalletConfig configuration; + private readonly IOperatingSystemMediator operatingSystem; + private readonly IRpcProvider provider; + + public WalletConnectWallet(IRpcProvider provider, WebPageWalletConfig configuration, IOperatingSystemMediator operatingSystem, IChainConfig chainConfig) { this.provider = provider; this.operatingSystem = operatingSystem; @@ -46,8 +55,16 @@ public WebPageWallet(IRpcProvider provider, WebPageWalletConfig configuration, I public static string TestResponse { get; set; } = string.Empty; - // static to keep instance through runtime - related to logout/disconnect - public static WalletConnectUnity WalletConnectUnity { get; private set; } = new WalletConnectUnity(); + // static to not destroy client session on logout/TerminateAsync, just disconnect instead + public static WalletConnectSignClient SignClient { get; private set; } + + public WalletConnectCore Core { get; private set; } + + public SessionStruct Session => SignClient.Session.Get(SignClient.Session.Keys[0]); + + public WalletConnectConfig Config { get; private set; } + + public string Address { get; private set; } private static void InvokeConnected(ConnectedData connectedData) { @@ -59,17 +76,6 @@ private static void InvokeSessionApproved(SessionStruct session) OnSessionApproved?.Invoke(session); } -#pragma warning disable SA1201 - private static readonly TimeSpan MinClipboardCheckPeriod = TimeSpan.FromMilliseconds(10); -#pragma warning restore SA1201 - private readonly IChainConfig chainConfig; - - private readonly WebPageWalletConfig configuration; - private readonly IOperatingSystemMediator operatingSystem; - private readonly IRpcProvider provider; - - public string Address { get; private set; } - public async ValueTask WillStartAsync() { configuration.SavedUserAddress?.AssertIsPublicAddress(nameof(configuration.SavedUserAddress)); @@ -83,16 +89,116 @@ public async ValueTask WillStartAsync() } // Wallet Connect - WalletConnectUnity.OnConnected += InvokeConnected; - WalletConnectUnity.OnSessionApproved += InvokeSessionApproved; - await WalletConnectUnity.Initialize(configuration.WalletConnectConfig); + await Initialize(configuration.WalletConnectConfig); Address = configuration.SavedUserAddress ?? await GetAccountVerifyUserOwns(); } + public async Task Initialize(WalletConnectConfig config) + { + Config = config; + + if (SignClient != null) + { + Core = (WalletConnectCore)SignClient.Core; + } + + if (Core != null && Core.Initialized) + { + WCLogger.Log("Core already initialized"); + + return; + } + + if (Config.Logger != null) + { + WCLogger.Logger = Config.Logger; + } + + Core = new WalletConnectCore(new CoreOptions() + { + Name = Config.ProjectName, + ProjectId = Config.ProjectId, + Storage = new InMemoryStorage(), + BaseContext = Config.BaseContext, + }); + + await Core.Start(); + + SignClient = await WalletConnectSignClient.Init(new SignClientOptions() + { + BaseContext = Config.BaseContext, + Core = Core, + Metadata = Config.Metadata, + Name = Config.ProjectName, + ProjectId = Config.ProjectId, + Storage = Core.Storage, + }); + } + + public async Task ConnectClient() + { + RequiredNamespaces requiredNamespaces = new RequiredNamespaces(); + + var methods = new string[] + { + "eth_sendTransaction", "eth_signTransaction", "eth_sign", "personal_sign", "eth_signTypedData", + }; + + var events = new string[] { "chainChanged", "accountsChanged" }; + + requiredNamespaces.Add( + Chain.EvmNamespace, + new ProposedNamespace + { + Chains = new string[] + { + Config.Chain.FullChainId, + }, + Events = events, + Methods = methods, + }); + + // start connecting + ConnectedData connectData = await SignClient.Connect(new ConnectOptions + { + RequiredNamespaces = requiredNamespaces, + }); + + InvokeConnected(connectData); + + SessionStruct sessionResult = await connectData.Approval; + + InvokeSessionApproved(sessionResult); + + if (Config.IsMobilePlatform) + { + // this doesn't work for all wallets, hence the try catch + try + { + string nativeUrl = sessionResult.Peer.Metadata.Redirect.Native.Replace("//", string.Empty); + + string defaultWalletId = Config.SupportedWallets.FirstOrDefault(t => + t.Value.Mobile.NativeProtocol == nativeUrl || t.Value.Desktop.NativeProtocol == nativeUrl) + .Key; + + if (Config.SupportedWallets.TryGetValue(defaultWalletId, out WalletConnectWalletModel wallet)) + { + wallet.OpenDeeplink(connectData); + } + } + catch (Exception e) + { + WCLogger.Log($"Can't open deepLink for wallet {e}"); + } + } + + return connectData; + } + public ValueTask WillStopAsync() { - return new ValueTask(Task.CompletedTask); + return new ValueTask(Disconnect()); } public Task GetAddress() @@ -111,7 +217,7 @@ public async Task SignMessage(string message) // var pageUrl = BuildUrl(); // Wallet connect - SessionStruct session = WalletConnectUnity.Session; + SessionStruct session = Session; var (address, chainId) = GetCurrentAddress(); @@ -123,7 +229,7 @@ public async Task SignMessage(string message) var request = new EthSignMessage(message, address); string hash = - await WalletConnectUnity.SignClient.Request(session.Topic, request, chainId); + await SignClient.Request(session.Topic, request, chainId); var isValid = ValidateResponse(hash); if (!isValid) @@ -151,7 +257,7 @@ bool ValidateResponse(string response) public async Task SignTypedData(SerializableDomain domain, TStructType message) { // Wallet connect - SessionStruct session = WalletConnectUnity.Session; + SessionStruct session = Session; var (address, chainId) = GetCurrentAddress(); @@ -163,7 +269,7 @@ public async Task SignTypedData(SerializableDomain domain, var request = new EthSignTypedData(address, domain, message); string hash = - await WalletConnectUnity.SignClient.Request, string>(session.Topic, request, chainId); + await SignClient.Request, string>(session.Topic, request, chainId); var isValid = ValidateResponse(hash); if (!isValid) @@ -245,7 +351,7 @@ bool ValidateResponse(string response) private (string, string) GetCurrentAddress() { - var currentSession = WalletConnectUnity.Session; + var currentSession = Session; var defaultChain = currentSession.Namespaces.Keys.FirstOrDefault(); @@ -311,7 +417,7 @@ private async Task GetAccountVerifyUserOwns() { // sign current time var expirationTime = DateTime.Now + configuration.ConnectRequestExpiresAfter; - await WalletConnectUnity.ConnectClient(); + await ConnectClient(); var (address, _) = GetCurrentAddress(); @@ -327,58 +433,20 @@ private async Task GetAccountVerifyUserOwns() } return address; - - // string ExtractPublicAddress(string sig, string originalMessage) - // { - // try - // { - // var msg = "\x19" + "Ethereum Signed Message:\n" + originalMessage.Length + originalMessage; - // var msgHash = new Sha3Keccack().CalculateHash(Encoding.UTF8.GetBytes(msg)); - // var ecdsaSignature = MessageSigner.ExtractEcdsaSignature(sig); - // var key = EthECKey.RecoverFromSignature(ecdsaSignature, msgHash); - // return key.GetPublicAddress(); - // } - // catch - // { - // throw new Web3Exception("Invalid signature"); - // } - // } } - public async Task Disconnect() + private async Task Disconnect() { - configuration.SavedUserAddress = null; - - await WalletConnectUnity.Disconnect(); - } - - /* - Storing this here just to know, how events for analytics were constructed + try + { + configuration.SavedUserAddress = null; - Logging event on SendTransaction success - var data = new - { - Client = "Desktop/Mobile", - Version = "v2", - ProjectID = PlayerPrefs.GetString("ProjectID"), - Player = Sha3(PlayerPrefs.GetString("Account") + PlayerPrefs.GetString("ProjectID")), - ChainId = _chainId, - Address = _to, - Value = _value, - GasLimit = _gasLimit, - GasPrice = _gasPrice, - Data = _data - }; - - Logging.SendGameData(data); - - public static string Sha3(string _message) - { - var signer = new EthereumMessageSigner(); - var hash = new Sha3Keccack().CalculateHash(_message).EnsureHexPrefix(); - // 0x06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2 - return hash; + await SignClient.Disconnect(Session.Topic, Error.FromErrorType(ErrorType.USER_DISCONNECTED)); + } + catch (Exception e) + { + WCLogger.LogError($"error disconnecting: {e}"); + } } - */ } } \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WebPageWallet/WebPageWalletExtensions.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletExtensions.cs similarity index 71% rename from src/ChainSafe.Gaming.WebPageWallet/WebPageWalletExtensions.cs rename to src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletExtensions.cs index 3f027e091..0dd870c25 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WebPageWalletExtensions.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletExtensions.cs @@ -1,13 +1,13 @@ -using ChainSafe.Gaming.Evm.Signers; +using ChainSafe.Gaming.Evm.Signers; using ChainSafe.Gaming.Web3.Build; using ChainSafe.Gaming.Web3.Core; using ChainSafe.Gaming.Web3.Core.Evm; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; -namespace ChainSafe.Gaming.Wallets +namespace ChainSafe.Gaming.WalletConnect { - public static class WebPageWalletExtensions + public static class WalletConnectWalletExtensions { private static readonly WebPageWalletConfig DefaultConfig = new(); @@ -15,10 +15,10 @@ public static class WebPageWalletExtensions /// Binds Web implementation of EVM Provider to Web3. /// /// The same service collection that was passed in. This enables fluent style. - public static IWeb3ServiceCollection UseWebPageWallet(this IWeb3ServiceCollection collection, WebPageWalletConfig configuration) + public static IWeb3ServiceCollection UseWalletConnectWallet(this IWeb3ServiceCollection collection, WebPageWalletConfig configuration) { - collection.UseWebPageWallet(); - collection.ConfigureWebPageWallet(configuration); + collection.UseWalletConnectWallet(); + collection.ConfigureWalletConnectWallet(configuration); return collection; } @@ -26,7 +26,7 @@ public static IWeb3ServiceCollection UseWebPageWallet(this IWeb3ServiceCollectio /// Binds Web implementation of EVM Provider to Web3. /// /// The same service collection that was passed in. This enables fluent style. - public static IWeb3ServiceCollection UseWebPageWallet(this IWeb3ServiceCollection collection) + public static IWeb3ServiceCollection UseWalletConnectWallet(this IWeb3ServiceCollection collection) { collection.AssertServiceNotBound(); collection.AssertServiceNotBound(); @@ -35,7 +35,7 @@ public static IWeb3ServiceCollection UseWebPageWallet(this IWeb3ServiceCollectio collection.TryAddSingleton(DefaultConfig); // wallet - collection.AddSingleton(); + collection.AddSingleton(); return collection; } @@ -44,7 +44,7 @@ public static IWeb3ServiceCollection UseWebPageWallet(this IWeb3ServiceCollectio /// Configures Web implementation of EVM Provider. /// /// The same service collection that was passed in. This enables fluent style. - public static IWeb3ServiceCollection ConfigureWebPageWallet(this IWeb3ServiceCollection collection, WebPageWalletConfig configuration) + public static IWeb3ServiceCollection ConfigureWalletConnectWallet(this IWeb3ServiceCollection collection, WebPageWalletConfig configuration) { collection.Replace(ServiceDescriptor.Singleton(typeof(WebPageWalletConfig), configuration)); return collection; diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Wallet.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs similarity index 81% rename from src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Wallet.cs rename to src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs index 2bf72c755..10ab58dce 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/Wallet.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs @@ -2,9 +2,9 @@ using Newtonsoft.Json; using WalletConnectSharp.Sign.Models.Engine; -namespace ChainSafe.Gaming.Wallets.WalletConnect +namespace ChainSafe.Gaming.WalletConnect { - public abstract class Wallet + public abstract class WalletConnectWalletModel { [JsonProperty("mobile")] public WalletLink Mobile { get; private set; } diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletLink.cs b/src/ChainSafe.Gaming.WalletConnect/WalletLink.cs similarity index 81% rename from src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletLink.cs rename to src/ChainSafe.Gaming.WalletConnect/WalletLink.cs index c7f6e037d..f19d72967 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletLink.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletLink.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace ChainSafe.Gaming.Wallets.WalletConnect +namespace ChainSafe.Gaming.WalletConnect { public struct WalletLink { diff --git a/src/ChainSafe.Gaming.WebPageWallet/WebPageWalletConfig.cs b/src/ChainSafe.Gaming.WalletConnect/WebPageWalletConfig.cs similarity index 69% rename from src/ChainSafe.Gaming.WebPageWallet/WebPageWalletConfig.cs rename to src/ChainSafe.Gaming.WalletConnect/WebPageWalletConfig.cs index 5753d9da1..478534fcd 100644 --- a/src/ChainSafe.Gaming.WebPageWallet/WebPageWalletConfig.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WebPageWalletConfig.cs @@ -1,12 +1,12 @@ using System; -using ChainSafe.Gaming.Wallets.WalletConnect; +using ChainSafe.Gaming.WalletConnect; -namespace ChainSafe.Gaming.Wallets +namespace ChainSafe.Gaming.WalletConnect { [Serializable] public class WebPageWalletConfig { - public string? SavedUserAddress { get; set; } = null; + public string SavedUserAddress { get; set; } = null; public string ServiceUrl { get; set; } = "https://chainsafe.github.io/game-web3wallet/"; @@ -14,7 +14,7 @@ public class WebPageWalletConfig public TimeSpan ConnectRequestExpiresAfter { get; set; } = TimeSpan.FromMinutes(1); - public WebPageWallet.ConnectMessageBuildDelegate ConnectMessageBuilder { get; set; } = + public WalletConnectWallet.ConnectMessageBuildDelegate ConnectMessageBuilder { get; set; } = time => $"Sign this message to connect your account. This request will expire at {time:hh:mm:ss}."; public WalletConnectConfig WalletConnectConfig { get; set; } diff --git a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs b/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs deleted file mode 100644 index 3d3682ec6..000000000 --- a/src/ChainSafe.Gaming.WebPageWallet/WalletConnect/WalletConnectUnity.cs +++ /dev/null @@ -1,148 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using WalletConnectSharp.Common.Logging; -using WalletConnectSharp.Common.Model.Errors; -using WalletConnectSharp.Core; -using WalletConnectSharp.Core.Models; -using WalletConnectSharp.Network.Models; -using WalletConnectSharp.Sign; -using WalletConnectSharp.Sign.Models; -using WalletConnectSharp.Sign.Models.Engine; -using WalletConnectSharp.Storage; -using WalletConnectSharp.Storage.Interfaces; - -namespace ChainSafe.Gaming.Wallets.WalletConnect -{ - public class WalletConnectUnity - { - public delegate void Connected(ConnectedData connectedData); - - public delegate void SessionApproved(SessionStruct session); - - public event Connected OnConnected; - - public event SessionApproved OnSessionApproved; - - public WalletConnectCore Core { get; private set; } - - public WalletConnectSignClient SignClient { get; private set; } - - public SessionStruct Session => SignClient.Session.Get(SignClient.Session.Keys[0]); - - public WalletConnectConfig Config { get; private set; } - - public async Task Initialize(WalletConnectConfig config) - { - if (Core != null && Core.Initialized) - { - WCLogger.Log("Core already initialized"); - - return; - } - - Config = config; - - if (Config.Logger != null) - { - WCLogger.Logger = Config.Logger; - } - - Core = new WalletConnectCore(new CoreOptions() - { - Name = Config.ProjectName, - ProjectId = Config.ProjectId, - Storage = new InMemoryStorage(), - BaseContext = Config.BaseContext, - }); - - await Core.Start(); - - SignClient = await WalletConnectSignClient.Init(new SignClientOptions() - { - BaseContext = Config.BaseContext, - Core = Core, - Metadata = Config.Metadata, - Name = Config.ProjectName, - ProjectId = Config.ProjectId, - Storage = Core.Storage, - }); - } - - public async Task ConnectClient() - { - RequiredNamespaces requiredNamespaces = new RequiredNamespaces(); - - var methods = new string[] - { - "eth_sendTransaction", "eth_signTransaction", "eth_sign", "personal_sign", "eth_signTypedData", - }; - - var events = new string[] { "chainChanged", "accountsChanged" }; - - requiredNamespaces.Add( - Chain.EvmNamespace, - new ProposedNamespace - { - Chains = new string[] - { - Config.Chain.FullChainId, - }, - Events = events, - Methods = methods, - }); - - // start connecting - ConnectedData connectData = await SignClient.Connect(new ConnectOptions - { - RequiredNamespaces = requiredNamespaces, - }); - - InvokeConnected(connectData); - - SessionStruct sessionResult = await connectData.Approval; - - InvokeSessionApproved(sessionResult); - - if (Config.IsMobilePlatform) - { - // this doesn't work for all wallets, hence the try catch - try - { - string nativeUrl = sessionResult.Peer.Metadata.Redirect.Native.Replace("//", string.Empty); - - string defaultWalletId = Config.SupportedWallets.FirstOrDefault(t => - t.Value.Mobile.NativeProtocol == nativeUrl || t.Value.Desktop.NativeProtocol == nativeUrl) - .Key; - - if (Config.SupportedWallets.TryGetValue(defaultWalletId, out Wallet wallet)) - { - wallet.OpenDeeplink(connectData); - } - } - catch (Exception e) - { - WCLogger.Log($"Can't open deepLink for wallet {e}"); - } - } - - return connectData; - } - - public async Task Disconnect() - { - await SignClient.Disconnect(Session.Topic, Error.FromErrorType(ErrorType.USER_DISCONNECTED)); - } - - private void InvokeConnected(ConnectedData connectedData) - { - OnConnected?.Invoke(connectedData); - } - - private void InvokeSessionApproved(SessionStruct session) - { - OnSessionApproved?.Invoke(session); - } - } -} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity index 52cc93149..e0eca2a4c 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity @@ -1395,6 +1395,50 @@ MonoBehaviour: _copyToClipboardButton: {fileID: 212403314} _backButton: {fileID: 1993078182} _container: {fileID: 1278821651} +--- !u!1 &407712547 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 407712549} + - component: {fileID: 407712548} + m_Layer: 0 + m_Name: MainThreadDispatcher + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &407712548 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 407712547} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -320598466, guid: 6ca4015b3a4624b13bfadd6f7956c0be, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &407712549 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 407712547} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &452118933 PrefabInstance: m_ObjectHideFlags: 0 @@ -2400,7 +2444,6 @@ MonoBehaviour: Native: Universal: VerifyUrl: - _chainDropdown: {fileID: 0} --- !u!1 &1434038407 GameObject: m_ObjectHideFlags: 0 diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs index ed5bc8e6f..cae89f22d 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs @@ -11,12 +11,6 @@ public async void OnLogout() // Remove the saved "remember me" data, if any PlayerPrefs.DeleteKey(Login.PlayerAccountKey); - // disconnect wallet - if (Web3Accessor.Web3.Signer is WebPageWallet wallet) - { - await wallet.Disconnect(); - } - // Terminate Web3 await Web3Accessor.Web3.TerminateAsync(); @@ -26,4 +20,11 @@ public async void OnLogout() // Go back to the first scene to log in again SceneManager.LoadScene(0); } + + private void OnApplicationQuit() + { + Debug.Log("Disconnecting wallet..."); + + OnLogout(); + } } diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index c20cca61d..66360cf89 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -7,7 +7,7 @@ using ChainSafe.Gaming.Evm.JsonRpc; using ChainSafe.Gaming.UnityPackage; using ChainSafe.Gaming.Wallets; -using ChainSafe.Gaming.Wallets.WalletConnect; +using ChainSafe.Gaming.WalletConnect; using ChainSafe.Gaming.Web3; using ChainSafe.Gaming.Web3.Build; using ChainSafe.Gaming.Web3.Unity; @@ -77,21 +77,6 @@ public class Login : MonoBehaviour #endregion - [RuntimeInitializeOnLoadMethod] - static void DisconnectWallet() - { - Application.quitting += async delegate - { - Debug.Log("Disconnecting wallet..."); - - //if already connected - if (Web3Accessor.Web3 != null && Web3Accessor.Web3.Signer is WebPageWallet wallet) - { - await wallet.Disconnect(); - } - }; - } - private IEnumerator Start() { Assert.IsNotNull(Web3AuthButtons); @@ -137,11 +122,11 @@ private async void TryAutoLogin() .Configure(ConfigureCommonServices) .Configure(services => { - services.UseWebPageWallet( + services.UseWalletConnectWallet( new WebPageWalletConfig { SavedUserAddress = savedAccount, - WalletConnectConfig = BuildConfig() + WalletConnectConfig = BuildWalletConnectConfig() }); }); @@ -161,10 +146,10 @@ private async void LoginWithExistingAccount() */ if (useWebPageWallet) { - services.UseWebPageWallet( + services.UseWalletConnectWallet( new WebPageWalletConfig { - WalletConnectConfig = BuildConfig() + WalletConnectConfig = BuildWalletConnectConfig() }); } else @@ -283,9 +268,9 @@ private void ConfigureCommonServices(IWeb3ServiceCollection services) #region Wallet Connect - private Dictionary _supportedWallets; + private Dictionary _supportedWallets; - private WalletConnectConfig BuildConfig() + private WalletConnectConfig BuildWalletConnectConfig() { // build chain var projectConfig = ProjectConfigUtilities.Load(); @@ -323,8 +308,8 @@ private IEnumerator FetchSupportedWallets() { var json = webRequest.downloadHandler.text; - _supportedWallets = JsonConvert.DeserializeObject>(json) - .ToDictionary(w => w.Key, w => (Wallet)w.Value); + _supportedWallets = JsonConvert.DeserializeObject>(json) + .ToDictionary(w => w.Key, w => (WalletConnectWalletModel) w.Value); Debug.Log($"Fetched {_supportedWallets.Count} Supported Wallets."); } diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs index f310c0169..12aea5580 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs @@ -1,4 +1,5 @@ -using ChainSafe.Gaming.Wallets; +using ChainSafe.Gaming.Evm.Unity; +using ChainSafe.Gaming.WalletConnect; using UnityEngine; using UnityEngine.UI; using WalletConnectSharp.Sign.Models; @@ -19,14 +20,14 @@ private void Start() { _backButton.onClick.AddListener(Disable); - WebPageWallet.OnConnected += WalletConnected; + WalletConnectWallet.OnConnected += WalletConnected; - WebPageWallet.OnSessionApproved += SessionApproved; + WalletConnectWallet.OnSessionApproved += SessionApproved; } private void WalletConnected(ConnectedData data) { - MainThreadDispatcher.Instance.Invoke(delegate + Dispatcher.Instance().Enqueue(delegate { // enable display _container.gameObject.SetActive(true); @@ -41,7 +42,7 @@ private void WalletConnected(ConnectedData data) private void SessionApproved(SessionStruct session) { - MainThreadDispatcher.Instance.Invoke(delegate + Dispatcher.Instance().Enqueue(delegate { Debug.Log($"{session.Topic} Approved"); }); @@ -83,8 +84,8 @@ private void Disable() private void OnDisable() { - WebPageWallet.OnConnected -= WalletConnected; + WalletConnectWallet.OnConnected -= WalletConnected; - WebPageWallet.OnSessionApproved -= SessionApproved; + WalletConnectWallet.OnSessionApproved -= SessionApproved; } } \ No newline at end of file From eb2b7b7f8c65eee84a6a2bd631a9f52118fec71e Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 2 Oct 2023 18:11:11 +0000 Subject: [PATCH 028/167] Auto-duplicate Package Samples --- .../Web3.Unity/Scenes/SampleLogin.unity | 45 ++++++++++++++++++- .../Web3.Unity/Scripts/Prefabs/Logout.cs | 13 +++--- .../Web3.Unity/Scripts/Scenes/Login.cs | 33 ++++---------- .../Scripts/Utilities/WalletConnectModal.cs | 15 ++++--- 4 files changed, 68 insertions(+), 38 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity index 52cc93149..e0eca2a4c 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity @@ -1395,6 +1395,50 @@ MonoBehaviour: _copyToClipboardButton: {fileID: 212403314} _backButton: {fileID: 1993078182} _container: {fileID: 1278821651} +--- !u!1 &407712547 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 407712549} + - component: {fileID: 407712548} + m_Layer: 0 + m_Name: MainThreadDispatcher + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &407712548 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 407712547} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -320598466, guid: 6ca4015b3a4624b13bfadd6f7956c0be, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &407712549 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 407712547} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &452118933 PrefabInstance: m_ObjectHideFlags: 0 @@ -2400,7 +2444,6 @@ MonoBehaviour: Native: Universal: VerifyUrl: - _chainDropdown: {fileID: 0} --- !u!1 &1434038407 GameObject: m_ObjectHideFlags: 0 diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs index ed5bc8e6f..cae89f22d 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs @@ -11,12 +11,6 @@ public async void OnLogout() // Remove the saved "remember me" data, if any PlayerPrefs.DeleteKey(Login.PlayerAccountKey); - // disconnect wallet - if (Web3Accessor.Web3.Signer is WebPageWallet wallet) - { - await wallet.Disconnect(); - } - // Terminate Web3 await Web3Accessor.Web3.TerminateAsync(); @@ -26,4 +20,11 @@ public async void OnLogout() // Go back to the first scene to log in again SceneManager.LoadScene(0); } + + private void OnApplicationQuit() + { + Debug.Log("Disconnecting wallet..."); + + OnLogout(); + } } diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs index c20cca61d..66360cf89 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs @@ -7,7 +7,7 @@ using ChainSafe.Gaming.Evm.JsonRpc; using ChainSafe.Gaming.UnityPackage; using ChainSafe.Gaming.Wallets; -using ChainSafe.Gaming.Wallets.WalletConnect; +using ChainSafe.Gaming.WalletConnect; using ChainSafe.Gaming.Web3; using ChainSafe.Gaming.Web3.Build; using ChainSafe.Gaming.Web3.Unity; @@ -77,21 +77,6 @@ public class Login : MonoBehaviour #endregion - [RuntimeInitializeOnLoadMethod] - static void DisconnectWallet() - { - Application.quitting += async delegate - { - Debug.Log("Disconnecting wallet..."); - - //if already connected - if (Web3Accessor.Web3 != null && Web3Accessor.Web3.Signer is WebPageWallet wallet) - { - await wallet.Disconnect(); - } - }; - } - private IEnumerator Start() { Assert.IsNotNull(Web3AuthButtons); @@ -137,11 +122,11 @@ private async void TryAutoLogin() .Configure(ConfigureCommonServices) .Configure(services => { - services.UseWebPageWallet( + services.UseWalletConnectWallet( new WebPageWalletConfig { SavedUserAddress = savedAccount, - WalletConnectConfig = BuildConfig() + WalletConnectConfig = BuildWalletConnectConfig() }); }); @@ -161,10 +146,10 @@ private async void LoginWithExistingAccount() */ if (useWebPageWallet) { - services.UseWebPageWallet( + services.UseWalletConnectWallet( new WebPageWalletConfig { - WalletConnectConfig = BuildConfig() + WalletConnectConfig = BuildWalletConnectConfig() }); } else @@ -283,9 +268,9 @@ private void ConfigureCommonServices(IWeb3ServiceCollection services) #region Wallet Connect - private Dictionary _supportedWallets; + private Dictionary _supportedWallets; - private WalletConnectConfig BuildConfig() + private WalletConnectConfig BuildWalletConnectConfig() { // build chain var projectConfig = ProjectConfigUtilities.Load(); @@ -323,8 +308,8 @@ private IEnumerator FetchSupportedWallets() { var json = webRequest.downloadHandler.text; - _supportedWallets = JsonConvert.DeserializeObject>(json) - .ToDictionary(w => w.Key, w => (Wallet)w.Value); + _supportedWallets = JsonConvert.DeserializeObject>(json) + .ToDictionary(w => w.Key, w => (WalletConnectWalletModel) w.Value); Debug.Log($"Fetched {_supportedWallets.Count} Supported Wallets."); } diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs index f310c0169..12aea5580 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs @@ -1,4 +1,5 @@ -using ChainSafe.Gaming.Wallets; +using ChainSafe.Gaming.Evm.Unity; +using ChainSafe.Gaming.WalletConnect; using UnityEngine; using UnityEngine.UI; using WalletConnectSharp.Sign.Models; @@ -19,14 +20,14 @@ private void Start() { _backButton.onClick.AddListener(Disable); - WebPageWallet.OnConnected += WalletConnected; + WalletConnectWallet.OnConnected += WalletConnected; - WebPageWallet.OnSessionApproved += SessionApproved; + WalletConnectWallet.OnSessionApproved += SessionApproved; } private void WalletConnected(ConnectedData data) { - MainThreadDispatcher.Instance.Invoke(delegate + Dispatcher.Instance().Enqueue(delegate { // enable display _container.gameObject.SetActive(true); @@ -41,7 +42,7 @@ private void WalletConnected(ConnectedData data) private void SessionApproved(SessionStruct session) { - MainThreadDispatcher.Instance.Invoke(delegate + Dispatcher.Instance().Enqueue(delegate { Debug.Log($"{session.Topic} Approved"); }); @@ -83,8 +84,8 @@ private void Disable() private void OnDisable() { - WebPageWallet.OnConnected -= WalletConnected; + WalletConnectWallet.OnConnected -= WalletConnected; - WebPageWallet.OnSessionApproved -= SessionApproved; + WalletConnectWallet.OnSessionApproved -= SessionApproved; } } \ No newline at end of file From 5e079e108488299a2994e60202253565e8468fba Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 3 Oct 2023 08:57:04 +0300 Subject: [PATCH 029/167] fix path on publish-to-unity-package.bat --- scripts/publish-to-unity-package.bat | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/scripts/publish-to-unity-package.bat b/scripts/publish-to-unity-package.bat index 890f3ab36..32b58404b 100644 --- a/scripts/publish-to-unity-package.bat +++ b/scripts/publish-to-unity-package.bat @@ -5,15 +5,12 @@ pushd ..\src\ChainSafe.Gaming.Unity del obj /F /Q del bin /F /Q +dotnet restore dotnet publish -c release -f netstandard2.1 /property:Unity=true if %errorlevel% neq 0 exit /b %errorlevel% echo Restoring non-Unity packages... -pushd ..\.. -dotnet restore -popd - echo Moving files to Unity package... pushd bin\release\netstandard2.1\publish @@ -25,4 +22,5 @@ del ..\..\..\..\..\..\Packages\io.chainsafe.web3-unity\Runtime\Libraries\* /F /Q copy *.dll ..\..\..\..\..\..\Packages\io.chainsafe.web3-unity\Runtime\Libraries popd popd + echo Done From b2881ba721cdd7c8edde4e29a2774a73cfd22d5d Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 3 Oct 2023 11:36:49 +0300 Subject: [PATCH 030/167] wallet model refactor --- .../UnityWalletConnectWalletModel.cs | 63 ------------------- .../UnityWalletConnectWalletModel.cs.meta | 11 ---- .../WalletConnectWalletModel.cs | 61 +++++++++++++++++- .../Scripts/Scenes/Login.cs | 2 +- 4 files changed, 59 insertions(+), 78 deletions(-) delete mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWalletConnectWalletModel.cs delete mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWalletConnectWalletModel.cs.meta diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWalletConnectWalletModel.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWalletConnectWalletModel.cs deleted file mode 100644 index 126ada71b..000000000 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWalletConnectWalletModel.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using ChainSafe.Gaming.Evm.Unity; -using ChainSafe.Gaming.WalletConnect; -using ChainSafe.Gaming.Wallets; -using UnityEngine; -using WalletConnectSharp.Sign.Models.Engine; - -namespace Web3Unity.Scripts.WalletConnect -{ - [Serializable] - public class UnityWalletConnectWalletModel : WalletConnectWalletModel - { - public override void OpenDeeplink(ConnectedData data, bool useNative = false) - { - string uri = string.Empty; - -#if UNITY_ANDROID - uri = data.Uri; // Android OS should handle wc: protocol -#elif UNITY_IOS - // on iOS, we need to use one of the wallet links - WalletLink linkData = Application.isMobilePlatform ? Mobile : Desktop; - - var universalUrl = useNative ? linkData.NativeProtocol : linkData.UniversalUrl; - - uri = data.Uri; - - if (!string.IsNullOrWhiteSpace(universalUrl)) - { - uri = data.Uri; - - if (useNative) - uri = $"{universalUrl}//{uri}"; - - else if (universalUrl.EndsWith("/")) - uri = $"{universalUrl}{uri}"; - - else - uri = $"{universalUrl}/{uri}"; - } - - if (string.IsNullOrWhiteSpace(uri)) throw new Exception("Got empty URI when attempting to create WC deeplink"); -#endif - Dispatcher.Instance().Enqueue(delegate - { - Debug.Log($"Opening URL {uri}"); - }); - - Application.OpenURL(uri); - } - - public override void OpenWallet() - { - WalletLink linkData = Application.isMobilePlatform ? Mobile : Desktop; - - var universalUrl = linkData.UniversalUrl; - - if (string.IsNullOrWhiteSpace(universalUrl)) - throw new Exception("Got empty URI when attempting to create WC deeplink"); - - Application.OpenURL(universalUrl); - } - } -} \ No newline at end of file diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWalletConnectWalletModel.cs.meta b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWalletConnectWalletModel.cs.meta deleted file mode 100644 index 582311b61..000000000 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/UnityWalletConnectWalletModel.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d33c8514710630343ac91aaf41761474 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs index 10ab58dce..5bc953b50 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs @@ -1,10 +1,12 @@ using System; using Newtonsoft.Json; +using UnityEngine; +using WalletConnectSharp.Common.Logging; using WalletConnectSharp.Sign.Models.Engine; namespace ChainSafe.Gaming.WalletConnect { - public abstract class WalletConnectWalletModel + public class WalletConnectWalletModel { [JsonProperty("mobile")] public WalletLink Mobile { get; private set; } @@ -12,8 +14,61 @@ public abstract class WalletConnectWalletModel [JsonProperty("desktop")] public WalletLink Desktop { get; private set; } - public abstract void OpenDeeplink(ConnectedData data, bool useNative = false); + public void OpenDeeplink(ConnectedData data, bool useNative = false) + { + string uri = string.Empty; - public abstract void OpenWallet(); +#if UNITY_ANDROID + uri = data.Uri; // Android OS should handle wc: protocol +#elif UNITY_IOS + + // on iOS, we need to use one of the wallet links + WalletLink linkData = Application.isMobilePlatform ? Mobile : Desktop; + + var universalUrl = useNative ? linkData.NativeProtocol : linkData.UniversalUrl; + + uri = data.Uri; + + if (!string.IsNullOrWhiteSpace(universalUrl)) + { + uri = data.Uri; + + if (useNative) + { + uri = $"{universalUrl}//{uri}"; + } + else if (universalUrl.EndsWith("/")) + { + uri = $"{universalUrl}{uri}"; + } + else + { + uri = $"{universalUrl}/{uri}"; + } + } + + if (string.IsNullOrWhiteSpace(uri)) + { + throw new Exception("Got empty URI when attempting to create WC deeplink"); + } +#endif + WCLogger.Log($"Opening URL {uri}"); + + Application.OpenURL(uri); + } + + public void OpenWallet() + { + WalletLink linkData = Application.isMobilePlatform ? Mobile : Desktop; + + var universalUrl = linkData.UniversalUrl; + + if (string.IsNullOrWhiteSpace(universalUrl)) + { + throw new Exception("Got empty URI when attempting to create WC deeplink"); + } + + Application.OpenURL(universalUrl); + } } } \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index 66360cf89..9f16a408d 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -308,7 +308,7 @@ private IEnumerator FetchSupportedWallets() { var json = webRequest.downloadHandler.text; - _supportedWallets = JsonConvert.DeserializeObject>(json) + _supportedWallets = JsonConvert.DeserializeObject>(json) .ToDictionary(w => w.Key, w => (WalletConnectWalletModel) w.Value); Debug.Log($"Fetched {_supportedWallets.Count} Supported Wallets."); From 903050036f77fa4591e749a94fd8de30d6456f23 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 3 Oct 2023 08:37:24 +0000 Subject: [PATCH 031/167] Auto-duplicate Package Samples --- .../Samples~/Web3.Unity/Scripts/Scenes/Login.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs index 66360cf89..9f16a408d 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs @@ -308,7 +308,7 @@ private IEnumerator FetchSupportedWallets() { var json = webRequest.downloadHandler.text; - _supportedWallets = JsonConvert.DeserializeObject>(json) + _supportedWallets = JsonConvert.DeserializeObject>(json) .ToDictionary(w => w.Key, w => (WalletConnectWalletModel) w.Value); Debug.Log($"Fetched {_supportedWallets.Count} Supported Wallets."); From 70e5c89ecfd8e11c42a95fa8ea27613d75f18388 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 3 Oct 2023 13:22:05 +0300 Subject: [PATCH 032/167] More requested changes made + moved WCLogger to src and used ILogWriter to pass logs --- .../Runtime/Scripts/WalletConnect.meta | 8 ----- .../Scripts/WalletConnect/WCUnityLogger.cs | 25 -------------- .../WalletConnect/WCUnityLogger.cs.meta | 11 ------- .../ChainSafe.Gaming.WalletConnect.csproj | 5 +-- .../WCLogWriter.cs | 33 +++++++++++++++++++ .../WalletConnectConfig.cs | 5 --- .../WalletConnectWallet.cs | 12 +++---- .../Scripts/Scenes/Login.cs | 6 +--- 8 files changed, 41 insertions(+), 64 deletions(-) delete mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect.meta delete mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs delete mode 100644 Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs.meta create mode 100644 src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect.meta b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect.meta deleted file mode 100644 index 9ee791f1c..000000000 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 059adb9b73c08dc4085f23fcce99b636 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs deleted file mode 100644 index 4e4fa0c05..000000000 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using ChainSafe.Gaming.Evm.Unity; -using UnityEngine; -using ILogger = WalletConnectSharp.Common.Logging.ILogger; - -namespace Web3Unity.Scripts.WalletConnect -{ - public class WCUnityLogger : ILogger - { - public void Log(string message) - { - Dispatcher.Instance()?.Enqueue(() => Debug.Log(message)); - } - - public void LogError(string message) - { - Dispatcher.Instance()?.Enqueue(() => Debug.LogError(message)); - } - - public void LogError(Exception e) - { - Dispatcher.Instance()?.Enqueue(() => Debug.LogError(e)); - } - } -} \ No newline at end of file diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs.meta b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs.meta deleted file mode 100644 index 11f9fc824..000000000 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/WalletConnect/WCUnityLogger.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f047c918909d28346b84df99549bea90 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj b/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj index 1c269c7d2..35099463f 100644 --- a/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj +++ b/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj @@ -13,6 +13,7 @@ + @@ -23,9 +24,5 @@ - - - - diff --git a/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs b/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs new file mode 100644 index 000000000..daab3756d --- /dev/null +++ b/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs @@ -0,0 +1,33 @@ +using System; +using ChainSafe.Gaming.Evm.Unity; +using ChainSafe.Gaming.Web3.Environment; +using UnityEngine; +using ILogger = WalletConnectSharp.Common.Logging.ILogger; + +namespace ChainSafe.Gaming.WalletConnect +{ + public class WCLogWriter : ILogger + { + private ILogWriter _logWriter; + + public WCLogWriter(ILogWriter logWriter) + { + _logWriter = logWriter; + } + + public void Log(string message) + { + Dispatcher.Instance()?.Enqueue(() => _logWriter.Log(message)); + } + + public void LogError(string message) + { + Dispatcher.Instance()?.Enqueue(() => _logWriter.LogError(message)); + } + + public void LogError(Exception e) + { + Dispatcher.Instance()?.Enqueue(() => _logWriter.LogError($"{e} {e.Message} {e.StackTrace}")); + } + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs index d675302cd..e764359dc 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using WalletConnectSharp.Common.Logging; using WalletConnectSharp.Core; namespace ChainSafe.Gaming.WalletConnect @@ -17,10 +16,6 @@ public struct WalletConnectConfig public Metadata Metadata { get; set; } - public ILogger Logger { get; set; } - - public bool IsMobilePlatform { get; set; } - public Dictionary SupportedWallets { get; set; } } } \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs index fb76fc05f..4fe337d92 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs @@ -12,6 +12,7 @@ using ChainSafe.Gaming.Web3.Core.Debug; using ChainSafe.Gaming.Web3.Core.Evm; using ChainSafe.Gaming.Web3.Environment; +using UnityEngine; using WalletConnectSharp.Common.Logging; using WalletConnectSharp.Common.Model.Errors; using WalletConnectSharp.Core; @@ -32,13 +33,15 @@ public class WalletConnectWallet : ISigner, ITransactionExecutor, ILifecyclePart private readonly WebPageWalletConfig configuration; private readonly IOperatingSystemMediator operatingSystem; private readonly IRpcProvider provider; + private readonly ILogWriter logWriter; - public WalletConnectWallet(IRpcProvider provider, WebPageWalletConfig configuration, IOperatingSystemMediator operatingSystem, IChainConfig chainConfig) + public WalletConnectWallet(IRpcProvider provider, WebPageWalletConfig configuration, IOperatingSystemMediator operatingSystem, IChainConfig chainConfig, ILogWriter logWriter) { this.provider = provider; this.operatingSystem = operatingSystem; this.chainConfig = chainConfig; this.configuration = configuration; + this.logWriter = logWriter; } public delegate string ConnectMessageBuildDelegate(DateTime expirationTime); @@ -110,10 +113,7 @@ public async Task Initialize(WalletConnectConfig config) return; } - if (Config.Logger != null) - { - WCLogger.Logger = Config.Logger; - } + WCLogger.Logger = new WCLogWriter(logWriter); Core = new WalletConnectCore(new CoreOptions() { @@ -171,7 +171,7 @@ public async Task ConnectClient() InvokeSessionApproved(sessionResult); - if (Config.IsMobilePlatform) + if (Application.isMobilePlatform) { // this doesn't work for all wallets, hence the try catch try diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index 9f16a408d..69502f8ed 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -21,8 +21,6 @@ using UnityEngine.SceneManagement; using UnityEngine.UI; using WalletConnectSharp.Core; -using Web3Unity.Scripts.WalletConnect; - namespace Scenes { @@ -284,9 +282,7 @@ private WalletConnectConfig BuildWalletConnectConfig() BaseContext = BaseContext, Chain = chain, Metadata = Metadata, - SupportedWallets = _supportedWallets, - IsMobilePlatform = Application.isMobilePlatform, - Logger = new WCUnityLogger() + SupportedWallets = _supportedWallets }; } From d76b1435e623a3ee35db0c3842c97ca2dd8d6994 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 3 Oct 2023 10:22:48 +0000 Subject: [PATCH 033/167] Auto-duplicate Package Samples --- .../Samples~/Web3.Unity/Scripts/Scenes/Login.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs index 9f16a408d..69502f8ed 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs @@ -21,8 +21,6 @@ using UnityEngine.SceneManagement; using UnityEngine.UI; using WalletConnectSharp.Core; -using Web3Unity.Scripts.WalletConnect; - namespace Scenes { @@ -284,9 +282,7 @@ private WalletConnectConfig BuildWalletConnectConfig() BaseContext = BaseContext, Chain = chain, Metadata = Metadata, - SupportedWallets = _supportedWallets, - IsMobilePlatform = Application.isMobilePlatform, - Logger = new WCUnityLogger() + SupportedWallets = _supportedWallets }; } From 2c33f69c814b263f9d1ef453456e4a30560a321a Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 3 Oct 2023 13:32:25 +0300 Subject: [PATCH 034/167] requested changes, method order --- .../Scripts/Utilities/WalletConnectModal.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs index 12aea5580..dcc9f88fd 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs @@ -25,6 +25,13 @@ private void Start() WalletConnectWallet.OnSessionApproved += SessionApproved; } + private void OnDisable() + { + WalletConnectWallet.OnConnected -= WalletConnected; + + WalletConnectWallet.OnSessionApproved -= SessionApproved; + } + private void WalletConnected(ConnectedData data) { Dispatcher.Instance().Enqueue(delegate @@ -81,11 +88,4 @@ private void Disable() { _container.gameObject.SetActive(false); } - - private void OnDisable() - { - WalletConnectWallet.OnConnected -= WalletConnected; - - WalletConnectWallet.OnSessionApproved -= SessionApproved; - } } \ No newline at end of file From 50ab43006303f5e1d634ae7d51122d4de93572ce Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 3 Oct 2023 10:32:54 +0000 Subject: [PATCH 035/167] Auto-duplicate Package Samples --- .../Scripts/Utilities/WalletConnectModal.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs index 12aea5580..dcc9f88fd 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs @@ -25,6 +25,13 @@ private void Start() WalletConnectWallet.OnSessionApproved += SessionApproved; } + private void OnDisable() + { + WalletConnectWallet.OnConnected -= WalletConnected; + + WalletConnectWallet.OnSessionApproved -= SessionApproved; + } + private void WalletConnected(ConnectedData data) { Dispatcher.Instance().Enqueue(delegate @@ -81,11 +88,4 @@ private void Disable() { _container.gameObject.SetActive(false); } - - private void OnDisable() - { - WalletConnectWallet.OnConnected -= WalletConnected; - - WalletConnectWallet.OnSessionApproved -= SessionApproved; - } } \ No newline at end of file From afb06046f4ffb3ce14edc547431b160c1a256904 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 3 Oct 2023 13:38:39 +0300 Subject: [PATCH 036/167] lint fix --- src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs b/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs index daab3756d..4db1a115e 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs @@ -8,26 +8,26 @@ namespace ChainSafe.Gaming.WalletConnect { public class WCLogWriter : ILogger { - private ILogWriter _logWriter; + private readonly ILogWriter logWriter; public WCLogWriter(ILogWriter logWriter) { - _logWriter = logWriter; + this.logWriter = logWriter; } public void Log(string message) { - Dispatcher.Instance()?.Enqueue(() => _logWriter.Log(message)); + Dispatcher.Instance()?.Enqueue(() => logWriter.Log(message)); } public void LogError(string message) { - Dispatcher.Instance()?.Enqueue(() => _logWriter.LogError(message)); + Dispatcher.Instance()?.Enqueue(() => logWriter.LogError(message)); } public void LogError(Exception e) { - Dispatcher.Instance()?.Enqueue(() => _logWriter.LogError($"{e} {e.Message} {e.StackTrace}")); + Dispatcher.Instance()?.Enqueue(() => logWriter.LogError($"{e} {e.Message} {e.StackTrace}")); } } } \ No newline at end of file From 5367435c311b174c0ef327c0b160561faec7fabd Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 3 Oct 2023 15:27:46 +0300 Subject: [PATCH 037/167] updated Logout based on requested changes --- .../Scripts/Prefabs/Logout.cs | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs index cae89f22d..449399cb4 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs @@ -1,3 +1,4 @@ +using System.Threading.Tasks; using ChainSafe.Gaming.UnityPackage; using ChainSafe.Gaming.Wallets; using Scenes; @@ -6,25 +7,32 @@ public class Logout : MonoBehaviour { + private bool _quitting; + public async void OnLogout() { // Remove the saved "remember me" data, if any PlayerPrefs.DeleteKey(Login.PlayerAccountKey); + await TerminateAndClearWeb3(); + + // Go back to the first scene to log in again + SceneManager.LoadScene(0); + } + + private async Task TerminateAndClearWeb3() + { // Terminate Web3 await Web3Accessor.Web3.TerminateAsync(); // Clear the Web3 instance Web3Accessor.Clear(); - - // Go back to the first scene to log in again - SceneManager.LoadScene(0); } - + private void OnApplicationQuit() { Debug.Log("Disconnecting wallet..."); - - OnLogout(); + + Task.Run(TerminateAndClearWeb3); } } From fe7757b62da2710f1175a7d6303186f0e8a3413e Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 3 Oct 2023 12:28:28 +0000 Subject: [PATCH 038/167] Auto-duplicate Package Samples --- .../Web3.Unity/Scripts/Prefabs/Logout.cs | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs index cae89f22d..449399cb4 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs @@ -1,3 +1,4 @@ +using System.Threading.Tasks; using ChainSafe.Gaming.UnityPackage; using ChainSafe.Gaming.Wallets; using Scenes; @@ -6,25 +7,32 @@ public class Logout : MonoBehaviour { + private bool _quitting; + public async void OnLogout() { // Remove the saved "remember me" data, if any PlayerPrefs.DeleteKey(Login.PlayerAccountKey); + await TerminateAndClearWeb3(); + + // Go back to the first scene to log in again + SceneManager.LoadScene(0); + } + + private async Task TerminateAndClearWeb3() + { // Terminate Web3 await Web3Accessor.Web3.TerminateAsync(); // Clear the Web3 instance Web3Accessor.Clear(); - - // Go back to the first scene to log in again - SceneManager.LoadScene(0); } - + private void OnApplicationQuit() { Debug.Log("Disconnecting wallet..."); - - OnLogout(); + + Task.Run(TerminateAndClearWeb3); } } From e43feede3315f77a6c8506948582d965810204f3 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 3 Oct 2023 17:04:25 +0300 Subject: [PATCH 039/167] android build fix --- src/ChainSafe.Gaming.Unity/link.xml | 46 ++++++++++++++--------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/ChainSafe.Gaming.Unity/link.xml b/src/ChainSafe.Gaming.Unity/link.xml index 91129f0f6..54c67d26a 100644 --- a/src/ChainSafe.Gaming.Unity/link.xml +++ b/src/ChainSafe.Gaming.Unity/link.xml @@ -24,29 +24,29 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + From 948f92fda0a991a114fe1291d653545779e5eccb Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 5 Oct 2023 11:32:07 +0300 Subject: [PATCH 040/167] Android Wallet Linking Implemented --- .../Runtime/Scripts/Web3Accessor.cs | 11 ++++ .../dto/IErc2771StructTypes.cs | 2 +- .../WCLogWriter.cs | 15 +---- .../WalletConnectConfig.cs | 4 +- .../WalletConnectWallet.cs | 65 ++++++++++++++----- .../WalletConnectWalletModel.cs | 2 +- .../Scenes/SampleLogin.unity | 44 ------------- .../Scripts/Prefabs/Logout.cs | 16 +---- .../Scripts/Utilities/WalletConnectModal.cs | 37 ++++++----- 9 files changed, 92 insertions(+), 104 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs index 9de9813a7..5c2918b26 100644 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs @@ -52,5 +52,16 @@ public static void Set(Web3.Web3 web3) } public static void Clear() => Instance.web3 = null; + + private async void OnApplicationQuit() + { + Debug.Log("Disposing Web3..."); + + // Terminate Web3 + await web3.TerminateAsync(); + + // Clear the Web3 instance + web3 = null; + } } } diff --git a/src/ChainSafe.Gaming.Gelato/dto/IErc2771StructTypes.cs b/src/ChainSafe.Gaming.Gelato/dto/IErc2771StructTypes.cs index a8703e49c..efd09342b 100644 --- a/src/ChainSafe.Gaming.Gelato/dto/IErc2771StructTypes.cs +++ b/src/ChainSafe.Gaming.Gelato/dto/IErc2771StructTypes.cs @@ -6,7 +6,7 @@ namespace ChainSafe.GamingSdk.Gelato.Dto { public interface IErc2771StructTypes { - [Parameter("unit25t6", "chainId", 1)] + [Parameter("uint256", "chainId", 1)] [JsonProperty(PropertyName = "chainId")] public BigInteger? ChainId { get; set; } diff --git a/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs b/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs index 4db1a115e..3618c0d56 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs @@ -15,19 +15,10 @@ public WCLogWriter(ILogWriter logWriter) this.logWriter = logWriter; } - public void Log(string message) - { - Dispatcher.Instance()?.Enqueue(() => logWriter.Log(message)); - } + public void Log(string message) => logWriter.Log(message); - public void LogError(string message) - { - Dispatcher.Instance()?.Enqueue(() => logWriter.LogError(message)); - } + public void LogError(string message) => logWriter.LogError(message); - public void LogError(Exception e) - { - Dispatcher.Instance()?.Enqueue(() => logWriter.LogError($"{e} {e.Message} {e.StackTrace}")); - } + public void LogError(Exception e) => logWriter.LogError($"{e} {e.Message} {e.StackTrace}"); } } \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs index e764359dc..67aa79f3d 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs @@ -4,7 +4,7 @@ namespace ChainSafe.Gaming.WalletConnect { - public struct WalletConnectConfig + public class WalletConnectConfig { public string ProjectId { get; set; } @@ -16,6 +16,8 @@ public struct WalletConnectConfig public Metadata Metadata { get; set; } + public WalletConnectWalletModel DefaultWallet { get; set; } + public Dictionary SupportedWallets { get; set; } } } \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs index 4fe337d92..b258c5109 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs @@ -17,6 +17,7 @@ using WalletConnectSharp.Common.Model.Errors; using WalletConnectSharp.Core; using WalletConnectSharp.Core.Models; +using WalletConnectSharp.Core.Models.Relay; using WalletConnectSharp.Network.Models; using WalletConnectSharp.Sign; using WalletConnectSharp.Sign.Models; @@ -171,25 +172,32 @@ public async Task ConnectClient() InvokeSessionApproved(sessionResult); - if (Application.isMobilePlatform) + // get default wallet + if (Application.isMobilePlatform && Config.DefaultWallet == null) { - // this doesn't work for all wallets, hence the try catch - try + string nativeUrl = sessionResult.Peer.Metadata.Redirect.Native.Replace("//", string.Empty); + + int index = nativeUrl.IndexOf(':'); + + if (index != -1) { - string nativeUrl = sessionResult.Peer.Metadata.Redirect.Native.Replace("//", string.Empty); + nativeUrl = $"{nativeUrl.Substring(0, index)}:"; + } - string defaultWalletId = Config.SupportedWallets.FirstOrDefault(t => - t.Value.Mobile.NativeProtocol == nativeUrl || t.Value.Desktop.NativeProtocol == nativeUrl) - .Key; + Debug.Log($"Wallet Native Url {nativeUrl}"); - if (Config.SupportedWallets.TryGetValue(defaultWalletId, out WalletConnectWalletModel wallet)) - { - wallet.OpenDeeplink(connectData); - } + var defaultWallet = Config.SupportedWallets.Values.FirstOrDefault(w => + w.Mobile.NativeProtocol == nativeUrl || w.Desktop.NativeProtocol == nativeUrl); + + if (defaultWallet != null) + { + Config.DefaultWallet = defaultWallet; + + WCLogger.Log("Default Wallet Set"); } - catch (Exception e) + else { - WCLogger.Log($"Can't open deepLink for wallet {e}"); + WCLogger.Log("Default Wallet Not Found in Supported Wallets"); } } @@ -207,6 +215,33 @@ public Task GetAddress() return Task.FromResult(Address!); } + private Task Request(string topic, T data, string chainId = null, long? expiry = null) + { + string method = RpcMethodAttribute.MethodForType(); + + // if it's a registered method try and open wallet + if (Session.Namespaces.Any(n => n.Value.Methods.Contains(method))) + { + Core.Relayer.Events.ListenForOnce( + RelayerEvents.Publish, + (_, _) => + { + if (Config.DefaultWallet != null) + { + WCLogger.Log("Opening Default Wallet..."); + + Config.DefaultWallet.OpenWallet(); + } + else + { + WCLogger.Log("No Default Wallet to Open"); + } + }); + } + + return SignClient.Request(topic, data, chainId, expiry); + } + public async Task SignMessage(string message) { if (Testing) @@ -229,7 +264,7 @@ public async Task SignMessage(string message) var request = new EthSignMessage(message, address); string hash = - await SignClient.Request(session.Topic, request, chainId); + await Request(session.Topic, request, chainId); var isValid = ValidateResponse(hash); if (!isValid) @@ -269,7 +304,7 @@ public async Task SignTypedData(SerializableDomain domain, var request = new EthSignTypedData(address, domain, message); string hash = - await SignClient.Request, string>(session.Topic, request, chainId); + await Request, string>(session.Topic, request, chainId); var isValid = ValidateResponse(hash); if (!isValid) diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs index 5bc953b50..0f9efccfe 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs @@ -61,7 +61,7 @@ public void OpenWallet() { WalletLink linkData = Application.isMobilePlatform ? Mobile : Desktop; - var universalUrl = linkData.UniversalUrl; + string universalUrl = linkData.UniversalUrl; if (string.IsNullOrWhiteSpace(universalUrl)) { diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity index e0eca2a4c..1b07eda87 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity @@ -1395,50 +1395,6 @@ MonoBehaviour: _copyToClipboardButton: {fileID: 212403314} _backButton: {fileID: 1993078182} _container: {fileID: 1278821651} ---- !u!1 &407712547 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 407712549} - - component: {fileID: 407712548} - m_Layer: 0 - m_Name: MainThreadDispatcher - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &407712548 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 407712547} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -320598466, guid: 6ca4015b3a4624b13bfadd6f7956c0be, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &407712549 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 407712547} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &452118933 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs index 449399cb4..d5e3068ec 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs @@ -14,25 +14,13 @@ public async void OnLogout() // Remove the saved "remember me" data, if any PlayerPrefs.DeleteKey(Login.PlayerAccountKey); - await TerminateAndClearWeb3(); - - // Go back to the first scene to log in again - SceneManager.LoadScene(0); - } - - private async Task TerminateAndClearWeb3() - { // Terminate Web3 await Web3Accessor.Web3.TerminateAsync(); // Clear the Web3 instance Web3Accessor.Clear(); - } - - private void OnApplicationQuit() - { - Debug.Log("Disconnecting wallet..."); - Task.Run(TerminateAndClearWeb3); + // Go back to the first scene to log in again + SceneManager.LoadScene(0); } } diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs index dcc9f88fd..8849ebddc 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs @@ -1,10 +1,8 @@ -using ChainSafe.Gaming.Evm.Unity; using ChainSafe.Gaming.WalletConnect; using UnityEngine; using UnityEngine.UI; using WalletConnectSharp.Sign.Models; using WalletConnectSharp.Sign.Models.Engine; -using Web3Unity.Scripts; using ZXing; using ZXing.QrCode; @@ -34,25 +32,32 @@ private void OnDisable() private void WalletConnected(ConnectedData data) { - Dispatcher.Instance().Enqueue(delegate + if (Application.isMobilePlatform) { - // enable display - _container.gameObject.SetActive(true); - - string uri = data.Uri; - - GenerateQrCode(uri); - - SetClipboard(uri); - }); +#if UNITY_ANDROID + + // open wallet + Application.OpenURL(data.Uri); + +#elif UNITY_IOS + + //select wallet dropdown +#endif + } + + // enable display + _container.gameObject.SetActive(true); + + string uri = data.Uri; + + GenerateQrCode(uri); + + SetClipboard(uri); } private void SessionApproved(SessionStruct session) { - Dispatcher.Instance().Enqueue(delegate - { - Debug.Log($"{session.Topic} Approved"); - }); + Debug.Log($"{session.Topic} Approved"); } private void SetClipboard(string uri) From 2ce19a61324abaf883748565eca846028501845b Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 5 Oct 2023 08:32:31 +0000 Subject: [PATCH 041/167] Auto-duplicate Package Samples --- .../Web3.Unity/Scenes/SampleLogin.unity | 44 ------------------- .../Web3.Unity/Scripts/Prefabs/Logout.cs | 16 +------ .../Scripts/Utilities/WalletConnectModal.cs | 37 +++++++++------- 3 files changed, 23 insertions(+), 74 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity index e0eca2a4c..1b07eda87 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity @@ -1395,50 +1395,6 @@ MonoBehaviour: _copyToClipboardButton: {fileID: 212403314} _backButton: {fileID: 1993078182} _container: {fileID: 1278821651} ---- !u!1 &407712547 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 407712549} - - component: {fileID: 407712548} - m_Layer: 0 - m_Name: MainThreadDispatcher - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &407712548 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 407712547} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -320598466, guid: 6ca4015b3a4624b13bfadd6f7956c0be, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &407712549 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 407712547} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &452118933 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs index 449399cb4..d5e3068ec 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs @@ -14,25 +14,13 @@ public async void OnLogout() // Remove the saved "remember me" data, if any PlayerPrefs.DeleteKey(Login.PlayerAccountKey); - await TerminateAndClearWeb3(); - - // Go back to the first scene to log in again - SceneManager.LoadScene(0); - } - - private async Task TerminateAndClearWeb3() - { // Terminate Web3 await Web3Accessor.Web3.TerminateAsync(); // Clear the Web3 instance Web3Accessor.Clear(); - } - - private void OnApplicationQuit() - { - Debug.Log("Disconnecting wallet..."); - Task.Run(TerminateAndClearWeb3); + // Go back to the first scene to log in again + SceneManager.LoadScene(0); } } diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs index dcc9f88fd..8849ebddc 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs @@ -1,10 +1,8 @@ -using ChainSafe.Gaming.Evm.Unity; using ChainSafe.Gaming.WalletConnect; using UnityEngine; using UnityEngine.UI; using WalletConnectSharp.Sign.Models; using WalletConnectSharp.Sign.Models.Engine; -using Web3Unity.Scripts; using ZXing; using ZXing.QrCode; @@ -34,25 +32,32 @@ private void OnDisable() private void WalletConnected(ConnectedData data) { - Dispatcher.Instance().Enqueue(delegate + if (Application.isMobilePlatform) { - // enable display - _container.gameObject.SetActive(true); - - string uri = data.Uri; - - GenerateQrCode(uri); - - SetClipboard(uri); - }); +#if UNITY_ANDROID + + // open wallet + Application.OpenURL(data.Uri); + +#elif UNITY_IOS + + //select wallet dropdown +#endif + } + + // enable display + _container.gameObject.SetActive(true); + + string uri = data.Uri; + + GenerateQrCode(uri); + + SetClipboard(uri); } private void SessionApproved(SessionStruct session) { - Dispatcher.Instance().Enqueue(delegate - { - Debug.Log($"{session.Topic} Approved"); - }); + Debug.Log($"{session.Topic} Approved"); } private void SetClipboard(string uri) From ac18d863974dcc5c957d66821bed9a37d7c58d90 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 5 Oct 2023 14:54:36 +0300 Subject: [PATCH 042/167] WalletConnectWallet split into WalletConnectSigner, this is a prelude to separation between ISigner and ITransactionExecutor --- .../Tests/Runtime/MiscTests.cs | 26 +-- .../Tests/Runtime/SampleTestsBase.cs | 6 +- .../{Chain.cs => Models/ChainModel.cs} | 6 +- .../Models/ImageUrlsModel.cs | 16 ++ .../{ => Models}/WalletConnectWalletModel.cs | 14 +- .../Models/WalletLinkModel.cs | 13 ++ .../WalletConnectConfig.cs | 8 +- ...onnectWallet.cs => WalletConnectSigner.cs} | 220 +++++++++--------- ...ns.cs => WalletConnectSignerExtensions.cs} | 18 +- .../WalletLink.cs | 13 -- .../WebPageWalletConfig.cs | 22 -- .../Scripts/Scenes/Login.cs | 45 +++- .../Scripts/Utilities/WalletConnectModal.cs | 9 +- 13 files changed, 219 insertions(+), 197 deletions(-) rename src/ChainSafe.Gaming.WalletConnect/{Chain.cs => Models/ChainModel.cs} (73%) create mode 100644 src/ChainSafe.Gaming.WalletConnect/Models/ImageUrlsModel.cs rename src/ChainSafe.Gaming.WalletConnect/{ => Models}/WalletConnectWalletModel.cs (81%) create mode 100644 src/ChainSafe.Gaming.WalletConnect/Models/WalletLinkModel.cs rename src/ChainSafe.Gaming.WalletConnect/{WalletConnectWallet.cs => WalletConnectSigner.cs} (73%) rename src/ChainSafe.Gaming.WalletConnect/{WalletConnectWalletExtensions.cs => WalletConnectSignerExtensions.cs} (68%) delete mode 100644 src/ChainSafe.Gaming.WalletConnect/WalletLink.cs delete mode 100644 src/ChainSafe.Gaming.WalletConnect/WebPageWalletConfig.cs diff --git a/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs b/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs index 21396b252..e49dd450b 100644 --- a/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs +++ b/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs @@ -64,7 +64,7 @@ public override IEnumerator Setup() [UnityTest] public IEnumerator TestContractSend() { - WalletConnectWallet.TestResponse = "0x9de3bb69db4bd93babef923f5da1f53cdb287d9ebab9b4177ba2fb25e6a09225"; + WalletConnectSigner.TestResponse = "0x9de3bb69db4bd93babef923f5da1f53cdb287d9ebab9b4177ba2fb25e6a09225"; var sendContract = _sample.ContractSend(ContractSendMethodName, Abi, ContractAddress); @@ -127,7 +127,7 @@ public IEnumerator TestGetGasPrice() [UnityTest] public IEnumerator TestGetGasNonce() { - WalletConnectWallet.TestResponse = "0x527fcd7356738389d29a96342b5fba92ab1348b744409d5bf4ce0ca2fbc2f25e"; + WalletConnectSigner.TestResponse = "0x527fcd7356738389d29a96342b5fba92ab1348b744409d5bf4ce0ca2fbc2f25e"; var getGasNonce = _sample.GetNonce(); @@ -140,7 +140,7 @@ public IEnumerator TestGetGasNonce() [UnityTest] public IEnumerator TestTransactionStatus() { - WalletConnectWallet.TestResponse = "0x1e989dbcc43e078b19ea8ea201af195e74397b494b7acd4afcca67e65e5c3339"; + WalletConnectSigner.TestResponse = "0x1e989dbcc43e078b19ea8ea201af195e74397b494b7acd4afcca67e65e5c3339"; var getTransactionStatus = _sample.GetTransactionStatus(); @@ -153,7 +153,7 @@ public IEnumerator TestTransactionStatus() [UnityTest] public IEnumerator TestMint721() { - WalletConnectWallet.TestResponse = "0xa9f953f9845e7d49d778d6fed622d566daf09e8e1c793297c7cab54782e1aae9"; + WalletConnectSigner.TestResponse = "0xa9f953f9845e7d49d778d6fed622d566daf09e8e1c793297c7cab54782e1aae9"; var mint721 = _sample.Mint721(Mint721Abi, Mint721Address, MintUri); @@ -179,7 +179,7 @@ public IEnumerator TestUseRegisteredContract() [UnityTest] public IEnumerator TestSendArray() { - WalletConnectWallet.TestResponse = "0x6a33280f3b2b907da613b18b09f863cd835f1977a4131001ace5602899fc98c7"; + WalletConnectSigner.TestResponse = "0x6a33280f3b2b907da613b18b09f863cd835f1977a4131001ace5602899fc98c7"; var sendArray = _sample.SendArray(SendArrayMethodName, SendArrayAbi, SendArrayAddress, ArrayToSend.ToArray()); @@ -193,7 +193,7 @@ public IEnumerator TestSendArray() [UnityTest] public IEnumerator TestSendTransaction() { - WalletConnectWallet.TestResponse = "0xa60bef1df91bedcd2f3f79e6609716ef245fd1202d66c6e35694b43529bf2e71"; + WalletConnectSigner.TestResponse = "0xa60bef1df91bedcd2f3f79e6609716ef245fd1202d66c6e35694b43529bf2e71"; var sendTransaction = _sample.SendTransaction(SendToAddress); @@ -201,7 +201,7 @@ public IEnumerator TestSendTransaction() Assert.IsTrue(sendTransaction.IsCompletedSuccessfully); - Assert.AreEqual(sendTransaction.Result, WalletConnectWallet.TestResponse); + Assert.AreEqual(sendTransaction.Result, WalletConnectSigner.TestResponse); } [UnityTest] @@ -217,7 +217,7 @@ public IEnumerator TestSha3() [UnityTest] public IEnumerator TestSignMessage() { - WalletConnectWallet.TestResponse = + WalletConnectSigner.TestResponse = "0x87dfaa646f476ca53ba8b6e8d122839571e52866be0984ec0497617ad3e988b7401c6b816858df27625166cb98a688f99ba92fa593da3c86c78b19c78c1f51cc1c"; var signMessage = _sample.SignMessage("The right man in the wrong place can make all the difference in the world."); @@ -226,13 +226,13 @@ public IEnumerator TestSignMessage() Assert.IsTrue(signMessage.IsCompletedSuccessfully); - Assert.AreEqual(signMessage.Result, WalletConnectWallet.TestResponse); + Assert.AreEqual(signMessage.Result, WalletConnectSigner.TestResponse); } [UnityTest] public IEnumerator TestSignVerify() { - WalletConnectWallet.TestResponse = + WalletConnectSigner.TestResponse = "0x5c996d43c2e804a0d0de7f8b07cc660bbae638aa7ea137df6156621abe5e1fbb1727ebb06f7e0067537cb0f942825fa15ead9dea6d74e4d17fa6e69007cb59561c"; var signVerify = _sample.SignVerify("A man chooses, a slave obeys."); @@ -247,7 +247,7 @@ public IEnumerator TestSignVerify() [UnityTest] public IEnumerator TestTransferErc20() { - WalletConnectWallet.TestResponse = "0xba90b6fb8cbee5fd0ad423cc74bb4a365bb88b260601933aac86b947945c5465"; + WalletConnectSigner.TestResponse = "0xba90b6fb8cbee5fd0ad423cc74bb4a365bb88b260601933aac86b947945c5465"; var transferErc20 = _sample.TransferErc20(TransferErc20ContractAddress, SendToAddress, "1000000000000000"); @@ -261,7 +261,7 @@ public IEnumerator TestTransferErc20() [UnityTest] public IEnumerator TestTransferErc721() { - WalletConnectWallet.TestResponse = "0x0e292ae8c5ab005d87581f32fd791e1b18b0cfa944d6877b41edbdb740ee8586"; + WalletConnectSigner.TestResponse = "0x0e292ae8c5ab005d87581f32fd791e1b18b0cfa944d6877b41edbdb740ee8586"; var transferErc721 = _sample.TransferErc721(TransferErc721ContractAddress, SendToAddress, 0); @@ -275,7 +275,7 @@ public IEnumerator TestTransferErc721() [UnityTest] public IEnumerator TestTransferErc1155() { - WalletConnectWallet.TestResponse = "0xb018a043ac0affe05159a53daa8656dbbad61c839eaf89622d7813226f222876"; + WalletConnectSigner.TestResponse = "0xb018a043ac0affe05159a53daa8656dbbad61c839eaf89622d7813226f222876"; var transferErc1155 = _sample.TransferErc1155(TransferErc1155ContractAddress, 101, 1, SendToAddress); diff --git a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs index 760b30429..d387f5356 100644 --- a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs +++ b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs @@ -21,7 +21,7 @@ public virtual IEnumerator Setup() yield return new WaitForSeconds(5f); // set wallet to testing - WalletConnectWallet.Testing = true; + WalletConnectSigner.Testing = true; // For whatever reason, in github this won't load var projectConfigScriptableObject = ProjectConfigUtilities.Load(); @@ -37,7 +37,7 @@ public virtual IEnumerator Setup() services.UseGelato("_UzPz_Yk_WTjWMfcl45fLvQNGQ9ISx5ZE8TnwnVKYrE_"); services.UseRpcProvider(); - services.UseWalletConnectWallet(new WebPageWalletConfig { SavedUserAddress = "0x55ffe9E30347266f02b9BdAe20aD3a86493289ea" }); + services.UseWalletConnectSigner(new WalletConnectConfig { SavedUserAddress = "0x55ffe9E30347266f02b9BdAe20aD3a86493289ea" }); //add any contracts we would want to use services.ConfigureRegisteredContracts(contracts => @@ -58,7 +58,7 @@ public virtual IEnumerator Setup() [UnityTearDown] public virtual IEnumerator TearDown() { - WalletConnectWallet.Testing = false; + WalletConnectSigner.Testing = false; yield return null; } diff --git a/src/ChainSafe.Gaming.WalletConnect/Chain.cs b/src/ChainSafe.Gaming.WalletConnect/Models/ChainModel.cs similarity index 73% rename from src/ChainSafe.Gaming.WalletConnect/Chain.cs rename to src/ChainSafe.Gaming.WalletConnect/Models/ChainModel.cs index 9ccd9c53d..aac93bbd1 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Chain.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Models/ChainModel.cs @@ -1,10 +1,10 @@ -namespace ChainSafe.Gaming.WalletConnect +namespace ChainSafe.Gaming.WalletConnect.Models { - public class Chain + public class ChainModel { public const string EvmNamespace = "eip155"; - public Chain(string chainNamespace, string chainId, string name) + public ChainModel(string chainNamespace, string chainId, string name) { ChainNamespace = chainNamespace; diff --git a/src/ChainSafe.Gaming.WalletConnect/Models/ImageUrlsModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/ImageUrlsModel.cs new file mode 100644 index 000000000..d57b2200e --- /dev/null +++ b/src/ChainSafe.Gaming.WalletConnect/Models/ImageUrlsModel.cs @@ -0,0 +1,16 @@ +using Newtonsoft.Json; + +namespace ChainSafe.Gaming.WalletConnect.Models +{ + public class ImageUrlsModel + { + [JsonProperty("sm")] + public string SmallUrl { get; private set; } + + [JsonProperty("md")] + public string MediumUrl { get; private set; } + + [JsonProperty("lg")] + public string LargeUrl { get; private set; } + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs similarity index 81% rename from src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs rename to src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs index 0f9efccfe..22cbbfe25 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletModel.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs @@ -4,15 +4,21 @@ using WalletConnectSharp.Common.Logging; using WalletConnectSharp.Sign.Models.Engine; -namespace ChainSafe.Gaming.WalletConnect +namespace ChainSafe.Gaming.WalletConnect.Models { public class WalletConnectWalletModel { + [JsonProperty("name")] + public string Name { get; private set; } + [JsonProperty("mobile")] - public WalletLink Mobile { get; private set; } + public WalletLinkModel Mobile { get; private set; } [JsonProperty("desktop")] - public WalletLink Desktop { get; private set; } + public WalletLinkModel Desktop { get; private set; } + + [JsonProperty("image_url")] + public ImageUrlsModel Images { get; private set; } public void OpenDeeplink(ConnectedData data, bool useNative = false) { @@ -59,7 +65,7 @@ public void OpenDeeplink(ConnectedData data, bool useNative = false) public void OpenWallet() { - WalletLink linkData = Application.isMobilePlatform ? Mobile : Desktop; + WalletLinkModel linkData = Application.isMobilePlatform ? Mobile : Desktop; string universalUrl = linkData.UniversalUrl; diff --git a/src/ChainSafe.Gaming.WalletConnect/Models/WalletLinkModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/WalletLinkModel.cs new file mode 100644 index 000000000..0a0b69536 --- /dev/null +++ b/src/ChainSafe.Gaming.WalletConnect/Models/WalletLinkModel.cs @@ -0,0 +1,13 @@ +using Newtonsoft.Json; + +namespace ChainSafe.Gaming.WalletConnect.Models +{ + public struct WalletLinkModel + { + [JsonProperty("native")] + public string NativeProtocol { get; private set; } + + [JsonProperty("universal")] + public string UniversalUrl { get; private set; } + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs index 67aa79f3d..7e43d2b27 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs @@ -1,18 +1,24 @@ using System; using System.Collections.Generic; +using ChainSafe.Gaming.WalletConnect.Models; using WalletConnectSharp.Core; namespace ChainSafe.Gaming.WalletConnect { + [Serializable] public class WalletConnectConfig { + public string SavedUserAddress { get; set; } = null; + + public TimeSpan ConnectRequestExpiresAfter { get; set; } = TimeSpan.FromMinutes(1); + public string ProjectId { get; set; } public string ProjectName { get; set; } public string BaseContext { get; set; } - public Chain Chain { get; set; } + public ChainModel Chain { get; set; } public Metadata Metadata { get; set; } diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs similarity index 73% rename from src/ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs rename to src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs index b258c5109..387892fc9 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectWallet.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs @@ -5,8 +5,8 @@ using ChainSafe.Gaming.Evm.Providers; using ChainSafe.Gaming.Evm.Signers; using ChainSafe.Gaming.Evm.Transactions; -using ChainSafe.Gaming.WalletConnect; using ChainSafe.Gaming.WalletConnect.Methods; +using ChainSafe.Gaming.WalletConnect.Models; using ChainSafe.Gaming.Web3; using ChainSafe.Gaming.Web3.Core; using ChainSafe.Gaming.Web3.Core.Debug; @@ -26,17 +26,19 @@ namespace ChainSafe.Gaming.WalletConnect { - public class WalletConnectWallet : ISigner, ITransactionExecutor, ILifecycleParticipant + public class WalletConnectSigner : ISigner, ILifecycleParticipant + + // , ITransactionExecutor { private static readonly TimeSpan MinClipboardCheckPeriod = TimeSpan.FromMilliseconds(10); private readonly IChainConfig chainConfig; - private readonly WebPageWalletConfig configuration; + private readonly WalletConnectConfig configuration; private readonly IOperatingSystemMediator operatingSystem; private readonly IRpcProvider provider; private readonly ILogWriter logWriter; - public WalletConnectWallet(IRpcProvider provider, WebPageWalletConfig configuration, IOperatingSystemMediator operatingSystem, IChainConfig chainConfig, ILogWriter logWriter) + public WalletConnectSigner(IRpcProvider provider, WalletConnectConfig configuration, IOperatingSystemMediator operatingSystem, IChainConfig chainConfig, ILogWriter logWriter) { this.provider = provider; this.operatingSystem = operatingSystem; @@ -68,6 +70,8 @@ public WalletConnectWallet(IRpcProvider provider, WebPageWalletConfig configurat public WalletConnectConfig Config { get; private set; } + public ConnectedData ConnectedData { get; private set; } + public string Address { get; private set; } private static void InvokeConnected(ConnectedData connectedData) @@ -93,7 +97,7 @@ public async ValueTask WillStartAsync() } // Wallet Connect - await Initialize(configuration.WalletConnectConfig); + await Initialize(configuration); Address = configuration.SavedUserAddress ?? await GetAccountVerifyUserOwns(); } @@ -149,7 +153,7 @@ public async Task ConnectClient() var events = new string[] { "chainChanged", "accountsChanged" }; requiredNamespaces.Add( - Chain.EvmNamespace, + ChainModel.EvmNamespace, new ProposedNamespace { Chains = new string[] @@ -321,69 +325,68 @@ bool ValidateResponse(string response) return hash; } - public async Task SendTransaction(TransactionRequest transaction) - { - var pageUrl = BuildUrl(); - var hash = await OpenPageWaitResponse(pageUrl, ValidateResponse); - - // TODO: log event on success (see example near end of file) - return await provider.GetTransaction(hash); - - string BuildUrl() - { - var sb = new StringBuilder() - .Append(configuration.ServiceUrl) - .Append("?action=send"); - - if (transaction.ChainId != null) - { - sb.Append("&chainId=").Append(transaction.ChainId); - } - else - { - sb.Append("&chainId=").Append(chainConfig.ChainId); - } - - if (transaction.Value != null) - { - sb.Append("&value=").Append(transaction.Value); - } - else - { - sb.Append("&value=").Append(0); - } - - AppendStringIfNotNullOrEmtpy("to", transaction.To); - AppendStringIfNotNullOrEmtpy("data", transaction.Data); - AppendIfNotNull("gasLimit", transaction.GasLimit); - AppendIfNotNull("gasPrice", transaction.GasPrice); - - return sb.ToString(); - - void AppendIfNotNull(string name, object value) - { - if (value != null) - { - sb!.Append('&').Append(name).Append('=').Append(value); - } - } - - void AppendStringIfNotNullOrEmtpy(string name, string value) - { - if (!string.IsNullOrEmpty(value)) - { - sb!.Append('&').Append(name).Append('=').Append(value); - } - } - } - - // TODO: validate with regex - bool ValidateResponse(string response) - { - return response.StartsWith("0x") && response.Length == 66; - } - } - + // public async Task SendTransaction(TransactionRequest transaction) + // { + // var pageUrl = BuildUrl(); + // var hash = await OpenPageWaitResponse(pageUrl, ValidateResponse); + // + // // TODO: log event on success (see example near end of file) + // return await provider.GetTransaction(hash); + // + // string BuildUrl() + // { + // var sb = new StringBuilder() + // .Append(configuration.ServiceUrl) + // .Append("?action=send"); + // + // if (transaction.ChainId != null) + // { + // sb.Append("&chainId=").Append(transaction.ChainId); + // } + // else + // { + // sb.Append("&chainId=").Append(chainConfig.ChainId); + // } + // + // if (transaction.Value != null) + // { + // sb.Append("&value=").Append(transaction.Value); + // } + // else + // { + // sb.Append("&value=").Append(0); + // } + // + // AppendStringIfNotNullOrEmtpy("to", transaction.To); + // AppendStringIfNotNullOrEmtpy("data", transaction.Data); + // AppendIfNotNull("gasLimit", transaction.GasLimit); + // AppendIfNotNull("gasPrice", transaction.GasPrice); + // + // return sb.ToString(); + // + // void AppendIfNotNull(string name, object value) + // { + // if (value != null) + // { + // sb!.Append('&').Append(name).Append('=').Append(value); + // } + // } + // + // void AppendStringIfNotNullOrEmtpy(string name, string value) + // { + // if (!string.IsNullOrEmpty(value)) + // { + // sb!.Append('&').Append(name).Append('=').Append(value); + // } + // } + // } + // + // // TODO: validate with regex + // bool ValidateResponse(string response) + // { + // return response.StartsWith("0x") && response.Length == 66; + // } + // } private (string, string) GetCurrentAddress() { var currentSession = Session; @@ -412,47 +415,45 @@ bool ValidateResponse(string response) } // TODO: extract hash from deeplink instead of clipboard - private async Task OpenPageWaitResponse(string pageUrl, Func validator) - { - string response; - - if (Testing) - { - response = TestResponse; - } - else - { - operatingSystem.OpenUrl(pageUrl); - operatingSystem.ClipboardContent = string.Empty; - - var updateDelay = GetUpdatePeriodSafe(); - while (string.IsNullOrEmpty(operatingSystem.ClipboardContent)) - { - await Task.Delay(updateDelay); - } - - response = operatingSystem.ClipboardContent!; - } - - var validResponse = validator(response); - if (!validResponse) - { - throw new Web3Exception("Incorrect response format extracted from clipboard."); - } - - int GetUpdatePeriodSafe() - { - return (int)Math.Max(MinClipboardCheckPeriod.TotalMilliseconds, configuration.ClipboardCheckPeriod.TotalMilliseconds); - } - - return response; - } - + // private async Task OpenPageWaitResponse(string pageUrl, Func validator) + // { + // string response; + // + // if (Testing) + // { + // response = TestResponse; + // } + // else + // { + // operatingSystem.OpenUrl(pageUrl); + // operatingSystem.ClipboardContent = string.Empty; + // + // var updateDelay = GetUpdatePeriodSafe(); + // while (string.IsNullOrEmpty(operatingSystem.ClipboardContent)) + // { + // await Task.Delay(updateDelay); + // } + // + // response = operatingSystem.ClipboardContent!; + // } + // + // var validResponse = validator(response); + // if (!validResponse) + // { + // throw new Web3Exception("Incorrect response format extracted from clipboard."); + // } + // + // int GetUpdatePeriodSafe() + // { + // return (int)Math.Max(MinClipboardCheckPeriod.TotalMilliseconds, configuration.ClipboardCheckPeriod.TotalMilliseconds); + // } + // + // return response; + // } private async Task GetAccountVerifyUserOwns() { // sign current time - var expirationTime = DateTime.Now + configuration.ConnectRequestExpiresAfter; - await ConnectClient(); + ConnectedData = await ConnectClient(); var (address, _) = GetCurrentAddress(); @@ -462,11 +463,6 @@ private async Task GetAccountVerifyUserOwns() $"Public address recovered from signature is not valid. Public address: {address}"); } - if (DateTime.Now > expirationTime) - { - throw new Web3Exception("Signature has already expired. Try again."); - } - return address; } diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletExtensions.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSignerExtensions.cs similarity index 68% rename from src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletExtensions.cs rename to src/ChainSafe.Gaming.WalletConnect/WalletConnectSignerExtensions.cs index 0dd870c25..e4923c2cd 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectWalletExtensions.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSignerExtensions.cs @@ -7,18 +7,18 @@ namespace ChainSafe.Gaming.WalletConnect { - public static class WalletConnectWalletExtensions + public static class WalletConnectSignerExtensions { - private static readonly WebPageWalletConfig DefaultConfig = new(); + private static readonly WalletConnectConfig DefaultConfig = new(); /// /// Binds Web implementation of EVM Provider to Web3. /// /// The same service collection that was passed in. This enables fluent style. - public static IWeb3ServiceCollection UseWalletConnectWallet(this IWeb3ServiceCollection collection, WebPageWalletConfig configuration) + public static IWeb3ServiceCollection UseWalletConnectSigner(this IWeb3ServiceCollection collection, WalletConnectConfig configuration) { - collection.UseWalletConnectWallet(); - collection.ConfigureWalletConnectWallet(configuration); + collection.UseWalletConnectSigner(); + collection.ConfigureWalletConnectSigner(configuration); return collection; } @@ -26,7 +26,7 @@ public static IWeb3ServiceCollection UseWalletConnectWallet(this IWeb3ServiceCol /// Binds Web implementation of EVM Provider to Web3. /// /// The same service collection that was passed in. This enables fluent style. - public static IWeb3ServiceCollection UseWalletConnectWallet(this IWeb3ServiceCollection collection) + public static IWeb3ServiceCollection UseWalletConnectSigner(this IWeb3ServiceCollection collection) { collection.AssertServiceNotBound(); collection.AssertServiceNotBound(); @@ -35,7 +35,7 @@ public static IWeb3ServiceCollection UseWalletConnectWallet(this IWeb3ServiceCol collection.TryAddSingleton(DefaultConfig); // wallet - collection.AddSingleton(); + collection.AddSingleton(); return collection; } @@ -44,9 +44,9 @@ public static IWeb3ServiceCollection UseWalletConnectWallet(this IWeb3ServiceCol /// Configures Web implementation of EVM Provider. /// /// The same service collection that was passed in. This enables fluent style. - public static IWeb3ServiceCollection ConfigureWalletConnectWallet(this IWeb3ServiceCollection collection, WebPageWalletConfig configuration) + public static IWeb3ServiceCollection ConfigureWalletConnectSigner(this IWeb3ServiceCollection collection, WalletConnectConfig configuration) { - collection.Replace(ServiceDescriptor.Singleton(typeof(WebPageWalletConfig), configuration)); + collection.Replace(ServiceDescriptor.Singleton(typeof(WalletConnectConfig), configuration)); return collection; } } diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletLink.cs b/src/ChainSafe.Gaming.WalletConnect/WalletLink.cs deleted file mode 100644 index f19d72967..000000000 --- a/src/ChainSafe.Gaming.WalletConnect/WalletLink.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Newtonsoft.Json; - -namespace ChainSafe.Gaming.WalletConnect -{ - public struct WalletLink - { - [JsonProperty("native")] - public string NativeProtocol; - - [JsonProperty("universal")] - public string UniversalUrl; - } -} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WebPageWalletConfig.cs b/src/ChainSafe.Gaming.WalletConnect/WebPageWalletConfig.cs deleted file mode 100644 index 478534fcd..000000000 --- a/src/ChainSafe.Gaming.WalletConnect/WebPageWalletConfig.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using ChainSafe.Gaming.WalletConnect; - -namespace ChainSafe.Gaming.WalletConnect -{ - [Serializable] - public class WebPageWalletConfig - { - public string SavedUserAddress { get; set; } = null; - - public string ServiceUrl { get; set; } = "https://chainsafe.github.io/game-web3wallet/"; - - public TimeSpan ClipboardCheckPeriod { get; set; } = TimeSpan.FromMilliseconds(100); - - public TimeSpan ConnectRequestExpiresAfter { get; set; } = TimeSpan.FromMinutes(1); - - public WalletConnectWallet.ConnectMessageBuildDelegate ConnectMessageBuilder { get; set; } = - time => $"Sign this message to connect your account. This request will expire at {time:hh:mm:ss}."; - - public WalletConnectConfig WalletConnectConfig { get; set; } - } -} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index 69502f8ed..42704fe2a 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -8,6 +8,7 @@ using ChainSafe.Gaming.UnityPackage; using ChainSafe.Gaming.Wallets; using ChainSafe.Gaming.WalletConnect; +using ChainSafe.Gaming.WalletConnect.Models; using ChainSafe.Gaming.Web3; using ChainSafe.Gaming.Web3.Build; using ChainSafe.Gaming.Web3.Unity; @@ -52,6 +53,7 @@ public class Login : MonoBehaviour public Toggle RememberMeToggle; public ErrorPopup ErrorPopup; public List Web3AuthButtons; + public TMP_Dropdown _supportedWalletsDropdown; private bool useWebPageWallet; @@ -90,6 +92,10 @@ private IEnumerator Start() // Wallet Connect yield return FetchSupportedWallets(); + +#if UNITY_IOS + InitializeWalletSelection(); +#endif #if UNITY_WEBGL ProcessWeb3Auth(); @@ -106,6 +112,19 @@ private IEnumerator Start() } } + private void InitializeWalletSelection() + { + // first element is a no select + List supportedWalletsList = new List + { + "None", + }; + + supportedWalletsList.AddRange(_supportedWallets.Values.Select(w => w.Name)); + + _supportedWalletsDropdown.AddOptions(supportedWalletsList); + } + private async void TryAutoLogin() { if (!useWebPageWallet) @@ -120,12 +139,7 @@ private async void TryAutoLogin() .Configure(ConfigureCommonServices) .Configure(services => { - services.UseWalletConnectWallet( - new WebPageWalletConfig - { - SavedUserAddress = savedAccount, - WalletConnectConfig = BuildWalletConnectConfig() - }); + services.UseWalletConnectSigner(BuildWalletConnectConfig()); }); await ProcessLogin(web3Builder); @@ -133,6 +147,17 @@ private async void TryAutoLogin() private async void LoginWithExistingAccount() { + if (_supportedWalletsDropdown.value == 0) + { + // feedback + Debug.LogError("Please select a Wallet first"); + + return; + } +#if UNITY_IOS + +#endif + var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) .Configure(ConfigureCommonServices) .Configure(services => @@ -144,11 +169,7 @@ private async void LoginWithExistingAccount() */ if (useWebPageWallet) { - services.UseWalletConnectWallet( - new WebPageWalletConfig - { - WalletConnectConfig = BuildWalletConnectConfig() - }); + services.UseWalletConnectSigner(BuildWalletConnectConfig()); } else { @@ -273,7 +294,7 @@ private WalletConnectConfig BuildWalletConnectConfig() // build chain var projectConfig = ProjectConfigUtilities.Load(); - Chain chain = new Chain(Chain.EvmNamespace, projectConfig.ChainId, projectConfig.Network); + ChainModel chain = new ChainModel(ChainModel.EvmNamespace, projectConfig.ChainId, projectConfig.Network); return new WalletConnectConfig { diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs index 8849ebddc..21be123e9 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs @@ -18,16 +18,16 @@ private void Start() { _backButton.onClick.AddListener(Disable); - WalletConnectWallet.OnConnected += WalletConnected; + WalletConnectSigner.OnConnected += WalletConnected; - WalletConnectWallet.OnSessionApproved += SessionApproved; + WalletConnectSigner.OnSessionApproved += SessionApproved; } private void OnDisable() { - WalletConnectWallet.OnConnected -= WalletConnected; + WalletConnectSigner.OnConnected -= WalletConnected; - WalletConnectWallet.OnSessionApproved -= SessionApproved; + WalletConnectSigner.OnSessionApproved -= SessionApproved; } private void WalletConnected(ConnectedData data) @@ -40,7 +40,6 @@ private void WalletConnected(ConnectedData data) Application.OpenURL(data.Uri); #elif UNITY_IOS - //select wallet dropdown #endif } From 51a6c8e00f4c42856c46e1e49707184eb5a06b22 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 5 Oct 2023 11:55:25 +0000 Subject: [PATCH 043/167] Auto-duplicate Package Samples --- .../Web3.Unity/Scripts/Scenes/Login.cs | 45 ++++++++++++++----- .../Scripts/Utilities/WalletConnectModal.cs | 9 ++-- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs index 69502f8ed..42704fe2a 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs @@ -8,6 +8,7 @@ using ChainSafe.Gaming.UnityPackage; using ChainSafe.Gaming.Wallets; using ChainSafe.Gaming.WalletConnect; +using ChainSafe.Gaming.WalletConnect.Models; using ChainSafe.Gaming.Web3; using ChainSafe.Gaming.Web3.Build; using ChainSafe.Gaming.Web3.Unity; @@ -52,6 +53,7 @@ public class Login : MonoBehaviour public Toggle RememberMeToggle; public ErrorPopup ErrorPopup; public List Web3AuthButtons; + public TMP_Dropdown _supportedWalletsDropdown; private bool useWebPageWallet; @@ -90,6 +92,10 @@ private IEnumerator Start() // Wallet Connect yield return FetchSupportedWallets(); + +#if UNITY_IOS + InitializeWalletSelection(); +#endif #if UNITY_WEBGL ProcessWeb3Auth(); @@ -106,6 +112,19 @@ private IEnumerator Start() } } + private void InitializeWalletSelection() + { + // first element is a no select + List supportedWalletsList = new List + { + "None", + }; + + supportedWalletsList.AddRange(_supportedWallets.Values.Select(w => w.Name)); + + _supportedWalletsDropdown.AddOptions(supportedWalletsList); + } + private async void TryAutoLogin() { if (!useWebPageWallet) @@ -120,12 +139,7 @@ private async void TryAutoLogin() .Configure(ConfigureCommonServices) .Configure(services => { - services.UseWalletConnectWallet( - new WebPageWalletConfig - { - SavedUserAddress = savedAccount, - WalletConnectConfig = BuildWalletConnectConfig() - }); + services.UseWalletConnectSigner(BuildWalletConnectConfig()); }); await ProcessLogin(web3Builder); @@ -133,6 +147,17 @@ private async void TryAutoLogin() private async void LoginWithExistingAccount() { + if (_supportedWalletsDropdown.value == 0) + { + // feedback + Debug.LogError("Please select a Wallet first"); + + return; + } +#if UNITY_IOS + +#endif + var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) .Configure(ConfigureCommonServices) .Configure(services => @@ -144,11 +169,7 @@ private async void LoginWithExistingAccount() */ if (useWebPageWallet) { - services.UseWalletConnectWallet( - new WebPageWalletConfig - { - WalletConnectConfig = BuildWalletConnectConfig() - }); + services.UseWalletConnectSigner(BuildWalletConnectConfig()); } else { @@ -273,7 +294,7 @@ private WalletConnectConfig BuildWalletConnectConfig() // build chain var projectConfig = ProjectConfigUtilities.Load(); - Chain chain = new Chain(Chain.EvmNamespace, projectConfig.ChainId, projectConfig.Network); + ChainModel chain = new ChainModel(ChainModel.EvmNamespace, projectConfig.ChainId, projectConfig.Network); return new WalletConnectConfig { diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs index 8849ebddc..21be123e9 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs @@ -18,16 +18,16 @@ private void Start() { _backButton.onClick.AddListener(Disable); - WalletConnectWallet.OnConnected += WalletConnected; + WalletConnectSigner.OnConnected += WalletConnected; - WalletConnectWallet.OnSessionApproved += SessionApproved; + WalletConnectSigner.OnSessionApproved += SessionApproved; } private void OnDisable() { - WalletConnectWallet.OnConnected -= WalletConnected; + WalletConnectSigner.OnConnected -= WalletConnected; - WalletConnectWallet.OnSessionApproved -= SessionApproved; + WalletConnectSigner.OnSessionApproved -= SessionApproved; } private void WalletConnected(ConnectedData data) @@ -40,7 +40,6 @@ private void WalletConnected(ConnectedData data) Application.OpenURL(data.Uri); #elif UNITY_IOS - //select wallet dropdown #endif } From b296caf92584e28e3402768c4dc2aedf51a05b5b Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 6 Oct 2023 15:26:34 +0300 Subject: [PATCH 044/167] Changes Made + Added IOS implementation + refactored Unity specific implementations except [preserve] + implemented redirect to wallet option for mobile on Login --- .../NetCoreOperatingSystemMediator.cs | 8 +- .../UnityOperatingSystemMediator.cs | 28 +- .../Models/WalletConnectWalletModel.cs | 79 +- .../WCLogWriter.cs | 1 - .../WalletConnectConfig.cs | 4 +- .../WalletConnectSigner.cs | 23 +- .../Environment/IOperatingSystemMediator.cs | 13 +- .../Scenes/SampleLogin.unity | 1718 ++++++++++++++++- .../Scripts/Scenes/Login.cs | 111 +- .../Scripts/Utilities/WalletConnectModal.cs | 34 +- 10 files changed, 1871 insertions(+), 148 deletions(-) diff --git a/src/ChainSafe.Gaming.NetCore/NetCoreOperatingSystemMediator.cs b/src/ChainSafe.Gaming.NetCore/NetCoreOperatingSystemMediator.cs index ff30d493a..7c0ee785b 100644 --- a/src/ChainSafe.Gaming.NetCore/NetCoreOperatingSystemMediator.cs +++ b/src/ChainSafe.Gaming.NetCore/NetCoreOperatingSystemMediator.cs @@ -4,11 +4,9 @@ namespace ChainSafe.Gaming.NetCore { public class NetCoreOperatingSystemMediator : IOperatingSystemMediator { - public string ClipboardContent - { - get => throw new System.NotImplementedException(); - set => throw new System.NotImplementedException(); - } + public bool IsMobilePlatform => throw new System.NotImplementedException(); + + public Platform Platform => throw new System.NotImplementedException(); public void OpenUrl(string url) => throw new System.NotImplementedException(); } diff --git a/src/ChainSafe.Gaming.Unity/UnityOperatingSystemMediator.cs b/src/ChainSafe.Gaming.Unity/UnityOperatingSystemMediator.cs index 46870f9cc..fc668a54e 100644 --- a/src/ChainSafe.Gaming.Unity/UnityOperatingSystemMediator.cs +++ b/src/ChainSafe.Gaming.Unity/UnityOperatingSystemMediator.cs @@ -1,14 +1,34 @@ -using ChainSafe.Gaming.Web3.Environment; +using System; +using ChainSafe.Gaming.Web3.Environment; using UnityEngine; namespace ChainSafe.Gaming.Unity { public class UnityOperatingSystemMediator : IOperatingSystemMediator { - public string ClipboardContent + public bool IsMobilePlatform => Application.isMobilePlatform; + + public Platform Platform { - get => GUIUtility.systemCopyBuffer; - set => GUIUtility.systemCopyBuffer = value; + get + { + if (Application.isEditor) + { + return Platform.Editor; + } + + switch (Application.platform) + { + case RuntimePlatform.IPhonePlayer: + return Platform.IOS; + case RuntimePlatform.Android: + return Platform.Android; + case RuntimePlatform.WebGLPlayer: + return Platform.WebGL; + default: + return Platform.Desktop; + } + } } public void OpenUrl(string url) => Application.OpenURL(url); diff --git a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs index 22cbbfe25..29c81b51a 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs @@ -1,6 +1,6 @@ using System; +using ChainSafe.Gaming.Web3.Environment; using Newtonsoft.Json; -using UnityEngine; using WalletConnectSharp.Common.Logging; using WalletConnectSharp.Sign.Models.Engine; @@ -20,52 +20,61 @@ public class WalletConnectWalletModel [JsonProperty("image_url")] public ImageUrlsModel Images { get; private set; } - public void OpenDeeplink(ConnectedData data, bool useNative = false) + public void OpenDeeplink(ConnectedData data, IOperatingSystemMediator operatingSystemMediator, bool useNative = false) { string uri = string.Empty; -#if UNITY_ANDROID - uri = data.Uri; // Android OS should handle wc: protocol -#elif UNITY_IOS - - // on iOS, we need to use one of the wallet links - WalletLink linkData = Application.isMobilePlatform ? Mobile : Desktop; - - var universalUrl = useNative ? linkData.NativeProtocol : linkData.UniversalUrl; - - uri = data.Uri; - - if (!string.IsNullOrWhiteSpace(universalUrl)) + if (operatingSystemMediator.IsMobilePlatform) { - uri = data.Uri; - - if (useNative) - { - uri = $"{universalUrl}//{uri}"; - } - else if (universalUrl.EndsWith("/")) - { - uri = $"{universalUrl}{uri}"; - } - else + switch (operatingSystemMediator.Platform) { - uri = $"{universalUrl}/{uri}"; + case Platform.Android: + uri = data.Uri; // Android OS should handle wc: protocol + break; + + case Platform.IOS: + // on iOS, we need to use one of the wallet links + WalletLinkModel linkData = operatingSystemMediator.IsMobilePlatform ? Mobile : Desktop; + + var universalUrl = useNative ? linkData.NativeProtocol : linkData.UniversalUrl; + + uri = data.Uri; + + if (!string.IsNullOrWhiteSpace(universalUrl)) + { + uri = data.Uri; + + if (useNative) + { + uri = $"{universalUrl}//{uri}"; + } + else if (universalUrl.EndsWith("/")) + { + uri = $"{universalUrl}{uri}"; + } + else + { + uri = $"{universalUrl}/{uri}"; + } + } + + if (string.IsNullOrWhiteSpace(uri)) + { + throw new Exception("Got empty URI when attempting to create WC deeplink"); + } + + break; } } - if (string.IsNullOrWhiteSpace(uri)) - { - throw new Exception("Got empty URI when attempting to create WC deeplink"); - } -#endif WCLogger.Log($"Opening URL {uri}"); - Application.OpenURL(uri); + operatingSystemMediator.OpenUrl(uri); } - public void OpenWallet() + public void OpenWallet(IOperatingSystemMediator operatingSystemMediator) { - WalletLinkModel linkData = Application.isMobilePlatform ? Mobile : Desktop; + WalletLinkModel linkData = operatingSystemMediator.IsMobilePlatform ? Mobile : Desktop; string universalUrl = linkData.UniversalUrl; @@ -74,7 +83,7 @@ public void OpenWallet() throw new Exception("Got empty URI when attempting to create WC deeplink"); } - Application.OpenURL(universalUrl); + operatingSystemMediator.OpenUrl(universalUrl); } } } \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs b/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs index 3618c0d56..58bf8eae4 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WCLogWriter.cs @@ -1,7 +1,6 @@ using System; using ChainSafe.Gaming.Evm.Unity; using ChainSafe.Gaming.Web3.Environment; -using UnityEngine; using ILogger = WalletConnectSharp.Common.Logging.ILogger; namespace ChainSafe.Gaming.WalletConnect diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs index 7e43d2b27..4f7915a37 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs @@ -10,8 +10,6 @@ public class WalletConnectConfig { public string SavedUserAddress { get; set; } = null; - public TimeSpan ConnectRequestExpiresAfter { get; set; } = TimeSpan.FromMinutes(1); - public string ProjectId { get; set; } public string ProjectName { get; set; } @@ -22,6 +20,8 @@ public class WalletConnectConfig public Metadata Metadata { get; set; } + public bool RedirectToWallet { get; set; } + public WalletConnectWalletModel DefaultWallet { get; set; } public Dictionary SupportedWallets { get; set; } diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs index 387892fc9..219bf57cb 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs @@ -12,7 +12,6 @@ using ChainSafe.Gaming.Web3.Core.Debug; using ChainSafe.Gaming.Web3.Core.Evm; using ChainSafe.Gaming.Web3.Environment; -using UnityEngine; using WalletConnectSharp.Common.Logging; using WalletConnectSharp.Common.Model.Errors; using WalletConnectSharp.Core; @@ -172,12 +171,25 @@ public async Task ConnectClient() InvokeConnected(connectData); + // open deeplink to redirect to wallet for connection + if (Config.RedirectToWallet) + { + if (Config.DefaultWallet != null) + { + Config.DefaultWallet.OpenDeeplink(connectData, operatingSystem); + } + else + { + operatingSystem.OpenUrl(connectData.Uri); + } + } + SessionStruct sessionResult = await connectData.Approval; InvokeSessionApproved(sessionResult); // get default wallet - if (Application.isMobilePlatform && Config.DefaultWallet == null) + if (Config.RedirectToWallet && Config.DefaultWallet == null) { string nativeUrl = sessionResult.Peer.Metadata.Redirect.Native.Replace("//", string.Empty); @@ -188,7 +200,7 @@ public async Task ConnectClient() nativeUrl = $"{nativeUrl.Substring(0, index)}:"; } - Debug.Log($"Wallet Native Url {nativeUrl}"); + WCLogger.Log($"Wallet Native Url {nativeUrl}"); var defaultWallet = Config.SupportedWallets.Values.FirstOrDefault(w => w.Mobile.NativeProtocol == nativeUrl || w.Desktop.NativeProtocol == nativeUrl); @@ -230,11 +242,12 @@ private Task Request(string topic, T data, string chainId = null, lon RelayerEvents.Publish, (_, _) => { - if (Config.DefaultWallet != null) + // if default wallet exists and redirect is true redirect user to default wallet + if (Config.RedirectToWallet && Config.DefaultWallet != null) { WCLogger.Log("Opening Default Wallet..."); - Config.DefaultWallet.OpenWallet(); + Config.DefaultWallet.OpenWallet(operatingSystem); } else { diff --git a/src/ChainSafe.Gaming/Web3/Core/Environment/IOperatingSystemMediator.cs b/src/ChainSafe.Gaming/Web3/Core/Environment/IOperatingSystemMediator.cs index 0273a079a..a7fbd51ae 100644 --- a/src/ChainSafe.Gaming/Web3/Core/Environment/IOperatingSystemMediator.cs +++ b/src/ChainSafe.Gaming/Web3/Core/Environment/IOperatingSystemMediator.cs @@ -1,8 +1,19 @@ namespace ChainSafe.Gaming.Web3.Environment { + public enum Platform + { + Editor, + Android, + IOS, + WebGL, + Desktop, + } + public interface IOperatingSystemMediator { - public string ClipboardContent { get; set; } + public bool IsMobilePlatform { get; } + + public Platform Platform { get; } public void OpenUrl(string url); } diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity index 1b07eda87..df4dfabf5 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity @@ -533,6 +533,83 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &225123873 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 225123874} + - component: {fileID: 225123876} + - component: {fileID: 225123875} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &225123874 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 225123873} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1583968964} + m_Father: {fileID: 981405682} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.25, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -10.000004, y: -10.000001} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &225123875 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 225123873} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &225123876 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 225123873} + m_CullTransparentMesh: 1 --- !u!1 &253290328 GameObject: m_ObjectHideFlags: 0 @@ -668,6 +745,141 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 253290328} m_CullTransparentMesh: 1 +--- !u!1 &258509835 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 258509836} + - component: {fileID: 258509838} + - component: {fileID: 258509837} + m_Layer: 5 + m_Name: Item Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &258509836 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 258509835} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1808259963} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 5, y: -0.5} + m_SizeDelta: {x: -30, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &258509837 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 258509835} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Option A + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &258509838 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 258509835} + m_CullTransparentMesh: 1 --- !u!1 &279245842 GameObject: m_ObjectHideFlags: 0 @@ -1395,6 +1607,7 @@ MonoBehaviour: _copyToClipboardButton: {fileID: 212403314} _backButton: {fileID: 1993078182} _container: {fileID: 1278821651} + _login: {fileID: 0} --- !u!1001 &452118933 PrefabInstance: m_ObjectHideFlags: 0 @@ -1605,7 +1818,7 @@ MonoBehaviour: m_FirstSelected: {fileID: 0} m_sendNavigationEvents: 1 m_DragThreshold: 10 ---- !u!1 &724612374 +--- !u!1 &537139933 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1613,48 +1826,108 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 724612375} - - component: {fileID: 724612376} - - component: {fileID: 724612377} + - component: {fileID: 537139934} m_Layer: 5 - m_Name: Toggle - Remember Me + m_Name: Content m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &724612375 +--- !u!224 &537139934 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 724612374} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 537139933} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 351786045} - - {fileID: 1791429089} - m_Father: {fileID: 2036998554} - m_RootOrder: 1 + - {fileID: 1808259963} + m_Father: {fileID: 2043937261} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 28} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &540464233 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 540464234} + - component: {fileID: 540464238} + - component: {fileID: 540464237} + - component: {fileID: 540464236} + - component: {fileID: 540464235} + m_Layer: 5 + m_Name: Dropdown - Wallets + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &540464234 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 540464233} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2033480131} + - {fileID: 2045136594} + - {fileID: 741301286} + m_Father: {fileID: 2036998554} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 293.8618, y: -25} + m_SizeDelta: {x: 587.7236, y: 50} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &724612376 +--- !u!114 &540464235 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 724612374} + m_GameObject: {fileID: 540464233} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &540464236 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 540464233} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} m_Name: m_EditorClassIdentifier: m_Navigation: @@ -1685,10 +1958,218 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 351786046} - toggleTransition: 1 - graphic: {fileID: 1900245910} - m_Group: {fileID: 0} + m_TargetGraphic: {fileID: 540464237} + m_Template: {fileID: 741301286} + m_CaptionText: {fileID: 2033480132} + m_CaptionImage: {fileID: 0} + m_Placeholder: {fileID: 0} + m_ItemText: {fileID: 258509837} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_AlphaFadeSpeed: 0.15 +--- !u!114 &540464237 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 540464233} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.054901965, g: 0.054901965, b: 0.054901965, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &540464238 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 540464233} + m_CullTransparentMesh: 1 +--- !u!1 &562988047 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 562988048} + - component: {fileID: 562988050} + - component: {fileID: 562988049} + m_Layer: 5 + m_Name: Item Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &562988048 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 562988047} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1808259963} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &562988049 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 562988047} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &562988050 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 562988047} + m_CullTransparentMesh: 1 +--- !u!1 &724612374 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 724612375} + - component: {fileID: 724612376} + - component: {fileID: 724612377} + m_Layer: 5 + m_Name: Toggle - Remember Me + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &724612375 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 724612374} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 351786045} + - {fileID: 1791429089} + m_Father: {fileID: 2036998554} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &724612376 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 724612374} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 351786046} + toggleTransition: 1 + graphic: {fileID: 1900245910} + m_Group: {fileID: 0} onValueChanged: m_PersistentCalls: m_Calls: [] @@ -1713,6 +2194,115 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 +--- !u!1 &741301285 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 741301286} + - component: {fileID: 741301289} + - component: {fileID: 741301288} + - component: {fileID: 741301287} + m_Layer: 5 + m_Name: Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &741301286 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 741301285} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2043937261} + - {fileID: 1934047389} + m_Father: {fileID: 540464234} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 2} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &741301287 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 741301285} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 537139934} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 2043937261} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1934047390} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &741301288 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 741301285} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &741301289 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 741301285} + m_CullTransparentMesh: 1 --- !u!1 &786896300 GameObject: m_ObjectHideFlags: 0 @@ -2243,7 +2833,267 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 1} ---- !u!1 &1062946085 +--- !u!1 &977353941 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 977353942} + - component: {fileID: 977353944} + - component: {fileID: 977353943} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &977353942 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 977353941} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1513683686} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.2} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &977353943 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 977353941} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &977353944 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 977353941} + m_CullTransparentMesh: 1 +--- !u!1 &981405681 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 981405682} + - component: {fileID: 981405684} + - component: {fileID: 981405683} + m_Layer: 5 + m_Name: Toggle - Redirect To Wallet + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &981405682 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 981405681} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 225123874} + - {fileID: 1642196834} + m_Father: {fileID: 2036998554} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 293.8618, y: -135} + m_SizeDelta: {x: 587.7236, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &981405683 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 981405681} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &981405684 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 981405681} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 225123875} + toggleTransition: 1 + graphic: {fileID: 1583968965} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &1023192743 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1023192744} + - component: {fileID: 1023192746} + - component: {fileID: 1023192745} + m_Layer: 5 + m_Name: Item Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1023192744 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1023192743} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1808259963} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1023192745 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1023192743} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1023192746 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1023192743} + m_CullTransparentMesh: 1 +--- !u!1 &1062946085 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2382,6 +3232,9 @@ MonoBehaviour: Provider: 3 - Button: {fileID: 1508551058} Provider: 4 + _supportedWalletsDropdown: {fileID: 540464236} + _redirectToWalletToggle: {fileID: 981405684} + _walletConnectModal: {fileID: 395689441} k__BackingField: f4bff60eb260841f46b1c77588cd8acb k__BackingField: Web3.Unity k__BackingField: unity-game @@ -2761,6 +3614,43 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 +--- !u!1 &1513683685 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1513683686} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1513683686 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1513683685} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 977353942} + m_Father: {fileID: 1934047389} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1561876540 GameObject: m_ObjectHideFlags: 0 @@ -2839,7 +3729,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1561876540} m_CullTransparentMesh: 1 ---- !u!1 &1701305866 +--- !u!1 &1583968963 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2847,29 +3737,240 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1701305867} - - component: {fileID: 1701305868} + - component: {fileID: 1583968964} + - component: {fileID: 1583968966} + - component: {fileID: 1583968965} m_Layer: 5 - m_Name: Error + m_Name: Checkmark m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &1701305867 + m_IsActive: 1 +--- !u!224 &1583968964 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1701305866} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1583968963} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 108583392} - - {fileID: 279245843} + m_Children: [] + m_Father: {fileID: 225123874} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1583968965 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1583968963} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1583968966 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1583968963} + m_CullTransparentMesh: 1 +--- !u!1 &1642196833 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1642196834} + - component: {fileID: 1642196836} + - component: {fileID: 1642196835} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1642196834 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1642196833} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 981405682} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.25, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -75, y: 0} + m_SizeDelta: {x: -150, y: -30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1642196835 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1642196833} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Redirect to Wallet + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2100000, guid: 79459efec17a4d00a321bdcc27bbc385, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294111986 + m_fontColor: {r: 0.95, g: 0.95, b: 0.95, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 17.9 + m_fontSizeBase: 20 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 8 + m_fontSizeMax: 36 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1642196836 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1642196833} + m_CullTransparentMesh: 1 +--- !u!1 &1701305866 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1701305867} + - component: {fileID: 1701305868} + m_Layer: 5 + m_Name: Error + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1701305867 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1701305866} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 108583392} + - {fileID: 279245843} m_Father: {fileID: 1880270956} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -2926,8 +4027,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.25, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchoredPosition: {x: -75, y: 0} + m_SizeDelta: {x: -150, y: -30} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1791429091 CanvasRenderer: @@ -2960,14 +4061,14 @@ MonoBehaviour: m_text: Remember me m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2100000, guid: 79459efec17a4d00a321bdcc27bbc385, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} + rgba: 4294111986 + m_fontColor: {r: 0.95, g: 0.95, b: 0.95, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -2984,13 +4085,13 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 22 - m_fontSizeBase: 21 + m_fontSize: 17.9 + m_fontSizeBase: 20 m_fontWeight: 400 m_enableAutoSizing: 1 - m_fontSizeMin: 14 - m_fontSizeMax: 22 - m_fontStyle: 0 + m_fontSizeMin: 8 + m_fontSizeMax: 36 + m_fontStyle: 1 m_HorizontalAlignment: 1 m_VerticalAlignment: 512 m_textAlignment: 65535 @@ -3026,6 +4127,94 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &1808259962 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1808259963} + - component: {fileID: 1808259964} + m_Layer: 5 + m_Name: Item + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1808259963 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1808259962} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 562988048} + - {fileID: 1023192744} + - {fileID: 258509836} + m_Father: {fileID: 537139934} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1808259964 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1808259962} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 562988049} + toggleTransition: 1 + graphic: {fileID: 1023192745} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 --- !u!1 &1880270952 GameObject: m_ObjectHideFlags: 0 @@ -3188,9 +4377,136 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 1 + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1900245911 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1900245908} + m_CullTransparentMesh: 1 +--- !u!1 &1934047388 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1934047389} + - component: {fileID: 1934047392} + - component: {fileID: 1934047391} + - component: {fileID: 1934047390} + m_Layer: 5 + m_Name: Scrollbar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1934047389 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934047388} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1513683686} + m_Father: {fileID: 741301286} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1934047390 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934047388} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 977353943} + m_HandleRect: {fileID: 977353942} + m_Direction: 2 + m_Value: 0 + m_Size: 0.2 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1934047391 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934047388} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -3198,13 +4514,13 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1900245911 +--- !u!222 &1934047392 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1900245908} + m_GameObject: {fileID: 1934047388} m_CullTransparentMesh: 1 --- !u!1 &1993078178 GameObject: @@ -3528,6 +4844,141 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 +--- !u!1 &2033480130 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2033480131} + - component: {fileID: 2033480133} + - component: {fileID: 2033480132} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2033480131 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033480130} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 540464234} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -30, y: -30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2033480132 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033480130} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2100000, guid: 79459efec17a4d00a321bdcc27bbc385, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294111986 + m_fontColor: {r: 0.95, g: 0.95, b: 0.95, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 20 + m_fontSizeBase: 20 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 8 + m_fontSizeMax: 36 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &2033480133 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033480130} + m_CullTransparentMesh: 1 --- !u!1 &2036998553 GameObject: m_ObjectHideFlags: 0 @@ -3560,6 +5011,8 @@ RectTransform: m_Children: - {fileID: 787012149} - {fileID: 724612375} + - {fileID: 981405682} + - {fileID: 540464234} m_Father: {fileID: 1434038408} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -3608,6 +5061,173 @@ MonoBehaviour: m_EditorClassIdentifier: m_HorizontalFit: 0 m_VerticalFit: 2 +--- !u!1 &2043937260 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2043937261} + - component: {fileID: 2043937264} + - component: {fileID: 2043937263} + - component: {fileID: 2043937262} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2043937261 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2043937260} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 537139934} + m_Father: {fileID: 741301286} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -18, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &2043937262 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2043937260} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2043937263 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2043937260} + m_CullTransparentMesh: 1 +--- !u!114 &2043937264 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2043937260} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &2045136593 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2045136594} + - component: {fileID: 2045136596} + - component: {fileID: 2045136595} + m_Layer: 5 + m_Name: Arrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2045136594 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045136593} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 540464234} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -15, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2045136595 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045136593} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2045136596 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045136593} + m_CullTransparentMesh: 1 --- !u!1001 &2114521192 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index 42704fe2a..5bc6b9c27 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -22,6 +22,8 @@ using UnityEngine.SceneManagement; using UnityEngine.UI; using WalletConnectSharp.Core; +using WalletConnectSharp.Sign.Models; +using WalletConnectSharp.Sign.Models.Engine; namespace Scenes { @@ -53,13 +55,18 @@ public class Login : MonoBehaviour public Toggle RememberMeToggle; public ErrorPopup ErrorPopup; public List Web3AuthButtons; - public TMP_Dropdown _supportedWalletsDropdown; - + private bool useWebPageWallet; #region Wallet Connect [field: Header("Wallet Connect")] + + [SerializeField] private TMP_Dropdown _supportedWalletsDropdown; + + [SerializeField] private Toggle _redirectToWalletToggle; + + [SerializeField] private WalletConnectModal _walletConnectModal; [field: SerializeField] public string ProjectId { get; private set; } @@ -75,6 +82,8 @@ public class Login : MonoBehaviour Url = "https://chainsafe.io/" }; + private bool _redirectToWallet; + #endregion private IEnumerator Start() @@ -93,10 +102,12 @@ private IEnumerator Start() // Wallet Connect yield return FetchSupportedWallets(); -#if UNITY_IOS - InitializeWalletSelection(); -#endif - + // enable this on editor to test UI flow and functions + if (Application.isMobilePlatform || Application.isEditor) + { + InitializeMobileOptions(); + } + #if UNITY_WEBGL ProcessWeb3Auth(); #endif @@ -110,14 +121,58 @@ private IEnumerator Start() var provider = buttonAndProvider.Provider; button.onClick.AddListener(() => LoginWithWeb3Auth(provider)); } + + WalletConnectSigner.OnConnected += WalletConnected; + + WalletConnectSigner.OnSessionApproved += SessionApproved; + } + + private void OnDestroy() + { + WalletConnectSigner.OnConnected -= WalletConnected; + + WalletConnectSigner.OnSessionApproved -= SessionApproved; + } + + private void WalletConnected(ConnectedData data) + { + // already redirecting to wallet + if (_redirectToWallet) + { + return; + } + + // display QR and copy to clipboard + _walletConnectModal.WalletConnected(data); + } + + private void SessionApproved(SessionStruct session) + { + Debug.Log($"{session.Topic} Approved"); } - private void InitializeWalletSelection() + // redirect to mobile wallet and select default wallet on IOS + private void InitializeMobileOptions() { + _redirectToWalletToggle.gameObject.SetActive(true); +#if UNITY_IOS + InitializeWalletDropdown(); +#endif + } + + // add all supported wallets + private void InitializeWalletDropdown() + { + _redirectToWalletToggle.onValueChanged.AddListener(isOn => + { + _supportedWalletsDropdown.gameObject.SetActive(isOn); + }); + // first element is a no select List supportedWalletsList = new List { - "None", + // default option/unselected + "Select Wallet", }; supportedWalletsList.AddRange(_supportedWallets.Values.Select(w => w.Name)); @@ -147,15 +202,15 @@ private async void TryAutoLogin() private async void LoginWithExistingAccount() { - if (_supportedWalletsDropdown.value == 0) +#if UNITY_IOS + // can't redirect to wallet on IOS if there's no selected wallet + if (_redirectToWalletToggle.isOn && _supportedWalletsDropdown.value == 0) { // feedback Debug.LogError("Please select a Wallet first"); return; } -#if UNITY_IOS - #endif var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) @@ -291,20 +346,44 @@ private void ConfigureCommonServices(IWeb3ServiceCollection services) private WalletConnectConfig BuildWalletConnectConfig() { + WalletConnectWalletModel defaultWallet = null; + // build chain var projectConfig = ProjectConfigUtilities.Load(); ChainModel chain = new ChainModel(ChainModel.EvmNamespace, projectConfig.ChainId, projectConfig.Network); + + // allow redirection on editor for testing UI flow + _redirectToWallet = (Application.isMobilePlatform || Application.isEditor) && _redirectToWalletToggle.isOn; + +#if UNITY_IOS + // make sure there's a selected wallet on IOS + _redirectToWallet = _redirectToWallet && _supportedWalletsDropdown.value != 0; + + if (_redirectToWallet) + { + // offset for the first/default/unselected dropdown option 0 + int selectedWalletIndex = _supportedWalletsDropdown.value - 1; + + defaultWallet = _supportedWallets.Values.ToArray()[selectedWalletIndex]; + } +#endif - return new WalletConnectConfig + var config = new WalletConnectConfig { - ProjectId = ProjectId, - ProjectName = ProjectName, + ProjectId = ProjectId, + ProjectName = ProjectName, BaseContext = BaseContext, Chain = chain, - Metadata = Metadata, - SupportedWallets = _supportedWallets + Metadata = Metadata, + SupportedWallets = _supportedWallets, + RedirectToWallet = _redirectToWallet, +#if UNITY_IOS + DefaultWallet = defaultWallet +#endif }; + + return config; } private IEnumerator FetchSupportedWallets() diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs index 21be123e9..9cff96696 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs @@ -1,4 +1,6 @@ +using ChainSafe.Gaming.UnityPackage; using ChainSafe.Gaming.WalletConnect; +using Scenes; using UnityEngine; using UnityEngine.UI; using WalletConnectSharp.Sign.Models; @@ -13,37 +15,14 @@ public class WalletConnectModal : MonoBehaviour [SerializeField] private Button _backButton; [SerializeField] private Transform _container; - + private void Start() { _backButton.onClick.AddListener(Disable); - - WalletConnectSigner.OnConnected += WalletConnected; - - WalletConnectSigner.OnSessionApproved += SessionApproved; } - private void OnDisable() - { - WalletConnectSigner.OnConnected -= WalletConnected; - - WalletConnectSigner.OnSessionApproved -= SessionApproved; - } - - private void WalletConnected(ConnectedData data) + public void WalletConnected(ConnectedData data) { - if (Application.isMobilePlatform) - { -#if UNITY_ANDROID - - // open wallet - Application.OpenURL(data.Uri); - -#elif UNITY_IOS - //select wallet dropdown -#endif - } - // enable display _container.gameObject.SetActive(true); @@ -54,11 +33,6 @@ private void WalletConnected(ConnectedData data) SetClipboard(uri); } - private void SessionApproved(SessionStruct session) - { - Debug.Log($"{session.Topic} Approved"); - } - private void SetClipboard(string uri) { _copyToClipboardButton.onClick.RemoveAllListeners(); From 3dd840b179a7447f847cc1b00a08a9e51b71076c Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 6 Oct 2023 12:27:03 +0000 Subject: [PATCH 045/167] Auto-duplicate Package Samples --- .../Web3.Unity/Scenes/SampleLogin.unity | 1718 ++++++++++++++++- .../Web3.Unity/Scripts/Scenes/Login.cs | 111 +- .../Scripts/Utilities/WalletConnectModal.cs | 34 +- 3 files changed, 1768 insertions(+), 95 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity index 1b07eda87..df4dfabf5 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity @@ -533,6 +533,83 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &225123873 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 225123874} + - component: {fileID: 225123876} + - component: {fileID: 225123875} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &225123874 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 225123873} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1583968964} + m_Father: {fileID: 981405682} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.25, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -10.000004, y: -10.000001} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &225123875 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 225123873} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &225123876 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 225123873} + m_CullTransparentMesh: 1 --- !u!1 &253290328 GameObject: m_ObjectHideFlags: 0 @@ -668,6 +745,141 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 253290328} m_CullTransparentMesh: 1 +--- !u!1 &258509835 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 258509836} + - component: {fileID: 258509838} + - component: {fileID: 258509837} + m_Layer: 5 + m_Name: Item Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &258509836 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 258509835} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1808259963} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 5, y: -0.5} + m_SizeDelta: {x: -30, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &258509837 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 258509835} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Option A + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &258509838 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 258509835} + m_CullTransparentMesh: 1 --- !u!1 &279245842 GameObject: m_ObjectHideFlags: 0 @@ -1395,6 +1607,7 @@ MonoBehaviour: _copyToClipboardButton: {fileID: 212403314} _backButton: {fileID: 1993078182} _container: {fileID: 1278821651} + _login: {fileID: 0} --- !u!1001 &452118933 PrefabInstance: m_ObjectHideFlags: 0 @@ -1605,7 +1818,7 @@ MonoBehaviour: m_FirstSelected: {fileID: 0} m_sendNavigationEvents: 1 m_DragThreshold: 10 ---- !u!1 &724612374 +--- !u!1 &537139933 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1613,48 +1826,108 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 724612375} - - component: {fileID: 724612376} - - component: {fileID: 724612377} + - component: {fileID: 537139934} m_Layer: 5 - m_Name: Toggle - Remember Me + m_Name: Content m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &724612375 +--- !u!224 &537139934 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 724612374} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 537139933} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 351786045} - - {fileID: 1791429089} - m_Father: {fileID: 2036998554} - m_RootOrder: 1 + - {fileID: 1808259963} + m_Father: {fileID: 2043937261} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 28} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &540464233 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 540464234} + - component: {fileID: 540464238} + - component: {fileID: 540464237} + - component: {fileID: 540464236} + - component: {fileID: 540464235} + m_Layer: 5 + m_Name: Dropdown - Wallets + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &540464234 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 540464233} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2033480131} + - {fileID: 2045136594} + - {fileID: 741301286} + m_Father: {fileID: 2036998554} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 293.8618, y: -25} + m_SizeDelta: {x: 587.7236, y: 50} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &724612376 +--- !u!114 &540464235 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 724612374} + m_GameObject: {fileID: 540464233} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &540464236 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 540464233} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} m_Name: m_EditorClassIdentifier: m_Navigation: @@ -1685,10 +1958,218 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 351786046} - toggleTransition: 1 - graphic: {fileID: 1900245910} - m_Group: {fileID: 0} + m_TargetGraphic: {fileID: 540464237} + m_Template: {fileID: 741301286} + m_CaptionText: {fileID: 2033480132} + m_CaptionImage: {fileID: 0} + m_Placeholder: {fileID: 0} + m_ItemText: {fileID: 258509837} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_AlphaFadeSpeed: 0.15 +--- !u!114 &540464237 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 540464233} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.054901965, g: 0.054901965, b: 0.054901965, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &540464238 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 540464233} + m_CullTransparentMesh: 1 +--- !u!1 &562988047 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 562988048} + - component: {fileID: 562988050} + - component: {fileID: 562988049} + m_Layer: 5 + m_Name: Item Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &562988048 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 562988047} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1808259963} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &562988049 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 562988047} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &562988050 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 562988047} + m_CullTransparentMesh: 1 +--- !u!1 &724612374 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 724612375} + - component: {fileID: 724612376} + - component: {fileID: 724612377} + m_Layer: 5 + m_Name: Toggle - Remember Me + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &724612375 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 724612374} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 351786045} + - {fileID: 1791429089} + m_Father: {fileID: 2036998554} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &724612376 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 724612374} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 351786046} + toggleTransition: 1 + graphic: {fileID: 1900245910} + m_Group: {fileID: 0} onValueChanged: m_PersistentCalls: m_Calls: [] @@ -1713,6 +2194,115 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 +--- !u!1 &741301285 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 741301286} + - component: {fileID: 741301289} + - component: {fileID: 741301288} + - component: {fileID: 741301287} + m_Layer: 5 + m_Name: Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &741301286 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 741301285} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2043937261} + - {fileID: 1934047389} + m_Father: {fileID: 540464234} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 2} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &741301287 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 741301285} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 537139934} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 2043937261} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1934047390} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &741301288 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 741301285} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &741301289 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 741301285} + m_CullTransparentMesh: 1 --- !u!1 &786896300 GameObject: m_ObjectHideFlags: 0 @@ -2243,7 +2833,267 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 1} ---- !u!1 &1062946085 +--- !u!1 &977353941 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 977353942} + - component: {fileID: 977353944} + - component: {fileID: 977353943} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &977353942 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 977353941} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1513683686} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.2} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &977353943 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 977353941} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &977353944 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 977353941} + m_CullTransparentMesh: 1 +--- !u!1 &981405681 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 981405682} + - component: {fileID: 981405684} + - component: {fileID: 981405683} + m_Layer: 5 + m_Name: Toggle - Redirect To Wallet + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &981405682 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 981405681} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 225123874} + - {fileID: 1642196834} + m_Father: {fileID: 2036998554} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 293.8618, y: -135} + m_SizeDelta: {x: 587.7236, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &981405683 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 981405681} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &981405684 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 981405681} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 225123875} + toggleTransition: 1 + graphic: {fileID: 1583968965} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &1023192743 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1023192744} + - component: {fileID: 1023192746} + - component: {fileID: 1023192745} + m_Layer: 5 + m_Name: Item Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1023192744 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1023192743} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1808259963} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1023192745 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1023192743} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1023192746 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1023192743} + m_CullTransparentMesh: 1 +--- !u!1 &1062946085 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2382,6 +3232,9 @@ MonoBehaviour: Provider: 3 - Button: {fileID: 1508551058} Provider: 4 + _supportedWalletsDropdown: {fileID: 540464236} + _redirectToWalletToggle: {fileID: 981405684} + _walletConnectModal: {fileID: 395689441} k__BackingField: f4bff60eb260841f46b1c77588cd8acb k__BackingField: Web3.Unity k__BackingField: unity-game @@ -2761,6 +3614,43 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 +--- !u!1 &1513683685 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1513683686} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1513683686 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1513683685} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 977353942} + m_Father: {fileID: 1934047389} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1561876540 GameObject: m_ObjectHideFlags: 0 @@ -2839,7 +3729,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1561876540} m_CullTransparentMesh: 1 ---- !u!1 &1701305866 +--- !u!1 &1583968963 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2847,29 +3737,240 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1701305867} - - component: {fileID: 1701305868} + - component: {fileID: 1583968964} + - component: {fileID: 1583968966} + - component: {fileID: 1583968965} m_Layer: 5 - m_Name: Error + m_Name: Checkmark m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &1701305867 + m_IsActive: 1 +--- !u!224 &1583968964 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1701305866} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1583968963} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 108583392} - - {fileID: 279245843} + m_Children: [] + m_Father: {fileID: 225123874} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1583968965 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1583968963} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1583968966 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1583968963} + m_CullTransparentMesh: 1 +--- !u!1 &1642196833 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1642196834} + - component: {fileID: 1642196836} + - component: {fileID: 1642196835} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1642196834 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1642196833} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 981405682} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.25, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -75, y: 0} + m_SizeDelta: {x: -150, y: -30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1642196835 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1642196833} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Redirect to Wallet + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2100000, guid: 79459efec17a4d00a321bdcc27bbc385, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294111986 + m_fontColor: {r: 0.95, g: 0.95, b: 0.95, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 17.9 + m_fontSizeBase: 20 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 8 + m_fontSizeMax: 36 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1642196836 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1642196833} + m_CullTransparentMesh: 1 +--- !u!1 &1701305866 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1701305867} + - component: {fileID: 1701305868} + m_Layer: 5 + m_Name: Error + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1701305867 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1701305866} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 108583392} + - {fileID: 279245843} m_Father: {fileID: 1880270956} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -2926,8 +4027,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.25, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchoredPosition: {x: -75, y: 0} + m_SizeDelta: {x: -150, y: -30} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &1791429091 CanvasRenderer: @@ -2960,14 +4061,14 @@ MonoBehaviour: m_text: Remember me m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2100000, guid: 79459efec17a4d00a321bdcc27bbc385, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} + rgba: 4294111986 + m_fontColor: {r: 0.95, g: 0.95, b: 0.95, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -2984,13 +4085,13 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 22 - m_fontSizeBase: 21 + m_fontSize: 17.9 + m_fontSizeBase: 20 m_fontWeight: 400 m_enableAutoSizing: 1 - m_fontSizeMin: 14 - m_fontSizeMax: 22 - m_fontStyle: 0 + m_fontSizeMin: 8 + m_fontSizeMax: 36 + m_fontStyle: 1 m_HorizontalAlignment: 1 m_VerticalAlignment: 512 m_textAlignment: 65535 @@ -3026,6 +4127,94 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &1808259962 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1808259963} + - component: {fileID: 1808259964} + m_Layer: 5 + m_Name: Item + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1808259963 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1808259962} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 562988048} + - {fileID: 1023192744} + - {fileID: 258509836} + m_Father: {fileID: 537139934} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1808259964 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1808259962} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 562988049} + toggleTransition: 1 + graphic: {fileID: 1023192745} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 --- !u!1 &1880270952 GameObject: m_ObjectHideFlags: 0 @@ -3188,9 +4377,136 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 1 + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1900245911 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1900245908} + m_CullTransparentMesh: 1 +--- !u!1 &1934047388 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1934047389} + - component: {fileID: 1934047392} + - component: {fileID: 1934047391} + - component: {fileID: 1934047390} + m_Layer: 5 + m_Name: Scrollbar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1934047389 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934047388} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1513683686} + m_Father: {fileID: 741301286} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1934047390 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934047388} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 977353943} + m_HandleRect: {fileID: 977353942} + m_Direction: 2 + m_Value: 0 + m_Size: 0.2 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1934047391 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934047388} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -3198,13 +4514,13 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1900245911 +--- !u!222 &1934047392 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1900245908} + m_GameObject: {fileID: 1934047388} m_CullTransparentMesh: 1 --- !u!1 &1993078178 GameObject: @@ -3528,6 +4844,141 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 +--- !u!1 &2033480130 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2033480131} + - component: {fileID: 2033480133} + - component: {fileID: 2033480132} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2033480131 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033480130} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 540464234} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -30, y: -30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2033480132 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033480130} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2100000, guid: 79459efec17a4d00a321bdcc27bbc385, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294111986 + m_fontColor: {r: 0.95, g: 0.95, b: 0.95, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 20 + m_fontSizeBase: 20 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 8 + m_fontSizeMax: 36 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &2033480133 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2033480130} + m_CullTransparentMesh: 1 --- !u!1 &2036998553 GameObject: m_ObjectHideFlags: 0 @@ -3560,6 +5011,8 @@ RectTransform: m_Children: - {fileID: 787012149} - {fileID: 724612375} + - {fileID: 981405682} + - {fileID: 540464234} m_Father: {fileID: 1434038408} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -3608,6 +5061,173 @@ MonoBehaviour: m_EditorClassIdentifier: m_HorizontalFit: 0 m_VerticalFit: 2 +--- !u!1 &2043937260 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2043937261} + - component: {fileID: 2043937264} + - component: {fileID: 2043937263} + - component: {fileID: 2043937262} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2043937261 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2043937260} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 537139934} + m_Father: {fileID: 741301286} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -18, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &2043937262 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2043937260} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2043937263 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2043937260} + m_CullTransparentMesh: 1 +--- !u!114 &2043937264 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2043937260} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &2045136593 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2045136594} + - component: {fileID: 2045136596} + - component: {fileID: 2045136595} + m_Layer: 5 + m_Name: Arrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2045136594 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045136593} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 540464234} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -15, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2045136595 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045136593} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2045136596 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045136593} + m_CullTransparentMesh: 1 --- !u!1001 &2114521192 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs index 42704fe2a..5bc6b9c27 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs @@ -22,6 +22,8 @@ using UnityEngine.SceneManagement; using UnityEngine.UI; using WalletConnectSharp.Core; +using WalletConnectSharp.Sign.Models; +using WalletConnectSharp.Sign.Models.Engine; namespace Scenes { @@ -53,13 +55,18 @@ public class Login : MonoBehaviour public Toggle RememberMeToggle; public ErrorPopup ErrorPopup; public List Web3AuthButtons; - public TMP_Dropdown _supportedWalletsDropdown; - + private bool useWebPageWallet; #region Wallet Connect [field: Header("Wallet Connect")] + + [SerializeField] private TMP_Dropdown _supportedWalletsDropdown; + + [SerializeField] private Toggle _redirectToWalletToggle; + + [SerializeField] private WalletConnectModal _walletConnectModal; [field: SerializeField] public string ProjectId { get; private set; } @@ -75,6 +82,8 @@ public class Login : MonoBehaviour Url = "https://chainsafe.io/" }; + private bool _redirectToWallet; + #endregion private IEnumerator Start() @@ -93,10 +102,12 @@ private IEnumerator Start() // Wallet Connect yield return FetchSupportedWallets(); -#if UNITY_IOS - InitializeWalletSelection(); -#endif - + // enable this on editor to test UI flow and functions + if (Application.isMobilePlatform || Application.isEditor) + { + InitializeMobileOptions(); + } + #if UNITY_WEBGL ProcessWeb3Auth(); #endif @@ -110,14 +121,58 @@ private IEnumerator Start() var provider = buttonAndProvider.Provider; button.onClick.AddListener(() => LoginWithWeb3Auth(provider)); } + + WalletConnectSigner.OnConnected += WalletConnected; + + WalletConnectSigner.OnSessionApproved += SessionApproved; + } + + private void OnDestroy() + { + WalletConnectSigner.OnConnected -= WalletConnected; + + WalletConnectSigner.OnSessionApproved -= SessionApproved; + } + + private void WalletConnected(ConnectedData data) + { + // already redirecting to wallet + if (_redirectToWallet) + { + return; + } + + // display QR and copy to clipboard + _walletConnectModal.WalletConnected(data); + } + + private void SessionApproved(SessionStruct session) + { + Debug.Log($"{session.Topic} Approved"); } - private void InitializeWalletSelection() + // redirect to mobile wallet and select default wallet on IOS + private void InitializeMobileOptions() { + _redirectToWalletToggle.gameObject.SetActive(true); +#if UNITY_IOS + InitializeWalletDropdown(); +#endif + } + + // add all supported wallets + private void InitializeWalletDropdown() + { + _redirectToWalletToggle.onValueChanged.AddListener(isOn => + { + _supportedWalletsDropdown.gameObject.SetActive(isOn); + }); + // first element is a no select List supportedWalletsList = new List { - "None", + // default option/unselected + "Select Wallet", }; supportedWalletsList.AddRange(_supportedWallets.Values.Select(w => w.Name)); @@ -147,15 +202,15 @@ private async void TryAutoLogin() private async void LoginWithExistingAccount() { - if (_supportedWalletsDropdown.value == 0) +#if UNITY_IOS + // can't redirect to wallet on IOS if there's no selected wallet + if (_redirectToWalletToggle.isOn && _supportedWalletsDropdown.value == 0) { // feedback Debug.LogError("Please select a Wallet first"); return; } -#if UNITY_IOS - #endif var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) @@ -291,20 +346,44 @@ private void ConfigureCommonServices(IWeb3ServiceCollection services) private WalletConnectConfig BuildWalletConnectConfig() { + WalletConnectWalletModel defaultWallet = null; + // build chain var projectConfig = ProjectConfigUtilities.Load(); ChainModel chain = new ChainModel(ChainModel.EvmNamespace, projectConfig.ChainId, projectConfig.Network); + + // allow redirection on editor for testing UI flow + _redirectToWallet = (Application.isMobilePlatform || Application.isEditor) && _redirectToWalletToggle.isOn; + +#if UNITY_IOS + // make sure there's a selected wallet on IOS + _redirectToWallet = _redirectToWallet && _supportedWalletsDropdown.value != 0; + + if (_redirectToWallet) + { + // offset for the first/default/unselected dropdown option 0 + int selectedWalletIndex = _supportedWalletsDropdown.value - 1; + + defaultWallet = _supportedWallets.Values.ToArray()[selectedWalletIndex]; + } +#endif - return new WalletConnectConfig + var config = new WalletConnectConfig { - ProjectId = ProjectId, - ProjectName = ProjectName, + ProjectId = ProjectId, + ProjectName = ProjectName, BaseContext = BaseContext, Chain = chain, - Metadata = Metadata, - SupportedWallets = _supportedWallets + Metadata = Metadata, + SupportedWallets = _supportedWallets, + RedirectToWallet = _redirectToWallet, +#if UNITY_IOS + DefaultWallet = defaultWallet +#endif }; + + return config; } private IEnumerator FetchSupportedWallets() diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs index 21be123e9..9cff96696 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/WalletConnectModal.cs @@ -1,4 +1,6 @@ +using ChainSafe.Gaming.UnityPackage; using ChainSafe.Gaming.WalletConnect; +using Scenes; using UnityEngine; using UnityEngine.UI; using WalletConnectSharp.Sign.Models; @@ -13,37 +15,14 @@ public class WalletConnectModal : MonoBehaviour [SerializeField] private Button _backButton; [SerializeField] private Transform _container; - + private void Start() { _backButton.onClick.AddListener(Disable); - - WalletConnectSigner.OnConnected += WalletConnected; - - WalletConnectSigner.OnSessionApproved += SessionApproved; } - private void OnDisable() - { - WalletConnectSigner.OnConnected -= WalletConnected; - - WalletConnectSigner.OnSessionApproved -= SessionApproved; - } - - private void WalletConnected(ConnectedData data) + public void WalletConnected(ConnectedData data) { - if (Application.isMobilePlatform) - { -#if UNITY_ANDROID - - // open wallet - Application.OpenURL(data.Uri); - -#elif UNITY_IOS - //select wallet dropdown -#endif - } - // enable display _container.gameObject.SetActive(true); @@ -54,11 +33,6 @@ private void WalletConnected(ConnectedData data) SetClipboard(uri); } - private void SessionApproved(SessionStruct session) - { - Debug.Log($"{session.Topic} Approved"); - } - private void SetClipboard(string uri) { _copyToClipboardButton.onClick.RemoveAllListeners(); From bf5d0fe3cb94a0e3510a6b322e24cc72a8557a1a Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 6 Oct 2023 20:36:23 +0300 Subject: [PATCH 046/167] Lint fix --- src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs index 219bf57cb..19e962e5c 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs @@ -26,11 +26,7 @@ namespace ChainSafe.Gaming.WalletConnect { public class WalletConnectSigner : ISigner, ILifecycleParticipant - - // , ITransactionExecutor { - private static readonly TimeSpan MinClipboardCheckPeriod = TimeSpan.FromMilliseconds(10); - private readonly IChainConfig chainConfig; private readonly WalletConnectConfig configuration; private readonly IOperatingSystemMediator operatingSystem; From 1c7f4a5de3f03727e1249f139087a24ca078a01d Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Sat, 7 Oct 2023 01:53:48 +0300 Subject: [PATCH 047/167] refactored WalletConnectSigner.cs with optimizations and removed comments --- .../Methods/EthSignMessage.cs | 2 +- .../WalletConnectSigner.cs | 218 ++++-------------- .../WalletConnectSignerExtensions.cs | 1 - 3 files changed, 46 insertions(+), 175 deletions(-) diff --git a/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignMessage.cs b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignMessage.cs index f2baa9897..cca1bfcb9 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignMessage.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignMessage.cs @@ -6,7 +6,7 @@ namespace ChainSafe.Gaming.WalletConnect.Methods { [RpcMethod("personal_sign")] - [RpcRequestOptions(Clock.ONE_MINUTE, 99998)] + [RpcRequestOptions(Clock.ONE_MINUTE, 99997)] public class EthSignMessage : List { public EthSignMessage(string message, string address) diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs index 19e962e5c..7687a5862 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs @@ -1,10 +1,7 @@ using System; using System.Linq; -using System.Text; using System.Threading.Tasks; -using ChainSafe.Gaming.Evm.Providers; using ChainSafe.Gaming.Evm.Signers; -using ChainSafe.Gaming.Evm.Transactions; using ChainSafe.Gaming.WalletConnect.Methods; using ChainSafe.Gaming.WalletConnect.Models; using ChainSafe.Gaming.Web3; @@ -27,17 +24,13 @@ namespace ChainSafe.Gaming.WalletConnect { public class WalletConnectSigner : ISigner, ILifecycleParticipant { - private readonly IChainConfig chainConfig; private readonly WalletConnectConfig configuration; private readonly IOperatingSystemMediator operatingSystem; - private readonly IRpcProvider provider; private readonly ILogWriter logWriter; - public WalletConnectSigner(IRpcProvider provider, WalletConnectConfig configuration, IOperatingSystemMediator operatingSystem, IChainConfig chainConfig, ILogWriter logWriter) + public WalletConnectSigner(WalletConnectConfig configuration, IOperatingSystemMediator operatingSystem, ILogWriter logWriter) { - this.provider = provider; this.operatingSystem = operatingSystem; - this.chainConfig = chainConfig; this.configuration = configuration; this.logWriter = logWriter; } @@ -94,10 +87,10 @@ public async ValueTask WillStartAsync() // Wallet Connect await Initialize(configuration); - Address = configuration.SavedUserAddress ?? await GetAccountVerifyUserOwns(); + Address = configuration.SavedUserAddress ?? await ConnectToWallet(); } - public async Task Initialize(WalletConnectConfig config) + private async Task Initialize(WalletConnectConfig config) { Config = config; @@ -136,7 +129,7 @@ public async Task Initialize(WalletConnectConfig config) }); } - public async Task ConnectClient() + private async Task ConnectClient() { RequiredNamespaces requiredNamespaces = new RequiredNamespaces(); @@ -223,12 +216,31 @@ public ValueTask WillStopAsync() public Task GetAddress() { + if (string.IsNullOrEmpty(Address)) + { + var addressParts = GetFullAddress().Split(":"); + + Address = addressParts[2]; + } + + if (!AddressExtensions.IsPublicAddress(Address)) + { + throw new Web3Exception( + $"Public address recovered from signature is not valid. Public address: {Address}"); + } + Address.AssertNotNull(nameof(Address)); return Task.FromResult(Address!); } - private Task Request(string topic, T data, string chainId = null, long? expiry = null) + public Task Request(T data, long? expiry = null) { + string topic = Session.Topic; + + var addressParts = GetFullAddress().Split(":"); + + string chainId = string.Join(':', addressParts.Take(2)); + string method = RpcMethodAttribute.MethodForType(); // if it's a registered method try and open wallet @@ -262,39 +274,20 @@ public async Task SignMessage(string message) return TestResponse; } - // var pageUrl = BuildUrl(); - - // Wallet connect - SessionStruct session = Session; - - var (address, chainId) = GetCurrentAddress(); - - if (string.IsNullOrWhiteSpace(address)) - { - return null; - } - - var request = new EthSignMessage(message, address); + var requestData = new EthSignMessage(message, Address); string hash = - await Request(session.Topic, request, chainId); + await Request(requestData); var isValid = ValidateResponse(hash); if (!isValid) { - throw new Web3Exception("Incorrect response format extracted from clipboard."); + throw new Web3Exception("Incorrect response format from signing."); } // TODO: log event on success return hash; - // string BuildUrl() - // { - // return $"{configuration.ServiceUrl}" + - // "?action=sign" + - // $"&message={Uri.EscapeDataString(message)}"; - // } - // TODO: validate with regex bool ValidateResponse(string response) { @@ -304,20 +297,10 @@ bool ValidateResponse(string response) public async Task SignTypedData(SerializableDomain domain, TStructType message) { - // Wallet connect - SessionStruct session = Session; - - var (address, chainId) = GetCurrentAddress(); - - if (string.IsNullOrWhiteSpace(address)) - { - return null; - } - - var request = new EthSignTypedData(address, domain, message); + var requestData = new EthSignTypedData(Address, domain, message); string hash = - await Request, string>(session.Topic, request, chainId); + await Request, string>(requestData); var isValid = ValidateResponse(hash); if (!isValid) @@ -334,145 +317,34 @@ bool ValidateResponse(string response) return hash; } - // public async Task SendTransaction(TransactionRequest transaction) - // { - // var pageUrl = BuildUrl(); - // var hash = await OpenPageWaitResponse(pageUrl, ValidateResponse); - // - // // TODO: log event on success (see example near end of file) - // return await provider.GetTransaction(hash); - // - // string BuildUrl() - // { - // var sb = new StringBuilder() - // .Append(configuration.ServiceUrl) - // .Append("?action=send"); - // - // if (transaction.ChainId != null) - // { - // sb.Append("&chainId=").Append(transaction.ChainId); - // } - // else - // { - // sb.Append("&chainId=").Append(chainConfig.ChainId); - // } - // - // if (transaction.Value != null) - // { - // sb.Append("&value=").Append(transaction.Value); - // } - // else - // { - // sb.Append("&value=").Append(0); - // } - // - // AppendStringIfNotNullOrEmtpy("to", transaction.To); - // AppendStringIfNotNullOrEmtpy("data", transaction.Data); - // AppendIfNotNull("gasLimit", transaction.GasLimit); - // AppendIfNotNull("gasPrice", transaction.GasPrice); - // - // return sb.ToString(); - // - // void AppendIfNotNull(string name, object value) - // { - // if (value != null) - // { - // sb!.Append('&').Append(name).Append('=').Append(value); - // } - // } - // - // void AppendStringIfNotNullOrEmtpy(string name, string value) - // { - // if (!string.IsNullOrEmpty(value)) - // { - // sb!.Append('&').Append(name).Append('=').Append(value); - // } - // } - // } - // - // // TODO: validate with regex - // bool ValidateResponse(string response) - // { - // return response.StartsWith("0x") && response.Length == 66; - // } - // } - private (string, string) GetCurrentAddress() + /// + /// Connect to wallet + /// + /// address of connected wallet. + private async Task ConnectToWallet() { - var currentSession = Session; + ConnectedData = await ConnectClient(); - var defaultChain = currentSession.Namespaces.Keys.FirstOrDefault(); + return await GetAddress(); + } + + private string GetFullAddress() + { + var defaultChain = Session.Namespaces.Keys.FirstOrDefault(); if (string.IsNullOrWhiteSpace(defaultChain)) { - return (null, null); + throw new Web3Exception("can't get full address, default chain not found"); } - var defaultNamespace = currentSession.Namespaces[defaultChain]; + var defaultNamespace = Session.Namespaces[defaultChain]; if (defaultNamespace.Accounts.Length == 0) { - return (null, null); - } - - var fullAddress = defaultNamespace.Accounts[0]; - var addressParts = fullAddress.Split(":"); - - var address = addressParts[2]; - var chainId = string.Join(':', addressParts.Take(2)); - - return (address, chainId); - } - - // TODO: extract hash from deeplink instead of clipboard - // private async Task OpenPageWaitResponse(string pageUrl, Func validator) - // { - // string response; - // - // if (Testing) - // { - // response = TestResponse; - // } - // else - // { - // operatingSystem.OpenUrl(pageUrl); - // operatingSystem.ClipboardContent = string.Empty; - // - // var updateDelay = GetUpdatePeriodSafe(); - // while (string.IsNullOrEmpty(operatingSystem.ClipboardContent)) - // { - // await Task.Delay(updateDelay); - // } - // - // response = operatingSystem.ClipboardContent!; - // } - // - // var validResponse = validator(response); - // if (!validResponse) - // { - // throw new Web3Exception("Incorrect response format extracted from clipboard."); - // } - // - // int GetUpdatePeriodSafe() - // { - // return (int)Math.Max(MinClipboardCheckPeriod.TotalMilliseconds, configuration.ClipboardCheckPeriod.TotalMilliseconds); - // } - // - // return response; - // } - private async Task GetAccountVerifyUserOwns() - { - // sign current time - ConnectedData = await ConnectClient(); - - var (address, _) = GetCurrentAddress(); - - if (!AddressExtensions.IsPublicAddress(address)) - { - throw new Web3Exception( - $"Public address recovered from signature is not valid. Public address: {address}"); + throw new Web3Exception("can't get full address, no connected accounts"); } - return address; + return defaultNamespace.Accounts[0]; } private async Task Disconnect() diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSignerExtensions.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSignerExtensions.cs index e4923c2cd..2dc29c784 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSignerExtensions.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSignerExtensions.cs @@ -29,7 +29,6 @@ public static IWeb3ServiceCollection UseWalletConnectSigner(this IWeb3ServiceCol public static IWeb3ServiceCollection UseWalletConnectSigner(this IWeb3ServiceCollection collection) { collection.AssertServiceNotBound(); - collection.AssertServiceNotBound(); // config collection.TryAddSingleton(DefaultConfig); From a8d60e0448a198da927fbc3ac071c070a9165a0c Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Sun, 8 Oct 2023 11:24:02 +0300 Subject: [PATCH 048/167] Changes Made + WalletConnectTransactionExecutor Implemented + WC transaction Models and Methods implemented + small fixes and refactors to Web3Accessor and Login --- .../Runtime/Scripts/Web3Accessor.cs | 13 ++-- .../Methods/EthSendTransaction.cs | 23 +++++++ .../Models/TransactionModel.cs | 28 ++++++++ .../WalletConnectTransactionExecutor.cs | 64 +++++++++++++++++++ ...letConnectTransactionExecutorExtensions.cs | 22 +++++++ .../Scripts/Scenes/Login.cs | 2 +- 6 files changed, 146 insertions(+), 6 deletions(-) create mode 100644 src/ChainSafe.Gaming.WalletConnect/Methods/EthSendTransaction.cs create mode 100644 src/ChainSafe.Gaming.WalletConnect/Models/TransactionModel.cs create mode 100644 src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs create mode 100644 src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutorExtensions.cs diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs index 5c2918b26..56576924f 100644 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs @@ -55,13 +55,16 @@ public static void Set(Web3.Web3 web3) private async void OnApplicationQuit() { - Debug.Log("Disposing Web3..."); + if (web3 != null) + { + Debug.Log("Disposing Web3..."); - // Terminate Web3 - await web3.TerminateAsync(); + // Terminate Web3 + await web3.TerminateAsync(); - // Clear the Web3 instance - web3 = null; + // Clear the Web3 instance + web3 = null; + } } } } diff --git a/src/ChainSafe.Gaming.WalletConnect/Methods/EthSendTransaction.cs b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSendTransaction.cs new file mode 100644 index 000000000..3853f7d66 --- /dev/null +++ b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSendTransaction.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using ChainSafe.Gaming.WalletConnect.Models; +using UnityEngine.Scripting; +using WalletConnectSharp.Common.Utils; +using WalletConnectSharp.Network.Models; + +namespace ChainSafe.Gaming.WalletConnect.Methods +{ + [RpcMethod("eth_sendTransaction")] + [RpcRequestOptions(Clock.ONE_MINUTE, 99999)] + public class EthSendTransaction : List + { + public EthSendTransaction(params TransactionModel[] transactions) + : base(transactions) + { + } + + [Preserve] // Needed for JSON.NET serialization + public EthSendTransaction() + { + } + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/Models/TransactionModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/TransactionModel.cs new file mode 100644 index 000000000..436beafac --- /dev/null +++ b/src/ChainSafe.Gaming.WalletConnect/Models/TransactionModel.cs @@ -0,0 +1,28 @@ +using Newtonsoft.Json; + +namespace ChainSafe.Gaming.WalletConnect.Models +{ + public class TransactionModel + { + [JsonProperty("from")] + public string From { get; set; } + + [JsonProperty("to")] + public string To { get; set; } + + [JsonProperty("gas", NullValueHandling = NullValueHandling.Ignore)] + public string Gas { get; set; } + + [JsonProperty("gasPrice", NullValueHandling = NullValueHandling.Ignore)] + public string GasPrice { get; set; } + + [JsonProperty("value")] + public string Value { get; set; } + + [JsonProperty("data", NullValueHandling = NullValueHandling.Ignore)] + public string Data { get; set; } = "0x"; + + [JsonProperty(PropertyName = "nonce")] + public string Nonce { get; set; } + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs new file mode 100644 index 000000000..1f572b6c0 --- /dev/null +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs @@ -0,0 +1,64 @@ +using System.Threading.Tasks; +using ChainSafe.Gaming.Evm.Providers; +using ChainSafe.Gaming.Evm.Signers; +using ChainSafe.Gaming.Evm.Transactions; +using ChainSafe.Gaming.WalletConnect.Methods; +using ChainSafe.Gaming.WalletConnect.Models; +using ChainSafe.Gaming.Web3; +using ChainSafe.Gaming.Web3.Core; +using ChainSafe.Gaming.Web3.Core.Evm; +using Newtonsoft.Json; +using WalletConnectSharp.Common.Logging; + +namespace ChainSafe.Gaming.WalletConnect +{ + public class WalletConnectTransactionExecutor : ITransactionExecutor, ILifecycleParticipant + { + private readonly IRpcProvider provider; + + private WalletConnectSigner signer; + + public WalletConnectTransactionExecutor(ISigner signer, IRpcProvider provider) + { + this.signer = signer as WalletConnectSigner ?? + throw new Web3Exception($"{nameof(WalletConnectTransactionExecutor)} only supports {nameof(WalletConnectSigner)}"); + + this.provider = provider; + } + + public async Task SendTransaction(TransactionRequest transaction) + { + if (string.IsNullOrEmpty(transaction.From)) + { + transaction.From = await signer.GetAddress(); + } + + EthSendTransaction requestData = new EthSendTransaction(new TransactionModel + { + From = transaction.From, + To = transaction.To, + Gas = transaction.GasLimit?.HexValue, + GasPrice = transaction.GasPrice?.HexValue, + Value = transaction.Value?.HexValue, + Data = transaction.Data, + Nonce = transaction.Nonce?.HexValue, + }); + + string hash = await signer.Request(requestData); + + // TODO replace validation with regex + if (!hash.StartsWith("0x") || hash.Length != 66) + { + throw new Web3Exception($"incorrect txn response format {hash}"); + } + + WCLogger.Log($"Transaction executed with hash {hash}"); + + return await provider.GetTransaction(hash); + } + + public ValueTask WillStartAsync() => new ValueTask(Task.CompletedTask); + + public ValueTask WillStopAsync() => new ValueTask(Task.CompletedTask); + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutorExtensions.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutorExtensions.cs new file mode 100644 index 000000000..9bb64d177 --- /dev/null +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutorExtensions.cs @@ -0,0 +1,22 @@ +using ChainSafe.Gaming.Web3.Build; +using ChainSafe.Gaming.Web3.Core; +using ChainSafe.Gaming.Web3.Core.Evm; + +namespace ChainSafe.Gaming.WalletConnect +{ + public static class WalletConnectTransactionExecutorExtensions + { + /// + /// Binds Web implementation of EVM Provider to Web3. + /// + /// The same service collection that was passed in. This enables fluent style. + public static IWeb3ServiceCollection UseWalletConnectTransactionExecutor(this IWeb3ServiceCollection collection) + { + collection.AssertServiceNotBound(); + + collection.AddSingleton(); + + return collection; + } + } +} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index 5bc6b9c27..b470a02b0 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -224,7 +224,7 @@ private async void LoginWithExistingAccount() */ if (useWebPageWallet) { - services.UseWalletConnectSigner(BuildWalletConnectConfig()); + services.UseWalletConnectSigner(BuildWalletConnectConfig()).UseWalletConnectTransactionExecutor(); } else { From 173fa396487ba966b90e1dd8e8b3e6e43ee52ad0 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Sun, 8 Oct 2023 12:39:27 +0300 Subject: [PATCH 049/167] Moved/Refactored UnityEngine.dll from ChainSafe.Gaming.WalletConnect.csproj and used link.xml for preserving types --- src/ChainSafe.Gaming.Unity/link.xml | 5 ++++- .../ChainSafe.Gaming.WalletConnect.csproj | 4 ---- .../Methods/EthSendTransaction.cs | 2 -- .../Methods/EthSignMessage.cs | 2 -- .../Methods/EthSignTypedData.cs | 8 ++------ .../{Methods/TypedData.cs => Models/TypedDataModel.cs} | 6 +++--- 6 files changed, 9 insertions(+), 18 deletions(-) rename src/ChainSafe.Gaming.WalletConnect/{Methods/TypedData.cs => Models/TypedDataModel.cs} (86%) diff --git a/src/ChainSafe.Gaming.Unity/link.xml b/src/ChainSafe.Gaming.Unity/link.xml index 54c67d26a..81afc8b8f 100644 --- a/src/ChainSafe.Gaming.Unity/link.xml +++ b/src/ChainSafe.Gaming.Unity/link.xml @@ -19,7 +19,10 @@ - + + + + diff --git a/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj b/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj index 35099463f..7f576747c 100644 --- a/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj +++ b/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj @@ -20,9 +20,5 @@ - - - - diff --git a/src/ChainSafe.Gaming.WalletConnect/Methods/EthSendTransaction.cs b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSendTransaction.cs index 3853f7d66..25c8fe51f 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Methods/EthSendTransaction.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSendTransaction.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using ChainSafe.Gaming.WalletConnect.Models; -using UnityEngine.Scripting; using WalletConnectSharp.Common.Utils; using WalletConnectSharp.Network.Models; @@ -15,7 +14,6 @@ public EthSendTransaction(params TransactionModel[] transactions) { } - [Preserve] // Needed for JSON.NET serialization public EthSendTransaction() { } diff --git a/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignMessage.cs b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignMessage.cs index cca1bfcb9..38d4ebef1 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignMessage.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignMessage.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using UnityEngine.Scripting; using WalletConnectSharp.Common.Utils; using WalletConnectSharp.Network.Models; @@ -14,7 +13,6 @@ public EthSignMessage(string message, string address) { } - [Preserve] // Needed for JSON.NET serialization public EthSignMessage() { } diff --git a/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignTypedData.cs b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignTypedData.cs index 1b1d8bc7b..84288cf78 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignTypedData.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignTypedData.cs @@ -1,9 +1,6 @@ -using System; using System.Collections.Generic; +using ChainSafe.Gaming.WalletConnect.Models; using ChainSafe.Gaming.Web3.Core.Evm; -using Nethereum.ABI.EIP712; -using Newtonsoft.Json; -using UnityEngine.Scripting; using WalletConnectSharp.Common.Utils; using WalletConnectSharp.Network.Models; @@ -17,12 +14,11 @@ public EthSignTypedData(string address, SerializableDomain domain, TStruct messa : base(new object[] { address, - new TypedData(domain, message), + new TypedDataModel(domain, message), }) { } - [Preserve] // Needed for JSON.NET serialization public EthSignTypedData() { } diff --git a/src/ChainSafe.Gaming.WalletConnect/Methods/TypedData.cs b/src/ChainSafe.Gaming.WalletConnect/Models/TypedDataModel.cs similarity index 86% rename from src/ChainSafe.Gaming.WalletConnect/Methods/TypedData.cs rename to src/ChainSafe.Gaming.WalletConnect/Models/TypedDataModel.cs index f32e14b38..b1af5237e 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Methods/TypedData.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Models/TypedDataModel.cs @@ -5,13 +5,13 @@ using Nethereum.ABI.FunctionEncoding.Attributes; using Newtonsoft.Json; -namespace ChainSafe.Gaming.WalletConnect.Methods +namespace ChainSafe.Gaming.WalletConnect.Models { [Serializable] [JsonObject(MemberSerialization.OptIn)] - public struct TypedData + public struct TypedDataModel { - public TypedData(SerializableDomain domain, TStruct message) + public TypedDataModel(SerializableDomain domain, TStruct message) { Types = MemberDescriptionFactory.GetTypesMemberDescription(typeof(SerializableDomain), typeof(TStruct)); From 982c98e7f3ec84caac09299cd3df393210aa0943 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Sun, 8 Oct 2023 12:48:01 +0300 Subject: [PATCH 050/167] replaced preserved type with namespace --- src/ChainSafe.Gaming.Unity/link.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ChainSafe.Gaming.Unity/link.xml b/src/ChainSafe.Gaming.Unity/link.xml index 81afc8b8f..c1564cc2c 100644 --- a/src/ChainSafe.Gaming.Unity/link.xml +++ b/src/ChainSafe.Gaming.Unity/link.xml @@ -21,7 +21,7 @@ - + From 635420303900a233ee75ce185899ab0a262fdea9 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 9 Oct 2023 10:31:08 +0000 Subject: [PATCH 051/167] Auto-duplicate Package Samples --- .../Samples~/Web3.Unity/Scripts/Scenes/Login.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs index 5bc6b9c27..b470a02b0 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs @@ -224,7 +224,7 @@ private async void LoginWithExistingAccount() */ if (useWebPageWallet) { - services.UseWalletConnectSigner(BuildWalletConnectConfig()); + services.UseWalletConnectSigner(BuildWalletConnectConfig()).UseWalletConnectTransactionExecutor(); } else { From 32a565311db0c3e03f2e9b9b00d7c0088e810adb Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 9 Oct 2023 14:40:36 +0300 Subject: [PATCH 052/167] Passing transaction tests --- .../io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs | 1 + src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs | 2 +- .../WalletConnectTransactionExecutor.cs | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs index d387f5356..2813ec379 100644 --- a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs +++ b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs @@ -38,6 +38,7 @@ public virtual IEnumerator Setup() services.UseRpcProvider(); services.UseWalletConnectSigner(new WalletConnectConfig { SavedUserAddress = "0x55ffe9E30347266f02b9BdAe20aD3a86493289ea" }); + services.UseWalletConnectTransactionExecutor(); //add any contracts we would want to use services.ConfigureRegisteredContracts(contracts => diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs index 7687a5862..455206ae7 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs @@ -318,7 +318,7 @@ bool ValidateResponse(string response) } /// - /// Connect to wallet + /// Connect to wallet. /// /// address of connected wallet. private async Task ConnectToWallet() diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs index 1f572b6c0..460241513 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs @@ -28,6 +28,11 @@ public WalletConnectTransactionExecutor(ISigner signer, IRpcProvider provider) public async Task SendTransaction(TransactionRequest transaction) { + if (WalletConnectSigner.Testing) + { + return await provider.GetTransaction(WalletConnectSigner.TestResponse); + } + if (string.IsNullOrEmpty(transaction.From)) { transaction.From = await signer.GetAddress(); From 5670cb5c8bb1186a82c0cd54703efde0b0efec21 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 9 Oct 2023 19:34:37 +0300 Subject: [PATCH 053/167] requested changes made --- .../UnityOperatingSystemMediator.cs | 16 ++--- .../Models/WalletConnectWalletModel.cs | 61 ++++++++++--------- .../Scenes/SampleLogin.unity | 11 ++-- .../Scripts/Scenes/Login.cs | 26 ++++---- 4 files changed, 55 insertions(+), 59 deletions(-) diff --git a/src/ChainSafe.Gaming.Unity/UnityOperatingSystemMediator.cs b/src/ChainSafe.Gaming.Unity/UnityOperatingSystemMediator.cs index fc668a54e..b6a656643 100644 --- a/src/ChainSafe.Gaming.Unity/UnityOperatingSystemMediator.cs +++ b/src/ChainSafe.Gaming.Unity/UnityOperatingSystemMediator.cs @@ -17,17 +17,13 @@ public Platform Platform return Platform.Editor; } - switch (Application.platform) + return Application.platform switch { - case RuntimePlatform.IPhonePlayer: - return Platform.IOS; - case RuntimePlatform.Android: - return Platform.Android; - case RuntimePlatform.WebGLPlayer: - return Platform.WebGL; - default: - return Platform.Desktop; - } + RuntimePlatform.IPhonePlayer => Platform.IOS, + RuntimePlatform.Android => Platform.Android, + RuntimePlatform.WebGLPlayer => Platform.WebGL, + _ => Platform.Desktop, + }; } } diff --git a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs index 29c81b51a..d33dbce4e 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs @@ -24,47 +24,48 @@ public void OpenDeeplink(ConnectedData data, IOperatingSystemMediator operatingS { string uri = string.Empty; - if (operatingSystemMediator.IsMobilePlatform) + switch (operatingSystemMediator.Platform) { - switch (operatingSystemMediator.Platform) - { - case Platform.Android: - uri = data.Uri; // Android OS should handle wc: protocol - break; + case Platform.Android: + uri = data.Uri; // Android OS should handle wc: protocol + break; - case Platform.IOS: - // on iOS, we need to use one of the wallet links - WalletLinkModel linkData = operatingSystemMediator.IsMobilePlatform ? Mobile : Desktop; + case Platform.IOS: + // on iOS, we need to use one of the wallet links + WalletLinkModel linkData = operatingSystemMediator.IsMobilePlatform ? Mobile : Desktop; - var universalUrl = useNative ? linkData.NativeProtocol : linkData.UniversalUrl; + var universalUrl = useNative ? linkData.NativeProtocol : linkData.UniversalUrl; + uri = data.Uri; + + if (!string.IsNullOrWhiteSpace(universalUrl)) + { uri = data.Uri; - if (!string.IsNullOrWhiteSpace(universalUrl)) + if (useNative) { - uri = data.Uri; - - if (useNative) - { - uri = $"{universalUrl}//{uri}"; - } - else if (universalUrl.EndsWith("/")) - { - uri = $"{universalUrl}{uri}"; - } - else - { - uri = $"{universalUrl}/{uri}"; - } + uri = $"{universalUrl}//{uri}"; } - - if (string.IsNullOrWhiteSpace(uri)) + else if (universalUrl.EndsWith("/")) + { + uri = $"{universalUrl}{uri}"; + } + else { - throw new Exception("Got empty URI when attempting to create WC deeplink"); + uri = $"{universalUrl}/{uri}"; } + } + + if (string.IsNullOrWhiteSpace(uri)) + { + throw new Exception("Got empty URI when attempting to create WC deeplink"); + } + + break; - break; - } + default: + WCLogger.LogError($"{operatingSystemMediator.Platform} Platform doesn't support deeplink"); + break; } WCLogger.Log($"Opening URL {uri}"); diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity index df4dfabf5..601542867 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity @@ -1607,7 +1607,6 @@ MonoBehaviour: _copyToClipboardButton: {fileID: 212403314} _backButton: {fileID: 1993078182} _container: {fileID: 1278821651} - _login: {fileID: 0} --- !u!1001 &452118933 PrefabInstance: m_ObjectHideFlags: 0 @@ -1895,8 +1894,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 293.8618, y: -25} - m_SizeDelta: {x: 587.7236, y: 50} + m_AnchoredPosition: {x: 295, y: -190} + m_SizeDelta: {x: 590, y: 50} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &540464235 MonoBehaviour: @@ -2946,8 +2945,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 293.8618, y: -135} - m_SizeDelta: {x: 587.7236, y: 50} + m_AnchoredPosition: {x: 295, y: -135} + m_SizeDelta: {x: 590, y: 50} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &981405683 MonoBehaviour: @@ -5020,7 +5019,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -50, y: 0} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 0.5, y: 1} --- !u!114 &2036998555 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index b470a02b0..584fbefd9 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -58,15 +58,17 @@ public class Login : MonoBehaviour private bool useWebPageWallet; + private bool redirectToWallet; + #region Wallet Connect [field: Header("Wallet Connect")] - [SerializeField] private TMP_Dropdown _supportedWalletsDropdown; + [SerializeField] private TMP_Dropdown supportedWalletsDropdown; - [SerializeField] private Toggle _redirectToWalletToggle; + [SerializeField] private Toggle redirectToWalletToggle; - [SerializeField] private WalletConnectModal _walletConnectModal; + [SerializeField] private WalletConnectModal walletConnectModal; [field: SerializeField] public string ProjectId { get; private set; } @@ -81,8 +83,6 @@ public class Login : MonoBehaviour Description = "web3.unity is an open-source gaming SDK written in C# and developed by ChainSafe Gaming. It connects games built in the Unity game engine to the blockchain. The library currently supports games built for web browsers (WebGL), iOS/Android mobile, and desktop. web3.unity is compatible with most EVM-based chains such as Ethereum, Polygon, Moonbeam, Cronos, Nervos, and Binance Smart Chain, letting developers easily choose and switch between them to create the best in-game experience.", Url = "https://chainsafe.io/" }; - - private bool _redirectToWallet; #endregion @@ -137,13 +137,13 @@ private void OnDestroy() private void WalletConnected(ConnectedData data) { // already redirecting to wallet - if (_redirectToWallet) + if (redirectToWallet) { return; } // display QR and copy to clipboard - _walletConnectModal.WalletConnected(data); + walletConnectModal.WalletConnected(data); } private void SessionApproved(SessionStruct session) @@ -154,7 +154,7 @@ private void SessionApproved(SessionStruct session) // redirect to mobile wallet and select default wallet on IOS private void InitializeMobileOptions() { - _redirectToWalletToggle.gameObject.SetActive(true); + redirectToWalletToggle.gameObject.SetActive(true); #if UNITY_IOS InitializeWalletDropdown(); #endif @@ -163,9 +163,9 @@ private void InitializeMobileOptions() // add all supported wallets private void InitializeWalletDropdown() { - _redirectToWalletToggle.onValueChanged.AddListener(isOn => + redirectToWalletToggle.onValueChanged.AddListener(isOn => { - _supportedWalletsDropdown.gameObject.SetActive(isOn); + supportedWalletsDropdown.gameObject.SetActive(isOn); }); // first element is a no select @@ -177,7 +177,7 @@ private void InitializeWalletDropdown() supportedWalletsList.AddRange(_supportedWallets.Values.Select(w => w.Name)); - _supportedWalletsDropdown.AddOptions(supportedWalletsList); + supportedWalletsDropdown.AddOptions(supportedWalletsList); } private async void TryAutoLogin() @@ -354,7 +354,7 @@ private WalletConnectConfig BuildWalletConnectConfig() ChainModel chain = new ChainModel(ChainModel.EvmNamespace, projectConfig.ChainId, projectConfig.Network); // allow redirection on editor for testing UI flow - _redirectToWallet = (Application.isMobilePlatform || Application.isEditor) && _redirectToWalletToggle.isOn; + redirectToWallet = (Application.isMobilePlatform || Application.isEditor) && redirectToWalletToggle.isOn; #if UNITY_IOS // make sure there's a selected wallet on IOS @@ -377,7 +377,7 @@ private WalletConnectConfig BuildWalletConnectConfig() Chain = chain, Metadata = Metadata, SupportedWallets = _supportedWallets, - RedirectToWallet = _redirectToWallet, + RedirectToWallet = redirectToWallet, #if UNITY_IOS DefaultWallet = defaultWallet #endif From b867f59d4b63d1a3903662a30cec231b6ef54143 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 9 Oct 2023 16:35:10 +0000 Subject: [PATCH 054/167] Auto-duplicate Package Samples --- .../Web3.Unity/Scenes/SampleLogin.unity | 11 ++++---- .../Web3.Unity/Scripts/Scenes/Login.cs | 26 +++++++++---------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity index df4dfabf5..601542867 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity @@ -1607,7 +1607,6 @@ MonoBehaviour: _copyToClipboardButton: {fileID: 212403314} _backButton: {fileID: 1993078182} _container: {fileID: 1278821651} - _login: {fileID: 0} --- !u!1001 &452118933 PrefabInstance: m_ObjectHideFlags: 0 @@ -1895,8 +1894,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 293.8618, y: -25} - m_SizeDelta: {x: 587.7236, y: 50} + m_AnchoredPosition: {x: 295, y: -190} + m_SizeDelta: {x: 590, y: 50} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &540464235 MonoBehaviour: @@ -2946,8 +2945,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 293.8618, y: -135} - m_SizeDelta: {x: 587.7236, y: 50} + m_AnchoredPosition: {x: 295, y: -135} + m_SizeDelta: {x: 590, y: 50} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &981405683 MonoBehaviour: @@ -5020,7 +5019,7 @@ RectTransform: m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -50, y: 0} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 0.5, y: 1} --- !u!114 &2036998555 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs index b470a02b0..584fbefd9 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs @@ -58,15 +58,17 @@ public class Login : MonoBehaviour private bool useWebPageWallet; + private bool redirectToWallet; + #region Wallet Connect [field: Header("Wallet Connect")] - [SerializeField] private TMP_Dropdown _supportedWalletsDropdown; + [SerializeField] private TMP_Dropdown supportedWalletsDropdown; - [SerializeField] private Toggle _redirectToWalletToggle; + [SerializeField] private Toggle redirectToWalletToggle; - [SerializeField] private WalletConnectModal _walletConnectModal; + [SerializeField] private WalletConnectModal walletConnectModal; [field: SerializeField] public string ProjectId { get; private set; } @@ -81,8 +83,6 @@ public class Login : MonoBehaviour Description = "web3.unity is an open-source gaming SDK written in C# and developed by ChainSafe Gaming. It connects games built in the Unity game engine to the blockchain. The library currently supports games built for web browsers (WebGL), iOS/Android mobile, and desktop. web3.unity is compatible with most EVM-based chains such as Ethereum, Polygon, Moonbeam, Cronos, Nervos, and Binance Smart Chain, letting developers easily choose and switch between them to create the best in-game experience.", Url = "https://chainsafe.io/" }; - - private bool _redirectToWallet; #endregion @@ -137,13 +137,13 @@ private void OnDestroy() private void WalletConnected(ConnectedData data) { // already redirecting to wallet - if (_redirectToWallet) + if (redirectToWallet) { return; } // display QR and copy to clipboard - _walletConnectModal.WalletConnected(data); + walletConnectModal.WalletConnected(data); } private void SessionApproved(SessionStruct session) @@ -154,7 +154,7 @@ private void SessionApproved(SessionStruct session) // redirect to mobile wallet and select default wallet on IOS private void InitializeMobileOptions() { - _redirectToWalletToggle.gameObject.SetActive(true); + redirectToWalletToggle.gameObject.SetActive(true); #if UNITY_IOS InitializeWalletDropdown(); #endif @@ -163,9 +163,9 @@ private void InitializeMobileOptions() // add all supported wallets private void InitializeWalletDropdown() { - _redirectToWalletToggle.onValueChanged.AddListener(isOn => + redirectToWalletToggle.onValueChanged.AddListener(isOn => { - _supportedWalletsDropdown.gameObject.SetActive(isOn); + supportedWalletsDropdown.gameObject.SetActive(isOn); }); // first element is a no select @@ -177,7 +177,7 @@ private void InitializeWalletDropdown() supportedWalletsList.AddRange(_supportedWallets.Values.Select(w => w.Name)); - _supportedWalletsDropdown.AddOptions(supportedWalletsList); + supportedWalletsDropdown.AddOptions(supportedWalletsList); } private async void TryAutoLogin() @@ -354,7 +354,7 @@ private WalletConnectConfig BuildWalletConnectConfig() ChainModel chain = new ChainModel(ChainModel.EvmNamespace, projectConfig.ChainId, projectConfig.Network); // allow redirection on editor for testing UI flow - _redirectToWallet = (Application.isMobilePlatform || Application.isEditor) && _redirectToWalletToggle.isOn; + redirectToWallet = (Application.isMobilePlatform || Application.isEditor) && redirectToWalletToggle.isOn; #if UNITY_IOS // make sure there's a selected wallet on IOS @@ -377,7 +377,7 @@ private WalletConnectConfig BuildWalletConnectConfig() Chain = chain, Metadata = Metadata, SupportedWallets = _supportedWallets, - RedirectToWallet = _redirectToWallet, + RedirectToWallet = redirectToWallet, #if UNITY_IOS DefaultWallet = defaultWallet #endif From 9c94d637a4b7ebde84477cc5d95775bf8652e862 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 10 Oct 2023 14:30:01 +0300 Subject: [PATCH 055/167] made more requested changes --- .../Tests/Runtime/MiscTests.cs | 29 +++-- .../Tests/Runtime/SampleTestsBase.cs | 20 ++-- .../WalletConnectConfig.cs | 24 +++++ .../WalletConnectSigner.cs | 100 ++++++------------ .../WalletConnectTransactionExecutor.cs | 12 ++- .../Scripts/Scenes/Login.cs | 64 ++++++----- 6 files changed, 133 insertions(+), 116 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs b/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs index e49dd450b..13a019903 100644 --- a/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs +++ b/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs @@ -1,7 +1,6 @@ using System.Collections; using System.Collections.Generic; using System.Numerics; -using ChainSafe.Gaming.WalletConnect; using NUnit.Framework; using UnityEngine; using UnityEngine.TestTools; @@ -58,13 +57,13 @@ public override IEnumerator Setup() { yield return base.Setup(); - _sample = new UnsortedSample(Web3Result); + _sample = new UnsortedSample(web3Result); } [UnityTest] public IEnumerator TestContractSend() { - WalletConnectSigner.TestResponse = "0x9de3bb69db4bd93babef923f5da1f53cdb287d9ebab9b4177ba2fb25e6a09225"; + config.TestResponse = "0x9de3bb69db4bd93babef923f5da1f53cdb287d9ebab9b4177ba2fb25e6a09225"; var sendContract = _sample.ContractSend(ContractSendMethodName, Abi, ContractAddress); @@ -127,7 +126,7 @@ public IEnumerator TestGetGasPrice() [UnityTest] public IEnumerator TestGetGasNonce() { - WalletConnectSigner.TestResponse = "0x527fcd7356738389d29a96342b5fba92ab1348b744409d5bf4ce0ca2fbc2f25e"; + config.TestResponse = "0x527fcd7356738389d29a96342b5fba92ab1348b744409d5bf4ce0ca2fbc2f25e"; var getGasNonce = _sample.GetNonce(); @@ -140,7 +139,7 @@ public IEnumerator TestGetGasNonce() [UnityTest] public IEnumerator TestTransactionStatus() { - WalletConnectSigner.TestResponse = "0x1e989dbcc43e078b19ea8ea201af195e74397b494b7acd4afcca67e65e5c3339"; + config.TestResponse = "0x1e989dbcc43e078b19ea8ea201af195e74397b494b7acd4afcca67e65e5c3339"; var getTransactionStatus = _sample.GetTransactionStatus(); @@ -153,7 +152,7 @@ public IEnumerator TestTransactionStatus() [UnityTest] public IEnumerator TestMint721() { - WalletConnectSigner.TestResponse = "0xa9f953f9845e7d49d778d6fed622d566daf09e8e1c793297c7cab54782e1aae9"; + config.TestResponse = "0xa9f953f9845e7d49d778d6fed622d566daf09e8e1c793297c7cab54782e1aae9"; var mint721 = _sample.Mint721(Mint721Abi, Mint721Address, MintUri); @@ -179,7 +178,7 @@ public IEnumerator TestUseRegisteredContract() [UnityTest] public IEnumerator TestSendArray() { - WalletConnectSigner.TestResponse = "0x6a33280f3b2b907da613b18b09f863cd835f1977a4131001ace5602899fc98c7"; + config.TestResponse = "0x6a33280f3b2b907da613b18b09f863cd835f1977a4131001ace5602899fc98c7"; var sendArray = _sample.SendArray(SendArrayMethodName, SendArrayAbi, SendArrayAddress, ArrayToSend.ToArray()); @@ -193,7 +192,7 @@ public IEnumerator TestSendArray() [UnityTest] public IEnumerator TestSendTransaction() { - WalletConnectSigner.TestResponse = "0xa60bef1df91bedcd2f3f79e6609716ef245fd1202d66c6e35694b43529bf2e71"; + config.TestResponse = "0xa60bef1df91bedcd2f3f79e6609716ef245fd1202d66c6e35694b43529bf2e71"; var sendTransaction = _sample.SendTransaction(SendToAddress); @@ -201,7 +200,7 @@ public IEnumerator TestSendTransaction() Assert.IsTrue(sendTransaction.IsCompletedSuccessfully); - Assert.AreEqual(sendTransaction.Result, WalletConnectSigner.TestResponse); + Assert.AreEqual(sendTransaction.Result, config.TestResponse); } [UnityTest] @@ -217,7 +216,7 @@ public IEnumerator TestSha3() [UnityTest] public IEnumerator TestSignMessage() { - WalletConnectSigner.TestResponse = + config.TestResponse = "0x87dfaa646f476ca53ba8b6e8d122839571e52866be0984ec0497617ad3e988b7401c6b816858df27625166cb98a688f99ba92fa593da3c86c78b19c78c1f51cc1c"; var signMessage = _sample.SignMessage("The right man in the wrong place can make all the difference in the world."); @@ -226,13 +225,13 @@ public IEnumerator TestSignMessage() Assert.IsTrue(signMessage.IsCompletedSuccessfully); - Assert.AreEqual(signMessage.Result, WalletConnectSigner.TestResponse); + Assert.AreEqual(signMessage.Result, config.TestResponse); } [UnityTest] public IEnumerator TestSignVerify() { - WalletConnectSigner.TestResponse = + config.TestResponse = "0x5c996d43c2e804a0d0de7f8b07cc660bbae638aa7ea137df6156621abe5e1fbb1727ebb06f7e0067537cb0f942825fa15ead9dea6d74e4d17fa6e69007cb59561c"; var signVerify = _sample.SignVerify("A man chooses, a slave obeys."); @@ -247,7 +246,7 @@ public IEnumerator TestSignVerify() [UnityTest] public IEnumerator TestTransferErc20() { - WalletConnectSigner.TestResponse = "0xba90b6fb8cbee5fd0ad423cc74bb4a365bb88b260601933aac86b947945c5465"; + config.TestResponse = "0xba90b6fb8cbee5fd0ad423cc74bb4a365bb88b260601933aac86b947945c5465"; var transferErc20 = _sample.TransferErc20(TransferErc20ContractAddress, SendToAddress, "1000000000000000"); @@ -261,7 +260,7 @@ public IEnumerator TestTransferErc20() [UnityTest] public IEnumerator TestTransferErc721() { - WalletConnectSigner.TestResponse = "0x0e292ae8c5ab005d87581f32fd791e1b18b0cfa944d6877b41edbdb740ee8586"; + config.TestResponse = "0x0e292ae8c5ab005d87581f32fd791e1b18b0cfa944d6877b41edbdb740ee8586"; var transferErc721 = _sample.TransferErc721(TransferErc721ContractAddress, SendToAddress, 0); @@ -275,7 +274,7 @@ public IEnumerator TestTransferErc721() [UnityTest] public IEnumerator TestTransferErc1155() { - WalletConnectSigner.TestResponse = "0xb018a043ac0affe05159a53daa8656dbbad61c839eaf89622d7813226f222876"; + config.TestResponse = "0xb018a043ac0affe05159a53daa8656dbbad61c839eaf89622d7813226f222876"; var transferErc1155 = _sample.TransferErc1155(TransferErc1155ContractAddress, 101, 1, SendToAddress); diff --git a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs index 2813ec379..d7159dcde 100644 --- a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs +++ b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs @@ -12,7 +12,9 @@ public class SampleTestsBase { - protected Web3 Web3Result; + protected Web3 web3Result; + + protected WalletConnectConfig config; [UnitySetUp] public virtual IEnumerator Setup() @@ -20,9 +22,6 @@ public virtual IEnumerator Setup() // wait for some time to initialize yield return new WaitForSeconds(5f); - // set wallet to testing - WalletConnectSigner.Testing = true; - // For whatever reason, in github this won't load var projectConfigScriptableObject = ProjectConfigUtilities.Load(); if (projectConfigScriptableObject == null) @@ -37,7 +36,14 @@ public virtual IEnumerator Setup() services.UseGelato("_UzPz_Yk_WTjWMfcl45fLvQNGQ9ISx5ZE8TnwnVKYrE_"); services.UseRpcProvider(); - services.UseWalletConnectSigner(new WalletConnectConfig { SavedUserAddress = "0x55ffe9E30347266f02b9BdAe20aD3a86493289ea" }); + config = new WalletConnectConfig + { + SavedUserAddress = "0x55ffe9E30347266f02b9BdAe20aD3a86493289ea", + // set wallet to testing + Testing = true, + }; + + services.UseWalletConnectSigner(config); services.UseWalletConnectTransactionExecutor(); //add any contracts we would want to use @@ -53,13 +59,13 @@ public virtual IEnumerator Setup() //wait until for async task to finish yield return new WaitUntil(() => buildWeb3.IsCompleted); - Web3Result = buildWeb3.Result; + web3Result = buildWeb3.Result; } [UnityTearDown] public virtual IEnumerator TearDown() { - WalletConnectSigner.Testing = false; + config.Testing = false; yield return null; } diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs index 4f7915a37..a9e37c48c 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs @@ -2,12 +2,22 @@ using System.Collections.Generic; using ChainSafe.Gaming.WalletConnect.Models; using WalletConnectSharp.Core; +using WalletConnectSharp.Sign.Models; +using WalletConnectSharp.Sign.Models.Engine; namespace ChainSafe.Gaming.WalletConnect { [Serializable] public class WalletConnectConfig { + public delegate void Connected(ConnectedData connectedData); + + public delegate void SessionApproved(SessionStruct session); + + public event Connected OnConnected; + + public event SessionApproved OnSessionApproved; + public string SavedUserAddress { get; set; } = null; public string ProjectId { get; set; } @@ -25,5 +35,19 @@ public class WalletConnectConfig public WalletConnectWalletModel DefaultWallet { get; set; } public Dictionary SupportedWallets { get; set; } + + public bool Testing { get; set; } = false; + + public string TestResponse { get; set; } = string.Empty; + + public void InvokeConnected(ConnectedData connectedData) + { + OnConnected?.Invoke(connectedData); + } + + public void InvokeSessionApproved(SessionStruct session) + { + OnSessionApproved?.Invoke(session); + } } } \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs index 455206ae7..b2d051b69 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs @@ -24,76 +24,48 @@ namespace ChainSafe.Gaming.WalletConnect { public class WalletConnectSigner : ISigner, ILifecycleParticipant { - private readonly WalletConnectConfig configuration; private readonly IOperatingSystemMediator operatingSystem; private readonly ILogWriter logWriter; + private readonly WalletConnectConfig config; - public WalletConnectSigner(WalletConnectConfig configuration, IOperatingSystemMediator operatingSystem, ILogWriter logWriter) + public WalletConnectSigner(WalletConnectConfig config, IOperatingSystemMediator operatingSystem, ILogWriter logWriter) { this.operatingSystem = operatingSystem; - this.configuration = configuration; + this.config = config; this.logWriter = logWriter; } - public delegate string ConnectMessageBuildDelegate(DateTime expirationTime); - - public delegate void Connected(ConnectedData connectedData); - - public delegate void SessionApproved(SessionStruct session); - - public static event Connected OnConnected; - - public static event SessionApproved OnSessionApproved; - - public static bool Testing { get; set; } = false; - - public static string TestResponse { get; set; } = string.Empty; - // static to not destroy client session on logout/TerminateAsync, just disconnect instead public static WalletConnectSignClient SignClient { get; private set; } public WalletConnectCore Core { get; private set; } - public SessionStruct Session => SignClient.Session.Get(SignClient.Session.Keys[0]); - - public WalletConnectConfig Config { get; private set; } + public SessionStruct Session { get; private set; } public ConnectedData ConnectedData { get; private set; } public string Address { get; private set; } - private static void InvokeConnected(ConnectedData connectedData) - { - OnConnected?.Invoke(connectedData); - } - - private static void InvokeSessionApproved(SessionStruct session) - { - OnSessionApproved?.Invoke(session); - } - public async ValueTask WillStartAsync() { - configuration.SavedUserAddress?.AssertIsPublicAddress(nameof(configuration.SavedUserAddress)); + config.SavedUserAddress?.AssertIsPublicAddress(nameof(config.SavedUserAddress)); // if testing just don't initialize wallet connect - if (Testing) + if (config.Testing) { - Address = configuration.SavedUserAddress; + Address = config.SavedUserAddress; return; } // Wallet Connect - await Initialize(configuration); + await Initialize(); - Address = configuration.SavedUserAddress ?? await ConnectToWallet(); + Address = config.SavedUserAddress ?? await ConnectToWallet(); } - private async Task Initialize(WalletConnectConfig config) + private async Task Initialize() { - Config = config; - if (SignClient != null) { Core = (WalletConnectCore)SignClient.Core; @@ -110,21 +82,21 @@ private async Task Initialize(WalletConnectConfig config) Core = new WalletConnectCore(new CoreOptions() { - Name = Config.ProjectName, - ProjectId = Config.ProjectId, + Name = config.ProjectName, + ProjectId = config.ProjectId, Storage = new InMemoryStorage(), - BaseContext = Config.BaseContext, + BaseContext = config.BaseContext, }); await Core.Start(); SignClient = await WalletConnectSignClient.Init(new SignClientOptions() { - BaseContext = Config.BaseContext, + BaseContext = config.BaseContext, Core = Core, - Metadata = Config.Metadata, - Name = Config.ProjectName, - ProjectId = Config.ProjectId, + Metadata = config.Metadata, + Name = config.ProjectName, + ProjectId = config.ProjectId, Storage = Core.Storage, }); } @@ -146,7 +118,7 @@ private async Task ConnectClient() { Chains = new string[] { - Config.Chain.FullChainId, + config.Chain.FullChainId, }, Events = events, Methods = methods, @@ -158,14 +130,14 @@ private async Task ConnectClient() RequiredNamespaces = requiredNamespaces, }); - InvokeConnected(connectData); + config.InvokeConnected(connectData); // open deeplink to redirect to wallet for connection - if (Config.RedirectToWallet) + if (config.RedirectToWallet) { - if (Config.DefaultWallet != null) + if (config.DefaultWallet != null) { - Config.DefaultWallet.OpenDeeplink(connectData, operatingSystem); + config.DefaultWallet.OpenDeeplink(connectData, operatingSystem); } else { @@ -173,14 +145,14 @@ private async Task ConnectClient() } } - SessionStruct sessionResult = await connectData.Approval; + Session = await connectData.Approval; - InvokeSessionApproved(sessionResult); + config.InvokeSessionApproved(Session); // get default wallet - if (Config.RedirectToWallet && Config.DefaultWallet == null) + if (config.RedirectToWallet && config.DefaultWallet == null) { - string nativeUrl = sessionResult.Peer.Metadata.Redirect.Native.Replace("//", string.Empty); + string nativeUrl = Session.Peer.Metadata.Redirect.Native.Replace("//", string.Empty); int index = nativeUrl.IndexOf(':'); @@ -191,12 +163,12 @@ private async Task ConnectClient() WCLogger.Log($"Wallet Native Url {nativeUrl}"); - var defaultWallet = Config.SupportedWallets.Values.FirstOrDefault(w => + var defaultWallet = config.SupportedWallets.Values.FirstOrDefault(w => w.Mobile.NativeProtocol == nativeUrl || w.Desktop.NativeProtocol == nativeUrl); if (defaultWallet != null) { - Config.DefaultWallet = defaultWallet; + config.DefaultWallet = defaultWallet; WCLogger.Log("Default Wallet Set"); } @@ -230,6 +202,7 @@ public Task GetAddress() } Address.AssertNotNull(nameof(Address)); + return Task.FromResult(Address!); } @@ -251,11 +224,11 @@ public Task Request(T data, long? expiry = null) (_, _) => { // if default wallet exists and redirect is true redirect user to default wallet - if (Config.RedirectToWallet && Config.DefaultWallet != null) + if (config.RedirectToWallet && config.DefaultWallet != null) { WCLogger.Log("Opening Default Wallet..."); - Config.DefaultWallet.OpenWallet(operatingSystem); + config.DefaultWallet.OpenWallet(operatingSystem); } else { @@ -269,9 +242,9 @@ public Task Request(T data, long? expiry = null) public async Task SignMessage(string message) { - if (Testing) + if (config.Testing) { - return TestResponse; + return config.TestResponse; } var requestData = new EthSignMessage(message, Address); @@ -317,10 +290,7 @@ bool ValidateResponse(string response) return hash; } - /// - /// Connect to wallet. - /// - /// address of connected wallet. + // Connect to wallet and return address of connected wallet. private async Task ConnectToWallet() { ConnectedData = await ConnectClient(); @@ -351,7 +321,7 @@ private async Task Disconnect() { try { - configuration.SavedUserAddress = null; + config.SavedUserAddress = null; await SignClient.Disconnect(Session.Topic, Error.FromErrorType(ErrorType.USER_DISCONNECTED)); } diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs index 460241513..0e91a1a92 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs @@ -16,21 +16,25 @@ public class WalletConnectTransactionExecutor : ITransactionExecutor, ILifecycle { private readonly IRpcProvider provider; - private WalletConnectSigner signer; + private readonly WalletConnectSigner signer; - public WalletConnectTransactionExecutor(ISigner signer, IRpcProvider provider) + private readonly WalletConnectConfig config; + + public WalletConnectTransactionExecutor(WalletConnectConfig config, ISigner signer, IRpcProvider provider) { this.signer = signer as WalletConnectSigner ?? throw new Web3Exception($"{nameof(WalletConnectTransactionExecutor)} only supports {nameof(WalletConnectSigner)}"); this.provider = provider; + + this.config = config; } public async Task SendTransaction(TransactionRequest transaction) { - if (WalletConnectSigner.Testing) + if (config.Testing) { - return await provider.GetTransaction(WalletConnectSigner.TestResponse); + return await provider.GetTransaction(config.TestResponse); } if (string.IsNullOrEmpty(transaction.From)) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index 584fbefd9..dcd54975b 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -56,12 +56,16 @@ public class Login : MonoBehaviour public ErrorPopup ErrorPopup; public List Web3AuthButtons; - private bool useWebPageWallet; + private bool useWalletConnect; private bool redirectToWallet; + private Dictionary supportedWallets; + #region Wallet Connect + private WalletConnectConfig walletConnectConfig; + [field: Header("Wallet Connect")] [SerializeField] private TMP_Dropdown supportedWalletsDropdown; @@ -94,10 +98,10 @@ private IEnumerator Start() Assert.IsNotNull(ExistingWalletButton); Assert.IsNotNull(RememberMeToggle); - useWebPageWallet = Application.platform != RuntimePlatform.WebGLPlayer; + useWalletConnect = Application.platform != RuntimePlatform.WebGLPlayer; // Remember me only works with the WebPageWallet - RememberMeToggle.gameObject.SetActive(useWebPageWallet); + RememberMeToggle.gameObject.SetActive(useWalletConnect); // Wallet Connect yield return FetchSupportedWallets(); @@ -121,17 +125,16 @@ private IEnumerator Start() var provider = buttonAndProvider.Provider; button.onClick.AddListener(() => LoginWithWeb3Auth(provider)); } - - WalletConnectSigner.OnConnected += WalletConnected; - - WalletConnectSigner.OnSessionApproved += SessionApproved; } private void OnDestroy() { - WalletConnectSigner.OnConnected -= WalletConnected; + if (walletConnectConfig != null) + { + walletConnectConfig.OnConnected -= WalletConnected; - WalletConnectSigner.OnSessionApproved -= SessionApproved; + walletConnectConfig.OnSessionApproved -= SessionApproved; + } } private void WalletConnected(ConnectedData data) @@ -175,14 +178,14 @@ private void InitializeWalletDropdown() "Select Wallet", }; - supportedWalletsList.AddRange(_supportedWallets.Values.Select(w => w.Name)); + supportedWalletsList.AddRange(supportedWallets.Values.Select(w => w.Name)); supportedWalletsDropdown.AddOptions(supportedWalletsList); } private async void TryAutoLogin() { - if (!useWebPageWallet) + if (!useWalletConnect) return; var savedAccount = PlayerPrefs.GetString(PlayerAccountKey); @@ -204,7 +207,7 @@ private async void LoginWithExistingAccount() { #if UNITY_IOS // can't redirect to wallet on IOS if there's no selected wallet - if (_redirectToWalletToggle.isOn && _supportedWalletsDropdown.value == 0) + if (redirectToWalletToggle.isOn && supportedWalletsDropdown.value == 0) { // feedback Debug.LogError("Please select a Wallet first"); @@ -222,7 +225,7 @@ private async void LoginWithExistingAccount() * inside WebGL, so the choice can be automated here * by looking at the platform we're running on. */ - if (useWebPageWallet) + if (useWalletConnect) { services.UseWalletConnectSigner(BuildWalletConnectConfig()).UseWalletConnectTransactionExecutor(); } @@ -234,7 +237,7 @@ private async void LoginWithExistingAccount() await ProcessLogin(web3Builder); - if (useWebPageWallet && RememberMeToggle.isOn) + if (useWalletConnect && RememberMeToggle.isOn) { PlayerPrefs.SetString(PlayerAccountKey, await Web3Accessor.Web3.Signer.GetAddress()); } @@ -342,12 +345,8 @@ private void ConfigureCommonServices(IWeb3ServiceCollection services) #region Wallet Connect - private Dictionary _supportedWallets; - private WalletConnectConfig BuildWalletConnectConfig() { - WalletConnectWalletModel defaultWallet = null; - // build chain var projectConfig = ProjectConfigUtilities.Load(); @@ -357,15 +356,17 @@ private WalletConnectConfig BuildWalletConnectConfig() redirectToWallet = (Application.isMobilePlatform || Application.isEditor) && redirectToWalletToggle.isOn; #if UNITY_IOS + WalletConnectWalletModel defaultWallet = null; + // make sure there's a selected wallet on IOS - _redirectToWallet = _redirectToWallet && _supportedWalletsDropdown.value != 0; + redirectToWallet = redirectToWallet && supportedWalletsDropdown.value != 0; - if (_redirectToWallet) + if (redirectToWallet) { // offset for the first/default/unselected dropdown option 0 - int selectedWalletIndex = _supportedWalletsDropdown.value - 1; + int selectedWalletIndex = supportedWalletsDropdown.value - 1; - defaultWallet = _supportedWallets.Values.ToArray()[selectedWalletIndex]; + defaultWallet = supportedWallets.Values.ToArray()[selectedWalletIndex]; } #endif @@ -376,12 +377,25 @@ private WalletConnectConfig BuildWalletConnectConfig() BaseContext = BaseContext, Chain = chain, Metadata = Metadata, - SupportedWallets = _supportedWallets, + SupportedWallets = supportedWallets, RedirectToWallet = redirectToWallet, #if UNITY_IOS DefaultWallet = defaultWallet #endif }; + + if (walletConnectConfig != null) + { + walletConnectConfig.OnConnected -= WalletConnected; + + walletConnectConfig.OnSessionApproved -= SessionApproved; + } + + walletConnectConfig = config; + + walletConnectConfig.OnConnected += WalletConnected; + + walletConnectConfig.OnSessionApproved += SessionApproved; return config; } @@ -404,10 +418,10 @@ private IEnumerator FetchSupportedWallets() { var json = webRequest.downloadHandler.text; - _supportedWallets = JsonConvert.DeserializeObject>(json) + supportedWallets = JsonConvert.DeserializeObject>(json) .ToDictionary(w => w.Key, w => (WalletConnectWalletModel) w.Value); - Debug.Log($"Fetched {_supportedWallets.Count} Supported Wallets."); + Debug.Log($"Fetched {supportedWallets.Count} Supported Wallets."); } } } From 889aba4acd75515aeb705d467d2719fc184b69d3 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 10 Oct 2023 11:44:29 +0000 Subject: [PATCH 056/167] Auto-duplicate Package Samples --- .../Web3.Unity/Scripts/Scenes/Login.cs | 64 +++++++++++-------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs index 584fbefd9..dcd54975b 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs @@ -56,12 +56,16 @@ public class Login : MonoBehaviour public ErrorPopup ErrorPopup; public List Web3AuthButtons; - private bool useWebPageWallet; + private bool useWalletConnect; private bool redirectToWallet; + private Dictionary supportedWallets; + #region Wallet Connect + private WalletConnectConfig walletConnectConfig; + [field: Header("Wallet Connect")] [SerializeField] private TMP_Dropdown supportedWalletsDropdown; @@ -94,10 +98,10 @@ private IEnumerator Start() Assert.IsNotNull(ExistingWalletButton); Assert.IsNotNull(RememberMeToggle); - useWebPageWallet = Application.platform != RuntimePlatform.WebGLPlayer; + useWalletConnect = Application.platform != RuntimePlatform.WebGLPlayer; // Remember me only works with the WebPageWallet - RememberMeToggle.gameObject.SetActive(useWebPageWallet); + RememberMeToggle.gameObject.SetActive(useWalletConnect); // Wallet Connect yield return FetchSupportedWallets(); @@ -121,17 +125,16 @@ private IEnumerator Start() var provider = buttonAndProvider.Provider; button.onClick.AddListener(() => LoginWithWeb3Auth(provider)); } - - WalletConnectSigner.OnConnected += WalletConnected; - - WalletConnectSigner.OnSessionApproved += SessionApproved; } private void OnDestroy() { - WalletConnectSigner.OnConnected -= WalletConnected; + if (walletConnectConfig != null) + { + walletConnectConfig.OnConnected -= WalletConnected; - WalletConnectSigner.OnSessionApproved -= SessionApproved; + walletConnectConfig.OnSessionApproved -= SessionApproved; + } } private void WalletConnected(ConnectedData data) @@ -175,14 +178,14 @@ private void InitializeWalletDropdown() "Select Wallet", }; - supportedWalletsList.AddRange(_supportedWallets.Values.Select(w => w.Name)); + supportedWalletsList.AddRange(supportedWallets.Values.Select(w => w.Name)); supportedWalletsDropdown.AddOptions(supportedWalletsList); } private async void TryAutoLogin() { - if (!useWebPageWallet) + if (!useWalletConnect) return; var savedAccount = PlayerPrefs.GetString(PlayerAccountKey); @@ -204,7 +207,7 @@ private async void LoginWithExistingAccount() { #if UNITY_IOS // can't redirect to wallet on IOS if there's no selected wallet - if (_redirectToWalletToggle.isOn && _supportedWalletsDropdown.value == 0) + if (redirectToWalletToggle.isOn && supportedWalletsDropdown.value == 0) { // feedback Debug.LogError("Please select a Wallet first"); @@ -222,7 +225,7 @@ private async void LoginWithExistingAccount() * inside WebGL, so the choice can be automated here * by looking at the platform we're running on. */ - if (useWebPageWallet) + if (useWalletConnect) { services.UseWalletConnectSigner(BuildWalletConnectConfig()).UseWalletConnectTransactionExecutor(); } @@ -234,7 +237,7 @@ private async void LoginWithExistingAccount() await ProcessLogin(web3Builder); - if (useWebPageWallet && RememberMeToggle.isOn) + if (useWalletConnect && RememberMeToggle.isOn) { PlayerPrefs.SetString(PlayerAccountKey, await Web3Accessor.Web3.Signer.GetAddress()); } @@ -342,12 +345,8 @@ private void ConfigureCommonServices(IWeb3ServiceCollection services) #region Wallet Connect - private Dictionary _supportedWallets; - private WalletConnectConfig BuildWalletConnectConfig() { - WalletConnectWalletModel defaultWallet = null; - // build chain var projectConfig = ProjectConfigUtilities.Load(); @@ -357,15 +356,17 @@ private WalletConnectConfig BuildWalletConnectConfig() redirectToWallet = (Application.isMobilePlatform || Application.isEditor) && redirectToWalletToggle.isOn; #if UNITY_IOS + WalletConnectWalletModel defaultWallet = null; + // make sure there's a selected wallet on IOS - _redirectToWallet = _redirectToWallet && _supportedWalletsDropdown.value != 0; + redirectToWallet = redirectToWallet && supportedWalletsDropdown.value != 0; - if (_redirectToWallet) + if (redirectToWallet) { // offset for the first/default/unselected dropdown option 0 - int selectedWalletIndex = _supportedWalletsDropdown.value - 1; + int selectedWalletIndex = supportedWalletsDropdown.value - 1; - defaultWallet = _supportedWallets.Values.ToArray()[selectedWalletIndex]; + defaultWallet = supportedWallets.Values.ToArray()[selectedWalletIndex]; } #endif @@ -376,12 +377,25 @@ private WalletConnectConfig BuildWalletConnectConfig() BaseContext = BaseContext, Chain = chain, Metadata = Metadata, - SupportedWallets = _supportedWallets, + SupportedWallets = supportedWallets, RedirectToWallet = redirectToWallet, #if UNITY_IOS DefaultWallet = defaultWallet #endif }; + + if (walletConnectConfig != null) + { + walletConnectConfig.OnConnected -= WalletConnected; + + walletConnectConfig.OnSessionApproved -= SessionApproved; + } + + walletConnectConfig = config; + + walletConnectConfig.OnConnected += WalletConnected; + + walletConnectConfig.OnSessionApproved += SessionApproved; return config; } @@ -404,10 +418,10 @@ private IEnumerator FetchSupportedWallets() { var json = webRequest.downloadHandler.text; - _supportedWallets = JsonConvert.DeserializeObject>(json) + supportedWallets = JsonConvert.DeserializeObject>(json) .ToDictionary(w => w.Key, w => (WalletConnectWalletModel) w.Value); - Debug.Log($"Fetched {_supportedWallets.Count} Supported Wallets."); + Debug.Log($"Fetched {supportedWallets.Count} Supported Wallets."); } } } From e82bfb88cd0d96d94d06dd92baaa7756fcb0d01e Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 10 Oct 2023 16:44:45 +0300 Subject: [PATCH 057/167] signTransaction implemented --- .../Methods/EthSignTransaction.cs | 21 ++++++++++++ .../Models/TransactionModel.cs | 8 ++--- .../WalletConnectSigner.cs | 32 +++++++++++++++++++ .../WalletConnectTransactionExecutor.cs | 2 +- .../Scenes/SampleLogin.unity | 6 ++-- 5 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 src/ChainSafe.Gaming.WalletConnect/Methods/EthSignTransaction.cs diff --git a/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignTransaction.cs b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignTransaction.cs new file mode 100644 index 000000000..3afc6e41f --- /dev/null +++ b/src/ChainSafe.Gaming.WalletConnect/Methods/EthSignTransaction.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using ChainSafe.Gaming.WalletConnect.Models; +using WalletConnectSharp.Common.Utils; +using WalletConnectSharp.Network.Models; + +namespace ChainSafe.Gaming.WalletConnect.Methods +{ + [RpcMethod("eth_signTransaction")] + [RpcRequestOptions(Clock.ONE_MINUTE, 99996)] + public class EthSignTransaction : List + { + public EthSignTransaction(params TransactionModel[] transactions) + : base(transactions) + { + } + + public EthSignTransaction() + { + } + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/Models/TransactionModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/TransactionModel.cs index 436beafac..1d5fbec72 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Models/TransactionModel.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Models/TransactionModel.cs @@ -16,13 +16,13 @@ public class TransactionModel [JsonProperty("gasPrice", NullValueHandling = NullValueHandling.Ignore)] public string GasPrice { get; set; } - [JsonProperty("value")] + [JsonProperty("value", NullValueHandling = NullValueHandling.Ignore)] public string Value { get; set; } - [JsonProperty("data", NullValueHandling = NullValueHandling.Ignore)] - public string Data { get; set; } = "0x"; + [JsonProperty("data")] + public string Data { get; set; } - [JsonProperty(PropertyName = "nonce")] + [JsonProperty("nonce", NullValueHandling = NullValueHandling.Ignore)] public string Nonce { get; set; } } } \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs index b2d051b69..c0075d23a 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Threading.Tasks; using ChainSafe.Gaming.Evm.Signers; +using ChainSafe.Gaming.Evm.Transactions; using ChainSafe.Gaming.WalletConnect.Methods; using ChainSafe.Gaming.WalletConnect.Models; using ChainSafe.Gaming.Web3; @@ -240,6 +241,37 @@ public Task Request(T data, long? expiry = null) return SignClient.Request(topic, data, chainId, expiry); } + public async Task SignTransaction(TransactionRequest transaction) + { + if (config.Testing) + { + return config.TestResponse; + } + + if (string.IsNullOrEmpty(transaction.From)) + { + transaction.From = await GetAddress(); + } + + EthSignTransaction requestData = new EthSignTransaction(new TransactionModel + { + From = transaction.From, + To = transaction.To, + Gas = transaction.GasLimit?.HexValue, + GasPrice = transaction.GasPrice?.HexValue, + Value = transaction.Value?.HexValue, + Data = transaction.Data ?? "0x", + Nonce = transaction.Nonce?.HexValue, + }); + + string hash = await Request(requestData); + + // TODO replace validation with regex + WCLogger.Log($"Transaction executed with hash {hash}"); + + return hash; + } + public async Task SignMessage(string message) { if (config.Testing) diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs index 0e91a1a92..26e0c4e77 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs @@ -49,7 +49,7 @@ public async Task SendTransaction(TransactionRequest transa Gas = transaction.GasLimit?.HexValue, GasPrice = transaction.GasPrice?.HexValue, Value = transaction.Value?.HexValue, - Data = transaction.Data, + Data = transaction.Data ?? "0x", Nonce = transaction.Nonce?.HexValue, }); diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity index 601542867..77c56686b 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity @@ -3231,9 +3231,9 @@ MonoBehaviour: Provider: 3 - Button: {fileID: 1508551058} Provider: 4 - _supportedWalletsDropdown: {fileID: 540464236} - _redirectToWalletToggle: {fileID: 981405684} - _walletConnectModal: {fileID: 395689441} + supportedWalletsDropdown: {fileID: 540464236} + redirectToWalletToggle: {fileID: 981405684} + walletConnectModal: {fileID: 395689441} k__BackingField: f4bff60eb260841f46b1c77588cd8acb k__BackingField: Web3.Unity k__BackingField: unity-game From b5ff3e36cff51bed565ad9300c69593c70cf8f90 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 10 Oct 2023 13:45:30 +0000 Subject: [PATCH 058/167] Auto-duplicate Package Samples --- .../Samples~/Web3.Unity/Scenes/SampleLogin.unity | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity index 601542867..77c56686b 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity @@ -3231,9 +3231,9 @@ MonoBehaviour: Provider: 3 - Button: {fileID: 1508551058} Provider: 4 - _supportedWalletsDropdown: {fileID: 540464236} - _redirectToWalletToggle: {fileID: 981405684} - _walletConnectModal: {fileID: 395689441} + supportedWalletsDropdown: {fileID: 540464236} + redirectToWalletToggle: {fileID: 981405684} + walletConnectModal: {fileID: 395689441} k__BackingField: f4bff60eb260841f46b1c77588cd8acb k__BackingField: Web3.Unity k__BackingField: unity-game From 5bbcaacb247c64b687906ffd2a60b12df992c679 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 12 Oct 2023 11:10:02 +0300 Subject: [PATCH 059/167] checkpoint: working android save session --- .../Runtime/Scripts/Web3Accessor.cs | 14 --- .../Tests/Runtime/SampleTestsBase.cs | 4 +- .../WalletConnectConfig.cs | 10 +- .../WalletConnectSigner.cs | 101 +++++++++++++++--- .../Scripts/Prefabs/Logout.cs | 2 +- .../Scripts/Scenes/Login.cs | 43 ++++---- 6 files changed, 121 insertions(+), 53 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs index 56576924f..9de9813a7 100644 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs @@ -52,19 +52,5 @@ public static void Set(Web3.Web3 web3) } public static void Clear() => Instance.web3 = null; - - private async void OnApplicationQuit() - { - if (web3 != null) - { - Debug.Log("Disposing Web3..."); - - // Terminate Web3 - await web3.TerminateAsync(); - - // Clear the Web3 instance - web3 = null; - } - } } } diff --git a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs index d7159dcde..9ed23c9df 100644 --- a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs +++ b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs @@ -38,9 +38,9 @@ public virtual IEnumerator Setup() config = new WalletConnectConfig { - SavedUserAddress = "0x55ffe9E30347266f02b9BdAe20aD3a86493289ea", // set wallet to testing Testing = true, + TestWalletAddress = "0x55ffe9E30347266f02b9BdAe20aD3a86493289ea", }; services.UseWalletConnectSigner(config); @@ -67,6 +67,8 @@ public virtual IEnumerator TearDown() { config.Testing = false; + web3Result.TerminateAsync(); + yield return null; } } diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs index a9e37c48c..a07624b4c 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs @@ -18,12 +18,14 @@ public class WalletConnectConfig public event SessionApproved OnSessionApproved; - public string SavedUserAddress { get; set; } = null; - public string ProjectId { get; set; } public string ProjectName { get; set; } + public string SavedSessionTopic { get; set; } + + public string StoragePath { get; set; } + public string BaseContext { get; set; } public ChainModel Chain { get; set; } @@ -32,12 +34,16 @@ public class WalletConnectConfig public bool RedirectToWallet { get; set; } + public bool AutoRenewSession { get; set; } + public WalletConnectWalletModel DefaultWallet { get; set; } public Dictionary SupportedWallets { get; set; } public bool Testing { get; set; } = false; + public string TestWalletAddress { get; set; } = null; + public string TestResponse { get; set; } = string.Empty; public void InvokeConnected(ConnectedData connectedData) diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs index c0075d23a..cffaf2c17 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs @@ -1,4 +1,5 @@ using System; +using System.IO; using System.Linq; using System.Threading.Tasks; using ChainSafe.Gaming.Evm.Signers; @@ -12,6 +13,7 @@ using ChainSafe.Gaming.Web3.Environment; using WalletConnectSharp.Common.Logging; using WalletConnectSharp.Common.Model.Errors; +using WalletConnectSharp.Common.Utils; using WalletConnectSharp.Core; using WalletConnectSharp.Core.Models; using WalletConnectSharp.Core.Models.Relay; @@ -47,14 +49,16 @@ public WalletConnectSigner(WalletConnectConfig config, IOperatingSystemMediator public string Address { get; private set; } + private bool SessionExpired => Session.Expiry != null && Clock.IsExpired((long)Session.Expiry); + public async ValueTask WillStartAsync() { - config.SavedUserAddress?.AssertIsPublicAddress(nameof(config.SavedUserAddress)); - // if testing just don't initialize wallet connect if (config.Testing) { - Address = config.SavedUserAddress; + config.TestWalletAddress?.AssertIsPublicAddress(nameof(config.TestWalletAddress)); + + Address = config.TestWalletAddress; return; } @@ -62,7 +66,7 @@ public async ValueTask WillStartAsync() // Wallet Connect await Initialize(); - Address = config.SavedUserAddress ?? await ConnectToWallet(); + Address = await ConnectToWallet(); } private async Task Initialize() @@ -85,7 +89,7 @@ private async Task Initialize() { Name = config.ProjectName, ProjectId = config.ProjectId, - Storage = new InMemoryStorage(), + Storage = BuildStorage(), BaseContext = config.BaseContext, }); @@ -125,11 +129,26 @@ private async Task ConnectClient() Methods = methods, }); - // start connecting - ConnectedData connectData = await SignClient.Connect(new ConnectOptions + var connectOptions = new ConnectOptions { RequiredNamespaces = requiredNamespaces, - }); + }; + + // if there's a saved session pair and continue with that session/connect automatically + bool autoConnect = !string.IsNullOrEmpty(config.SavedSessionTopic); + + if (autoConnect) + { + string pairingTopic = Core.Pairing.Pairings.FirstOrDefault().Topic; + + if (!string.IsNullOrEmpty(pairingTopic)) + { + connectOptions.PairingTopic = pairingTopic; + } + } + + // start connecting + ConnectedData connectData = await SignClient.Connect(connectOptions); config.InvokeConnected(connectData); @@ -146,8 +165,28 @@ private async Task ConnectClient() } } + if (autoConnect) + { + SessionStruct? session = SignClient.Find(requiredNamespaces) + ?.FirstOrDefault(s => s.Topic == config.SavedSessionTopic); + + if (session != null) + { + connectData.Approval = Task.FromResult(session.Value); + } + else + { + throw new Web3Exception("Auto Connect Failed : no matching Session found"); + } + } + Session = await connectData.Approval; + if (SessionExpired) + { + await TryRenewSession(); + } + config.InvokeSessionApproved(Session); // get default wallet @@ -184,6 +223,7 @@ private async Task ConnectClient() public ValueTask WillStopAsync() { + // disconnect on terminate return new ValueTask(Disconnect()); } @@ -207,8 +247,20 @@ public Task GetAddress() return Task.FromResult(Address!); } - public Task Request(T data, long? expiry = null) + public async Task Request(T data, long? expiry = null) { + if (SessionExpired) + { + if (config.AutoRenewSession) + { + await TryRenewSession(); + } + else + { + throw new Web3Exception($"Failed to perform {typeof(T)} Request, Session expired, Please Reconnect"); + } + } + string topic = Session.Topic; var addressParts = GetFullAddress().Split(":"); @@ -238,7 +290,21 @@ public Task Request(T data, long? expiry = null) }); } - return SignClient.Request(topic, data, chainId, expiry); + return await SignClient.Request(topic, data, chainId, expiry); + } + + private async Task TryRenewSession() + { + try + { + var acknowledgement = await SignClient.Extend(Session.Topic); + + await acknowledgement.Acknowledged(); + } + catch (Exception e) + { + throw new Web3Exception($"Auto Renew Session Failed with Exception : {e}"); + } } public async Task SignTransaction(TransactionRequest transaction) @@ -349,13 +415,24 @@ private string GetFullAddress() return defaultNamespace.Accounts[0]; } + private FileSystemStorage BuildStorage() + { + var path = Path.Combine(config.StoragePath, "walletconnect.json"); + + WCLogger.Log($"Wallet Connect Storage set to {path}"); + + return new FileSystemStorage(path); + } + private async Task Disconnect() { + WCLogger.Log("Disconnecting Wallet Connect session..."); + try { - config.SavedUserAddress = null; - await SignClient.Disconnect(Session.Topic, Error.FromErrorType(ErrorType.USER_DISCONNECTED)); + + await Core.Storage.Clear(); } catch (Exception e) { diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs index d5e3068ec..ea1e2e5bd 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs @@ -12,7 +12,7 @@ public class Logout : MonoBehaviour public async void OnLogout() { // Remove the saved "remember me" data, if any - PlayerPrefs.DeleteKey(Login.PlayerAccountKey); + PlayerPrefs.DeleteKey(Login.SavedSessionTopicKey); // Terminate Web3 await Web3Accessor.Web3.TerminateAsync(); diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index dcd54975b..e1e47f7e0 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -44,7 +44,7 @@ public class Web3AuthSettings public class Login : MonoBehaviour { - internal const string PlayerAccountKey = "PlayerAccount"; + internal const string SavedSessionTopicKey = "SavedLoginParams"; [Header("Configuration")] public string GelatoApiKey = ""; @@ -115,7 +115,7 @@ private IEnumerator Start() #if UNITY_WEBGL ProcessWeb3Auth(); #endif - //TryAutoLogin(); + TryAutoLogin(); ExistingWalletButton.onClick.AddListener(LoginWithExistingAccount); @@ -144,13 +144,19 @@ private void WalletConnected(ConnectedData data) { return; } - - // display QR and copy to clipboard - walletConnectModal.WalletConnected(data); + + // might be null in case of auto login + if (!string.IsNullOrEmpty(data.Uri)) + { + // display QR and copy to clipboard + walletConnectModal.WalletConnected(data); + } } private void SessionApproved(SessionStruct session) { + PlayerPrefs.SetString(SavedSessionTopicKey, walletConnectConfig.AutoRenewSession ? session.Topic : null); + Debug.Log($"{session.Topic} Approved"); } @@ -183,24 +189,17 @@ private void InitializeWalletDropdown() supportedWalletsDropdown.AddOptions(supportedWalletsList); } - private async void TryAutoLogin() + private void TryAutoLogin() { if (!useWalletConnect) return; - var savedAccount = PlayerPrefs.GetString(PlayerAccountKey); - - if (string.IsNullOrEmpty(savedAccount)) + if (string.IsNullOrEmpty(PlayerPrefs.GetString(SavedSessionTopicKey, null))) return; - var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) - .Configure(ConfigureCommonServices) - .Configure(services => - { - services.UseWalletConnectSigner(BuildWalletConnectConfig()); - }); - - await ProcessLogin(web3Builder); + Debug.Log("Attempting to Auto Login..."); + + LoginWithExistingAccount(); } private async void LoginWithExistingAccount() @@ -236,11 +235,6 @@ private async void LoginWithExistingAccount() }); await ProcessLogin(web3Builder); - - if (useWalletConnect && RememberMeToggle.isOn) - { - PlayerPrefs.SetString(PlayerAccountKey, await Web3Accessor.Web3.Signer.GetAddress()); - } } private async void LoginWithWeb3Auth(Provider provider) @@ -377,10 +371,13 @@ private WalletConnectConfig BuildWalletConnectConfig() BaseContext = BaseContext, Chain = chain, Metadata = Metadata, + SavedSessionTopic = PlayerPrefs.GetString(SavedSessionTopicKey, null), SupportedWallets = supportedWallets, + StoragePath = Application.persistentDataPath, RedirectToWallet = redirectToWallet, + AutoRenewSession = RememberMeToggle.isOn, #if UNITY_IOS - DefaultWallet = defaultWallet + DefaultWallet = defaultWallet, #endif }; From 7e0e2aa9e3e5afb41447dfbd0c3c07b060a6fa7c Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 12 Oct 2023 12:50:55 +0300 Subject: [PATCH 060/167] remember me implemented for IOS --- .../WalletConnectConfig.cs | 8 +- .../WalletConnectSigner.cs | 2 +- .../Scripts/Prefabs/Logout.cs | 2 +- .../Scripts/Scenes/Login.cs | 101 ++++++++++++------ 4 files changed, 78 insertions(+), 35 deletions(-) diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs index a07624b4c..a8e0e90d2 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectConfig.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using ChainSafe.Gaming.WalletConnect.Models; +using Newtonsoft.Json; using WalletConnectSharp.Core; using WalletConnectSharp.Sign.Models; using WalletConnectSharp.Sign.Models.Engine; @@ -8,6 +9,7 @@ namespace ChainSafe.Gaming.WalletConnect { [Serializable] + [JsonObject(MemberSerialization.OptIn)] public class WalletConnectConfig { public delegate void Connected(ConnectedData connectedData); @@ -22,6 +24,7 @@ public class WalletConnectConfig public string ProjectName { get; set; } + [JsonProperty] public string SavedSessionTopic { get; set; } public string StoragePath { get; set; } @@ -32,10 +35,13 @@ public class WalletConnectConfig public Metadata Metadata { get; set; } + [JsonProperty] public bool RedirectToWallet { get; set; } - public bool AutoRenewSession { get; set; } + [JsonProperty] + public bool KeepSessionAlive { get; set; } + [JsonProperty] public WalletConnectWalletModel DefaultWallet { get; set; } public Dictionary SupportedWallets { get; set; } diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs index cffaf2c17..675c4ed6e 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs @@ -251,7 +251,7 @@ public async Task Request(T data, long? expiry = null) { if (SessionExpired) { - if (config.AutoRenewSession) + if (config.KeepSessionAlive) { await TryRenewSession(); } diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs index ea1e2e5bd..d787d28a2 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs @@ -12,7 +12,7 @@ public class Logout : MonoBehaviour public async void OnLogout() { // Remove the saved "remember me" data, if any - PlayerPrefs.DeleteKey(Login.SavedSessionTopicKey); + PlayerPrefs.DeleteKey(Login.SavedWalletConnectConfigKey); // Terminate Web3 await Web3Accessor.Web3.TerminateAsync(); diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index e1e47f7e0..9b0622791 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -44,7 +44,7 @@ public class Web3AuthSettings public class Login : MonoBehaviour { - internal const string SavedSessionTopicKey = "SavedLoginParams"; + internal const string SavedWalletConnectConfigKey = "SavedWalletConnectConfig"; [Header("Configuration")] public string GelatoApiKey = ""; @@ -65,6 +65,8 @@ public class Login : MonoBehaviour #region Wallet Connect private WalletConnectConfig walletConnectConfig; + + private bool autoLogin; [field: Header("Wallet Connect")] @@ -115,9 +117,11 @@ private IEnumerator Start() #if UNITY_WEBGL ProcessWeb3Auth(); #endif - TryAutoLogin(); + var autoLoginTask = TryAutoLogin(); + + yield return new WaitUntil(() => autoLoginTask.IsCompleted); - ExistingWalletButton.onClick.AddListener(LoginWithExistingAccount); + ExistingWalletButton.onClick.AddListener(OnLoginWithExistingAccount); foreach (var buttonAndProvider in Web3AuthButtons) { @@ -155,7 +159,19 @@ private void WalletConnected(ConnectedData data) private void SessionApproved(SessionStruct session) { - PlayerPrefs.SetString(SavedSessionTopicKey, walletConnectConfig.AutoRenewSession ? session.Topic : null); + // save/persist session + if (walletConnectConfig.KeepSessionAlive) + { + walletConnectConfig.SavedSessionTopic = session.Topic; + + PlayerPrefs.SetString(SavedWalletConnectConfigKey, JsonConvert.SerializeObject(walletConnectConfig)); + } + + else + { + // reset if any saved config + PlayerPrefs.SetString(SavedWalletConnectConfigKey, null); + } Debug.Log($"{session.Topic} Approved"); } @@ -189,20 +205,37 @@ private void InitializeWalletDropdown() supportedWalletsDropdown.AddOptions(supportedWalletsList); } - private void TryAutoLogin() + private async Task TryAutoLogin() { if (!useWalletConnect) return; - if (string.IsNullOrEmpty(PlayerPrefs.GetString(SavedSessionTopicKey, null))) + string savedConfigJson = PlayerPrefs.GetString(SavedWalletConnectConfigKey, null); + + if (string.IsNullOrEmpty(savedConfigJson)) + { return; + } Debug.Log("Attempting to Auto Login..."); - LoginWithExistingAccount(); + try + { + autoLogin = true; + + walletConnectConfig = JsonConvert.DeserializeObject(savedConfigJson); + + await LoginWithExistingAccount(); + } + catch (Exception e) + { + Debug.LogError($"Auto Login Failed with Exception {e}"); + + autoLogin = false; + } } - private async void LoginWithExistingAccount() + private async void OnLoginWithExistingAccount() { #if UNITY_IOS // can't redirect to wallet on IOS if there's no selected wallet @@ -214,7 +247,12 @@ private async void LoginWithExistingAccount() return; } #endif - + + await LoginWithExistingAccount(); + } + + private async Task LoginWithExistingAccount() + { var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) .Configure(ConfigureCommonServices) .Configure(services => @@ -346,24 +384,30 @@ private WalletConnectConfig BuildWalletConnectConfig() ChainModel chain = new ChainModel(ChainModel.EvmNamespace, projectConfig.ChainId, projectConfig.Network); - // allow redirection on editor for testing UI flow - redirectToWallet = (Application.isMobilePlatform || Application.isEditor) && redirectToWalletToggle.isOn; - #if UNITY_IOS WalletConnectWalletModel defaultWallet = null; - - // make sure there's a selected wallet on IOS - redirectToWallet = redirectToWallet && supportedWalletsDropdown.value != 0; +#endif - if (redirectToWallet) + // if it's an auto login get these values from saved wallet config + if (!autoLogin) { - // offset for the first/default/unselected dropdown option 0 - int selectedWalletIndex = supportedWalletsDropdown.value - 1; + // allow redirection on editor for testing UI flow + redirectToWallet = (Application.isMobilePlatform || Application.isEditor) && redirectToWalletToggle.isOn; - defaultWallet = supportedWallets.Values.ToArray()[selectedWalletIndex]; - } +#if UNITY_IOS + // make sure there's a selected wallet on IOS + redirectToWallet = redirectToWallet && supportedWalletsDropdown.value != 0; + + if (redirectToWallet) + { + // offset for the first/default/unselected dropdown option 0 + int selectedWalletIndex = supportedWalletsDropdown.value - 1; + + defaultWallet = supportedWallets.Values.ToArray()[selectedWalletIndex]; + } #endif - + } + var config = new WalletConnectConfig { ProjectId = ProjectId, @@ -371,23 +415,16 @@ private WalletConnectConfig BuildWalletConnectConfig() BaseContext = BaseContext, Chain = chain, Metadata = Metadata, - SavedSessionTopic = PlayerPrefs.GetString(SavedSessionTopicKey, null), + SavedSessionTopic = autoLogin ? walletConnectConfig.SavedSessionTopic : null, SupportedWallets = supportedWallets, StoragePath = Application.persistentDataPath, - RedirectToWallet = redirectToWallet, - AutoRenewSession = RememberMeToggle.isOn, + RedirectToWallet = autoLogin ? walletConnectConfig.RedirectToWallet : redirectToWallet, + KeepSessionAlive = autoLogin || RememberMeToggle.isOn, #if UNITY_IOS - DefaultWallet = defaultWallet, + DefaultWallet = autoLogin ? walletConnectConfig.DefaultWallet : defaultWallet, #endif }; - if (walletConnectConfig != null) - { - walletConnectConfig.OnConnected -= WalletConnected; - - walletConnectConfig.OnSessionApproved -= SessionApproved; - } - walletConnectConfig = config; walletConnectConfig.OnConnected += WalletConnected; From eac1d250c224efb6075e9e45c9f7b0f3f4f368bf Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 12 Oct 2023 09:52:06 +0000 Subject: [PATCH 061/167] Auto-duplicate Package Samples --- .../Web3.Unity/Scripts/Prefabs/Logout.cs | 2 +- .../Web3.Unity/Scripts/Scenes/Login.cs | 122 +++++++++++------- 2 files changed, 79 insertions(+), 45 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs index d5e3068ec..d787d28a2 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs @@ -12,7 +12,7 @@ public class Logout : MonoBehaviour public async void OnLogout() { // Remove the saved "remember me" data, if any - PlayerPrefs.DeleteKey(Login.PlayerAccountKey); + PlayerPrefs.DeleteKey(Login.SavedWalletConnectConfigKey); // Terminate Web3 await Web3Accessor.Web3.TerminateAsync(); diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs index dcd54975b..9b0622791 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs @@ -44,7 +44,7 @@ public class Web3AuthSettings public class Login : MonoBehaviour { - internal const string PlayerAccountKey = "PlayerAccount"; + internal const string SavedWalletConnectConfigKey = "SavedWalletConnectConfig"; [Header("Configuration")] public string GelatoApiKey = ""; @@ -65,6 +65,8 @@ public class Login : MonoBehaviour #region Wallet Connect private WalletConnectConfig walletConnectConfig; + + private bool autoLogin; [field: Header("Wallet Connect")] @@ -115,9 +117,11 @@ private IEnumerator Start() #if UNITY_WEBGL ProcessWeb3Auth(); #endif - //TryAutoLogin(); + var autoLoginTask = TryAutoLogin(); + + yield return new WaitUntil(() => autoLoginTask.IsCompleted); - ExistingWalletButton.onClick.AddListener(LoginWithExistingAccount); + ExistingWalletButton.onClick.AddListener(OnLoginWithExistingAccount); foreach (var buttonAndProvider in Web3AuthButtons) { @@ -144,13 +148,31 @@ private void WalletConnected(ConnectedData data) { return; } - - // display QR and copy to clipboard - walletConnectModal.WalletConnected(data); + + // might be null in case of auto login + if (!string.IsNullOrEmpty(data.Uri)) + { + // display QR and copy to clipboard + walletConnectModal.WalletConnected(data); + } } private void SessionApproved(SessionStruct session) { + // save/persist session + if (walletConnectConfig.KeepSessionAlive) + { + walletConnectConfig.SavedSessionTopic = session.Topic; + + PlayerPrefs.SetString(SavedWalletConnectConfigKey, JsonConvert.SerializeObject(walletConnectConfig)); + } + + else + { + // reset if any saved config + PlayerPrefs.SetString(SavedWalletConnectConfigKey, null); + } + Debug.Log($"{session.Topic} Approved"); } @@ -183,27 +205,37 @@ private void InitializeWalletDropdown() supportedWalletsDropdown.AddOptions(supportedWalletsList); } - private async void TryAutoLogin() + private async Task TryAutoLogin() { if (!useWalletConnect) return; - var savedAccount = PlayerPrefs.GetString(PlayerAccountKey); + string savedConfigJson = PlayerPrefs.GetString(SavedWalletConnectConfigKey, null); - if (string.IsNullOrEmpty(savedAccount)) + if (string.IsNullOrEmpty(savedConfigJson)) + { return; + } - var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) - .Configure(ConfigureCommonServices) - .Configure(services => - { - services.UseWalletConnectSigner(BuildWalletConnectConfig()); - }); + Debug.Log("Attempting to Auto Login..."); + + try + { + autoLogin = true; + + walletConnectConfig = JsonConvert.DeserializeObject(savedConfigJson); + + await LoginWithExistingAccount(); + } + catch (Exception e) + { + Debug.LogError($"Auto Login Failed with Exception {e}"); - await ProcessLogin(web3Builder); + autoLogin = false; + } } - private async void LoginWithExistingAccount() + private async void OnLoginWithExistingAccount() { #if UNITY_IOS // can't redirect to wallet on IOS if there's no selected wallet @@ -215,7 +247,12 @@ private async void LoginWithExistingAccount() return; } #endif - + + await LoginWithExistingAccount(); + } + + private async Task LoginWithExistingAccount() + { var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) .Configure(ConfigureCommonServices) .Configure(services => @@ -236,11 +273,6 @@ private async void LoginWithExistingAccount() }); await ProcessLogin(web3Builder); - - if (useWalletConnect && RememberMeToggle.isOn) - { - PlayerPrefs.SetString(PlayerAccountKey, await Web3Accessor.Web3.Signer.GetAddress()); - } } private async void LoginWithWeb3Auth(Provider provider) @@ -352,24 +384,30 @@ private WalletConnectConfig BuildWalletConnectConfig() ChainModel chain = new ChainModel(ChainModel.EvmNamespace, projectConfig.ChainId, projectConfig.Network); - // allow redirection on editor for testing UI flow - redirectToWallet = (Application.isMobilePlatform || Application.isEditor) && redirectToWalletToggle.isOn; - #if UNITY_IOS WalletConnectWalletModel defaultWallet = null; - - // make sure there's a selected wallet on IOS - redirectToWallet = redirectToWallet && supportedWalletsDropdown.value != 0; +#endif - if (redirectToWallet) + // if it's an auto login get these values from saved wallet config + if (!autoLogin) { - // offset for the first/default/unselected dropdown option 0 - int selectedWalletIndex = supportedWalletsDropdown.value - 1; + // allow redirection on editor for testing UI flow + redirectToWallet = (Application.isMobilePlatform || Application.isEditor) && redirectToWalletToggle.isOn; - defaultWallet = supportedWallets.Values.ToArray()[selectedWalletIndex]; - } +#if UNITY_IOS + // make sure there's a selected wallet on IOS + redirectToWallet = redirectToWallet && supportedWalletsDropdown.value != 0; + + if (redirectToWallet) + { + // offset for the first/default/unselected dropdown option 0 + int selectedWalletIndex = supportedWalletsDropdown.value - 1; + + defaultWallet = supportedWallets.Values.ToArray()[selectedWalletIndex]; + } #endif - + } + var config = new WalletConnectConfig { ProjectId = ProjectId, @@ -377,20 +415,16 @@ private WalletConnectConfig BuildWalletConnectConfig() BaseContext = BaseContext, Chain = chain, Metadata = Metadata, + SavedSessionTopic = autoLogin ? walletConnectConfig.SavedSessionTopic : null, SupportedWallets = supportedWallets, - RedirectToWallet = redirectToWallet, + StoragePath = Application.persistentDataPath, + RedirectToWallet = autoLogin ? walletConnectConfig.RedirectToWallet : redirectToWallet, + KeepSessionAlive = autoLogin || RememberMeToggle.isOn, #if UNITY_IOS - DefaultWallet = defaultWallet + DefaultWallet = autoLogin ? walletConnectConfig.DefaultWallet : defaultWallet, #endif }; - if (walletConnectConfig != null) - { - walletConnectConfig.OnConnected -= WalletConnected; - - walletConnectConfig.OnSessionApproved -= SessionApproved; - } - walletConnectConfig = config; walletConnectConfig.OnConnected += WalletConnected; From b613eb7b6418da16c0d91b5735b0536482a3be5a Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 13 Oct 2023 10:44:17 +0300 Subject: [PATCH 062/167] Refactored a new Service IWalletConnectProvider and move connecting and request out if WalletConnectSigner --- .../Tests/Runtime/SampleTestsBase.cs | 5 +- .../IWalletConnectProvider.cs | 28 ++ .../WalletConnectProvider.cs | 340 +++++++++++++++++ .../WalletConnectProviderExtensions.cs | 26 ++ .../WalletConnectSigner.cs | 345 +----------------- .../WalletConnectSignerExtensions.cs | 26 -- .../WalletConnectTransactionExecutor.cs | 32 +- .../Web3/Core/Debug/AddressExtensions.cs | 4 +- .../Scripts/Scenes/Login.cs | 5 +- 9 files changed, 426 insertions(+), 385 deletions(-) create mode 100644 src/ChainSafe.Gaming.WalletConnect/IWalletConnectProvider.cs create mode 100644 src/ChainSafe.Gaming.WalletConnect/WalletConnectProvider.cs create mode 100644 src/ChainSafe.Gaming.WalletConnect/WalletConnectProviderExtensions.cs diff --git a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs index 9ed23c9df..58eab597f 100644 --- a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs +++ b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs @@ -42,8 +42,9 @@ public virtual IEnumerator Setup() Testing = true, TestWalletAddress = "0x55ffe9E30347266f02b9BdAe20aD3a86493289ea", }; - - services.UseWalletConnectSigner(config); + + services.UseWalletConnectProvider(config); + services.UseWalletConnectSigner(); services.UseWalletConnectTransactionExecutor(); //add any contracts we would want to use diff --git a/src/ChainSafe.Gaming.WalletConnect/IWalletConnectProvider.cs b/src/ChainSafe.Gaming.WalletConnect/IWalletConnectProvider.cs new file mode 100644 index 000000000..cc639a88b --- /dev/null +++ b/src/ChainSafe.Gaming.WalletConnect/IWalletConnectProvider.cs @@ -0,0 +1,28 @@ +using System.Threading.Tasks; + +namespace ChainSafe.Gaming.WalletConnect +{ + public interface IWalletConnectProvider + { + /// + /// connects using Wallet Connect. + /// + /// connect address. + public Task Connect(); + + /// + /// Make JsonRPC request using WalletConnect. + /// + /// Request data/body. + /// Expire time. + /// Request DataType. + /// Hash from the json rpc request. + public Task Request(T data, long? expiry = null); + + /// + /// Disconnect from a Wallet Connect Session. + /// + /// Disconnect Task. + public Task Disconnect(); + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectProvider.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectProvider.cs new file mode 100644 index 000000000..8aeb91e77 --- /dev/null +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectProvider.cs @@ -0,0 +1,340 @@ +using System; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using ChainSafe.Gaming.WalletConnect.Models; +using ChainSafe.Gaming.Web3; +using ChainSafe.Gaming.Web3.Core; +using ChainSafe.Gaming.Web3.Core.Debug; +using ChainSafe.Gaming.Web3.Environment; +using WalletConnectSharp.Common.Logging; +using WalletConnectSharp.Common.Model.Errors; +using WalletConnectSharp.Common.Utils; +using WalletConnectSharp.Core; +using WalletConnectSharp.Core.Models; +using WalletConnectSharp.Core.Models.Relay; +using WalletConnectSharp.Network.Models; +using WalletConnectSharp.Sign; +using WalletConnectSharp.Sign.Models; +using WalletConnectSharp.Sign.Models.Engine; +using WalletConnectSharp.Storage; + +namespace ChainSafe.Gaming.WalletConnect +{ + public class WalletConnectProvider : IWalletConnectProvider, ILifecycleParticipant + { + private readonly IOperatingSystemMediator operatingSystem; + private readonly ILogWriter logWriter; + private readonly WalletConnectConfig config; + + public WalletConnectProvider(WalletConnectConfig config, IOperatingSystemMediator operatingSystem, ILogWriter logWriter) + { + this.operatingSystem = operatingSystem; + this.config = config; + this.logWriter = logWriter; + } + + // static to not destroy client session on logout/TerminateAsync, just disconnect instead + public static WalletConnectSignClient SignClient { get; private set; } + + public WalletConnectCore Core { get; private set; } + + public SessionStruct Session { get; private set; } + + public ConnectedData ConnectedData { get; private set; } + + private bool SessionExpired => Session.Expiry != null && Clock.IsExpired((long)Session.Expiry); + + public ValueTask WillStartAsync() + { + return new ValueTask(Task.CompletedTask); + } + + private async Task Initialize() + { + if (SignClient != null) + { + Core = (WalletConnectCore)SignClient.Core; + } + + if (Core != null && Core.Initialized) + { + WCLogger.Log("Core already initialized"); + + return; + } + + WCLogger.Logger = new WCLogWriter(logWriter); + + Core = new WalletConnectCore(new CoreOptions() + { + Name = config.ProjectName, + ProjectId = config.ProjectId, + Storage = BuildStorage(), + BaseContext = config.BaseContext, + }); + + await Core.Start(); + + SignClient = await WalletConnectSignClient.Init(new SignClientOptions() + { + BaseContext = config.BaseContext, + Core = Core, + Metadata = config.Metadata, + Name = config.ProjectName, + ProjectId = config.ProjectId, + Storage = Core.Storage, + }); + } + + // Connect to wallet and return address of connected wallet. + public async Task Connect() + { + await Initialize(); + + RequiredNamespaces requiredNamespaces = new RequiredNamespaces(); + + var methods = new string[] + { + "eth_sendTransaction", "eth_signTransaction", "eth_sign", "personal_sign", "eth_signTypedData", + }; + + var events = new string[] { "chainChanged", "accountsChanged" }; + + requiredNamespaces.Add( + ChainModel.EvmNamespace, + new ProposedNamespace + { + Chains = new string[] + { + config.Chain.FullChainId, + }, + Events = events, + Methods = methods, + }); + + var connectOptions = new ConnectOptions + { + RequiredNamespaces = requiredNamespaces, + }; + + // if there's a saved session pair and continue with that session/connect automatically + bool autoConnect = !string.IsNullOrEmpty(config.SavedSessionTopic); + + if (autoConnect) + { + string pairingTopic = Core.Pairing.Pairings.FirstOrDefault().Topic; + + if (!string.IsNullOrEmpty(pairingTopic)) + { + connectOptions.PairingTopic = pairingTopic; + } + } + + // start connecting + ConnectedData = await SignClient.Connect(connectOptions); + + config.InvokeConnected(ConnectedData); + + // open deeplink to redirect to wallet for connection + if (config.RedirectToWallet) + { + if (config.DefaultWallet != null) + { + config.DefaultWallet.OpenDeeplink(ConnectedData, operatingSystem); + } + else + { + operatingSystem.OpenUrl(ConnectedData.Uri); + } + } + + if (autoConnect) + { + SessionStruct? session = SignClient.Find(requiredNamespaces) + ?.FirstOrDefault(s => s.Topic == config.SavedSessionTopic); + + if (session != null) + { + ConnectedData.Approval = Task.FromResult(session.Value); + } + else + { + throw new Web3Exception("Auto Connect Failed : no matching Session found"); + } + } + + Session = await ConnectedData.Approval; + + if (SessionExpired) + { + await TryRenewSession(); + } + + config.InvokeSessionApproved(Session); + + // get default wallet + if (config.RedirectToWallet && config.DefaultWallet == null) + { + string nativeUrl = Session.Peer.Metadata.Redirect.Native.Replace("//", string.Empty); + + int index = nativeUrl.IndexOf(':'); + + if (index != -1) + { + nativeUrl = $"{nativeUrl.Substring(0, index)}:"; + } + + WCLogger.Log($"Wallet Native Url {nativeUrl}"); + + var defaultWallet = config.SupportedWallets.Values.FirstOrDefault(w => + w.Mobile.NativeProtocol == nativeUrl || w.Desktop.NativeProtocol == nativeUrl); + + if (defaultWallet != null) + { + config.DefaultWallet = defaultWallet; + + WCLogger.Log("Default Wallet Set"); + } + else + { + WCLogger.Log("Default Wallet Not Found in Supported Wallets"); + } + } + + // get address + var addressParts = GetFullAddress().Split(":"); + + string address = addressParts[2]; + + if (!AddressExtensions.IsPublicAddress(address)) + { + throw new Web3Exception( + $"Public address recovered from signature is not valid. Public address: {address}"); + } + + return address; + } + + public ValueTask WillStopAsync() + { + if (!config.KeepSessionAlive) + { + // disconnect on terminate + return new ValueTask(Disconnect()); + } + + return new ValueTask(Task.CompletedTask); + } + + public async Task Request(T data, long? expiry = null) + { + // if testing skip making request + if (config.Testing) + { + return config.TestResponse; + } + + if (SessionExpired) + { + if (config.KeepSessionAlive) + { + await TryRenewSession(); + } + else + { + throw new Web3Exception($"Failed to perform {typeof(T)} Request, Session expired, Please Reconnect"); + } + } + + string topic = Session.Topic; + + var addressParts = GetFullAddress().Split(":"); + + string chainId = string.Join(':', addressParts.Take(2)); + + string method = RpcMethodAttribute.MethodForType(); + + // if it's a registered method try and open wallet + if (Session.Namespaces.Any(n => n.Value.Methods.Contains(method))) + { + Core.Relayer.Events.ListenForOnce( + RelayerEvents.Publish, + (_, _) => + { + // if default wallet exists and redirect is true redirect user to default wallet + if (config.RedirectToWallet && config.DefaultWallet != null) + { + WCLogger.Log("Opening Default Wallet..."); + + config.DefaultWallet.OpenWallet(operatingSystem); + } + else + { + WCLogger.Log("No Default Wallet to Open"); + } + }); + } + + return await SignClient.Request(topic, data, chainId, expiry); + } + + private async Task TryRenewSession() + { + try + { + var acknowledgement = await SignClient.Extend(Session.Topic); + + await acknowledgement.Acknowledged(); + } + catch (Exception e) + { + throw new Web3Exception($"Auto Renew Session Failed with Exception : {e}"); + } + } + + private string GetFullAddress() + { + var defaultChain = Session.Namespaces.Keys.FirstOrDefault(); + + if (string.IsNullOrWhiteSpace(defaultChain)) + { + throw new Web3Exception("can't get full address, default chain not found"); + } + + var defaultNamespace = Session.Namespaces[defaultChain]; + + if (defaultNamespace.Accounts.Length == 0) + { + throw new Web3Exception("can't get full address, no connected accounts"); + } + + return defaultNamespace.Accounts[0]; + } + + private FileSystemStorage BuildStorage() + { + var path = Path.Combine(config.StoragePath, "walletconnect.json"); + + WCLogger.Log($"Wallet Connect Storage set to {path}"); + + return new FileSystemStorage(path); + } + + public async Task Disconnect() + { + WCLogger.Log("Disconnecting Wallet Connect session..."); + + try + { + await SignClient.Disconnect(Session.Topic, Error.FromErrorType(ErrorType.USER_DISCONNECTED)); + + await Core.Storage.Clear(); + } + catch (Exception e) + { + WCLogger.LogError($"error disconnecting: {e}"); + } + } + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectProviderExtensions.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectProviderExtensions.cs new file mode 100644 index 000000000..6bf53ead7 --- /dev/null +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectProviderExtensions.cs @@ -0,0 +1,26 @@ +using ChainSafe.Gaming.Web3.Build; +using ChainSafe.Gaming.Web3.Core; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace ChainSafe.Gaming.WalletConnect +{ + public static class WalletConnectProviderExtensions + { + /// + /// Binds Web implementation of EVM Provider to Web3. + /// + /// The same service collection that was passed in. This enables fluent style. + public static IWeb3ServiceCollection UseWalletConnectProvider(this IWeb3ServiceCollection collection, WalletConnectConfig config) + { + collection.AssertServiceNotBound(); + + // wallet + collection.AddSingleton(); + + // configure provider + collection.Replace(ServiceDescriptor.Singleton(typeof(WalletConnectConfig), config)); + return collection; + } + } +} \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs index 675c4ed6e..abba71302 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs @@ -27,29 +27,16 @@ namespace ChainSafe.Gaming.WalletConnect { public class WalletConnectSigner : ISigner, ILifecycleParticipant { - private readonly IOperatingSystemMediator operatingSystem; - private readonly ILogWriter logWriter; + private readonly IWalletConnectProvider walletConnectProvider; private readonly WalletConnectConfig config; - public WalletConnectSigner(WalletConnectConfig config, IOperatingSystemMediator operatingSystem, ILogWriter logWriter) + public WalletConnectSigner(IWalletConnectProvider walletConnectProvider, WalletConnectConfig config) { - this.operatingSystem = operatingSystem; + this.walletConnectProvider = walletConnectProvider; this.config = config; - this.logWriter = logWriter; } - // static to not destroy client session on logout/TerminateAsync, just disconnect instead - public static WalletConnectSignClient SignClient { get; private set; } - - public WalletConnectCore Core { get; private set; } - - public SessionStruct Session { get; private set; } - - public ConnectedData ConnectedData { get; private set; } - - public string Address { get; private set; } - - private bool SessionExpired => Session.Expiry != null && Clock.IsExpired((long)Session.Expiry); + private string Address { get; set; } public async ValueTask WillStartAsync() { @@ -63,292 +50,32 @@ public async ValueTask WillStartAsync() return; } - // Wallet Connect - await Initialize(); - - Address = await ConnectToWallet(); - } - - private async Task Initialize() - { - if (SignClient != null) - { - Core = (WalletConnectCore)SignClient.Core; - } - - if (Core != null && Core.Initialized) - { - WCLogger.Log("Core already initialized"); - - return; - } - - WCLogger.Logger = new WCLogWriter(logWriter); - - Core = new WalletConnectCore(new CoreOptions() - { - Name = config.ProjectName, - ProjectId = config.ProjectId, - Storage = BuildStorage(), - BaseContext = config.BaseContext, - }); - - await Core.Start(); - - SignClient = await WalletConnectSignClient.Init(new SignClientOptions() - { - BaseContext = config.BaseContext, - Core = Core, - Metadata = config.Metadata, - Name = config.ProjectName, - ProjectId = config.ProjectId, - Storage = Core.Storage, - }); - } - - private async Task ConnectClient() - { - RequiredNamespaces requiredNamespaces = new RequiredNamespaces(); - - var methods = new string[] - { - "eth_sendTransaction", "eth_signTransaction", "eth_sign", "personal_sign", "eth_signTypedData", - }; - - var events = new string[] { "chainChanged", "accountsChanged" }; - - requiredNamespaces.Add( - ChainModel.EvmNamespace, - new ProposedNamespace - { - Chains = new string[] - { - config.Chain.FullChainId, - }, - Events = events, - Methods = methods, - }); - - var connectOptions = new ConnectOptions - { - RequiredNamespaces = requiredNamespaces, - }; - - // if there's a saved session pair and continue with that session/connect automatically - bool autoConnect = !string.IsNullOrEmpty(config.SavedSessionTopic); - - if (autoConnect) - { - string pairingTopic = Core.Pairing.Pairings.FirstOrDefault().Topic; - - if (!string.IsNullOrEmpty(pairingTopic)) - { - connectOptions.PairingTopic = pairingTopic; - } - } - - // start connecting - ConnectedData connectData = await SignClient.Connect(connectOptions); - - config.InvokeConnected(connectData); - - // open deeplink to redirect to wallet for connection - if (config.RedirectToWallet) - { - if (config.DefaultWallet != null) - { - config.DefaultWallet.OpenDeeplink(connectData, operatingSystem); - } - else - { - operatingSystem.OpenUrl(connectData.Uri); - } - } - - if (autoConnect) - { - SessionStruct? session = SignClient.Find(requiredNamespaces) - ?.FirstOrDefault(s => s.Topic == config.SavedSessionTopic); - - if (session != null) - { - connectData.Approval = Task.FromResult(session.Value); - } - else - { - throw new Web3Exception("Auto Connect Failed : no matching Session found"); - } - } - - Session = await connectData.Approval; - - if (SessionExpired) - { - await TryRenewSession(); - } - - config.InvokeSessionApproved(Session); - - // get default wallet - if (config.RedirectToWallet && config.DefaultWallet == null) - { - string nativeUrl = Session.Peer.Metadata.Redirect.Native.Replace("//", string.Empty); - - int index = nativeUrl.IndexOf(':'); - - if (index != -1) - { - nativeUrl = $"{nativeUrl.Substring(0, index)}:"; - } - - WCLogger.Log($"Wallet Native Url {nativeUrl}"); - - var defaultWallet = config.SupportedWallets.Values.FirstOrDefault(w => - w.Mobile.NativeProtocol == nativeUrl || w.Desktop.NativeProtocol == nativeUrl); - - if (defaultWallet != null) - { - config.DefaultWallet = defaultWallet; - - WCLogger.Log("Default Wallet Set"); - } - else - { - WCLogger.Log("Default Wallet Not Found in Supported Wallets"); - } - } - - return connectData; + // get address by connecting + Address = await walletConnectProvider.Connect(); } public ValueTask WillStopAsync() { - // disconnect on terminate - return new ValueTask(Disconnect()); + return new ValueTask(Task.CompletedTask); } public Task GetAddress() { - if (string.IsNullOrEmpty(Address)) - { - var addressParts = GetFullAddress().Split(":"); - - Address = addressParts[2]; - } - if (!AddressExtensions.IsPublicAddress(Address)) { throw new Web3Exception( $"Public address recovered from signature is not valid. Public address: {Address}"); } - Address.AssertNotNull(nameof(Address)); - - return Task.FromResult(Address!); - } - - public async Task Request(T data, long? expiry = null) - { - if (SessionExpired) - { - if (config.KeepSessionAlive) - { - await TryRenewSession(); - } - else - { - throw new Web3Exception($"Failed to perform {typeof(T)} Request, Session expired, Please Reconnect"); - } - } - - string topic = Session.Topic; - - var addressParts = GetFullAddress().Split(":"); - - string chainId = string.Join(':', addressParts.Take(2)); - - string method = RpcMethodAttribute.MethodForType(); - - // if it's a registered method try and open wallet - if (Session.Namespaces.Any(n => n.Value.Methods.Contains(method))) - { - Core.Relayer.Events.ListenForOnce( - RelayerEvents.Publish, - (_, _) => - { - // if default wallet exists and redirect is true redirect user to default wallet - if (config.RedirectToWallet && config.DefaultWallet != null) - { - WCLogger.Log("Opening Default Wallet..."); - - config.DefaultWallet.OpenWallet(operatingSystem); - } - else - { - WCLogger.Log("No Default Wallet to Open"); - } - }); - } - - return await SignClient.Request(topic, data, chainId, expiry); - } - - private async Task TryRenewSession() - { - try - { - var acknowledgement = await SignClient.Extend(Session.Topic); - - await acknowledgement.Acknowledged(); - } - catch (Exception e) - { - throw new Web3Exception($"Auto Renew Session Failed with Exception : {e}"); - } - } - - public async Task SignTransaction(TransactionRequest transaction) - { - if (config.Testing) - { - return config.TestResponse; - } - - if (string.IsNullOrEmpty(transaction.From)) - { - transaction.From = await GetAddress(); - } - - EthSignTransaction requestData = new EthSignTransaction(new TransactionModel - { - From = transaction.From, - To = transaction.To, - Gas = transaction.GasLimit?.HexValue, - GasPrice = transaction.GasPrice?.HexValue, - Value = transaction.Value?.HexValue, - Data = transaction.Data ?? "0x", - Nonce = transaction.Nonce?.HexValue, - }); - - string hash = await Request(requestData); - - // TODO replace validation with regex - WCLogger.Log($"Transaction executed with hash {hash}"); - - return hash; + return Task.FromResult(Address); } public async Task SignMessage(string message) { - if (config.Testing) - { - return config.TestResponse; - } - var requestData = new EthSignMessage(message, Address); string hash = - await Request(requestData); + await walletConnectProvider.Request(requestData); var isValid = ValidateResponse(hash); if (!isValid) @@ -371,7 +98,7 @@ public async Task SignTypedData(SerializableDomain domain, var requestData = new EthSignTypedData(Address, domain, message); string hash = - await Request, string>(requestData); + await walletConnectProvider.Request(requestData); var isValid = ValidateResponse(hash); if (!isValid) @@ -387,57 +114,5 @@ bool ValidateResponse(string response) return hash; } - - // Connect to wallet and return address of connected wallet. - private async Task ConnectToWallet() - { - ConnectedData = await ConnectClient(); - - return await GetAddress(); - } - - private string GetFullAddress() - { - var defaultChain = Session.Namespaces.Keys.FirstOrDefault(); - - if (string.IsNullOrWhiteSpace(defaultChain)) - { - throw new Web3Exception("can't get full address, default chain not found"); - } - - var defaultNamespace = Session.Namespaces[defaultChain]; - - if (defaultNamespace.Accounts.Length == 0) - { - throw new Web3Exception("can't get full address, no connected accounts"); - } - - return defaultNamespace.Accounts[0]; - } - - private FileSystemStorage BuildStorage() - { - var path = Path.Combine(config.StoragePath, "walletconnect.json"); - - WCLogger.Log($"Wallet Connect Storage set to {path}"); - - return new FileSystemStorage(path); - } - - private async Task Disconnect() - { - WCLogger.Log("Disconnecting Wallet Connect session..."); - - try - { - await SignClient.Disconnect(Session.Topic, Error.FromErrorType(ErrorType.USER_DISCONNECTED)); - - await Core.Storage.Clear(); - } - catch (Exception e) - { - WCLogger.LogError($"error disconnecting: {e}"); - } - } } } \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSignerExtensions.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSignerExtensions.cs index 2dc29c784..fb8c94378 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSignerExtensions.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSignerExtensions.cs @@ -9,19 +9,6 @@ namespace ChainSafe.Gaming.WalletConnect { public static class WalletConnectSignerExtensions { - private static readonly WalletConnectConfig DefaultConfig = new(); - - /// - /// Binds Web implementation of EVM Provider to Web3. - /// - /// The same service collection that was passed in. This enables fluent style. - public static IWeb3ServiceCollection UseWalletConnectSigner(this IWeb3ServiceCollection collection, WalletConnectConfig configuration) - { - collection.UseWalletConnectSigner(); - collection.ConfigureWalletConnectSigner(configuration); - return collection; - } - /// /// Binds Web implementation of EVM Provider to Web3. /// @@ -30,23 +17,10 @@ public static IWeb3ServiceCollection UseWalletConnectSigner(this IWeb3ServiceCol { collection.AssertServiceNotBound(); - // config - collection.TryAddSingleton(DefaultConfig); - // wallet collection.AddSingleton(); return collection; } - - /// - /// Configures Web implementation of EVM Provider. - /// - /// The same service collection that was passed in. This enables fluent style. - public static IWeb3ServiceCollection ConfigureWalletConnectSigner(this IWeb3ServiceCollection collection, WalletConnectConfig configuration) - { - collection.Replace(ServiceDescriptor.Singleton(typeof(WalletConnectConfig), configuration)); - return collection; - } } } \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs index 26e0c4e77..5560ce6f0 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs @@ -14,29 +14,27 @@ namespace ChainSafe.Gaming.WalletConnect { public class WalletConnectTransactionExecutor : ITransactionExecutor, ILifecycleParticipant { - private readonly IRpcProvider provider; + private readonly IWalletConnectProvider walletConnectProvider; - private readonly WalletConnectSigner signer; + private readonly IRpcProvider rpcProvider; - private readonly WalletConnectConfig config; + private readonly ISigner signer; - public WalletConnectTransactionExecutor(WalletConnectConfig config, ISigner signer, IRpcProvider provider) + public WalletConnectTransactionExecutor(IWalletConnectProvider walletConnectProvider, IRpcProvider rpcProvider, ISigner signer) { - this.signer = signer as WalletConnectSigner ?? - throw new Web3Exception($"{nameof(WalletConnectTransactionExecutor)} only supports {nameof(WalletConnectSigner)}"); + this.walletConnectProvider = walletConnectProvider; - this.provider = provider; + this.rpcProvider = rpcProvider; - this.config = config; + this.signer = signer; } + public ValueTask WillStartAsync() => new ValueTask(Task.CompletedTask); + + public ValueTask WillStopAsync() => new ValueTask(Task.CompletedTask); + public async Task SendTransaction(TransactionRequest transaction) { - if (config.Testing) - { - return await provider.GetTransaction(config.TestResponse); - } - if (string.IsNullOrEmpty(transaction.From)) { transaction.From = await signer.GetAddress(); @@ -53,7 +51,7 @@ public async Task SendTransaction(TransactionRequest transa Nonce = transaction.Nonce?.HexValue, }); - string hash = await signer.Request(requestData); + string hash = await walletConnectProvider.Request(requestData); // TODO replace validation with regex if (!hash.StartsWith("0x") || hash.Length != 66) @@ -63,11 +61,7 @@ public async Task SendTransaction(TransactionRequest transa WCLogger.Log($"Transaction executed with hash {hash}"); - return await provider.GetTransaction(hash); + return await rpcProvider.GetTransaction(hash); } - - public ValueTask WillStartAsync() => new ValueTask(Task.CompletedTask); - - public ValueTask WillStopAsync() => new ValueTask(Task.CompletedTask); } } \ No newline at end of file diff --git a/src/ChainSafe.Gaming/Web3/Core/Debug/AddressExtensions.cs b/src/ChainSafe.Gaming/Web3/Core/Debug/AddressExtensions.cs index 0c327551f..01a5843c5 100644 --- a/src/ChainSafe.Gaming/Web3/Core/Debug/AddressExtensions.cs +++ b/src/ChainSafe.Gaming/Web3/Core/Debug/AddressExtensions.cs @@ -6,8 +6,8 @@ public static class AddressExtensions { public static bool IsPublicAddress(string value) { - // TODO: more accurate test - return value.Length == 42; + // TODO: more accurate test/Regex + return !string.IsNullOrEmpty(value) && value.Length == 42; } public static string AssertIsPublicAddress(this string value, string variableName) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index 9b0622791..e840bc9d1 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -264,7 +264,10 @@ private async Task LoginWithExistingAccount() */ if (useWalletConnect) { - services.UseWalletConnectSigner(BuildWalletConnectConfig()).UseWalletConnectTransactionExecutor(); + services + .UseWalletConnectProvider(BuildWalletConnectConfig()) + .UseWalletConnectSigner() + .UseWalletConnectTransactionExecutor(); } else { From 97650249666b338be9e3376fc51385f289c74191 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 13 Oct 2023 11:08:51 +0300 Subject: [PATCH 063/167] removed redundant check --- .../Models/WalletConnectWalletModel.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs index d33dbce4e..f7342c041 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs @@ -31,10 +31,7 @@ public void OpenDeeplink(ConnectedData data, IOperatingSystemMediator operatingS break; case Platform.IOS: - // on iOS, we need to use one of the wallet links - WalletLinkModel linkData = operatingSystemMediator.IsMobilePlatform ? Mobile : Desktop; - - var universalUrl = useNative ? linkData.NativeProtocol : linkData.UniversalUrl; + var universalUrl = useNative ? Mobile.NativeProtocol : Mobile.UniversalUrl; uri = data.Uri; From 152b50b41bc467c0cb9f509095e9768da6910fe2 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 13 Oct 2023 08:09:56 +0000 Subject: [PATCH 064/167] Auto-duplicate Package Samples --- .../Samples~/Web3.Unity/Scripts/Scenes/Login.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs index 9b0622791..e840bc9d1 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs @@ -264,7 +264,10 @@ private async Task LoginWithExistingAccount() */ if (useWalletConnect) { - services.UseWalletConnectSigner(BuildWalletConnectConfig()).UseWalletConnectTransactionExecutor(); + services + .UseWalletConnectProvider(BuildWalletConnectConfig()) + .UseWalletConnectSigner() + .UseWalletConnectTransactionExecutor(); } else { From eb86fd7cbbee51956d954640ea45cbf14b312d37 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 13 Oct 2023 13:56:56 +0300 Subject: [PATCH 065/167] more edits opening wallet --- .../Models/WalletConnectWalletModel.cs | 61 ++++++++++--------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs index f7342c041..e614a6a86 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs @@ -1,4 +1,3 @@ -using System; using ChainSafe.Gaming.Web3.Environment; using Newtonsoft.Json; using WalletConnectSharp.Common.Logging; @@ -31,33 +30,7 @@ public void OpenDeeplink(ConnectedData data, IOperatingSystemMediator operatingS break; case Platform.IOS: - var universalUrl = useNative ? Mobile.NativeProtocol : Mobile.UniversalUrl; - - uri = data.Uri; - - if (!string.IsNullOrWhiteSpace(universalUrl)) - { - uri = data.Uri; - - if (useNative) - { - uri = $"{universalUrl}//{uri}"; - } - else if (universalUrl.EndsWith("/")) - { - uri = $"{universalUrl}{uri}"; - } - else - { - uri = $"{universalUrl}/{uri}"; - } - } - - if (string.IsNullOrWhiteSpace(uri)) - { - throw new Exception("Got empty URI when attempting to create WC deeplink"); - } - + uri = GetIOSDeeplink(data.Uri, useNative); break; default: @@ -70,15 +43,43 @@ public void OpenDeeplink(ConnectedData data, IOperatingSystemMediator operatingS operatingSystemMediator.OpenUrl(uri); } + private string GetIOSDeeplink(string uri, bool useNative) + { + string url = useNative ? Mobile.NativeProtocol : Mobile.UniversalUrl; + + if (!string.IsNullOrWhiteSpace(url)) + { + if (useNative) + { + uri = $"{url}//{uri}"; + } + else if (url.EndsWith("/")) + { + uri = $"{url}{uri}"; + } + else + { + uri = $"{url}/{uri}"; + } + } + + if (string.IsNullOrEmpty(uri)) + { + WCLogger.LogError("Failed to open Wallet for IOS: NullOrEmpty URI"); + } + + return uri; + } + public void OpenWallet(IOperatingSystemMediator operatingSystemMediator) { WalletLinkModel linkData = operatingSystemMediator.IsMobilePlatform ? Mobile : Desktop; string universalUrl = linkData.UniversalUrl; - if (string.IsNullOrWhiteSpace(universalUrl)) + if (string.IsNullOrEmpty(universalUrl)) { - throw new Exception("Got empty URI when attempting to create WC deeplink"); + WCLogger.LogError($"Failed to open Wallet : NullOrEmpty Deeplink URI for {operatingSystemMediator.Platform} Platform"); } operatingSystemMediator.OpenUrl(universalUrl); From f560b5085bcfe3a38de8c74106ffe86666c86776 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 13 Oct 2023 22:44:49 +0300 Subject: [PATCH 066/167] Desktop redirecting and linking Implemented --- .../ChainSafe.Gaming.WalletConnect.csproj | 1 - .../Models/WalletConnectWalletModel.cs | 109 +++++++++++++----- .../WalletConnectProvider.cs | 2 +- 3 files changed, 80 insertions(+), 32 deletions(-) diff --git a/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj b/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj index 7f576747c..c86c5469a 100644 --- a/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj +++ b/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj @@ -4,7 +4,6 @@ netstandard2.1 9.0 ChainSafe.Gaming.WalletConnect - False True ../../global.ruleset ChainSafe.Gaming.MetaMaskBrowserWallet diff --git a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs index e614a6a86..2a7b410ab 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs @@ -1,3 +1,4 @@ +using System.Web; using ChainSafe.Gaming.Web3.Environment; using Newtonsoft.Json; using WalletConnectSharp.Common.Logging; @@ -19,23 +20,43 @@ public class WalletConnectWalletModel [JsonProperty("image_url")] public ImageUrlsModel Images { get; private set; } - public void OpenDeeplink(ConnectedData data, IOperatingSystemMediator operatingSystemMediator, bool useNative = false) + public void OpenDeeplink(ConnectedData data, IOperatingSystemMediator operatingSystemMediator, string symKey) { - string uri = string.Empty; + string uri = data.Uri; + + // if storage is persistent sometimes symKey might be embedded in uri incorrectly, wallet connect issue + string symKeyInUri = $"symKey={symKey}"; + + // remove symKey in Uri if it exists + uri = uri.Replace(symKeyInUri, string.Empty); switch (operatingSystemMediator.Platform) { case Platform.Android: - uri = data.Uri; // Android OS should handle wc: protocol + // Android OS should handle wc: protocol break; - case Platform.IOS: - uri = GetIOSDeeplink(data.Uri, useNative); + case Platform.IOS: case Platform.Desktop: case Platform.Editor: + if (string.IsNullOrEmpty(symKey)) + { + WCLogger.LogError($"Failed to open {Name} Wallet Deeplink : SymKey NullOrEmpty"); + + return; + } + + uri = GetDeeplink(data.Uri, operatingSystemMediator.IsMobilePlatform, symKey); break; default: - WCLogger.LogError($"{operatingSystemMediator.Platform} Platform doesn't support deeplink"); - break; + WCLogger.LogError($"{operatingSystemMediator.Platform} Platform doesn't support {Name} Wallet deeplink"); + return; + } + + if (string.IsNullOrEmpty(uri)) + { + WCLogger.LogError($"Failed to open {Name} Wallet Deeplink : Uri NullOrEmpty"); + + return; } WCLogger.Log($"Opening URL {uri}"); @@ -43,46 +64,74 @@ public void OpenDeeplink(ConnectedData data, IOperatingSystemMediator operatingS operatingSystemMediator.OpenUrl(uri); } - private string GetIOSDeeplink(string uri, bool useNative) + // Deeplink Building + private string GetDeeplink(string uri, bool isMobilePlatform, string symKey) { - string url = useNative ? Mobile.NativeProtocol : Mobile.UniversalUrl; + WalletLinkModel linkData = GetLinkData(isMobilePlatform); + + // prefer native protocol + return CanUseNativeProtocol(isMobilePlatform) ? BuildNativeDeeplink(linkData.NativeProtocol, uri, symKey) : BuildUniversalDeeplink(linkData.UniversalUrl, uri, symKey); + } - if (!string.IsNullOrWhiteSpace(url)) + private string BuildNativeDeeplink(string url, string uri, string symKey) + { + if (url.EndsWith(':')) { - if (useNative) - { - uri = $"{url}//{uri}"; - } - else if (url.EndsWith("/")) - { - uri = $"{url}{uri}"; - } - else - { - uri = $"{url}/{uri}"; - } + url += "//"; } - if (string.IsNullOrEmpty(uri)) + url += "wc"; + + return AddDeeplinkParams(url, uri, symKey); + } + + private string BuildUniversalDeeplink(string url, string uri, string symKey) + { + if (!url.EndsWith('/')) { - WCLogger.LogError("Failed to open Wallet for IOS: NullOrEmpty URI"); + url += "/"; } - return uri; + return AddDeeplinkParams(url, uri, symKey); + } + + private string AddDeeplinkParams(string url, string uri, string symKey) + { + url += $"?uri={HttpUtility.UrlEncode(uri)}"; + + url += $"&symKey={HttpUtility.UrlEncode(symKey)}"; + + return url; } public void OpenWallet(IOperatingSystemMediator operatingSystemMediator) { - WalletLinkModel linkData = operatingSystemMediator.IsMobilePlatform ? Mobile : Desktop; + bool isMobilePlatform = operatingSystemMediator.IsMobilePlatform; + + WalletLinkModel linkData = GetLinkData(isMobilePlatform); - string universalUrl = linkData.UniversalUrl; + string deeplink = CanUseNativeProtocol(isMobilePlatform) ? linkData.NativeProtocol : linkData.UniversalUrl; - if (string.IsNullOrEmpty(universalUrl)) + if (string.IsNullOrEmpty(deeplink)) { - WCLogger.LogError($"Failed to open Wallet : NullOrEmpty Deeplink URI for {operatingSystemMediator.Platform} Platform"); + WCLogger.LogError($"Failed to open {Name} Wallet : NullOrEmpty Deeplink URI for {operatingSystemMediator.Platform} Platform"); + + return; } - operatingSystemMediator.OpenUrl(universalUrl); + operatingSystemMediator.OpenUrl(deeplink); + } + + private WalletLinkModel GetLinkData(bool isMobilePlatform) + { + return isMobilePlatform ? Mobile : Desktop; + } + + private bool CanUseNativeProtocol(bool isMobilePlatform) + { + string nativeUrl = GetLinkData(isMobilePlatform).NativeProtocol; + + return !string.IsNullOrWhiteSpace(nativeUrl) && nativeUrl != ":"; } } } \ No newline at end of file diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectProvider.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectProvider.cs index 8aeb91e77..c350a1ce9 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectProvider.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectProvider.cs @@ -141,7 +141,7 @@ public async Task Connect() { if (config.DefaultWallet != null) { - config.DefaultWallet.OpenDeeplink(ConnectedData, operatingSystem); + config.DefaultWallet.OpenDeeplink(ConnectedData, operatingSystem, Core.Pairing.ParseUri(ConnectedData.Uri)?.SymKey); } else { From 3072b6f675632dd7a07aaf129b77197a6bfd1d55 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 13 Oct 2023 22:48:32 +0300 Subject: [PATCH 067/167] lint fix --- .../Models/WalletConnectWalletModel.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs index 2a7b410ab..6ce666811 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs @@ -36,7 +36,9 @@ public void OpenDeeplink(ConnectedData data, IOperatingSystemMediator operatingS // Android OS should handle wc: protocol break; - case Platform.IOS: case Platform.Desktop: case Platform.Editor: + case Platform.IOS: + case Platform.Desktop: + case Platform.Editor: if (string.IsNullOrEmpty(symKey)) { WCLogger.LogError($"Failed to open {Name} Wallet Deeplink : SymKey NullOrEmpty"); From 46251fb44108e7ffa44c275e48b459c235e833f6 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 13 Oct 2023 22:55:19 +0300 Subject: [PATCH 068/167] removed unnecessary/unused field --- .../2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs index d787d28a2..ab56d293f 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs @@ -7,8 +7,6 @@ public class Logout : MonoBehaviour { - private bool _quitting; - public async void OnLogout() { // Remove the saved "remember me" data, if any From 096327c75b6b971564f604b412b99af8b4883c1f Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 13 Oct 2023 19:55:59 +0000 Subject: [PATCH 069/167] Auto-duplicate Package Samples --- .../Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs index d787d28a2..ab56d293f 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs @@ -7,8 +7,6 @@ public class Logout : MonoBehaviour { - private bool _quitting; - public async void OnLogout() { // Remove the saved "remember me" data, if any From 7e0025ec500e8dbd0e4c0dec8ac0621a11575524 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 16 Oct 2023 09:31:30 +0300 Subject: [PATCH 070/167] deeplink uri building fix --- .../Models/WalletConnectWalletModel.cs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs index 6ce666811..10b053a06 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs @@ -81,19 +81,16 @@ private string BuildNativeDeeplink(string url, string uri, string symKey) { url += "//"; } - - url += "wc"; + else if (url.EndsWith("//")) + { + url += "wc"; + } return AddDeeplinkParams(url, uri, symKey); } private string BuildUniversalDeeplink(string url, string uri, string symKey) { - if (!url.EndsWith('/')) - { - url += "/"; - } - return AddDeeplinkParams(url, uri, symKey); } From b85a8768fb7bd48d657ef29519a3579fdfaa6051 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 16 Oct 2023 20:28:36 +0300 Subject: [PATCH 071/167] checkpoint --- .../Assets/ExistingWalletLogin.cs | 191 ++++++++++ .../Assets/ExistingWalletLogin.cs.meta | 11 + .../Web3.Unity Samples/Scripts/Samples.asmdef | 3 +- .../Scripts/Scenes/Login.cs | 328 +----------------- .../Assets/Web3AuthLogin.cs | 124 +++++++ .../Assets/Web3AuthLogin.cs.meta | 11 + 6 files changed, 354 insertions(+), 314 deletions(-) create mode 100644 src/UnitySampleProject/Assets/ExistingWalletLogin.cs create mode 100644 src/UnitySampleProject/Assets/ExistingWalletLogin.cs.meta create mode 100644 src/UnitySampleProject/Assets/Web3AuthLogin.cs create mode 100644 src/UnitySampleProject/Assets/Web3AuthLogin.cs.meta diff --git a/src/UnitySampleProject/Assets/ExistingWalletLogin.cs b/src/UnitySampleProject/Assets/ExistingWalletLogin.cs new file mode 100644 index 000000000..f07d2e969 --- /dev/null +++ b/src/UnitySampleProject/Assets/ExistingWalletLogin.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using ChainSafe.Gaming.WalletConnect; +using ChainSafe.Gaming.WalletConnect.Models; +using ChainSafe.Gaming.Web3.Build; +using Newtonsoft.Json; +using Scenes; +using TMPro; +using UnityEngine; +using UnityEngine.Assertions; +using UnityEngine.Networking; +using UnityEngine.UI; +using WalletConnectSharp.Core; +using WalletConnectSharp.Sign.Models; +using WalletConnectSharp.Sign.Models.Engine; + +public class ExistingWalletLogin : Login +{ + internal const string SavedWalletConnectConfigKey = "SavedWalletConnectConfig"; + + [SerializeField] private TMP_Dropdown supportedWalletsDropdown; + + [SerializeField] private Toggle redirectToWalletToggle; + + [Header("Wallet Connect")] + + [SerializeField] private string projectId; + + [SerializeField] public string projectName; + + [SerializeField] public string baseContext; + + [SerializeField] private Metadata metadata; + + [SerializeField] private WalletConnectModal walletConnectModal; + + private bool isRedirectionWalletAgnostic = false; + + private bool autoLogin; + + private Dictionary supportedWallets; + + private WalletConnectConfig walletConnectConfig; + + private void OnDestroy() + { + if (walletConnectConfig != null) + { + walletConnectConfig.OnConnected -= WalletConnected; + + walletConnectConfig.OnSessionApproved -= SessionApproved; + } + } + + protected override IEnumerator Initialize() + { + Assert.IsNotNull(ExistingWalletButton); + Assert.IsNotNull(RememberMeToggle); + +#if UNITY_ANDROID + + isRedirectionWalletAgnostic = true; + +#endif + + if (!isRedirectionWalletAgnostic) + { + yield return InitializeWalletSelection(); + } + + var autoLoginTask = TryAutoLogin(); + + yield return new WaitUntil(() => autoLoginTask.IsCompleted); + + ExistingWalletButton.onClick.AddListener(TryLogin); + } + + protected override Web3Builder ConfigureWeb3Services(Web3Builder web3Builder) + { + return web3Builder.Configure(services => + { + services + .UseWalletConnectProvider(BuildWalletConnectConfig()) + .UseWalletConnectSigner() + .UseWalletConnectTransactionExecutor(); + }); + } + + private async Task TryAutoLogin() + { + string savedConfigJson = PlayerPrefs.GetString(SavedWalletConnectConfigKey, null); + + if (string.IsNullOrEmpty(savedConfigJson)) + { + return; + } + + Debug.Log("Attempting to Auto Login..."); + + try + { + autoLogin = true; + + walletConnectConfig = JsonConvert.DeserializeObject(savedConfigJson); + + await LoginWithExistingAccount(); + } + catch (Exception e) + { + Debug.LogError($"Auto Login Failed with Exception {e}"); + + autoLogin = false; + } + } + + // add all supported wallets + private IEnumerator InitializeWalletSelection() + { + yield return FetchSupportedWallets(); + + List supportedWalletNames = supportedWallets.Values.Select(w => w.Name).ToList(); + + supportedWalletsDropdown.AddOptions(supportedWalletNames); + + redirectToWalletToggle.onValueChanged.AddListener(supportedWalletsDropdown.gameObject.SetActive); + } + + private IEnumerator FetchSupportedWallets() + { + using (UnityWebRequest webRequest = UnityWebRequest.Get("https://registry.walletconnect.org/data/wallets.json")) + { + // Request and wait for the desired page. + yield return webRequest.SendWebRequest(); + + if (webRequest.result != UnityWebRequest.Result.Success) + { + Debug.LogError("Error Getting Supported Wallets: " + webRequest.error); + + yield return null; + } + + else + { + var json = webRequest.downloadHandler.text; + + supportedWallets = JsonConvert.DeserializeObject>(json) + .ToDictionary(w => w.Key, w => (WalletConnectWalletModel) w.Value); + + Debug.Log($"Fetched {supportedWallets.Count} Supported Wallets."); + } + } + } + + private void WalletConnected(ConnectedData data) + { + // already redirecting to wallet + if (walletConnectConfig.RedirectToWallet) + { + return; + } + + // might be null in case of auto login + if (!string.IsNullOrEmpty(data.Uri)) + { + // display QR and copy to clipboard + walletConnectModal.WalletConnected(data); + } + } + + private void SessionApproved(SessionStruct session) + { + // save/persist session + if (walletConnectConfig.KeepSessionAlive) + { + walletConnectConfig.SavedSessionTopic = session.Topic; + + PlayerPrefs.SetString(SavedWalletConnectConfigKey, JsonConvert.SerializeObject(walletConnectConfig)); + } + + else + { + // reset if any saved config + PlayerPrefs.SetString(SavedWalletConnectConfigKey, null); + } + + Debug.Log($"{session.Topic} Approved"); + } +} diff --git a/src/UnitySampleProject/Assets/ExistingWalletLogin.cs.meta b/src/UnitySampleProject/Assets/ExistingWalletLogin.cs.meta new file mode 100644 index 000000000..7bfcb0828 --- /dev/null +++ b/src/UnitySampleProject/Assets/ExistingWalletLogin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 96894e49d9863ec4db1d93a5e56f19cb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Samples.asmdef b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Samples.asmdef index 6a3b2cabf..975c32f4a 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Samples.asmdef +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Samples.asmdef @@ -4,8 +4,7 @@ "references": [ "GUID:5426c6b788696eb4c88f4198b59839eb", "GUID:a37273c0f1cc99640b9cce89c64b02d0", - "GUID:6055be8ebefd69e48b49212b09b47b2f", - "chainsafe.web3-unity.web3auth" + "GUID:6055be8ebefd69e48b49212b09b47b2f" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index e840bc9d1..e4e4cba4a 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -13,7 +13,6 @@ using ChainSafe.Gaming.Web3.Build; using ChainSafe.Gaming.Web3.Unity; using ChainSafe.GamingSdk.Gelato; -using ChainSafe.GamingSdk.Web3Auth; using Newtonsoft.Json; using TMPro; using UnityEngine; @@ -27,154 +26,26 @@ namespace Scenes { - [Serializable] - public class Web3AuthButtonAndProvider + public abstract class Login : MonoBehaviour { - public Button Button; - public Provider Provider; - } - - [Serializable] - public class Web3AuthSettings - { - public string ClientId; - public string RedirectUri; - public Web3Auth.Network Network; - } - - public class Login : MonoBehaviour - { - internal const string SavedWalletConnectConfigKey = "SavedWalletConnectConfig"; - [Header("Configuration")] public string GelatoApiKey = ""; - public Web3AuthSettings Web3AuthSettings; [Header("UI")] public Button ExistingWalletButton; public Toggle RememberMeToggle; public ErrorPopup ErrorPopup; - public List Web3AuthButtons; private bool useWalletConnect; private bool redirectToWallet; - private Dictionary supportedWallets; - - #region Wallet Connect - - private WalletConnectConfig walletConnectConfig; - - private bool autoLogin; - - [field: Header("Wallet Connect")] - - [SerializeField] private TMP_Dropdown supportedWalletsDropdown; - - [SerializeField] private Toggle redirectToWalletToggle; - - [SerializeField] private WalletConnectModal walletConnectModal; - - [field: SerializeField] public string ProjectId { get; private set; } - - [field: SerializeField] public string ProjectName { get; private set; } - - [field: SerializeField] public string BaseContext { get; private set; } - - [field: SerializeField] public Metadata Metadata { get; private set; } = new Metadata - { - Name = "Web3.Unity", - //from package.json - Description = "web3.unity is an open-source gaming SDK written in C# and developed by ChainSafe Gaming. It connects games built in the Unity game engine to the blockchain. The library currently supports games built for web browsers (WebGL), iOS/Android mobile, and desktop. web3.unity is compatible with most EVM-based chains such as Ethereum, Polygon, Moonbeam, Cronos, Nervos, and Binance Smart Chain, letting developers easily choose and switch between them to create the best in-game experience.", - Url = "https://chainsafe.io/" - }; - - #endregion - private IEnumerator Start() { - Assert.IsNotNull(Web3AuthButtons); - Assert.IsTrue(Web3AuthButtons.Count > 0); - Assert.IsTrue(Web3AuthButtons.All(b => b.Button)); - Assert.IsNotNull(ExistingWalletButton); - Assert.IsNotNull(RememberMeToggle); - - useWalletConnect = Application.platform != RuntimePlatform.WebGLPlayer; - - // Remember me only works with the WebPageWallet - RememberMeToggle.gameObject.SetActive(useWalletConnect); - - // Wallet Connect - yield return FetchSupportedWallets(); - - // enable this on editor to test UI flow and functions - if (Application.isMobilePlatform || Application.isEditor) - { - InitializeMobileOptions(); - } - -#if UNITY_WEBGL - ProcessWeb3Auth(); -#endif - var autoLoginTask = TryAutoLogin(); - - yield return new WaitUntil(() => autoLoginTask.IsCompleted); - - ExistingWalletButton.onClick.AddListener(OnLoginWithExistingAccount); - - foreach (var buttonAndProvider in Web3AuthButtons) - { - var button = buttonAndProvider.Button; - var provider = buttonAndProvider.Provider; - button.onClick.AddListener(() => LoginWithWeb3Auth(provider)); - } - } - - private void OnDestroy() - { - if (walletConnectConfig != null) - { - walletConnectConfig.OnConnected -= WalletConnected; - - walletConnectConfig.OnSessionApproved -= SessionApproved; - } - } - - private void WalletConnected(ConnectedData data) - { - // already redirecting to wallet - if (redirectToWallet) - { - return; - } - - // might be null in case of auto login - if (!string.IsNullOrEmpty(data.Uri)) - { - // display QR and copy to clipboard - walletConnectModal.WalletConnected(data); - } + yield return Initialize(); } - - private void SessionApproved(SessionStruct session) - { - // save/persist session - if (walletConnectConfig.KeepSessionAlive) - { - walletConnectConfig.SavedSessionTopic = session.Topic; - - PlayerPrefs.SetString(SavedWalletConnectConfigKey, JsonConvert.SerializeObject(walletConnectConfig)); - } - else - { - // reset if any saved config - PlayerPrefs.SetString(SavedWalletConnectConfigKey, null); - } - - Debug.Log($"{session.Topic} Approved"); - } + protected abstract IEnumerator Initialize(); // redirect to mobile wallet and select default wallet on IOS private void InitializeMobileOptions() @@ -185,177 +56,34 @@ private void InitializeMobileOptions() #endif } - // add all supported wallets - private void InitializeWalletDropdown() - { - redirectToWalletToggle.onValueChanged.AddListener(isOn => - { - supportedWalletsDropdown.gameObject.SetActive(isOn); - }); - - // first element is a no select - List supportedWalletsList = new List - { - // default option/unselected - "Select Wallet", - }; - - supportedWalletsList.AddRange(supportedWallets.Values.Select(w => w.Name)); - - supportedWalletsDropdown.AddOptions(supportedWalletsList); - } + protected abstract Web3Builder ConfigureWeb3Services(Web3Builder web3Builder); - private async Task TryAutoLogin() + protected async void TryLogin() { - if (!useWalletConnect) - return; - - string savedConfigJson = PlayerPrefs.GetString(SavedWalletConnectConfigKey, null); - - if (string.IsNullOrEmpty(savedConfigJson)) - { - return; - } - - Debug.Log("Attempting to Auto Login..."); + Web3 web3; try { - autoLogin = true; + Web3Builder web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) + .Configure(ConfigureCommonServices); - walletConnectConfig = JsonConvert.DeserializeObject(savedConfigJson); - - await LoginWithExistingAccount(); - } - catch (Exception e) - { - Debug.LogError($"Auto Login Failed with Exception {e}"); - - autoLogin = false; - } - } - - private async void OnLoginWithExistingAccount() - { -#if UNITY_IOS - // can't redirect to wallet on IOS if there's no selected wallet - if (redirectToWalletToggle.isOn && supportedWalletsDropdown.value == 0) - { - // feedback - Debug.LogError("Please select a Wallet first"); + web3Builder = ConfigureWeb3Services(web3Builder); - return; - } -#endif - - await LoginWithExistingAccount(); - } - - private async Task LoginWithExistingAccount() - { - var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) - .Configure(ConfigureCommonServices) - .Configure(services => - { - /* The WebGL wallet only works inside WebGL builds, - * and it makes little sense to use the web page wallet - * inside WebGL, so the choice can be automated here - * by looking at the platform we're running on. - */ - if (useWalletConnect) - { - services - .UseWalletConnectProvider(BuildWalletConnectConfig()) - .UseWalletConnectSigner() - .UseWalletConnectTransactionExecutor(); - } - else - { - services.UseWebGLWallet(); - } - }); - - await ProcessLogin(web3Builder); - } - - private async void LoginWithWeb3Auth(Provider provider) - { - var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) - .Configure(ConfigureCommonServices) - .Configure(services => - { - var web3AuthConfig = new Web3AuthWalletConfig - { - Web3AuthOptions = new() - { - clientId = Web3AuthSettings.ClientId, - redirectUrl = new Uri(Web3AuthSettings.RedirectUri), - network = Web3AuthSettings.Network, - whiteLabel = new() - { - dark = true, - defaultLanguage = "en", - name = "ChainSafe Gaming SDK", - } - }, - LoginParams = new() { loginProvider = provider } - }; - services.UseWeb3AuthWallet(web3AuthConfig); - }); - await ProcessLogin(web3Builder); - } - - private async void ProcessWeb3Auth() - { - var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) - .Configure(ConfigureCommonServices) - .Configure(services => - { - var web3AuthConfig = new Web3AuthWalletConfig - { - Web3AuthOptions = new() - { - whiteLabel = new() - { - dark = true, - defaultLanguage = "en", - name = "ChainSafe Gaming SDK", - }, - clientId = Web3AuthSettings.ClientId, - redirectUrl = new Uri(Web3AuthSettings.RedirectUri), - network = Web3AuthSettings.Network, - - }, - }; - services.UseWeb3AuthWallet(web3AuthConfig); - }); - await ProcessLogin(web3Builder); - } - - - private async Task ProcessLogin(Web3Builder builder) - { - Web3 web3; - try - { - web3 = await builder.BuildAsync(); - } - catch (Web3Exception) - { - ErrorPopup.ShowError($"Login failed, please try again\n(see console for more details)"); - throw; + web3 = await web3Builder.BuildAsync(); } + catch (Exception) { - ErrorPopup.ShowError($"Unknown error occured\n(see console for more details)"); + ErrorPopup.ShowError("Login failed, please try again\n(see console for more details)"); throw; } - + Web3Accessor.Set(web3); + SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1); } - private void ConfigureCommonServices(IWeb3ServiceCollection services) + protected void ConfigureCommonServices(IWeb3ServiceCollection services) { services .UseUnityEnvironment() @@ -437,31 +165,7 @@ private WalletConnectConfig BuildWalletConnectConfig() return config; } - private IEnumerator FetchSupportedWallets() - { - using (UnityWebRequest webRequest = UnityWebRequest.Get("https://registry.walletconnect.org/data/wallets.json")) - { - // Request and wait for the desired page. - yield return webRequest.SendWebRequest(); - - if (webRequest.result != UnityWebRequest.Result.Success) - { - Debug.LogError("Error Getting Supported Wallets: " + webRequest.error); - - yield return null; - } - - else - { - var json = webRequest.downloadHandler.text; - - supportedWallets = JsonConvert.DeserializeObject>(json) - .ToDictionary(w => w.Key, w => (WalletConnectWalletModel) w.Value); - - Debug.Log($"Fetched {supportedWallets.Count} Supported Wallets."); - } - } - } + #endregion } diff --git a/src/UnitySampleProject/Assets/Web3AuthLogin.cs b/src/UnitySampleProject/Assets/Web3AuthLogin.cs new file mode 100644 index 000000000..22a95182a --- /dev/null +++ b/src/UnitySampleProject/Assets/Web3AuthLogin.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using ChainSafe.Gaming.Evm.Contracts; +using ChainSafe.Gaming.Evm.JsonRpc; +using ChainSafe.Gaming.UnityPackage; +using ChainSafe.Gaming.Web3; +using ChainSafe.Gaming.Web3.Build; +using ChainSafe.Gaming.Web3.Unity; +using ChainSafe.GamingSdk.Gelato; +using ChainSafe.GamingSdk.Web3Auth; +using Scenes; +using UnityEngine; +using UnityEngine.Assertions; +using UnityEngine.Serialization; +using UnityEngine.UI; +using Network = Web3Auth.Network; + +public class Web3AuthLogin : Login +{ + [Serializable] + public class ProviderAndButtonPair + { + public Button Button; + public Provider Provider; + } + + [Serializable] + public class Web3AuthSettings + { + public string ClientId; + public string RedirectUri; + public Network Network; + } + + [SerializeField] private Web3AuthSettings web3AuthSettings; + [SerializeField] private List providerAndButtonPairs; + + protected override IEnumerator Initialize() + { +#if UNITY_WEBGL + ProcessWeb3Auth(); +#endif + + //add listener + foreach (var pair in providerAndButtonPairs) + { + pair.Button.onClick.AddListener(() => LoginWithWeb3Auth(pair.Provider)); + } + + yield return null; + } + + private async void LoginWithWeb3Auth(Provider provider) + { + Web3Builder web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) + .Configure(ConfigureCommonServices) + .Configure(services => + { + var web3AuthConfig = new Web3AuthWalletConfig + { + Web3AuthOptions = new() + { + clientId = web3AuthSettings.ClientId, + redirectUrl = new Uri(web3AuthSettings.RedirectUri), + network = web3AuthSettings.Network, + whiteLabel = new() + { + dark = true, + defaultLanguage = "en", + name = "ChainSafe Gaming SDK", + } + }, + LoginParams = new() { loginProvider = provider } + }; + services.UseWeb3AuthWallet(web3AuthConfig); + }); + + await ProcessLogin(web3Builder); + } + + private async Task ProcessLogin(Web3Builder web3Builder) + { + try + { + Web3 web3 = await web3Builder.BuildAsync(); + } + + catch (Exception e) + { + throw new Exception($"Login With Web3Auth Failed : Failed with Exception {e}"); + } + } + + private async void ProcessWeb3Auth() + { + var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) + .Configure(ConfigureCommonServices) + .Configure(services => + { + var web3AuthConfig = new Web3AuthWalletConfig + { + Web3AuthOptions = new() + { + whiteLabel = new() + { + dark = true, + defaultLanguage = "en", + name = "ChainSafe Gaming SDK", + }, + clientId = web3AuthSettings.ClientId, + redirectUrl = new Uri(web3AuthSettings.RedirectUri), + network = web3AuthSettings.Network, + + }, + }; + services.UseWeb3AuthWallet(web3AuthConfig); + }); + + await ProcessLogin(web3Builder); + } +} diff --git a/src/UnitySampleProject/Assets/Web3AuthLogin.cs.meta b/src/UnitySampleProject/Assets/Web3AuthLogin.cs.meta new file mode 100644 index 000000000..d9178870b --- /dev/null +++ b/src/UnitySampleProject/Assets/Web3AuthLogin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e7c221a71bcfd4a4e8cfa4838e18c4be +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From ac5b4b16b2138ccbec52f0ea7a43b3ffdc771027 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 16 Oct 2023 20:31:48 +0300 Subject: [PATCH 072/167] bash script files fix ## added a directory check --- scripts/publish-to-unity-package.sh | 3 +++ scripts/setup.sh | 3 +++ 2 files changed, 6 insertions(+) diff --git a/scripts/publish-to-unity-package.sh b/scripts/publish-to-unity-package.sh index a9f86cbb2..3d6bfd43c 100755 --- a/scripts/publish-to-unity-package.sh +++ b/scripts/publish-to-unity-package.sh @@ -1,6 +1,9 @@ #! /usr/bin/env sh set -e +## if directory exists, we make check and cd here so script can work from both when bash is run from scripts and from repo root +[ -d "scripts" ] && cd scripts + echo Building project... pushd ../src/ChainSafe.Gaming.Unity diff --git a/scripts/setup.sh b/scripts/setup.sh index ab5d507a0..067785362 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -3,5 +3,8 @@ # clone submodules git submodule update --init +## if directory exists, we make check and cd here so script can work from both when bash is run from scripts and from repo root +[ -d "scripts" ] && cd scripts + # publish DLLs to unity package ./publish-to-unity-package.sh From 60327bd1bcb7c022c25315c7afabfb246694c762 Mon Sep 17 00:00:00 2001 From: Peter Kalambet Date: Mon, 16 Oct 2023 20:48:44 +0200 Subject: [PATCH 073/167] uptdae scripts --- scripts/debug-publish-to-unity-package.sh | 3 ++- scripts/lint.sh | 6 ++++-- scripts/publish-to-unity-package.sh | 4 +++- scripts/publish.sh | 5 +++++ scripts/release-web3-auth.sh | 5 +++-- scripts/release-web3-unity.sh | 7 ++++--- scripts/setup.sh | 6 +++++- 7 files changed, 26 insertions(+), 10 deletions(-) mode change 100644 => 100755 scripts/debug-publish-to-unity-package.sh diff --git a/scripts/debug-publish-to-unity-package.sh b/scripts/debug-publish-to-unity-package.sh old mode 100644 new mode 100755 index 04f28d028..4da5585d4 --- a/scripts/debug-publish-to-unity-package.sh +++ b/scripts/debug-publish-to-unity-package.sh @@ -3,7 +3,8 @@ set -e echo Building project... -pushd src/ChainSafe.Gaming.Unity +scripts_dir=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +pushd "$scripts_dir"/../src/ChainSafe.Gaming.Unity rm -rf obj rm -rf bin diff --git a/scripts/lint.sh b/scripts/lint.sh index 7f0daf0c5..e10e45f30 100755 --- a/scripts/lint.sh +++ b/scripts/lint.sh @@ -1,14 +1,16 @@ #!/bin/bash set -e +scripts_dir=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) edit="" if [ "$1" == "ci" ]; then edit="--verify-no-changes"; fi -dotnet format --verbosity=d $edit --severity=warn ./ChainSafe.Gaming.sln --exclude ./submodules +dotnet format --verbosity=d $edit --severity=warn "$scripts_dir"/../ChainSafe.Gaming.sln --exclude ./submodules if [ "$edit" == "" ]; then echo "Linting Unity Sample Project" - pushd src/UnitySampleProject + + pushd "$scripts_dir"/../src/UnitySampleProject dotnet format --verbosity=d --severity=warn ./UnitySampleProject.sln popd fi diff --git a/scripts/publish-to-unity-package.sh b/scripts/publish-to-unity-package.sh index a9f86cbb2..bf67e2700 100755 --- a/scripts/publish-to-unity-package.sh +++ b/scripts/publish-to-unity-package.sh @@ -2,7 +2,9 @@ set -e echo Building project... -pushd ../src/ChainSafe.Gaming.Unity +scripts_dir=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) + +pushd "$scripts_dir"/../src/ChainSafe.Gaming.Unity rm -rf obj rm -rf bin diff --git a/scripts/publish.sh b/scripts/publish.sh index 89c88c8fc..01ea93249 100644 --- a/scripts/publish.sh +++ b/scripts/publish.sh @@ -1,6 +1,11 @@ #! /usr/bin/env sh +scripts_dir=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) + +pushd "$scripts_dir"/../ dotnet publish -c release /property:Unity=true pushd ../.. dotnet restore + +popd popd \ No newline at end of file diff --git a/scripts/release-web3-auth.sh b/scripts/release-web3-auth.sh index 6d7f4b2b8..2ed33b5e5 100644 --- a/scripts/release-web3-auth.sh +++ b/scripts/release-web3-auth.sh @@ -1,8 +1,9 @@ #! /usr/bin/env sh -./scripts/setup.sh +scripts_dir=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +source "$scripts_dir"/setup.sh -git add ../Packages/io.chainsafe.web3-unity.web3auth/. +git add "$scripts_dir"/../Packages/io.chainsafe.web3-unity.web3auth/. MESSAGE="release-v$1" diff --git a/scripts/release-web3-unity.sh b/scripts/release-web3-unity.sh index 6ad9f67ae..0e6d971af 100644 --- a/scripts/release-web3-unity.sh +++ b/scripts/release-web3-unity.sh @@ -1,10 +1,11 @@ #! /usr/bin/env sh -./scripts/setup.sh +scripts_dir=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +source "$scripts_dir"/setup.sh -git add ../Packages/io.chainsafe.web3-unity/. +git add "$scripts_dir"/../Packages/io.chainsafe.web3-unity/. -git add ../Packages/io.chainsafe.web3-unity/Runtime/Libraries/. -f +git add "$scripts_dir"/../Packages/io.chainsafe.web3-unity/Runtime/Libraries/. -f MESSAGE="release-v$1" diff --git a/scripts/setup.sh b/scripts/setup.sh index ab5d507a0..c7e53008c 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -1,7 +1,11 @@ #! /usr/bin/env sh +scripts_dir=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) +pushd "$scripts_dir"/../ # clone submodules git submodule update --init +popd # publish DLLs to unity package -./publish-to-unity-package.sh +source "$scripts_dir"/publish-to-unity-package.sh + From 33f297565ab83d318523d65e96d5289cf0f1244d Mon Sep 17 00:00:00 2001 From: Peter Kalambet Date: Mon, 16 Oct 2023 21:00:49 +0200 Subject: [PATCH 074/167] remove scripts merge conflicts --- scripts/publish-to-unity-package.sh | 3 --- scripts/setup.sh | 3 --- 2 files changed, 6 deletions(-) diff --git a/scripts/publish-to-unity-package.sh b/scripts/publish-to-unity-package.sh index f7f9e084d..bf67e2700 100755 --- a/scripts/publish-to-unity-package.sh +++ b/scripts/publish-to-unity-package.sh @@ -1,9 +1,6 @@ #! /usr/bin/env sh set -e -## if directory exists, we make check and cd here so script can work from both when bash is run from scripts and from repo root -[ -d "scripts" ] && cd scripts - echo Building project... scripts_dir=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) diff --git a/scripts/setup.sh b/scripts/setup.sh index 24a34c49a..c7e53008c 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -6,9 +6,6 @@ pushd "$scripts_dir"/../ git submodule update --init popd -## if directory exists, we make check and cd here so script can work from both when bash is run from scripts and from repo root -[ -d "scripts" ] && cd scripts - # publish DLLs to unity package source "$scripts_dir"/publish-to-unity-package.sh From 4827f1f34c6b0a3faaad67288c2f337c3485b179 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 17 Oct 2023 13:05:49 +0300 Subject: [PATCH 075/167] checkpoint --- .../Assets/ExistingWalletLogin.cs | 79 +++++++++++-- .../Scenes/SampleLogin.unity | 109 +++--------------- .../Scripts/Scenes/Login.cs | 95 +-------------- .../Assets/Web3AuthLogin.cs | 108 ++++++++--------- 4 files changed, 134 insertions(+), 257 deletions(-) diff --git a/src/UnitySampleProject/Assets/ExistingWalletLogin.cs b/src/UnitySampleProject/Assets/ExistingWalletLogin.cs index f07d2e969..ba7b3cd93 100644 --- a/src/UnitySampleProject/Assets/ExistingWalletLogin.cs +++ b/src/UnitySampleProject/Assets/ExistingWalletLogin.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using ChainSafe.Gaming.UnityPackage; using ChainSafe.Gaming.WalletConnect; using ChainSafe.Gaming.WalletConnect.Models; using ChainSafe.Gaming.Web3.Build; @@ -12,6 +13,7 @@ using UnityEngine; using UnityEngine.Assertions; using UnityEngine.Networking; +using UnityEngine.Serialization; using UnityEngine.UI; using WalletConnectSharp.Core; using WalletConnectSharp.Sign.Models; @@ -19,12 +21,19 @@ public class ExistingWalletLogin : Login { - internal const string SavedWalletConnectConfigKey = "SavedWalletConnectConfig"; + private const string SavedWalletConnectConfigKey = "SavedWalletConnectConfig"; + + [Header("UI")] [SerializeField] private TMP_Dropdown supportedWalletsDropdown; [SerializeField] private Toggle redirectToWalletToggle; + [SerializeField] public Button loginButton; + + [SerializeField] private Toggle rememberMeToggle; + + [Header("Wallet Connect")] [SerializeField] private string projectId; @@ -41,6 +50,8 @@ public class ExistingWalletLogin : Login private bool autoLogin; + private bool redirectToWallet; + private Dictionary supportedWallets; private WalletConnectConfig walletConnectConfig; @@ -57,12 +68,15 @@ private void OnDestroy() protected override IEnumerator Initialize() { - Assert.IsNotNull(ExistingWalletButton); - Assert.IsNotNull(RememberMeToggle); + Assert.IsNotNull(loginButton); + Assert.IsNotNull(rememberMeToggle); #if UNITY_ANDROID - - isRedirectionWalletAgnostic = true; + + if (!Application.isEditor) + { + isRedirectionWalletAgnostic = true; + } #endif @@ -75,9 +89,14 @@ protected override IEnumerator Initialize() yield return new WaitUntil(() => autoLoginTask.IsCompleted); - ExistingWalletButton.onClick.AddListener(TryLogin); + loginButton.onClick.AddListener(LoginClicked); } + private async void LoginClicked() + { + await TryLogin(); + } + protected override Web3Builder ConfigureWeb3Services(Web3Builder web3Builder) { return web3Builder.Configure(services => @@ -106,7 +125,7 @@ private async Task TryAutoLogin() walletConnectConfig = JsonConvert.DeserializeObject(savedConfigJson); - await LoginWithExistingAccount(); + await TryLogin(); } catch (Exception e) { @@ -128,6 +147,52 @@ private IEnumerator InitializeWalletSelection() redirectToWalletToggle.onValueChanged.AddListener(supportedWalletsDropdown.gameObject.SetActive); } + private WalletConnectConfig BuildWalletConnectConfig() + { + // build chain + var projectConfig = ProjectConfigUtilities.Load(); + + ChainModel chain = new ChainModel(ChainModel.EvmNamespace, projectConfig.ChainId, projectConfig.Network); + + WalletConnectWalletModel defaultWallet = null; + + // if it's an auto login get these values from saved wallet config + if (!autoLogin) + { + // allow redirection on editor for testing UI flow + redirectToWallet = redirectToWalletToggle.isOn; + + // needs wallet selected to redirect + if (redirectToWallet && !isRedirectionWalletAgnostic) + { + defaultWallet = supportedWallets.Values.ToArray()[supportedWalletsDropdown.value]; + } + } + + var config = new WalletConnectConfig + { + ProjectId = projectId, + ProjectName = projectName, + BaseContext = baseContext, + Chain = chain, + Metadata = metadata, + SavedSessionTopic = autoLogin ? walletConnectConfig.SavedSessionTopic : null, + SupportedWallets = supportedWallets, + StoragePath = Application.persistentDataPath, + RedirectToWallet = autoLogin ? walletConnectConfig.RedirectToWallet : redirectToWallet, + KeepSessionAlive = autoLogin || rememberMeToggle.isOn, + DefaultWallet = autoLogin ? walletConnectConfig.DefaultWallet : defaultWallet, + }; + + walletConnectConfig = config; + + walletConnectConfig.OnConnected += WalletConnected; + + walletConnectConfig.OnSessionApproved += SessionApproved; + + return config; + } + private IEnumerator FetchSupportedWallets() { using (UnityWebRequest webRequest = UnityWebRequest.Get("https://registry.walletconnect.org/data/wallets.json")) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity index 77c56686b..66572b040 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity @@ -1432,17 +1432,6 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} m_PrefabInstance: {fileID: 374887655} m_PrefabAsset: {fileID: 0} ---- !u!114 &374887657 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 374887655} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 374887658} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1 &374887658 stripped GameObject: m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} @@ -1713,17 +1702,6 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} m_PrefabInstance: {fileID: 452118933} m_PrefabAsset: {fileID: 0} ---- !u!114 &452118935 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 452118933} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 452118936} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1 &452118936 stripped GameObject: m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} @@ -2925,7 +2903,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &981405682 RectTransform: m_ObjectHideFlags: 0 @@ -2943,10 +2921,10 @@ RectTransform: m_Father: {fileID: 2036998554} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 295, y: -135} - m_SizeDelta: {x: 590, y: 50} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &981405683 MonoBehaviour: @@ -3207,37 +3185,19 @@ MonoBehaviour: m_GameObject: {fileID: 1334079840} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9473851428864b439d6561c87053272a, type: 3} + m_Script: {fileID: 11500000, guid: 96894e49d9863ec4db1d93a5e56f19cb, type: 3} m_Name: m_EditorClassIdentifier: GelatoApiKey: _UzPz_Yk_WTjWMfcl45fLvQNGQ9ISx5ZE8TnwnVKYrE_ - Web3AuthSettings: - ClientId: BCc0wTmuXureEzgawhUSZOWu4bgWo56sZPrxLiHQCpg5OHcNrfa44esdTS8Dm77VtmaIyjhbthdWfbLhSwf7jtU - RedirectUri: torusapp://io.chainsafe.gamingsdk.sdkdemoscene/auth - Network: 1 - ExistingWalletButton: {fileID: 787012150} - RememberMeToggle: {fileID: 724612376} ErrorPopup: {fileID: 1701305868} - Web3AuthButtons: - - Button: {fileID: 1996606959} - Provider: 0 - - Button: {fileID: 452118935} - Provider: 10 - - Button: {fileID: 374887657} - Provider: 1 - - Button: {fileID: 2114521194} - Provider: 2 - - Button: {fileID: 1452765489} - Provider: 3 - - Button: {fileID: 1508551058} - Provider: 4 supportedWalletsDropdown: {fileID: 540464236} redirectToWalletToggle: {fileID: 981405684} - walletConnectModal: {fileID: 395689441} - k__BackingField: f4bff60eb260841f46b1c77588cd8acb - k__BackingField: Web3.Unity - k__BackingField: unity-game - k__BackingField: + loginButton: {fileID: 787012150} + rememberMeToggle: {fileID: 724612376} + projectId: f4bff60eb260841f46b1c77588cd8acb + projectName: Web3.Unity + baseContext: unity-game + metadata: Name: Web3.Unity Description: web3.unity is an open-source gaming SDK written in C# and developed by ChainSafe Gaming. It connects games built in the Unity game engine to the @@ -3252,6 +3212,7 @@ MonoBehaviour: Native: Universal: VerifyUrl: + walletConnectModal: {fileID: 395689441} --- !u!1 &1434038407 GameObject: m_ObjectHideFlags: 0 @@ -3397,17 +3358,6 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} m_PrefabInstance: {fileID: 1452765487} m_PrefabAsset: {fileID: 0} ---- !u!114 &1452765489 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1452765487} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1452765490} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1 &1452765490 stripped GameObject: m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} @@ -3577,17 +3527,6 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} m_PrefabInstance: {fileID: 1508551056} m_PrefabAsset: {fileID: 0} ---- !u!114 &1508551058 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1508551056} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1508551059} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1 &1508551059 stripped GameObject: m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} @@ -4807,17 +4746,6 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} m_PrefabInstance: {fileID: 1996606957} m_PrefabAsset: {fileID: 0} ---- !u!114 &1996606959 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1996606957} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1996606960} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1 &1996606960 stripped GameObject: m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} @@ -5333,17 +5261,6 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} m_PrefabInstance: {fileID: 2114521192} m_PrefabAsset: {fileID: 0} ---- !u!114 &2114521194 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 2114521192} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2114521195} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1 &2114521195 stripped GameObject: m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index e4e4cba4a..c88f3ed9e 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -1,64 +1,34 @@ using System; using System.Collections; -using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using ChainSafe.Gaming.Evm.Contracts; using ChainSafe.Gaming.Evm.JsonRpc; using ChainSafe.Gaming.UnityPackage; -using ChainSafe.Gaming.Wallets; -using ChainSafe.Gaming.WalletConnect; -using ChainSafe.Gaming.WalletConnect.Models; using ChainSafe.Gaming.Web3; using ChainSafe.Gaming.Web3.Build; using ChainSafe.Gaming.Web3.Unity; using ChainSafe.GamingSdk.Gelato; -using Newtonsoft.Json; -using TMPro; using UnityEngine; -using UnityEngine.Assertions; -using UnityEngine.Networking; using UnityEngine.SceneManagement; -using UnityEngine.UI; -using WalletConnectSharp.Core; -using WalletConnectSharp.Sign.Models; -using WalletConnectSharp.Sign.Models.Engine; namespace Scenes { public abstract class Login : MonoBehaviour { - [Header("Configuration")] public string GelatoApiKey = ""; - [Header("UI")] - public Button ExistingWalletButton; - public Toggle RememberMeToggle; public ErrorPopup ErrorPopup; - private bool useWalletConnect; - - private bool redirectToWallet; - private IEnumerator Start() { yield return Initialize(); } protected abstract IEnumerator Initialize(); - - // redirect to mobile wallet and select default wallet on IOS - private void InitializeMobileOptions() - { - redirectToWalletToggle.gameObject.SetActive(true); -#if UNITY_IOS - InitializeWalletDropdown(); -#endif - } protected abstract Web3Builder ConfigureWeb3Services(Web3Builder web3Builder); - protected async void TryLogin() + protected async Task TryLogin() { Web3 web3; @@ -105,68 +75,5 @@ protected void ConfigureCommonServices(IWeb3ServiceCollection services) "0x1d6f31b71e12a1a584ca20853495161c48ba491f")); } - - #region Wallet Connect - - private WalletConnectConfig BuildWalletConnectConfig() - { - // build chain - var projectConfig = ProjectConfigUtilities.Load(); - - ChainModel chain = new ChainModel(ChainModel.EvmNamespace, projectConfig.ChainId, projectConfig.Network); - -#if UNITY_IOS - WalletConnectWalletModel defaultWallet = null; -#endif - - // if it's an auto login get these values from saved wallet config - if (!autoLogin) - { - // allow redirection on editor for testing UI flow - redirectToWallet = (Application.isMobilePlatform || Application.isEditor) && redirectToWalletToggle.isOn; - -#if UNITY_IOS - // make sure there's a selected wallet on IOS - redirectToWallet = redirectToWallet && supportedWalletsDropdown.value != 0; - - if (redirectToWallet) - { - // offset for the first/default/unselected dropdown option 0 - int selectedWalletIndex = supportedWalletsDropdown.value - 1; - - defaultWallet = supportedWallets.Values.ToArray()[selectedWalletIndex]; - } -#endif - } - - var config = new WalletConnectConfig - { - ProjectId = ProjectId, - ProjectName = ProjectName, - BaseContext = BaseContext, - Chain = chain, - Metadata = Metadata, - SavedSessionTopic = autoLogin ? walletConnectConfig.SavedSessionTopic : null, - SupportedWallets = supportedWallets, - StoragePath = Application.persistentDataPath, - RedirectToWallet = autoLogin ? walletConnectConfig.RedirectToWallet : redirectToWallet, - KeepSessionAlive = autoLogin || RememberMeToggle.isOn, -#if UNITY_IOS - DefaultWallet = autoLogin ? walletConnectConfig.DefaultWallet : defaultWallet, -#endif - }; - - walletConnectConfig = config; - - walletConnectConfig.OnConnected += WalletConnected; - - walletConnectConfig.OnSessionApproved += SessionApproved; - - return config; - } - - - - #endregion } } \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Web3AuthLogin.cs b/src/UnitySampleProject/Assets/Web3AuthLogin.cs index 22a95182a..43d7da641 100644 --- a/src/UnitySampleProject/Assets/Web3AuthLogin.cs +++ b/src/UnitySampleProject/Assets/Web3AuthLogin.cs @@ -38,87 +38,75 @@ public class Web3AuthSettings [SerializeField] private Web3AuthSettings web3AuthSettings; [SerializeField] private List providerAndButtonPairs; + private bool dontUseProvider; + + private Provider selectedProvider; + protected override IEnumerator Initialize() { #if UNITY_WEBGL - ProcessWeb3Auth(); + + dontUseProvider = true; + + Task loginTask = TryLogin(); + + yield return new WaitUntil(() => loginTask.IsCompleted); #endif //add listener foreach (var pair in providerAndButtonPairs) { - pair.Button.onClick.AddListener(() => LoginWithWeb3Auth(pair.Provider)); - } - - yield return null; - } - - private async void LoginWithWeb3Auth(Provider provider) - { - Web3Builder web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) - .Configure(ConfigureCommonServices) - .Configure(services => + pair.Button.onClick.AddListener(() => { - var web3AuthConfig = new Web3AuthWalletConfig - { - Web3AuthOptions = new() - { - clientId = web3AuthSettings.ClientId, - redirectUrl = new Uri(web3AuthSettings.RedirectUri), - network = web3AuthSettings.Network, - whiteLabel = new() - { - dark = true, - defaultLanguage = "en", - name = "ChainSafe Gaming SDK", - } - }, - LoginParams = new() { loginProvider = provider } - }; - services.UseWeb3AuthWallet(web3AuthConfig); + LoginWithWeb3Auth(pair.Provider); }); + } - await ProcessLogin(web3Builder); + yield return null; } - private async Task ProcessLogin(Web3Builder web3Builder) + private async void LoginWithWeb3Auth(Provider provider) { - try - { - Web3 web3 = await web3Builder.BuildAsync(); - } + selectedProvider = provider; - catch (Exception e) - { - throw new Exception($"Login With Web3Auth Failed : Failed with Exception {e}"); - } + await TryLogin(); } - - private async void ProcessWeb3Auth() + + protected override Web3Builder ConfigureWeb3Services(Web3Builder web3Builder) { - var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) - .Configure(ConfigureCommonServices) - .Configure(services => + return web3Builder.Configure(services => + { + var web3AuthConfig = new Web3AuthWalletConfig { - var web3AuthConfig = new Web3AuthWalletConfig + Web3AuthOptions = new() { - Web3AuthOptions = new() + clientId = web3AuthSettings.ClientId, + redirectUrl = new Uri(web3AuthSettings.RedirectUri), + network = web3AuthSettings.Network, + whiteLabel = new() { - whiteLabel = new() - { - dark = true, - defaultLanguage = "en", - name = "ChainSafe Gaming SDK", - }, - clientId = web3AuthSettings.ClientId, - redirectUrl = new Uri(web3AuthSettings.RedirectUri), - network = web3AuthSettings.Network, + dark = true, + defaultLanguage = "en", + name = "ChainSafe Gaming SDK", + } + } + }; + + if (dontUseProvider) + { + // reset + dontUseProvider = false; + } - }, + else + { + web3AuthConfig.LoginParams = new LoginParams + { + loginProvider = selectedProvider }; - services.UseWeb3AuthWallet(web3AuthConfig); - }); - - await ProcessLogin(web3Builder); + } + + services.UseWeb3AuthWallet(web3AuthConfig); + }); } } From 3cd577a99e989debc0426deddb0a91df4f8eefcc Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 17 Oct 2023 16:21:44 +0300 Subject: [PATCH 076/167] Changes Made + updated wallet connect to v2.1.1 for better Pairing topic and session matching + Renames for WalletConnectProvider based on requested changes --- .../Tests/Runtime/SampleTestsBase.cs | 2 +- .../ChainSafe.Gaming.WalletConnect.csproj | 2 +- ...der.cs => IWalletConnectCustomProvider.cs} | 2 +- .../Models/WalletConnectWalletModel.cs | 33 ++++-------- ...ider.cs => WalletConnectCustomProvider.cs} | 54 ++++++++++++------- .../WalletConnectProviderExtensions.cs | 6 +-- .../WalletConnectSigner.cs | 12 ++--- .../WalletConnectTransactionExecutor.cs | 17 ++---- .../Scripts/Scenes/Login.cs | 2 +- 9 files changed, 62 insertions(+), 68 deletions(-) rename src/ChainSafe.Gaming.WalletConnect/{IWalletConnectProvider.cs => IWalletConnectCustomProvider.cs} (94%) rename src/ChainSafe.Gaming.WalletConnect/{WalletConnectProvider.cs => WalletConnectCustomProvider.cs} (85%) diff --git a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs index 58eab597f..0b741ccb6 100644 --- a/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs +++ b/Packages/io.chainsafe.web3-unity/Tests/Runtime/SampleTestsBase.cs @@ -43,7 +43,7 @@ public virtual IEnumerator Setup() TestWalletAddress = "0x55ffe9E30347266f02b9BdAe20aD3a86493289ea", }; - services.UseWalletConnectProvider(config); + services.UseWalletConnect(config); services.UseWalletConnectSigner(); services.UseWalletConnectTransactionExecutor(); diff --git a/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj b/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj index c86c5469a..5069c78e2 100644 --- a/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj +++ b/src/ChainSafe.Gaming.WalletConnect/ChainSafe.Gaming.WalletConnect.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/ChainSafe.Gaming.WalletConnect/IWalletConnectProvider.cs b/src/ChainSafe.Gaming.WalletConnect/IWalletConnectCustomProvider.cs similarity index 94% rename from src/ChainSafe.Gaming.WalletConnect/IWalletConnectProvider.cs rename to src/ChainSafe.Gaming.WalletConnect/IWalletConnectCustomProvider.cs index cc639a88b..6d1ad4a32 100644 --- a/src/ChainSafe.Gaming.WalletConnect/IWalletConnectProvider.cs +++ b/src/ChainSafe.Gaming.WalletConnect/IWalletConnectCustomProvider.cs @@ -2,7 +2,7 @@ namespace ChainSafe.Gaming.WalletConnect { - public interface IWalletConnectProvider + public interface IWalletConnectCustomProvider { /// /// connects using Wallet Connect. diff --git a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs index 10b053a06..6323d075c 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs @@ -20,16 +20,10 @@ public class WalletConnectWalletModel [JsonProperty("image_url")] public ImageUrlsModel Images { get; private set; } - public void OpenDeeplink(ConnectedData data, IOperatingSystemMediator operatingSystemMediator, string symKey) + public void OpenDeeplink(ConnectedData data, IOperatingSystemMediator operatingSystemMediator) { string uri = data.Uri; - // if storage is persistent sometimes symKey might be embedded in uri incorrectly, wallet connect issue - string symKeyInUri = $"symKey={symKey}"; - - // remove symKey in Uri if it exists - uri = uri.Replace(symKeyInUri, string.Empty); - switch (operatingSystemMediator.Platform) { case Platform.Android: @@ -39,14 +33,7 @@ public void OpenDeeplink(ConnectedData data, IOperatingSystemMediator operatingS case Platform.IOS: case Platform.Desktop: case Platform.Editor: - if (string.IsNullOrEmpty(symKey)) - { - WCLogger.LogError($"Failed to open {Name} Wallet Deeplink : SymKey NullOrEmpty"); - - return; - } - - uri = GetDeeplink(data.Uri, operatingSystemMediator.IsMobilePlatform, symKey); + uri = GetDeeplink(data.Uri, operatingSystemMediator.IsMobilePlatform); break; default: @@ -67,15 +54,15 @@ public void OpenDeeplink(ConnectedData data, IOperatingSystemMediator operatingS } // Deeplink Building - private string GetDeeplink(string uri, bool isMobilePlatform, string symKey) + private string GetDeeplink(string uri, bool isMobilePlatform) { WalletLinkModel linkData = GetLinkData(isMobilePlatform); // prefer native protocol - return CanUseNativeProtocol(isMobilePlatform) ? BuildNativeDeeplink(linkData.NativeProtocol, uri, symKey) : BuildUniversalDeeplink(linkData.UniversalUrl, uri, symKey); + return CanUseNativeProtocol(isMobilePlatform) ? BuildNativeDeeplink(linkData.NativeProtocol, uri) : BuildUniversalDeeplink(linkData.UniversalUrl, uri); } - private string BuildNativeDeeplink(string url, string uri, string symKey) + private string BuildNativeDeeplink(string url, string uri) { if (url.EndsWith(':')) { @@ -86,20 +73,18 @@ private string BuildNativeDeeplink(string url, string uri, string symKey) url += "wc"; } - return AddDeeplinkParams(url, uri, symKey); + return AddDeeplinkParams(url, uri); } - private string BuildUniversalDeeplink(string url, string uri, string symKey) + private string BuildUniversalDeeplink(string url, string uri) { - return AddDeeplinkParams(url, uri, symKey); + return AddDeeplinkParams(url, uri); } - private string AddDeeplinkParams(string url, string uri, string symKey) + private string AddDeeplinkParams(string url, string uri) { url += $"?uri={HttpUtility.UrlEncode(uri)}"; - url += $"&symKey={HttpUtility.UrlEncode(symKey)}"; - return url; } diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectProvider.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectCustomProvider.cs similarity index 85% rename from src/ChainSafe.Gaming.WalletConnect/WalletConnectProvider.cs rename to src/ChainSafe.Gaming.WalletConnect/WalletConnectCustomProvider.cs index c350a1ce9..031256655 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectProvider.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectCustomProvider.cs @@ -21,13 +21,13 @@ namespace ChainSafe.Gaming.WalletConnect { - public class WalletConnectProvider : IWalletConnectProvider, ILifecycleParticipant + public class WalletConnectCustomProvider : IWalletConnectCustomProvider, ILifecycleParticipant { private readonly IOperatingSystemMediator operatingSystem; private readonly ILogWriter logWriter; private readonly WalletConnectConfig config; - public WalletConnectProvider(WalletConnectConfig config, IOperatingSystemMediator operatingSystem, ILogWriter logWriter) + public WalletConnectCustomProvider(WalletConnectConfig config, IOperatingSystemMediator operatingSystem, ILogWriter logWriter) { this.operatingSystem = operatingSystem; this.config = config; @@ -123,11 +123,16 @@ public async Task Connect() if (autoConnect) { - string pairingTopic = Core.Pairing.Pairings.FirstOrDefault().Topic; + try + { + // try and restore session + Session = SignClient.Find(requiredNamespaces).First(s => s.Topic == config.SavedSessionTopic); - if (!string.IsNullOrEmpty(pairingTopic)) + connectOptions.PairingTopic = Session.PairingTopic; + } + catch (Exception) { - connectOptions.PairingTopic = pairingTopic; + throw new Web3Exception($"Failed to restore session topic {config.SavedSessionTopic}"); } } @@ -139,9 +144,22 @@ public async Task Connect() // open deeplink to redirect to wallet for connection if (config.RedirectToWallet) { - if (config.DefaultWallet != null) + if (autoConnect) { - config.DefaultWallet.OpenDeeplink(ConnectedData, operatingSystem, Core.Pairing.ParseUri(ConnectedData.Uri)?.SymKey); + // try and open wallet for session renewal + config.DefaultWallet?.OpenWallet(operatingSystem); + } + else if (config.DefaultWallet != null) + { + try + { + config.DefaultWallet.OpenDeeplink(ConnectedData, operatingSystem); + } + catch (Exception e) + { + throw new Web3Exception( + $"Failed Redirecting to {config.DefaultWallet.Name} Wallet, Failed with Exception : {e}"); + } } else { @@ -151,21 +169,13 @@ public async Task Connect() if (autoConnect) { - SessionStruct? session = SignClient.Find(requiredNamespaces) - ?.FirstOrDefault(s => s.Topic == config.SavedSessionTopic); - - if (session != null) - { - ConnectedData.Approval = Task.FromResult(session.Value); - } - else - { - throw new Web3Exception("Auto Connect Failed : no matching Session found"); - } + ConnectedData.Approval = Task.FromResult(Session); } Session = await ConnectedData.Approval; + WCLogger.Log($"Wallet Connect session {Session.Topic} approved"); + if (SessionExpired) { await TryRenewSession(); @@ -281,11 +291,19 @@ public async Task Request(T data, long? expiry = null) private async Task TryRenewSession() { + WCLogger.Log("Attempting to renew Session..."); + try { var acknowledgement = await SignClient.Extend(Session.Topic); await acknowledgement.Acknowledged(); + + // try to open default wallet to approve session renewal + if (config.RedirectToWallet) + { + config.DefaultWallet?.OpenWallet(operatingSystem); + } } catch (Exception e) { diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectProviderExtensions.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectProviderExtensions.cs index 6bf53ead7..acc85cf3c 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectProviderExtensions.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectProviderExtensions.cs @@ -11,12 +11,12 @@ public static class WalletConnectProviderExtensions /// Binds Web implementation of EVM Provider to Web3. /// /// The same service collection that was passed in. This enables fluent style. - public static IWeb3ServiceCollection UseWalletConnectProvider(this IWeb3ServiceCollection collection, WalletConnectConfig config) + public static IWeb3ServiceCollection UseWalletConnect(this IWeb3ServiceCollection collection, WalletConnectConfig config) { - collection.AssertServiceNotBound(); + collection.AssertServiceNotBound(); // wallet - collection.AddSingleton(); + collection.AddSingleton(); // configure provider collection.Replace(ServiceDescriptor.Singleton(typeof(WalletConnectConfig), config)); diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs index abba71302..c4c284a74 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectSigner.cs @@ -27,12 +27,12 @@ namespace ChainSafe.Gaming.WalletConnect { public class WalletConnectSigner : ISigner, ILifecycleParticipant { - private readonly IWalletConnectProvider walletConnectProvider; + private readonly IWalletConnectCustomProvider walletConnectCustomProvider; private readonly WalletConnectConfig config; - public WalletConnectSigner(IWalletConnectProvider walletConnectProvider, WalletConnectConfig config) + public WalletConnectSigner(IWalletConnectCustomProvider walletConnectCustomProvider, WalletConnectConfig config) { - this.walletConnectProvider = walletConnectProvider; + this.walletConnectCustomProvider = walletConnectCustomProvider; this.config = config; } @@ -51,7 +51,7 @@ public async ValueTask WillStartAsync() } // get address by connecting - Address = await walletConnectProvider.Connect(); + Address = await walletConnectCustomProvider.Connect(); } public ValueTask WillStopAsync() @@ -75,7 +75,7 @@ public async Task SignMessage(string message) var requestData = new EthSignMessage(message, Address); string hash = - await walletConnectProvider.Request(requestData); + await walletConnectCustomProvider.Request(requestData); var isValid = ValidateResponse(hash); if (!isValid) @@ -98,7 +98,7 @@ public async Task SignTypedData(SerializableDomain domain, var requestData = new EthSignTypedData(Address, domain, message); string hash = - await walletConnectProvider.Request(requestData); + await walletConnectCustomProvider.Request(requestData); var isValid = ValidateResponse(hash); if (!isValid) diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs index 5560ce6f0..be782f34d 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs @@ -14,19 +14,15 @@ namespace ChainSafe.Gaming.WalletConnect { public class WalletConnectTransactionExecutor : ITransactionExecutor, ILifecycleParticipant { - private readonly IWalletConnectProvider walletConnectProvider; + private readonly IWalletConnectCustomProvider walletConnectCustomProvider; private readonly IRpcProvider rpcProvider; - private readonly ISigner signer; - - public WalletConnectTransactionExecutor(IWalletConnectProvider walletConnectProvider, IRpcProvider rpcProvider, ISigner signer) + public WalletConnectTransactionExecutor(IWalletConnectCustomProvider walletConnectCustomProvider, IRpcProvider rpcProvider) { - this.walletConnectProvider = walletConnectProvider; + this.walletConnectCustomProvider = walletConnectCustomProvider; this.rpcProvider = rpcProvider; - - this.signer = signer; } public ValueTask WillStartAsync() => new ValueTask(Task.CompletedTask); @@ -35,11 +31,6 @@ public WalletConnectTransactionExecutor(IWalletConnectProvider walletConnectProv public async Task SendTransaction(TransactionRequest transaction) { - if (string.IsNullOrEmpty(transaction.From)) - { - transaction.From = await signer.GetAddress(); - } - EthSendTransaction requestData = new EthSendTransaction(new TransactionModel { From = transaction.From, @@ -51,7 +42,7 @@ public async Task SendTransaction(TransactionRequest transa Nonce = transaction.Nonce?.HexValue, }); - string hash = await walletConnectProvider.Request(requestData); + string hash = await walletConnectCustomProvider.Request(requestData); // TODO replace validation with regex if (!hash.StartsWith("0x") || hash.Length != 66) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index e840bc9d1..b1d0fa7fd 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -265,7 +265,7 @@ private async Task LoginWithExistingAccount() if (useWalletConnect) { services - .UseWalletConnectProvider(BuildWalletConnectConfig()) + .UseWalletConnect(BuildWalletConnectConfig()) .UseWalletConnectSigner() .UseWalletConnectTransactionExecutor(); } From 7bd7a3e892d42ce2d77e25370fc8e321f7d10517 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Wed, 18 Oct 2023 12:36:50 +0300 Subject: [PATCH 077/167] checkpoint --- src/UnitySampleProject/Assets/ExistingWalletLogin.cs | 2 +- .../2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/UnitySampleProject/Assets/ExistingWalletLogin.cs b/src/UnitySampleProject/Assets/ExistingWalletLogin.cs index ba7b3cd93..ca1d8e34d 100644 --- a/src/UnitySampleProject/Assets/ExistingWalletLogin.cs +++ b/src/UnitySampleProject/Assets/ExistingWalletLogin.cs @@ -102,7 +102,7 @@ protected override Web3Builder ConfigureWeb3Services(Web3Builder web3Builder) return web3Builder.Configure(services => { services - .UseWalletConnectProvider(BuildWalletConnectConfig()) + .UseWalletConnect(BuildWalletConnectConfig()) .UseWalletConnectSigner() .UseWalletConnectTransactionExecutor(); }); diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index c88f3ed9e..48c1aee4f 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -53,7 +53,7 @@ protected async Task TryLogin() SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1); } - protected void ConfigureCommonServices(IWeb3ServiceCollection services) + private void ConfigureCommonServices(IWeb3ServiceCollection services) { services .UseUnityEnvironment() From ef0ebc0f4cfbfaf296557e2aaca991072917ee16 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 17:34:14 +0300 Subject: [PATCH 078/167] samples added and test duplicate GH action --- .github/workflows/duplicate_sample.yml | 33 - .github/workflows/duplicate_samples.yml | 40 + .../package.json | 11 +- scripts/duplicate-sample.sh | 9 + .../Samples/web3.unity SDK Web3Auth.meta | 8 + .../web3.unity SDK Web3Auth/2.5.1.meta | 8 + .../2.5.1/Web3.Unity Web3Auth Samples.meta | 8 + .../Web3.Unity Web3Auth Samples/Scenes.meta | 8 + .../Scenes/SampleLogin - Web3Auth.unity | 2600 ++++++++++++++ .../Scenes/SampleLogin - Web3Auth.unity.meta | 7 + .../Web3.Unity Web3Auth Samples/Scripts.meta | 8 + .../Scripts}/Web3AuthLogin.cs | 32 +- .../Scripts}/Web3AuthLogin.cs.meta | 2 +- .../Scenes/SampleLogin.unity | 3061 ++++++----------- .../Scripts/Prefabs/Logout.cs | 4 +- .../Scripts/Scenes}/ExistingWalletLogin.cs | 18 +- .../Scenes}/ExistingWalletLogin.cs.meta | 0 .../Scripts/Utilities/PlayerData.cs | 77 + .../Scripts/Utilities/PlayerData.cs.meta | 11 + 19 files changed, 3836 insertions(+), 2109 deletions(-) delete mode 100644 .github/workflows/duplicate_sample.yml create mode 100644 .github/workflows/duplicate_samples.yml create mode 100644 scripts/duplicate-sample.sh create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth.meta create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1.meta create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples.meta create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes.meta create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity.meta create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts.meta rename src/UnitySampleProject/Assets/{ => Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts}/Web3AuthLogin.cs (79%) rename src/UnitySampleProject/Assets/{ => Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts}/Web3AuthLogin.cs.meta (83%) rename src/UnitySampleProject/Assets/{ => Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes}/ExistingWalletLogin.cs (93%) rename src/UnitySampleProject/Assets/{ => Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes}/ExistingWalletLogin.cs.meta (100%) create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/PlayerData.cs create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/PlayerData.cs.meta diff --git a/.github/workflows/duplicate_sample.yml b/.github/workflows/duplicate_sample.yml deleted file mode 100644 index 9a7e4c2ed..000000000 --- a/.github/workflows/duplicate_sample.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Duplicate Package Sample Workflow - -on: - pull_request: - branches: [main] - -jobs: - duplicate: - name: Duplicate samples job 👯 - runs-on: ubuntu-latest - - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.ref }} - - - name: Run duplicate script file - run: | - export SOURCE_DIRECTORY="${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/" - export DESTINATION_DIRECTORY="${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - rm -r "$DESTINATION_DIRECTORY" - cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" - - - name: Commit and Push - run: | - git config user.email $git_email - git config user.name "${{ github.actor }}" - git add ./Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f - git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Package Samples" - git push - env: - git_email: "${{ github.actor }}@users.noreply.github.com" \ No newline at end of file diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml new file mode 100644 index 000000000..066fba4ab --- /dev/null +++ b/.github/workflows/duplicate_samples.yml @@ -0,0 +1,40 @@ +name: Duplicate Package Samples Workflow + +#on: +# pull_request: +# branches: [main] + +on: + push: + branches: [ rob/samples-import-fixes-642 ] + +jobs: + duplicate: + name: Duplicate samples job 👯 + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref }} + - name: Run duplicate script file + run: | + #Duplicate Web3.Unity Samples + scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/**/Web3.Unity Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" + #Duplicate Web3Auth Samples + scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/**/Web3.Unity Web3Auth Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" + + - name: Commit and Push + run: | + git config user.email $git_email + git config user.name "${{ github.actor }}" + # add Web3.Unity duplicated changes + git add ./Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f + # add Web3Auth duplicated changes + git add ./Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/. -f + # check if there are any changes before making a commit + git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" + git push + env: + git_email: "${{ github.actor }}@users.noreply.github.com" \ No newline at end of file diff --git a/Packages/io.chainsafe.web3-unity.web3auth/package.json b/Packages/io.chainsafe.web3-unity.web3auth/package.json index bd98591c4..92eb52a09 100644 --- a/Packages/io.chainsafe.web3-unity.web3auth/package.json +++ b/Packages/io.chainsafe.web3-unity.web3auth/package.json @@ -1,7 +1,7 @@ { "name": "io.chainsafe.web3-unity.web3auth", "version": "2.5.1", - "displayName": "web3.unity SDK Web3Auth integration", + "displayName": "web3.unity SDK Web3Auth", "description": "web3.unity is an open-source gaming SDK written in C# and developed by ChainSafe Gaming. It connects games built in the Unity game engine to the blockchain. The library currently supports games built for web browsers (WebGL), iOS/Android mobile, and desktop. web3.unity is compatible with most EVM-based chains such as Ethereum, Polygon, Moonbeam, Cronos, Nervos, and Binance Smart Chain, letting developers easily choose and switch between them to create the best in-game experience.", "license": "LGPL-3.0-only", "licensesUrl": "https://github.com/ChainSafe/web3.unity/blob/main/LICENSE", @@ -21,5 +21,12 @@ "name": "ChainSafe Gaming", "email": "bd@chainsafe.io", "url": "https://gaming.chainsafe.io/" - } + }, + "samples": [ + { + "displayName": "Web3.Unity Web3Auth Samples", + "description": "Contains implementations for Web3 Auth Sample Operations using Web3Auth Package.", + "path": "Samples~/Web3.Unity Web3Auth" + } + ] } diff --git a/scripts/duplicate-sample.sh b/scripts/duplicate-sample.sh new file mode 100644 index 000000000..06d829831 --- /dev/null +++ b/scripts/duplicate-sample.sh @@ -0,0 +1,9 @@ +#! /usr/bin/env sh +scripts_dir=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) + +pushd "$scripts_dir"/../ + +export SOURCE_DIRECTORY="$1" +export DESTINATION_DIRECTORY="$2" +rm -r "$DESTINATION_DIRECTORY" +cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth.meta new file mode 100644 index 000000000..374feb19c --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8891d18538099464a9dacfca856bbcde +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1.meta new file mode 100644 index 000000000..de3d10e9b --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4a2348229ad169545a0b6f4698d23c42 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples.meta new file mode 100644 index 000000000..4d23fffa2 --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ed405cf8e40fb7343a37c079643a079a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes.meta new file mode 100644 index 000000000..4fac99df1 --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63a4252d0dda4554abf1f9920c4dc15c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity new file mode 100644 index 000000000..646ad6416 --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity @@ -0,0 +1,2600 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &249944480 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 249944481} + - component: {fileID: 249944483} + - component: {fileID: 249944482} + m_Layer: 5 + m_Name: Title - Error + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &249944481 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249944480} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1897816690} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &249944482 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249944480} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.412, g: 0.043672003, b: 0.043672003, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 24 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Error +--- !u!222 &249944483 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249944480} + m_CullTransparentMesh: 1 +--- !u!1 &279657855 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 279657856} + - component: {fileID: 279657859} + - component: {fileID: 279657858} + - component: {fileID: 279657857} + m_Layer: 5 + m_Name: Fade + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &279657856 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279657855} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 337558420} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &279657857 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279657855} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 0 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 279657858} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 337558421} + m_TargetAssemblyTypeName: Scenes.ErrorPopup, Assembly-CSharp + m_MethodName: Close + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &279657858 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279657855} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.29803923} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &279657859 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279657855} + m_CullTransparentMesh: 1 +--- !u!1 &337558419 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 337558420} + - component: {fileID: 337558421} + m_Layer: 5 + m_Name: Error + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &337558420 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 337558419} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 279657856} + - {fileID: 1897816690} + m_Father: {fileID: 1799608973} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &337558421 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 337558419} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c001d0d5433b4215b8abba94194881bd, type: 3} + m_Name: + m_EditorClassIdentifier: + MessageLabel: {fileID: 804898217} +--- !u!1 &359109759 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 359109762} + - component: {fileID: 359109761} + - component: {fileID: 359109760} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &359109760 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 359109759} + m_Enabled: 1 +--- !u!20 &359109761 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 359109759} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.101960786, g: 0.101960786, b: 0.10980392, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &359109762 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 359109759} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &771332079 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 771332080} + - component: {fileID: 771332082} + - component: {fileID: 771332081} + m_Layer: 5 + m_Name: Container + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &771332080 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 771332079} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 221640018553606200} + m_Father: {fileID: 1799608973} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.725} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &771332081 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 771332079} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!114 &771332082 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 771332079} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 25 + m_Right: 25 + m_Top: 25 + m_Bottom: 25 + m_ChildAlignment: 0 + m_Spacing: 50 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &804898216 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 804898219} + - component: {fileID: 804898218} + - component: {fileID: 804898217} + m_Layer: 5 + m_Name: Error message + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &804898217 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 804898216} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.05, g: 0.05, b: 0.05, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 40 + m_Alignment: 1 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &804898218 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 804898216} + m_CullTransparentMesh: 1 +--- !u!224 &804898219 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 804898216} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1520162125} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1025578980 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1025578983} + - component: {fileID: 1025578982} + - component: {fileID: 1025578981} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1025578981 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1025578980} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1025578982 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1025578980} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1025578983 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1025578980} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1387636275 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1387636276} + - component: {fileID: 1387636279} + - component: {fileID: 1387636278} + - component: {fileID: 1387636277} + m_Layer: 5 + m_Name: Button - Ok + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1387636276 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387636275} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1640414611} + m_Father: {fileID: 1520162125} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &1387636277 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387636275} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1387636278} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 337558421} + m_TargetAssemblyTypeName: Scenes.ErrorPopup, Assembly-CSharp + m_MethodName: Close + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1387636278 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387636275} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1387636279 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387636275} + m_CullTransparentMesh: 1 +--- !u!1 &1520162124 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1520162125} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1520162125 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1520162124} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 804898219} + - {fileID: 1387636276} + m_Father: {fileID: 1897816690} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -21} + m_SizeDelta: {x: -32, y: -58} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1640414610 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1640414611} + - component: {fileID: 1640414613} + - component: {fileID: 1640414612} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1640414611 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1640414610} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1387636276} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1640414612 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1640414610} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.05, g: 0.05, b: 0.05, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 19 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: OK +--- !u!222 &1640414613 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1640414610} + m_CullTransparentMesh: 1 +--- !u!1 &1679801098 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1679801099} + - component: {fileID: 1679801100} + m_Layer: 0 + m_Name: Logic - Login - Web3Auth + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1679801099 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1679801098} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1679801100 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1679801098} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7b6902e441950fa4bb5cefdd2263164a, type: 3} + m_Name: + m_EditorClassIdentifier: + GelatoApiKey: _UzPz_Yk_WTjWMfcl45fLvQNGQ9ISx5ZE8TnwnVKYrE_ + ErrorPopup: {fileID: 337558421} + web3AuthSettings: + ClientId: + RedirectUri: + Network: 0 + providerAndButtonPairs: + - Button: {fileID: 7400892926620024700} + Provider: 0 + - Button: {fileID: 7400892927795158149} + Provider: 10 + - Button: {fileID: 7400892926443314765} + Provider: 1 + - Button: {fileID: 7400892927495363539} + Provider: 2 + - Button: {fileID: 7400892926127870699} + Provider: 3 + - Button: {fileID: 7400892925769233044} + Provider: 4 +--- !u!1 &1799608969 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1799608973} + - component: {fileID: 1799608972} + - component: {fileID: 1799608971} + - component: {fileID: 1799608970} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1799608970 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1799608969} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1799608971 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1799608969} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1280, y: 720} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 1 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1799608972 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1799608969} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1799608973 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1799608969} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1941751038} + - {fileID: 771332080} + - {fileID: 337558420} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1897816689 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1897816690} + - component: {fileID: 1897816692} + - component: {fileID: 1897816691} + m_Layer: 5 + m_Name: Error Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1897816690 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1897816689} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 249944481} + - {fileID: 1520162125} + m_Father: {fileID: 337558420} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -8.4831} + m_SizeDelta: {x: 400, y: 167.1662} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1897816691 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1897816689} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0.912, b: 0.912, a: 0.9490196} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1897816692 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1897816689} + m_CullTransparentMesh: 1 +--- !u!1 &1941751037 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1941751038} + m_Layer: 5 + m_Name: Header + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1941751038 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1941751037} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2063401255} + - {fileID: 2017486156} + m_Father: {fileID: 1799608973} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.725} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -25} + m_SizeDelta: {x: -50, y: -50} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &2017486155 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2017486156} + - component: {fileID: 2017486158} + - component: {fileID: 2017486157} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2017486156 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2017486155} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1941751038} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.25, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -30, y: -30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2017486157 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2017486155} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Login to continue + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294111986 + m_fontColor: {r: 0.95, g: 0.95, b: 0.95, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 40 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 16 + m_fontSizeMax: 40 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &2017486158 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2017486155} + m_CullTransparentMesh: 1 +--- !u!1 &2063401254 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2063401255} + - component: {fileID: 2063401257} + - component: {fileID: 2063401256} + m_Layer: 5 + m_Name: ChainSafe Logo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2063401255 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2063401254} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1941751038} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.25, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: -50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2063401256 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2063401254} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 804f4bf7fbf176544bd5efde4a0749ca, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2063401257 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2063401254} + m_CullTransparentMesh: 1 +--- !u!114 &221640017808192961 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601029837872496} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1001 &221640017808193020 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 221640018348301908} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: Button - Reddit + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Continue with Reddit + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_fontSize + value: 17.9 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!1001 &221640018061849258 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 221640018348301908} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: Button - Twitter + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Continue with Twitter + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_fontSize + value: 17.9 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!114 &221640018061849263 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601030083336742} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!224 &221640018348301908 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018348301909} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4687163642340118773} + - {fileID: 4687163641433322252} + - {fileID: 4687163642770551236} + - {fileID: 4687163641674593370} + - {fileID: 4687163643058568546} + - {fileID: 4687163643165482269} + - {fileID: 221640018720180776} + m_Father: {fileID: 221640018553606200} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &221640018348301909 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 221640018348301908} + - component: {fileID: 221640018348301910} + - component: {fileID: 221640018348301911} + m_Layer: 5 + m_Name: Buttons + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &221640018348301910 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018348301909} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 5 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &221640018348301911 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018348301909} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!224 &221640018553606200 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018553606201} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 221640018348301908} + m_Father: {fileID: 771332080} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &221640018553606201 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 221640018553606200} + - component: {fileID: 221640018553606203} + m_Layer: 5 + m_Name: Column - Web3Auth + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &221640018553606203 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018553606201} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 300 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!224 &221640018720180776 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018720180777} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 221640018348301908} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &221640018720180777 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 221640018720180776} + - component: {fileID: 221640018720180778} + - component: {fileID: 221640018720180779} + m_Layer: 5 + m_Name: Powered by W3A + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &221640018720180778 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018720180777} + m_CullTransparentMesh: 1 +--- !u!114 &221640018720180779 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018720180777} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Powered by Web3Auth + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1001 &221640018859585634 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 221640018348301908} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: Button - Facebook + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Continue with Facebook + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_fontSize + value: 17.9 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!114 &221640018859585639 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601028750301422} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1001 &221640019303666003 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 221640018348301908} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: Button - Google + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Continue with Google + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_fontSize + value: 17.9 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!114 &221640019303666004 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601028908071391} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1001 &221640019533962427 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 221640018348301908} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: Button - Twitch + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Continue with Twitch + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_fontSize + value: 17.9 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!114 &221640019533962428 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601029147800631} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1001 &221640019796147396 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 221640018348301908} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: Button - Discord + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Continue with Discord + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_fontSize + value: 17.9 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!114 &221640019796147401 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601029661561928} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!224 &4687163641433322252 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640018061849258} + m_PrefabAsset: {fileID: 0} +--- !u!224 &4687163641674593370 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640017808193020} + m_PrefabAsset: {fileID: 0} +--- !u!224 &4687163642340118773 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019303666003} + m_PrefabAsset: {fileID: 0} +--- !u!224 &4687163642770551236 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640018859585634} + m_PrefabAsset: {fileID: 0} +--- !u!224 &4687163643058568546 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019796147396} + m_PrefabAsset: {fileID: 0} +--- !u!224 &4687163643165482269 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019533962427} + m_PrefabAsset: {fileID: 0} +--- !u!114 &7400892925769233044 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019533962427} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601029147800631} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &7400892926127870699 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019796147396} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601029661561928} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &7400892926443314765 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640018859585634} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601028750301422} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &7400892926620024700 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019303666003} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601028908071391} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &7400892927495363539 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640017808193020} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601029837872496} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &7400892927795158149 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640018061849258} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601030083336742} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &8852601028750301422 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640018859585634} + m_PrefabAsset: {fileID: 0} +--- !u!1 &8852601028908071391 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019303666003} + m_PrefabAsset: {fileID: 0} +--- !u!1 &8852601029147800631 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019533962427} + m_PrefabAsset: {fileID: 0} +--- !u!1 &8852601029661561928 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019796147396} + m_PrefabAsset: {fileID: 0} +--- !u!1 &8852601029837872496 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640017808193020} + m_PrefabAsset: {fileID: 0} +--- !u!1 &8852601030083336742 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640018061849258} + m_PrefabAsset: {fileID: 0} diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity.meta new file mode 100644 index 000000000..1a53d87da --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a8a8b501e594874448546e904e2437c5 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts.meta new file mode 100644 index 000000000..7c28da439 --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 69be851f73848a64b85590574e09aef5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/Web3AuthLogin.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs similarity index 79% rename from src/UnitySampleProject/Assets/Web3AuthLogin.cs rename to src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs index 43d7da641..cfc3a791a 100644 --- a/src/UnitySampleProject/Assets/Web3AuthLogin.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs @@ -1,34 +1,25 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; -using ChainSafe.Gaming.Evm.Contracts; -using ChainSafe.Gaming.Evm.JsonRpc; -using ChainSafe.Gaming.UnityPackage; -using ChainSafe.Gaming.Web3; using ChainSafe.Gaming.Web3.Build; -using ChainSafe.Gaming.Web3.Unity; -using ChainSafe.GamingSdk.Gelato; using ChainSafe.GamingSdk.Web3Auth; using Scenes; using UnityEngine; -using UnityEngine.Assertions; -using UnityEngine.Serialization; using UnityEngine.UI; using Network = Web3Auth.Network; public class Web3AuthLogin : Login { [Serializable] - public class ProviderAndButtonPair + public struct ProviderAndButtonPair { public Button Button; public Provider Provider; } [Serializable] - public class Web3AuthSettings + public struct Web3AuthSettings { public string ClientId; public string RedirectUri; @@ -38,7 +29,7 @@ public class Web3AuthSettings [SerializeField] private Web3AuthSettings web3AuthSettings; [SerializeField] private List providerAndButtonPairs; - private bool dontUseProvider; + private bool useProvider; private Provider selectedProvider; @@ -46,13 +37,13 @@ protected override IEnumerator Initialize() { #if UNITY_WEBGL - dontUseProvider = true; + useProvider = false; Task loginTask = TryLogin(); yield return new WaitUntil(() => loginTask.IsCompleted); #endif - + //add listener foreach (var pair in providerAndButtonPairs) { @@ -67,6 +58,11 @@ protected override IEnumerator Initialize() private async void LoginWithWeb3Auth(Provider provider) { + if (!useProvider) + { + useProvider = true; + } + selectedProvider = provider; await TryLogin(); @@ -92,13 +88,7 @@ protected override Web3Builder ConfigureWeb3Services(Web3Builder web3Builder) } }; - if (dontUseProvider) - { - // reset - dontUseProvider = false; - } - - else + if (useProvider) { web3AuthConfig.LoginParams = new LoginParams { diff --git a/src/UnitySampleProject/Assets/Web3AuthLogin.cs.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs.meta similarity index 83% rename from src/UnitySampleProject/Assets/Web3AuthLogin.cs.meta rename to src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs.meta index d9178870b..95e3a7742 100644 --- a/src/UnitySampleProject/Assets/Web3AuthLogin.cs.meta +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e7c221a71bcfd4a4e8cfa4838e18c4be +guid: 7b6902e441950fa4bb5cefdd2263164a MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity index 66572b040..d2e7f461d 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity @@ -695,11 +695,11 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 40 + m_fontSize: 20.75 m_fontSizeBase: 48 m_fontWeight: 400 m_enableAutoSizing: 1 - m_fontSizeMin: 32 + m_fontSizeMin: 16 m_fontSizeMax: 40 m_fontStyle: 1 m_HorizontalAlignment: 1 @@ -1038,7 +1038,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 311857775} m_CullTransparentMesh: 1 ---- !u!1 &325001971 +--- !u!1 &351786044 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1046,59 +1046,60 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 325001972} - - component: {fileID: 325001974} - - component: {fileID: 325001973} + - component: {fileID: 351786045} + - component: {fileID: 351786047} + - component: {fileID: 351786046} m_Layer: 5 - m_Name: Line + m_Name: Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &325001972 +--- !u!224 &351786045 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 325001971} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 351786044} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1434038408} - m_RootOrder: 1 + m_Children: + - {fileID: 1900245909} + m_Father: {fileID: 724612375} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0} - m_AnchorMax: {x: 0.5, y: 1} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.25, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 2, y: -100} + m_SizeDelta: {x: -10.000004, y: -10.000001} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &325001973 +--- !u!114 &351786046 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 325001971} + m_GameObject: {fileID: 351786044} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.16299999, g: 0.16299999, b: 0.16299999, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 0} + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} m_Type: 0 - m_PreserveAspect: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -1106,15 +1107,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &325001974 +--- !u!222 &351786047 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 325001971} + m_GameObject: {fileID: 351786044} m_CullTransparentMesh: 1 ---- !u!1 &351786044 +--- !u!1 &395689439 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1122,76 +1123,121 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 351786045} - - component: {fileID: 351786047} - - component: {fileID: 351786046} + - component: {fileID: 395689440} + - component: {fileID: 395689441} m_Layer: 5 - m_Name: Background + m_Name: WalletConnectModal m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &351786045 +--- !u!224 &395689440 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 351786044} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 395689439} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1900245909} - m_Father: {fileID: 724612375} - m_RootOrder: 0 + - {fileID: 1278821651} + m_Father: {fileID: 1880270956} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0.25, y: 1} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -10.000004, y: -10.000001} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &351786046 +--- !u!114 &395689441 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 351786044} + m_GameObject: {fileID: 395689439} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: fb890e484538c444da09be8d0f89dcd8, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &351786047 -CanvasRenderer: + _qrCodeImage: {fileID: 125483106} + _copyToClipboardButton: {fileID: 212403314} + _backButton: {fileID: 1993078182} + _container: {fileID: 1278821651} +--- !u!1 &492023254 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 351786044} - m_CullTransparentMesh: 1 ---- !u!1 &372811666 + serializedVersion: 6 + m_Component: + - component: {fileID: 492023255} + - component: {fileID: 492023257} + - component: {fileID: 492023256} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &492023255 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 492023254} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &492023256 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 492023254} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &492023257 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 492023254} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!1 &537139933 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1199,265 +1245,191 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 372811667} - - component: {fileID: 372811669} - - component: {fileID: 372811668} + - component: {fileID: 537139934} m_Layer: 5 - m_Name: Powered by W3A + m_Name: Content m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &372811667 +--- !u!224 &537139934 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 372811666} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 537139933} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 387303608} - m_RootOrder: 6 + m_Children: + - {fileID: 1808259963} + m_Father: {fileID: 2043937261} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 28} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &540464233 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 540464234} + - component: {fileID: 540464238} + - component: {fileID: 540464237} + - component: {fileID: 540464236} + - component: {fileID: 540464235} + m_Layer: 5 + m_Name: Dropdown - Wallets + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &540464234 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 540464233} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2033480131} + - {fileID: 2045136594} + - {fileID: 741301286} + m_Father: {fileID: 654334440} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 295, y: -190} + m_SizeDelta: {x: 590, y: 50} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &372811668 +--- !u!114 &540464235 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 372811666} + m_GameObject: {fileID: 540464233} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Powered by Web3Auth - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 14 - m_fontSizeBase: 14 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &372811669 -CanvasRenderer: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &540464236 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 372811666} - m_CullTransparentMesh: 1 ---- !u!1001 &374887655 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 387303608} - m_Modifications: - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_RootOrder - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Name - value: Button - Facebook - objectReference: {fileID: 0} - - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_text - value: Continue with Facebook - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} ---- !u!224 &374887656 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 374887655} - m_PrefabAsset: {fileID: 0} ---- !u!1 &374887658 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 374887655} - m_PrefabAsset: {fileID: 0} ---- !u!114 &374887659 + m_GameObject: {fileID: 540464233} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 540464237} + m_Template: {fileID: 741301286} + m_CaptionText: {fileID: 2033480132} + m_CaptionImage: {fileID: 0} + m_Placeholder: {fileID: 0} + m_ItemText: {fileID: 258509837} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_AlphaFadeSpeed: 0.15 +--- !u!114 &540464237 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 374887658} + m_GameObject: {fileID: 540464233} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!1 &387303607 + m_Material: {fileID: 0} + m_Color: {r: 0.054901965, g: 0.054901965, b: 0.054901965, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &540464238 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 540464233} + m_CullTransparentMesh: 1 +--- !u!1 &562988047 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1465,84 +1437,75 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 387303608} - - component: {fileID: 387303609} - - component: {fileID: 387303610} + - component: {fileID: 562988048} + - component: {fileID: 562988050} + - component: {fileID: 562988049} m_Layer: 5 - m_Name: Buttons + m_Name: Item Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &387303608 +--- !u!224 &562988048 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 387303607} + m_GameObject: {fileID: 562988047} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1996606958} - - {fileID: 452118934} - - {fileID: 374887656} - - {fileID: 2114521193} - - {fileID: 1452765488} - - {fileID: 1508551057} - - {fileID: 372811667} - m_Father: {fileID: 1062946086} + m_Children: [] + m_Father: {fileID: 1808259963} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &387303609 + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &562988049 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 387303607} + m_GameObject: {fileID: 562988047} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 0 - m_Spacing: 5 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 1 - m_ChildControlWidth: 1 - m_ChildControlHeight: 1 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 ---- !u!114 &387303610 -MonoBehaviour: + m_Material: {fileID: 0} + m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &562988050 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 387303607} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 ---- !u!1 &395689439 + m_GameObject: {fileID: 562988047} + m_CullTransparentMesh: 1 +--- !u!1 &654334439 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1550,184 +1513,81 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 395689440} - - component: {fileID: 395689441} + - component: {fileID: 654334440} + - component: {fileID: 654334442} + - component: {fileID: 654334441} m_Layer: 5 - m_Name: WalletConnectModal + m_Name: Container m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &395689440 +--- !u!224 &654334440 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 395689439} + m_GameObject: {fileID: 654334439} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1278821651} - m_Father: {fileID: 1880270956} - m_RootOrder: 2 + - {fileID: 787012149} + - {fileID: 724612375} + - {fileID: 981405682} + - {fileID: 540464234} + m_Father: {fileID: 2036998554} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &395689441 + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &654334441 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 395689439} + m_GameObject: {fileID: 654334439} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fb890e484538c444da09be8d0f89dcd8, type: 3} + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} m_Name: m_EditorClassIdentifier: - _qrCodeImage: {fileID: 125483106} - _copyToClipboardButton: {fileID: 212403314} - _backButton: {fileID: 1993078182} - _container: {fileID: 1278821651} ---- !u!1001 &452118933 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 387303608} - m_Modifications: - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Name - value: Button - Twitter - objectReference: {fileID: 0} - - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_text - value: Continue with Twitter - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} ---- !u!224 &452118934 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 452118933} - m_PrefabAsset: {fileID: 0} ---- !u!1 &452118936 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 452118933} - m_PrefabAsset: {fileID: 0} ---- !u!114 &452118937 + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!114 &654334442 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 452118936} + m_GameObject: {fileID: 654334439} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} m_Name: m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!1 &492023254 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 5 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &724612374 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1735,104 +1595,107 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 492023255} - - component: {fileID: 492023257} - - component: {fileID: 492023256} - m_Layer: 0 - m_Name: EventSystem + - component: {fileID: 724612375} + - component: {fileID: 724612376} + - component: {fileID: 724612377} + m_Layer: 5 + m_Name: Toggle - Remember Me m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &492023255 -Transform: +--- !u!224 &724612375 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 492023254} + m_GameObject: {fileID: 724612374} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 66.28, y: -78.54001, z: 0} - m_LocalScale: {x: 0.935, y: 0.935, z: 0.935} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} + m_Children: + - {fileID: 351786045} + - {fileID: 1791429089} + m_Father: {fileID: 654334440} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &492023256 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 492023254} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} - m_Name: - m_EditorClassIdentifier: - m_SendPointerHoverToParent: 1 - m_HorizontalAxis: Horizontal - m_VerticalAxis: Vertical - m_SubmitButton: Submit - m_CancelButton: Cancel - m_InputActionsPerSecond: 10 - m_RepeatDelay: 0.5 - m_ForceModuleActive: 0 ---- !u!114 &492023257 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 150, y: -80} + m_SizeDelta: {x: 300, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &724612376 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 492023254} + m_GameObject: {fileID: 724612374} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} m_Name: m_EditorClassIdentifier: - m_FirstSelected: {fileID: 0} - m_sendNavigationEvents: 1 - m_DragThreshold: 10 ---- !u!1 &537139933 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 537139934} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &537139934 -RectTransform: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 351786046} + toggleTransition: 1 + graphic: {fileID: 1900245910} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!114 &724612377 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 537139933} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1808259963} - m_Father: {fileID: 2043937261} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 28} - m_Pivot: {x: 0.5, y: 1} ---- !u!1 &540464233 + m_GameObject: {fileID: 724612374} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &741301285 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1840,129 +1703,83 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 540464234} - - component: {fileID: 540464238} - - component: {fileID: 540464237} - - component: {fileID: 540464236} - - component: {fileID: 540464235} + - component: {fileID: 741301286} + - component: {fileID: 741301289} + - component: {fileID: 741301288} + - component: {fileID: 741301287} m_Layer: 5 - m_Name: Dropdown - Wallets + m_Name: Template m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 0 ---- !u!224 &540464234 +--- !u!224 &741301286 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 540464233} + m_GameObject: {fileID: 741301285} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 2033480131} - - {fileID: 2045136594} - - {fileID: 741301286} - m_Father: {fileID: 2036998554} - m_RootOrder: 3 + - {fileID: 2043937261} + - {fileID: 1934047389} + m_Father: {fileID: 540464234} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 295, y: -190} - m_SizeDelta: {x: 590, y: 50} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &540464235 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 540464233} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!114 &540464236 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 2} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &741301287 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 540464233} + m_GameObject: {fileID: 741301285} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} m_Name: m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 540464237} - m_Template: {fileID: 741301286} - m_CaptionText: {fileID: 2033480132} - m_CaptionImage: {fileID: 0} - m_Placeholder: {fileID: 0} - m_ItemText: {fileID: 258509837} - m_ItemImage: {fileID: 0} - m_Value: 0 - m_Options: - m_Options: [] + m_Content: {fileID: 537139934} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 2043937261} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1934047390} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 m_OnValueChanged: m_PersistentCalls: m_Calls: [] - m_AlphaFadeSpeed: 0.15 ---- !u!114 &540464237 +--- !u!114 &741301288 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 540464233} + m_GameObject: {fileID: 741301285} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.054901965, g: 0.054901965, b: 0.054901965, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -1979,15 +1796,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &540464238 +--- !u!222 &741301289 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 540464233} + m_GameObject: {fileID: 741301285} m_CullTransparentMesh: 1 ---- !u!1 &562988047 +--- !u!1 &786896300 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1995,29 +1812,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 562988048} - - component: {fileID: 562988050} - - component: {fileID: 562988049} + - component: {fileID: 786896301} + - component: {fileID: 786896303} + - component: {fileID: 786896302} m_Layer: 5 - m_Name: Item Background + m_Name: Error message m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &562988048 +--- !u!224 &786896301 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 562988047} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 786896300} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 1808259963} + m_Father: {fileID: 1491563362} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -2025,139 +1842,177 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &562988049 +--- !u!114 &786896302 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 562988047} + m_GameObject: {fileID: 786896300} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_Color: {r: 0.05, g: 0.05, b: 0.05, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &562988050 + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 40 + m_Alignment: 1 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &786896303 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 562988047} + m_GameObject: {fileID: 786896300} m_CullTransparentMesh: 1 ---- !u!1 &724612374 -GameObject: +--- !u!1001 &787012148 +PrefabInstance: m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 724612375} - - component: {fileID: 724612376} - - component: {fileID: 724612377} - m_Layer: 5 - m_Name: Toggle - Remember Me - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &724612375 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 654334440} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: 300 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: 50 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 150 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: -25 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: Button - Existing Wallet + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Continue with Existing Wallet + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!224 &787012149 stripped RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 787012148} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 724612374} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 351786045} - - {fileID: 1791429089} - m_Father: {fileID: 2036998554} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &724612376 +--- !u!114 &787012150 stripped MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 787012148} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 724612374} + m_GameObject: {fileID: 787012151} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 351786046} - toggleTransition: 1 - graphic: {fileID: 1900245910} - m_Group: {fileID: 0} - onValueChanged: - m_PersistentCalls: - m_Calls: [] - m_IsOn: 0 ---- !u!114 &724612377 +--- !u!1 &787012151 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 787012148} + m_PrefabAsset: {fileID: 0} +--- !u!114 &787012152 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 724612374} + m_GameObject: {fileID: 787012151} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} @@ -2171,7 +2026,7 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 ---- !u!1 &741301285 +--- !u!1 &814994757 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2179,108 +2034,134 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 741301286} - - component: {fileID: 741301289} - - component: {fileID: 741301288} - - component: {fileID: 741301287} + - component: {fileID: 814994758} + - component: {fileID: 814994760} + - component: {fileID: 814994759} m_Layer: 5 - m_Name: Template + m_Name: orLabel m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &741301286 + m_IsActive: 1 +--- !u!224 &814994758 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 741301285} + m_GameObject: {fileID: 814994757} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 2043937261} - - {fileID: 1934047389} - m_Father: {fileID: 540464234} + m_Children: [] + m_Father: {fileID: 311857776} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 2} - m_SizeDelta: {x: 0, y: 150} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &741301287 + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.35} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &814994759 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 741301285} + m_GameObject: {fileID: 814994757} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} m_Name: m_EditorClassIdentifier: - m_Content: {fileID: 537139934} - m_Horizontal: 0 - m_Vertical: 1 - m_MovementType: 2 - m_Elasticity: 0.1 - m_Inertia: 1 - m_DecelerationRate: 0.135 - m_ScrollSensitivity: 1 - m_Viewport: {fileID: 2043937261} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 1934047390} - m_HorizontalScrollbarVisibility: 0 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: 0 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] ---- !u!114 &741301288 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 741301285} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &741301289 + m_text: or + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 16 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 8 + m_fontSizeMax: 16 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &814994760 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 741301285} + m_GameObject: {fileID: 814994757} m_CullTransparentMesh: 1 ---- !u!1 &786896300 +--- !u!1 &850372066 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2288,221 +2169,172 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 786896301} - - component: {fileID: 786896303} - - component: {fileID: 786896302} + - component: {fileID: 850372067} + - component: {fileID: 850372069} + - component: {fileID: 850372068} m_Layer: 5 - m_Name: Error message + m_Name: HeaderLabel m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &786896301 +--- !u!224 &850372067 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 786896300} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 850372066} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 1491563362} + m_Father: {fileID: 311857776} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 0.85} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: -50, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &786896302 +--- !u!114 &850372068 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 786896300} + m_GameObject: {fileID: 850372066} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.05, g: 0.05, b: 0.05, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 0 - m_MaxSize: 40 - m_Alignment: 1 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!222 &786896303 + m_text: To Connect your Wallet Scan the QR Code below from your wallet + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 16 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 8 + m_fontSizeMax: 16 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &850372069 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 786896300} + m_GameObject: {fileID: 850372066} m_CullTransparentMesh: 1 ---- !u!1001 &787012148 -PrefabInstance: +--- !u!1 &920270119 +GameObject: m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 2036998554} - m_Modifications: - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_RootOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Name - value: Button - Existing Wallet - objectReference: {fileID: 0} - - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_text - value: Continue with Existing Wallet - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} ---- !u!224 &787012149 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 787012148} - m_PrefabAsset: {fileID: 0} ---- !u!114 &787012150 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 787012148} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 787012151} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &787012151 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 787012148} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} ---- !u!114 &787012152 -MonoBehaviour: + serializedVersion: 6 + m_Component: + - component: {fileID: 920270120} + m_Layer: 5 + m_Name: Header + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &920270120 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 787012151} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!1 &814994757 + m_GameObject: {fileID: 920270119} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 23680381} + - {fileID: 253290329} + m_Father: {fileID: 1880270956} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.725} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -25} + m_SizeDelta: {x: -50, y: -50} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &977353941 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2510,46 +2342,46 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 814994758} - - component: {fileID: 814994760} - - component: {fileID: 814994759} + - component: {fileID: 977353942} + - component: {fileID: 977353944} + - component: {fileID: 977353943} m_Layer: 5 - m_Name: orLabel + m_Name: Handle m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &814994758 +--- !u!224 &977353942 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 814994757} + m_GameObject: {fileID: 977353941} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 311857776} - m_RootOrder: 2 + m_Father: {fileID: 1513683686} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.25} - m_AnchorMax: {x: 1, y: 0.35} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.2} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &814994759 +--- !u!114 &977353943 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 814994757} + m_GameObject: {fileID: 977353941} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -2560,84 +2392,25 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: or - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 16 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 1 - m_fontSizeMin: 8 - m_fontSizeMax: 16 - m_fontStyle: 1 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &814994760 + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &977353944 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 814994757} + m_GameObject: {fileID: 977353941} m_CullTransparentMesh: 1 ---- !u!1 &850372066 +--- !u!1 &981405681 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2645,286 +2418,37 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 850372067} - - component: {fileID: 850372069} - - component: {fileID: 850372068} + - component: {fileID: 981405682} + - component: {fileID: 981405684} + - component: {fileID: 981405683} m_Layer: 5 - m_Name: HeaderLabel + m_Name: Toggle - Redirect To Wallet m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &850372067 +--- !u!224 &981405682 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 850372066} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 311857776} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.85} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -50, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &850372068 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 850372066} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: To Connect your Wallet Scan the QR Code below from your wallet - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 16 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 1 - m_fontSizeMin: 8 - m_fontSizeMax: 16 - m_fontStyle: 1 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &850372069 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 850372066} - m_CullTransparentMesh: 1 ---- !u!1 &920270119 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 920270120} - m_Layer: 5 - m_Name: Header - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &920270120 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 920270119} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 23680381} - - {fileID: 253290329} - m_Father: {fileID: 1880270956} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.725} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 1} ---- !u!1 &977353941 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 977353942} - - component: {fileID: 977353944} - - component: {fileID: 977353943} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &977353942 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 977353941} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1513683686} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0.2} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &977353943 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 977353941} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &977353944 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 977353941} - m_CullTransparentMesh: 1 ---- !u!1 &981405681 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 981405682} - - component: {fileID: 981405684} - - component: {fileID: 981405683} - m_Layer: 5 - m_Name: Toggle - Redirect To Wallet - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &981405682 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 981405681} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 981405681} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - {fileID: 225123874} - {fileID: 1642196834} - m_Father: {fileID: 2036998554} + m_Father: {fileID: 654334440} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 150, y: -135} + m_SizeDelta: {x: 300, y: 50} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &981405683 MonoBehaviour: @@ -3070,7 +2594,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1023192743} m_CullTransparentMesh: 1 ---- !u!1 &1062946085 +--- !u!1 &1278821650 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3078,46 +2602,9 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1062946086} + - component: {fileID: 1278821651} m_Layer: 5 - m_Name: Column - Web3Auth - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1062946086 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1062946085} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 387303608} - m_Father: {fileID: 1434038408} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -50, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1278821650 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1278821651} - m_Layer: 5 - m_Name: Container + m_Name: Container m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -3213,176 +2700,6 @@ MonoBehaviour: Universal: VerifyUrl: walletConnectModal: {fileID: 395689441} ---- !u!1 &1434038407 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1434038408} - m_Layer: 5 - m_Name: Columns - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1434038408 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1434038407} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1062946086} - - {fileID: 325001972} - - {fileID: 2036998554} - m_Father: {fileID: 1880270956} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.15} - m_AnchorMax: {x: 1, y: 0.725} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 1} ---- !u!1001 &1452765487 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 387303608} - m_Modifications: - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_RootOrder - value: 4 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Name - value: Button - Discord - objectReference: {fileID: 0} - - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_text - value: Continue with Discord - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} ---- !u!224 &1452765488 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1452765487} - m_PrefabAsset: {fileID: 0} ---- !u!1 &1452765490 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1452765487} - m_PrefabAsset: {fileID: 0} ---- !u!114 &1452765491 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1452765490} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 --- !u!1 &1491563361 GameObject: m_ObjectHideFlags: 0 @@ -3415,143 +2732,12 @@ RectTransform: - {fileID: 8930114541282302188} m_Father: {fileID: 279245843} m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -21} - m_SizeDelta: {x: -32, y: -58} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1001 &1508551056 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 387303608} - m_Modifications: - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_RootOrder - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Name - value: Button - Twitch - objectReference: {fileID: 0} - - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_text - value: Continue with Twitch - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} ---- !u!224 &1508551057 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1508551056} - m_PrefabAsset: {fileID: 0} ---- !u!1 &1508551059 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1508551056} - m_PrefabAsset: {fileID: 0} ---- !u!114 &1508551060 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1508551059} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -21} + m_SizeDelta: {x: -32, y: -58} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1513683685 GameObject: m_ObjectHideFlags: 0 @@ -3743,6 +2929,85 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1583968963} m_CullTransparentMesh: 1 +--- !u!1 &1621534067 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1621534068} + - component: {fileID: 1621534069} + - component: {fileID: 1621534070} + m_Layer: 5 + m_Name: Container + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1621534068 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1621534067} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2036998554} + m_Father: {fileID: 1880270956} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.725} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1621534069 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1621534067} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 25 + m_Right: 25 + m_Top: 25 + m_Bottom: 25 + m_ChildAlignment: 0 + m_Spacing: 50 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1621534070 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1621534067} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 --- !u!1 &1642196833 GameObject: m_ObjectHideFlags: 0 @@ -3828,7 +3093,7 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 17.9 + m_fontSize: 8.2 m_fontSizeBase: 20 m_fontWeight: 400 m_enableAutoSizing: 1 @@ -4023,7 +3288,7 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 17.9 + m_fontSize: 10.1 m_fontSizeBase: 20 m_fontWeight: 400 m_enableAutoSizing: 1 @@ -4246,7 +3511,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 920270120} - - {fileID: 1434038408} + - {fileID: 1621534068} - {fileID: 395689440} - {fileID: 1701305867} m_Father: {fileID: 0} @@ -4554,223 +3819,92 @@ MonoBehaviour: m_fontSizeMax: 72 m_fontStyle: 1 m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: -15, y: 15, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1993078181 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1993078178} - m_CullTransparentMesh: 1 ---- !u!114 &1993078182 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1993078178} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1561876543} - m_OnClick: - m_PersistentCalls: - m_Calls: [] ---- !u!1001 &1996606957 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 387303608} - m_Modifications: - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_RootOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Name - value: Button - Google - objectReference: {fileID: 0} - - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_text - value: Continue with Google - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} ---- !u!224 &1996606958 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1996606957} - m_PrefabAsset: {fileID: 0} ---- !u!1 &1996606960 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1996606957} + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: -15, y: 15, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1993078181 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} ---- !u!114 &1996606961 + m_GameObject: {fileID: 1993078178} + m_CullTransparentMesh: 1 +--- !u!114 &1993078182 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1996606960} + m_GameObject: {fileID: 1993078178} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1561876543} + m_OnClick: + m_PersistentCalls: + m_Calls: [] --- !u!1 &2033480130 GameObject: m_ObjectHideFlags: 0 @@ -4915,7 +4049,6 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 2036998554} - - component: {fileID: 2036998555} - component: {fileID: 2036998556} m_Layer: 5 m_Name: Column - Existing Wallet @@ -4931,49 +4064,20 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2036998553} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 787012149} - - {fileID: 724612375} - - {fileID: 981405682} - - {fileID: 540464234} - m_Father: {fileID: 1434038408} - m_RootOrder: 2 + - {fileID: 654334440} + m_Father: {fileID: 1621534068} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.75} - m_AnchorMax: {x: 1, y: 1} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -50, y: 0} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &2036998555 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2036998553} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 0 - m_Spacing: 5 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 1 - m_ChildControlWidth: 1 - m_ChildControlHeight: 1 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2036998556 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4983,11 +4087,17 @@ MonoBehaviour: m_GameObject: {fileID: 2036998553} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} m_Name: m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 300 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 --- !u!1 &2043937260 GameObject: m_ObjectHideFlags: 0 @@ -5155,137 +4265,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2045136593} m_CullTransparentMesh: 1 ---- !u!1001 &2114521192 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 387303608} - m_Modifications: - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_RootOrder - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Name - value: Button - Reddit - objectReference: {fileID: 0} - - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_text - value: Continue with Reddit - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} ---- !u!224 &2114521193 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 2114521192} - m_PrefabAsset: {fileID: 0} ---- !u!1 &2114521195 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 2114521192} - m_PrefabAsset: {fileID: 0} ---- !u!114 &2114521196 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2114521195} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 --- !u!1 &2126730551 GameObject: m_ObjectHideFlags: 0 diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs index ab56d293f..fec9c9a76 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs @@ -10,8 +10,8 @@ public class Logout : MonoBehaviour public async void OnLogout() { // Remove the saved "remember me" data, if any - PlayerPrefs.DeleteKey(Login.SavedWalletConnectConfigKey); - + PlayerData.Clear(); + // Terminate Web3 await Web3Accessor.Web3.TerminateAsync(); diff --git a/src/UnitySampleProject/Assets/ExistingWalletLogin.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/ExistingWalletLogin.cs similarity index 93% rename from src/UnitySampleProject/Assets/ExistingWalletLogin.cs rename to src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/ExistingWalletLogin.cs index ca1d8e34d..31d2f9960 100644 --- a/src/UnitySampleProject/Assets/ExistingWalletLogin.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/ExistingWalletLogin.cs @@ -21,8 +21,6 @@ public class ExistingWalletLogin : Login { - private const string SavedWalletConnectConfigKey = "SavedWalletConnectConfig"; - [Header("UI")] [SerializeField] private TMP_Dropdown supportedWalletsDropdown; @@ -110,9 +108,9 @@ protected override Web3Builder ConfigureWeb3Services(Web3Builder web3Builder) private async Task TryAutoLogin() { - string savedConfigJson = PlayerPrefs.GetString(SavedWalletConnectConfigKey, null); - - if (string.IsNullOrEmpty(savedConfigJson)) + walletConnectConfig = PlayerData.Instance.WalletConnectConfig; + + if (walletConnectConfig == null) { return; } @@ -122,8 +120,6 @@ private async Task TryAutoLogin() try { autoLogin = true; - - walletConnectConfig = JsonConvert.DeserializeObject(savedConfigJson); await TryLogin(); } @@ -242,13 +238,17 @@ private void SessionApproved(SessionStruct session) { walletConnectConfig.SavedSessionTopic = session.Topic; - PlayerPrefs.SetString(SavedWalletConnectConfigKey, JsonConvert.SerializeObject(walletConnectConfig)); + PlayerData.Instance.WalletConnectConfig = walletConnectConfig; + + PlayerData.Save(); } else { // reset if any saved config - PlayerPrefs.SetString(SavedWalletConnectConfigKey, null); + PlayerData.Instance.WalletConnectConfig = null; + + PlayerData.Save(); } Debug.Log($"{session.Topic} Approved"); diff --git a/src/UnitySampleProject/Assets/ExistingWalletLogin.cs.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/ExistingWalletLogin.cs.meta similarity index 100% rename from src/UnitySampleProject/Assets/ExistingWalletLogin.cs.meta rename to src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/ExistingWalletLogin.cs.meta diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/PlayerData.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/PlayerData.cs new file mode 100644 index 000000000..7a0439e85 --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/PlayerData.cs @@ -0,0 +1,77 @@ +using System.Collections; +using System.Collections.Generic; +using System.IO; +using ChainSafe.Gaming.WalletConnect; +using Newtonsoft.Json; +using UnityEngine; + +[JsonObject(MemberSerialization.OptIn)] +public class PlayerData +{ + #region Save & Load + + private static string _path = $"{Path.Combine(Application.persistentDataPath, nameof(PlayerData))}.json"; + + public static PlayerData Instance { get; private set; } = new PlayerData(); + + private bool FileExists => File.Exists(_path); + + [RuntimeInitializeOnLoadMethod] + public static void LoadOnStart() + { + Instance.LoadData(); + } + + private void LoadData() + { + if (!FileExists) + { + SaveData(); + + return; + } + + using (FileStream fs = new FileStream(_path, FileMode.Open, FileAccess.Read)) + using (StreamReader sr = new StreamReader(fs)) + { + string rawJson = sr.ReadToEnd(); + + Instance = JsonConvert.DeserializeObject(rawJson); + + Debug.Log($"{nameof(PlayerData)} loaded from path {_path}."); + } + } + + private void SaveData() + { + // create file + using (FileStream fs = new FileStream(_path, FileMode.OpenOrCreate, FileAccess.Write)) + using (StreamWriter sw = new StreamWriter(fs)) + { + sw.WriteLine(JsonConvert.SerializeObject(Instance)); + + Debug.Log($"{nameof(PlayerData)} saved at path {_path}."); + } + } + + public static void Save() + { + Instance.SaveData(); + } + + public static void Load() + { + Instance.LoadData(); + } + + public static void Clear() + { + Instance = new PlayerData(); + + Save(); + } + + #endregion + + [JsonProperty] public WalletConnectConfig WalletConnectConfig { get; set; } +} diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/PlayerData.cs.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/PlayerData.cs.meta new file mode 100644 index 000000000..14947b3b0 --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/PlayerData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 059957c81c98a844c930372537e018dc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 436a614d8d6c7f618799f562467c824ad32dbcfd Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 17:36:13 +0300 Subject: [PATCH 079/167] syntax fix --- .github/workflows/duplicate_samples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 066fba4ab..ee2f72d2a 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -17,7 +17,7 @@ jobs: - name: Checkout Repository uses: actions/checkout@v4 with: - ref: ${{ github.event.pull_request.head.ref }} + ref: ${{ github.event.push.head.ref }} - name: Run duplicate script file run: | #Duplicate Web3.Unity Samples From ffd5fcd1629bd5f3df98fc4a8ef4e0804b85a8fb Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 17:37:44 +0300 Subject: [PATCH 080/167] removed with branch from checkout in duplicate_samples.yml --- .github/workflows/duplicate_samples.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index ee2f72d2a..a17b31d88 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -16,8 +16,7 @@ jobs: steps: - name: Checkout Repository uses: actions/checkout@v4 - with: - ref: ${{ github.event.push.head.ref }} + - name: Run duplicate script file run: | #Duplicate Web3.Unity Samples From 603adcb38fb5c31b5e0277765607e93ce8809ee6 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 17:40:21 +0300 Subject: [PATCH 081/167] syntax fix attempt 0 --- .github/workflows/duplicate_samples.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index a17b31d88..b87a8d72d 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -16,7 +16,6 @@ jobs: steps: - name: Checkout Repository uses: actions/checkout@v4 - - name: Run duplicate script file run: | #Duplicate Web3.Unity Samples From 2450534c1e0fd5248a600d94562b87c41daaf84f Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 17:42:35 +0300 Subject: [PATCH 082/167] syntax fix attempt 1 --- .github/workflows/duplicate_samples.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index b87a8d72d..76d8710ca 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -14,8 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - - name: Checkout Repository - uses: actions/checkout@v4 + - uses: actions/checkout@v4 - name: Run duplicate script file run: | #Duplicate Web3.Unity Samples From 7081af29b81a6477ffbed83905d5b49a84c8e552 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 17:46:04 +0300 Subject: [PATCH 083/167] syntax fix attempt 2 --- .github/workflows/duplicate_samples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 76d8710ca..f471d5f20 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v3 - name: Run duplicate script file run: | #Duplicate Web3.Unity Samples From c75b31e53f85a5d469135798686829581b9aef48 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 17:48:29 +0300 Subject: [PATCH 084/167] syntax fix attempt 3 --- .github/workflows/duplicate_samples.yml | 42 +++++++++++++------------ 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index f471d5f20..8d35ca09d 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -14,24 +14,26 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: Run duplicate script file - run: | - #Duplicate Web3.Unity Samples - scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/**/Web3.Unity Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - #Duplicate Web3Auth Samples - scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/**/Web3.Unity Web3Auth Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Run duplicate script file + run: | + #Duplicate Web3.Unity Samples + scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/**/Web3.Unity Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" + #Duplicate Web3Auth Samples + scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/**/Web3.Unity Web3Auth Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - - name: Commit and Push - run: | - git config user.email $git_email - git config user.name "${{ github.actor }}" - # add Web3.Unity duplicated changes - git add ./Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f - # add Web3Auth duplicated changes - git add ./Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/. -f - # check if there are any changes before making a commit - git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" - git push - env: - git_email: "${{ github.actor }}@users.noreply.github.com" \ No newline at end of file + - name: Commit and Push + run: | + git config user.email $git_email + git config user.name "${{ github.actor }}" + # add Web3.Unity duplicated changes + git add ./Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f + # add Web3Auth duplicated changes + git add ./Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/. -f + # check if there are any changes before making a commit + git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" + git push + env: + git_email: "${{ github.actor }}@users.noreply.github.com" \ No newline at end of file From dd94d4c88bd7ca9262599ee8b4122b9ef2bc7e74 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 17:53:20 +0300 Subject: [PATCH 085/167] syntax fix attempt 4 --- .github/workflows/duplicate_samples.yml | 51 +++++++++++-------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 8d35ca09d..3ebca0182 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -1,9 +1,5 @@ name: Duplicate Package Samples Workflow -#on: -# pull_request: -# branches: [main] - on: push: branches: [ rob/samples-import-fixes-642 ] @@ -12,28 +8,27 @@ jobs: duplicate: name: Duplicate samples job 👯 runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Run duplicate script file - run: | - #Duplicate Web3.Unity Samples - scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/**/Web3.Unity Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - #Duplicate Web3Auth Samples - scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/**/Web3.Unity Web3Auth Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - - - name: Commit and Push - run: | - git config user.email $git_email - git config user.name "${{ github.actor }}" - # add Web3.Unity duplicated changes - git add ./Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f - # add Web3Auth duplicated changes - git add ./Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/. -f - # check if there are any changes before making a commit - git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" - git push - env: - git_email: "${{ github.actor }}@users.noreply.github.com" \ No newline at end of file + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Run duplicate script file + run: | + #Duplicate Web3.Unity Samples + scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/**/Web3.Unity Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" + #Duplicate Web3Auth Samples + scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/**/Web3.Unity Web3Auth Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" + + - name: Commit and Push + run: | + git config user.email $git_email + git config user.name "${{ github.actor }}" + # add Web3.Unity duplicated changes + git add ./Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f + # add Web3Auth duplicated changes + git add ./Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/. -f + # check if there are any changes before making a commit + git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" + git push + env: + git_email: "${{ github.actor }}@users.noreply.github.com" \ No newline at end of file From a2eed95ebc63f4b382b07c780cab3d61cd25a4f9 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 17:54:50 +0300 Subject: [PATCH 086/167] syntax fix attempt 5 --- .github/workflows/duplicate_samples.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 3ebca0182..441a34949 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -9,9 +9,8 @@ jobs: name: Duplicate samples job 👯 runs-on: ubuntu-latest steps: - - name: Checkout repository + - name: Checkout Repository uses: actions/checkout@v4 - - name: Run duplicate script file run: | #Duplicate Web3.Unity Samples From f74a711a5d5a7647c074bd590a33f2912e03925a Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 17:59:14 +0300 Subject: [PATCH 087/167] syntax fix attempt 6 --- .github/workflows/duplicate_samples.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 441a34949..eda843fcd 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -9,8 +9,7 @@ jobs: name: Duplicate samples job 👯 runs-on: ubuntu-latest steps: - - name: Checkout Repository - uses: actions/checkout@v4 + - uses: actions/checkout@v4 - name: Run duplicate script file run: | #Duplicate Web3.Unity Samples From df42cd3febefa915625265fc8e1e8c17c94d50a6 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 18:00:06 +0300 Subject: [PATCH 088/167] syntax fix attempt 7 --- .github/workflows/duplicate_samples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index eda843fcd..dcc42cbf7 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -9,7 +9,7 @@ jobs: name: Duplicate samples job 👯 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v3 - name: Run duplicate script file run: | #Duplicate Web3.Unity Samples From df7d819267aa4fe5115847cd4acb5c5c27ebb228 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 18:00:48 +0300 Subject: [PATCH 089/167] syntax fix attempt 8 --- .github/workflows/duplicate_samples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index dcc42cbf7..681832ac2 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -9,7 +9,7 @@ jobs: name: Duplicate samples job 👯 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + #- uses: actions/checkout@v4 - name: Run duplicate script file run: | #Duplicate Web3.Unity Samples From 1762d29875ada7d6e16390c12fbf4518684b8ad3 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 18:02:44 +0300 Subject: [PATCH 090/167] syntax fix attempt 9 --- .github/workflows/duplicate_samples.yml | 40 ++++++++++++------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 681832ac2..41aa2d467 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -9,24 +9,24 @@ jobs: name: Duplicate samples job 👯 runs-on: ubuntu-latest steps: - #- uses: actions/checkout@v4 - - name: Run duplicate script file - run: | - #Duplicate Web3.Unity Samples - scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/**/Web3.Unity Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - #Duplicate Web3Auth Samples - scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/**/Web3.Unity Web3Auth Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" + - uses: actions/checkout@v4 + - name: Run duplicate script file + run: | + #Duplicate Web3.Unity Samples + scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/**/Web3.Unity Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" + #Duplicate Web3Auth Samples + scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/**/Web3.Unity Web3Auth Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - - name: Commit and Push - run: | - git config user.email $git_email - git config user.name "${{ github.actor }}" - # add Web3.Unity duplicated changes - git add ./Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f - # add Web3Auth duplicated changes - git add ./Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/. -f - # check if there are any changes before making a commit - git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" - git push - env: - git_email: "${{ github.actor }}@users.noreply.github.com" \ No newline at end of file + - name: Commit and Push + run: | + git config user.email $git_email + git config user.name "${{ github.actor }}" + # add Web3.Unity duplicated changes + git add ./Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f + # add Web3Auth duplicated changes + git add ./Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/. -f + # check if there are any changes before making a commit + git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" + git push + env: + git_email: "${{ github.actor }}@users.noreply.github.com" \ No newline at end of file From fdb8d38441e3831b25cf7f7918001adef6f27dd2 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 18:05:56 +0300 Subject: [PATCH 091/167] syntax fix attempt 10 --- .github/workflows/duplicate_samples.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 41aa2d467..d7e4cb0d6 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -12,20 +12,15 @@ jobs: - uses: actions/checkout@v4 - name: Run duplicate script file run: | - #Duplicate Web3.Unity Samples scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/**/Web3.Unity Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - #Duplicate Web3Auth Samples scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/**/Web3.Unity Web3Auth Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - name: Commit and Push run: | git config user.email $git_email git config user.name "${{ github.actor }}" - # add Web3.Unity duplicated changes git add ./Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f - # add Web3Auth duplicated changes git add ./Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/. -f - # check if there are any changes before making a commit git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From ea4c9c7a2e1d684255e42483c617f0c62e9d61c1 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 23 Oct 2023 18:10:14 +0300 Subject: [PATCH 092/167] give permission to run bash script --- .github/workflows/duplicate_samples.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index d7e4cb0d6..ad1d00794 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -12,6 +12,7 @@ jobs: - uses: actions/checkout@v4 - name: Run duplicate script file run: | + chmod +x scripts/duplicate-sample.sh scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/**/Web3.Unity Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/**/Web3.Unity Web3Auth Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" From f7bc3977eea543132e13718b15cc678344c81979 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 09:19:10 +0300 Subject: [PATCH 093/167] variable path for version implemented --- .github/workflows/duplicate_samples.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index ad1d00794..3427c3b4f 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -13,9 +13,14 @@ jobs: - name: Run duplicate script file run: | chmod +x scripts/duplicate-sample.sh - scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/**/Web3.Unity Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - scripts/duplicate-sample.sh "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/**/Web3.Unity Web3Auth Samples/" "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - + scripts/duplicate-sample.sh $web3_unity_imported_sample_path $web3_unity_importable_sample_path + scripts/duplicate-sample.sh $web3_auth_imported_sample_path $web3_auth_importable_sample_path + env: + web3_unity_imported_sample_path: "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)/Web3.Unity Samples/" + web3_unity_importable_sample_path: "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" + web3_auth_imported_sample_path: "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)/Web3.Unity Web3Auth Samples/" + web3_auth_importable_sample_path: "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" + - name: Commit and Push run: | git config user.email $git_email From ca3ef886be1724d5ee2876ab21165facda9819ec Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 09:22:56 +0300 Subject: [PATCH 094/167] removed path agnostic implementation --- scripts/duplicate-sample.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scripts/duplicate-sample.sh b/scripts/duplicate-sample.sh index 06d829831..7a3d5f6f4 100644 --- a/scripts/duplicate-sample.sh +++ b/scripts/duplicate-sample.sh @@ -1,8 +1,4 @@ #! /usr/bin/env sh -scripts_dir=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) - -pushd "$scripts_dir"/../ - export SOURCE_DIRECTORY="$1" export DESTINATION_DIRECTORY="$2" rm -r "$DESTINATION_DIRECTORY" From 95192e0ab1c9b9564d4beae6cd1edbd8322eaf5d Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 09:44:20 +0300 Subject: [PATCH 095/167] path updates --- .github/workflows/duplicate_samples.yml | 4 ++-- scripts/duplicate-sample.sh | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 3427c3b4f..aab5f6580 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -16,9 +16,9 @@ jobs: scripts/duplicate-sample.sh $web3_unity_imported_sample_path $web3_unity_importable_sample_path scripts/duplicate-sample.sh $web3_auth_imported_sample_path $web3_auth_importable_sample_path env: - web3_unity_imported_sample_path: "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)/Web3.Unity Samples/" + web3_unity_imported_sample_path: "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/" web3_unity_importable_sample_path: "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - web3_auth_imported_sample_path: "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)/Web3.Unity Web3Auth Samples/" + web3_auth_imported_sample_path: "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/" web3_auth_importable_sample_path: "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - name: Commit and Push diff --git a/scripts/duplicate-sample.sh b/scripts/duplicate-sample.sh index 7a3d5f6f4..b1621ea67 100644 --- a/scripts/duplicate-sample.sh +++ b/scripts/duplicate-sample.sh @@ -1,5 +1,4 @@ #! /usr/bin/env sh -export SOURCE_DIRECTORY="$1" -export DESTINATION_DIRECTORY="$2" -rm -r "$DESTINATION_DIRECTORY" -cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" \ No newline at end of file +rm -r "$2/" +mkdir -p $2 +cp -r "$1"* $2 \ No newline at end of file From 681d5eb4ff1c74ec7f677c2cc90031cab2fd3330 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 09:46:35 +0300 Subject: [PATCH 096/167] more path updates --- .github/workflows/duplicate_samples.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index aab5f6580..0880b9765 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -16,10 +16,10 @@ jobs: scripts/duplicate-sample.sh $web3_unity_imported_sample_path $web3_unity_importable_sample_path scripts/duplicate-sample.sh $web3_auth_imported_sample_path $web3_auth_importable_sample_path env: - web3_unity_imported_sample_path: "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/" - web3_unity_importable_sample_path: "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - web3_auth_imported_sample_path: "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/" - web3_auth_importable_sample_path: "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" + web3_unity_imported_sample_path: "${{ GITHUB_WORKSPACE }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/" + web3_unity_importable_sample_path: "${{ GITHUB_WORKSPACE }}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" + web3_auth_imported_sample_path: "${{ GITHUB_WORKSPACE }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/" + web3_auth_importable_sample_path: "${{ GITHUB_WORKSPACE }}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - name: Commit and Push run: | From bc3a6ca96f599c28332b67c7bbbfca39366d2d65 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 09:50:21 +0300 Subject: [PATCH 097/167] more path changes --- .github/workflows/duplicate_samples.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 0880b9765..dd196bf4b 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -16,10 +16,10 @@ jobs: scripts/duplicate-sample.sh $web3_unity_imported_sample_path $web3_unity_importable_sample_path scripts/duplicate-sample.sh $web3_auth_imported_sample_path $web3_auth_importable_sample_path env: - web3_unity_imported_sample_path: "${{ GITHUB_WORKSPACE }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/" - web3_unity_importable_sample_path: "${{ GITHUB_WORKSPACE }}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - web3_auth_imported_sample_path: "${{ GITHUB_WORKSPACE }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/" - web3_auth_importable_sample_path: "${{ GITHUB_WORKSPACE }}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" + web3_unity_imported_sample_path: ${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/ + web3_unity_importable_sample_path: ${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/ + web3_auth_imported_sample_path: ${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/ + web3_auth_importable_sample_path: ${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/ - name: Commit and Push run: | From 9cb82f4574bf8437b77b0a00b9d3b49c25f881a0 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 09:52:27 +0300 Subject: [PATCH 098/167] more path changes --- .github/workflows/duplicate_samples.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index dd196bf4b..1588d2887 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -16,10 +16,10 @@ jobs: scripts/duplicate-sample.sh $web3_unity_imported_sample_path $web3_unity_importable_sample_path scripts/duplicate-sample.sh $web3_auth_imported_sample_path $web3_auth_importable_sample_path env: - web3_unity_imported_sample_path: ${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/ - web3_unity_importable_sample_path: ${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/ - web3_auth_imported_sample_path: ${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/ - web3_auth_importable_sample_path: ${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/ + web3_unity_imported_sample_path: "src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/" + web3_unity_importable_sample_path: "Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" + web3_auth_imported_sample_path: "src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/" + web3_auth_importable_sample_path: "Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - name: Commit and Push run: | From 8f78deb1cfc9e54c2eb664267223af7ce7896092 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 09:54:11 +0300 Subject: [PATCH 099/167] git add path changes --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 1588d2887..a366af6f1 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -25,8 +25,8 @@ jobs: run: | git config user.email $git_email git config user.name "${{ github.actor }}" - git add ./Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f - git add ./Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/. -f + git add Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f + git add Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/. -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From dce1efb6d6b105706fea7492712967d3eed7c51e Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 09:55:39 +0300 Subject: [PATCH 100/167] git add path changes --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index a366af6f1..c0f4657f2 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -25,8 +25,8 @@ jobs: run: | git config user.email $git_email git config user.name "${{ github.actor }}" - git add Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f - git add Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/. -f + git add "Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/." -f + git add "Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/." -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From 3ccd88fb0eef7c698a727ed675faa65a495ada0d Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 10:18:33 +0300 Subject: [PATCH 101/167] script updated and tested locally --- scripts/duplicate-sample.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/duplicate-sample.sh b/scripts/duplicate-sample.sh index b1621ea67..313dec72d 100644 --- a/scripts/duplicate-sample.sh +++ b/scripts/duplicate-sample.sh @@ -1,4 +1,4 @@ #! /usr/bin/env sh -rm -r "$2/" -mkdir -p $2 -cp -r "$1"* $2 \ No newline at end of file +rm -rf "$2" +mkdir -p "$2" +cp -r "$1"* "$2" \ No newline at end of file From dc0de8500c70de1bbcb5ec3b1a71b229be9c22eb Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 10:21:01 +0300 Subject: [PATCH 102/167] git add path updates --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index c0f4657f2..8a00e224e 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -25,8 +25,8 @@ jobs: run: | git config user.email $git_email git config user.name "${{ github.actor }}" - git add "Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/." -f - git add "Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/." -f + git add "${{ GITHUB_WORKSPACE }}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/." -f + git add "${{ GITHUB_WORKSPACE }}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/." -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From fe9da99b58828d74003a7d58ddbc911766628109 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 10:22:23 +0300 Subject: [PATCH 103/167] changed GITHUB_WORKSPACE to github.workspace --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 8a00e224e..914f04cc0 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -25,8 +25,8 @@ jobs: run: | git config user.email $git_email git config user.name "${{ github.actor }}" - git add "${{ GITHUB_WORKSPACE }}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/." -f - git add "${{ GITHUB_WORKSPACE }}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/." -f + git add "${{ github.workspace }}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/." -f + git add "${{ github.workspace }}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/." -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From adfb1ca5b581a75d4e8ee2edf3a2dae96a657ebc Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 10:24:21 +0300 Subject: [PATCH 104/167] more git add path updates --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 914f04cc0..6be7d25eb 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -25,8 +25,8 @@ jobs: run: | git config user.email $git_email git config user.name "${{ github.actor }}" - git add "${{ github.workspace }}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/." -f - git add "${{ github.workspace }}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/." -f + git add "./Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/." -f + git add "./Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/." -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From 0796d20c50a1cdcff5afb07838d072f309e6f6f3 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 10:27:01 +0300 Subject: [PATCH 105/167] more git add path updates, tested locally --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 6be7d25eb..d5649f7a8 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -25,8 +25,8 @@ jobs: run: | git config user.email $git_email git config user.name "${{ github.actor }}" - git add "./Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/." -f - git add "./Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/." -f + git add ./Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f + git add "./Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/". -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From f7c460df207e01380d17e11dd8f36c91d11d0f48 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 10:28:54 +0300 Subject: [PATCH 106/167] more git add path updates, tested locally --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index d5649f7a8..3f27c799e 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -25,8 +25,8 @@ jobs: run: | git config user.email $git_email git config user.name "${{ github.actor }}" - git add ./Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/. -f - git add "./Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/". -f + git add ./Packages/io.chainsafe.web3-unity/Samples~/. -f + git add ./Packages/io.chainsafe.web3-unity.web3auth/Samples~/. -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From e25dca533e6ce3b6f7dc8c24645ccd42bc864e53 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 10:31:34 +0300 Subject: [PATCH 107/167] echo ls test --- .github/workflows/duplicate_samples.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 3f27c799e..6e4b64bca 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -23,6 +23,7 @@ jobs: - name: Commit and Push run: | + echo $(ls) git config user.email $git_email git config user.name "${{ github.actor }}" git add ./Packages/io.chainsafe.web3-unity/Samples~/. -f From 9a2834d90b509a7b0f4e5b32db6bc919432ddf93 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 10:32:54 +0300 Subject: [PATCH 108/167] more git add path updates --- .github/workflows/duplicate_samples.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 6e4b64bca..f2bbe4c28 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -23,11 +23,10 @@ jobs: - name: Commit and Push run: | - echo $(ls) git config user.email $git_email git config user.name "${{ github.actor }}" - git add ./Packages/io.chainsafe.web3-unity/Samples~/. -f - git add ./Packages/io.chainsafe.web3-unity.web3auth/Samples~/. -f + git add Packages/io.chainsafe.web3-unity/Samples~/. -f + git add Packages/io.chainsafe.web3-unity.web3auth/Samples~/. -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From faf7c9dd320a89724446ee1091dc993074acbb33 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 10:35:24 +0300 Subject: [PATCH 109/167] more git add path updates --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index f2bbe4c28..92efd7f5d 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -25,8 +25,8 @@ jobs: run: | git config user.email $git_email git config user.name "${{ github.actor }}" - git add Packages/io.chainsafe.web3-unity/Samples~/. -f - git add Packages/io.chainsafe.web3-unity.web3auth/Samples~/. -f + git add ${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/. -f + git add ${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/. -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From cf66afd4afe9f2e0c044d1370203a41a8901cf49 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 10:39:30 +0300 Subject: [PATCH 110/167] added github.workspace to path prefixes --- .github/workflows/duplicate_samples.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 92efd7f5d..80234194d 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -16,17 +16,17 @@ jobs: scripts/duplicate-sample.sh $web3_unity_imported_sample_path $web3_unity_importable_sample_path scripts/duplicate-sample.sh $web3_auth_imported_sample_path $web3_auth_importable_sample_path env: - web3_unity_imported_sample_path: "src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/" - web3_unity_importable_sample_path: "Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - web3_auth_imported_sample_path: "src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/" - web3_auth_importable_sample_path: "Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" + web3_unity_imported_sample_path: "${{ github.workspace }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/" + web3_unity_importable_sample_path: "${{ github.workspace }}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" + web3_auth_imported_sample_path: "${{ github.workspace }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/" + web3_auth_importable_sample_path: "${{ github.workspace }}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - name: Commit and Push run: | git config user.email $git_email git config user.name "${{ github.actor }}" - git add ${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/. -f - git add ${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/. -f + git add ${github.workspace}/Packages/io.chainsafe.web3-unity/Samples~/. -f + git add ${github.workspace}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/. -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From ad66b5c57351c5dfeba6509b314bf2b815fa621c Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 10:44:24 +0300 Subject: [PATCH 111/167] echos and path changes --- .github/workflows/duplicate_samples.yml | 4 ++-- scripts/duplicate-sample.sh | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 80234194d..673bfcf72 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -25,8 +25,8 @@ jobs: run: | git config user.email $git_email git config user.name "${{ github.actor }}" - git add ${github.workspace}/Packages/io.chainsafe.web3-unity/Samples~/. -f - git add ${github.workspace}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/. -f + git add Packages/io.chainsafe.web3-unity/Samples~/. -f + git add Packages/io.chainsafe.web3-unity.web3auth/Samples~/. -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: diff --git a/scripts/duplicate-sample.sh b/scripts/duplicate-sample.sh index 313dec72d..9eb6147c5 100644 --- a/scripts/duplicate-sample.sh +++ b/scripts/duplicate-sample.sh @@ -1,4 +1,7 @@ #! /usr/bin/env sh rm -rf "$2" +echo "$2 directory removed" mkdir -p "$2" -cp -r "$1"* "$2" \ No newline at end of file +echo "$2 directory created" +cp -r "$1"* "$2" +echo "$1 contents copied into $2" \ No newline at end of file From 78dcdd7abbdd4a822bcfd9343cb5ac612b729bc1 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 10:46:48 +0300 Subject: [PATCH 112/167] path updates --- .github/workflows/duplicate_samples.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 673bfcf72..f2bbe4c28 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -16,10 +16,10 @@ jobs: scripts/duplicate-sample.sh $web3_unity_imported_sample_path $web3_unity_importable_sample_path scripts/duplicate-sample.sh $web3_auth_imported_sample_path $web3_auth_importable_sample_path env: - web3_unity_imported_sample_path: "${{ github.workspace }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/" - web3_unity_importable_sample_path: "${{ github.workspace }}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - web3_auth_imported_sample_path: "${{ github.workspace }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/" - web3_auth_importable_sample_path: "${{ github.workspace }}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" + web3_unity_imported_sample_path: "src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/" + web3_unity_importable_sample_path: "Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" + web3_auth_imported_sample_path: "src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/" + web3_auth_importable_sample_path: "Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - name: Commit and Push run: | From 633e1e73610d084f264896e501593c3b26bf3c9c Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 10:48:32 +0300 Subject: [PATCH 113/167] echos updated --- scripts/duplicate-sample.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/duplicate-sample.sh b/scripts/duplicate-sample.sh index 9eb6147c5..cdc314e79 100644 --- a/scripts/duplicate-sample.sh +++ b/scripts/duplicate-sample.sh @@ -1,7 +1,7 @@ #! /usr/bin/env sh rm -rf "$2" -echo "$2 directory removed" +echo "'$2' directory removed" mkdir -p "$2" -echo "$2 directory created" +echo "'$2' directory created" cp -r "$1"* "$2" -echo "$1 contents copied into $2" \ No newline at end of file +echo "'$1' contents copied into '$2'" \ No newline at end of file From 87cbffc28bae2aaaf9b6748a466020841988cfa8 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 10:50:14 +0300 Subject: [PATCH 114/167] removed echos and adding web3auth samples --- .github/workflows/duplicate_samples.yml | 1 - scripts/duplicate-sample.sh | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index f2bbe4c28..ffad0a297 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -26,7 +26,6 @@ jobs: git config user.email $git_email git config user.name "${{ github.actor }}" git add Packages/io.chainsafe.web3-unity/Samples~/. -f - git add Packages/io.chainsafe.web3-unity.web3auth/Samples~/. -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: diff --git a/scripts/duplicate-sample.sh b/scripts/duplicate-sample.sh index cdc314e79..313dec72d 100644 --- a/scripts/duplicate-sample.sh +++ b/scripts/duplicate-sample.sh @@ -1,7 +1,4 @@ #! /usr/bin/env sh rm -rf "$2" -echo "'$2' directory removed" mkdir -p "$2" -echo "'$2' directory created" -cp -r "$1"* "$2" -echo "'$1' contents copied into '$2'" \ No newline at end of file +cp -r "$1"* "$2" \ No newline at end of file From 007716c0cc5be47cab21276719f205b3587c9677 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 11:11:37 +0300 Subject: [PATCH 115/167] small path updates --- .github/workflows/duplicate_samples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index ffad0a297..033efbabe 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -25,7 +25,7 @@ jobs: run: | git config user.email $git_email git config user.name "${{ github.actor }}" - git add Packages/io.chainsafe.web3-unity/Samples~/. -f + git add ./Packages/io.chainsafe.web3-unity/Samples~/. -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From 62d346e29d895e31a497f67f59210531462f8414 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 11:15:54 +0300 Subject: [PATCH 116/167] updated paths --- .github/workflows/duplicate_samples.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 033efbabe..b4eadbcde 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -16,10 +16,10 @@ jobs: scripts/duplicate-sample.sh $web3_unity_imported_sample_path $web3_unity_importable_sample_path scripts/duplicate-sample.sh $web3_auth_imported_sample_path $web3_auth_importable_sample_path env: - web3_unity_imported_sample_path: "src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/" - web3_unity_importable_sample_path: "Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - web3_auth_imported_sample_path: "src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/" - web3_auth_importable_sample_path: "Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" + web3_unity_imported_sample_path: "${{ github.workspace }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/" + web3_unity_importable_sample_path: "${{ github.workspace }}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" + web3_auth_imported_sample_path: "${{ github.workspace }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/" + web3_auth_importable_sample_path: "${{ github.workspace }}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - name: Commit and Push run: | From d4a44ee39af3689431acbb018571d5ba6a911589 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 11:24:06 +0300 Subject: [PATCH 117/167] reverted back to old implementation with variable version support and samples duplicate --- .github/workflows/duplicate_samples.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index b4eadbcde..193f30174 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -12,12 +12,11 @@ jobs: - uses: actions/checkout@v4 - name: Run duplicate script file run: | - chmod +x scripts/duplicate-sample.sh - scripts/duplicate-sample.sh $web3_unity_imported_sample_path $web3_unity_importable_sample_path - scripts/duplicate-sample.sh $web3_auth_imported_sample_path $web3_auth_importable_sample_path + export SOURCE_DIRECTORY="${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/" + export DESTINATION_DIRECTORY="${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" + rm -rf "$DESTINATION_DIRECTORY" + cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" env: - web3_unity_imported_sample_path: "${{ github.workspace }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/" - web3_unity_importable_sample_path: "${{ github.workspace }}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" web3_auth_imported_sample_path: "${{ github.workspace }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/" web3_auth_importable_sample_path: "${{ github.workspace }}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" From ddcd102105ef1bf59d7d3b67a378d76e3cb78e6b Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 11:25:25 +0300 Subject: [PATCH 118/167] path issue fix --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 193f30174..5dad873e5 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -12,12 +12,12 @@ jobs: - uses: actions/checkout@v4 - name: Run duplicate script file run: | - export SOURCE_DIRECTORY="${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)Web3.Unity Samples/" + export SOURCE_DIRECTORY="${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)/Web3.Unity Samples/" export DESTINATION_DIRECTORY="${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" rm -rf "$DESTINATION_DIRECTORY" cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" env: - web3_auth_imported_sample_path: "${{ github.workspace }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)Web3.Unity Web3Auth Samples/" + web3_auth_imported_sample_path: "${{ github.workspace }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)/Web3.Unity Web3Auth Samples/" web3_auth_importable_sample_path: "${{ github.workspace }}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - name: Commit and Push From b83b44ba55be2e9919e3efd3479f9bdbcf23a982 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 11:30:52 +0300 Subject: [PATCH 119/167] web3 auth duplication added --- .github/workflows/duplicate_samples.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 5dad873e5..0e6a9a613 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -10,21 +10,24 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Run duplicate script file + - name: Duplicate Web3 Unity Samples run: | export SOURCE_DIRECTORY="${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)/Web3.Unity Samples/" export DESTINATION_DIRECTORY="${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" rm -rf "$DESTINATION_DIRECTORY" cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" - env: - web3_auth_imported_sample_path: "${{ github.workspace }}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)/Web3.Unity Web3Auth Samples/" - web3_auth_importable_sample_path: "${{ github.workspace }}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - + - name: Duplicate Web3 Auth Samples + run: | + export SOURCE_DIRECTORY="${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)/Web3.Unity Web3Auth Samples/" + export DESTINATION_DIRECTORY="${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" + rm -rf "$DESTINATION_DIRECTORY" + cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" - name: Commit and Push run: | git config user.email $git_email git config user.name "${{ github.actor }}" git add ./Packages/io.chainsafe.web3-unity/Samples~/. -f + git add ./Packages/io.chainsafe.web3-unity.web3auth/Samples~/. -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From d81e745575d9099ecd057adfdc4ae62804be8a34 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 11:32:24 +0300 Subject: [PATCH 120/167] check and create directory --- .github/workflows/duplicate_samples.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 0e6a9a613..04f0e1734 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -15,12 +15,14 @@ jobs: export SOURCE_DIRECTORY="${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)/Web3.Unity Samples/" export DESTINATION_DIRECTORY="${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" rm -rf "$DESTINATION_DIRECTORY" + mkdir -p "$DESTINATION_DIRECTORY" cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" - name: Duplicate Web3 Auth Samples run: | export SOURCE_DIRECTORY="${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)/Web3.Unity Web3Auth Samples/" export DESTINATION_DIRECTORY="${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" rm -rf "$DESTINATION_DIRECTORY" + mkdir -p "$DESTINATION_DIRECTORY" cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" - name: Commit and Push run: | From 435cb7c388fd92ead0aaa4834c58d9a8d520820a Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 12:19:08 +0300 Subject: [PATCH 121/167] polished CI action and removed duplicate-sample.sh --- .github/workflows/duplicate_samples.yml | 4 ++-- scripts/duplicate-sample.sh | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 scripts/duplicate-sample.sh diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 04f0e1734..12db9274c 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -1,8 +1,8 @@ name: Duplicate Package Samples Workflow on: - push: - branches: [ rob/samples-import-fixes-642 ] + pull_request: + branches: [ main ] jobs: duplicate: diff --git a/scripts/duplicate-sample.sh b/scripts/duplicate-sample.sh deleted file mode 100644 index 313dec72d..000000000 --- a/scripts/duplicate-sample.sh +++ /dev/null @@ -1,4 +0,0 @@ -#! /usr/bin/env sh -rm -rf "$2" -mkdir -p "$2" -cp -r "$1"* "$2" \ No newline at end of file From d3fe8a07b50f91cdd245584839d5cbc3d98571f9 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 14:04:14 +0300 Subject: [PATCH 122/167] Changes Made - Added Scene Indexer for Web3 Auth and refactored SceneIndexer - Tested Login with Existing Wallet --- .../Runtime/Scripts/Web3Accessor.cs | 3 +- .../Scripts/Utilities.meta | 8 +++ .../Scripts/Utilities/Web3AuthSceneIndexer.cs | 20 ++++++ .../Utilities/Web3AuthSceneIndexer.cs.meta | 11 +++ .../Scripts/Prefabs/Logout.cs | 2 +- .../Scripts/Scenes/Login.cs | 8 ++- .../Scenes/SampleNftTexture/LoadScene.cs | 4 +- .../Scripts/Utilities/SceneIndexer.cs | 70 ++++++++++++------- .../ProjectSettings/EditorBuildSettings.asset | 7 +- 9 files changed, 98 insertions(+), 35 deletions(-) create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities.meta create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities/Web3AuthSceneIndexer.cs create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities/Web3AuthSceneIndexer.cs.meta diff --git a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs index 9de9813a7..97474d063 100644 --- a/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs +++ b/Packages/io.chainsafe.web3-unity/Runtime/Scripts/Web3Accessor.cs @@ -20,7 +20,8 @@ static Web3Accessor Instance // Instead, we refuse to create an instance if the editor is // currently running in any other scene and load the first scene // instead. - if (SceneManager.GetActiveScene().buildIndex != 0) + //TODO replace indexes with Login.LoginSceneIndex + if (SceneManager.GetActiveScene().buildIndex > 1) { SceneManager.LoadScene(0); // Throw exception to prevent rest of code from running diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities.meta new file mode 100644 index 000000000..3ec680a81 --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d1132bb018bb0b141a97e58bfad0dba6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities/Web3AuthSceneIndexer.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities/Web3AuthSceneIndexer.cs new file mode 100644 index 000000000..c7789999a --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities/Web3AuthSceneIndexer.cs @@ -0,0 +1,20 @@ +#if UNITY_EDITOR +using UnityEditor; + +[InitializeOnLoad] +public static class Web3AuthSceneIndexer +{ + private const string ScenesIndexedKey = PackageName + "ScenesIndexed"; + + private const string PackageName = "io.chainsafe.web3-unity.web3auth"; + + static Web3AuthSceneIndexer() + { + SceneIndexer.TryAddEditorBuildSettingsScenes(PackageName, ScenesIndexedKey, new string[] + { + "SampleLogin - Web3Auth.Unity", + }); + } +} + +#endif \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities/Web3AuthSceneIndexer.cs.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities/Web3AuthSceneIndexer.cs.meta new file mode 100644 index 000000000..50f8761b4 --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities/Web3AuthSceneIndexer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 74c0e58ffe715a448a1d221b425d7352 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs index fec9c9a76..222f7a402 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Prefabs/Logout.cs @@ -19,6 +19,6 @@ public async void OnLogout() Web3Accessor.Clear(); // Go back to the first scene to log in again - SceneManager.LoadScene(0); + SceneManager.LoadScene(Login.LoginSceneIndex); } } diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index 48c1aee4f..32801c9d9 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -15,6 +15,10 @@ namespace Scenes { public abstract class Login : MonoBehaviour { + public const string MainSceneName = "SampleMain"; + + public static int LoginSceneIndex = 0; + public string GelatoApiKey = ""; public ErrorPopup ErrorPopup; @@ -49,8 +53,10 @@ protected async Task TryLogin() } Web3Accessor.Set(web3); + + LoginSceneIndex = SceneManager.GetActiveScene().buildIndex; - SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1); + SceneManager.LoadScene(MainSceneName); } private void ConfigureCommonServices(IWeb3ServiceCollection services) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/SampleNftTexture/LoadScene.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/SampleNftTexture/LoadScene.cs index 45bafdda0..fd1b1b79c 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/SampleNftTexture/LoadScene.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/SampleNftTexture/LoadScene.cs @@ -5,11 +5,9 @@ namespace Scenes.SampleNftTexture { public class LoadScene : MonoBehaviour { - public string SceneName = "SampleMain"; - public void Load() { - SceneManager.LoadScene(SceneName); + SceneManager.LoadScene(Login.LoginSceneIndex); } } } \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/SceneIndexer.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/SceneIndexer.cs index 8b36dab4b..5d4d54f43 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/SceneIndexer.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/SceneIndexer.cs @@ -1,27 +1,60 @@ #if UNITY_EDITOR +using System; using System.IO; using System.Linq; +using Scenes; using UnityEditor; using UnityEditor.PackageManager; using UnityEditor.PackageManager.UI; -using UnityEngine; using PackageInfo = UnityEditor.PackageManager.PackageInfo; [InitializeOnLoad] public static class SceneIndexer { - private const string ScenesIndexedKey = "ScenesIndexed"; + private const string ScenesIndexedKey = PackageName + "ScenesIndexed"; private const string PackageName = "io.chainsafe.web3-unity"; static SceneIndexer() { - if (SessionState.GetBool(ScenesIndexedKey, false)) + TryAddEditorBuildSettingsScenes(PackageName, ScenesIndexedKey, new string[] { + "SampleLogin.Unity", + $"{Login.MainSceneName}.Unity", + "SampleImportNftTexture.Unity", + }); + } + + public static void TryAddEditorBuildSettingsScenes(string packageName, string sessionKey, string[] scenes) + { + if (SessionState.GetBool(sessionKey, false)) + { + return; + } + + PackageInfo package = GetPackage(packageName); + + string importPath = GetImportPath(package); + + //scenes already added to build settings + if (EditorBuildSettings.scenes.Any(s => Path.GetFullPath(s.path).Contains(importPath))) + { + SessionState.SetBool(sessionKey, true); + return; } + // convert and add importPath to scenes path + EditorBuildSettingsScene[] editorBuildSettingsScenes = Array.ConvertAll(scenes, s => new EditorBuildSettingsScene(Path.Combine(importPath, s), true)); + + EditorBuildSettings.scenes = editorBuildSettingsScenes.Concat(EditorBuildSettings.scenes).ToArray(); + + SessionState.SetBool(sessionKey, true); + } + + private static PackageInfo GetPackage(string name) + { var listRequest = Client.List(); while (!listRequest.IsCompleted) @@ -31,38 +64,23 @@ static SceneIndexer() PackageInfo[] packages = listRequest.Result.ToArray(); - PackageInfo package = packages.FirstOrDefault(p => p.name == PackageName); + PackageInfo package = packages.FirstOrDefault(p => p.name == name); if (package == null) { - Debug.LogError($"Installed Package {PackageName} not found"); - - return; + throw new Exception($"Installed Package {name} not found"); } + + return package; + } + private static string GetImportPath(PackageInfo package) + { Sample sample = Sample.FindByPackage(package.name, package.version).FirstOrDefault(); string importPath = Path.GetRelativePath(Directory.GetCurrentDirectory(), sample.importPath); - importPath = Path.Combine(importPath, "Scenes"); - - //scenes already added to build settings - if (EditorBuildSettings.scenes.Any(s => Path.GetFullPath(s.path).Contains(importPath))) - { - SessionState.SetBool(ScenesIndexedKey, true); - - return; - } - - EditorBuildSettings.scenes = new EditorBuildSettingsScene[] - { - new EditorBuildSettingsScene(Path.Combine(importPath, "SampleLogin.Unity"), true), - new EditorBuildSettingsScene(Path.Combine(importPath, "SampleMain.Unity"), true), - new EditorBuildSettingsScene(Path.Combine(importPath, "SampleImportNftTexture.Unity"), true), - }.Concat(EditorBuildSettings.scenes) - .ToArray(); - - SessionState.SetBool(ScenesIndexedKey, true); + return Path.Combine(importPath, "Scenes"); } } diff --git a/src/UnitySampleProject/ProjectSettings/EditorBuildSettings.asset b/src/UnitySampleProject/ProjectSettings/EditorBuildSettings.asset index de9264762..91cd1152f 100644 --- a/src/UnitySampleProject/ProjectSettings/EditorBuildSettings.asset +++ b/src/UnitySampleProject/ProjectSettings/EditorBuildSettings.asset @@ -5,6 +5,10 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: + - enabled: 1 + path: Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin + - Web3Auth.Unity + guid: a8a8b501e594874448546e904e2437c5 - enabled: 1 path: Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity guid: 1c1af5c5662d105498b2412267dde0df @@ -14,7 +18,4 @@ EditorBuildSettings: - enabled: 1 path: Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleImportNftTexture.unity guid: d31091c4b9c13af48af91512a5127882 - - enabled: 1 - path: Assets/Samples/web3.unity SDK/2.5.0/LootBoxes/LootBoxes.unity - guid: ec1bcdf05dc7d7341b133771363aa188 m_configObjects: {} From a464bfbc769a29a84c6e833cbda4507c0cc47f64 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 24 Oct 2023 14:17:01 +0300 Subject: [PATCH 123/167] Updated web3auth values --- .../Scenes/SampleLogin - Web3Auth.unity | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity index 646ad6416..de28744a2 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity @@ -998,9 +998,9 @@ MonoBehaviour: GelatoApiKey: _UzPz_Yk_WTjWMfcl45fLvQNGQ9ISx5ZE8TnwnVKYrE_ ErrorPopup: {fileID: 337558421} web3AuthSettings: - ClientId: - RedirectUri: - Network: 0 + ClientId: BCc0wTmuXureEzgawhUSZOWu4bgWo56sZPrxLiHQCpg5OHcNrfa44esdTS8Dm77VtmaIyjhbthdWfbLhSwf7jtU + RedirectUri: torusapp://io.chainsafe.gamingsdk.sdkdemoscene/auth + Network: 1 providerAndButtonPairs: - Button: {fileID: 7400892926620024700} Provider: 0 From ae1c380536ff365aa53fbc9d069c1b2adb19cc8f Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Wed, 25 Oct 2023 11:29:42 +0300 Subject: [PATCH 124/167] refactor and cleanup --- .../Scenes/SampleLogin - Web3Auth.unity | 39 +++- .../Scripts/Utilities/Web3AuthSceneIndexer.cs | 3 + .../Scripts/Web3AuthLogin.cs | 42 ++--- .../Scenes/SampleLogin.unity | 34 ++-- .../Scripts/Scenes/ExistingWalletLogin.cs | 169 +++++++++--------- .../Scripts/Scenes/Login.cs | 14 +- .../Scripts/Utilities/PlayerData.cs | 22 +++ 7 files changed, 191 insertions(+), 132 deletions(-) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity index de28744a2..b7397b352 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scenes/SampleLogin - Web3Auth.unity @@ -995,12 +995,11 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 7b6902e441950fa4bb5cefdd2263164a, type: 3} m_Name: m_EditorClassIdentifier: - GelatoApiKey: _UzPz_Yk_WTjWMfcl45fLvQNGQ9ISx5ZE8TnwnVKYrE_ - ErrorPopup: {fileID: 337558421} - web3AuthSettings: - ClientId: BCc0wTmuXureEzgawhUSZOWu4bgWo56sZPrxLiHQCpg5OHcNrfa44esdTS8Dm77VtmaIyjhbthdWfbLhSwf7jtU - RedirectUri: torusapp://io.chainsafe.gamingsdk.sdkdemoscene/auth - Network: 1 + gelatoApiKey: _UzPz_Yk_WTjWMfcl45fLvQNGQ9ISx5ZE8TnwnVKYrE_ + errorPopup: {fileID: 337558421} + clientId: BCc0wTmuXureEzgawhUSZOWu4bgWo56sZPrxLiHQCpg5OHcNrfa44esdTS8Dm77VtmaIyjhbthdWfbLhSwf7jtU + redirectUri: torusapp://io.chainsafe.gamingsdk.sdkdemoscene/auth + network: 1 providerAndButtonPairs: - Button: {fileID: 7400892926620024700} Provider: 0 @@ -2188,6 +2187,34 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.size + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 1679801100} + - target: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: set_tag + objectReference: {fileID: 0} + - target: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: UnityEngine.Component, UnityEngine + objectReference: {fileID: 0} + - target: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_Name value: Button - Google diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities/Web3AuthSceneIndexer.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities/Web3AuthSceneIndexer.cs index c7789999a..ceb55fd50 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities/Web3AuthSceneIndexer.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Utilities/Web3AuthSceneIndexer.cs @@ -1,6 +1,9 @@ #if UNITY_EDITOR using UnityEditor; +/// +/// Add Web3.Unity Web3Auth package sample scenes to Build Settings Scenes +/// [InitializeOnLoad] public static class Web3AuthSceneIndexer { diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs index cfc3a791a..9aae69268 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs @@ -1,7 +1,6 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Threading.Tasks; using ChainSafe.Gaming.Web3.Build; using ChainSafe.GamingSdk.Web3Auth; using Scenes; @@ -9,8 +8,15 @@ using UnityEngine.UI; using Network = Web3Auth.Network; +/// +/// Login using Web3Auth. +/// public class Web3AuthLogin : Login { + /// + /// Struct used for pairing login buttons to Web3 auth providers. + /// Used when adding as listeners to the buttons. + /// [Serializable] public struct ProviderAndButtonPair { @@ -18,17 +24,14 @@ public struct ProviderAndButtonPair public Provider Provider; } - [Serializable] - public struct Web3AuthSettings - { - public string ClientId; - public string RedirectUri; - public Network Network; - } + [Header("Web3 Auth")] + [SerializeField] private string clientId; + [SerializeField] private string redirectUri; + [SerializeField] private Network network; - [SerializeField] private Web3AuthSettings web3AuthSettings; + [Header("UI")] [SerializeField] private List providerAndButtonPairs; - + private bool useProvider; private Provider selectedProvider; @@ -44,15 +47,12 @@ protected override IEnumerator Initialize() yield return new WaitUntil(() => loginTask.IsCompleted); #endif - //add listener - foreach (var pair in providerAndButtonPairs) + // add provider buttons listeners + providerAndButtonPairs.ForEach(p => p.Button.onClick.AddListener(delegate { - pair.Button.onClick.AddListener(() => - { - LoginWithWeb3Auth(pair.Provider); - }); - } - + LoginWithWeb3Auth(p.Provider); + })); + yield return null; } @@ -76,9 +76,9 @@ protected override Web3Builder ConfigureWeb3Services(Web3Builder web3Builder) { Web3AuthOptions = new() { - clientId = web3AuthSettings.ClientId, - redirectUrl = new Uri(web3AuthSettings.RedirectUri), - network = web3AuthSettings.Network, + clientId = clientId, + redirectUrl = new Uri(redirectUri), + network = network, whiteLabel = new() { dark = true, diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity index d2e7f461d..0f766adb4 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scenes/SampleLogin.unity @@ -695,7 +695,7 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 20.75 + m_fontSize: 40 m_fontSizeBase: 48 m_fontWeight: 400 m_enableAutoSizing: 1 @@ -1622,10 +1622,10 @@ RectTransform: m_Father: {fileID: 654334440} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 150, y: -80} - m_SizeDelta: {x: 300, y: 50} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &724612376 MonoBehaviour: @@ -1909,7 +1909,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_AnchorMin.x @@ -1917,15 +1917,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_SizeDelta.x - value: 300 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_SizeDelta.y - value: 50 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_LocalPosition.x @@ -1957,11 +1957,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_AnchoredPosition.x - value: 150 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_AnchoredPosition.y - value: -25 + value: 0 objectReference: {fileID: 0} - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2445,10 +2445,10 @@ RectTransform: m_Father: {fileID: 654334440} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 150, y: -135} - m_SizeDelta: {x: 300, y: 50} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &981405683 MonoBehaviour: @@ -2675,8 +2675,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 96894e49d9863ec4db1d93a5e56f19cb, type: 3} m_Name: m_EditorClassIdentifier: - GelatoApiKey: _UzPz_Yk_WTjWMfcl45fLvQNGQ9ISx5ZE8TnwnVKYrE_ - ErrorPopup: {fileID: 1701305868} + gelatoApiKey: _UzPz_Yk_WTjWMfcl45fLvQNGQ9ISx5ZE8TnwnVKYrE_ + errorPopup: {fileID: 1701305868} supportedWalletsDropdown: {fileID: 540464236} redirectToWalletToggle: {fileID: 981405684} loginButton: {fileID: 787012150} diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/ExistingWalletLogin.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/ExistingWalletLogin.cs index 31d2f9960..77b815c54 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/ExistingWalletLogin.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/ExistingWalletLogin.cs @@ -19,41 +19,42 @@ using WalletConnectSharp.Sign.Models; using WalletConnectSharp.Sign.Models.Engine; +/// +/// Login using an existing wallet using Wallet Connect. +/// public class ExistingWalletLogin : Login { - [Header("UI")] - - [SerializeField] private TMP_Dropdown supportedWalletsDropdown; - + [Header("UI")] [SerializeField] private TMP_Dropdown supportedWalletsDropdown; + [SerializeField] private Toggle redirectToWalletToggle; - + [SerializeField] public Button loginButton; - - [SerializeField] private Toggle rememberMeToggle; - - [Header("Wallet Connect")] + [SerializeField] private Toggle rememberMeToggle; - [SerializeField] private string projectId; + [Header("Wallet Connect")] [SerializeField] + private string projectId; [SerializeField] public string projectName; [SerializeField] public string baseContext; [SerializeField] private Metadata metadata; - + [SerializeField] private WalletConnectModal walletConnectModal; - + + // user isn't required to select wallet to redirect to wallet + // this is true for android platform since it natively supports WC protocol private bool isRedirectionWalletAgnostic = false; - + private bool autoLogin; - + private bool redirectToWallet; - + private Dictionary supportedWallets; - + private WalletConnectConfig walletConnectConfig; - + private void OnDestroy() { if (walletConnectConfig != null) @@ -63,7 +64,7 @@ private void OnDestroy() walletConnectConfig.OnSessionApproved -= SessionApproved; } } - + protected override IEnumerator Initialize() { Assert.IsNotNull(loginButton); @@ -73,18 +74,20 @@ protected override IEnumerator Initialize() if (!Application.isEditor) { + // user doesn't need to select wallet before login for redirection since Android supports the WC protocol isRedirectionWalletAgnostic = true; } - + #endif if (!isRedirectionWalletAgnostic) { yield return InitializeWalletSelection(); } - + + // try auto login first var autoLoginTask = TryAutoLogin(); - + yield return new WaitUntil(() => autoLoginTask.IsCompleted); loginButton.onClick.AddListener(LoginClicked); @@ -94,13 +97,16 @@ private async void LoginClicked() { await TryLogin(); } - + protected override Web3Builder ConfigureWeb3Services(Web3Builder web3Builder) { return web3Builder.Configure(services => { - services - .UseWalletConnect(BuildWalletConnectConfig()) + // Build config to use. + BuildWalletConnectConfig(); + + // Use wallet connect providers + services.UseWalletConnect(walletConnectConfig) .UseWalletConnectSigner() .UseWalletConnectTransactionExecutor(); }); @@ -108,19 +114,21 @@ protected override Web3Builder ConfigureWeb3Services(Web3Builder web3Builder) private async Task TryAutoLogin() { + // get saved config from Player Data walletConnectConfig = PlayerData.Instance.WalletConnectConfig; - + + // should be null if config was never saved/cleared if (walletConnectConfig == null) { return; } Debug.Log("Attempting to Auto Login..."); - + try { autoLogin = true; - + await TryLogin(); } catch (Exception e) @@ -130,7 +138,7 @@ private async Task TryAutoLogin() autoLogin = false; } } - + // add all supported wallets private IEnumerator InitializeWalletSelection() { @@ -139,56 +147,55 @@ private IEnumerator InitializeWalletSelection() List supportedWalletNames = supportedWallets.Values.Select(w => w.Name).ToList(); supportedWalletsDropdown.AddOptions(supportedWalletNames); - + + // user is only required to select wallet if redirect to wallet toggle is on redirectToWalletToggle.onValueChanged.AddListener(supportedWalletsDropdown.gameObject.SetActive); } - - private WalletConnectConfig BuildWalletConnectConfig() - { - // build chain - var projectConfig = ProjectConfigUtilities.Load(); - ChainModel chain = new ChainModel(ChainModel.EvmNamespace, projectConfig.ChainId, projectConfig.Network); - - WalletConnectWalletModel defaultWallet = null; + private void BuildWalletConnectConfig() + { + // build chain + var projectConfig = ProjectConfigUtilities.Load(); - // if it's an auto login get these values from saved wallet config - if (!autoLogin) - { - // allow redirection on editor for testing UI flow - redirectToWallet = redirectToWalletToggle.isOn; - - // needs wallet selected to redirect - if (redirectToWallet && !isRedirectionWalletAgnostic) - { - defaultWallet = supportedWallets.Values.ToArray()[supportedWalletsDropdown.value]; - } - } + ChainModel chain = new ChainModel(ChainModel.EvmNamespace, projectConfig.ChainId, projectConfig.Network); - var config = new WalletConnectConfig - { - ProjectId = projectId, - ProjectName = projectName, - BaseContext = baseContext, - Chain = chain, - Metadata = metadata, - SavedSessionTopic = autoLogin ? walletConnectConfig.SavedSessionTopic : null, - SupportedWallets = supportedWallets, - StoragePath = Application.persistentDataPath, - RedirectToWallet = autoLogin ? walletConnectConfig.RedirectToWallet : redirectToWallet, - KeepSessionAlive = autoLogin || rememberMeToggle.isOn, - DefaultWallet = autoLogin ? walletConnectConfig.DefaultWallet : defaultWallet, - }; - - walletConnectConfig = config; - - walletConnectConfig.OnConnected += WalletConnected; + WalletConnectWalletModel defaultWallet = null; - walletConnectConfig.OnSessionApproved += SessionApproved; - - return config; + // allow redirection on editor for testing UI flow + redirectToWallet = autoLogin ? + // if it's an auto login get value from saved wallet config + walletConnectConfig.RedirectToWallet : redirectToWalletToggle.isOn; + + // needs wallet selected to redirect + if (redirectToWallet && !isRedirectionWalletAgnostic) + { + defaultWallet = autoLogin ? + // if it's an auto login get value from saved wallet config + walletConnectConfig.DefaultWallet : supportedWallets.Values.ToArray()[supportedWalletsDropdown.value]; } - + + walletConnectConfig = new WalletConnectConfig + { + ProjectId = projectId, + ProjectName = projectName, + BaseContext = baseContext, + Chain = chain, + Metadata = metadata, + // try and get saved value + SavedSessionTopic = walletConnectConfig?.SavedSessionTopic, + SupportedWallets = supportedWallets, + StoragePath = Application.persistentDataPath, + RedirectToWallet = redirectToWallet, + KeepSessionAlive = autoLogin || rememberMeToggle.isOn, + DefaultWallet = defaultWallet, + }; + + //subscribe to WC events + walletConnectConfig.OnConnected += WalletConnected; + + walletConnectConfig.OnSessionApproved += SessionApproved; + } + private IEnumerator FetchSupportedWallets() { using (UnityWebRequest webRequest = UnityWebRequest.Get("https://registry.walletconnect.org/data/wallets.json")) @@ -199,22 +206,22 @@ private IEnumerator FetchSupportedWallets() if (webRequest.result != UnityWebRequest.Result.Success) { Debug.LogError("Error Getting Supported Wallets: " + webRequest.error); - + yield return null; } - + else { var json = webRequest.downloadHandler.text; supportedWallets = JsonConvert.DeserializeObject>(json) - .ToDictionary(w => w.Key, w => (WalletConnectWalletModel) w.Value); + .ToDictionary(w => w.Key, w => (WalletConnectWalletModel)w.Value); Debug.Log($"Fetched {supportedWallets.Count} Supported Wallets."); } } } - + private void WalletConnected(ConnectedData data) { // already redirecting to wallet @@ -230,16 +237,16 @@ private void WalletConnected(ConnectedData data) walletConnectModal.WalletConnected(data); } } - + private void SessionApproved(SessionStruct session) { // save/persist session if (walletConnectConfig.KeepSessionAlive) { walletConnectConfig.SavedSessionTopic = session.Topic; - + PlayerData.Instance.WalletConnectConfig = walletConnectConfig; - + PlayerData.Save(); } @@ -247,10 +254,10 @@ private void SessionApproved(SessionStruct session) { // reset if any saved config PlayerData.Instance.WalletConnectConfig = null; - + PlayerData.Save(); } - + Debug.Log($"{session.Topic} Approved"); } -} +} \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs index 32801c9d9..94370b03e 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/Login.cs @@ -16,12 +16,12 @@ namespace Scenes public abstract class Login : MonoBehaviour { public const string MainSceneName = "SampleMain"; - - public static int LoginSceneIndex = 0; - - public string GelatoApiKey = ""; - public ErrorPopup ErrorPopup; + public static int LoginSceneIndex { get; private set; } = 0; + + [SerializeField] private string gelatoApiKey = ""; + + [SerializeField] private ErrorPopup errorPopup; private IEnumerator Start() { @@ -48,7 +48,7 @@ protected async Task TryLogin() catch (Exception) { - ErrorPopup.ShowError("Login failed, please try again\n(see console for more details)"); + errorPopup.ShowError("Login failed, please try again\n(see console for more details)"); throw; } @@ -63,7 +63,7 @@ private void ConfigureCommonServices(IWeb3ServiceCollection services) { services .UseUnityEnvironment() - .UseGelato(GelatoApiKey) + .UseGelato(gelatoApiKey) .UseRpcProvider(); /* As many contracts as needed may be registered here. diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/PlayerData.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/PlayerData.cs index 7a0439e85..c9abc92ab 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/PlayerData.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Utilities/PlayerData.cs @@ -5,6 +5,10 @@ using Newtonsoft.Json; using UnityEngine; +/// +/// Player Data that can be persisted through runtime and sessions in a PlayerData.json file. +/// +/// Only serialize(Save and Load) fields and properties with the [JsonProperty] attribute. [JsonObject(MemberSerialization.OptIn)] public class PlayerData { @@ -12,10 +16,16 @@ public class PlayerData private static string _path = $"{Path.Combine(Application.persistentDataPath, nameof(PlayerData))}.json"; + /// + /// Singleton instance. + /// public static PlayerData Instance { get; private set; } = new PlayerData(); private bool FileExists => File.Exists(_path); + /// + /// Loads Data when runtime starts. + /// [RuntimeInitializeOnLoadMethod] public static void LoadOnStart() { @@ -54,16 +64,25 @@ private void SaveData() } } + /// + /// Save/Persist data in . + /// public static void Save() { Instance.SaveData(); } + /// + /// Load saved/persisted data into + /// public static void Load() { Instance.LoadData(); } + /// + /// Clear all data. + /// public static void Clear() { Instance = new PlayerData(); @@ -73,5 +92,8 @@ public static void Clear() #endregion + /// + /// Saved Wallet Connect Config used for restoring session (Remember Me) Implementation. + /// [JsonProperty] public WalletConnectConfig WalletConnectConfig { get; set; } } From 984fe59a9a2e3b42539356c631156833bc93fd15 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Wed, 25 Oct 2023 12:43:41 +0300 Subject: [PATCH 125/167] testing CI refactor into loop --- .github/workflows/duplicate_samples.yml | 29 +++++++++++++------------ 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 12db9274c..1a0895f65 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -1,8 +1,8 @@ name: Duplicate Package Samples Workflow on: - pull_request: - branches: [ main ] + push: + branches: [ rob/samples-import-fixes-642 ] jobs: duplicate: @@ -12,18 +12,19 @@ jobs: - uses: actions/checkout@v4 - name: Duplicate Web3 Unity Samples run: | - export SOURCE_DIRECTORY="${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)/Web3.Unity Samples/" - export DESTINATION_DIRECTORY="${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - rm -rf "$DESTINATION_DIRECTORY" - mkdir -p "$DESTINATION_DIRECTORY" - cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" - - name: Duplicate Web3 Auth Samples - run: | - export SOURCE_DIRECTORY="${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)/Web3.Unity Web3Auth Samples/" - export DESTINATION_DIRECTORY="${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - rm -rf "$DESTINATION_DIRECTORY" - mkdir -p "$DESTINATION_DIRECTORY" - cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" + for i in 1 2 + do + export SOURCE_DIRECTORY=${importable_sample_path_${i}} + export DESTINATION_DIRECTORY=${imported_sample_path_${i}} + rm -rf "$DESTINATION_DIRECTORY" + mkdir -p "$DESTINATION_DIRECTORY" + cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" + done + env: + importable_sample_path_1: "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)/Web3.Unity Samples/" + imported_sample_path_1: "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" + importable_sample_path_2: "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)/Web3.Unity Web3Auth Samples/" + imported_sample_path_2: "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - name: Commit and Push run: | git config user.email $git_email From 674a5aa655f94bb454fd481a819549b5c364cebc Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Wed, 25 Oct 2023 12:46:18 +0300 Subject: [PATCH 126/167] path substitution fix --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 1a0895f65..c54523be3 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -14,8 +14,8 @@ jobs: run: | for i in 1 2 do - export SOURCE_DIRECTORY=${importable_sample_path_${i}} - export DESTINATION_DIRECTORY=${imported_sample_path_${i}} + export SOURCE_DIRECTORY=${importable_sample_path_$i} + export DESTINATION_DIRECTORY=${imported_sample_path_$i} rm -rf "$DESTINATION_DIRECTORY" mkdir -p "$DESTINATION_DIRECTORY" cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" From 7c053b108edc34bafbc51f2b462be135c8c5001f Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Wed, 25 Oct 2023 12:47:31 +0300 Subject: [PATCH 127/167] path substitution fix --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index c54523be3..cea441c3a 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -14,8 +14,8 @@ jobs: run: | for i in 1 2 do - export SOURCE_DIRECTORY=${importable_sample_path_$i} - export DESTINATION_DIRECTORY=${imported_sample_path_$i} + export SOURCE_DIRECTORY=$importable_sample_path_$i + export DESTINATION_DIRECTORY=$imported_sample_path_$i rm -rf "$DESTINATION_DIRECTORY" mkdir -p "$DESTINATION_DIRECTORY" cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" From c5cfbbe2eb9e53cb19b33bcb8d70ac5d2e2e3b23 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Wed, 25 Oct 2023 12:49:39 +0300 Subject: [PATCH 128/167] added echos for debugging --- .github/workflows/duplicate_samples.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index cea441c3a..a7f71e49a 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -16,6 +16,9 @@ jobs: do export SOURCE_DIRECTORY=$importable_sample_path_$i export DESTINATION_DIRECTORY=$imported_sample_path_$i + echo SOURCE_DIRECTORY + echo DESTINATION_DIRECTORY + echo $($importable_sample_path_$i) rm -rf "$DESTINATION_DIRECTORY" mkdir -p "$DESTINATION_DIRECTORY" cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" From 419767d41aaee5e0acd8aab4d2e060b104bf67be Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Wed, 25 Oct 2023 12:50:55 +0300 Subject: [PATCH 129/167] added echos for debugging --- .github/workflows/duplicate_samples.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index a7f71e49a..d70ace8d5 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -16,9 +16,7 @@ jobs: do export SOURCE_DIRECTORY=$importable_sample_path_$i export DESTINATION_DIRECTORY=$imported_sample_path_$i - echo SOURCE_DIRECTORY - echo DESTINATION_DIRECTORY - echo $($importable_sample_path_$i) + echo "$SOURCE_DIRECTORY" rm -rf "$DESTINATION_DIRECTORY" mkdir -p "$DESTINATION_DIRECTORY" cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" From 0c02c7399da1f7885fe922c12fb42867779f82ef Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Wed, 25 Oct 2023 14:02:53 +0300 Subject: [PATCH 130/167] loop path fix --- .github/workflows/duplicate_samples.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index d70ace8d5..26a226bc3 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -14,9 +14,10 @@ jobs: run: | for i in 1 2 do - export SOURCE_DIRECTORY=$importable_sample_path_$i - export DESTINATION_DIRECTORY=$imported_sample_path_$i - echo "$SOURCE_DIRECTORY" + export SOURCE_DIRECTORY="importable_sample_path_$i" + SOURCE_DIRECTORY=${!SOURCE_DIRECTORY} + export DESTINATION_DIRECTORY="imported_sample_path_$i" + DESTINATION_DIRECTORY=${!DESTINATION_DIRECTORY} rm -rf "$DESTINATION_DIRECTORY" mkdir -p "$DESTINATION_DIRECTORY" cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" From 4733ab4b97dcf1a2ea47d21dcff2df4252cac8aa Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Wed, 25 Oct 2023 14:06:57 +0300 Subject: [PATCH 131/167] more path changes --- .github/workflows/duplicate_samples.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 26a226bc3..aa210c2a5 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -16,14 +16,18 @@ jobs: do export SOURCE_DIRECTORY="importable_sample_path_$i" SOURCE_DIRECTORY=${!SOURCE_DIRECTORY} + SOURCE_DIRECTORY="${GITHUB_WORKSPACE}/$SOURCE_DIRECTORY" + export DESTINATION_DIRECTORY="imported_sample_path_$i" DESTINATION_DIRECTORY=${!DESTINATION_DIRECTORY} + DESTINATION_DIRECTORY="${GITHUB_WORKSPACE}/$DESTINATION_DIRECTORY" + rm -rf "$DESTINATION_DIRECTORY" mkdir -p "$DESTINATION_DIRECTORY" cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" done env: - importable_sample_path_1: "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)/Web3.Unity Samples/" + importable_sample_path_1: "src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)/Web3.Unity Samples/" imported_sample_path_1: "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" importable_sample_path_2: "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)/Web3.Unity Web3Auth Samples/" imported_sample_path_2: "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" From d4ac78ecb89b6ba70169e42adcbd5f8f9caa7918 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Wed, 25 Oct 2023 14:16:24 +0300 Subject: [PATCH 132/167] more path updates, hopefully last --- .github/workflows/duplicate_samples.yml | 32 +++++++++++++++---------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index aa210c2a5..d86d08b10 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -14,23 +14,29 @@ jobs: run: | for i in 1 2 do - export SOURCE_DIRECTORY="importable_sample_path_$i" - SOURCE_DIRECTORY=${!SOURCE_DIRECTORY} - SOURCE_DIRECTORY="${GITHUB_WORKSPACE}/$SOURCE_DIRECTORY" - - export DESTINATION_DIRECTORY="imported_sample_path_$i" + export SOURCE_PATH="importable_sample_path_$i" + SOURCE_PATH=${!SOURCE_PATH} + + export DESTINATION_DIRECTORY="importable_sample_directory_$i" DESTINATION_DIRECTORY=${!DESTINATION_DIRECTORY} - DESTINATION_DIRECTORY="${GITHUB_WORKSPACE}/$DESTINATION_DIRECTORY" - rm -rf "$DESTINATION_DIRECTORY" - mkdir -p "$DESTINATION_DIRECTORY" - cp -r "$SOURCE_DIRECTORY" "$DESTINATION_DIRECTORY" + SOURCE_PATH="${GITHUB_WORKSPACE}/$SOURCE_PATH/$(ls $SOURCE_PATH | head -n 1)/$DESTINATION_DIRECTORY" + + export DESTINATION_PATH="imported_sample_path_$i" + DESTINATION_PATH=${!DESTINATION_PATH} + DESTINATION_PATH="${GITHUB_WORKSPACE}/$DESTINATION_PATH" + + rm -rf "$DESTINATION_PATH" + mkdir -p "$DESTINATION_PATH" + cp -r "$SOURCE_PATH" "$DESTINATION_PATH" done env: - importable_sample_path_1: "src/UnitySampleProject/Assets/Samples/web3.unity SDK/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK' | head -n 1)/Web3.Unity Samples/" - imported_sample_path_1: "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - importable_sample_path_2: "${GITHUB_WORKSPACE}/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/$(ls 'src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth' | head -n 1)/Web3.Unity Web3Auth Samples/" - imported_sample_path_2: "${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" + importable_sample_path_1: "src/UnitySampleProject/Assets/Samples/web3.unity SDK" + importable_sample_directory_1: "Web3.Unity Samples" + imported_sample_path_1: "Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" + importable_sample_path_2: "src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth" + importable_sample_directory_2: "Web3.Unity Web3Auth Samples" + imported_sample_path_2: "Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - name: Commit and Push run: | git config user.email $git_email From 4be05f1a4eecf74b42f3ba124ea64dd7c2f1164c Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Wed, 25 Oct 2023 14:17:33 +0300 Subject: [PATCH 133/167] even more path updates, gotta work now --- .github/workflows/duplicate_samples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index d86d08b10..4af472524 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -20,7 +20,7 @@ jobs: export DESTINATION_DIRECTORY="importable_sample_directory_$i" DESTINATION_DIRECTORY=${!DESTINATION_DIRECTORY} - SOURCE_PATH="${GITHUB_WORKSPACE}/$SOURCE_PATH/$(ls $SOURCE_PATH | head -n 1)/$DESTINATION_DIRECTORY" + SOURCE_PATH="${GITHUB_WORKSPACE}/$SOURCE_PATH/$(ls '$SOURCE_PATH' | head -n 1)/$DESTINATION_DIRECTORY" export DESTINATION_PATH="imported_sample_path_$i" DESTINATION_PATH=${!DESTINATION_PATH} From a9222a6c644a9ce6bd531d03e6d5803ecf8d7f61 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Wed, 25 Oct 2023 14:21:03 +0300 Subject: [PATCH 134/167] even more path updates, must work now --- .github/workflows/duplicate_samples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 4af472524..e92c761c4 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -20,7 +20,7 @@ jobs: export DESTINATION_DIRECTORY="importable_sample_directory_$i" DESTINATION_DIRECTORY=${!DESTINATION_DIRECTORY} - SOURCE_PATH="${GITHUB_WORKSPACE}/$SOURCE_PATH/$(ls '$SOURCE_PATH' | head -n 1)/$DESTINATION_DIRECTORY" + SOURCE_PATH="${GITHUB_WORKSPACE}/$SOURCE_PATH/$(ls "$SOURCE_PATH" | head -n 1)/$DESTINATION_DIRECTORY" export DESTINATION_PATH="imported_sample_path_$i" DESTINATION_PATH=${!DESTINATION_PATH} From 2efa009bcc4f096bc96e939cac7fc9af70867f5f Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Wed, 25 Oct 2023 14:28:08 +0300 Subject: [PATCH 135/167] changed trigger from on push to on PR to main, it worked --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index e92c761c4..f5ce45d22 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -1,8 +1,8 @@ name: Duplicate Package Samples Workflow on: - push: - branches: [ rob/samples-import-fixes-642 ] + pull_request: + branches: [ main ] jobs: duplicate: From 6f23c0dc1c954318c565c0caa4eeb6ab40987d86 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 12:16:53 +0300 Subject: [PATCH 136/167] MiscTests logs updated. --- .../Tests/Runtime/MiscTests.cs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs b/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs index 13a019903..107273bd9 100644 --- a/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs +++ b/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs @@ -69,6 +69,8 @@ public IEnumerator TestContractSend() yield return new WaitUntil(() => sendContract.IsCompleted); + if (sendContract.Exception != null) throw sendContract.Exception; + Assert.IsTrue(sendContract.IsCompletedSuccessfully); Assert.AreEqual(sendContract.Result, string.Empty); @@ -97,6 +99,8 @@ public IEnumerator TestGetBlockNumber() yield return new WaitUntil(() => getBlockNumber.IsCompleted); + if (getBlockNumber.Exception != null) throw getBlockNumber.Exception; + //just assert successful completion because result is always changing Assert.IsTrue(getBlockNumber.IsCompletedSuccessfully); } @@ -108,6 +112,8 @@ public IEnumerator TestGetGasLimit() yield return new WaitUntil(() => getGasLimit.IsCompleted); + if (getGasLimit.Exception != null) throw getGasLimit.Exception; + //just assert successful completion because result is always changing Assert.IsTrue(getGasLimit.IsCompletedSuccessfully); } @@ -119,6 +125,8 @@ public IEnumerator TestGetGasPrice() yield return new WaitUntil(() => getGasPrice.IsCompleted); + if (getGasPrice.Exception != null) throw getGasPrice.Exception; + //just assert successful completion because result is always changing Assert.IsTrue(getGasPrice.IsCompletedSuccessfully); } @@ -132,6 +140,8 @@ public IEnumerator TestGetGasNonce() yield return new WaitUntil(() => getGasNonce.IsCompleted); + if (getGasNonce.Exception != null) throw getGasNonce.Exception; + //just assert successful completion because result is always changing Assert.IsTrue(getGasNonce.IsCompletedSuccessfully); } @@ -145,6 +155,8 @@ public IEnumerator TestTransactionStatus() yield return new WaitUntil(() => getTransactionStatus.IsCompleted); + if (getTransactionStatus.Exception != null) throw getTransactionStatus.Exception; + //just assert successful completion because result is always changing Assert.IsTrue(getTransactionStatus.IsCompletedSuccessfully); } @@ -158,6 +170,8 @@ public IEnumerator TestMint721() yield return new WaitUntil(() => mint721.IsCompleted); + if (mint721.Exception != null) throw mint721.Exception; + Assert.IsTrue(mint721.IsCompletedSuccessfully); Assert.AreEqual(mint721.Result, string.Empty); @@ -170,6 +184,8 @@ public IEnumerator TestUseRegisteredContract() yield return new WaitUntil(() => useRegisteredContract.IsCompleted); + if (useRegisteredContract.Exception != null) throw useRegisteredContract.Exception; + Assert.IsTrue(useRegisteredContract.IsCompletedSuccessfully); Assert.AreEqual(useRegisteredContract.Result, new BigInteger(0)); @@ -184,6 +200,8 @@ public IEnumerator TestSendArray() yield return new WaitUntil(() => sendArray.IsCompleted); + if (sendArray.Exception != null) throw sendArray.Exception; + Assert.IsTrue(sendArray.IsCompletedSuccessfully); Assert.AreEqual(sendArray.Result, string.Empty); @@ -198,6 +216,8 @@ public IEnumerator TestSendTransaction() yield return new WaitUntil(() => sendTransaction.IsCompleted); + if (sendTransaction.Exception != null) throw sendTransaction.Exception; + Assert.IsTrue(sendTransaction.IsCompletedSuccessfully); Assert.AreEqual(sendTransaction.Result, config.TestResponse); @@ -223,6 +243,8 @@ public IEnumerator TestSignMessage() yield return new WaitUntil(() => signMessage.IsCompleted); + if (signMessage.Exception != null) throw signMessage.Exception; + Assert.IsTrue(signMessage.IsCompletedSuccessfully); Assert.AreEqual(signMessage.Result, config.TestResponse); @@ -238,6 +260,8 @@ public IEnumerator TestSignVerify() yield return new WaitUntil(() => signVerify.IsCompleted); + if (signVerify.Exception != null) throw signVerify.Exception; + Assert.IsTrue(signVerify.IsCompletedSuccessfully); Assert.AreEqual(signVerify.Result, true); @@ -252,6 +276,8 @@ public IEnumerator TestTransferErc20() yield return new WaitUntil(() => transferErc20.IsCompleted); + if (transferErc20.Exception != null) throw transferErc20.Exception; + Assert.IsTrue(transferErc20.IsCompletedSuccessfully); Assert.AreEqual(transferErc20.Result, new object[] { false }); @@ -266,6 +292,8 @@ public IEnumerator TestTransferErc721() yield return new WaitUntil(() => transferErc721.IsCompleted); + if (transferErc721.Exception != null) throw transferErc721.Exception; + Assert.IsTrue(transferErc721.IsCompletedSuccessfully); Assert.AreEqual(transferErc721.Result, string.Empty); @@ -280,6 +308,8 @@ public IEnumerator TestTransferErc1155() yield return new WaitUntil(() => transferErc1155.IsCompleted); + if (transferErc1155.Exception != null) throw transferErc1155.Exception; + yield return new WaitUntil(() => transferErc1155.IsCompletedSuccessfully); Assert.AreEqual(transferErc1155.Result, string.Empty); From ae819d2fc19e1c4dbed6a3d23d9a9ab030efe509 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 13:27:47 +0300 Subject: [PATCH 137/167] updated mint721 test response --- Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs b/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs index 107273bd9..54f988936 100644 --- a/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs +++ b/Packages/io.chainsafe.web3-unity/Tests/Runtime/MiscTests.cs @@ -164,7 +164,7 @@ public IEnumerator TestTransactionStatus() [UnityTest] public IEnumerator TestMint721() { - config.TestResponse = "0xa9f953f9845e7d49d778d6fed622d566daf09e8e1c793297c7cab54782e1aae9"; + config.TestResponse = "0xd3027fbfd9d5ddb5ea0ef75f5b128581d9268ad67728d150657f915c8910f9f0"; var mint721 = _sample.Mint721(Mint721Abi, Mint721Address, MintUri); From 420e1e5ef8e9abcaad325545411ccb5dbbdc17ae Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 15:00:26 +0300 Subject: [PATCH 138/167] Replaced path strings on CI with repository environment variables --- .github/workflows/duplicate_samples.yml | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index f5ce45d22..60c00eb86 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -12,31 +12,20 @@ jobs: - uses: actions/checkout@v4 - name: Duplicate Web3 Unity Samples run: | - for i in 1 2 + for entry in "${DUPLICATE_SAMPLE_VARS[@]}" do - export SOURCE_PATH="importable_sample_path_$i" - SOURCE_PATH=${!SOURCE_PATH} - - export DESTINATION_DIRECTORY="importable_sample_directory_$i" - DESTINATION_DIRECTORY=${!DESTINATION_DIRECTORY} + IFS=':' read -ra dirs <<< "$entry" + export SOURCE_PATH=${dirs[0]} + export DESTINATION_DIRECTORY=${dirs[1]} SOURCE_PATH="${GITHUB_WORKSPACE}/$SOURCE_PATH/$(ls "$SOURCE_PATH" | head -n 1)/$DESTINATION_DIRECTORY" - export DESTINATION_PATH="imported_sample_path_$i" - DESTINATION_PATH=${!DESTINATION_PATH} - DESTINATION_PATH="${GITHUB_WORKSPACE}/$DESTINATION_PATH" + export DESTINATION_PATH=${dirs[2]} rm -rf "$DESTINATION_PATH" mkdir -p "$DESTINATION_PATH" cp -r "$SOURCE_PATH" "$DESTINATION_PATH" done - env: - importable_sample_path_1: "src/UnitySampleProject/Assets/Samples/web3.unity SDK" - importable_sample_directory_1: "Web3.Unity Samples" - imported_sample_path_1: "Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/" - importable_sample_path_2: "src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth" - importable_sample_directory_2: "Web3.Unity Web3Auth Samples" - imported_sample_path_2: "Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/" - name: Commit and Push run: | git config user.email $git_email From 9eb15e44a696fb30037327a96d725634ee2b9e7e Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 15:02:20 +0300 Subject: [PATCH 139/167] commit path update --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 60c00eb86..69e8c3823 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -30,8 +30,8 @@ jobs: run: | git config user.email $git_email git config user.name "${{ github.actor }}" - git add ./Packages/io.chainsafe.web3-unity/Samples~/. -f - git add ./Packages/io.chainsafe.web3-unity.web3auth/Samples~/. -f + git add ${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/. -f + git add ${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/. -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From 4b5bdd54f70ec12e83168ec903f11a4148e50bbf Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 15:10:15 +0300 Subject: [PATCH 140/167] moved git config and add into duplicate step --- .github/workflows/duplicate_samples.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 69e8c3823..fb9a7ab63 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -12,6 +12,9 @@ jobs: - uses: actions/checkout@v4 - name: Duplicate Web3 Unity Samples run: | + git config user.email $git_email + git config user.name "${{ github.actor }}" + for entry in "${DUPLICATE_SAMPLE_VARS[@]}" do IFS=':' read -ra dirs <<< "$entry" @@ -25,13 +28,11 @@ jobs: rm -rf "$DESTINATION_PATH" mkdir -p "$DESTINATION_PATH" cp -r "$SOURCE_PATH" "$DESTINATION_PATH" + + git add "${DESTINATION_PATH}*" -f done - name: Commit and Push run: | - git config user.email $git_email - git config user.name "${{ github.actor }}" - git add ${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity/Samples~/. -f - git add ${GITHUB_WORKSPACE}/Packages/io.chainsafe.web3-unity.web3auth/Samples~/. -f git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From 71b7845ce6af85ddfb54635381b16fd52aa60569 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 15:11:40 +0300 Subject: [PATCH 141/167] moved git email env variable to duplicate step --- .github/workflows/duplicate_samples.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index fb9a7ab63..999e493c2 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -31,9 +31,9 @@ jobs: git add "${DESTINATION_PATH}*" -f done + env: + git_email: "${{ github.actor }}@users.noreply.github.com" - name: Commit and Push run: | git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" - git push - env: - git_email: "${{ github.actor }}@users.noreply.github.com" \ No newline at end of file + git push \ No newline at end of file From f9da8cb787d4b06dbc32b3738befe423bc9b6096 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 15:13:45 +0300 Subject: [PATCH 142/167] added branch checkout --- .github/workflows/duplicate_samples.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 999e493c2..a3ee8b5de 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -10,6 +10,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref }} - name: Duplicate Web3 Unity Samples run: | git config user.email $git_email From b7cec5655be4d0e1f5cbe75f8a8c149bc9847733 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 15:15:43 +0300 Subject: [PATCH 143/167] git change * to . --- .github/workflows/duplicate_samples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index a3ee8b5de..328357699 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -31,7 +31,7 @@ jobs: mkdir -p "$DESTINATION_PATH" cp -r "$SOURCE_PATH" "$DESTINATION_PATH" - git add "${DESTINATION_PATH}*" -f + git add "${DESTINATION_PATH}." -f done env: git_email: "${{ github.actor }}@users.noreply.github.com" From c65a3499ba441e2ef242e3dcecea8073f7ec4b3a Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 15:19:39 +0300 Subject: [PATCH 144/167] path change to git add --- .github/workflows/duplicate_samples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 328357699..da3bbd6cb 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -31,7 +31,7 @@ jobs: mkdir -p "$DESTINATION_PATH" cp -r "$SOURCE_PATH" "$DESTINATION_PATH" - git add "${DESTINATION_PATH}." -f + git add "${DESTINATION_PATH}\*" -f done env: git_email: "${{ github.actor }}@users.noreply.github.com" From 705148ff4f71777269acc4873fbd165048f4cb38 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 15:21:57 +0300 Subject: [PATCH 145/167] moved commit and push into duplicate step and updated git add path --- .github/workflows/duplicate_samples.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index da3bbd6cb..00416eaff 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -31,11 +31,10 @@ jobs: mkdir -p "$DESTINATION_PATH" cp -r "$SOURCE_PATH" "$DESTINATION_PATH" - git add "${DESTINATION_PATH}\*" -f + git add "${DESTINATION_PATH}" -a -f done - env: - git_email: "${{ github.actor }}@users.noreply.github.com" - - name: Commit and Push - run: | + git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" - git push \ No newline at end of file + git push + env: + git_email: "${{ github.actor }}@users.noreply.github.com" \ No newline at end of file From 3b25970a39eee20ca93dfc7d3ea543e0a95c9600 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 15:29:25 +0300 Subject: [PATCH 146/167] echo ls copied files --- .github/workflows/duplicate_samples.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 00416eaff..3d7a496df 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -31,7 +31,9 @@ jobs: mkdir -p "$DESTINATION_PATH" cp -r "$SOURCE_PATH" "$DESTINATION_PATH" - git add "${DESTINATION_PATH}" -a -f + echo $(ls "${DESTINATION_PATH}") + + git add "${DESTINATION_PATH}" -f done git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" From 3e78f5534b4a6ed5487a9307f4417f7cad7b0737 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 15:38:11 +0300 Subject: [PATCH 147/167] more path updates --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 3d7a496df..36a7960e1 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -25,7 +25,7 @@ jobs: SOURCE_PATH="${GITHUB_WORKSPACE}/$SOURCE_PATH/$(ls "$SOURCE_PATH" | head -n 1)/$DESTINATION_DIRECTORY" - export DESTINATION_PATH=${dirs[2]} + export DESTINATION_PATH="${GITHUB_WORKSPACE}/${dirs[2]}" rm -rf "$DESTINATION_PATH" mkdir -p "$DESTINATION_PATH" @@ -33,7 +33,7 @@ jobs: echo $(ls "${DESTINATION_PATH}") - git add "${DESTINATION_PATH}" -f + git add . -f done git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" From 7bd3054f1d9bcd331a5ef3e25b97fa59584ef2f1 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 15:45:22 +0300 Subject: [PATCH 148/167] git add path update --- .github/workflows/duplicate_samples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 36a7960e1..06c6a8c58 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -33,7 +33,7 @@ jobs: echo $(ls "${DESTINATION_PATH}") - git add . -f + git add "$DESTINATION_PATH/." -f done git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" From 1fe91adca86d3c00f77c2ade425a999122f658c6 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 15:49:48 +0300 Subject: [PATCH 149/167] small git add path update --- .github/workflows/duplicate_samples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 06c6a8c58..fc78817c7 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -33,7 +33,7 @@ jobs: echo $(ls "${DESTINATION_PATH}") - git add "$DESTINATION_PATH/." -f + git add "$DESTINATION_PATH." -f done git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" From a227a862084530b7db30c78bea5f205fe416da1f Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 15:52:25 +0300 Subject: [PATCH 150/167] always try commit --- .github/workflows/duplicate_samples.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index fc78817c7..b587a2b45 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -36,7 +36,8 @@ jobs: git add "$DESTINATION_PATH." -f done - git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" + git diff-index --cached --quiet HEAD + git commit -m "Auto-duplicate Packages Samples" git push env: git_email: "${{ github.actor }}@users.noreply.github.com" \ No newline at end of file From 20ab262435baaf3bc18f932626663c9db294402f Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 15:59:25 +0300 Subject: [PATCH 151/167] var declaration and ls log moved out of loop --- .github/workflows/duplicate_samples.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index b587a2b45..1ed9dbff1 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -17,27 +17,30 @@ jobs: git config user.email $git_email git config user.name "${{ github.actor }}" + export SOURCE_PATH= + export DESTINATION_DIRECTORY= + export DESTINATION_PATH= + for entry in "${DUPLICATE_SAMPLE_VARS[@]}" do IFS=':' read -ra dirs <<< "$entry" - export SOURCE_PATH=${dirs[0]} - export DESTINATION_DIRECTORY=${dirs[1]} + SOURCE_PATH=${dirs[0]} + DESTINATION_DIRECTORY=${dirs[1]} SOURCE_PATH="${GITHUB_WORKSPACE}/$SOURCE_PATH/$(ls "$SOURCE_PATH" | head -n 1)/$DESTINATION_DIRECTORY" - export DESTINATION_PATH="${GITHUB_WORKSPACE}/${dirs[2]}" + DESTINATION_PATH="${GITHUB_WORKSPACE}/${dirs[2]}" rm -rf "$DESTINATION_PATH" mkdir -p "$DESTINATION_PATH" cp -r "$SOURCE_PATH" "$DESTINATION_PATH" - echo $(ls "${DESTINATION_PATH}") - git add "$DESTINATION_PATH." -f done - git diff-index --cached --quiet HEAD - git commit -m "Auto-duplicate Packages Samples" + echo $(ls "${DESTINATION_PATH}") + + git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: git_email: "${{ github.actor }}@users.noreply.github.com" \ No newline at end of file From dad5491bc971fa04f04ff7e39ea84d99722d3912 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 16:03:43 +0300 Subject: [PATCH 152/167] logs added --- .github/workflows/duplicate_samples.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 1ed9dbff1..4da0e9e4c 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -38,7 +38,13 @@ jobs: git add "$DESTINATION_PATH." -f done - echo $(ls "${DESTINATION_PATH}") + echo ${DUPLICATE_SAMPLE_VARS[0]} + export first=${DUPLICATE_SAMPLE_VARS[0]} + echo $first + IFS=':' read -ra arr <<< "first" + echo ${arr[0]} + echo ${arr[1]} + echo ${arr[2]} git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push From 0d0c2ab04f25dfc655b81e3c3e3fe568798822a8 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 16:09:29 +0300 Subject: [PATCH 153/167] env variable correct reference --- .github/workflows/duplicate_samples.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 4da0e9e4c..d9c3c5bbe 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -21,7 +21,7 @@ jobs: export DESTINATION_DIRECTORY= export DESTINATION_PATH= - for entry in "${DUPLICATE_SAMPLE_VARS[@]}" + for entry in "${{ env.DUPLICATE_SAMPLE_VARS[@] }}" do IFS=':' read -ra dirs <<< "$entry" SOURCE_PATH=${dirs[0]} @@ -38,13 +38,7 @@ jobs: git add "$DESTINATION_PATH." -f done - echo ${DUPLICATE_SAMPLE_VARS[0]} - export first=${DUPLICATE_SAMPLE_VARS[0]} - echo $first - IFS=':' read -ra arr <<< "first" - echo ${arr[0]} - echo ${arr[1]} - echo ${arr[2]} + echo ${{ env.DUPLICATE_SAMPLE_VARS[@] }} git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push From 9365a48d309425dbeb83621e4894c02ef30c5363 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 16:11:33 +0300 Subject: [PATCH 154/167] more env var ref fix --- .github/workflows/duplicate_samples.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index d9c3c5bbe..59f6ccf54 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -21,7 +21,9 @@ jobs: export DESTINATION_DIRECTORY= export DESTINATION_PATH= - for entry in "${{ env.DUPLICATE_SAMPLE_VARS[@] }}" + export DUPLICATE_SAMPLE_VARS = ${{ env.DUPLICATE_SAMPLE_VARS }} + + for entry in "${DUPLICATE_SAMPLE_VARS[@]}" do IFS=':' read -ra dirs <<< "$entry" SOURCE_PATH=${dirs[0]} @@ -38,7 +40,7 @@ jobs: git add "$DESTINATION_PATH." -f done - echo ${{ env.DUPLICATE_SAMPLE_VARS[@] }} + echo ${{ env.DUPLICATE_SAMPLE_VARS }} git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push From 26a9a7b0f972022ed28afe3560420ea58fcf1955 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 16:12:47 +0300 Subject: [PATCH 155/167] syntax fix --- .github/workflows/duplicate_samples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 59f6ccf54..5dd1ad749 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -21,7 +21,7 @@ jobs: export DESTINATION_DIRECTORY= export DESTINATION_PATH= - export DUPLICATE_SAMPLE_VARS = ${{ env.DUPLICATE_SAMPLE_VARS }} + export DUPLICATE_SAMPLE_VARS=${{ env.DUPLICATE_SAMPLE_VARS }} for entry in "${DUPLICATE_SAMPLE_VARS[@]}" do From 9da4ff9005b6c11fcdb87bb09da934f9c3561af6 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 16:16:30 +0300 Subject: [PATCH 156/167] log env var --- .github/workflows/duplicate_samples.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 5dd1ad749..f05bcde31 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -23,6 +23,8 @@ jobs: export DUPLICATE_SAMPLE_VARS=${{ env.DUPLICATE_SAMPLE_VARS }} + echo $DUPLICATE_SAMPLE_VARS + for entry in "${DUPLICATE_SAMPLE_VARS[@]}" do IFS=':' read -ra dirs <<< "$entry" @@ -40,8 +42,6 @@ jobs: git add "$DESTINATION_PATH." -f done - echo ${{ env.DUPLICATE_SAMPLE_VARS }} - git diff-index --cached --quiet HEAD || git commit -m "Auto-duplicate Packages Samples" git push env: From f4bae65ff28f0a2801e342f4797b3f51c1b957c3 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 16:18:58 +0300 Subject: [PATCH 157/167] changed env. ref to vars. --- .github/workflows/duplicate_samples.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index f05bcde31..39154d4b1 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -21,9 +21,7 @@ jobs: export DESTINATION_DIRECTORY= export DESTINATION_PATH= - export DUPLICATE_SAMPLE_VARS=${{ env.DUPLICATE_SAMPLE_VARS }} - - echo $DUPLICATE_SAMPLE_VARS + export DUPLICATE_SAMPLE_VARS=${{ vars.DUPLICATE_SAMPLE_VARS }} for entry in "${DUPLICATE_SAMPLE_VARS[@]}" do From f109605850366ba3f6b5b8ff16d15024713e9cfd Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 16:31:19 +0300 Subject: [PATCH 158/167] updated source copy path --- .github/workflows/duplicate_samples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/duplicate_samples.yml b/.github/workflows/duplicate_samples.yml index 39154d4b1..4137dbf03 100644 --- a/.github/workflows/duplicate_samples.yml +++ b/.github/workflows/duplicate_samples.yml @@ -35,7 +35,7 @@ jobs: rm -rf "$DESTINATION_PATH" mkdir -p "$DESTINATION_PATH" - cp -r "$SOURCE_PATH" "$DESTINATION_PATH" + cp -r "$SOURCE_PATH/." "$DESTINATION_PATH" git add "$DESTINATION_PATH." -f done From 96ec0f36853ee9feea212e3374726ceeef656b11 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Thu, 26 Oct 2023 13:31:46 +0000 Subject: [PATCH 159/167] Auto-duplicate Packages Samples --- .../Samples~/Web3.Unity Web3Auth/Scenes.meta | 8 + .../Scenes/SampleLogin - Web3Auth.unity | 2627 +++++++++++++ .../Scenes/SampleLogin - Web3Auth.unity.meta | 7 + .../Samples~/Web3.Unity Web3Auth/Scripts.meta | 8 + .../Scripts/Utilities.meta | 8 + .../Scripts/Utilities/Web3AuthSceneIndexer.cs | 23 + .../Utilities/Web3AuthSceneIndexer.cs.meta | 11 + .../Scripts/Web3AuthLogin.cs | 102 + .../Scripts/Web3AuthLogin.cs.meta | 11 + .../Web3.Unity/Scenes/SampleLogin.unity | 3296 ++++++----------- .../Web3.Unity/Scripts/Prefabs/Logout.cs | 6 +- .../Web3.Unity/Scripts/Samples.asmdef | 3 +- .../Scripts/Scenes/ExistingWalletLogin.cs | 263 ++ .../Scenes/ExistingWalletLogin.cs.meta | 11 + .../Web3.Unity/Scripts/Scenes/Login.cs | 438 +-- .../Scenes/SampleNftTexture/LoadScene.cs | 4 +- .../Scripts/Utilities/PlayerData.cs | 99 + .../Scripts/Utilities/PlayerData.cs.meta | 11 + .../Scripts/Utilities/SceneIndexer.cs | 70 +- 19 files changed, 4361 insertions(+), 2645 deletions(-) create mode 100644 Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scenes.meta create mode 100644 Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scenes/SampleLogin - Web3Auth.unity create mode 100644 Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scenes/SampleLogin - Web3Auth.unity.meta create mode 100644 Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts.meta create mode 100644 Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Utilities.meta create mode 100644 Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Utilities/Web3AuthSceneIndexer.cs create mode 100644 Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Utilities/Web3AuthSceneIndexer.cs.meta create mode 100644 Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs create mode 100644 Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs.meta create mode 100644 Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/ExistingWalletLogin.cs create mode 100644 Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/ExistingWalletLogin.cs.meta create mode 100644 Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/PlayerData.cs create mode 100644 Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/PlayerData.cs.meta diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scenes.meta b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scenes.meta new file mode 100644 index 000000000..4fac99df1 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63a4252d0dda4554abf1f9920c4dc15c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scenes/SampleLogin - Web3Auth.unity b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scenes/SampleLogin - Web3Auth.unity new file mode 100644 index 000000000..b7397b352 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scenes/SampleLogin - Web3Auth.unity @@ -0,0 +1,2627 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &249944480 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 249944481} + - component: {fileID: 249944483} + - component: {fileID: 249944482} + m_Layer: 5 + m_Name: Title - Error + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &249944481 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249944480} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1897816690} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &249944482 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249944480} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.412, g: 0.043672003, b: 0.043672003, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 24 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Error +--- !u!222 &249944483 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249944480} + m_CullTransparentMesh: 1 +--- !u!1 &279657855 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 279657856} + - component: {fileID: 279657859} + - component: {fileID: 279657858} + - component: {fileID: 279657857} + m_Layer: 5 + m_Name: Fade + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &279657856 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279657855} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 337558420} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &279657857 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279657855} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 0 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 279657858} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 337558421} + m_TargetAssemblyTypeName: Scenes.ErrorPopup, Assembly-CSharp + m_MethodName: Close + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &279657858 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279657855} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.29803923} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &279657859 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279657855} + m_CullTransparentMesh: 1 +--- !u!1 &337558419 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 337558420} + - component: {fileID: 337558421} + m_Layer: 5 + m_Name: Error + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &337558420 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 337558419} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 279657856} + - {fileID: 1897816690} + m_Father: {fileID: 1799608973} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &337558421 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 337558419} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c001d0d5433b4215b8abba94194881bd, type: 3} + m_Name: + m_EditorClassIdentifier: + MessageLabel: {fileID: 804898217} +--- !u!1 &359109759 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 359109762} + - component: {fileID: 359109761} + - component: {fileID: 359109760} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &359109760 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 359109759} + m_Enabled: 1 +--- !u!20 &359109761 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 359109759} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.101960786, g: 0.101960786, b: 0.10980392, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &359109762 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 359109759} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &771332079 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 771332080} + - component: {fileID: 771332082} + - component: {fileID: 771332081} + m_Layer: 5 + m_Name: Container + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &771332080 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 771332079} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 221640018553606200} + m_Father: {fileID: 1799608973} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.725} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &771332081 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 771332079} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!114 &771332082 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 771332079} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 25 + m_Right: 25 + m_Top: 25 + m_Bottom: 25 + m_ChildAlignment: 0 + m_Spacing: 50 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &804898216 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 804898219} + - component: {fileID: 804898218} + - component: {fileID: 804898217} + m_Layer: 5 + m_Name: Error message + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &804898217 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 804898216} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.05, g: 0.05, b: 0.05, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 40 + m_Alignment: 1 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &804898218 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 804898216} + m_CullTransparentMesh: 1 +--- !u!224 &804898219 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 804898216} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1520162125} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1025578980 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1025578983} + - component: {fileID: 1025578982} + - component: {fileID: 1025578981} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1025578981 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1025578980} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1025578982 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1025578980} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1025578983 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1025578980} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1387636275 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1387636276} + - component: {fileID: 1387636279} + - component: {fileID: 1387636278} + - component: {fileID: 1387636277} + m_Layer: 5 + m_Name: Button - Ok + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1387636276 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387636275} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1640414611} + m_Father: {fileID: 1520162125} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &1387636277 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387636275} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1387636278} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 337558421} + m_TargetAssemblyTypeName: Scenes.ErrorPopup, Assembly-CSharp + m_MethodName: Close + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1387636278 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387636275} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1387636279 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387636275} + m_CullTransparentMesh: 1 +--- !u!1 &1520162124 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1520162125} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1520162125 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1520162124} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 804898219} + - {fileID: 1387636276} + m_Father: {fileID: 1897816690} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -21} + m_SizeDelta: {x: -32, y: -58} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1640414610 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1640414611} + - component: {fileID: 1640414613} + - component: {fileID: 1640414612} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1640414611 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1640414610} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1387636276} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1640414612 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1640414610} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.05, g: 0.05, b: 0.05, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 19 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: OK +--- !u!222 &1640414613 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1640414610} + m_CullTransparentMesh: 1 +--- !u!1 &1679801098 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1679801099} + - component: {fileID: 1679801100} + m_Layer: 0 + m_Name: Logic - Login - Web3Auth + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1679801099 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1679801098} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1679801100 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1679801098} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7b6902e441950fa4bb5cefdd2263164a, type: 3} + m_Name: + m_EditorClassIdentifier: + gelatoApiKey: _UzPz_Yk_WTjWMfcl45fLvQNGQ9ISx5ZE8TnwnVKYrE_ + errorPopup: {fileID: 337558421} + clientId: BCc0wTmuXureEzgawhUSZOWu4bgWo56sZPrxLiHQCpg5OHcNrfa44esdTS8Dm77VtmaIyjhbthdWfbLhSwf7jtU + redirectUri: torusapp://io.chainsafe.gamingsdk.sdkdemoscene/auth + network: 1 + providerAndButtonPairs: + - Button: {fileID: 7400892926620024700} + Provider: 0 + - Button: {fileID: 7400892927795158149} + Provider: 10 + - Button: {fileID: 7400892926443314765} + Provider: 1 + - Button: {fileID: 7400892927495363539} + Provider: 2 + - Button: {fileID: 7400892926127870699} + Provider: 3 + - Button: {fileID: 7400892925769233044} + Provider: 4 +--- !u!1 &1799608969 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1799608973} + - component: {fileID: 1799608972} + - component: {fileID: 1799608971} + - component: {fileID: 1799608970} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1799608970 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1799608969} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1799608971 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1799608969} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1280, y: 720} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 1 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1799608972 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1799608969} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1799608973 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1799608969} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1941751038} + - {fileID: 771332080} + - {fileID: 337558420} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1897816689 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1897816690} + - component: {fileID: 1897816692} + - component: {fileID: 1897816691} + m_Layer: 5 + m_Name: Error Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1897816690 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1897816689} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 249944481} + - {fileID: 1520162125} + m_Father: {fileID: 337558420} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -8.4831} + m_SizeDelta: {x: 400, y: 167.1662} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1897816691 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1897816689} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0.912, b: 0.912, a: 0.9490196} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1897816692 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1897816689} + m_CullTransparentMesh: 1 +--- !u!1 &1941751037 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1941751038} + m_Layer: 5 + m_Name: Header + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1941751038 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1941751037} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2063401255} + - {fileID: 2017486156} + m_Father: {fileID: 1799608973} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.725} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -25} + m_SizeDelta: {x: -50, y: -50} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &2017486155 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2017486156} + - component: {fileID: 2017486158} + - component: {fileID: 2017486157} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2017486156 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2017486155} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1941751038} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.25, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -30, y: -30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2017486157 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2017486155} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Login to continue + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294111986 + m_fontColor: {r: 0.95, g: 0.95, b: 0.95, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 40 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 16 + m_fontSizeMax: 40 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &2017486158 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2017486155} + m_CullTransparentMesh: 1 +--- !u!1 &2063401254 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2063401255} + - component: {fileID: 2063401257} + - component: {fileID: 2063401256} + m_Layer: 5 + m_Name: ChainSafe Logo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2063401255 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2063401254} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1941751038} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.25, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: -50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2063401256 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2063401254} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 804f4bf7fbf176544bd5efde4a0749ca, type: 3} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2063401257 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2063401254} + m_CullTransparentMesh: 1 +--- !u!114 &221640017808192961 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601029837872496} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1001 &221640017808193020 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 221640018348301908} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: Button - Reddit + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Continue with Reddit + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_fontSize + value: 17.9 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!1001 &221640018061849258 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 221640018348301908} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: Button - Twitter + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Continue with Twitter + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_fontSize + value: 17.9 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!114 &221640018061849263 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601030083336742} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!224 &221640018348301908 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018348301909} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4687163642340118773} + - {fileID: 4687163641433322252} + - {fileID: 4687163642770551236} + - {fileID: 4687163641674593370} + - {fileID: 4687163643058568546} + - {fileID: 4687163643165482269} + - {fileID: 221640018720180776} + m_Father: {fileID: 221640018553606200} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &221640018348301909 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 221640018348301908} + - component: {fileID: 221640018348301910} + - component: {fileID: 221640018348301911} + m_Layer: 5 + m_Name: Buttons + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &221640018348301910 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018348301909} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 5 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &221640018348301911 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018348301909} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!224 &221640018553606200 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018553606201} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 221640018348301908} + m_Father: {fileID: 771332080} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &221640018553606201 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 221640018553606200} + - component: {fileID: 221640018553606203} + m_Layer: 5 + m_Name: Column - Web3Auth + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &221640018553606203 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018553606201} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 300 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!224 &221640018720180776 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018720180777} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 221640018348301908} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &221640018720180777 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 221640018720180776} + - component: {fileID: 221640018720180778} + - component: {fileID: 221640018720180779} + m_Layer: 5 + m_Name: Powered by W3A + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &221640018720180778 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018720180777} + m_CullTransparentMesh: 1 +--- !u!114 &221640018720180779 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 221640018720180777} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Powered by Web3Auth + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1001 &221640018859585634 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 221640018348301908} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: Button - Facebook + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Continue with Facebook + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_fontSize + value: 17.9 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!114 &221640018859585639 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601028750301422} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1001 &221640019303666003 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 221640018348301908} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.size + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 1679801100} + - target: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: set_tag + objectReference: {fileID: 0} + - target: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: UnityEngine.Component, UnityEngine + objectReference: {fileID: 0} + - target: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: Button - Google + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Continue with Google + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_fontSize + value: 17.9 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!114 &221640019303666004 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601028908071391} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1001 &221640019533962427 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 221640018348301908} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: Button - Twitch + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Continue with Twitch + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_fontSize + value: 17.9 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!114 &221640019533962428 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601029147800631} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1001 &221640019796147396 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 221640018348301908} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: Button - Discord + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Continue with Discord + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_fontSize + value: 17.9 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!114 &221640019796147401 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601029661561928} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!224 &4687163641433322252 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640018061849258} + m_PrefabAsset: {fileID: 0} +--- !u!224 &4687163641674593370 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640017808193020} + m_PrefabAsset: {fileID: 0} +--- !u!224 &4687163642340118773 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019303666003} + m_PrefabAsset: {fileID: 0} +--- !u!224 &4687163642770551236 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640018859585634} + m_PrefabAsset: {fileID: 0} +--- !u!224 &4687163643058568546 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019796147396} + m_PrefabAsset: {fileID: 0} +--- !u!224 &4687163643165482269 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019533962427} + m_PrefabAsset: {fileID: 0} +--- !u!114 &7400892925769233044 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019533962427} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601029147800631} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &7400892926127870699 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019796147396} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601029661561928} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &7400892926443314765 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640018859585634} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601028750301422} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &7400892926620024700 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019303666003} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601028908071391} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &7400892927495363539 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640017808193020} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601029837872496} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &7400892927795158149 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640018061849258} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8852601030083336742} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &8852601028750301422 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640018859585634} + m_PrefabAsset: {fileID: 0} +--- !u!1 &8852601028908071391 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019303666003} + m_PrefabAsset: {fileID: 0} +--- !u!1 &8852601029147800631 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019533962427} + m_PrefabAsset: {fileID: 0} +--- !u!1 &8852601029661561928 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640019796147396} + m_PrefabAsset: {fileID: 0} +--- !u!1 &8852601029837872496 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640017808193020} + m_PrefabAsset: {fileID: 0} +--- !u!1 &8852601030083336742 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 221640018061849258} + m_PrefabAsset: {fileID: 0} diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scenes/SampleLogin - Web3Auth.unity.meta b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scenes/SampleLogin - Web3Auth.unity.meta new file mode 100644 index 000000000..1a53d87da --- /dev/null +++ b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scenes/SampleLogin - Web3Auth.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a8a8b501e594874448546e904e2437c5 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts.meta b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts.meta new file mode 100644 index 000000000..7c28da439 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 69be851f73848a64b85590574e09aef5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Utilities.meta b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Utilities.meta new file mode 100644 index 000000000..3ec680a81 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Utilities.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d1132bb018bb0b141a97e58bfad0dba6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Utilities/Web3AuthSceneIndexer.cs b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Utilities/Web3AuthSceneIndexer.cs new file mode 100644 index 000000000..ceb55fd50 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Utilities/Web3AuthSceneIndexer.cs @@ -0,0 +1,23 @@ +#if UNITY_EDITOR +using UnityEditor; + +/// +/// Add Web3.Unity Web3Auth package sample scenes to Build Settings Scenes +/// +[InitializeOnLoad] +public static class Web3AuthSceneIndexer +{ + private const string ScenesIndexedKey = PackageName + "ScenesIndexed"; + + private const string PackageName = "io.chainsafe.web3-unity.web3auth"; + + static Web3AuthSceneIndexer() + { + SceneIndexer.TryAddEditorBuildSettingsScenes(PackageName, ScenesIndexedKey, new string[] + { + "SampleLogin - Web3Auth.Unity", + }); + } +} + +#endif \ No newline at end of file diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Utilities/Web3AuthSceneIndexer.cs.meta b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Utilities/Web3AuthSceneIndexer.cs.meta new file mode 100644 index 000000000..50f8761b4 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Utilities/Web3AuthSceneIndexer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 74c0e58ffe715a448a1d221b425d7352 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs new file mode 100644 index 000000000..9aae69268 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using ChainSafe.Gaming.Web3.Build; +using ChainSafe.GamingSdk.Web3Auth; +using Scenes; +using UnityEngine; +using UnityEngine.UI; +using Network = Web3Auth.Network; + +/// +/// Login using Web3Auth. +/// +public class Web3AuthLogin : Login +{ + /// + /// Struct used for pairing login buttons to Web3 auth providers. + /// Used when adding as listeners to the buttons. + /// + [Serializable] + public struct ProviderAndButtonPair + { + public Button Button; + public Provider Provider; + } + + [Header("Web3 Auth")] + [SerializeField] private string clientId; + [SerializeField] private string redirectUri; + [SerializeField] private Network network; + + [Header("UI")] + [SerializeField] private List providerAndButtonPairs; + + private bool useProvider; + + private Provider selectedProvider; + + protected override IEnumerator Initialize() + { +#if UNITY_WEBGL + + useProvider = false; + + Task loginTask = TryLogin(); + + yield return new WaitUntil(() => loginTask.IsCompleted); +#endif + + // add provider buttons listeners + providerAndButtonPairs.ForEach(p => p.Button.onClick.AddListener(delegate + { + LoginWithWeb3Auth(p.Provider); + })); + + yield return null; + } + + private async void LoginWithWeb3Auth(Provider provider) + { + if (!useProvider) + { + useProvider = true; + } + + selectedProvider = provider; + + await TryLogin(); + } + + protected override Web3Builder ConfigureWeb3Services(Web3Builder web3Builder) + { + return web3Builder.Configure(services => + { + var web3AuthConfig = new Web3AuthWalletConfig + { + Web3AuthOptions = new() + { + clientId = clientId, + redirectUrl = new Uri(redirectUri), + network = network, + whiteLabel = new() + { + dark = true, + defaultLanguage = "en", + name = "ChainSafe Gaming SDK", + } + } + }; + + if (useProvider) + { + web3AuthConfig.LoginParams = new LoginParams + { + loginProvider = selectedProvider + }; + } + + services.UseWeb3AuthWallet(web3AuthConfig); + }); + } +} diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs.meta b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs.meta new file mode 100644 index 000000000..95e3a7742 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7b6902e441950fa4bb5cefdd2263164a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity index 77c56686b..0f766adb4 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scenes/SampleLogin.unity @@ -699,7 +699,7 @@ MonoBehaviour: m_fontSizeBase: 48 m_fontWeight: 400 m_enableAutoSizing: 1 - m_fontSizeMin: 32 + m_fontSizeMin: 16 m_fontSizeMax: 40 m_fontStyle: 1 m_HorizontalAlignment: 1 @@ -1038,7 +1038,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 311857775} m_CullTransparentMesh: 1 ---- !u!1 &325001971 +--- !u!1 &351786044 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1046,59 +1046,60 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 325001972} - - component: {fileID: 325001974} - - component: {fileID: 325001973} + - component: {fileID: 351786045} + - component: {fileID: 351786047} + - component: {fileID: 351786046} m_Layer: 5 - m_Name: Line + m_Name: Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &325001972 +--- !u!224 &351786045 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 325001971} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 351786044} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1434038408} - m_RootOrder: 1 + m_Children: + - {fileID: 1900245909} + m_Father: {fileID: 724612375} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0} - m_AnchorMax: {x: 0.5, y: 1} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.25, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 2, y: -100} + m_SizeDelta: {x: -10.000004, y: -10.000001} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &325001973 +--- !u!114 &351786046 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 325001971} + m_GameObject: {fileID: 351786044} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.16299999, g: 0.16299999, b: 0.16299999, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 0} + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} m_Type: 0 - m_PreserveAspect: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -1106,15 +1107,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &325001974 +--- !u!222 &351786047 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 325001971} + m_GameObject: {fileID: 351786044} m_CullTransparentMesh: 1 ---- !u!1 &351786044 +--- !u!1 &395689439 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1122,76 +1123,121 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 351786045} - - component: {fileID: 351786047} - - component: {fileID: 351786046} + - component: {fileID: 395689440} + - component: {fileID: 395689441} m_Layer: 5 - m_Name: Background + m_Name: WalletConnectModal m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &351786045 +--- !u!224 &395689440 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 351786044} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 395689439} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1900245909} - m_Father: {fileID: 724612375} - m_RootOrder: 0 + - {fileID: 1278821651} + m_Father: {fileID: 1880270956} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0.25, y: 1} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -10.000004, y: -10.000001} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &351786046 +--- !u!114 &395689441 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 351786044} + m_GameObject: {fileID: 395689439} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: fb890e484538c444da09be8d0f89dcd8, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &351786047 -CanvasRenderer: + _qrCodeImage: {fileID: 125483106} + _copyToClipboardButton: {fileID: 212403314} + _backButton: {fileID: 1993078182} + _container: {fileID: 1278821651} +--- !u!1 &492023254 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 351786044} - m_CullTransparentMesh: 1 ---- !u!1 &372811666 + serializedVersion: 6 + m_Component: + - component: {fileID: 492023255} + - component: {fileID: 492023257} + - component: {fileID: 492023256} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &492023255 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 492023254} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &492023256 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 492023254} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &492023257 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 492023254} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!1 &537139933 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1199,276 +1245,191 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 372811667} - - component: {fileID: 372811669} - - component: {fileID: 372811668} + - component: {fileID: 537139934} m_Layer: 5 - m_Name: Powered by W3A + m_Name: Content m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &372811667 +--- !u!224 &537139934 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 372811666} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 537139933} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 387303608} - m_RootOrder: 6 + m_Children: + - {fileID: 1808259963} + m_Father: {fileID: 2043937261} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 28} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &540464233 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 540464234} + - component: {fileID: 540464238} + - component: {fileID: 540464237} + - component: {fileID: 540464236} + - component: {fileID: 540464235} + m_Layer: 5 + m_Name: Dropdown - Wallets + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &540464234 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 540464233} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2033480131} + - {fileID: 2045136594} + - {fileID: 741301286} + m_Father: {fileID: 654334440} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 295, y: -190} + m_SizeDelta: {x: 590, y: 50} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &372811668 +--- !u!114 &540464235 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 372811666} + m_GameObject: {fileID: 540464233} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Powered by Web3Auth - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 14 - m_fontSizeBase: 14 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &372811669 -CanvasRenderer: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &540464236 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 372811666} - m_CullTransparentMesh: 1 ---- !u!1001 &374887655 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 387303608} - m_Modifications: - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_RootOrder - value: 2 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Name - value: Button - Facebook - objectReference: {fileID: 0} - - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_text - value: Continue with Facebook - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} ---- !u!224 &374887656 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 374887655} - m_PrefabAsset: {fileID: 0} ---- !u!114 &374887657 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 374887655} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 374887658} + m_GameObject: {fileID: 540464233} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} m_Name: m_EditorClassIdentifier: ---- !u!1 &374887658 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 374887655} - m_PrefabAsset: {fileID: 0} ---- !u!114 &374887659 + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 540464237} + m_Template: {fileID: 741301286} + m_CaptionText: {fileID: 2033480132} + m_CaptionImage: {fileID: 0} + m_Placeholder: {fileID: 0} + m_ItemText: {fileID: 258509837} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_AlphaFadeSpeed: 0.15 +--- !u!114 &540464237 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 374887658} + m_GameObject: {fileID: 540464233} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!1 &387303607 + m_Material: {fileID: 0} + m_Color: {r: 0.054901965, g: 0.054901965, b: 0.054901965, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &540464238 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 540464233} + m_CullTransparentMesh: 1 +--- !u!1 &562988047 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1476,84 +1437,75 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 387303608} - - component: {fileID: 387303609} - - component: {fileID: 387303610} + - component: {fileID: 562988048} + - component: {fileID: 562988050} + - component: {fileID: 562988049} m_Layer: 5 - m_Name: Buttons + m_Name: Item Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &387303608 +--- !u!224 &562988048 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 387303607} + m_GameObject: {fileID: 562988047} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1996606958} - - {fileID: 452118934} - - {fileID: 374887656} - - {fileID: 2114521193} - - {fileID: 1452765488} - - {fileID: 1508551057} - - {fileID: 372811667} - m_Father: {fileID: 1062946086} + m_Children: [] + m_Father: {fileID: 1808259963} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &387303609 + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &562988049 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 387303607} + m_GameObject: {fileID: 562988047} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 0 - m_Spacing: 5 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 1 - m_ChildControlWidth: 1 - m_ChildControlHeight: 1 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 ---- !u!114 &387303610 -MonoBehaviour: + m_Material: {fileID: 0} + m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &562988050 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 387303607} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 ---- !u!1 &395689439 + m_GameObject: {fileID: 562988047} + m_CullTransparentMesh: 1 +--- !u!1 &654334439 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1561,195 +1513,81 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 395689440} - - component: {fileID: 395689441} + - component: {fileID: 654334440} + - component: {fileID: 654334442} + - component: {fileID: 654334441} m_Layer: 5 - m_Name: WalletConnectModal + m_Name: Container m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &395689440 +--- !u!224 &654334440 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 395689439} + m_GameObject: {fileID: 654334439} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1278821651} - m_Father: {fileID: 1880270956} - m_RootOrder: 2 + - {fileID: 787012149} + - {fileID: 724612375} + - {fileID: 981405682} + - {fileID: 540464234} + m_Father: {fileID: 2036998554} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &395689441 + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &654334441 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 395689439} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fb890e484538c444da09be8d0f89dcd8, type: 3} - m_Name: - m_EditorClassIdentifier: - _qrCodeImage: {fileID: 125483106} - _copyToClipboardButton: {fileID: 212403314} - _backButton: {fileID: 1993078182} - _container: {fileID: 1278821651} ---- !u!1001 &452118933 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 387303608} - m_Modifications: - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_RootOrder - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Name - value: Button - Twitter - objectReference: {fileID: 0} - - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_text - value: Continue with Twitter - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} ---- !u!224 &452118934 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 452118933} - m_PrefabAsset: {fileID: 0} ---- !u!114 &452118935 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 452118933} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 452118936} + m_GameObject: {fileID: 654334439} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} m_Name: m_EditorClassIdentifier: ---- !u!1 &452118936 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 452118933} - m_PrefabAsset: {fileID: 0} ---- !u!114 &452118937 + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!114 &654334442 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 452118936} + m_GameObject: {fileID: 654334439} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} m_Name: m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!1 &492023254 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 5 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &724612374 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1757,104 +1595,107 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 492023255} - - component: {fileID: 492023257} - - component: {fileID: 492023256} - m_Layer: 0 - m_Name: EventSystem + - component: {fileID: 724612375} + - component: {fileID: 724612376} + - component: {fileID: 724612377} + m_Layer: 5 + m_Name: Toggle - Remember Me m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &492023255 -Transform: +--- !u!224 &724612375 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 492023254} + m_GameObject: {fileID: 724612374} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 66.28, y: -78.54001, z: 0} - m_LocalScale: {x: 0.935, y: 0.935, z: 0.935} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} + m_Children: + - {fileID: 351786045} + - {fileID: 1791429089} + m_Father: {fileID: 654334440} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &492023256 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 492023254} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} - m_Name: - m_EditorClassIdentifier: - m_SendPointerHoverToParent: 1 - m_HorizontalAxis: Horizontal - m_VerticalAxis: Vertical - m_SubmitButton: Submit - m_CancelButton: Cancel - m_InputActionsPerSecond: 10 - m_RepeatDelay: 0.5 - m_ForceModuleActive: 0 ---- !u!114 &492023257 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &724612376 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 492023254} + m_GameObject: {fileID: 724612374} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} m_Name: m_EditorClassIdentifier: - m_FirstSelected: {fileID: 0} - m_sendNavigationEvents: 1 - m_DragThreshold: 10 ---- !u!1 &537139933 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 537139934} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &537139934 -RectTransform: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 351786046} + toggleTransition: 1 + graphic: {fileID: 1900245910} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!114 &724612377 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 537139933} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1808259963} - m_Father: {fileID: 2043937261} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 28} - m_Pivot: {x: 0.5, y: 1} ---- !u!1 &540464233 + m_GameObject: {fileID: 724612374} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &741301285 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1862,129 +1703,83 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 540464234} - - component: {fileID: 540464238} - - component: {fileID: 540464237} - - component: {fileID: 540464236} - - component: {fileID: 540464235} + - component: {fileID: 741301286} + - component: {fileID: 741301289} + - component: {fileID: 741301288} + - component: {fileID: 741301287} m_Layer: 5 - m_Name: Dropdown - Wallets + m_Name: Template m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 0 ---- !u!224 &540464234 +--- !u!224 &741301286 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 540464233} + m_GameObject: {fileID: 741301285} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 2033480131} - - {fileID: 2045136594} - - {fileID: 741301286} - m_Father: {fileID: 2036998554} - m_RootOrder: 3 + - {fileID: 2043937261} + - {fileID: 1934047389} + m_Father: {fileID: 540464234} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 295, y: -190} - m_SizeDelta: {x: 590, y: 50} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &540464235 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 540464233} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!114 &540464236 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 2} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &741301287 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 540464233} + m_GameObject: {fileID: 741301285} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} m_Name: m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 540464237} - m_Template: {fileID: 741301286} - m_CaptionText: {fileID: 2033480132} - m_CaptionImage: {fileID: 0} - m_Placeholder: {fileID: 0} - m_ItemText: {fileID: 258509837} - m_ItemImage: {fileID: 0} - m_Value: 0 - m_Options: - m_Options: [] + m_Content: {fileID: 537139934} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 2043937261} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1934047390} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 m_OnValueChanged: m_PersistentCalls: m_Calls: [] - m_AlphaFadeSpeed: 0.15 ---- !u!114 &540464237 +--- !u!114 &741301288 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 540464233} + m_GameObject: {fileID: 741301285} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.054901965, g: 0.054901965, b: 0.054901965, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -2001,15 +1796,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &540464238 +--- !u!222 &741301289 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 540464233} + m_GameObject: {fileID: 741301285} m_CullTransparentMesh: 1 ---- !u!1 &562988047 +--- !u!1 &786896300 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2017,29 +1812,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 562988048} - - component: {fileID: 562988050} - - component: {fileID: 562988049} + - component: {fileID: 786896301} + - component: {fileID: 786896303} + - component: {fileID: 786896302} m_Layer: 5 - m_Name: Item Background + m_Name: Error message m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &562988048 +--- !u!224 &786896301 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 562988047} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 786896300} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 1808259963} + m_Father: {fileID: 1491563362} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -2047,139 +1842,177 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &562988049 +--- !u!114 &786896302 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 562988047} + m_GameObject: {fileID: 786896300} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_Color: {r: 0.05, g: 0.05, b: 0.05, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &562988050 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 562988047} - m_CullTransparentMesh: 1 ---- !u!1 &724612374 -GameObject: + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 40 + m_Alignment: 1 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &786896303 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 724612375} - - component: {fileID: 724612376} - - component: {fileID: 724612377} - m_Layer: 5 - m_Name: Toggle - Remember Me - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &724612375 -RectTransform: + m_GameObject: {fileID: 786896300} + m_CullTransparentMesh: 1 +--- !u!1001 &787012148 +PrefabInstance: m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 654334440} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: Button - Existing Wallet + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Continue with Existing Wallet + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!224 &787012149 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 787012148} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 724612374} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 351786045} - - {fileID: 1791429089} - m_Father: {fileID: 2036998554} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &724612376 +--- !u!114 &787012150 stripped MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 787012148} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 724612374} + m_GameObject: {fileID: 787012151} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 351786046} - toggleTransition: 1 - graphic: {fileID: 1900245910} - m_Group: {fileID: 0} - onValueChanged: - m_PersistentCalls: - m_Calls: [] - m_IsOn: 0 ---- !u!114 &724612377 +--- !u!1 &787012151 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 787012148} + m_PrefabAsset: {fileID: 0} +--- !u!114 &787012152 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 724612374} + m_GameObject: {fileID: 787012151} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} @@ -2193,7 +2026,7 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 ---- !u!1 &741301285 +--- !u!1 &814994757 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2201,79 +2034,46 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 741301286} - - component: {fileID: 741301289} - - component: {fileID: 741301288} - - component: {fileID: 741301287} + - component: {fileID: 814994758} + - component: {fileID: 814994760} + - component: {fileID: 814994759} m_Layer: 5 - m_Name: Template + m_Name: orLabel m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &741301286 + m_IsActive: 1 +--- !u!224 &814994758 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 741301285} + m_GameObject: {fileID: 814994757} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 2043937261} - - {fileID: 1934047389} - m_Father: {fileID: 540464234} + m_Children: [] + m_Father: {fileID: 311857776} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 2} - m_SizeDelta: {x: 0, y: 150} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &741301287 + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.35} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &814994759 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 741301285} + m_GameObject: {fileID: 814994757} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 537139934} - m_Horizontal: 0 - m_Vertical: 1 - m_MovementType: 2 - m_Elasticity: 0.1 - m_Inertia: 1 - m_DecelerationRate: 0.135 - m_ScrollSensitivity: 1 - m_Viewport: {fileID: 2043937261} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 1934047390} - m_HorizontalScrollbarVisibility: 0 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: 0 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &741301288 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 741301285} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -2284,25 +2084,84 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &741301289 + m_text: or + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 16 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 8 + m_fontSizeMax: 16 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &814994760 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 741301285} + m_GameObject: {fileID: 814994757} m_CullTransparentMesh: 1 ---- !u!1 &786896300 +--- !u!1 &850372066 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2310,221 +2169,172 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 786896301} - - component: {fileID: 786896303} - - component: {fileID: 786896302} + - component: {fileID: 850372067} + - component: {fileID: 850372069} + - component: {fileID: 850372068} m_Layer: 5 - m_Name: Error message + m_Name: HeaderLabel m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &786896301 +--- !u!224 &850372067 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 786896300} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 850372066} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 1491563362} + m_Father: {fileID: 311857776} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 0.85} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: -50, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &786896302 +--- !u!114 &850372068 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 786896300} + m_GameObject: {fileID: 850372066} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.05, g: 0.05, b: 0.05, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 20 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 0 - m_MaxSize: 40 - m_Alignment: 1 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: ---- !u!222 &786896303 + m_text: To Connect your Wallet Scan the QR Code below from your wallet + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 16 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 8 + m_fontSizeMax: 16 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &850372069 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 786896300} + m_GameObject: {fileID: 850372066} m_CullTransparentMesh: 1 ---- !u!1001 &787012148 -PrefabInstance: +--- !u!1 &920270119 +GameObject: m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 2036998554} - m_Modifications: - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_RootOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Name - value: Button - Existing Wallet - objectReference: {fileID: 0} - - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_text - value: Continue with Existing Wallet - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} ---- !u!224 &787012149 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 787012148} - m_PrefabAsset: {fileID: 0} ---- !u!114 &787012150 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 787012148} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 787012151} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &787012151 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 787012148} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} ---- !u!114 &787012152 -MonoBehaviour: + serializedVersion: 6 + m_Component: + - component: {fileID: 920270120} + m_Layer: 5 + m_Name: Header + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &920270120 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 787012151} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!1 &814994757 + m_GameObject: {fileID: 920270119} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 23680381} + - {fileID: 253290329} + m_Father: {fileID: 1880270956} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.725} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -25} + m_SizeDelta: {x: -50, y: -50} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &977353941 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2532,46 +2342,46 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 814994758} - - component: {fileID: 814994760} - - component: {fileID: 814994759} + - component: {fileID: 977353942} + - component: {fileID: 977353944} + - component: {fileID: 977353943} m_Layer: 5 - m_Name: orLabel + m_Name: Handle m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &814994758 +--- !u!224 &977353942 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 814994757} + m_GameObject: {fileID: 977353941} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 311857776} - m_RootOrder: 2 + m_Father: {fileID: 1513683686} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.25} - m_AnchorMax: {x: 1, y: 0.35} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.2} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &814994759 +--- !u!114 &977353943 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 814994757} + m_GameObject: {fileID: 977353941} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -2582,84 +2392,25 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: or - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 16 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 1 - m_fontSizeMin: 8 - m_fontSizeMax: 16 - m_fontStyle: 1 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &814994760 + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &977353944 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 814994757} + m_GameObject: {fileID: 977353941} m_CullTransparentMesh: 1 ---- !u!1 &850372066 +--- !u!1 &981405681 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2667,172 +2418,107 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 850372067} - - component: {fileID: 850372069} - - component: {fileID: 850372068} + - component: {fileID: 981405682} + - component: {fileID: 981405684} + - component: {fileID: 981405683} m_Layer: 5 - m_Name: HeaderLabel + m_Name: Toggle - Redirect To Wallet m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &850372067 +--- !u!224 &981405682 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 850372066} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 981405681} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 311857776} - m_RootOrder: 0 + m_Children: + - {fileID: 225123874} + - {fileID: 1642196834} + m_Father: {fileID: 654334440} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.85} - m_AnchorMax: {x: 1, y: 1} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -50, y: 0} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &850372068 +--- !u!114 &981405683 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 850372066} + m_GameObject: {fileID: 981405681} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: To Connect your Wallet Scan the QR Code below from your wallet - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 16 - m_fontSizeBase: 36 - m_fontWeight: 400 - m_enableAutoSizing: 1 - m_fontSizeMin: 8 - m_fontSizeMax: 16 - m_fontStyle: 1 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &850372069 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 850372066} - m_CullTransparentMesh: 1 ---- !u!1 &920270119 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 920270120} - m_Layer: 5 - m_Name: Header - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &920270120 -RectTransform: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &981405684 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 920270119} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 23680381} - - {fileID: 253290329} - m_Father: {fileID: 1880270956} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.725} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 1} ---- !u!1 &977353941 + m_GameObject: {fileID: 981405681} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 225123875} + toggleTransition: 1 + graphic: {fileID: 1583968965} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 0 +--- !u!1 &1023192743 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2840,43 +2526,43 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 977353942} - - component: {fileID: 977353944} - - component: {fileID: 977353943} + - component: {fileID: 1023192744} + - component: {fileID: 1023192746} + - component: {fileID: 1023192745} m_Layer: 5 - m_Name: Handle + m_Name: Item Checkmark m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &977353942 +--- !u!224 &1023192744 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 977353941} + m_GameObject: {fileID: 1023192743} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 1513683686} - m_RootOrder: 0 + m_Father: {fileID: 1808259963} + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0.2} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 10, y: 0} m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &977353943 +--- !u!114 &1023192745 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 977353941} + m_GameObject: {fileID: 1023192743} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -2890,8 +2576,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -2900,15 +2586,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &977353944 +--- !u!222 &1023192746 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 977353941} + m_GameObject: {fileID: 1023192743} m_CullTransparentMesh: 1 ---- !u!1 &981405681 +--- !u!1 &1278821650 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2916,250 +2602,29 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 981405682} - - component: {fileID: 981405684} - - component: {fileID: 981405683} + - component: {fileID: 1278821651} m_Layer: 5 - m_Name: Toggle - Redirect To Wallet + m_Name: Container m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 0 ---- !u!224 &981405682 +--- !u!224 &1278821651 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 981405681} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1278821650} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 225123874} - - {fileID: 1642196834} - m_Father: {fileID: 2036998554} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 295, y: -135} - m_SizeDelta: {x: 590, y: 50} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &981405683 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 981405681} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!114 &981405684 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 981405681} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 225123875} - toggleTransition: 1 - graphic: {fileID: 1583968965} - m_Group: {fileID: 0} - onValueChanged: - m_PersistentCalls: - m_Calls: [] - m_IsOn: 0 ---- !u!1 &1023192743 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1023192744} - - component: {fileID: 1023192746} - - component: {fileID: 1023192745} - m_Layer: 5 - m_Name: Item Checkmark - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1023192744 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1023192743} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1808259963} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 10, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1023192745 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1023192743} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1023192746 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1023192743} - m_CullTransparentMesh: 1 ---- !u!1 &1062946085 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1062946086} - m_Layer: 5 - m_Name: Column - Web3Auth - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1062946086 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1062946085} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 387303608} - m_Father: {fileID: 1434038408} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -50, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1278821650 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1278821651} - m_Layer: 5 - m_Name: Container - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &1278821651 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1278821650} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1561876541} - m_Father: {fileID: 395689440} - m_RootOrder: 0 + - {fileID: 1561876541} + m_Father: {fileID: 395689440} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -3207,37 +2672,19 @@ MonoBehaviour: m_GameObject: {fileID: 1334079840} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9473851428864b439d6561c87053272a, type: 3} + m_Script: {fileID: 11500000, guid: 96894e49d9863ec4db1d93a5e56f19cb, type: 3} m_Name: m_EditorClassIdentifier: - GelatoApiKey: _UzPz_Yk_WTjWMfcl45fLvQNGQ9ISx5ZE8TnwnVKYrE_ - Web3AuthSettings: - ClientId: BCc0wTmuXureEzgawhUSZOWu4bgWo56sZPrxLiHQCpg5OHcNrfa44esdTS8Dm77VtmaIyjhbthdWfbLhSwf7jtU - RedirectUri: torusapp://io.chainsafe.gamingsdk.sdkdemoscene/auth - Network: 1 - ExistingWalletButton: {fileID: 787012150} - RememberMeToggle: {fileID: 724612376} - ErrorPopup: {fileID: 1701305868} - Web3AuthButtons: - - Button: {fileID: 1996606959} - Provider: 0 - - Button: {fileID: 452118935} - Provider: 10 - - Button: {fileID: 374887657} - Provider: 1 - - Button: {fileID: 2114521194} - Provider: 2 - - Button: {fileID: 1452765489} - Provider: 3 - - Button: {fileID: 1508551058} - Provider: 4 + gelatoApiKey: _UzPz_Yk_WTjWMfcl45fLvQNGQ9ISx5ZE8TnwnVKYrE_ + errorPopup: {fileID: 1701305868} supportedWalletsDropdown: {fileID: 540464236} redirectToWalletToggle: {fileID: 981405684} - walletConnectModal: {fileID: 395689441} - k__BackingField: f4bff60eb260841f46b1c77588cd8acb - k__BackingField: Web3.Unity - k__BackingField: unity-game - k__BackingField: + loginButton: {fileID: 787012150} + rememberMeToggle: {fileID: 724612376} + projectId: f4bff60eb260841f46b1c77588cd8acb + projectName: Web3.Unity + baseContext: unity-game + metadata: Name: Web3.Unity Description: web3.unity is an open-source gaming SDK written in C# and developed by ChainSafe Gaming. It connects games built in the Unity game engine to the @@ -3252,187 +2699,7 @@ MonoBehaviour: Native: Universal: VerifyUrl: ---- !u!1 &1434038407 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1434038408} - m_Layer: 5 - m_Name: Columns - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1434038408 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1434038407} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1062946086} - - {fileID: 325001972} - - {fileID: 2036998554} - m_Father: {fileID: 1880270956} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.15} - m_AnchorMax: {x: 1, y: 0.725} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 1} ---- !u!1001 &1452765487 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 387303608} - m_Modifications: - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_RootOrder - value: 4 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Name - value: Button - Discord - objectReference: {fileID: 0} - - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_text - value: Continue with Discord - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} ---- !u!224 &1452765488 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1452765487} - m_PrefabAsset: {fileID: 0} ---- !u!114 &1452765489 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1452765487} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1452765490} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1452765490 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1452765487} - m_PrefabAsset: {fileID: 0} ---- !u!114 &1452765491 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1452765490} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 + walletConnectModal: {fileID: 395689441} --- !u!1 &1491563361 GameObject: m_ObjectHideFlags: 0 @@ -3465,154 +2732,12 @@ RectTransform: - {fileID: 8930114541282302188} m_Father: {fileID: 279245843} m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -21} - m_SizeDelta: {x: -32, y: -58} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1001 &1508551056 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 387303608} - m_Modifications: - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_RootOrder - value: 5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Name - value: Button - Twitch - objectReference: {fileID: 0} - - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_text - value: Continue with Twitch - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} ---- !u!224 &1508551057 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1508551056} - m_PrefabAsset: {fileID: 0} ---- !u!114 &1508551058 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1508551056} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1508551059} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1508551059 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1508551056} - m_PrefabAsset: {fileID: 0} ---- !u!114 &1508551060 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1508551059} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -21} + m_SizeDelta: {x: -32, y: -58} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1513683685 GameObject: m_ObjectHideFlags: 0 @@ -3804,6 +2929,85 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1583968963} m_CullTransparentMesh: 1 +--- !u!1 &1621534067 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1621534068} + - component: {fileID: 1621534069} + - component: {fileID: 1621534070} + m_Layer: 5 + m_Name: Container + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1621534068 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1621534067} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2036998554} + m_Father: {fileID: 1880270956} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.725} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1621534069 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1621534067} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 25 + m_Right: 25 + m_Top: 25 + m_Bottom: 25 + m_ChildAlignment: 0 + m_Spacing: 50 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1621534070 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1621534067} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 --- !u!1 &1642196833 GameObject: m_ObjectHideFlags: 0 @@ -3889,7 +3093,7 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 17.9 + m_fontSize: 8.2 m_fontSizeBase: 20 m_fontWeight: 400 m_enableAutoSizing: 1 @@ -4084,7 +3288,7 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 17.9 + m_fontSize: 10.1 m_fontSizeBase: 20 m_fontWeight: 400 m_enableAutoSizing: 1 @@ -4307,7 +3511,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 920270120} - - {fileID: 1434038408} + - {fileID: 1621534068} - {fileID: 395689440} - {fileID: 1701305867} m_Father: {fileID: 0} @@ -4623,226 +3827,84 @@ MonoBehaviour: m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: -15, y: 15, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1993078181 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1993078178} - m_CullTransparentMesh: 1 ---- !u!114 &1993078182 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1993078178} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1561876543} - m_OnClick: - m_PersistentCalls: - m_Calls: [] ---- !u!1001 &1996606957 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 387303608} - m_Modifications: - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_RootOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Name - value: Button - Google - objectReference: {fileID: 0} - - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_text - value: Continue with Google - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} ---- !u!224 &1996606958 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1996606957} - m_PrefabAsset: {fileID: 0} ---- !u!114 &1996606959 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1996606957} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1996606960} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &1996606960 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 1996606957} + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: -15, y: 15, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1993078181 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} ---- !u!114 &1996606961 + m_GameObject: {fileID: 1993078178} + m_CullTransparentMesh: 1 +--- !u!114 &1993078182 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1996606960} + m_GameObject: {fileID: 1993078178} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1561876543} + m_OnClick: + m_PersistentCalls: + m_Calls: [] --- !u!1 &2033480130 GameObject: m_ObjectHideFlags: 0 @@ -4987,7 +4049,6 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 2036998554} - - component: {fileID: 2036998555} - component: {fileID: 2036998556} m_Layer: 5 m_Name: Column - Existing Wallet @@ -5003,49 +4064,20 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2036998553} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 787012149} - - {fileID: 724612375} - - {fileID: 981405682} - - {fileID: 540464234} - m_Father: {fileID: 1434038408} - m_RootOrder: 2 + - {fileID: 654334440} + m_Father: {fileID: 1621534068} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.75} - m_AnchorMax: {x: 1, y: 1} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -50, y: 0} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &2036998555 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2036998553} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 0 - m_Spacing: 5 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 1 - m_ChildControlWidth: 1 - m_ChildControlHeight: 1 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2036998556 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5055,11 +4087,17 @@ MonoBehaviour: m_GameObject: {fileID: 2036998553} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} m_Name: m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 2 + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 300 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 --- !u!1 &2043937260 GameObject: m_ObjectHideFlags: 0 @@ -5227,148 +4265,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2045136593} m_CullTransparentMesh: 1 ---- !u!1001 &2114521192 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 387303608} - m_Modifications: - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.x - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Pivot.y - value: 0.5 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_RootOrder - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMax.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchorMin.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_SizeDelta.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_AnchoredPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_Name - value: Button - Reddit - objectReference: {fileID: 0} - - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - propertyPath: m_text - value: Continue with Reddit - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} ---- !u!224 &2114521193 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 2114521192} - m_PrefabAsset: {fileID: 0} ---- !u!114 &2114521194 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 2114521192} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2114521195} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!1 &2114521195 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} - m_PrefabInstance: {fileID: 2114521192} - m_PrefabAsset: {fileID: 0} ---- !u!114 &2114521196 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2114521195} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: 50 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 --- !u!1 &2126730551 GameObject: m_ObjectHideFlags: 0 diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs index ab56d293f..222f7a402 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Prefabs/Logout.cs @@ -10,8 +10,8 @@ public class Logout : MonoBehaviour public async void OnLogout() { // Remove the saved "remember me" data, if any - PlayerPrefs.DeleteKey(Login.SavedWalletConnectConfigKey); - + PlayerData.Clear(); + // Terminate Web3 await Web3Accessor.Web3.TerminateAsync(); @@ -19,6 +19,6 @@ public async void OnLogout() Web3Accessor.Clear(); // Go back to the first scene to log in again - SceneManager.LoadScene(0); + SceneManager.LoadScene(Login.LoginSceneIndex); } } diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Samples.asmdef b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Samples.asmdef index 6a3b2cabf..975c32f4a 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Samples.asmdef +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Samples.asmdef @@ -4,8 +4,7 @@ "references": [ "GUID:5426c6b788696eb4c88f4198b59839eb", "GUID:a37273c0f1cc99640b9cce89c64b02d0", - "GUID:6055be8ebefd69e48b49212b09b47b2f", - "chainsafe.web3-unity.web3auth" + "GUID:6055be8ebefd69e48b49212b09b47b2f" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/ExistingWalletLogin.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/ExistingWalletLogin.cs new file mode 100644 index 000000000..77b815c54 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/ExistingWalletLogin.cs @@ -0,0 +1,263 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using ChainSafe.Gaming.UnityPackage; +using ChainSafe.Gaming.WalletConnect; +using ChainSafe.Gaming.WalletConnect.Models; +using ChainSafe.Gaming.Web3.Build; +using Newtonsoft.Json; +using Scenes; +using TMPro; +using UnityEngine; +using UnityEngine.Assertions; +using UnityEngine.Networking; +using UnityEngine.Serialization; +using UnityEngine.UI; +using WalletConnectSharp.Core; +using WalletConnectSharp.Sign.Models; +using WalletConnectSharp.Sign.Models.Engine; + +/// +/// Login using an existing wallet using Wallet Connect. +/// +public class ExistingWalletLogin : Login +{ + [Header("UI")] [SerializeField] private TMP_Dropdown supportedWalletsDropdown; + + [SerializeField] private Toggle redirectToWalletToggle; + + [SerializeField] public Button loginButton; + + [SerializeField] private Toggle rememberMeToggle; + + [Header("Wallet Connect")] [SerializeField] + private string projectId; + + [SerializeField] public string projectName; + + [SerializeField] public string baseContext; + + [SerializeField] private Metadata metadata; + + [SerializeField] private WalletConnectModal walletConnectModal; + + // user isn't required to select wallet to redirect to wallet + // this is true for android platform since it natively supports WC protocol + private bool isRedirectionWalletAgnostic = false; + + private bool autoLogin; + + private bool redirectToWallet; + + private Dictionary supportedWallets; + + private WalletConnectConfig walletConnectConfig; + + private void OnDestroy() + { + if (walletConnectConfig != null) + { + walletConnectConfig.OnConnected -= WalletConnected; + + walletConnectConfig.OnSessionApproved -= SessionApproved; + } + } + + protected override IEnumerator Initialize() + { + Assert.IsNotNull(loginButton); + Assert.IsNotNull(rememberMeToggle); + +#if UNITY_ANDROID + + if (!Application.isEditor) + { + // user doesn't need to select wallet before login for redirection since Android supports the WC protocol + isRedirectionWalletAgnostic = true; + } + +#endif + + if (!isRedirectionWalletAgnostic) + { + yield return InitializeWalletSelection(); + } + + // try auto login first + var autoLoginTask = TryAutoLogin(); + + yield return new WaitUntil(() => autoLoginTask.IsCompleted); + + loginButton.onClick.AddListener(LoginClicked); + } + + private async void LoginClicked() + { + await TryLogin(); + } + + protected override Web3Builder ConfigureWeb3Services(Web3Builder web3Builder) + { + return web3Builder.Configure(services => + { + // Build config to use. + BuildWalletConnectConfig(); + + // Use wallet connect providers + services.UseWalletConnect(walletConnectConfig) + .UseWalletConnectSigner() + .UseWalletConnectTransactionExecutor(); + }); + } + + private async Task TryAutoLogin() + { + // get saved config from Player Data + walletConnectConfig = PlayerData.Instance.WalletConnectConfig; + + // should be null if config was never saved/cleared + if (walletConnectConfig == null) + { + return; + } + + Debug.Log("Attempting to Auto Login..."); + + try + { + autoLogin = true; + + await TryLogin(); + } + catch (Exception e) + { + Debug.LogError($"Auto Login Failed with Exception {e}"); + + autoLogin = false; + } + } + + // add all supported wallets + private IEnumerator InitializeWalletSelection() + { + yield return FetchSupportedWallets(); + + List supportedWalletNames = supportedWallets.Values.Select(w => w.Name).ToList(); + + supportedWalletsDropdown.AddOptions(supportedWalletNames); + + // user is only required to select wallet if redirect to wallet toggle is on + redirectToWalletToggle.onValueChanged.AddListener(supportedWalletsDropdown.gameObject.SetActive); + } + + private void BuildWalletConnectConfig() + { + // build chain + var projectConfig = ProjectConfigUtilities.Load(); + + ChainModel chain = new ChainModel(ChainModel.EvmNamespace, projectConfig.ChainId, projectConfig.Network); + + WalletConnectWalletModel defaultWallet = null; + + // allow redirection on editor for testing UI flow + redirectToWallet = autoLogin ? + // if it's an auto login get value from saved wallet config + walletConnectConfig.RedirectToWallet : redirectToWalletToggle.isOn; + + // needs wallet selected to redirect + if (redirectToWallet && !isRedirectionWalletAgnostic) + { + defaultWallet = autoLogin ? + // if it's an auto login get value from saved wallet config + walletConnectConfig.DefaultWallet : supportedWallets.Values.ToArray()[supportedWalletsDropdown.value]; + } + + walletConnectConfig = new WalletConnectConfig + { + ProjectId = projectId, + ProjectName = projectName, + BaseContext = baseContext, + Chain = chain, + Metadata = metadata, + // try and get saved value + SavedSessionTopic = walletConnectConfig?.SavedSessionTopic, + SupportedWallets = supportedWallets, + StoragePath = Application.persistentDataPath, + RedirectToWallet = redirectToWallet, + KeepSessionAlive = autoLogin || rememberMeToggle.isOn, + DefaultWallet = defaultWallet, + }; + + //subscribe to WC events + walletConnectConfig.OnConnected += WalletConnected; + + walletConnectConfig.OnSessionApproved += SessionApproved; + } + + private IEnumerator FetchSupportedWallets() + { + using (UnityWebRequest webRequest = UnityWebRequest.Get("https://registry.walletconnect.org/data/wallets.json")) + { + // Request and wait for the desired page. + yield return webRequest.SendWebRequest(); + + if (webRequest.result != UnityWebRequest.Result.Success) + { + Debug.LogError("Error Getting Supported Wallets: " + webRequest.error); + + yield return null; + } + + else + { + var json = webRequest.downloadHandler.text; + + supportedWallets = JsonConvert.DeserializeObject>(json) + .ToDictionary(w => w.Key, w => (WalletConnectWalletModel)w.Value); + + Debug.Log($"Fetched {supportedWallets.Count} Supported Wallets."); + } + } + } + + private void WalletConnected(ConnectedData data) + { + // already redirecting to wallet + if (walletConnectConfig.RedirectToWallet) + { + return; + } + + // might be null in case of auto login + if (!string.IsNullOrEmpty(data.Uri)) + { + // display QR and copy to clipboard + walletConnectModal.WalletConnected(data); + } + } + + private void SessionApproved(SessionStruct session) + { + // save/persist session + if (walletConnectConfig.KeepSessionAlive) + { + walletConnectConfig.SavedSessionTopic = session.Topic; + + PlayerData.Instance.WalletConnectConfig = walletConnectConfig; + + PlayerData.Save(); + } + + else + { + // reset if any saved config + PlayerData.Instance.WalletConnectConfig = null; + + PlayerData.Save(); + } + + Debug.Log($"{session.Topic} Approved"); + } +} \ No newline at end of file diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/ExistingWalletLogin.cs.meta b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/ExistingWalletLogin.cs.meta new file mode 100644 index 000000000..7bfcb0828 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/ExistingWalletLogin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 96894e49d9863ec4db1d93a5e56f19cb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs index c6a12c996..94370b03e 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/Login.cs @@ -1,366 +1,69 @@ using System; using System.Collections; -using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using ChainSafe.Gaming.Evm.Contracts; using ChainSafe.Gaming.Evm.JsonRpc; using ChainSafe.Gaming.UnityPackage; -using ChainSafe.Gaming.Wallets; -using ChainSafe.Gaming.WalletConnect; -using ChainSafe.Gaming.WalletConnect.Models; using ChainSafe.Gaming.Web3; using ChainSafe.Gaming.Web3.Build; using ChainSafe.Gaming.Web3.Unity; using ChainSafe.GamingSdk.Gelato; -using ChainSafe.GamingSdk.Web3Auth; -using Newtonsoft.Json; -using TMPro; using UnityEngine; -using UnityEngine.Assertions; -using UnityEngine.Networking; using UnityEngine.SceneManagement; -using UnityEngine.UI; -using WalletConnectSharp.Core; -using WalletConnectSharp.Sign.Models; -using WalletConnectSharp.Sign.Models.Engine; namespace Scenes { - [Serializable] - public class Web3AuthButtonAndProvider + public abstract class Login : MonoBehaviour { - public Button Button; - public Provider Provider; - } - - [Serializable] - public class Web3AuthSettings - { - public string ClientId; - public string RedirectUri; - public Web3Auth.Network Network; - } - - public class Login : MonoBehaviour - { - internal const string SavedWalletConnectConfigKey = "SavedWalletConnectConfig"; - - [Header("Configuration")] - public string GelatoApiKey = ""; - public Web3AuthSettings Web3AuthSettings; - - [Header("UI")] - public Button ExistingWalletButton; - public Toggle RememberMeToggle; - public ErrorPopup ErrorPopup; - public List Web3AuthButtons; - - private bool useWalletConnect; - - private bool redirectToWallet; - - private Dictionary supportedWallets; - - #region Wallet Connect - - private WalletConnectConfig walletConnectConfig; - - private bool autoLogin; - - [field: Header("Wallet Connect")] - - [SerializeField] private TMP_Dropdown supportedWalletsDropdown; - - [SerializeField] private Toggle redirectToWalletToggle; - - [SerializeField] private WalletConnectModal walletConnectModal; + public const string MainSceneName = "SampleMain"; - [field: SerializeField] public string ProjectId { get; private set; } + public static int LoginSceneIndex { get; private set; } = 0; - [field: SerializeField] public string ProjectName { get; private set; } - - [field: SerializeField] public string BaseContext { get; private set; } - - [field: SerializeField] - public Metadata Metadata { get; private set; } = new Metadata - { - Name = "Web3.Unity", - //from package.json - Description = "web3.unity is an open-source gaming SDK written in C# and developed by ChainSafe Gaming. It connects games built in the Unity game engine to the blockchain. The library currently supports games built for web browsers (WebGL), iOS/Android mobile, and desktop. web3.unity is compatible with most EVM-based chains such as Ethereum, Polygon, Moonbeam, Cronos, Nervos, and Binance Smart Chain, letting developers easily choose and switch between them to create the best in-game experience.", - Url = "https://chainsafe.io/" - }; - - #endregion + [SerializeField] private string gelatoApiKey = ""; + [SerializeField] private ErrorPopup errorPopup; + private IEnumerator Start() { - Assert.IsNotNull(Web3AuthButtons); - Assert.IsTrue(Web3AuthButtons.Count > 0); - Assert.IsTrue(Web3AuthButtons.All(b => b.Button)); - Assert.IsNotNull(ExistingWalletButton); - Assert.IsNotNull(RememberMeToggle); - - useWalletConnect = Application.platform != RuntimePlatform.WebGLPlayer; - - // Remember me only works with the WebPageWallet - RememberMeToggle.gameObject.SetActive(useWalletConnect); - - // Wallet Connect - yield return FetchSupportedWallets(); - - // enable this on editor to test UI flow and functions - if (Application.isMobilePlatform || Application.isEditor) - { - InitializeMobileOptions(); - } - -#if UNITY_WEBGL - ProcessWeb3Auth(); -#endif - var autoLoginTask = TryAutoLogin(); - - yield return new WaitUntil(() => autoLoginTask.IsCompleted); - - ExistingWalletButton.onClick.AddListener(OnLoginWithExistingAccount); - - foreach (var buttonAndProvider in Web3AuthButtons) - { - var button = buttonAndProvider.Button; - var provider = buttonAndProvider.Provider; - button.onClick.AddListener(() => LoginWithWeb3Auth(provider)); - } - } - - private void OnDestroy() - { - if (walletConnectConfig != null) - { - walletConnectConfig.OnConnected -= WalletConnected; - - walletConnectConfig.OnSessionApproved -= SessionApproved; - } - } - - private void WalletConnected(ConnectedData data) - { - // already redirecting to wallet - if (redirectToWallet) - { - return; - } - - // might be null in case of auto login - if (!string.IsNullOrEmpty(data.Uri)) - { - // display QR and copy to clipboard - walletConnectModal.WalletConnected(data); - } - } - - private void SessionApproved(SessionStruct session) - { - // save/persist session - if (walletConnectConfig.KeepSessionAlive) - { - walletConnectConfig.SavedSessionTopic = session.Topic; - - PlayerPrefs.SetString(SavedWalletConnectConfigKey, JsonConvert.SerializeObject(walletConnectConfig)); - } - - else - { - // reset if any saved config - PlayerPrefs.SetString(SavedWalletConnectConfigKey, null); - } - - Debug.Log($"{session.Topic} Approved"); - } - - // redirect to mobile wallet and select default wallet on IOS - private void InitializeMobileOptions() - { - redirectToWalletToggle.gameObject.SetActive(true); -#if UNITY_IOS - InitializeWalletDropdown(); -#endif - } - - // add all supported wallets - private void InitializeWalletDropdown() - { - redirectToWalletToggle.onValueChanged.AddListener(isOn => - { - supportedWalletsDropdown.gameObject.SetActive(isOn); - }); - - // first element is a no select - List supportedWalletsList = new List - { - // default option/unselected - "Select Wallet", - }; - - supportedWalletsList.AddRange(supportedWallets.Values.Select(w => w.Name)); - - supportedWalletsDropdown.AddOptions(supportedWalletsList); - } - - private async Task TryAutoLogin() - { - if (!useWalletConnect) - return; - - string savedConfigJson = PlayerPrefs.GetString(SavedWalletConnectConfigKey, null); - - if (string.IsNullOrEmpty(savedConfigJson)) - { - return; - } - - Debug.Log("Attempting to Auto Login..."); - - try - { - autoLogin = true; - - walletConnectConfig = JsonConvert.DeserializeObject(savedConfigJson); - - await LoginWithExistingAccount(); - } - catch (Exception e) - { - Debug.LogError($"Auto Login Failed with Exception {e}"); - - autoLogin = false; - } + yield return Initialize(); } - private async void OnLoginWithExistingAccount() - { -#if UNITY_IOS - // can't redirect to wallet on IOS if there's no selected wallet - if (redirectToWalletToggle.isOn && supportedWalletsDropdown.value == 0) - { - // feedback - Debug.LogError("Please select a Wallet first"); - - return; - } -#endif - - await LoginWithExistingAccount(); - } - - private async Task LoginWithExistingAccount() - { - var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) - .Configure(ConfigureCommonServices) - .Configure(services => - { - /* The WebGL wallet only works inside WebGL builds, - * and it makes little sense to use the web page wallet - * inside WebGL, so the choice can be automated here - * by looking at the platform we're running on. - */ - if (useWalletConnect) - { - services - .UseWalletConnectProvider(BuildWalletConnectConfig()) - .UseWalletConnectSigner() - .UseWalletConnectTransactionExecutor(); - } - else - { - services.UseWebGLWallet(); - } - }); - - await ProcessLogin(web3Builder); - } - - private async void LoginWithWeb3Auth(Provider provider) - { - var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) - .Configure(ConfigureCommonServices) - .Configure(services => - { - var web3AuthConfig = new Web3AuthWalletConfig - { - Web3AuthOptions = new() - { - clientId = Web3AuthSettings.ClientId, - redirectUrl = new Uri(Web3AuthSettings.RedirectUri), - network = Web3AuthSettings.Network, - whiteLabel = new() - { - dark = true, - defaultLanguage = "en", - name = "ChainSafe Gaming SDK", - } - }, - LoginParams = new() { loginProvider = provider } - }; - services.UseWeb3AuthWallet(web3AuthConfig); - }); - await ProcessLogin(web3Builder); - } - - private async void ProcessWeb3Auth() - { - var web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) - .Configure(ConfigureCommonServices) - .Configure(services => - { - var web3AuthConfig = new Web3AuthWalletConfig - { - Web3AuthOptions = new() - { - whiteLabel = new() - { - dark = true, - defaultLanguage = "en", - name = "ChainSafe Gaming SDK", - }, - clientId = Web3AuthSettings.ClientId, - redirectUrl = new Uri(Web3AuthSettings.RedirectUri), - network = Web3AuthSettings.Network, - - }, - }; - services.UseWeb3AuthWallet(web3AuthConfig); - }); - await ProcessLogin(web3Builder); - } - - - private async Task ProcessLogin(Web3Builder builder) + protected abstract IEnumerator Initialize(); + + protected abstract Web3Builder ConfigureWeb3Services(Web3Builder web3Builder); + + protected async Task TryLogin() { Web3 web3; + try { - web3 = await builder.BuildAsync(); - } - catch (Web3Exception) - { - ErrorPopup.ShowError($"Login failed, please try again\n(see console for more details)"); - throw; + Web3Builder web3Builder = new Web3Builder(ProjectConfigUtilities.Load()) + .Configure(ConfigureCommonServices); + + web3Builder = ConfigureWeb3Services(web3Builder); + + web3 = await web3Builder.BuildAsync(); } + catch (Exception) { - ErrorPopup.ShowError($"Unknown error occured\n(see console for more details)"); + errorPopup.ShowError("Login failed, please try again\n(see console for more details)"); throw; } - + Web3Accessor.Set(web3); - SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1); + + LoginSceneIndex = SceneManager.GetActiveScene().buildIndex; + + SceneManager.LoadScene(MainSceneName); } private void ConfigureCommonServices(IWeb3ServiceCollection services) { services .UseUnityEnvironment() - .UseGelato(GelatoApiKey) + .UseGelato(gelatoApiKey) .UseRpcProvider(); /* As many contracts as needed may be registered here. @@ -378,92 +81,5 @@ private void ConfigureCommonServices(IWeb3ServiceCollection services) "0x1d6f31b71e12a1a584ca20853495161c48ba491f")); } - - #region Wallet Connect - - private WalletConnectConfig BuildWalletConnectConfig() - { - // build chain - var projectConfig = ProjectConfigUtilities.Load(); - - ChainModel chain = new ChainModel(ChainModel.EvmNamespace, projectConfig.ChainId, projectConfig.Network); - -#if UNITY_IOS - WalletConnectWalletModel defaultWallet = null; -#endif - - // if it's an auto login get these values from saved wallet config - if (!autoLogin) - { - // allow redirection on editor for testing UI flow - redirectToWallet = (Application.isMobilePlatform || Application.isEditor) && redirectToWalletToggle.isOn; - -#if UNITY_IOS - // make sure there's a selected wallet on IOS - redirectToWallet = redirectToWallet && supportedWalletsDropdown.value != 0; - - if (redirectToWallet) - { - // offset for the first/default/unselected dropdown option 0 - int selectedWalletIndex = supportedWalletsDropdown.value - 1; - - defaultWallet = supportedWallets.Values.ToArray()[selectedWalletIndex]; - } -#endif - } - - var config = new WalletConnectConfig - { - ProjectId = ProjectId, - ProjectName = ProjectName, - BaseContext = BaseContext, - Chain = chain, - Metadata = Metadata, - SavedSessionTopic = autoLogin ? walletConnectConfig.SavedSessionTopic : null, - SupportedWallets = supportedWallets, - StoragePath = Application.persistentDataPath, - RedirectToWallet = autoLogin ? walletConnectConfig.RedirectToWallet : redirectToWallet, - KeepSessionAlive = autoLogin || RememberMeToggle.isOn, -#if UNITY_IOS - DefaultWallet = autoLogin ? walletConnectConfig.DefaultWallet : defaultWallet, -#endif - }; - - walletConnectConfig = config; - - walletConnectConfig.OnConnected += WalletConnected; - - walletConnectConfig.OnSessionApproved += SessionApproved; - - return config; - } - - private IEnumerator FetchSupportedWallets() - { - using (UnityWebRequest webRequest = UnityWebRequest.Get("https://registry.walletconnect.org/data/wallets.json")) - { - // Request and wait for the desired page. - yield return webRequest.SendWebRequest(); - - if (webRequest.result != UnityWebRequest.Result.Success) - { - Debug.LogError("Error Getting Supported Wallets: " + webRequest.error); - - yield return null; - } - - else - { - var json = webRequest.downloadHandler.text; - - supportedWallets = JsonConvert.DeserializeObject>(json) - .ToDictionary(w => w.Key, w => (WalletConnectWalletModel)w.Value); - - Debug.Log($"Fetched {supportedWallets.Count} Supported Wallets."); - } - } - } - - #endregion } } \ No newline at end of file diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/SampleNftTexture/LoadScene.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/SampleNftTexture/LoadScene.cs index 45bafdda0..fd1b1b79c 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/SampleNftTexture/LoadScene.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/SampleNftTexture/LoadScene.cs @@ -5,11 +5,9 @@ namespace Scenes.SampleNftTexture { public class LoadScene : MonoBehaviour { - public string SceneName = "SampleMain"; - public void Load() { - SceneManager.LoadScene(SceneName); + SceneManager.LoadScene(Login.LoginSceneIndex); } } } \ No newline at end of file diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/PlayerData.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/PlayerData.cs new file mode 100644 index 000000000..c9abc92ab --- /dev/null +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/PlayerData.cs @@ -0,0 +1,99 @@ +using System.Collections; +using System.Collections.Generic; +using System.IO; +using ChainSafe.Gaming.WalletConnect; +using Newtonsoft.Json; +using UnityEngine; + +/// +/// Player Data that can be persisted through runtime and sessions in a PlayerData.json file. +/// +/// Only serialize(Save and Load) fields and properties with the [JsonProperty] attribute. +[JsonObject(MemberSerialization.OptIn)] +public class PlayerData +{ + #region Save & Load + + private static string _path = $"{Path.Combine(Application.persistentDataPath, nameof(PlayerData))}.json"; + + /// + /// Singleton instance. + /// + public static PlayerData Instance { get; private set; } = new PlayerData(); + + private bool FileExists => File.Exists(_path); + + /// + /// Loads Data when runtime starts. + /// + [RuntimeInitializeOnLoadMethod] + public static void LoadOnStart() + { + Instance.LoadData(); + } + + private void LoadData() + { + if (!FileExists) + { + SaveData(); + + return; + } + + using (FileStream fs = new FileStream(_path, FileMode.Open, FileAccess.Read)) + using (StreamReader sr = new StreamReader(fs)) + { + string rawJson = sr.ReadToEnd(); + + Instance = JsonConvert.DeserializeObject(rawJson); + + Debug.Log($"{nameof(PlayerData)} loaded from path {_path}."); + } + } + + private void SaveData() + { + // create file + using (FileStream fs = new FileStream(_path, FileMode.OpenOrCreate, FileAccess.Write)) + using (StreamWriter sw = new StreamWriter(fs)) + { + sw.WriteLine(JsonConvert.SerializeObject(Instance)); + + Debug.Log($"{nameof(PlayerData)} saved at path {_path}."); + } + } + + /// + /// Save/Persist data in . + /// + public static void Save() + { + Instance.SaveData(); + } + + /// + /// Load saved/persisted data into + /// + public static void Load() + { + Instance.LoadData(); + } + + /// + /// Clear all data. + /// + public static void Clear() + { + Instance = new PlayerData(); + + Save(); + } + + #endregion + + /// + /// Saved Wallet Connect Config used for restoring session (Remember Me) Implementation. + /// + [JsonProperty] public WalletConnectConfig WalletConnectConfig { get; set; } +} diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/PlayerData.cs.meta b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/PlayerData.cs.meta new file mode 100644 index 000000000..14947b3b0 --- /dev/null +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/PlayerData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 059957c81c98a844c930372537e018dc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/SceneIndexer.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/SceneIndexer.cs index 8b36dab4b..5d4d54f43 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/SceneIndexer.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Utilities/SceneIndexer.cs @@ -1,27 +1,60 @@ #if UNITY_EDITOR +using System; using System.IO; using System.Linq; +using Scenes; using UnityEditor; using UnityEditor.PackageManager; using UnityEditor.PackageManager.UI; -using UnityEngine; using PackageInfo = UnityEditor.PackageManager.PackageInfo; [InitializeOnLoad] public static class SceneIndexer { - private const string ScenesIndexedKey = "ScenesIndexed"; + private const string ScenesIndexedKey = PackageName + "ScenesIndexed"; private const string PackageName = "io.chainsafe.web3-unity"; static SceneIndexer() { - if (SessionState.GetBool(ScenesIndexedKey, false)) + TryAddEditorBuildSettingsScenes(PackageName, ScenesIndexedKey, new string[] { + "SampleLogin.Unity", + $"{Login.MainSceneName}.Unity", + "SampleImportNftTexture.Unity", + }); + } + + public static void TryAddEditorBuildSettingsScenes(string packageName, string sessionKey, string[] scenes) + { + if (SessionState.GetBool(sessionKey, false)) + { + return; + } + + PackageInfo package = GetPackage(packageName); + + string importPath = GetImportPath(package); + + //scenes already added to build settings + if (EditorBuildSettings.scenes.Any(s => Path.GetFullPath(s.path).Contains(importPath))) + { + SessionState.SetBool(sessionKey, true); + return; } + // convert and add importPath to scenes path + EditorBuildSettingsScene[] editorBuildSettingsScenes = Array.ConvertAll(scenes, s => new EditorBuildSettingsScene(Path.Combine(importPath, s), true)); + + EditorBuildSettings.scenes = editorBuildSettingsScenes.Concat(EditorBuildSettings.scenes).ToArray(); + + SessionState.SetBool(sessionKey, true); + } + + private static PackageInfo GetPackage(string name) + { var listRequest = Client.List(); while (!listRequest.IsCompleted) @@ -31,38 +64,23 @@ static SceneIndexer() PackageInfo[] packages = listRequest.Result.ToArray(); - PackageInfo package = packages.FirstOrDefault(p => p.name == PackageName); + PackageInfo package = packages.FirstOrDefault(p => p.name == name); if (package == null) { - Debug.LogError($"Installed Package {PackageName} not found"); - - return; + throw new Exception($"Installed Package {name} not found"); } + + return package; + } + private static string GetImportPath(PackageInfo package) + { Sample sample = Sample.FindByPackage(package.name, package.version).FirstOrDefault(); string importPath = Path.GetRelativePath(Directory.GetCurrentDirectory(), sample.importPath); - importPath = Path.Combine(importPath, "Scenes"); - - //scenes already added to build settings - if (EditorBuildSettings.scenes.Any(s => Path.GetFullPath(s.path).Contains(importPath))) - { - SessionState.SetBool(ScenesIndexedKey, true); - - return; - } - - EditorBuildSettings.scenes = new EditorBuildSettingsScene[] - { - new EditorBuildSettingsScene(Path.Combine(importPath, "SampleLogin.Unity"), true), - new EditorBuildSettingsScene(Path.Combine(importPath, "SampleMain.Unity"), true), - new EditorBuildSettingsScene(Path.Combine(importPath, "SampleImportNftTexture.Unity"), true), - }.Concat(EditorBuildSettings.scenes) - .ToArray(); - - SessionState.SetBool(ScenesIndexedKey, true); + return Path.Combine(importPath, "Scenes"); } } From 1538469ec7b614dca92ae3d52fa8169591f4e960 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 30 Oct 2023 12:22:47 +0300 Subject: [PATCH 160/167] Wallet Dropdown in ExistingWalletLogin now only lists wallets available for current platform. --- .../UnityOperatingSystemMediator.cs | 31 ++++++++++--------- .../Models/WalletConnectWalletModel.cs | 23 ++++++++++++++ .../Scripts/Scenes/ExistingWalletLogin.cs | 9 ++++-- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/src/ChainSafe.Gaming.Unity/UnityOperatingSystemMediator.cs b/src/ChainSafe.Gaming.Unity/UnityOperatingSystemMediator.cs index b6a656643..eb2de644a 100644 --- a/src/ChainSafe.Gaming.Unity/UnityOperatingSystemMediator.cs +++ b/src/ChainSafe.Gaming.Unity/UnityOperatingSystemMediator.cs @@ -8,23 +8,26 @@ public class UnityOperatingSystemMediator : IOperatingSystemMediator { public bool IsMobilePlatform => Application.isMobilePlatform; - public Platform Platform + public Platform Platform => GetCurrentPlatform(); + + /// + /// Get current platform from for Unity. + /// + /// Current Runtime Platform. + public static Platform GetCurrentPlatform() { - get + if (Application.isEditor) { - if (Application.isEditor) - { - return Platform.Editor; - } - - return Application.platform switch - { - RuntimePlatform.IPhonePlayer => Platform.IOS, - RuntimePlatform.Android => Platform.Android, - RuntimePlatform.WebGLPlayer => Platform.WebGL, - _ => Platform.Desktop, - }; + return Platform.Editor; } + + return Application.platform switch + { + RuntimePlatform.IPhonePlayer => Platform.IOS, + RuntimePlatform.Android => Platform.Android, + RuntimePlatform.WebGLPlayer => Platform.WebGL, + _ => Platform.Desktop, + }; } public void OpenUrl(string url) => Application.OpenURL(url); diff --git a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs index 6323d075c..37b1a24f4 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs @@ -1,3 +1,4 @@ +using System; using System.Web; using ChainSafe.Gaming.Web3.Environment; using Newtonsoft.Json; @@ -117,5 +118,27 @@ private bool CanUseNativeProtocol(bool isMobilePlatform) return !string.IsNullOrWhiteSpace(nativeUrl) && nativeUrl != ":"; } + + /// + /// Is a wallet available for . + /// + /// Platform to wallet app availability. + /// True if wallet is available for . + public bool IsAvailableForPlatform(Platform platform) + { + switch (platform) + { + case Platform.Editor: case Platform.Desktop: + return CanUseNativeProtocol(false) || !string.IsNullOrEmpty(Desktop.UniversalUrl); + + case Platform.Android: case Platform.IOS: + return CanUseNativeProtocol(true) || !string.IsNullOrEmpty(Mobile.UniversalUrl); + + // currently Wallet Connect doesn't support WebGL. + default: + WCLogger.Log($"Unsupported Platform {platform}"); + return false; + } + } } } \ No newline at end of file diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/ExistingWalletLogin.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/ExistingWalletLogin.cs index 77b815c54..ec1fe181c 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/ExistingWalletLogin.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0/Web3.Unity Samples/Scripts/Scenes/ExistingWalletLogin.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using ChainSafe.Gaming.Unity; using ChainSafe.Gaming.UnityPackage; using ChainSafe.Gaming.WalletConnect; using ChainSafe.Gaming.WalletConnect.Models; @@ -214,9 +215,13 @@ private IEnumerator FetchSupportedWallets() { var json = webRequest.downloadHandler.text; - supportedWallets = JsonConvert.DeserializeObject>(json) - .ToDictionary(w => w.Key, w => (WalletConnectWalletModel)w.Value); + supportedWallets = JsonConvert.DeserializeObject>(json); + // make sure supported wallet is also supported on platform + supportedWallets = supportedWallets + .Where(w => w.Value.IsAvailableForPlatform(UnityOperatingSystemMediator.GetCurrentPlatform())) + .ToDictionary(p => p.Key, p => p.Value); + Debug.Log($"Fetched {supportedWallets.Count} Supported Wallets."); } } From d13558d15969d09c56bb49e6e683419391922eda Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 30 Oct 2023 09:23:33 +0000 Subject: [PATCH 161/167] Auto-duplicate Packages Samples --- .../Web3.Unity/Scripts/Scenes/ExistingWalletLogin.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/ExistingWalletLogin.cs b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/ExistingWalletLogin.cs index 77b815c54..ec1fe181c 100644 --- a/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/ExistingWalletLogin.cs +++ b/Packages/io.chainsafe.web3-unity/Samples~/Web3.Unity/Scripts/Scenes/ExistingWalletLogin.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using ChainSafe.Gaming.Unity; using ChainSafe.Gaming.UnityPackage; using ChainSafe.Gaming.WalletConnect; using ChainSafe.Gaming.WalletConnect.Models; @@ -214,9 +215,13 @@ private IEnumerator FetchSupportedWallets() { var json = webRequest.downloadHandler.text; - supportedWallets = JsonConvert.DeserializeObject>(json) - .ToDictionary(w => w.Key, w => (WalletConnectWalletModel)w.Value); + supportedWallets = JsonConvert.DeserializeObject>(json); + // make sure supported wallet is also supported on platform + supportedWallets = supportedWallets + .Where(w => w.Value.IsAvailableForPlatform(UnityOperatingSystemMediator.GetCurrentPlatform())) + .ToDictionary(p => p.Key, p => p.Value); + Debug.Log($"Fetched {supportedWallets.Count} Supported Wallets."); } } From deba5b2c4a6affc34b875e6393c6a6ec555a33cb Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 30 Oct 2023 13:11:11 +0300 Subject: [PATCH 162/167] lint fix --- .../Models/WalletConnectWalletModel.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs index a7e45f25c..123073198 100644 --- a/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs +++ b/src/ChainSafe.Gaming.WalletConnect/Models/WalletConnectWalletModel.cs @@ -150,10 +150,12 @@ public bool IsAvailableForPlatform(Platform platform) { switch (platform) { - case Platform.Editor: case Platform.Desktop: + case Platform.Editor: + case Platform.Desktop: return CanUseNativeProtocol(false) || !string.IsNullOrEmpty(Desktop.UniversalUrl); - case Platform.Android: case Platform.IOS: + case Platform.Android: + case Platform.IOS: return CanUseNativeProtocol(true) || !string.IsNullOrEmpty(Mobile.UniversalUrl); // currently Wallet Connect doesn't support WebGL. From dfe50526e046a620656698d88777792acc0ba01d Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 30 Oct 2023 15:40:14 +0300 Subject: [PATCH 163/167] fixed missing namespace issue --- .../2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs index 9aae69268..7e399015d 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Threading.Tasks; using ChainSafe.Gaming.Web3.Build; using ChainSafe.GamingSdk.Web3Auth; using Scenes; From 2ca08aa334770e55847242c2b7b859f41857a031 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Mon, 30 Oct 2023 12:40:51 +0000 Subject: [PATCH 164/167] Auto-duplicate Packages Samples --- .../Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs index 9aae69268..7e399015d 100644 --- a/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs +++ b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Threading.Tasks; using ChainSafe.Gaming.Web3.Build; using ChainSafe.GamingSdk.Web3Auth; using Scenes; From deb0f2d598be8e001fdfd79dd4a757f68170ce29 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 31 Oct 2023 17:46:50 +0300 Subject: [PATCH 165/167] small nonce and send transaction bug fix --- .../WalletConnectTransactionExecutor.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs index 5b409fcc8..668100095 100644 --- a/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs +++ b/src/ChainSafe.Gaming.WalletConnect/WalletConnectTransactionExecutor.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using ChainSafe.Gaming.Evm.Providers; +using ChainSafe.Gaming.Evm.Signers; using ChainSafe.Gaming.Evm.Transactions; using ChainSafe.Gaming.WalletConnect.Methods; using ChainSafe.Gaming.WalletConnect.Models; @@ -19,16 +20,20 @@ public class WalletConnectTransactionExecutor : ITransactionExecutor, ILifecycle private readonly IRpcProvider rpcProvider; + private readonly ISigner signer; + /// /// Initializes a new instance of the class. /// /// Wallet Connect Provider that connects wallet and makes jsom RPC requests via Wallet Connect. /// Provider for getting transaction receipt. - public WalletConnectTransactionExecutor(IWalletConnectCustomProvider walletConnectCustomProvider, IRpcProvider rpcProvider) + public WalletConnectTransactionExecutor(IWalletConnectCustomProvider walletConnectCustomProvider, IRpcProvider rpcProvider, ISigner signer) { this.walletConnectCustomProvider = walletConnectCustomProvider; this.rpcProvider = rpcProvider; + + this.signer = signer; } /// @@ -55,6 +60,11 @@ public WalletConnectTransactionExecutor(IWalletConnectCustomProvider walletConne /// Throws Exception if executing transaction fails. public async Task SendTransaction(TransactionRequest transaction) { + if (string.IsNullOrEmpty(transaction.From)) + { + transaction.From = await signer.GetAddress(); + } + EthSendTransaction requestData = new EthSendTransaction(new TransactionModel { From = transaction.From, From e5ec3d440506b4558c53bcd9e9fad98aa4613802 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 31 Oct 2023 20:30:36 +0300 Subject: [PATCH 166/167] fixed WebGL login issue --- .../Scripts/Web3AuthLogin.cs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs index 7e399015d..93b677735 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK Web3Auth/2.5.1/Web3.Unity Web3Auth Samples/Scripts/Web3AuthLogin.cs @@ -39,13 +39,18 @@ public struct ProviderAndButtonPair protected override IEnumerator Initialize() { -#if UNITY_WEBGL - - useProvider = false; +#if UNITY_WEBGL && !UNITY_EDITOR + Uri uri = new Uri(Application.absoluteURL); - Task loginTask = TryLogin(); + // make sure this load isn't redirected from Web3Auth a login + if (!string.IsNullOrEmpty(uri.Fragment)) + { + useProvider = false; - yield return new WaitUntil(() => loginTask.IsCompleted); + Task loginTask = TryLogin(); + + yield return new WaitUntil(() => loginTask.IsCompleted); + } #endif // add provider buttons listeners From d131ba0cc6bb0ff2f0f68635d362c8d27c929fe3 Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Tue, 31 Oct 2023 17:31:05 +0000 Subject: [PATCH 167/167] Auto-duplicate Packages Samples --- .../Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs index 7e399015d..93b677735 100644 --- a/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs +++ b/Packages/io.chainsafe.web3-unity.web3auth/Samples~/Web3.Unity Web3Auth/Scripts/Web3AuthLogin.cs @@ -39,13 +39,18 @@ public struct ProviderAndButtonPair protected override IEnumerator Initialize() { -#if UNITY_WEBGL - - useProvider = false; +#if UNITY_WEBGL && !UNITY_EDITOR + Uri uri = new Uri(Application.absoluteURL); - Task loginTask = TryLogin(); + // make sure this load isn't redirected from Web3Auth a login + if (!string.IsNullOrEmpty(uri.Fragment)) + { + useProvider = false; - yield return new WaitUntil(() => loginTask.IsCompleted); + Task loginTask = TryLogin(); + + yield return new WaitUntil(() => loginTask.IsCompleted); + } #endif // add provider buttons listeners

?fs37K_TXgUdmULR~;MMaHC2NS->Wh+YdC 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 literal 0 HcmV?d00001 diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.dll.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.dll.meta new file mode 100644 index 000000000..c41105a28 --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 6277c3373576a9d4abbcf8883313f233 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scenes/SampleLogin.unity b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scenes/SampleLogin.unity index 1b43c8193..95d634851 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scenes/SampleLogin.unity +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scenes/SampleLogin.unity @@ -332,6 +332,207 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 108583391} m_CullTransparentMesh: 1 +--- !u!1 &125483104 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 125483105} + - component: {fileID: 125483107} + - component: {fileID: 125483106} + m_Layer: 5 + m_Name: QrCodeImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &125483105 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125483104} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 311857776} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.35} + m_AnchorMax: {x: 1, y: 0.85} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &125483106 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125483104} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &125483107 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 125483104} + m_CullTransparentMesh: 1 +--- !u!1001 &212403312 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 311857776} + m_Modifications: + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMax.y + value: 0.25 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.x + value: -50 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_SizeDelta.y + value: -50 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8775736491206355084, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_Name + value: CopyToClipboardButton + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_text + value: Copy to Clipboard + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_fontSize + value: 16 + objectReference: {fileID: 0} + - target: {fileID: 8781309615174179339, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + propertyPath: m_fontSizeMax + value: 16 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} +--- !u!224 &212403313 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4764608378852082086, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 212403312} + m_PrefabAsset: {fileID: 0} +--- !u!114 &212403314 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7324590823460843055, guid: 50ad8ea555027414b8ddfc03fc7d41ab, type: 3} + m_PrefabInstance: {fileID: 212403312} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &253290328 GameObject: m_ObjectHideFlags: 0 @@ -545,6 +746,86 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 279245842} m_CullTransparentMesh: 1 +--- !u!1 &311857775 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 311857776} + - component: {fileID: 311857778} + - component: {fileID: 311857777} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &311857776 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311857775} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 850372067} + - {fileID: 125483105} + - {fileID: 814994758} + - {fileID: 212403313} + m_Father: {fileID: 1561876541} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -100, y: -200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &311857777 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311857775} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.101960786, g: 0.101960786, b: 0.10980392, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &311857778 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311857775} + m_CullTransparentMesh: 1 --- !u!1 &325001971 GameObject: m_ObjectHideFlags: 0 @@ -1071,7 +1352,7 @@ GameObject: - component: {fileID: 395689440} - component: {fileID: 395689441} m_Layer: 5 - m_Name: QrPreviewer + m_Name: WalletConnectModal m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -1088,14 +1369,15 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] + m_Children: + - {fileID: 1278821651} m_Father: {fileID: 1880270956} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 100, y: 100} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &395689441 MonoBehaviour: @@ -1109,7 +1391,10 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: fb890e484538c444da09be8d0f89dcd8, type: 3} m_Name: m_EditorClassIdentifier: - _qrCodeImage: {fileID: 0} + _qrCodeImage: {fileID: 125483106} + _copyToClipboardButton: {fileID: 212403314} + _backButton: {fileID: 1561876542} + _container: {fileID: 1278821651} --- !u!1001 &452118933 PrefabInstance: m_ObjectHideFlags: 0 @@ -1650,7 +1935,7 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 ---- !u!1 &920270119 +--- !u!1 &814994757 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1658,36 +1943,306 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 920270120} + - component: {fileID: 814994758} + - component: {fileID: 814994760} + - component: {fileID: 814994759} m_Layer: 5 - m_Name: Header + m_Name: orLabel m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &920270120 +--- !u!224 &814994758 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 920270119} + m_GameObject: {fileID: 814994757} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 23680381} - - {fileID: 253290329} - m_Father: {fileID: 1880270956} - m_RootOrder: 0 + m_Children: [] + m_Father: {fileID: 311857776} + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.725} - m_AnchorMax: {x: 1, y: 1} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.35} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 1} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &814994759 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 814994757} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: or + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 16 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 8 + m_fontSizeMax: 16 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &814994760 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 814994757} + m_CullTransparentMesh: 1 +--- !u!1 &850372066 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 850372067} + - component: {fileID: 850372069} + - component: {fileID: 850372068} + m_Layer: 5 + m_Name: HeaderLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &850372067 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 850372066} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 311857776} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.85} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -50, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &850372068 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 850372066} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: To Connect your Wallet Scan the QR Code below from your wallet + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 16 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 8 + m_fontSizeMax: 16 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &850372069 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 850372066} + m_CullTransparentMesh: 1 +--- !u!1 &920270119 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 920270120} + m_Layer: 5 + m_Name: Header + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &920270120 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920270119} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 23680381} + - {fileID: 253290329} + m_Father: {fileID: 1880270956} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.725} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 1} --- !u!1 &1062946085 GameObject: m_ObjectHideFlags: 0 @@ -1725,6 +2280,43 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: -50, y: 0} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1278821650 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1278821651} + m_Layer: 5 + m_Name: Container + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1278821651 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1278821650} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1561876541} + m_Father: {fileID: 395689440} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1334079840 GameObject: m_ObjectHideFlags: 0 @@ -2169,6 +2761,128 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 +--- !u!1 &1561876540 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1561876541} + - component: {fileID: 1561876544} + - component: {fileID: 1561876543} + - component: {fileID: 1561876542} + m_Layer: 5 + m_Name: Backdrop + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1561876541 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1561876540} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 311857776} + m_Father: {fileID: 1278821651} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1561876542 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1561876540} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1561876543} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1561876543 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1561876540} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.5019608} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1561876544 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1561876540} + m_CullTransparentMesh: 1 --- !u!1 &1701305866 GameObject: m_ObjectHideFlags: 0 diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs deleted file mode 100644 index 442bfff78..000000000 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using ChainSafe.Gaming.UnityPackage; -using ChainSafe.Gaming.Wallets; -using ChainSafe.Gaming.Wallets.WalletConnect; -using ChainSafe.Gaming.Web3; -using Scenes; -using UnityEngine; -using UnityEngine.UI; -using Web3Unity.Scripts; - -public class QrCodePreviewer : MonoBehaviour -{ - [SerializeField] private Image _qrCodeImage; - - public void Start() - { - WebPageWallet.OnConnected += data => - { - MainThreadDispatcher.Instance.Invoke(delegate - { - Debug.LogError(data.Uri); - }); - }; - - WebPageWallet.OnSessionApproved += session => - { - MainThreadDispatcher.Instance.Invoke(delegate - { - Debug.LogError(session.Peer.PublicKey); - - Debug.LogError(session.Self.PublicKey); - }); - }; - } -} diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs new file mode 100644 index 000000000..f663b226f --- /dev/null +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs @@ -0,0 +1,99 @@ +using System; +using ChainSafe.Gaming.UnityPackage; +using ChainSafe.Gaming.Wallets; +using ChainSafe.Gaming.Wallets.WalletConnect; +using ChainSafe.Gaming.Web3; +using QRCoder; +using QRCoder.Unity; +using Scenes; +using UnityEngine; +using UnityEngine.UI; +using WalletConnectSharp.Sign.Models; +using WalletConnectSharp.Sign.Models.Engine; +using Web3Unity.Scripts; + +public class WalletConnectModal : MonoBehaviour +{ + [SerializeField] private Image _qrCodeImage; + [SerializeField] private Button _copyToClipboardButton; + [SerializeField] private Button _backButton; + + [SerializeField] private Transform _container; + + private void Start() + { + _backButton.onClick.AddListener(Disable); + + WebPageWallet.OnConnected += WalletConnected; + + WebPageWallet.OnSessionApproved += SessionApproved; + } + + private void WalletConnected(ConnectedData data) + { + MainThreadDispatcher.Instance.Invoke(delegate + { + // enable display + _container.gameObject.SetActive(true); + + string uri = data.Uri; + + GenerateQrCode(uri); + + SetClipboard(uri); + }); + } + + private void SessionApproved(SessionStruct session) + { + MainThreadDispatcher.Instance.Invoke(delegate + { + // disable display + Disable(); + + Debug.Log($"{session.Topic} Approved"); + }); + } + + private void SetClipboard(string uri) + { + _copyToClipboardButton.onClick.RemoveAllListeners(); + + _copyToClipboardButton.onClick.AddListener(delegate + { + GUIUtility.systemCopyBuffer = uri; + }); + } + + private void GenerateQrCode(string uri) + { + Debug.Log("Connecting to: " + uri); + QRCodeGenerator generator = new QRCodeGenerator(); + QRCodeData data = generator.CreateQrCode(uri, QRCodeGenerator.ECCLevel.Q); + UnityQRCode qrCode = new UnityQRCode(data); + + // pixelsPerModule:10 gives us a 690x690 pixel image. + Texture2D qrCodeAsTexture2D = qrCode.GetGraphic(pixelsPerModule:10); + + // Change the filtering mode to point (i.e. nearest) rather than the default of linear - we want sharp edges on + // the blocks, not blurry interpolated edges! + qrCodeAsTexture2D.filterMode = FilterMode.Point; + + // Convert the texture into a sprite and assign it to our QR code image + var qrCodeSprite = Sprite.Create(qrCodeAsTexture2D, new Rect(0, 0, qrCodeAsTexture2D.width, qrCodeAsTexture2D.height), + new Vector2(0.5f, 0.5f), 100f); + _qrCodeImage.sprite = qrCodeSprite; + } + + private void Disable() + { + _container.gameObject.SetActive(false); + } + + private void OnDisable() + { + WebPageWallet.OnConnected -= WalletConnected; + + WebPageWallet.OnSessionApproved -= SessionApproved; + } +} diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs.meta similarity index 100% rename from src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/QrCodePreviewer.cs.meta rename to src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Scripts/Utilities/WalletConnectModal.cs.meta From e83d5465b8555beb31bce383ef3e7a64f2ec40ed Mon Sep 17 00:00:00 2001 From: robGG1997 Date: Fri, 22 Sep 2023 15:17:16 +0300 Subject: [PATCH 009/167] switched QrCoder with ZXing for generating QrCode Images --- .../Web3.Unity Samples/Libraries.meta | 2 +- .../Libraries/QRCoder.Unity.dll | Bin 6144 -> 0 bytes .../Web3.Unity Samples/Libraries/QRCoder.dll | Bin 124416 -> 0 bytes .../Libraries/QRCoder.dll.meta | 33 --------- .../Libraries/zxing.unity.dll | Bin 0 -> 473600 bytes ...er.Unity.dll.meta => zxing.unity.dll.meta} | 2 +- .../Scripts/Utilities/WalletConnectModal.cs | 68 ++++++++---------- 7 files changed, 33 insertions(+), 72 deletions(-) delete mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.Unity.dll delete mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.dll delete mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.dll.meta create mode 100644 src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/zxing.unity.dll rename src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/{QRCoder.Unity.dll.meta => zxing.unity.dll.meta} (93%) diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries.meta b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries.meta index 0ffb507b3..063137848 100644 --- a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries.meta +++ b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e022dc06aabcc8f448b3d82b4c4988a3 +guid: ce13820d6d63df9428e5c3e09c97446c folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.Unity.dll b/src/UnitySampleProject/Assets/Samples/web3.unity SDK/2.5.0-pre001/Web3.Unity Samples/Libraries/QRCoder.Unity.dll deleted file mode 100644 index 535f8d24f43dec9ef1be5fa9374c1381722e9849..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 zcmeHLU2Ggz6+Sbwf7#fZuAMml>Eusx;(DItsRhIf4-MbBv+JL@ zKzTqasCPZzoOABE=bn4cnLBqpe(o7Eh$w>V?p>nWxN{p&_^;tAx>NW6C`Gqc-PwLy zJ9cOL^o;GBRq2(bRWS>e>w1Bi7pAPartO-;C#KAbR}`7n*5s~+>4_1dW12x*ZvFLq zbGEl=hq+qofpJI@p>(JlcN5nDE~5Jst%rWIfc;nPDiCsR1`T|kRrzo6-e6gT_U;2j zCzu!@nprTyf=0VU)B^H$7txlc?1S9R1=p2!0{qb><1&Gm3&0<31)xu@wc$57)l8yG z8R^RcIOW>_h!`%l9^4yk0N!V$a6BlouXG6)+v>ozqzw=aEnyY8i{pyMzUdUD$PPj} zi8Lks&taS1iL52}?$C|SHB3AL0{$jD(+u!Fws%rDBAroCQH7xpQ?>U*=u5a`?zAp} zRT&3(Z5S!x(-PKehYUr4ilwC9vB6u5yJ=w2o$FY#;as#*a zOU4s1e?59THvsmsZ!!7?Cc_MAy>lak-X@040OMRT7Tet6qdt>!>J6gI{$Dp99-u+5>8ofS zQBDJ6h{8M~vIlq{^(s81a8O}R;Yo#O6_(z7&p;%8r4nUYh=>5=t=4V zO1&4@sqd%n($DBH=)?LDy#oDF;HQn_82bxZsEM`c)qtOY#kKSc<9n2$)$~VTJG}$kOerlxJ83c{H z2b`iG0?*TLfd%><@G`~q-E@kcqsQq6MXrYRiy$`IJmS2_5&eLUs~!!JU3|$rzf`3$ zGOQjj$80~i)Js{<@#MZf`uMn4tU2Ogn#OyhCPm*c`SulYM&VgHIhnk z%4I9>h(%e}tDLrddzoy|_eCY|)TixWsp^7QT18Q@BleZlNeX)0_ju3|XFHO}rKiG*mwL`Mz�gu6K**O$vo0{xltf8qw<$2 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