From 444bbd41af6dcb3aac4654e1f4b3a85b922f5c43 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Wed, 30 Apr 2025 13:05:50 -0400 Subject: [PATCH 001/165] Create EcosystemWallet directory and asmdef --- .../Sequence/SequenceSDK/EcosystemWallet.meta | 3 +++ .../SequenceEcosystemWallet.asmdef | 18 ++++++++++++++++++ .../SequenceEcosystemWallet.asmdef.meta | 7 +++++++ 3 files changed, 28 insertions(+) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet.meta new file mode 100644 index 00000000..1a010495 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ff5795dc6e3e4e21b2fb05e7eafee03a +timeCreated: 1746032644 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef new file mode 100644 index 00000000..68c665d8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef @@ -0,0 +1,18 @@ +{ + "name": "SequenceEcosystemWallet", + "rootNamespace": "", + "references": [ + "GUID:a35e3a53d4439435f8b36ed2c6158cd8", + "GUID:b4f9c0f8f363f439b9e337f79050f189", + "GUID:f7fd4ba36aabd1d499450c174865e70b" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef.meta new file mode 100644 index 00000000..839e232d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8cb4ab25ee18e4b4da9647cf481addbb +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 2edbb3936cced811206a6eeec0d32439af875c1c Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Wed, 30 Apr 2025 13:09:45 -0400 Subject: [PATCH 002/165] Added default namespace to asmdef --- .../SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef index 68c665d8..78f2cb74 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef @@ -1,6 +1,6 @@ { "name": "SequenceEcosystemWallet", - "rootNamespace": "", + "rootNamespace": "Sequence.EcosystemWallet", "references": [ "GUID:a35e3a53d4439435f8b36ed2c6158cd8", "GUID:b4f9c0f8f363f439b9e337f79050f189", From a83e46ce7898fc5ce0ab34ff5f6fcb3325c2dd9f Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Wed, 30 Apr 2025 15:52:51 -0400 Subject: [PATCH 003/165] Added Payload and related data types --- .../EcosystemWallet/Primitives.meta | 3 + .../Primitives/BehaviourOnError.cs | 13 +++++ .../Primitives/BehaviourOnError.cs.meta | 3 + .../EcosystemWallet/Primitives/Call.cs | 30 ++++++++++ .../EcosystemWallet/Primitives/Call.cs.meta | 3 + .../EcosystemWallet/Primitives/Calls.cs | 23 ++++++++ .../EcosystemWallet/Primitives/Calls.cs.meta | 3 + .../Primitives/ConfigUpdate.cs | 18 ++++++ .../Primitives/ConfigUpdate.cs.meta | 3 + .../EcosystemWallet/Primitives/Digest.cs | 18 ++++++ .../EcosystemWallet/Primitives/Digest.cs.meta | 3 + .../EcosystemWallet/Primitives/Message.cs | 18 ++++++ .../Primitives/Message.cs.meta | 3 + .../EcosystemWallet/Primitives/Parent.cs | 17 ++++++ .../EcosystemWallet/Primitives/Parent.cs.meta | 3 + .../EcosystemWallet/Primitives/Payload.cs | 56 +++++++++++++++++++ .../Primitives/Payload.cs.meta | 3 + .../Primitives/TypedDataToSign.cs | 54 ++++++++++++++++++ .../Primitives/TypedDataToSign.cs.meta | 3 + 19 files changed, 277 insertions(+) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/BehaviourOnError.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/BehaviourOnError.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives.meta new file mode 100644 index 00000000..6951ccb0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c0bfc9f1c6d7429e8b04f0bf438b4d99 +timeCreated: 1746032869 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/BehaviourOnError.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/BehaviourOnError.cs new file mode 100644 index 00000000..4acebba5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/BehaviourOnError.cs @@ -0,0 +1,13 @@ +using Newtonsoft.Json; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + [JsonConverter(typeof(EnumConverter))] + public enum BehaviourOnError + { + ignore, + revert, + abort + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/BehaviourOnError.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/BehaviourOnError.cs.meta new file mode 100644 index 00000000..9d04ed96 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/BehaviourOnError.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9f25eae0736046da9612dc52d937ef66 +timeCreated: 1746033166 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs new file mode 100644 index 00000000..204a6910 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs @@ -0,0 +1,30 @@ +using System; +using System.Numerics; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + internal class Call + { + public Address to; + public BigInteger value; + public byte[] data; + public BigInteger gasLimit; + public bool delegateCall; + public bool onlyFallback; + public BehaviourOnError behaviorOnError; + + [Preserve] + public Call(Address to, BigInteger value, byte[] data, BigInteger gasLimit, bool delegateCall, bool onlyFallback, BehaviourOnError behaviorOnError) + { + this.to = to; + this.value = value; + this.data = data; + this.gasLimit = gasLimit; + this.delegateCall = delegateCall; + this.onlyFallback = onlyFallback; + this.behaviorOnError = behaviorOnError; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs.meta new file mode 100644 index 00000000..4514005a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 369bb8e145da43f98cb5743d2d1af31c +timeCreated: 1746033079 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs new file mode 100644 index 00000000..388efb7a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs @@ -0,0 +1,23 @@ +using System; +using System.Numerics; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + internal class Calls : Payload + { + public override PayloadType type => PayloadType.Call; + public BigInteger space; + public BigInteger nonce; + public Call calls; + + [Preserve] + public Calls(BigInteger space, BigInteger nonce, Call calls) + { + this.space = space; + this.nonce = nonce; + this.calls = calls; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs.meta new file mode 100644 index 00000000..4953efcd --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 742b8917b00a4fdab6831efe0bffda96 +timeCreated: 1746033334 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs new file mode 100644 index 00000000..c9deba2d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs @@ -0,0 +1,18 @@ +using System; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + internal class ConfigUpdate : Payload + { + public override PayloadType type => PayloadType.ConfigUpdate; + public string imageHash; + + [Preserve] + public ConfigUpdate(string imageHash) + { + this.imageHash = imageHash; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs.meta new file mode 100644 index 00000000..4c3c760b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 580e4a3a53fd4c8cb937a6e3300b8f68 +timeCreated: 1746041364 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs new file mode 100644 index 00000000..d71b46e5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs @@ -0,0 +1,18 @@ +using System; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + internal class Digest : Payload + { + public override PayloadType type => PayloadType.Digest; + public string digest; + + [Preserve] + public Digest(string digest) + { + this.digest = digest; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs.meta new file mode 100644 index 00000000..a1d8523e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f7d9edd567cf4b56bbaf1482fb822978 +timeCreated: 1746041443 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs new file mode 100644 index 00000000..9c91a450 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs @@ -0,0 +1,18 @@ +using System; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + internal class Message : Payload + { + public override PayloadType type => PayloadType.Message; + public byte[] message; + + [Preserve] + public Message(byte[] message) + { + this.message = message; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs.meta new file mode 100644 index 00000000..ae1eb06e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a18a2a41d3904f8f8af61f31ad6ae3b8 +timeCreated: 1746041259 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs new file mode 100644 index 00000000..9058e16e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs @@ -0,0 +1,17 @@ +using System; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + internal class Parent + { + public Address[] parentWallets; + + [Preserve] + public Parent(Address[] parentWallets) + { + this.parentWallets = parentWallets; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs.meta new file mode 100644 index 00000000..f363ab10 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2a85f530cae549e4a51d6038c22354ca +timeCreated: 1746041487 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs new file mode 100644 index 00000000..df538b3e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs @@ -0,0 +1,56 @@ +using System; +using JetBrains.Annotations; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal abstract class Payload + { + public abstract PayloadType type { get; } + [CanBeNull] public Address[] parentWallets { get; set; } + + public bool isCalls => type == PayloadType.Call; + public bool isMessage => type == PayloadType.Message; + public bool isConfigUpdate => type == PayloadType.ConfigUpdate; + public bool isDigest => type == PayloadType.Digest; + } + + [JsonConverter(typeof(PayloadTypeConverter))] // We use a custom converter here instead of EnumConverter because ConfigUpdate -> config-update and '-' aren't supported in enums in C# + internal enum PayloadType + { + Call, + Message, + ConfigUpdate, + Digest, + } + + internal class PayloadTypeConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, PayloadType value, JsonSerializer serializer) + { + var stringValue = value switch + { + PayloadType.ConfigUpdate => "config-update", + _ => value.ToString().ToLowerInvariant() + }; + + writer.WriteValue(stringValue); + } + + public override PayloadType ReadJson(JsonReader reader, Type objectType, PayloadType existingValue, bool hasExistingValue, JsonSerializer serializer) + { + string? stringValue = (reader.Value ?? JToken.Load(reader).ToString())?.ToString().ToLowerInvariant(); + + return stringValue switch + { + "call" => PayloadType.Call, + "message" => PayloadType.Message, + "config-update" => PayloadType.ConfigUpdate, + "digest" => PayloadType.Digest, + _ => throw new JsonSerializationException($"Unknown PayloadType value: {stringValue}") + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs.meta new file mode 100644 index 00000000..b61356b0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cdd84b1a9c994ee096c6bdbb5dbea893 +timeCreated: 1746032883 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs new file mode 100644 index 00000000..da0c112d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Numerics; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class TypedDataToSign + { + [Serializable] + public class Domain + { + public string name; + public string version; + public BigInteger chainId; + public Address verifyingContract; + + public Domain(string name, string version, BigInteger chainId, Address verifyingContract) + { + this.name = name; + this.version = version; + this.chainId = chainId; + this.verifyingContract = verifyingContract; + } + } + + [Serializable] + public class NamedType + { + public string name; + public string type; + + public NamedType(string name, string type) + { + this.name = name; + this.type = type; + } + } + + public Domain domain; + public Dictionary types; + public string primaryType; + public Dictionary message; + + [Preserve] + public TypedDataToSign(Domain domain, Dictionary types, string primaryType, Dictionary message) + { + this.domain = domain; + this.types = types; + this.primaryType = primaryType; + this.message = message; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs.meta new file mode 100644 index 00000000..e21b281d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: dc45828618204d9cb5ebe558ea42b2ea +timeCreated: 1746041921 \ No newline at end of file From 9800b5cdac49147551dace5f79fb30ef0b713a01 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Wed, 30 Apr 2025 15:54:26 -0400 Subject: [PATCH 004/165] Move PayloadType into it's own file as Payload is about the grow --- .../EcosystemWallet/Primitives/Payload.cs | 45 +------------------ .../EcosystemWallet/Primitives/PayloadType.cs | 43 ++++++++++++++++++ .../Primitives/PayloadType.cs.meta | 3 ++ 3 files changed, 47 insertions(+), 44 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/PayloadType.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/PayloadType.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs index df538b3e..724a4f81 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs @@ -1,56 +1,13 @@ -using System; -using JetBrains.Annotations; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Sequence.Utils; - namespace Sequence.EcosystemWallet.Primitives { internal abstract class Payload { public abstract PayloadType type { get; } - [CanBeNull] public Address[] parentWallets { get; set; } + public Address[] parentWallets { get; set; } public bool isCalls => type == PayloadType.Call; public bool isMessage => type == PayloadType.Message; public bool isConfigUpdate => type == PayloadType.ConfigUpdate; public bool isDigest => type == PayloadType.Digest; } - - [JsonConverter(typeof(PayloadTypeConverter))] // We use a custom converter here instead of EnumConverter because ConfigUpdate -> config-update and '-' aren't supported in enums in C# - internal enum PayloadType - { - Call, - Message, - ConfigUpdate, - Digest, - } - - internal class PayloadTypeConverter : JsonConverter - { - public override void WriteJson(JsonWriter writer, PayloadType value, JsonSerializer serializer) - { - var stringValue = value switch - { - PayloadType.ConfigUpdate => "config-update", - _ => value.ToString().ToLowerInvariant() - }; - - writer.WriteValue(stringValue); - } - - public override PayloadType ReadJson(JsonReader reader, Type objectType, PayloadType existingValue, bool hasExistingValue, JsonSerializer serializer) - { - string? stringValue = (reader.Value ?? JToken.Load(reader).ToString())?.ToString().ToLowerInvariant(); - - return stringValue switch - { - "call" => PayloadType.Call, - "message" => PayloadType.Message, - "config-update" => PayloadType.ConfigUpdate, - "digest" => PayloadType.Digest, - _ => throw new JsonSerializationException($"Unknown PayloadType value: {stringValue}") - }; - } - } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/PayloadType.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/PayloadType.cs new file mode 100644 index 00000000..9e794152 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/PayloadType.cs @@ -0,0 +1,43 @@ +using System; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Sequence.EcosystemWallet.Primitives +{ + [JsonConverter(typeof(PayloadTypeConverter))] // We use a custom converter here instead of EnumConverter because ConfigUpdate -> config-update and '-' aren't supported in enums in C# + internal enum PayloadType + { + Call, + Message, + ConfigUpdate, + Digest, + } + + internal class PayloadTypeConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, PayloadType value, JsonSerializer serializer) + { + var stringValue = value switch + { + PayloadType.ConfigUpdate => "config-update", + _ => value.ToString().ToLowerInvariant() + }; + + writer.WriteValue(stringValue); + } + + public override PayloadType ReadJson(JsonReader reader, Type objectType, PayloadType existingValue, bool hasExistingValue, JsonSerializer serializer) + { + string? stringValue = (reader.Value ?? JToken.Load(reader).ToString())?.ToString().ToLowerInvariant(); + + return stringValue switch + { + "call" => PayloadType.Call, + "message" => PayloadType.Message, + "config-update" => PayloadType.ConfigUpdate, + "digest" => PayloadType.Digest, + _ => throw new JsonSerializationException($"Unknown PayloadType value: {stringValue}") + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/PayloadType.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/PayloadType.cs.meta new file mode 100644 index 00000000..2396444d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/PayloadType.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 811448a2c4d14b6baa0afa89d826bc5a +timeCreated: 1746042803 \ No newline at end of file From ba5fed629a810293f2410216c7e087a09a756c6e Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 5 May 2025 15:06:21 -0400 Subject: [PATCH 005/165] Added additional primitives and related methods --- .../EcosystemWallet/Primitives/Call.cs | 37 +++ .../EcosystemWallet/Primitives/Calls.cs | 252 +++++++++++++++++- .../Primitives/EncodeSapient.cs | 30 +++ .../Primitives/EncodeSapient.cs.meta | 3 + .../EcosystemWallet/Primitives/Parent.cs | 14 + .../Primitives/TypedDataToSign.cs | 126 ++++++++- .../SequenceSDK/Utils/BigIntegerExtensions.cs | 6 + .../SequenceSDK/Utils/ByteArrayExtensions.cs | 51 ++++ .../SequenceSDK/Utils/IntExtension.cs | 10 + .../SequenceSDK/Utils/IntExtension.cs.meta | 3 + 10 files changed, 525 insertions(+), 7 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/IntExtension.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/IntExtension.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs index 204a6910..dbe11547 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs @@ -1,12 +1,19 @@ using System; using System.Numerics; +using Sequence.ABI; +using Sequence.Utils; using UnityEngine.Scripting; +using StringExtensions = Sequence.Utils.StringExtensions; namespace Sequence.EcosystemWallet.Primitives { [Serializable] internal class Call { + public static readonly byte[] CALL_TYPEHASH = SequenceCoder.KeccakHash( + StringExtensions.ToByteArray( + "Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)")); + public Address to; public BigInteger value; public byte[] data; @@ -26,5 +33,35 @@ public Call(Address to, BigInteger value, byte[] data, BigInteger gasLimit, bool this.onlyFallback = onlyFallback; this.behaviorOnError = behaviorOnError; } + + public string Hash() + { + byte[] encoded = AbiParameters.Encode( + new[] + { + "bytes32", + "address", + "uint256", + "bytes32", + "uint256", + "bool", + "bool", + "uint256" + }, + new object[] + { + CALL_TYPEHASH, + to, + value, + SequenceCoder.KeccakHash(data), + gasLimit, + delegateCall, + onlyFallback, + (int)behaviorOnError + } + ); + + return SequenceCoder.KeccakHash(encoded).ByteArrayToHexStringWithPrefix(); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs index 388efb7a..02f7423f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using System.Numerics; +using Sequence.Utils; using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives @@ -7,17 +9,263 @@ namespace Sequence.EcosystemWallet.Primitives [Serializable] internal class Calls : Payload { + public const uint MaxNonceBytes = 15; + public const uint MaxCalls = 65536; + public override PayloadType type => PayloadType.Call; public BigInteger space; public BigInteger nonce; - public Call calls; + public Call[] calls; [Preserve] - public Calls(BigInteger space, BigInteger nonce, Call calls) + public Calls(BigInteger space, BigInteger nonce, Call[] calls) { this.space = space; this.nonce = nonce; this.calls = calls; } + + // Todo: once we're able to test the following code, let's refactor it into separate classes and methods instead of giant methods + + public byte[] Encode(Address self = null) + { + int callsLength = calls.Length; + int nonceBytesNeeded = nonce.MinimumBytesNeeded(); + if (nonceBytesNeeded > MaxNonceBytes) + { + throw new ArgumentException( + $"{nameof(nonce)} is too large, need {nonceBytesNeeded} bytes to represent it, but max is {MaxNonceBytes}"); + } + + /* + globalFlag layout: + bit 0: spaceZeroFlag => 1 if space == 0, else 0 + bits [1..3]: how many bytes we use to encode nonce + bit 4: singleCallFlag => 1 if there's exactly one call + bit 5: callsCountSizeFlag => 1 if #calls stored in 2 bytes, 0 if in 1 byte + (bits [6..7] are unused/free) + */ + int globalFlag = 0; + + if (space == BigInteger.Zero) + { + globalFlag |= 0x01; + } + + // bits [1..3] => how many bytes for the nonce + globalFlag |= nonceBytesNeeded << 1; + + // bit [4] => singleCallFlag + if (callsLength == 1) + { + globalFlag |= 0x10; + } + + /* + If there's more than one call, we decide if we store the #calls in 1 or 2 bytes. + bit [5] => callsCountSizeFlag: 1 => 2 bytes, 0 => 1 byte + */ + int callsCountSize = 0; + if (callsLength != 1) + { + if (callsLength < 256) + { + callsCountSize = 1; + } + else if (callsLength < MaxCalls) + { + callsCountSize = 2; + globalFlag |= 0x20; + } + else + { + throw new ArgumentException($"{calls} is too large, cannot have more than {MaxCalls} calls, given {callsLength}"); + } + } + + // Start building the output + // We'll accumulate in a Bytes object as we go + byte[] outBytes = globalFlag.ByteArrayFromNumber(1); + + // If space isn't 0, store it as exactly 20 bytes (like uint160) + if (space != BigInteger.Zero) + { + byte[] spaceBytes = space.ByteArrayFromNumber().PadLeft(20); + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, spaceBytes); + } + + // Encode nonce in nonceBytesNeeded + if (nonceBytesNeeded > 0) + { + // We'll store nonce in exactly nonceBytesNeeded bytes + byte[] nonceBytes = nonce.ByteArrayFromNumber().PadLeft(nonceBytesNeeded); + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, nonceBytes); + } + + // Store callsLength if not single-call + if (callsLength != 1) + { + if (callsCountSize > 2 || callsCountSize <= 0) + { + throw new SystemException( + $"If {nameof(callsLength)} != 1, then {callsCountSize} must be 1 or 2, given {callsCountSize}"); + } + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, callsLength.ByteArrayFromNumber(callsCountSize)); + } + + // Now encode each call + for (int i = 0; i < callsLength; i++) + { + Call call = calls[i]; + /* + call flags layout (1 byte): + bit 0 => toSelf (call.to == this) + bit 1 => hasValue (call.value != 0) + bit 2 => hasData (call.data.length > 0) + bit 3 => hasGasLimit (call.gasLimit != 0) + bit 4 => delegateCall + bit 5 => onlyFallback + bits [6..7] => behaviorOnError => 0=ignore, 1=revert, 2=abort + */ + int flags = 0; + if (self != null && self.Equals(call.to)) + { + flags |= 0x01; + } + + if (call.value != BigInteger.Zero) + { + flags |= 0x02; + } + + if (call.data != null && call.data.Length > 0) + { + flags |= 0x04; + } + + if (call.gasLimit != BigInteger.Zero) + { + flags |= 0x08; + } + + if (call.delegateCall) + { + flags |= 0x10; + } + + if (call.onlyFallback) + { + flags |= 0x20; + } + + flags |= (int)call.behaviorOnError << 6; + + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, flags.ByteArrayFromNumber(1)); + + // If toSelf bit not set, store 20-byte address + if ((flags & 0x01) == 0) + { + byte[] toAddressBytes = call.to.Value.HexStringToByteArray(); + if (toAddressBytes.Length != 20) + { + throw new SystemException($"Invalid '{nameof(call.to)}' address {call.to}, must be 20 bytes long but got {toAddressBytes.Length} bytes"); + } + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, toAddressBytes); + } + + // If hasValue, store 32 bytes of value + if ((flags & 0x02) != 0) + { + byte[] valueBytes = call.value.ByteArrayFromNumber().PadLeft(32); + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, valueBytes); + } + + // If hasData, store 3 bytes of data length + data + if ((flags & 0x04) != 0) + { + if (call.data == null) + { + throw new SystemException($"If ({nameof(flags)} & 0x04) != 0, then {nameof(call.data)} cannot be null"); + } + int callDataLength = call.data!.Length; + if (callDataLength > 0xffffff) + { + throw new ArgumentException($"{nameof(call.data)} is too large, length cannot exceed 0xffffff, given {callDataLength.ToHexadecimal()}"); + } + // 3 bytes => up to 16,777,215 + byte[] callDataLengthBytes = callDataLength.ByteArrayFromNumber(3); + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, callDataLengthBytes, call.data); + } + + // If hasGasLimit, store 32 bytes of gasLimit + if ((flags & 0x08) != 0) + { + byte[] gasBytes = call.gasLimit.ByteArrayFromNumber().PadLeft(32); + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, gasBytes); + } + } + + return outBytes; + } + + public EncodeSapient DoEncodeSapient(Chain chain, Parented payload) + { + EncodeSapient encoded = new EncodeSapient + { + kind = (int)payload.payload.type, + noChainId = chain != Chain.None, + calls = new Call[]{}, + space = BigInteger.Zero, + nonce = BigInteger.Zero, + message = "0x", + imageHash = "0x0000000000000000000000000000000000000000000000000000000000000000", + digest = "0x0000000000000000000000000000000000000000000000000000000000000000", + parentWallets = payload.parentWallets, + }; + + switch (payload.payload) + { + case Calls callsPayload: + int callsLength = callsPayload.calls.Length; + encoded.calls = new EncodeSapient.EncodedCall[callsLength]; + for (int i = 0; i < callsLength; i++) + { + Call call = callsPayload.calls[i]; + encoded.calls[i] = new EncodeSapient.EncodedCall + { + to = call.to, + value = call.value, + data = call.data.ByteArrayToHexStringWithPrefix(), + gasLimit = call.gasLimit, + delegateCall = call.delegateCall, + onlyFallback = call.onlyFallback, + behaviorOnError = (int)call.behaviorOnError + }; + } + encoded.space = callsPayload.space; + encoded.nonce = callsPayload.nonce; + break; + + case Message messagePayload: + encoded.message = messagePayload.message.ByteArrayToHexStringWithPrefix(); + break; + + case ConfigUpdate configPayload: + encoded.imageHash = configPayload.imageHash; + break; + + case Digest digestPayload: + encoded.digest = digestPayload.digest; + break; + } + + return encoded; + } + + public byte[] Hash(Address wallet, Chain chain, Parented payload) + { + TypedDataToSign typedData = new TypedDataToSign(wallet, chain, payload); + return GetSignPayload(typedData).ByteArrayToHexStringWithPrefix(); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs new file mode 100644 index 00000000..cfb25794 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs @@ -0,0 +1,30 @@ +using System; +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + internal class EncodeSapient + { + public int kind; + public bool noChainId; + public EncodedCall[] calls; + public BigInteger space; + public BigInteger nonce; + public string message; + public string imageHash; + public string digest; + public Address[] parentWallets; + + public class EncodedCall + { + public BigInteger gasLimit; + public bool delegateCall; + public string data; + public bool onlyFallback; + public Address to; + public BigInteger value; + public BigInteger behaviorOnError; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs.meta new file mode 100644 index 00000000..c8e95cbd --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8bb7f3d1280845619db061a7829d62b9 +timeCreated: 1746124988 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs index 9058e16e..320c21b6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs @@ -14,4 +14,18 @@ public Parent(Address[] parentWallets) this.parentWallets = parentWallets; } } + + [Serializable] + internal class Parented + { + public Address[] parentWallets; + public Payload payload; + + [Preserve] + public Parented(Address[] parentWallets, Payload payload) + { + this.parentWallets = parentWallets; + this.payload = payload; + } + } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs index da0c112d..16fa4461 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs @@ -1,12 +1,19 @@ using System; using System.Collections.Generic; using System.Numerics; +using Newtonsoft.Json; +using Sequence.Utils; using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives { internal class TypedDataToSign { + public Domain domain; + public Dictionary types; + public string primaryType; + public Dictionary message; + [Serializable] public class Domain { @@ -22,6 +29,14 @@ public Domain(string name, string version, BigInteger chainId, Address verifying this.chainId = chainId; this.verifyingContract = verifyingContract; } + + public Domain(string name, string version, Chain chain, Address verifyingContract) + { + this.name = name; + this.version = version; + this.chainId = BigInteger.Parse(ChainDictionaries.ChainIdOf[chain]); + this.verifyingContract = verifyingContract; + } } [Serializable] @@ -37,12 +52,8 @@ public NamedType(string name, string type) } } - public Domain domain; - public Dictionary types; - public string primaryType; - public Dictionary message; - [Preserve] + [JsonConstructor] public TypedDataToSign(Domain domain, Dictionary types, string primaryType, Dictionary message) { this.domain = domain; @@ -50,5 +61,110 @@ public TypedDataToSign(Domain domain, Dictionary types, str this.primaryType = primaryType; this.message = message; } + + // Todo: once we have tests working, let's refactor this so it isn't one giant function + public TypedDataToSign(Address wallet, Chain chain, Parented payload) + { + this.domain = new Domain("Sequence Wallet", "3", chain, wallet); + switch (payload.payload.type) + { + case PayloadType.Call: + { + types = new Dictionary() + { + ["Calls"] = new[] + { + new TypedDataToSign.NamedType("calls", "Call[]"), + new TypedDataToSign.NamedType("space", "uint256"), + new TypedDataToSign.NamedType("nonce", "uint256"), + new TypedDataToSign.NamedType("wallets", "address[]"), + }, + ["Call"] = new[] + { + new TypedDataToSign.NamedType("to", "address"), + new TypedDataToSign.NamedType("value", "uint256"), + new TypedDataToSign.NamedType("data", "bytes"), + new TypedDataToSign.NamedType("gasLimit", "uint256"), + new TypedDataToSign.NamedType("delegateCall", "bool"), + new TypedDataToSign.NamedType("onlyFallback", "bool"), + new TypedDataToSign.NamedType("behaviorOnError", "uint256"), + } + }; + + // We ensure 'behaviorOnError' is turned into a numeric value + Calls callPayload = (Calls)payload.payload; + message = new Dictionary + { + ["space"] = callPayload.space.ToString(), + ["nonce"] = callPayload.nonce.ToString(), + ["wallets"] = payload.parentWallets + }; + int callsLength = callPayload.calls.Length; + EncodeSapient.EncodedCall[] encoded = new EncodeSapient.EncodedCall[callsLength]; + for (int i = 0; i < callsLength; i++) + { + Call call = callPayload.calls[i]; + encoded[i] = new EncodeSapient.EncodedCall + { + to = call.to, + value = call.value, + data = call.data.ByteArrayToHexStringWithPrefix(), + gasLimit = call.gasLimit, + delegateCall = call.delegateCall, + onlyFallback = call.onlyFallback, + behaviorOnError = (int)call.behaviorOnError + }; + } + message.Add("calls", encoded); + primaryType = "Calls"; + break; + } + case PayloadType.Message: + { + types = new Dictionary + { + ["Message"] = new[] + { + new TypedDataToSign.NamedType("message", "bytes"), + new TypedDataToSign.NamedType("wallets", "address[]"), + } + }; + + var messagePayload = (Message)payload.payload; + message = new Dictionary + { + ["message"] = messagePayload.message.ByteArrayToHexStringWithPrefix(), + ["wallets"] = payload.parentWallets + }; + primaryType = "Message"; + break; + } + case PayloadType.ConfigUpdate: + { + types = new Dictionary + { + ["ConfigUpdate"] = new[] + { + new TypedDataToSign.NamedType("imageHash", "bytes32"), + new TypedDataToSign.NamedType("wallets", "address[]"), + } + }; + + var configPayload = (ConfigUpdate)payload.payload; + message = new Dictionary + { + ["imageHash"] = configPayload.imageHash, + ["wallets"] = payload.parentWallets + }; + primaryType = "ConfigUpdate"; + break; + } + case PayloadType.Digest: + throw new ArgumentException( + $"{nameof(PayloadType.Digest)} is not supported, use {nameof(PayloadType.Message)} instead"); + default: + throw new SystemException($"Encountered unexpected {nameof(PayloadType)}: {payload.payload.type}"); + } + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs index 5235c277..39848e15 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs @@ -1,3 +1,4 @@ +using System; using System.Numerics; namespace Sequence.Utils @@ -13,5 +14,10 @@ public static string BigIntegerToHexString(this BigInteger value) } return "0x" + result; } + + public static int MinimumBytesNeeded(this BigInteger value) + { + return (int)Math.Ceiling(value.ToString("X").Length / 2.0); + } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs index 32a96dc2..cc1f0324 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Numerics; using System.Text; using UnityEngine; @@ -78,5 +79,55 @@ public static byte[] BuildArrayWithRepeatedValue(byte[] value, int repetitions) return result; } + + public static byte[] PadLeft(this byte[] input, int totalSize) + { + if (input.Length > totalSize) + throw new ArgumentException("Input is larger than total size"); + + byte[] result = new byte[totalSize]; + Buffer.BlockCopy(input, 0, result, totalSize - input.Length, input.Length); + return result; + } + + public static byte[] ByteArrayFromNumber(this BigInteger value, int? size = null) + { + if (value < 0) + throw new ArgumentException("Value must be non-negative"); + + byte[] rawBytes = value.ToByteArray(isUnsigned: true, isBigEndian: true); + + if (size.HasValue) + { + if (rawBytes.Length > size.Value) + throw new ArgumentException("Value is too large to fit in the specified size"); + + return PadLeft(rawBytes, size.Value); + } + + return rawBytes; + } + + public static byte[] ByteArrayFromNumber(this int value, int size) + { + if (size < 1 || size > 4) + throw new ArgumentOutOfRangeException(nameof(size), "Size must be between 1 and 4 bytes for an int."); + + byte[] bytes = BitConverter.GetBytes(value); + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); + + return bytes[^size..]; + } + + public static byte[] ByteArrayFromNumber(this int value) + { + byte[] bytes = BitConverter.GetBytes(value); + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes); + + return bytes; + } + } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/IntExtension.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/IntExtension.cs new file mode 100644 index 00000000..8d93385e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/IntExtension.cs @@ -0,0 +1,10 @@ +namespace Sequence.Utils +{ + public static class IntExtension + { + public static string ToHexadecimal(this int value) + { + return value.ToString("X"); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/IntExtension.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/IntExtension.cs.meta new file mode 100644 index 00000000..ec9b652c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/IntExtension.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2ee3e9bcb004465da40f6bf14d74d2ae +timeCreated: 1746109146 \ No newline at end of file From 398943e271a4a56054c6fb8a1959cec9da2f824a Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 5 May 2025 16:39:35 -0400 Subject: [PATCH 006/165] Added ByteArrayExtension.PadRight implementation --- .../Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs index cc1f0324..e48aeccc 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs @@ -90,6 +90,16 @@ public static byte[] PadLeft(this byte[] input, int totalSize) return result; } + public static byte[] PadRight(this byte[] input, int totalSize) + { + if (input.Length > totalSize) + throw new ArgumentException("Input is larger than total size"); + + byte[] result = new byte[totalSize]; + Buffer.BlockCopy(input, 0, result, 0, input.Length); + return result; + } + public static byte[] ByteArrayFromNumber(this BigInteger value, int? size = null) { if (value < 0) From fd986a3982de782dcff8a983a3a66e8b9836e3d4 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Tue, 6 May 2025 14:58:11 -0400 Subject: [PATCH 007/165] CallHash implementation --- .../EcosystemWallet/Primitives/Call.cs | 35 +++------ .../EcosystemWallet/Primitives/Domain.cs | 50 ++++++++++++ .../EcosystemWallet/Primitives/Domain.cs.meta | 3 + .../EcosystemWallet/Primitives/NamedType.cs | 18 +++++ .../Primitives/NamedType.cs.meta | 3 + .../Primitives/TypedDataToSign.cs | 77 ++++++------------- 6 files changed, 107 insertions(+), 79 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/NamedType.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/NamedType.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs index dbe11547..554ef2a1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs @@ -36,30 +36,17 @@ public Call(Address to, BigInteger value, byte[] data, BigInteger gasLimit, bool public string Hash() { - byte[] encoded = AbiParameters.Encode( - new[] - { - "bytes32", - "address", - "uint256", - "bytes32", - "uint256", - "bool", - "bool", - "uint256" - }, - new object[] - { - CALL_TYPEHASH, - to, - value, - SequenceCoder.KeccakHash(data), - gasLimit, - delegateCall, - onlyFallback, - (int)behaviorOnError - } - ); + byte[] typeHash = new StaticBytesCoder().Encode(CALL_TYPEHASH); + byte[] toHash = new AddressCoder().Encode(to); + byte[] valueHash = new NumberCoder().Encode(value); + byte[] dataHash = new StaticBytesCoder().Encode(data); + byte[] gasLimitHash = new NumberCoder().Encode(gasLimit); + byte[] delegateCallHash = new BooleanCoder().Encode(delegateCall); + byte[] onlyFallbackHash = new BooleanCoder().Encode(onlyFallback); + byte[] behaviorOnErrorHash = new NumberCoder().Encode((int)behaviorOnError); + + byte[] encoded = ByteArrayExtensions.ConcatenateByteArrays(typeHash, toHash, valueHash, dataHash, + gasLimitHash, delegateCallHash, onlyFallbackHash, behaviorOnErrorHash); return SequenceCoder.KeccakHash(encoded).ByteArrayToHexStringWithPrefix(); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs new file mode 100644 index 00000000..2dd088d6 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs @@ -0,0 +1,50 @@ +using System; +using System.Numerics; +using Sequence.ABI; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + public class Domain + { + public string name; + public string version; + public BigInteger chainId; + public Address verifyingContract; + public FixedByte salt; + + public Domain(string name, string version, BigInteger chainId, Address verifyingContract, FixedByte salt = null) + { + this.name = name; + this.version = version; + this.chainId = chainId; + this.verifyingContract = verifyingContract; + + if (salt != null) + { + if (!salt.IsFixedSize || salt.Count != 32) + { + throw new ArgumentException($"If provided, {nameof(salt)} must be a fixed byte array of length 32."); + } + this.salt = salt; + } + } + + public Domain(string name, string version, Chain chain, Address verifyingContract, FixedByte salt = null) + { + this.name = name; + this.version = version; + this.chainId = BigInteger.Parse(ChainDictionaries.ChainIdOf[chain]); + this.verifyingContract = verifyingContract; + + if (salt != null) + { + if (!salt.IsFixedSize || salt.Count != 32) + { + throw new ArgumentException($"If provided, {nameof(salt)} must be a fixed byte array of length 32."); + } + this.salt = salt; + } + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs.meta new file mode 100644 index 00000000..2d9ac3c9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: de206ae567184ac5acf8e966687e975e +timeCreated: 1746546239 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/NamedType.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/NamedType.cs new file mode 100644 index 00000000..ea87ce81 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/NamedType.cs @@ -0,0 +1,18 @@ +using System; + +namespace Sequence.EcosystemWallet.Primitives +{ + + [Serializable] + public class NamedType + { + public string name; + public string type; + + public NamedType(string name, string type) + { + this.name = name; + this.type = type; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/NamedType.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/NamedType.cs.meta new file mode 100644 index 00000000..8c1f6005 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/NamedType.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 71575946dc15431089d5317ec1717aa3 +timeCreated: 1746546291 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs index 16fa4461..e10913ad 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs @@ -13,44 +13,6 @@ internal class TypedDataToSign public Dictionary types; public string primaryType; public Dictionary message; - - [Serializable] - public class Domain - { - public string name; - public string version; - public BigInteger chainId; - public Address verifyingContract; - - public Domain(string name, string version, BigInteger chainId, Address verifyingContract) - { - this.name = name; - this.version = version; - this.chainId = chainId; - this.verifyingContract = verifyingContract; - } - - public Domain(string name, string version, Chain chain, Address verifyingContract) - { - this.name = name; - this.version = version; - this.chainId = BigInteger.Parse(ChainDictionaries.ChainIdOf[chain]); - this.verifyingContract = verifyingContract; - } - } - - [Serializable] - public class NamedType - { - public string name; - public string type; - - public NamedType(string name, string type) - { - this.name = name; - this.type = type; - } - } [Preserve] [JsonConstructor] @@ -60,6 +22,11 @@ public TypedDataToSign(Domain domain, Dictionary types, str this.types = types; this.primaryType = primaryType; this.message = message; + if (!types.ContainsKey(primaryType) || !types.ContainsKey(primaryType)) + { + throw new ArgumentException( + $"{nameof(primaryType)} {primaryType} not found in {nameof(types)}. Please check the provided types."); + } } // Todo: once we have tests working, let's refactor this so it isn't one giant function @@ -74,20 +41,20 @@ public TypedDataToSign(Address wallet, Chain chain, Parented payload) { ["Calls"] = new[] { - new TypedDataToSign.NamedType("calls", "Call[]"), - new TypedDataToSign.NamedType("space", "uint256"), - new TypedDataToSign.NamedType("nonce", "uint256"), - new TypedDataToSign.NamedType("wallets", "address[]"), + new NamedType("calls", "Call[]"), + new NamedType("space", "uint256"), + new NamedType("nonce", "uint256"), + new NamedType("wallets", "address[]"), }, ["Call"] = new[] { - new TypedDataToSign.NamedType("to", "address"), - new TypedDataToSign.NamedType("value", "uint256"), - new TypedDataToSign.NamedType("data", "bytes"), - new TypedDataToSign.NamedType("gasLimit", "uint256"), - new TypedDataToSign.NamedType("delegateCall", "bool"), - new TypedDataToSign.NamedType("onlyFallback", "bool"), - new TypedDataToSign.NamedType("behaviorOnError", "uint256"), + new NamedType("to", "address"), + new NamedType("value", "uint256"), + new NamedType("data", "bytes"), + new NamedType("gasLimit", "uint256"), + new NamedType("delegateCall", "bool"), + new NamedType("onlyFallback", "bool"), + new NamedType("behaviorOnError", "uint256"), } }; @@ -121,12 +88,12 @@ public TypedDataToSign(Address wallet, Chain chain, Parented payload) } case PayloadType.Message: { - types = new Dictionary + types = new Dictionary { ["Message"] = new[] { - new TypedDataToSign.NamedType("message", "bytes"), - new TypedDataToSign.NamedType("wallets", "address[]"), + new NamedType("message", "bytes"), + new NamedType("wallets", "address[]"), } }; @@ -141,12 +108,12 @@ public TypedDataToSign(Address wallet, Chain chain, Parented payload) } case PayloadType.ConfigUpdate: { - types = new Dictionary + types = new Dictionary { ["ConfigUpdate"] = new[] { - new TypedDataToSign.NamedType("imageHash", "bytes32"), - new TypedDataToSign.NamedType("wallets", "address[]"), + new NamedType("imageHash", "bytes32"), + new NamedType("wallets", "address[]"), } }; From c9af264c1b8a5b88cc9d4a30ae5b67bfd3e005fe Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Tue, 6 May 2025 15:03:45 -0400 Subject: [PATCH 008/165] Fix compile error --- .../Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs | 2 +- .../EcosystemWallet/Primitives/TypedDataToSign.cs | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs index 02f7423f..39548c68 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs @@ -265,7 +265,7 @@ public EncodeSapient DoEncodeSapient(Chain chain, Parented payload) public byte[] Hash(Address wallet, Chain chain, Parented payload) { TypedDataToSign typedData = new TypedDataToSign(wallet, chain, payload); - return GetSignPayload(typedData).ByteArrayToHexStringWithPrefix(); + return typedData.GetSignPayload(); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs index e10913ad..6d0a76e7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs @@ -133,5 +133,10 @@ public TypedDataToSign(Address wallet, Chain chain, Parented payload) throw new SystemException($"Encountered unexpected {nameof(PayloadType)}: {payload.payload.type}"); } } + + public byte[] GetSignPayload() + { + + } } } \ No newline at end of file From ac53cb87f4db3d82501623e32eb5628ec99a0647 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Tue, 13 May 2025 17:00:21 -0400 Subject: [PATCH 009/165] Implement TypedDataToSign.GetSignPayload --- .../EcosystemWallet/Primitives/Call.cs | 5 ++ .../EcosystemWallet/Primitives/Calls.cs | 35 +++++--- .../Primitives/ConfigUpdate.cs | 8 ++ .../EcosystemWallet/Primitives/Digest.cs | 8 ++ .../EcosystemWallet/Primitives/Domain.cs | 16 ++++ .../Primitives/EncodeSapient.cs | 12 +++ .../EcosystemWallet/Primitives/Message.cs | 7 ++ .../EcosystemWallet/Primitives/Parent.cs | 19 ++++- .../EcosystemWallet/Primitives/Payload.cs | 2 + .../Primitives/TypedDataToSign.cs | 83 ++++++++++++++++--- .../SequenceWalletToEOAWalletAdapter.cs | 5 ++ .../SequenceSDK/Ethereum/Wallet/EOAWallet.cs | 5 ++ .../SequenceSDK/Ethereum/Wallet/IWallet.cs | 8 ++ .../SequenceSDK/Utils/DictionaryExtensions.cs | 42 ++++++++++ .../Utils/DictionaryExtensions.cs.meta | 3 + 15 files changed, 236 insertions(+), 22 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs index 554ef2a1..2c6082bc 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs @@ -50,5 +50,10 @@ public string Hash() return SequenceCoder.KeccakHash(encoded).ByteArrayToHexStringWithPrefix(); } + + public byte[] HashStruct() + { + return Hash().HexStringToByteArray(); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs index 39548c68..fc54c9f4 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Numerics; +using Sequence.ABI; using Sequence.Utils; using UnityEngine.Scripting; @@ -13,6 +14,7 @@ internal class Calls : Payload public const uint MaxCalls = 65536; public override PayloadType type => PayloadType.Call; + public BigInteger space; public BigInteger nonce; public Call[] calls; @@ -24,6 +26,24 @@ public Calls(BigInteger space, BigInteger nonce, Call[] calls) this.nonce = nonce; this.calls = calls; } + + public override byte[] GetEIP712EncodeData() + { + byte[] spaceEncoded = new NumberCoder().Encode(space); + byte[] nonceEncoded = new NumberCoder().Encode(nonce); + byte[] callsEncoded = new byte[] { }; + foreach (var call in calls) + { + callsEncoded = ByteArrayExtensions.ConcatenateByteArrays(callsEncoded, call.HashStruct()); + } + callsEncoded = SequenceCoder.KeccakHash(callsEncoded); + byte[] encoded = ByteArrayExtensions.ConcatenateByteArrays( + spaceEncoded, + nonceEncoded, + callsEncoded + ); + return encoded; + } // Todo: once we're able to test the following code, let's refactor it into separate classes and methods instead of giant methods @@ -208,13 +228,14 @@ call flags layout (1 byte): return outBytes; } + // Todo maybe I should move this to Parented? public EncodeSapient DoEncodeSapient(Chain chain, Parented payload) { EncodeSapient encoded = new EncodeSapient { kind = (int)payload.payload.type, noChainId = chain != Chain.None, - calls = new Call[]{}, + calls = new EncodeSapient.EncodedCall[]{}, space = BigInteger.Zero, nonce = BigInteger.Zero, message = "0x", @@ -231,16 +252,7 @@ public EncodeSapient DoEncodeSapient(Chain chain, Parented payload) for (int i = 0; i < callsLength; i++) { Call call = callsPayload.calls[i]; - encoded.calls[i] = new EncodeSapient.EncodedCall - { - to = call.to, - value = call.value, - data = call.data.ByteArrayToHexStringWithPrefix(), - gasLimit = call.gasLimit, - delegateCall = call.delegateCall, - onlyFallback = call.onlyFallback, - behaviorOnError = (int)call.behaviorOnError - }; + encoded.calls[i] = new EncodeSapient.EncodedCall(call); } encoded.space = callsPayload.space; encoded.nonce = callsPayload.nonce; @@ -262,6 +274,7 @@ public EncodeSapient DoEncodeSapient(Chain chain, Parented payload) return encoded; } + // Todo maybe I should move this to Parented? public byte[] Hash(Address wallet, Chain chain, Parented payload) { TypedDataToSign typedData = new TypedDataToSign(wallet, chain, payload); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs index c9deba2d..51920439 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs @@ -1,4 +1,6 @@ using System; +using Sequence.ABI; +using Sequence.Utils; using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives @@ -14,5 +16,11 @@ public ConfigUpdate(string imageHash) { this.imageHash = imageHash; } + + public override byte[] GetEIP712EncodeData() + { + byte[] encoded = new FixedBytesCoder().Encode(new FixedByte(32, imageHash.HexStringToByteArray())); + return encoded; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs index d71b46e5..7ccb49c3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs @@ -1,4 +1,6 @@ using System; +using Sequence.ABI; +using Sequence.Utils; using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives @@ -14,5 +16,11 @@ public Digest(string digest) { this.digest = digest; } + + public override byte[] GetEIP712EncodeData() + { + byte[] encoded = new FixedBytesCoder().Encode(new FixedByte(32, digest.HexStringToByteArray())); + return encoded; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs index 2dd088d6..15599e20 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs @@ -1,6 +1,7 @@ using System; using System.Numerics; using Sequence.ABI; +using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives { @@ -46,5 +47,20 @@ public Domain(string name, string version, Chain chain, Address verifyingContrac this.salt = salt; } } + + public byte[] GetDomainSeparator() + { + string encodeType = + "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)"; + byte[] typeHash = SequenceCoder.KeccakHash(encodeType).HexStringToByteArray(); + byte[] nameHash = new TupleCoder().EncodeToString(name, new[] { "string" }).HexStringToByteArray(); + byte[] versionHash = new TupleCoder().EncodeToString(version, new[] { "string" }).HexStringToByteArray(); + byte[] chainIdHash = new NumberCoder().Encode(chainId); + byte[] verifyingContractHash = new AddressCoder().Encode(verifyingContract); + byte[] saltHash = salt != null ? new FixedBytesCoder().Encode(salt) : null; + byte[] encoded = ByteArrayExtensions.ConcatenateByteArrays(typeHash, nameHash, versionHash, + chainIdHash, verifyingContractHash, saltHash); + return encoded; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs index cfb25794..a313ee88 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs @@ -1,5 +1,6 @@ using System; using System.Numerics; +using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives { @@ -25,6 +26,17 @@ public class EncodedCall public Address to; public BigInteger value; public BigInteger behaviorOnError; + + public EncodedCall(Call call) + { + to = call.to; + value = call.value; + data = call.data.ByteArrayToHexStringWithPrefix(); + gasLimit = call.gasLimit; + delegateCall = call.delegateCall; + onlyFallback = call.onlyFallback; + behaviorOnError = (int)call.behaviorOnError; + } } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs index 9c91a450..b4499f1c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs @@ -1,4 +1,5 @@ using System; +using Sequence.ABI; using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives @@ -14,5 +15,11 @@ public Message(byte[] message) { this.message = message; } + + public override byte[] GetEIP712EncodeData() + { + byte[] encoded = new BytesCoder().Encode(message); + return encoded; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs index 320c21b6..f5cacabe 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs @@ -1,4 +1,6 @@ using System; +using Sequence.ABI; +using Sequence.Utils; using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives @@ -18,8 +20,8 @@ public Parent(Address[] parentWallets) [Serializable] internal class Parented { - public Address[] parentWallets; public Payload payload; + public Address[] parentWallets; [Preserve] public Parented(Address[] parentWallets, Payload payload) @@ -27,5 +29,20 @@ public Parented(Address[] parentWallets, Payload payload) this.parentWallets = parentWallets; this.payload = payload; } + + public byte[] GetEIP712EncodeData() + { + byte[] payloadEncoded = payload.GetEIP712EncodeData(); + byte[] parentWalletsEncoded = new byte[] { }; + foreach (var parentWallet in parentWallets) + { + parentWalletsEncoded = + ByteArrayExtensions.ConcatenateByteArrays(new AddressCoder().Encode(parentWalletsEncoded)); + } + parentWalletsEncoded = SequenceCoder.KeccakHash(parentWalletsEncoded); + + byte[] encoded = ByteArrayExtensions.ConcatenateByteArrays(payloadEncoded, parentWalletsEncoded); + return encoded; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs index 724a4f81..3c38f470 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs @@ -9,5 +9,7 @@ internal abstract class Payload public bool isMessage => type == PayloadType.Message; public bool isConfigUpdate => type == PayloadType.ConfigUpdate; public bool isDigest => type == PayloadType.Digest; + + public abstract byte[] GetEIP712EncodeData(); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs index 6d0a76e7..888caa28 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; using System.Numerics; +using System.Text; using Newtonsoft.Json; +using Sequence.ABI; using Sequence.Utils; using UnityEngine.Scripting; @@ -13,6 +15,9 @@ internal class TypedDataToSign public Dictionary types; public string primaryType; public Dictionary message; + + private string[] _types; + private Parented _payload; [Preserve] [JsonConstructor] @@ -32,6 +37,7 @@ public TypedDataToSign(Domain domain, Dictionary types, str // Todo: once we have tests working, let's refactor this so it isn't one giant function public TypedDataToSign(Address wallet, Chain chain, Parented payload) { + _payload = payload; this.domain = new Domain("Sequence Wallet", "3", chain, wallet); switch (payload.payload.type) { @@ -71,16 +77,7 @@ public TypedDataToSign(Address wallet, Chain chain, Parented payload) for (int i = 0; i < callsLength; i++) { Call call = callPayload.calls[i]; - encoded[i] = new EncodeSapient.EncodedCall - { - to = call.to, - value = call.value, - data = call.data.ByteArrayToHexStringWithPrefix(), - gasLimit = call.gasLimit, - delegateCall = call.delegateCall, - onlyFallback = call.onlyFallback, - behaviorOnError = (int)call.behaviorOnError - }; + encoded[i] = new EncodeSapient.EncodedCall(call); } message.Add("calls", encoded); primaryType = "Calls"; @@ -136,7 +133,73 @@ public TypedDataToSign(Address wallet, Chain chain, Parented payload) public byte[] GetSignPayload() { + _types = types.GetKeys(); + SortTypes(); + string encodeType = CalculateEncodeType(); + byte[] encodeData = CalculateEncodeData(); + byte[] hashStruct = SequenceCoder.KeccakHash( + ByteArrayExtensions.ConcatenateByteArrays(SequenceCoder.KeccakHash(encodeType).HexStringToByteArray(), + encodeData)); + byte[] domainSeparator = domain.GetDomainSeparator(); + + byte[] signablePayload = ByteArrayExtensions.ConcatenateByteArrays( + SequenceCoder.HexStringToByteArray("0x19"), + SequenceCoder.HexStringToByteArray("0x01"), + domainSeparator, + hashStruct); + byte[] hashedMessage = SequenceCoder.KeccakHash(signablePayload); + return hashedMessage; + } + + private void SortTypes() + { + int typesCount = _types.Length; + if (typesCount == 0) + { + throw new ArgumentException($"Must have at least one entry in {nameof(types)} dictionary"); + } + List newTypes = new List(); + newTypes.Add(primaryType); + Array.Sort(_types); + for (int i = 0; i < typesCount; i++) + { + if (_types[i] == primaryType) + { + continue; + } + newTypes.Add(_types[i]); + } + + _types = newTypes.ToArray(); + } + + private string CalculateEncodeType() + { + StringBuilder encodeType = new StringBuilder(); + int typeCount = _types.Length; + for (int i = 0; i < typeCount; i++) + { + string type = _types[i]; + encodeType.Append(type); + encodeType.Append("("); + foreach (var namedTypes in types[type]) + { + encodeType.Append(namedTypes.type); + encodeType.Append(" "); + encodeType.Append(namedTypes.name); + encodeType.Append(","); + } + encodeType.Remove(encodeType.Length - 1, 1); // remove last comma + encodeType.Append(")"); + } + + return encodeType.ToString(); + } + + private byte[] CalculateEncodeData() + { + return _payload.GetEIP712EncodeData(); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceWalletToEOAWalletAdapter.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceWalletToEOAWalletAdapter.cs index 1c69d073..c53fea8d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceWalletToEOAWalletAdapter.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceWalletToEOAWalletAdapter.cs @@ -141,5 +141,10 @@ public async Task IsValidSignature(string signature, string message, Chain var result = await _wallet.IsValidMessageSignature(chain, message, signature); return result.isValid; } + + public string SignWithoutPrefixesOrHashing(byte[] message) + { + throw new NotSupportedException(); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Wallet/EOAWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Wallet/EOAWallet.cs index e47837d4..179433c3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Wallet/EOAWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Wallet/EOAWallet.cs @@ -258,6 +258,11 @@ public static byte[] PrefixedMessage(byte[] message) return IWallet.PrefixedMessage(message); } + public string SignWithoutPrefixesOrHashing(byte[] message) + { + return EthSignature.Sign(message, privKey); + } + /// /// Recovers the Ethereum address from a message and its signature. /// diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Wallet/IWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Wallet/IWallet.cs index 08b7a4a7..f2e51e1a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Wallet/IWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Wallet/IWallet.cs @@ -149,5 +149,13 @@ public static byte[] PrefixedMessage(byte[] message) return message; } + + /// + /// Simply use the private key to sign the given message + /// Don't apply any hashing or prefixes to the message - this should be done elsewhere + /// + /// + /// + public string SignWithoutPrefixesOrHashing(byte[] message); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs new file mode 100644 index 00000000..d69bffa4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; + +namespace Sequence.Utils +{ + public static class DictionaryExtensions + { + public static bool HaveMatchingKeys( + Dictionary dict1, + Dictionary dict2) + { + if (dict1.Count != dict2.Count) + { + return false; + } + + foreach (TKey key in dict1.Keys) + { + if (!dict2.ContainsKey(key)) + { + return false; + } + } + + return true; + } + + public static TKey[] GetKeys(this Dictionary dict) + { + TKey[] keys = new TKey[dict.Count]; + int index = 0; + + foreach (TKey key in dict.Keys) + { + keys[index++] = key; + } + + return keys; + } + + + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs.meta new file mode 100644 index 00000000..0ef34107 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bd69bc32dece43638f7caae702c1c52f +timeCreated: 1746548390 \ No newline at end of file From 4650d41d84bd866f546a89dac22bdb80aaea559f Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Tue, 13 May 2025 17:05:00 -0400 Subject: [PATCH 010/165] Moved some functions from Calls into Parented and moved Parented class definition into its own file --- .../EcosystemWallet/Primitives/Calls.cs | 53 ----------- .../EcosystemWallet/Primitives/Parent.cs | 31 ------- .../EcosystemWallet/Primitives/Parented.cs | 88 +++++++++++++++++++ .../Primitives/Parented.cs.meta | 3 + 4 files changed, 91 insertions(+), 84 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parented.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parented.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs index fc54c9f4..12704aaa 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs @@ -227,58 +227,5 @@ call flags layout (1 byte): return outBytes; } - - // Todo maybe I should move this to Parented? - public EncodeSapient DoEncodeSapient(Chain chain, Parented payload) - { - EncodeSapient encoded = new EncodeSapient - { - kind = (int)payload.payload.type, - noChainId = chain != Chain.None, - calls = new EncodeSapient.EncodedCall[]{}, - space = BigInteger.Zero, - nonce = BigInteger.Zero, - message = "0x", - imageHash = "0x0000000000000000000000000000000000000000000000000000000000000000", - digest = "0x0000000000000000000000000000000000000000000000000000000000000000", - parentWallets = payload.parentWallets, - }; - - switch (payload.payload) - { - case Calls callsPayload: - int callsLength = callsPayload.calls.Length; - encoded.calls = new EncodeSapient.EncodedCall[callsLength]; - for (int i = 0; i < callsLength; i++) - { - Call call = callsPayload.calls[i]; - encoded.calls[i] = new EncodeSapient.EncodedCall(call); - } - encoded.space = callsPayload.space; - encoded.nonce = callsPayload.nonce; - break; - - case Message messagePayload: - encoded.message = messagePayload.message.ByteArrayToHexStringWithPrefix(); - break; - - case ConfigUpdate configPayload: - encoded.imageHash = configPayload.imageHash; - break; - - case Digest digestPayload: - encoded.digest = digestPayload.digest; - break; - } - - return encoded; - } - - // Todo maybe I should move this to Parented? - public byte[] Hash(Address wallet, Chain chain, Parented payload) - { - TypedDataToSign typedData = new TypedDataToSign(wallet, chain, payload); - return typedData.GetSignPayload(); - } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs index f5cacabe..9058e16e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs @@ -1,6 +1,4 @@ using System; -using Sequence.ABI; -using Sequence.Utils; using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives @@ -16,33 +14,4 @@ public Parent(Address[] parentWallets) this.parentWallets = parentWallets; } } - - [Serializable] - internal class Parented - { - public Payload payload; - public Address[] parentWallets; - - [Preserve] - public Parented(Address[] parentWallets, Payload payload) - { - this.parentWallets = parentWallets; - this.payload = payload; - } - - public byte[] GetEIP712EncodeData() - { - byte[] payloadEncoded = payload.GetEIP712EncodeData(); - byte[] parentWalletsEncoded = new byte[] { }; - foreach (var parentWallet in parentWallets) - { - parentWalletsEncoded = - ByteArrayExtensions.ConcatenateByteArrays(new AddressCoder().Encode(parentWalletsEncoded)); - } - parentWalletsEncoded = SequenceCoder.KeccakHash(parentWalletsEncoded); - - byte[] encoded = ByteArrayExtensions.ConcatenateByteArrays(payloadEncoded, parentWalletsEncoded); - return encoded; - } - } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parented.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parented.cs new file mode 100644 index 00000000..8af3c27c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parented.cs @@ -0,0 +1,88 @@ +using System; +using System.Numerics; +using Sequence.ABI; +using Sequence.Utils; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + internal class Parented + { + public Payload payload; + public Address[] parentWallets; + + [Preserve] + public Parented(Address[] parentWallets, Payload payload) + { + this.parentWallets = parentWallets; + this.payload = payload; + } + + public byte[] GetEIP712EncodeData() + { + byte[] payloadEncoded = payload.GetEIP712EncodeData(); + byte[] parentWalletsEncoded = new byte[] { }; + foreach (var parentWallet in parentWallets) + { + parentWalletsEncoded = + ByteArrayExtensions.ConcatenateByteArrays(new AddressCoder().Encode(parentWalletsEncoded)); + } + parentWalletsEncoded = SequenceCoder.KeccakHash(parentWalletsEncoded); + + byte[] encoded = ByteArrayExtensions.ConcatenateByteArrays(payloadEncoded, parentWalletsEncoded); + return encoded; + } + + public byte[] Hash(Address wallet, Chain chain) + { + TypedDataToSign typedData = new TypedDataToSign(wallet, chain, this); + return typedData.GetSignPayload(); + } + + public EncodeSapient DoEncodeSapient(Chain chain) + { + EncodeSapient encoded = new EncodeSapient + { + kind = (int)payload.type, + noChainId = chain != Chain.None, + calls = new EncodeSapient.EncodedCall[]{}, + space = BigInteger.Zero, + nonce = BigInteger.Zero, + message = "0x", + imageHash = "0x0000000000000000000000000000000000000000000000000000000000000000", + digest = "0x0000000000000000000000000000000000000000000000000000000000000000", + parentWallets = payload.parentWallets, + }; + + switch (payload) + { + case Calls callsPayload: + int callsLength = callsPayload.calls.Length; + encoded.calls = new EncodeSapient.EncodedCall[callsLength]; + for (int i = 0; i < callsLength; i++) + { + Call call = callsPayload.calls[i]; + encoded.calls[i] = new EncodeSapient.EncodedCall(call); + } + encoded.space = callsPayload.space; + encoded.nonce = callsPayload.nonce; + break; + + case Message messagePayload: + encoded.message = messagePayload.message.ByteArrayToHexStringWithPrefix(); + break; + + case ConfigUpdate configPayload: + encoded.imageHash = configPayload.imageHash; + break; + + case Digest digestPayload: + encoded.digest = digestPayload.digest; + break; + } + + return encoded; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parented.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parented.cs.meta new file mode 100644 index 00000000..bc4abf11 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parented.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bc8759a1ecbb4aaa84fb89ba442ae246 +timeCreated: 1747170242 \ No newline at end of file From c183a253e544c2bb9ecd23d23a52be069dca4181 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Wed, 14 May 2025 07:40:56 -0400 Subject: [PATCH 011/165] Added Calls.Decode - finishing the Payload implementation --- .../EcosystemWallet/Primitives/Calls.cs | 167 ++++++++++++++++++ .../SequenceSDK/Ethereum/Address/Address.cs | 12 ++ .../SequenceSDK/Utils/ByteArrayExtensions.cs | 10 ++ 3 files changed, 189 insertions(+) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs index 12704aaa..a680882b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.Numerics; +using NUnit.Framework; using Sequence.ABI; using Sequence.Utils; using UnityEngine.Scripting; +using StringExtensions = Sequence.Utils.StringExtensions; namespace Sequence.EcosystemWallet.Primitives { @@ -227,5 +229,170 @@ call flags layout (1 byte): return outBytes; } + + public static Calls Decode(byte[] packed, Address self = null) + { + int pointer = 0; + if (packed == null || packed.Length == 0) + { + throw new Exception("Invalid packed data: missing globalFlag; given empty byte[]"); + } + + // Read globalFlag + int globalFlag = packed[pointer]; + pointer++; + + // bit 0 => spaceZeroFlag + bool spaceZeroFlag = (globalFlag & 0x01) == 0x01; + BigInteger space = BigInteger.Zero; + + if (!spaceZeroFlag) + { + if (pointer + 20 > packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for space"); + } + + byte[] spaceBytes = packed.Slice(pointer, 20); + space = new BigInteger(spaceBytes, isUnsigned: true, isBigEndian: true); + pointer += 20; + } + + + // bits [1..3] => nonceSize + int nonceSize = (globalFlag >> 1) & 0x07; + BigInteger nonce = BigInteger.Zero; + if (nonceSize > 0) + { + if (pointer + nonceSize > packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for nonce"); + } + + byte[] nonceBytes = packed.Slice(pointer, nonceSize); + nonce = new BigInteger(nonceBytes, isUnsigned: true, isBigEndian: true); + pointer += nonceSize; + } + + // bit [4] => singleCallFlag + BigInteger callsCount = 1; + bool singleCallFlag = (globalFlag & 0x10) == 0x10; + if (!singleCallFlag) + { + // bit [5] => callsCountSizeFlag => 1 => 2 bytes, 0 => 1 byte + int countSize = (globalFlag & 0x20) == 0x20 ? 2 : 1; + if (pointer + countSize > packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for callsCount"); + } + + byte[] callsCountBytes = packed.Slice(pointer, countSize); + callsCount = new BigInteger(callsCountBytes, isUnsigned: true, isBigEndian: true); + pointer += countSize; + } + + List calls = new List(); + for (int i = 0; i < callsCount; i++) + { + if (pointer + 1 > packed.Length) + { + throw new Exception("Invalid packed data: missing call flags"); + } + int flags = packed[pointer]; + pointer++; + + // bit 0 => toSelf + Address to; + if ((flags & 0x01) == 0x01) + { + if (self == null) + { + throw new Exception("Missing 'self' address for toSelf call"); + } + to = self; + } + else + { + if (pointer + 20 > packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for address"); + } + + byte[] toBytes = packed.Slice(pointer, 20); + to = new Address(toBytes); + pointer += 20; + } + + // bit 1 => hasValue + BigInteger value = BigInteger.Zero; + if ((flags & 0x02) == 0x02) + { + if (pointer + 32 > packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for value"); + } + + byte[] valueBytes = packed.Slice(pointer, 32); + value = new BigInteger(valueBytes, isUnsigned: true, isBigEndian: true); + pointer += 32; + } + + // bit 2 => hasData + byte[] data = "0x".HexStringToByteArray(); + if ((flags & 0x04) == 0x04) + { + if (pointer + 3 > packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for data length"); + } + + byte[] dataLengthBytes = packed.Slice(pointer, 3); + int dataLength = (int)new BigInteger(dataLengthBytes, isUnsigned: true, isBigEndian: true); + pointer += 3; + + if (pointer + dataLength > packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for call data"); + } + + data = packed.Slice(pointer, dataLength); + pointer += dataLength; + } + + // bit 3 => hasGasLimit + BigInteger gasLimit = BigInteger.Zero; + if ((flags & 0x08) == 0x08) + { + if (pointer + 32 > packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for gasLimit"); + } + + byte[] gasLimitBytes = packed.Slice(pointer, 32); + gasLimit = new BigInteger(gasLimitBytes, isUnsigned: true, isBigEndian: true); + pointer += 32; + } + + // bits 4..5 => delegateCall, onlyFallback + bool delegateCall = (flags & 0x10) == 0x10; + bool onlyFallback = (flags & 0x20) == 0x20; + + // bits 6..7 => behaviorOnError + BehaviourOnError behaviorOnError = (BehaviourOnError)((flags & 0xc0) >> 6); + + Call call = new Call( + to, + value, + data, + gasLimit, + delegateCall, + onlyFallback, + behaviorOnError + ); + calls.Add(call); + } + + return new Calls(space, nonce, calls.ToArray()); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs index 4b490de9..1ed6d85a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs @@ -15,10 +15,22 @@ public class Address { /// /// public Address(string value) { + ValidateIsAddress(value); + Value = value; + } + + private void ValidateIsAddress(string value) + { if (!value.IsAddress()) { throw new ArgumentOutOfRangeException(nameof(value)); } + } + + public Address(byte[] bytes) + { + string value = bytes.ByteArrayToHexStringWithPrefix(); + ValidateIsAddress(value); Value = value; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs index e48aeccc..93513e53 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs @@ -139,5 +139,15 @@ public static byte[] ByteArrayFromNumber(this int value) return bytes; } + public static byte[] Slice(this byte[] source, int start, int length) + { + if (source == null) throw new ArgumentNullException(nameof(source)); + if (start < 0 || length < 0 || start + length > source.Length) + throw new ArgumentOutOfRangeException("Invalid slice range."); + + byte[] result = new byte[length]; + Buffer.BlockCopy(source, start, result, 0, length); + return result; + } } } \ No newline at end of file From 67ff522a27e414957824ab4737535375cfc84e92 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Wed, 14 May 2025 08:05:52 -0400 Subject: [PATCH 012/165] Moved Payload related primitives into a directory and created a directory for Signature as well. This will help to keep things more organized --- .../SequenceSDK/EcosystemWallet/Primitives/Payload.meta | 3 +++ .../Primitives/{ => Payload}/BehaviourOnError.cs | 0 .../Primitives/{ => Payload}/BehaviourOnError.cs.meta | 0 .../EcosystemWallet/Primitives/{ => Payload}/Call.cs | 0 .../EcosystemWallet/Primitives/{ => Payload}/Call.cs.meta | 0 .../EcosystemWallet/Primitives/{ => Payload}/Calls.cs | 0 .../EcosystemWallet/Primitives/{ => Payload}/Calls.cs.meta | 0 .../Primitives/{ => Payload}/ConfigUpdate.cs | 0 .../Primitives/{ => Payload}/ConfigUpdate.cs.meta | 0 .../EcosystemWallet/Primitives/{ => Payload}/Digest.cs | 0 .../Primitives/{ => Payload}/Digest.cs.meta | 0 .../EcosystemWallet/Primitives/{ => Payload}/Domain.cs | 0 .../Primitives/{ => Payload}/Domain.cs.meta | 0 .../Primitives/{ => Payload}/EncodeSapient.cs | 0 .../Primitives/{ => Payload}/EncodeSapient.cs.meta | 0 .../EcosystemWallet/Primitives/{ => Payload}/Message.cs | 0 .../Primitives/{ => Payload}/Message.cs.meta | 0 .../EcosystemWallet/Primitives/{ => Payload}/NamedType.cs | 0 .../Primitives/{ => Payload}/NamedType.cs.meta | 0 .../EcosystemWallet/Primitives/{ => Payload}/Parent.cs | 0 .../Primitives/{ => Payload}/Parent.cs.meta | 0 .../EcosystemWallet/Primitives/{ => Payload}/Parented.cs | 0 .../Primitives/{ => Payload}/Parented.cs.meta | 0 .../EcosystemWallet/Primitives/{ => Payload}/Payload.cs | 0 .../Primitives/{ => Payload}/Payload.cs.meta | 0 .../Primitives/{ => Payload}/PayloadType.cs | 0 .../Primitives/{ => Payload}/PayloadType.cs.meta | 0 .../Primitives/{ => Payload}/TypedDataToSign.cs | 0 .../Primitives/{ => Payload}/TypedDataToSign.cs.meta | 0 .../SequenceSDK/EcosystemWallet/Primitives/Signature.meta | 3 +++ .../EcosystemWallet/Primitives/Signature/Signature.cs | 7 +++++++ .../EcosystemWallet/Primitives/Signature/Signature.cs.meta | 3 +++ 32 files changed, 16 insertions(+) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.meta rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/BehaviourOnError.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/BehaviourOnError.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Call.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Call.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Calls.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Calls.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/ConfigUpdate.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/ConfigUpdate.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Digest.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Digest.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Domain.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Domain.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/EncodeSapient.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/EncodeSapient.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Message.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Message.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/NamedType.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/NamedType.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Parent.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Parent.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Parented.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Parented.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Payload.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/Payload.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/PayloadType.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/PayloadType.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/TypedDataToSign.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/{ => Payload}/TypedDataToSign.cs.meta (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.meta new file mode 100644 index 00000000..2ea5fc0c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 70fed1530705484a9c9c056ff32493be +timeCreated: 1747224268 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/BehaviourOnError.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/BehaviourOnError.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/BehaviourOnError.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/BehaviourOnError.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/BehaviourOnError.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/BehaviourOnError.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/BehaviourOnError.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/BehaviourOnError.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Call.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Calls.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/ConfigUpdate.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Digest.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Domain.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/EncodeSapient.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Message.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/NamedType.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/NamedType.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/NamedType.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/NamedType.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parent.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parent.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parent.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parent.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parent.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parented.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parented.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parented.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Parented.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Payload.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Payload.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Payload.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Payload.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/PayloadType.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/PayloadType.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/PayloadType.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/PayloadType.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/PayloadType.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/PayloadType.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/PayloadType.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/PayloadType.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/TypedDataToSign.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature.meta new file mode 100644 index 00000000..ede69d2d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4ac89dbf845f445dbe442833976e6d2b +timeCreated: 1747224281 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs new file mode 100644 index 00000000..7252b94c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs @@ -0,0 +1,7 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public class Signature + { + + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs.meta new file mode 100644 index 00000000..4618e1ca --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7268a3747990492eae4a959ca3595c06 +timeCreated: 1747224287 \ No newline at end of file From 473e8510a4bc420a27334c7a90d215b87c537fb0 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Wed, 14 May 2025 17:09:26 -0400 Subject: [PATCH 013/165] Added base data types to signature folder --- .../EcosystemWallet/Primitives/Config.meta | 3 ++ .../EcosystemWallet/Primitives/Config/Leaf.cs | 7 +++++ .../Primitives/Config/Leaf.cs.meta | 3 ++ .../Primitives/Config/SapientSignerLeaf.cs | 14 ++++++++++ .../Config/SapientSignerLeaf.cs.meta | 3 ++ .../Primitives/Config/SignerLeaf.cs | 13 +++++++++ .../Primitives/Config/SignerLeaf.cs.meta | 3 ++ .../Primitives/Signature/FLAG.cs | 17 +++++++++++ .../Primitives/Signature/FLAG.cs.meta | 3 ++ .../Primitives/Signature/RSY.cs | 12 ++++++++ .../Primitives/Signature/RSY.cs.meta | 3 ++ .../Primitives/Signature/RawConfig.cs | 12 ++++++++ .../Primitives/Signature/RawConfig.cs.meta | 3 ++ .../Primitives/Signature/RawLeaf.cs | 7 +++++ .../Primitives/Signature/RawLeaf.cs.meta | 3 ++ .../Primitives/Signature/RawNestedLeaf.cs | 12 ++++++++ .../Signature/RawNestedLeaf.cs.meta | 3 ++ .../Primitives/Signature/RawNode.cs | 8 ++++++ .../Primitives/Signature/RawNode.cs.meta | 3 ++ .../Primitives/Signature/RawSignature.cs | 17 +++++++++++ .../Primitives/Signature/RawSignature.cs.meta | 3 ++ .../Primitives/Signature/RawSignerLeaf.cs | 16 +++++++++++ .../Signature/RawSignerLeaf.cs.meta | 3 ++ .../Primitives/Signature/RawTopology.cs | 28 +++++++++++++++++++ .../Primitives/Signature/RawTopology.cs.meta | 3 ++ .../Primitives/Signature/Signature.cs | 2 +- .../Signature/SignatureOfSapientSignerLeaf.cs | 15 ++++++++++ .../SignatureOfSapientSignerLeaf.cs.meta | 3 ++ .../Signature/SignatureOfSignerLeaf.cs | 7 +++++ .../Signature/SignatureOfSignerLeaf.cs.meta | 3 ++ .../Signature/SignatureOfSignerLeafErc1271.cs | 9 ++++++ .../SignatureOfSignerLeafErc1271.cs.meta | 3 ++ .../Signature/SignatureOfSignerLeafEthSign.cs | 7 +++++ .../SignatureOfSignerLeafEthSign.cs.meta | 3 ++ .../Signature/SignatureOfSignerLeafHash.cs | 7 +++++ .../SignatureOfSignerLeafHash.cs.meta | 3 ++ .../Signature/SignedSapientSignerLeaf.cs | 7 +++++ .../Signature/SignedSapientSignerLeaf.cs.meta | 3 ++ .../Primitives/Signature/SignedSignerLeaf.cs | 7 +++++ .../Signature/SignedSignerLeaf.cs.meta | 3 ++ 40 files changed, 283 insertions(+), 1 deletion(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config.meta new file mode 100644 index 00000000..68a8541b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1fad26a9524841fc8690177bc3db0fe1 +timeCreated: 1747225309 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs new file mode 100644 index 00000000..2cdef16c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs @@ -0,0 +1,7 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal abstract class Leaf : RawLeaf + { + + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs.meta new file mode 100644 index 00000000..e292686c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 68318e08f48d4293a2819ec511f202da +timeCreated: 1747255961 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs new file mode 100644 index 00000000..6e743de4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs @@ -0,0 +1,14 @@ +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class SapientSignerLeaf : Leaf + { + public const string type = "sapient-signer"; + public Address address; + public BigInteger weight; + public string imageHash; + public bool signed; + public SignatureOfSapientSignerLeaf signature; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs.meta new file mode 100644 index 00000000..132581ce --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1a6cf3d0dfd64b269be29f215528c592 +timeCreated: 1747225587 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs new file mode 100644 index 00000000..5395e705 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs @@ -0,0 +1,13 @@ +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class SignerLeaf : Leaf + { + public const string type = "signer"; + public Address address; + public BigInteger weight; + public bool signed; + public SignatureOfSignerLeaf signature; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs.meta new file mode 100644 index 00000000..bba132e0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 017b0ffb24d04e7e946b8fba9d62103c +timeCreated: 1747225322 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs new file mode 100644 index 00000000..ccaf97d5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs @@ -0,0 +1,17 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal enum FLAG + { + SIGNATURE_HASH = 0, + ADDRESS = 1, + SIGNATURE_ERC1271 = 2, + NODE = 3, + BRANCH = 4, + SUBDIGEST = 5, + NESTED = 6, + SIGNATURE_ETH_SIGN = 7, + SIGNATURE_ANY_ADDRESS_SUBDIGEST = 8, + SIGNATURE_SAPIENT = 9, + SIGNATURE_SAPIENT_COMPACT = 10, + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs.meta new file mode 100644 index 00000000..d37a0a35 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1e2a94e26e344dfbb5f82a75e4742313 +timeCreated: 1747224577 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs new file mode 100644 index 00000000..8590f394 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs @@ -0,0 +1,12 @@ +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal abstract class RSY : SignatureOfSignerLeaf + { + public abstract string type { get; } + public BigInteger r; + public BigInteger s; + public BigInteger yParity; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs.meta new file mode 100644 index 00000000..4aa553ac --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4343c48ce26a49a08ae170aba0714c8e +timeCreated: 1747224598 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs new file mode 100644 index 00000000..b5d07045 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs @@ -0,0 +1,12 @@ +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class RawConfig + { + public BigInteger threshold; + public BigInteger checkpoint; + public RawTopology topology; + public Address checkpointer; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs.meta new file mode 100644 index 00000000..e236aba6 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7fc6fd4fab4649659daedc97e68fab69 +timeCreated: 1747256590 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs new file mode 100644 index 00000000..88ef4c98 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs @@ -0,0 +1,7 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal abstract class RawLeaf + { + + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs.meta new file mode 100644 index 00000000..ddf6db8c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 786152a073eb441f8d96336a9ad00476 +timeCreated: 1747256354 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs new file mode 100644 index 00000000..49194551 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs @@ -0,0 +1,12 @@ +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class RawNestedLeaf : RawLeaf + { + public const string type = "nested"; + public RawTopology tree; + public BigInteger weight; + public BigInteger threshold; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs.meta new file mode 100644 index 00000000..cf61ff74 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1cb8fd6f984741aeba6930072b2b1424 +timeCreated: 1747256077 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs new file mode 100644 index 00000000..fd93ca7f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs @@ -0,0 +1,8 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class RawNode + { + public RawTopology left; + public RawTopology right; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs.meta new file mode 100644 index 00000000..24a5a1b0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 76795715dcab466ebac2248e22b70772 +timeCreated: 1747256161 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs new file mode 100644 index 00000000..5a1e53a0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -0,0 +1,17 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class RawSignature + { + public bool noChainId; + public byte[] checkpointerData; + public RawConfig configuration; + public RawSignature[] suffix; + public Erc6492 erc6492; + + public class Erc6492 + { + public Address to; + public byte[] data; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs.meta new file mode 100644 index 00000000..a6fbe6cf --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ec0d914946d147d093a4e72c9ca263b7 +timeCreated: 1747256677 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs new file mode 100644 index 00000000..33283d32 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs @@ -0,0 +1,16 @@ +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class RawSignerLeaf : RawLeaf + { + public const string type = "unrecovered-signer"; + public BigInteger weight; + public SignatureType signature; + } + + internal abstract class SignatureType + { + + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs.meta new file mode 100644 index 00000000..09a2bf01 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9702ffb82ba4491abb965b99775440eb +timeCreated: 1747225789 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs new file mode 100644 index 00000000..db8e5dad --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs @@ -0,0 +1,28 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class RawTopology + { + public RawLeaf Leaf { get; private set; } + public RawNode Node { get; private set; } + + public RawTopology(RawLeaf leaf) + { + this.Leaf = leaf; + } + + public RawTopology(RawNode node) + { + this.Node = node; + } + + public bool IsLeaf() + { + return this.Leaf != null; + } + + public bool IsNode() + { + return this.Node != null; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs.meta new file mode 100644 index 00000000..01cc943f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 377a53364b3142c5a8a450c27848ca06 +timeCreated: 1747256210 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs index 7252b94c..ecd4bdcc 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - public class Signature + internal class Signature { } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs new file mode 100644 index 00000000..68da0579 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs @@ -0,0 +1,15 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class SignatureOfSapientSignerLeaf : SignatureType + { + public Address address; + public byte[] data; + public Type type; + + public enum Type + { + sapient, + sapient_compact + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs.meta new file mode 100644 index 00000000..7c8042a0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 943dd4c8f9db43148d27b9dc750a602a +timeCreated: 1747225126 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs new file mode 100644 index 00000000..0b8ccd53 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs @@ -0,0 +1,7 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal abstract class SignatureOfSignerLeaf : SignatureType + { + + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs.meta new file mode 100644 index 00000000..1a37c803 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d65a771d16af424d88a14704daf16e38 +timeCreated: 1747225067 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs new file mode 100644 index 00000000..fa789f29 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs @@ -0,0 +1,9 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class SignatureOfSignerLeafErc1271 : SignatureOfSignerLeaf + { + public const string type = "erc1271"; + public Address address; + public byte[] data; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs.meta new file mode 100644 index 00000000..af151d1a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fecc49bde72f482bb0fd161d462f40f5 +timeCreated: 1747224981 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs new file mode 100644 index 00000000..0251ae24 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs @@ -0,0 +1,7 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class SignatureOfSignerLeafEthSign : RSY + { + public override string type => "eth_sign"; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs.meta new file mode 100644 index 00000000..e4eb5ef6 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0261f16258e643e89e03e4f7d0e81fb1 +timeCreated: 1747224706 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs new file mode 100644 index 00000000..8659d457 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs @@ -0,0 +1,7 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class SignatureOfSignerLeafHash : RSY + { + public override string type => "hash"; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs.meta new file mode 100644 index 00000000..53a1d020 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b4234d5ade27452282943e5d874413e4 +timeCreated: 1747224930 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs new file mode 100644 index 00000000..1cc97627 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs @@ -0,0 +1,7 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class SignedSapientSignerLeaf : SapientSignerLeaf + { + public bool signed = true; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs.meta new file mode 100644 index 00000000..e2cd134b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 919667e4699542238273d9f6566d3f65 +timeCreated: 1747225548 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs new file mode 100644 index 00000000..13d8ec20 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs @@ -0,0 +1,7 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class SignedSignerLeaf : SignerLeaf + { + public bool signed = true; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs.meta new file mode 100644 index 00000000..9a0313ef --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 513820b838a74bf78b8c710981399584 +timeCreated: 1747225421 \ No newline at end of file From 1e03ee1334a30c4e689309904d40449f8c583bd5 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Wed, 14 May 2025 17:27:48 -0400 Subject: [PATCH 014/165] Added base data types to Config folder --- .../Config/AnyAddressSubdigestLeaf.cs | 8 ++++++ .../Config/AnyAddressSubdigestLeaf.cs.meta | 3 ++ .../Primitives/Config/Config.cs | 12 ++++++++ .../Primitives/Config/Config.cs.meta | 3 ++ .../Primitives/Config/NestedLeaf.cs | 12 ++++++++ .../Primitives/Config/NestedLeaf.cs.meta | 3 ++ .../EcosystemWallet/Primitives/Config/Node.cs | 8 ++++++ .../Primitives/Config/Node.cs.meta | 3 ++ .../Primitives/Config/NodeLeaf.cs | 12 ++++++++ .../Primitives/Config/NodeLeaf.cs.meta | 3 ++ .../Primitives/Config/SubdigestLeaf.cs | 8 ++++++ .../Primitives/Config/SubdigestLeaf.cs.meta | 3 ++ .../Primitives/Config/Topology.cs | 28 +++++++++++++++++++ .../Primitives/Config/Topology.cs.meta | 3 ++ 14 files changed, 109 insertions(+) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs new file mode 100644 index 00000000..586934f2 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs @@ -0,0 +1,8 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class AnyAddressSubdigestLeaf : Leaf + { + public const string type = "any-address-subdigest"; + public byte[] digest; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs.meta new file mode 100644 index 00000000..0cd8ace7 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0cd45e34d1ee48f9baae0917a6906b70 +timeCreated: 1747257572 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs new file mode 100644 index 00000000..6ed9305f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs @@ -0,0 +1,12 @@ +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class Config + { + public BigInteger threshold; + public BigInteger checkpoint; + public Topology topology; + public Address checkpointer; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs.meta new file mode 100644 index 00000000..36dea36c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4a376e2a551b40e6a9054d6a8e93e366 +timeCreated: 1747257977 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs new file mode 100644 index 00000000..e950dde5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs @@ -0,0 +1,12 @@ +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class NestedLeaf : Leaf + { + public const string type = "nested"; + public Topology tree; + public BigInteger weight; + public BigInteger threshold; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs.meta new file mode 100644 index 00000000..35050505 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 97d23752118c46a7811beae9b12aed1b +timeCreated: 1747257623 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs new file mode 100644 index 00000000..698d9c2c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs @@ -0,0 +1,8 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class Node + { + public Topology left; + public Topology right; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs.meta new file mode 100644 index 00000000..0dde3477 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 40b9fd2c417b499596eb29a3aa1e05d0 +timeCreated: 1747257859 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs new file mode 100644 index 00000000..c45b73dd --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs @@ -0,0 +1,12 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class NodeLeaf : Leaf + { + public byte[] Value; + + public static implicit operator byte[](NodeLeaf leaf) + { + return leaf.Value; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs.meta new file mode 100644 index 00000000..91c970af --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ae4cfd09c3bb4831912c60086cefb118 +timeCreated: 1747257722 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs new file mode 100644 index 00000000..6e68af81 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs @@ -0,0 +1,8 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class SubdigestLeaf : Leaf + { + public const string type = "subdigest"; + public byte[] digest; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs.meta new file mode 100644 index 00000000..82722bbe --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0cfc397387c84e5789a2d49f04772fdd +timeCreated: 1747257508 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs new file mode 100644 index 00000000..cd1f3b48 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -0,0 +1,28 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class Topology + { + public Node Node; + public Leaf Leaf; + + public Topology(Leaf leaf) + { + this.Leaf = leaf; + } + + public Topology(Node node) + { + this.Node = node; + } + + public bool IsLeaf() + { + return this.Leaf != null; + } + + public bool IsNode() + { + return this.Node != null; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs.meta new file mode 100644 index 00000000..06d9aeed --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 17cd613d343a4491938119c51193fd21 +timeCreated: 1747257897 \ No newline at end of file From ca790df6670c9f938d64c1608b8cd2856cf8fed4 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Wed, 14 May 2025 17:42:04 -0400 Subject: [PATCH 015/165] Added Network class definition and constructor --- .../EcosystemWallet/Primitives/Network.meta | 3 ++ .../Primitives/Network/Network.cs | 35 +++++++++++++++++++ .../Primitives/Network/Network.cs.meta | 3 ++ 3 files changed, 41 insertions(+) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Network.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Network/Network.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Network/Network.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Network.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Network.meta new file mode 100644 index 00000000..778bf4f5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Network.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 91bbeb41de1d48c99911619c7024fc14 +timeCreated: 1747258387 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Network/Network.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Network/Network.cs new file mode 100644 index 00000000..f3af50c7 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Network/Network.cs @@ -0,0 +1,35 @@ +using System.Numerics; +using Sequence.Provider; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class Network + { + public string name; + public string rpc; + public BigInteger chainId; + public string explorer; + public NativeCurrency nativeCurrency; + + public class NativeCurrency + { + public string name; + public string symbol; + public BigInteger decimals; + } + + public Network(Chain chain, ulong nativeCurrencyDecimals = 18) + { + name = ChainDictionaries.NameOf[chain]; + rpc = NodeGatewayBridge.GetNodeGatewayUrl(chain); + chainId = BigInteger.Parse(ChainDictionaries.ChainIdOf[chain]); + explorer = ChainDictionaries.BlockExplorerOf[chain]; + nativeCurrency = new NativeCurrency() + { + name = ChainDictionaries.GasCurrencyOf[chain], + symbol = ChainDictionaries.GasCurrencyOf[chain], + decimals = (BigInteger)nativeCurrencyDecimals + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Network/Network.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Network/Network.cs.meta new file mode 100644 index 00000000..fc563e17 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Network/Network.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f0112c0ee7854500b05584ddb6fc7c67 +timeCreated: 1747258396 \ No newline at end of file From 1e06555a6135c9c93f789109012ff9bcb1531124 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Wed, 14 May 2025 17:52:32 -0400 Subject: [PATCH 016/165] Added basic data types to Attestation folder --- .../Primitives/Attestation.meta | 3 ++ .../Primitives/Attestation/Attestation.cs | 37 +++++++++++++++++++ .../Attestation/Attestation.cs.meta | 3 ++ .../Primitives/Attestation/AuthData.cs | 7 ++++ .../Primitives/Attestation/AuthData.cs.meta | 3 ++ 5 files changed, 53 insertions(+) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation.meta new file mode 100644 index 00000000..c07e565d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4ef71fe7d0944732a01ec48c4f3d21ff +timeCreated: 1747259101 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs new file mode 100644 index 00000000..b056c99e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs @@ -0,0 +1,37 @@ +using System; +using Sequence.ABI; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class Attestation + { + public Address approvedSigner; + public FixedByte identityType; + public FixedByte issuerHash; + public FixedByte audienceHash; + public byte[] applicationData; + public AuthData authData; + + public Attestation(Address approvedSigner, FixedByte identityType, FixedByte issuerHash, FixedByte audienceHash, byte[] applicationData, AuthData authData) + { + this.approvedSigner = approvedSigner; + AssertHasSize(identityType, 4, nameof(identityType)); + this.identityType = identityType; + AssertHasSize(issuerHash, 32, nameof(issuerHash)); + this.issuerHash = issuerHash; + AssertHasSize(audienceHash, 32, nameof(audienceHash)); + this.audienceHash = audienceHash; + this.applicationData = applicationData; + this.authData = authData; + } + + private void AssertHasSize(FixedByte obj, int size, string argumentName) + { + if (obj.Count != size) + { + throw new ArgumentException( + $"{argumentName} with size of {obj.Count} exceeds allowed size of {size} bytes"); + } + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs.meta new file mode 100644 index 00000000..fe608cf7 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f1d70a1795c34c47986bb2f42abee0e6 +timeCreated: 1747259110 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs new file mode 100644 index 00000000..11946556 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs @@ -0,0 +1,7 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class AuthData + { + public string redirectUrl; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs.meta new file mode 100644 index 00000000..9e0cff55 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6762365b044d4895b30122a1b8ee93d2 +timeCreated: 1747259444 \ No newline at end of file From ebdc6d57e33e02caea888f744fcc3cbdafef64bd Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Wed, 14 May 2025 18:31:49 -0400 Subject: [PATCH 017/165] Implemented attestation methods --- .../Primitives/Attestation/Attestation.cs | 86 +++++++++++++++++++ .../Primitives/Attestation/AuthData.cs | 18 ++++ .../SequenceSDK/Utils/StringExtensions.cs | 33 +++++++ 3 files changed, 137 insertions(+) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs index b056c99e..73c634b5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs @@ -1,10 +1,16 @@ using System; +using Newtonsoft.Json; using Sequence.ABI; +using Sequence.Utils; +using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives { internal class Attestation { + public static readonly byte[] ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX = + SequenceCoder.KeccakHash("acceptImplicitRequest".ToByteArray()); + public Address approvedSigner; public FixedByte identityType; public FixedByte issuerHash; @@ -33,5 +39,85 @@ private void AssertHasSize(FixedByte obj, int size, string argumentName) $"{argumentName} with size of {obj.Count} exceeds allowed size of {size} bytes"); } } + + public byte[] Encode() + { + byte[] authDataBytes = authData.Encode(); + byte[] approvedSignerBytes = approvedSigner.Value.HexStringToByteArray(20); + byte[] identityTypeBytes = identityType.Data.Slice(0, 4).PadLeft(4); + byte[] issuerHashBytes = issuerHash.Data.PadLeft(32); + byte[] audienceHashBytes = audienceHash.Data.PadLeft(32); + byte[] applicationDataLengthBytes = applicationData.Length.ByteArrayFromNumber(3); + return ByteArrayExtensions.ConcatenateByteArrays(approvedSignerBytes, identityTypeBytes, issuerHashBytes, + audienceHashBytes, applicationDataLengthBytes, applicationData, authDataBytes); + } + + public byte[] Hash() + { + byte[] encoded = Encode(); + return SequenceCoder.KeccakHash(encoded); + } + + public string ToJson() // Todo make this a JsonConverter + { + JsonAttestation jsonAble = new JsonAttestation(this); + return JsonConvert.ToString(jsonAble); + } + + public Attestation(JsonAttestation jsonAble) + { + this.approvedSigner = jsonAble.approvedSigner; + this.identityType = new FixedByte(4, jsonAble.identityType.HexStringToByteArray()); + this.issuerHash = new FixedByte(32, jsonAble.issuerHash.HexStringToByteArray()); + this.audienceHash = new FixedByte(32, jsonAble.audienceHash.HexStringToByteArray()); + this.applicationData = jsonAble.applicationData.HexStringToByteArray(); + this.authData = jsonAble.authData; + } + + public Attestation FromJson(string json) // Todo make this a JsonConverter + { + JsonAttestation jsonAble = JsonConvert.DeserializeObject(json); + return new Attestation(jsonAble); + } + + public byte[] GenerateImplicitRequestMagic(Address wallet) + { + byte[] walletBytes = wallet.Value.HexStringToByteArray(20); + return ByteArrayExtensions.ConcatenateByteArrays(ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX, walletBytes, + audienceHash.Data, issuerHash.Data); + } + + [Serializable] + internal class JsonAttestation + { + public Address approvedSigner; + public string identityType; + public string issuerHash; + public string audienceHash; + public string applicationData; + public AuthData authData; + + [JsonConstructor] + [Preserve] + public JsonAttestation(Address approvedSigner, string identityType, string issuerHash, string audienceHash, string applicationData, AuthData authData) + { + this.approvedSigner = approvedSigner; + this.identityType = identityType; + this.issuerHash = issuerHash; + this.audienceHash = audienceHash; + this.applicationData = applicationData; + this.authData = authData; + } + + public JsonAttestation(Attestation attestation) + { + this.approvedSigner = attestation.approvedSigner; + this.identityType = attestation.identityType.Data.ByteArrayToHexStringWithPrefix(); + this.issuerHash = attestation.issuerHash.Data.ByteArrayToHexStringWithPrefix(); + this.audienceHash = attestation.audienceHash.Data.ByteArrayToHexStringWithPrefix(); + this.applicationData = attestation.applicationData.ByteArrayToHexStringWithPrefix(); + this.authData = attestation.authData; + } + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs index 11946556..ca5e144d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs @@ -1,7 +1,25 @@ +using System; +using Sequence.Utils; +using UnityEngine.Scripting; + namespace Sequence.EcosystemWallet.Primitives { + [Serializable] internal class AuthData { public string redirectUrl; + + [Preserve] + public AuthData(string redirectUrl) + { + this.redirectUrl = redirectUrl; + } + + public byte[] Encode() + { + byte[] redirectUrlLength = ByteArrayExtensions.ByteArrayFromNumber(redirectUrl.Length, 3); + byte[] redirectUrlBytes = redirectUrl.ToByteArray(); + return ByteArrayExtensions.ConcatenateByteArrays(redirectUrlLength, redirectUrlBytes); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/StringExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/StringExtensions.cs index a5e8d36d..5ca9bb7e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/StringExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/StringExtensions.cs @@ -193,6 +193,39 @@ public static byte[] HexStringToByteArray(this string value) return result; } + + public static byte[] HexStringToByteArray(this string hex, int expectedSize) + { + if (hex.StartsWith("0x")) + { + hex = hex.Substring(2); + } + + int byteCount = hex.Length / 2; + byte[] rawBytes = new byte[byteCount]; + + for (int i = 0; i < byteCount; i++) + { + string byteValue = hex.Substring(i * 2, 2); + rawBytes[i] = Convert.ToByte(byteValue, 16); + } + + if (rawBytes.Length == expectedSize) + { + return rawBytes; + } + + if (rawBytes.Length > expectedSize) + { + byte[] trimmed = new byte[expectedSize]; + Buffer.BlockCopy(rawBytes, rawBytes.Length - expectedSize, trimmed, 0, expectedSize); + return trimmed; + } + + byte[] padded = new byte[expectedSize]; + Buffer.BlockCopy(rawBytes, 0, padded, expectedSize - rawBytes.Length, rawBytes.Length); + return padded; + } public static string StringToBase64(this string value) { From 46d1893773d80d5bd464260403a34b978fdecdde Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 22 May 2025 14:28:19 -0400 Subject: [PATCH 018/165] Integration test server setup and implemented some basic payload tests to confirm that the test server is setup properly --- Assets/SequenceSDK/EcosystemWallet.meta | 3 + .../EcosystemWallet/IntegrationTests.meta | 3 + .../IntegrationTests/PayloadTests.cs | 99 ++++++ .../IntegrationTests/PayloadTests.cs.meta | 3 + .../IntegrationTests/README.md | 1 + .../IntegrationTests/README.md.meta | 3 + .../SequenceEcosystemWalletTests.asmdef | 25 ++ .../SequenceEcosystemWalletTests.asmdef.meta | 7 + .../IntegrationTests/Server.meta | 3 + .../Server/JsonRpcErrorResponse.cs | 41 +++ .../Server/JsonRpcErrorResponse.cs.meta | 3 + .../IntegrationTests/Server/JsonRpcRequest.cs | 23 ++ .../Server/JsonRpcRequest.cs.meta | 3 + .../Server/JsonRpcResponse.cs | 10 + .../Server/JsonRpcResponse.cs.meta | 3 + .../Server/JsonRpcSuccessResponse.cs | 25 ++ .../Server/JsonRpcSuccessResponse.cs.meta | 3 + .../IntegrationTests/Server/Server.cs | 292 ++++++++++++++++++ .../IntegrationTests/Server/Server.cs.meta | 3 + .../Primitives/Payload/Call.cs | 2 +- .../Primitives/Payload/Calls.cs | 7 +- .../Primitives/Payload/ConfigUpdate.cs | 5 + .../Primitives/Payload/Digest.cs | 5 + .../Primitives/Payload/EncodeSapient.cs | 2 +- .../Primitives/Payload/Message.cs | 6 + .../Primitives/Payload/Parented.cs | 27 +- .../Primitives/Payload/Payload.cs | 2 +- .../Primitives/Payload/PayloadType.cs | 2 +- .../Primitives/Payload/SolidityDecoded.cs | 62 ++++ .../Payload/SolidityDecoded.cs.meta | 3 + .../SequenceSDK/Ethereum/Contract/Contract.cs | 1 + 31 files changed, 671 insertions(+), 6 deletions(-) create mode 100644 Assets/SequenceSDK/EcosystemWallet.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SequenceEcosystemWalletTests.asmdef create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SequenceEcosystemWalletTests.asmdef.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcErrorResponse.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcErrorResponse.cs.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcRequest.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcRequest.cs.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcResponse.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcResponse.cs.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcSuccessResponse.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcSuccessResponse.cs.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet.meta b/Assets/SequenceSDK/EcosystemWallet.meta new file mode 100644 index 00000000..7482c3a9 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e5adbba507854dd4a761dc4fcce55373 +timeCreated: 1747311539 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests.meta new file mode 100644 index 00000000..d476b25f --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1c12f07aef194063abd37cf5d6f5075b +timeCreated: 1747311555 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs new file mode 100644 index 00000000..ae30f926 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Numerics; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Sequence.ABI; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public class PayloadTests + { + public async Task PayloadToAbi(Dictionary parameters) + { + string inputPayload = parameters["payload"] as string; + throw new NotImplementedException("Not implemented"); + } + + public async Task PayloadToPacked(Dictionary parameters) + { + string inputPayload = (string)parameters["payload"]; + Address wallet = new Address((string)parameters["wallet"]); + string result = DoConvertToPacked(inputPayload, wallet); + return result; + } + + private string DoConvertToPacked(string payload, Address wallet) + { + Parented decodedPayload = null; + try + { + decodedPayload = Parented.DecodeFromSolidityEncoding(payload); + } + catch (Exception ex) + { + throw new Exception($"Failed to decode payload: {ex.Message}", ex); + } + + if (decodedPayload == null || decodedPayload.payload == null) + { + throw new Exception("Decoded payload is null or invalid"); + } + + if (decodedPayload.payload.isCalls) + { + byte[] packed = ((Calls)decodedPayload.payload).Encode(wallet); + return packed.ByteArrayToHexStringWithPrefix(); + } + + throw new Exception("Not implemented or unsupported payload format"); + } + + public async Task PayloadToJson(Dictionary parameters) + { + string inputPayload = (string)parameters["payload"]; + Address wallet = new Address((string)parameters["wallet"]); + string result = DoConvertToJson(inputPayload); + return result; + } + + private string DoConvertToJson(string payload) + { + SolidityDecoded decoded = SolidityDecoded.FromSolidityEncoding(payload); + return JsonConvert.SerializeObject(decoded); + } + + public async Task PayloadHashFor(Dictionary parameters) + { + string inputPayload = (string)parameters["payload"]; + Address wallet = new Address((string)parameters["wallet"]); + BigInteger chainId = (BigInteger)parameters["chainId"]; + string result = DoHash(inputPayload, wallet, chainId); + return result; + } + + private string DoHash(string payload, Address wallet, BigInteger chainId) + { + Parented decodedPayload = null; + try + { + decodedPayload = Parented.DecodeFromSolidityEncoding(payload); + } + catch (Exception ex) + { + throw new Exception($"Failed to decode payload: {ex.Message}", ex); + } + + if (decodedPayload == null || decodedPayload.payload == null) + { + throw new Exception("Decoded payload is null or invalid"); + } + + + byte[] hashed = decodedPayload.Hash(wallet, ChainDictionaries.ChainById[chainId.ToString()]); + return hashed.ByteArrayToHexStringWithPrefix(); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs.meta new file mode 100644 index 00000000..b020aeed --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2797ac4bd0ae4b4cae94990db0e8f9f9 +timeCreated: 1747342995 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md new file mode 100644 index 00000000..26c3e6d1 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md @@ -0,0 +1 @@ +These integration tests require a local instance of the server described (and implemented) [here](https://github.com/0xsequence/wallet-contracts-v3). They are useful to confirm that the primitives are working properly. They will run indefinitely and hit the SDK with a variety of random inputs to see if it handles them correctly. Since they run indefinitely, it is best to only run these when interacting with the Sequence.EcosystemWallet.Primitives namespace. \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md.meta new file mode 100644 index 00000000..92af114e --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 36752f6ad2154d71b7d58fea0eee1ae5 +timeCreated: 1747311802 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SequenceEcosystemWalletTests.asmdef b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SequenceEcosystemWalletTests.asmdef new file mode 100644 index 00000000..b8bcae27 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SequenceEcosystemWalletTests.asmdef @@ -0,0 +1,25 @@ +{ + "name": "SequenceEcosystemWalletTests", + "rootNamespace": "Sequence.EcosystemWallet.Tests", + "references": [ + "GUID:68e161619428e430bba22d7d0a9548ab", + "GUID:f7fd4ba36aabd1d499450c174865e70b", + "GUID:8cb4ab25ee18e4b4da9647cf481addbb", + "GUID:f78a27d6a73d94c4baf04337e0add4dc", + "GUID:6055be8ebefd69e48b49212b09b47b2f", + "GUID:a35e3a53d4439435f8b36ed2c6158cd8", + "GUID:403077141e1554429a890cbc129df651", + "GUID:b4f9c0f8f363f439b9e337f79050f189" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "Newtonsoft.Json.dll" + ], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SequenceEcosystemWalletTests.asmdef.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SequenceEcosystemWalletTests.asmdef.meta new file mode 100644 index 00000000..e5de612b --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SequenceEcosystemWalletTests.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d506ba740fcbc4d988cc4753228a08f2 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server.meta new file mode 100644 index 00000000..f218a456 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c8ef6d993e2e4add82a417ee4777f0a9 +timeCreated: 1747312060 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcErrorResponse.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcErrorResponse.cs new file mode 100644 index 00000000..11ead337 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcErrorResponse.cs @@ -0,0 +1,41 @@ +using System; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.IntegrationTests.Server +{ + [Serializable] + internal class JsonRpcErrorResponse : JsonRpcResponse + { + public const string jsonrpc = "2.0"; + public Error error; + public string id; + + [Preserve] + public JsonRpcErrorResponse(Error error, string id) + { + this.error = error; + this.id = id; + } + + [Serializable] + public class Error + { + public int code; + public string message; + public object data; + + [Preserve] + public Error(int code, string message, object data = null) + { + this.code = code; + this.message = message; + this.data = data; + } + } + + public override bool IsError() + { + return true; + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcErrorResponse.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcErrorResponse.cs.meta new file mode 100644 index 00000000..df4822dc --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcErrorResponse.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: afd7cd8f012c481e8782c7f177daca21 +timeCreated: 1747312202 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcRequest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcRequest.cs new file mode 100644 index 00000000..327412c8 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcRequest.cs @@ -0,0 +1,23 @@ +using System; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.IntegrationTests.Server +{ + [Serializable] + internal class JsonRpcRequest + { + public string jsonrpc; + public string method; + public object @params; + public string id; + + [Preserve] + public JsonRpcRequest(string jsonrpc, string method, object @params, string id) + { + this.jsonrpc = jsonrpc; + this.method = method; + this.@params = @params; + this.id = id; + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcRequest.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcRequest.cs.meta new file mode 100644 index 00000000..d70441e0 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcRequest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 97c7b49c2c364103a2731a73821890d5 +timeCreated: 1747312076 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcResponse.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcResponse.cs new file mode 100644 index 00000000..08677f37 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcResponse.cs @@ -0,0 +1,10 @@ +using System; + +namespace Sequence.EcosystemWallet.IntegrationTests.Server +{ + [Serializable] + internal abstract class JsonRpcResponse + { + public abstract bool IsError(); + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcResponse.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcResponse.cs.meta new file mode 100644 index 00000000..2b3c37d8 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcResponse.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 670ecdcf82f049db9d11ec65c326c9c0 +timeCreated: 1747313604 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcSuccessResponse.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcSuccessResponse.cs new file mode 100644 index 00000000..f2236d58 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcSuccessResponse.cs @@ -0,0 +1,25 @@ +using System; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.IntegrationTests.Server +{ + [Serializable] + internal class JsonRpcSuccessResponse : JsonRpcResponse + { + public const string jsonrpc = "2.0"; + public object result; + public string id; + + [Preserve] + public JsonRpcSuccessResponse(object result, string id) + { + this.result = result; + this.id = id; + } + + public override bool IsError() + { + return false; + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcSuccessResponse.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcSuccessResponse.cs.meta new file mode 100644 index 00000000..a6f0bb2c --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/JsonRpcSuccessResponse.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a0b3f1afefee4c4ab6a6e66a540a439c +timeCreated: 1747312150 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs new file mode 100644 index 00000000..b50edb2d --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs @@ -0,0 +1,292 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Newtonsoft.Json; +using UnityEngine; +using System.IO; +using System.Net; +using System.Text; +using UnityEditor; + +namespace Sequence.EcosystemWallet.IntegrationTests.Server +{ + internal class Server + { + public static readonly Dictionary, Task>> Methods = + new Dictionary, Task>> + { + ["payload_toAbi"] = async (parameters) => await new PayloadTests().PayloadToAbi(parameters), + ["payload_toPacked"] = async (parameters) => await new PayloadTests().PayloadToPacked(parameters), + ["payload_toJson"] = async (parameters) => await new PayloadTests().PayloadToJson(parameters), + ["payload_hashFor"] = async (parameters) => await new PayloadTests().PayloadHashFor(parameters), + }; + + public async Task HandleSingleRequest( + JsonRpcRequest rpcRequest, + bool debug, + bool silent) + { + var id = rpcRequest.id; + var jsonrpc = rpcRequest.jsonrpc; + var method = rpcRequest.method; + var @params = rpcRequest.@params; + + if (!silent) + { + Debug.Log($"[{DateTime.UtcNow:O}] Processing request: method={method} id={id}"); + } + + if (debug && !silent) + { + Debug.Log("Request details: " + JsonConvert.SerializeObject(rpcRequest, Formatting.Indented)); + } + + if (jsonrpc != "2.0") + { + JsonRpcErrorResponse error = + new JsonRpcErrorResponse(new JsonRpcErrorResponse.Error(-32600, "Invalid JSON-RPC version"), id); + if (!silent) + { + Debug.LogError($"[{DateTime.UtcNow:O}] Error response: {(debug ? JsonConvert.SerializeObject(error) : error.error.message)}"); + } + + return error; + } + + if (!Methods.ContainsKey(method)) + { + JsonRpcErrorResponse error = new JsonRpcErrorResponse(new JsonRpcErrorResponse.Error(-32601, $"Method not found: {method}"), id); + if (!silent) + { + Debug.LogError($"[{DateTime.UtcNow:O}] Error response: {(debug ? JsonConvert.SerializeObject(error) : error.error.message)}"); + } + return error; + } + + try + { + var result = await Methods[method](@params as Dictionary); + JsonRpcSuccessResponse response = new JsonRpcSuccessResponse(result, id); + if (!silent) + { + Debug.Log($"[{DateTime.UtcNow:O}] Success Response for Method={method} id={id}"); + if (debug) + { + Debug.Log("Response details: " + JsonConvert.SerializeObject(response, Formatting.Indented)); + } + } + return response; + } + catch (Exception ex) + { + JsonRpcErrorResponse error = new JsonRpcErrorResponse(new JsonRpcErrorResponse.Error(-32000, $"Unknown error: {ex.Message}"), id); + if (!silent) + { + Debug.LogError($"[{DateTime.UtcNow:O}] Error response: {(debug ? JsonConvert.SerializeObject(error) : error.error.message)}"); + } + return error; + } + } + + // Todo cleanup, lots of repeated code + public async Task HandleHttpRequest(HttpListenerContext context, bool debug, bool silent) + { + HttpListenerRequest request = context.Request; + HttpListenerResponse response = context.Response; + + if (!silent) + { + Debug.Log($"[{DateTime.UtcNow:O}] {request.HttpMethod} {request.Url.PathAndQuery} from {request.RemoteEndPoint}"); + } + + // Only handle POST /rpc + if (request.HttpMethod != "POST" || request.Url.PathAndQuery != "/rpc") + { + if (!silent) + { + Debug.LogError($"[{DateTime.UtcNow:O}] 404 Not Found"); + } + response.StatusCode = 404; + byte[] buffer = Encoding.UTF8.GetBytes("Not Found"); + response.ContentLength64 = buffer.Length; + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + response.Close(); + return; + } + + // Read the request body + string body; + using (var reader = new StreamReader(request.InputStream, request.ContentEncoding)) + { + body = await reader.ReadToEndAsync(); + } + + if (debug && !silent) + { + Debug.Log("Raw request body: " + body); + } + + // Try to parse JSON. If invalid, return an error + try + { + object jsonRpcRequests = JsonConvert.DeserializeObject(body); + + response.ContentType = "application/json"; + + if (jsonRpcRequests is Newtonsoft.Json.Linq.JArray array) + { + if (!silent) + { + Debug.Log($"[{DateTime.UtcNow:O}] Processing batch request with {array.Count} items"); + } + + var batchRequests = array.ToObject(); + var results = new List(); + + foreach (var req in batchRequests) + { + results.Add(await HandleSingleRequest(req, debug, silent)); + } + + string responseJson = JsonConvert.SerializeObject(results); + byte[] buffer = Encoding.UTF8.GetBytes(responseJson); + response.ContentLength64 = buffer.Length; + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + } + else + { + var singleRequest = JsonConvert.DeserializeObject(body); + var result = await HandleSingleRequest(singleRequest, debug, silent); + + string responseJson = JsonConvert.SerializeObject(result); + byte[] buffer = Encoding.UTF8.GetBytes(responseJson); + response.ContentLength64 = buffer.Length; + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + } + } + catch (JsonException ex) + { + if (!silent) + { + Debug.LogError($"[{DateTime.UtcNow:O}] JSON parse error: {ex.Message}"); + } + + response.StatusCode = 400; + var errorResp = new JsonRpcErrorResponse( + new JsonRpcErrorResponse.Error(-32700, "Parse error", ex.Message), + null); + + string responseJson = JsonConvert.SerializeObject(errorResp); + byte[] buffer = Encoding.UTF8.GetBytes(responseJson); + response.ContentLength64 = buffer.Length; + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + } + catch (Exception ex) + { + if (!silent) + { + Debug.LogError($"[{DateTime.UtcNow:O}] Internal server error: {ex.Message}"); + } + + response.StatusCode = 500; + var errorResp = new JsonRpcErrorResponse( + new JsonRpcErrorResponse.Error(-32000, "Internal server error", ex.Message), + null); + + string responseJson = JsonConvert.SerializeObject(errorResp); + byte[] buffer = Encoding.UTF8.GetBytes(responseJson); + response.ContentLength64 = buffer.Length; + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + } + finally + { + response.Close(); + } + } + + public void StartServer(string host, int port, bool debug, bool silent) + { + try + { + HttpListener listener = new HttpListener(); + listener.Prefixes.Add($"http://{host}:{port}/"); + listener.Start(); + + if (!silent) + { + Debug.Log($"[{DateTime.UtcNow:O}] RPC server running at http://{host}:{port}/rpc"); + if (debug) + { + Debug.Log("Debug mode enabled - detailed logging active"); + } + } + + Task.Run(async () => + { + try + { + while (listener.IsListening) + { + var context = await listener.GetContextAsync(); + + // Handle the request in another task to allow the server to continue listening + _ = Task.Run(async () => + { + try + { + await HandleHttpRequest(context, debug, silent); + } + catch (Exception ex) + { + if (!silent) + { + Debug.LogError($"[{DateTime.UtcNow:O}] Error handling request: {ex.Message}"); + } + + try + { + HttpListenerResponse response = context.Response; + response.StatusCode = 500; + var errorResp = new JsonRpcErrorResponse( + new JsonRpcErrorResponse.Error(-32000, "Internal server error", ex.Message), + null); + + string responseJson = JsonConvert.SerializeObject(errorResp); + byte[] buffer = Encoding.UTF8.GetBytes(responseJson); + response.ContentLength64 = buffer.Length; + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + response.Close(); + } + catch + { + // Ignore errors when trying to respond with an error + } + } + }); + } + } + catch (Exception ex) + { + if (!silent) + { + Debug.LogError($"[{DateTime.UtcNow:O}] Server listener error: {ex.Message}"); + } + } + }); + } + catch (Exception ex) + { + if (!silent) + { + Debug.LogError($"[{DateTime.UtcNow:O}] Failed to start server: {ex.Message}"); + } + } + } + + [MenuItem("Sequence Dev/Start Wallet V3 Test Server")] + public static void DoStartServer() + { + new Server().StartServer("localhost", 8080, true, false); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs.meta new file mode 100644 index 00000000..da70dbee --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c2322c86f214487b9578d5553ff4fd29 +timeCreated: 1747313510 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs index 2c6082bc..07507069 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs @@ -8,7 +8,7 @@ namespace Sequence.EcosystemWallet.Primitives { [Serializable] - internal class Call + public class Call { public static readonly byte[] CALL_TYPEHASH = SequenceCoder.KeccakHash( StringExtensions.ToByteArray( diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs index a680882b..770b780f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs @@ -10,7 +10,7 @@ namespace Sequence.EcosystemWallet.Primitives { [Serializable] - internal class Calls : Payload + public class Calls : Payload { public const uint MaxNonceBytes = 15; public const uint MaxCalls = 65536; @@ -394,5 +394,10 @@ public static Calls Decode(byte[] packed, Address self = null) return new Calls(space, nonce, calls.ToArray()); } + + internal static Calls FromSolidityEncoding(SolidityDecoded decoded) + { + return new Calls(decoded.space, decoded.nonce, decoded.calls); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs index 51920439..4773314a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs @@ -22,5 +22,10 @@ public override byte[] GetEIP712EncodeData() byte[] encoded = new FixedBytesCoder().Encode(new FixedByte(32, imageHash.HexStringToByteArray())); return encoded; } + + internal static ConfigUpdate FromSolidityEncoding(SolidityDecoded decoded) + { + return new ConfigUpdate(decoded.imageHash.EnsureHexPrefix()); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs index 7ccb49c3..bbe45a04 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs @@ -22,5 +22,10 @@ public override byte[] GetEIP712EncodeData() byte[] encoded = new FixedBytesCoder().Encode(new FixedByte(32, digest.HexStringToByteArray())); return encoded; } + + internal static Digest FromSolidityEncoding(SolidityDecoded decoded) + { + return new Digest(decoded.digest.EnsureHexPrefix()); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs index a313ee88..23093270 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs @@ -5,7 +5,7 @@ namespace Sequence.EcosystemWallet.Primitives { [Serializable] - internal class EncodeSapient + public class EncodeSapient { public int kind; public bool noChainId; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs index b4499f1c..5f2020fe 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs @@ -1,5 +1,6 @@ using System; using Sequence.ABI; +using Sequence.Utils; using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives @@ -21,5 +22,10 @@ public override byte[] GetEIP712EncodeData() byte[] encoded = new BytesCoder().Encode(message); return encoded; } + + internal static Message FromSolidityEncoding(SolidityDecoded decoded) + { + return new Message(decoded.message.HexStringToByteArray()); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs index 8af3c27c..0f7f862e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs @@ -7,7 +7,7 @@ namespace Sequence.EcosystemWallet.Primitives { [Serializable] - internal class Parented + public class Parented { public Payload payload; public Address[] parentWallets; @@ -84,5 +84,30 @@ public EncodeSapient DoEncodeSapient(Chain chain) return encoded; } + + public static Parented DecodeFromSolidityEncoding(string solidityEncodedPayload) + { + SolidityDecoded decoded = SolidityDecoded.FromSolidityEncoding(solidityEncodedPayload); + Address[] parentWallets = decoded.parentWallets; + Payload payload = null; + switch (decoded.kind) + { + case SolidityDecoded.Kind.Transaction: + payload = Calls.FromSolidityEncoding(decoded); + break; + case SolidityDecoded.Kind.Message: + payload = Message.FromSolidityEncoding(decoded); + break; + case SolidityDecoded.Kind.ConfigUpdate: + payload = ConfigUpdate.FromSolidityEncoding(decoded); + break; + case SolidityDecoded.Kind.Digest: + payload = Digest.FromSolidityEncoding(decoded); + break; + default: + throw new NotImplementedException($"Unknown payload type: {decoded.kind}"); + } + return new Parented(parentWallets, payload); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Payload.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Payload.cs index 3c38f470..5a611b96 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Payload.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Payload.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal abstract class Payload + public abstract class Payload { public abstract PayloadType type { get; } public Address[] parentWallets { get; set; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/PayloadType.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/PayloadType.cs index 9e794152..566057c2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/PayloadType.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/PayloadType.cs @@ -5,7 +5,7 @@ namespace Sequence.EcosystemWallet.Primitives { [JsonConverter(typeof(PayloadTypeConverter))] // We use a custom converter here instead of EnumConverter because ConfigUpdate -> config-update and '-' aren't supported in enums in C# - internal enum PayloadType + public enum PayloadType { Call, Message, diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs new file mode 100644 index 00000000..d9869e38 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs @@ -0,0 +1,62 @@ +using System; +using System.Numerics; +using Sequence.Utils; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + public class SolidityDecoded + { + public Kind kind; + public bool noChainId; + public Call[] calls; + public BigInteger space; + public BigInteger nonce; + public string message; + public string imageHash; + public string digest; + public Address[] parentWallets; + + private const string DecodedAbi = + "(uint8,bool,(address,uint256,bytes,uint256,bool,bool,uint256)[],uint256,uint256,bytes,bytes32,bytes32,address[])"; + + [Preserve] + public SolidityDecoded(Kind kind, bool noChainId, Call[] calls, BigInteger space, BigInteger nonce, string message, string imageHash, string digest, Address[] parentWallets) + { + this.kind = kind; + this.noChainId = noChainId; + this.calls = calls; + this.space = space; + this.nonce = nonce; + this.message = message; + this.imageHash = imageHash; + this.digest = digest; + this.parentWallets = parentWallets; + } + + public static SolidityDecoded FromSolidityEncoding(string solidityEncodedPayload) + { + object[] decoded = ABI.ABI.Decode(solidityEncodedPayload, DecodedAbi); + return new SolidityDecoded( + kind : (Kind)(int)decoded[0], + noChainId : (bool)decoded[1], + calls : ((object[])decoded[2]).ConvertToTArray(), + space : (BigInteger)decoded[3], + nonce : (BigInteger)decoded[4], + message : (string)decoded[5], + imageHash : (string)decoded[6], + digest : (string)decoded[7], + parentWallets : ((object[])decoded[8]).ConvertToTArray() + ); + } + + public enum Kind + { + Transaction = 0x00, + Message = 0x01, + ConfigUpdate = 0x02, + Digest = 0x03, + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs.meta new file mode 100644 index 00000000..e261d8ef --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3750a965fdfb4f45997d28684d549562 +timeCreated: 1747920447 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Contract/Contract.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Contract/Contract.cs index d824f21f..3dc20aea 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Contract/Contract.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Contract/Contract.cs @@ -165,6 +165,7 @@ private object[] CreateParams(string functionName, params object[] args) }; return toSendParams; } + private string GetData(string functionName, params object[] args) { string data; From 38238a68c5af9d6c244edb55f6d851db2e770c69 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 22 May 2025 14:37:45 -0400 Subject: [PATCH 019/165] Updated README with more instructions on how to run the tests --- .../EcosystemWallet/IntegrationTests/README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md index 26c3e6d1..16dba55c 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md @@ -1 +1,11 @@ -These integration tests require a local instance of the server described (and implemented) [here](https://github.com/0xsequence/wallet-contracts-v3). They are useful to confirm that the primitives are working properly. They will run indefinitely and hit the SDK with a variety of random inputs to see if it handles them correctly. Since they run indefinitely, it is best to only run these when interacting with the Sequence.EcosystemWallet.Primitives namespace. \ No newline at end of file +These integration tests require a local instance of the server described (and implemented) [here](https://github.com/0xsequence/wallet-contracts-v3). Basically, how these tests work is that we expose a local server from Unity that gets hit with a variety of requests from the testing server (linked) running locally on the system; the Unity-exposed server should handle these requests appropriately in order to pass the tests. These tests are useful to confirm that the primitives are working properly. They will run indefinitely and hit the SDK with a variety of random inputs to see if it handles them correctly. Since they run indefinitely, it is best to only run these when interacting with the Sequence.EcosystemWallet.Primitives namespace. + +To run, first navigate to the Unity Editor and from the top bar click `Sequence Dev > Start Wallet V3 Test Server`; this will expose the Unity local server to localhost:8080 on your system. + +Next, to begin hitting the Unity-exposed server with requests, perform the following: +1. Clone https://github.com/0xsequence/wallet-contracts-v3 +2. Navigate to the newly cloned directory +3. `pnpm install` +4. `cp .env.sample .env` +5. Modify `.env` such that it has a private key and points to your Unity server (change both ports to 8080) -> one-time setup complete +6. `forge test` to run the tests and begin hitting our Unity-exposed server with requests \ No newline at end of file From 9acf486817558ebe09471dd6288668875f5fed2b Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 22 May 2025 15:08:47 -0400 Subject: [PATCH 020/165] Fix test server argument parsing --- .../IntegrationTests/PayloadTests.cs | 4 ++- .../IntegrationTests/Server/Server.cs | 32 ++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs index ae30f926..7556323e 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs @@ -20,7 +20,9 @@ public async Task PayloadToAbi(Dictionary parameters) public async Task PayloadToPacked(Dictionary parameters) { string inputPayload = (string)parameters["payload"]; - Address wallet = new Address((string)parameters["wallet"]); + Address wallet = parameters.TryGetValue("wallet", out var walletValue) && walletValue is string walletStr + ? new Address(walletStr) + : null; string result = DoConvertToPacked(inputPayload, wallet); return result; } diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs index b50edb2d..62e58d13 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs @@ -65,7 +65,37 @@ public async Task HandleSingleRequest( try { - var result = await Methods[method](@params as Dictionary); + Dictionary methodParams; + + if (debug && !silent) + { + Debug.Log($"[{DateTime.UtcNow:O}] Raw params: {JsonConvert.SerializeObject(@params)}"); + } + + // Convert params to JObject for more flexible parsing if needed + Newtonsoft.Json.Linq.JObject paramsJObject = null; + if (@params is Dictionary paramsDict) + { + paramsJObject = Newtonsoft.Json.Linq.JObject.FromObject(paramsDict); + } + else if (@params is Newtonsoft.Json.Linq.JObject jObj) + { + paramsJObject = jObj; + } + + methodParams = paramsJObject?.ToObject>(); + + if (methodParams == null || methodParams.Count == 0) + { + Debug.LogWarning("No method params"); + } + + if (debug && !silent) + { + Debug.Log($"[{DateTime.UtcNow:O}] Final methodParams: {JsonConvert.SerializeObject(methodParams)}"); + } + + var result = await Methods[method](methodParams); JsonRpcSuccessResponse response = new JsonRpcSuccessResponse(result, id); if (!silent) { From cd2ebca8f87a634cb440606ac6fb47c549f81ffd Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Fri, 23 May 2025 15:41:52 -0400 Subject: [PATCH 021/165] Fix SolidityDecoded.FromSolidityEncodingand added unit tests to confirm they are working (using logged values from sequence.js to generate unit test data). --- .../IntegrationTests/PayloadTests.cs | 31 ++-- .../SequenceEcosystemWalletTests.asmdef | 12 +- .../SequenceEcosystemWalletTests.asmdef.meta | 0 .../EcosystemWallet/UnitTests.meta | 3 + .../UnitTests/SolidityDecodedTests.cs | 157 ++++++++++++++++++ .../UnitTests/SolidityDecodedTests.cs.meta | 3 + .../Primitives/Payload/BehaviourOnError.cs | 6 +- .../Primitives/Payload/SolidityDecoded.cs | 51 +++++- .../Sequence/SequenceSDK/Ethereum/ABI/ABI.cs | 7 +- .../SequenceSDK/Utils/StringExtensions.cs | 11 ++ 10 files changed, 245 insertions(+), 36 deletions(-) rename Assets/SequenceSDK/EcosystemWallet/{IntegrationTests => }/SequenceEcosystemWalletTests.asmdef (73%) rename Assets/SequenceSDK/EcosystemWallet/{IntegrationTests => }/SequenceEcosystemWalletTests.asmdef.meta (100%) create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs index 7556323e..909af0f3 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs @@ -29,20 +29,7 @@ public async Task PayloadToPacked(Dictionary parameters) private string DoConvertToPacked(string payload, Address wallet) { - Parented decodedPayload = null; - try - { - decodedPayload = Parented.DecodeFromSolidityEncoding(payload); - } - catch (Exception ex) - { - throw new Exception($"Failed to decode payload: {ex.Message}", ex); - } - - if (decodedPayload == null || decodedPayload.payload == null) - { - throw new Exception("Decoded payload is null or invalid"); - } + Parented decodedPayload = Decode(payload); if (decodedPayload.payload.isCalls) { @@ -71,12 +58,20 @@ public async Task PayloadHashFor(Dictionary parameters) { string inputPayload = (string)parameters["payload"]; Address wallet = new Address((string)parameters["wallet"]); - BigInteger chainId = (BigInteger)parameters["chainId"]; + string chainId = (string)parameters["chainId"]; string result = DoHash(inputPayload, wallet, chainId); return result; } - private string DoHash(string payload, Address wallet, BigInteger chainId) + private string DoHash(string payload, Address wallet, string chainId) + { + Parented decodedPayload = Decode(payload); + + byte[] hashed = decodedPayload.Hash(wallet, ChainDictionaries.ChainById[chainId]); + return hashed.ByteArrayToHexStringWithPrefix(); + } + + private Parented Decode(string payload) { Parented decodedPayload = null; try @@ -93,9 +88,7 @@ private string DoHash(string payload, Address wallet, BigInteger chainId) throw new Exception("Decoded payload is null or invalid"); } - - byte[] hashed = decodedPayload.Hash(wallet, ChainDictionaries.ChainById[chainId.ToString()]); - return hashed.ByteArrayToHexStringWithPrefix(); + return decodedPayload; } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SequenceEcosystemWalletTests.asmdef b/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef similarity index 73% rename from Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SequenceEcosystemWalletTests.asmdef rename to Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef index b8bcae27..c2a09c02 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SequenceEcosystemWalletTests.asmdef +++ b/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef @@ -9,9 +9,13 @@ "GUID:6055be8ebefd69e48b49212b09b47b2f", "GUID:a35e3a53d4439435f8b36ed2c6158cd8", "GUID:403077141e1554429a890cbc129df651", - "GUID:b4f9c0f8f363f439b9e337f79050f189" + "GUID:b4f9c0f8f363f439b9e337f79050f189", + "GUID:0acc523941302664db1f4e527237feb3", + "GUID:27619889b8ba8c24980f49ee34dbb44a" + ], + "includePlatforms": [ + "Editor" ], - "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": false, "overrideReferences": true, @@ -19,7 +23,9 @@ "Newtonsoft.Json.dll" ], "autoReferenced": true, - "defineConstraints": [], + "defineConstraints": [ + "UNITY_INCLUDE_TESTS" + ], "versionDefines": [], "noEngineReferences": false } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SequenceEcosystemWalletTests.asmdef.meta b/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef.meta similarity index 100% rename from Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SequenceEcosystemWalletTests.asmdef.meta rename to Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests.meta new file mode 100644 index 00000000..75475be3 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a750bfdaf56c4f0a8b41a47223b80bbf +timeCreated: 1747944374 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs new file mode 100644 index 00000000..b0a306c0 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs @@ -0,0 +1,157 @@ +using System; +using System.Numerics; +using System.Text; +using NUnit.Framework; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet.UnitTests +{ + public class SolidityDecodedTests + { + [Test] + public void FromSolidityEncodingTest() + { + string payload = + "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f55c9e86f01f5a5aa380014a3f49c4db9064952f00000000000000000000000000000000000000d1d2690a6b27a40f8b1a200a0300000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000172d01620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000030b90ec7e2ae5308ee069131601af8ec53f609ec037cbad144d54bd191ef8770aaf57a8c1afa694348fd1d387e60841bf70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + SolidityDecoded expected = new SolidityDecoded(SolidityDecoded.Kind.Transaction, false, + new[] + { + new Call(new Address("0xf55c9e86f01f5a5aa380014a3f49c4db9064952f"), + BigInteger.Parse("16623804803955111427283380865539"), + "0xb90ec7e2ae5308ee069131601af8ec53f609ec037cbad144d54bd191ef8770aaf57a8c1afa694348fd1d387e60841bf7" + .HexStringToByteArray(), + BigInteger.Parse("388825442"), false, false, BehaviourOnError.abort) + }, BigInteger.Parse("0"), BigInteger.Parse("0"), + "0x", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + new Address[] { }); + + SolidityDecoded decoded = SolidityDecoded.FromSolidityEncoding(payload); + + AssertEqualSolidityDecodings(expected, decoded); + } + + private void AssertEqualSolidityDecodings(SolidityDecoded expected, SolidityDecoded decoded) + { + Assert.AreEqual(expected.kind, decoded.kind); + Assert.AreEqual(expected.noChainId, decoded.noChainId); + Assert.AreEqual(expected.space, decoded.space); + Assert.AreEqual(expected.nonce, decoded.nonce); + Assert.AreEqual(expected.message, decoded.message); + Assert.AreEqual(expected.imageHash, decoded.imageHash); + Assert.AreEqual(expected.digest, decoded.digest); + Assert.AreEqual(expected.parentWallets.Length, decoded.parentWallets.Length); + Assert.AreEqual(expected.calls.Length, decoded.calls.Length); + for (int i = 0; i < expected.calls.Length; i++) + { + Assert.AreEqual(expected.calls[i].to, decoded.calls[i].to); + Assert.AreEqual(expected.calls[i].value, decoded.calls[i].value); + Assert.AreEqual(expected.calls[i].data, decoded.calls[i].data); + Assert.AreEqual(expected.calls[i].gasLimit, decoded.calls[i].gasLimit); + Assert.AreEqual(expected.calls[i].delegateCall, decoded.calls[i].delegateCall); + Assert.AreEqual(expected.calls[i].onlyFallback, decoded.calls[i].onlyFallback); + Assert.AreEqual(expected.calls[i].behaviorOnError, decoded.calls[i].behaviorOnError); + } + for (int i = 0; i < expected.parentWallets.Length; i++) + { + Assert.AreEqual(expected.parentWallets[i], decoded.parentWallets[i]); + } + } + + [Test] + public void FromSolidityEncodingTest2() + { + string payload = + "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000021589773bd16cd380232a41fd49369977d1db0c400000000000000000000000000000000000001ebfe5bea7ea9dc560f328fa0b700000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000275c6181000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000005dda4f4f63adb99c80f292a7e827528c75cbdc3db03f79d91bff1e69217a68d70d5f1ac83a88c88bc880c5cfb644d16b47ea62a82ad06d60e7de17b94c75ee7c0a5357ffba964004787d1eaef010bad9051d1891f60984f84c9780de324a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + SolidityDecoded expected = new SolidityDecoded(SolidityDecoded.Kind.Transaction, false, + new[] + { + new Call(new Address("0x21589773bd16cd380232a41fd49369977d1db0c4"), + BigInteger.Parse("38979748106618282834436014710967"), + "0xda4f4f63adb99c80f292a7e827528c75cbdc3db03f79d91bff1e69217a68d70d5f1ac83a88c88bc880c5cfb644d16b47ea62a82ad06d60e7de17b94c75ee7c0a5357ffba964004787d1eaef010bad9051d1891f60984f84c9780de324a" + .HexStringToByteArray(), + BigInteger.Parse("660365697"), false, false, BehaviourOnError.abort) + }, BigInteger.Parse("0"), BigInteger.Parse("0"), + "0x", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + new Address[] { }); + + SolidityDecoded decoded = SolidityDecoded.FromSolidityEncoding(payload); + + AssertEqualSolidityDecodings(expected, decoded); + } + + [Test] + public void FromSolidityEncodingTest_MultipleCalls() + { + string payload = + "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000005b392c6bf000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000073bd16cd380232a41fd49369977d1db0c4deb215000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000003b9ac9ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000463adb99c000000000000000000000000000000000000000000000000000000000000000000000000000000003f79d91bff1e69217a68d70d5f1ac83a88c88bc8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000003b9ac9fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042de17b94c75ee7c0a5357ffba964004787d1eaef010bad9051d1891f60984f84c9780de324a73724b5cb73b4b179d021d5880fd1a0b2daf93dc7378cb03d9a91e1a0c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + SolidityDecoded expected = new SolidityDecoded(SolidityDecoded.Kind.Transaction, false, + new[] + { + new Call(new Address("0x73bd16cd380232a41fd49369977d1db0c4deb215"), + BigInteger.Parse("0"), + "0x63adb99c" + .HexStringToByteArray(), + BigInteger.Parse("999999999"), false, false, BehaviourOnError.abort), + new Call(new Address("0x3f79d91bff1e69217a68d70d5f1ac83a88c88bc8"), BigInteger.Parse("0"), + "0xde17b94c75ee7c0a5357ffba964004787d1eaef010bad9051d1891f60984f84c9780de324a73724b5cb73b4b179d021d5880fd1a0b2daf93dc7378cb03d9a91e1a0c" + .HexStringToByteArray(), BigInteger.Parse("999999998"), false, true, + BehaviourOnError.ignore), + }, BigInteger.Parse("105"), BigInteger.Parse("24487577279"), + "0x", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + new Address[] { }); + + SolidityDecoded decoded = SolidityDecoded.FromSolidityEncoding(payload); + + AssertEqualSolidityDecodings(expected, decoded); + } + + [Test] + public void FromSolidityEncodingTest_NoCallsManyParents() + { + string payload = + "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001dc000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000a18ca8a583302424783709548800000000000000000000000000000000000000000000000000000000000039740000000000000000000000000000000000000000000000000000000000000265000000000000000000000000000000000000000000000000000000000000103a0000000000000000000000000000000000000000000000000000000000001c43000000000000000000000000000000000000000000000000000000000000166e00000000000000000000000000000000000000000000000000000000000007a90000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000049a0000000000000000000000000000000000000000000000000000000000000584000000000000000000000000000000000000000000000000000000000000038c0000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000023200000000000000000000000000000000000000000000000000000000000032cd00000000000000000000000000000000000000000000000000000000000014ac0000000000000000000000000000000000000000000000000000000000000e8f0000000000000000000000000000000000000000000000000000000008a5f6af00000000000000000000000000000000000000000000000000000000000023f40000000000000000000000000000000000000000000000000000000071aad10d00000000000000000000000000000000000000000000000000000000000039640000000000000000000000000000000000000000000000000000000000001a37000000000000000000000000000000000000000000000000000000000000077d"; + SolidityDecoded expected = new SolidityDecoded(SolidityDecoded.Kind.Message, false, + new Call[] { }, BigInteger.Parse("0"), BigInteger.Parse("0"), + "0x00000000000000000000000000000000000000000000000000000000000001dc", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + new Address[] + { + new Address("0x00000000000000a18ca8a5833024247837095488"), + new Address("0x0000000000000000000000000000000000003974"), + new Address("0x0000000000000000000000000000000000000265"), + new Address("0x000000000000000000000000000000000000103a"), + new Address("0x0000000000000000000000000000000000001c43"), + new Address("0x000000000000000000000000000000000000166e"), + new Address("0x00000000000000000000000000000000000007a9"), + new Address("0x0000000000000000000000000000000000002040"), + new Address("0x000000000000000000000000000000000000049a"), + new Address("0x0000000000000000000000000000000000000584"), + new Address("0x000000000000000000000000000000000000038c"), + new Address("0x0000000000000000000000000000000000000023"), + new Address("0x0000000000000000000000000000000000000232"), + new Address("0x00000000000000000000000000000000000032cd"), + new Address("0x00000000000000000000000000000000000014ac"), + new Address("0x0000000000000000000000000000000000000e8f"), + new Address("0x0000000000000000000000000000000008a5f6af"), + new Address("0x00000000000000000000000000000000000023f4"), + new Address("0x0000000000000000000000000000000071aad10d"), + new Address("0x0000000000000000000000000000000000003964"), + new Address("0x0000000000000000000000000000000000001a37"), + new Address("0x000000000000000000000000000000000000077d") + }); + + SolidityDecoded decoded = SolidityDecoded.FromSolidityEncoding(payload); + + AssertEqualSolidityDecodings(expected, decoded); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs.meta new file mode 100644 index 00000000..2007acbe --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 314882ade1684bde9f3b5beb8da7d423 +timeCreated: 1747944409 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/BehaviourOnError.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/BehaviourOnError.cs index 4acebba5..10bcf775 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/BehaviourOnError.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/BehaviourOnError.cs @@ -6,8 +6,8 @@ namespace Sequence.EcosystemWallet.Primitives [JsonConverter(typeof(EnumConverter))] public enum BehaviourOnError { - ignore, - revert, - abort + ignore = 0x00, + revert = 0x01, + abort = 0x02 } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs index d9869e38..8f99af31 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs @@ -37,16 +37,17 @@ public SolidityDecoded(Kind kind, bool noChainId, Call[] calls, BigInteger space public static SolidityDecoded FromSolidityEncoding(string solidityEncodedPayload) { + solidityEncodedPayload = solidityEncodedPayload.Replace("0x", "").Substring(64); // Drop the first 32 bytes; for some reason we include an offset of 32 bytes in all of the encodings - todo ask Agustin why object[] decoded = ABI.ABI.Decode(solidityEncodedPayload, DecodedAbi); return new SolidityDecoded( - kind : (Kind)(int)decoded[0], + kind : ToKind((BigInteger)decoded[0]), noChainId : (bool)decoded[1], - calls : ((object[])decoded[2]).ConvertToTArray(), + calls : ToCalls((object[])decoded[2]), space : (BigInteger)decoded[3], nonce : (BigInteger)decoded[4], - message : (string)decoded[5], - imageHash : (string)decoded[6], - digest : (string)decoded[7], + message : ((byte[])decoded[5]).ByteArrayToHexStringWithPrefix(), + imageHash : ((byte[])decoded[6]).ByteArrayToHexString().PadRight(64, '0').EnsureHexPrefix(), + digest : ((byte[])decoded[7]).ByteArrayToHexString().PadRight(64, '0').EnsureHexPrefix(), parentWallets : ((object[])decoded[8]).ConvertToTArray() ); } @@ -58,5 +59,45 @@ public enum Kind ConfigUpdate = 0x02, Digest = 0x03, } + + internal static Kind ToKind(BigInteger kind) + { + if (kind == BigInteger.Zero) return Kind.Transaction; + if (kind == BigInteger.One) return Kind.Message; + if (kind == new BigInteger(2)) return Kind.ConfigUpdate; + if (kind == new BigInteger(3)) return Kind.Digest; + + throw new ArgumentOutOfRangeException(nameof(kind), kind, null); + } + + internal static Call[] ToCalls(object[] calls) + { + int length = calls.Length; + Call[] callArray = new Call[length]; + for (int i = 0; i < length; i++) + { + object[] call = (object[])calls[i]; + callArray[i] = new Call( + to : (Address)call[0], + value : (BigInteger)call[1], + data : (byte[])call[2], + gasLimit : (BigInteger)call[3], + delegateCall : (bool)call[4], + onlyFallback : (bool)call[5], + behaviorOnError : ToBehaviourOnError((BigInteger)call[6]) + ); + } + + return callArray; + } + + internal static BehaviourOnError ToBehaviourOnError(BigInteger behaviour) + { + if (behaviour == BigInteger.Zero) return BehaviourOnError.ignore; + if (behaviour == BigInteger.One) return BehaviourOnError.revert; + if (behaviour == new BigInteger(2)) return BehaviourOnError.abort; + + throw new ArgumentOutOfRangeException(nameof(behaviour), behaviour, null); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/ABI.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/ABI.cs index 83b21ef7..473f9cdb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/ABI.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/ABI.cs @@ -111,18 +111,13 @@ public static ABIType GetTypeFromEvmName(string typeName) /// private static bool IsFixedArray(string value) { - if (value.StartsWith('(')) - { - return false; // this is a tuple - } - int start = value.IndexOf('['); if (start <= 0) { return false; } - return GetInnerValue(value) > 0; + return GetInnerValue(value) > 0 && value.EndsWith(']'); } /// diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/StringExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/StringExtensions.cs index 5ca9bb7e..85be6cb8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/StringExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/StringExtensions.cs @@ -233,5 +233,16 @@ public static string StringToBase64(this string value) string base64 = Convert.ToBase64String(asBytes); return base64; } + + public static string HexStringMultiline(this string value, int lineLength = 64) // Default to 32 bytes + { + value = value.Replace("0x", ""); + var sb = new StringBuilder(); + for (int i = 0; i < value.Length; i += lineLength) + { + sb.AppendLine(value.Substring(i, Math.Min(lineLength, value.Length - i))); + } + return sb.ToString(); + } } } From 1cefb5af4eefd7a725fa2ed8b3533d7341786960 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Fri, 23 May 2025 15:59:05 -0400 Subject: [PATCH 022/165] Fixed AddressCoder such that it pads addresses that are too short with 0s on the left. --- .../Sequence/SequenceSDK/Ethereum/ABI/Coders/AddressCoder.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/AddressCoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/AddressCoder.cs index 06d1b1fc..ca6f2855 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/AddressCoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/AddressCoder.cs @@ -119,6 +119,7 @@ public static string Decode(string encodedString) try { string decoded = SequenceCoder.AddressChecksum(_addressCoder.DecodeFromString(encodedString)); + decoded = decoded.Replace("0x", "").PadLeft(40, '0').EnsureHexPrefix(); return decoded; } catch (Exception ex) From 1dc55645688f681815fea042e6f5b1e1a7d28d61 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 29 May 2025 10:42:04 -0400 Subject: [PATCH 023/165] Fix null reference exception when encoding null arrays --- .../EcosystemWallet/Primitives/Payload/Calls.cs | 7 +++++-- .../EcosystemWallet/Primitives/Payload/ConfigUpdate.cs | 3 ++- .../EcosystemWallet/Primitives/Payload/Digest.cs | 3 ++- .../EcosystemWallet/Primitives/Payload/Parented.cs | 10 +++++++--- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs index 770b780f..a9e40358 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs @@ -34,9 +34,12 @@ public override byte[] GetEIP712EncodeData() byte[] spaceEncoded = new NumberCoder().Encode(space); byte[] nonceEncoded = new NumberCoder().Encode(nonce); byte[] callsEncoded = new byte[] { }; - foreach (var call in calls) + if (calls != null) { - callsEncoded = ByteArrayExtensions.ConcatenateByteArrays(callsEncoded, call.HashStruct()); + foreach (var call in calls) + { + callsEncoded = ByteArrayExtensions.ConcatenateByteArrays(callsEncoded, call.HashStruct()); + } } callsEncoded = SequenceCoder.KeccakHash(callsEncoded); byte[] encoded = ByteArrayExtensions.ConcatenateByteArrays( diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs index 4773314a..aa91b6a8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs @@ -19,7 +19,8 @@ public ConfigUpdate(string imageHash) public override byte[] GetEIP712EncodeData() { - byte[] encoded = new FixedBytesCoder().Encode(new FixedByte(32, imageHash.HexStringToByteArray())); + FixedByte bytes = new FixedByte(32, imageHash.HexStringToByteArray()); + byte[] encoded = new FixedBytesCoder().Encode(bytes); return encoded; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs index bbe45a04..0615cfc3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs @@ -19,7 +19,8 @@ public Digest(string digest) public override byte[] GetEIP712EncodeData() { - byte[] encoded = new FixedBytesCoder().Encode(new FixedByte(32, digest.HexStringToByteArray())); + FixedByte bytes = new FixedByte(32, digest.HexStringToByteArray()); + byte[] encoded = new FixedBytesCoder().Encode(bytes); return encoded; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs index 0f7f862e..6b821df1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs @@ -23,11 +23,15 @@ public byte[] GetEIP712EncodeData() { byte[] payloadEncoded = payload.GetEIP712EncodeData(); byte[] parentWalletsEncoded = new byte[] { }; - foreach (var parentWallet in parentWallets) + if (parentWallets != null) { - parentWalletsEncoded = - ByteArrayExtensions.ConcatenateByteArrays(new AddressCoder().Encode(parentWalletsEncoded)); + foreach (var parentWallet in parentWallets) + { + parentWalletsEncoded = + ByteArrayExtensions.ConcatenateByteArrays(new AddressCoder().Encode(parentWalletsEncoded)); + } } + parentWalletsEncoded = SequenceCoder.KeccakHash(parentWalletsEncoded); byte[] encoded = ByteArrayExtensions.ConcatenateByteArrays(payloadEncoded, parentWalletsEncoded); From 3b4948fa3ec77e06bfae4f9d331500094aec9e19 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 29 May 2025 10:44:48 -0400 Subject: [PATCH 024/165] Fix address comparison such that address instances that represent the 0 address will be equal regardless of if they have the same value string (one may have more 0s than the other) - for example, previously 0x00 and 0x0000 would not be considered equal like they should've been, this is now fixed. --- Assets/SequenceSDK/Ethereum/Tests/DecodeABITests.cs | 2 +- .../Sequence/SequenceSDK/Ethereum/Address/Address.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Assets/SequenceSDK/Ethereum/Tests/DecodeABITests.cs b/Assets/SequenceSDK/Ethereum/Tests/DecodeABITests.cs index d05d8e00..4f99b3c2 100644 --- a/Assets/SequenceSDK/Ethereum/Tests/DecodeABITests.cs +++ b/Assets/SequenceSDK/Ethereum/Tests/DecodeABITests.cs @@ -690,7 +690,7 @@ public void TestDecodeArray(string value, T expected, string evmType) Assert.AreEqual(expectedArray.Length, length); for (int i = 0; i < length; i++) { - Assert.AreEqual(expectedArray[i].ToString(), resultArray[i].ToString()); + Assert.AreEqual(expectedArray[i], resultArray[i]); } } else diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs index 1ed6d85a..e3f46d5f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs @@ -52,7 +52,8 @@ public override bool Equals(object obj) } Address address = (Address)obj; - return Value.Equals(address.Value, StringComparison.OrdinalIgnoreCase); + return Value.Equals(address.Value, StringComparison.OrdinalIgnoreCase) || + (this.Value.IsZeroAddress() && address.Value.IsZeroAddress()); } public override int GetHashCode() From 83e301b7db3172d99c688abe324eef2f99fec7a8 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 29 May 2025 10:46:01 -0400 Subject: [PATCH 025/165] Added a LocalChain because the V3 tests return this chain id frequently. --- .../Sequence/SequenceSDK/Ethereum/Chain.cs | 2 ++ .../SequenceSDK/Ethereum/ChainDictionaries.cs | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Chain.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Chain.cs index cb0d913b..77caa92a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Chain.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Chain.cs @@ -62,6 +62,8 @@ public enum Chain TestnetMonad = 10143, TestnetSomnia = 50312, + LocalChain = 31337, // A chain running locally on your system + TestnetXaiSepolia = -1, // Xai Sepolia's testnet's chain ID is too large to fit inside an int // Null diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ChainDictionaries.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ChainDictionaries.cs index 3905a30d..0e3b151e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ChainDictionaries.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ChainDictionaries.cs @@ -58,6 +58,8 @@ public static class ChainDictionaries { Chain.TestnetEtherlink, "Etherlink Testnet" }, { Chain.TestnetMonad, "Monad Testnet" }, { Chain.TestnetSomnia, "Somnia Testnet" }, + + { Chain.LocalChain, "Local chain"} }; public static Dictionary GasCurrencyOf = new Dictionary() @@ -114,6 +116,8 @@ public static class ChainDictionaries { Chain.TestnetEtherlink, "XTZ" }, { Chain.TestnetMonad, "MON" }, { Chain.TestnetSomnia, "STT" }, + + { Chain.LocalChain, "ETH" } }; public static Dictionary NativeTokenAddressOf = new Dictionary() @@ -203,6 +207,8 @@ public static class ChainDictionaries { Chain.TestnetEtherlink, "https://testnet.explorer.etherlink.com/" }, { Chain.TestnetMonad, "https://testnet.monadexplorer.com/" }, { Chain.TestnetSomnia, "https://somnia-testnet.socialscan.io/" }, + + { Chain.LocalChain, "https://localhost:3000/" } }; public static Dictionary ChainIdOf = new Dictionary() @@ -261,6 +267,8 @@ public static class ChainDictionaries { Chain.TestnetEtherlink, "128123" }, { Chain.TestnetMonad, "10143" }, { Chain.TestnetSomnia, "50312" }, + + { Chain.LocalChain, "31337" } }; public static Dictionary ChainById = new Dictionary() @@ -317,6 +325,8 @@ public static class ChainDictionaries { "128123", Chain.TestnetEtherlink }, { "10143", Chain.TestnetMonad }, { "50312", Chain.TestnetSomnia }, + + { "31337", Chain.LocalChain } }; public static Dictionary PathOf = new Dictionary() @@ -373,6 +383,8 @@ public static class ChainDictionaries { Chain.TestnetEtherlink, "etherlink-testnet" }, { Chain.TestnetMonad, "monad-testnet" }, { Chain.TestnetSomnia, "somnia-testnet" }, + + { Chain.LocalChain, "local" } }; } } \ No newline at end of file From 7ccb5ec3cfb123f46bb5a2602c418914ced0a9d6 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 29 May 2025 10:48:39 -0400 Subject: [PATCH 026/165] Update FixedBytesCoder and StaticBytesCoder such that they both can handle either byte[] or FixedByte types --- .../Ethereum/ABI/Coders/FixedBytesCoder.cs | 57 +++++++++++++++---- .../Ethereum/ABI/Coders/StaticBytesCoder.cs | 17 +++++- 2 files changed, 61 insertions(+), 13 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/FixedBytesCoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/FixedBytesCoder.cs index d68dc13c..bffa3021 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/FixedBytesCoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/FixedBytesCoder.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Numerics; +using Sequence.Utils; using UnityEngine; namespace Sequence.ABI @@ -59,20 +60,25 @@ public byte[] Encode(object value) /// The encoded string representation. public string EncodeToString(object value) { - try + if (value is byte[] valueBytes) { - int numberOfBytes = ((byte[])value).Length; - string valueStr = SequenceCoder.ByteArrayToHexString(((byte[])value)); - string numberOfBytesStr = _numberCoder.EncodeUnsignedIntString(numberOfBytes, 64); - // followed by the minimum number of zero-bytes such that len(enc(X)) is a multiple of 32 - int currentTotalLength = numberOfBytes; - int zeroBytesNeeded = 64 - currentTotalLength % 64; - int totalLength = currentTotalLength + zeroBytesNeeded; + return EncodeBytesToString(valueBytes); + } - valueStr = valueStr.PadRight(totalLength, '0'); + if (value is FixedByte valueFixedBytes) + { + return EncodeFixedBytesToString(valueFixedBytes); + } - string encodedStr = numberOfBytesStr + valueStr; - return encodedStr; + throw new ArgumentException( + $"Encountered unexpected value type: {value.GetType().Name}. Expected {nameof(FixedByte)} or byte[]."); + } + + private string EncodeBytesToString(byte[] value) + { + try + { + return DoEncodeAsString(value, value.Length); } catch (Exception ex) { @@ -80,6 +86,35 @@ public string EncodeToString(object value) return null; } } + + private string EncodeFixedBytesToString(FixedByte value) + { + try + { + return DoEncodeAsString(value.Data, value.Count); + } + catch (Exception ex) + { + Debug.LogError($"Error encoding byte array to string: {ex.Message}"); + return null; + } + } + + private string DoEncodeAsString(byte[] data, int length) + { + string valueString = data.ByteArrayToHexString(); + string numberOfBytesStr = _numberCoder.EncodeUnsignedIntString(length, 64); + // followed by the minimum number of zero-bytes such that len(enc(X)) is a multiple of 32 + int currentTotalLength = length; + int zeroBytesNeeded = 64 - currentTotalLength % 64; + int totalLength = currentTotalLength + zeroBytesNeeded; + + valueString = valueString.PadRight(totalLength, '0'); + + string encodedStr = numberOfBytesStr + valueString; + return encodedStr; + } + /// /// Decodes the encoded string into a byte array value. /// diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/StaticBytesCoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/StaticBytesCoder.cs index b1751324..daac0c42 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/StaticBytesCoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/StaticBytesCoder.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using Sequence.Utils; using UnityEngine; namespace Sequence.ABI @@ -61,8 +62,20 @@ public string EncodeToString(object value) { try { - string valueStr = SequenceCoder.ByteArrayToHexString(((FixedByte)value).Data); - string encodedStr = (valueStr).PadRight(64, '0'); + string valueString = ""; + if (value is FixedByte fixedByte) + { + valueString = fixedByte.Data.ByteArrayToHexString(); + } + else if (value is byte[] bytes) + { + valueString = bytes.ByteArrayToHexString(); + } + else + { + throw new ArgumentException($"Encountered unexpected value type: {value.GetType().Name}. Expected {nameof(FixedByte)} or byte[]."); + } + string encodedStr = (valueString).PadRight(64, '0'); return encodedStr; } From 8bce78eb8a8092fedeeeac07f33b3ce578ff3cf3 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 29 May 2025 11:36:43 -0400 Subject: [PATCH 027/165] Fix NumberCoder such that it can handle other types of number other than just BigIntegers; also, don't throw an ArgumentOutOfRangeException due to having a larger bigint than the desired size by clamping the padding to a min of 0 --- .../Ethereum/ABI/Coders/NumberCoder.cs | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/NumberCoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/NumberCoder.cs index 51269c5e..b0086fa1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/NumberCoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/NumberCoder.cs @@ -57,12 +57,26 @@ public byte[] Encode(object number) { try { - //The BigInteger structure does not include constructors with a parameter of type Byte, Int16, SByte, or UInt16. However, the Int32 type supports the implicit conversion of 8-bit and 16-bit signed and unsigned integers to signed 32-bit integers. byte[] encoded = { }; - if ((number is int) || (number is BigInteger)) + if (number is BigInteger) { encoded = EncodeSignedInt((BigInteger)number, 32); - + }else if (BigInteger.TryParse(number.ToString(), out BigInteger bigInt)) + { + encoded = EncodeSignedInt(bigInt, 32); + } + else if (number is int intValue) + { + encoded = EncodeSignedInt(new BigInteger(intValue), 32); + } + else if (number is uint uintValue) + { + encoded = EncodeUnsignedInt(new BigInteger(uintValue), 32); + } + else + { + Debug.LogError($"Unsupported number type: {number.GetType()}"); + return null; } // TODO: Make sure Big Endian /*if (BitConverter.IsLittleEndian) @@ -169,11 +183,11 @@ public string EncodeSignedIntString(BigInteger number, int length) string encodedString; if (number.Sign > -1) { - encodedString = new string('0', length - hex.Length) + hex; + encodedString = new string('0', Math.Max(0, length - hex.Length)) + hex; } else { - encodedString = new string('f', length - hex.Length) + hex; + encodedString = new string('f', Math.Max(0, length - hex.Length)) + hex; } return encodedString; } @@ -218,7 +232,7 @@ public string EncodeUnsignedIntString(BigInteger number, int length) try { var hex = number.ToString("x"); - string encodedString = new string('0', length - hex.Length) + hex; + string encodedString = new string('0', Math.Max(0, length - hex.Length)) + hex; return encodedString; } catch (Exception ex) From c58676207b3fe3db0faf390958f019d53fe432e3 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 29 May 2025 16:55:41 -0400 Subject: [PATCH 028/165] Fix broken test --- Assets/SequenceSDK/Ethereum/Tests/OwnableTests.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Assets/SequenceSDK/Ethereum/Tests/OwnableTests.cs b/Assets/SequenceSDK/Ethereum/Tests/OwnableTests.cs index cc978b4a..076e6b18 100644 --- a/Assets/SequenceSDK/Ethereum/Tests/OwnableTests.cs +++ b/Assets/SequenceSDK/Ethereum/Tests/OwnableTests.cs @@ -65,7 +65,10 @@ public async Task TestOwner() receipt = await ownable.RenounceOwnership() .SendTransactionMethodAndWaitForReceipt(wallet1, client); owner = await ownable.Owner(client); - Assert.AreEqual(StringExtensions.ZeroAddress, owner); + + Address expectedOwner = new Address(StringExtensions.ZeroAddress); + Address ownerAddress = new Address(owner); + Assert.AreEqual(expectedOwner, ownerAddress); } catch (Exception ex) { From 653552c59f32f9c150197043199446c4b11a347a Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 29 May 2025 16:56:55 -0400 Subject: [PATCH 029/165] Fix encoding runtime exceptions that occur when running Payload tests --- .../Primitives/IndividualStringEncoder.cs | 23 +++++++++++++++++++ .../IndividualStringEncoder.cs.meta | 3 +++ .../Primitives/Payload/Domain.cs | 8 +++---- .../Primitives/Payload/Parented.cs | 7 +++++- .../Primitives/Payload/TypedDataToSign.cs | 3 ++- 5 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/IndividualStringEncoder.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/IndividualStringEncoder.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/IndividualStringEncoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/IndividualStringEncoder.cs new file mode 100644 index 00000000..fa82e83f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/IndividualStringEncoder.cs @@ -0,0 +1,23 @@ +using System; +using System.Numerics; +using Sequence.ABI; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal static class IndividualStringEncoder + { + public static string EncodeString(this string value) + { + byte[] encoded = EncodeStringAsBytes(value); + return encoded.ByteArrayToHexString(); + } + + public static byte[] EncodeStringAsBytes(this string value) + { + byte[] asBytes = value.ToByteArray().PadLeft(32); + byte[] lengthBytes = ((BigInteger)asBytes.Length).ByteArrayFromNumber(32); + return ByteArrayExtensions.ConcatenateByteArrays(lengthBytes, asBytes); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/IndividualStringEncoder.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/IndividualStringEncoder.cs.meta new file mode 100644 index 00000000..2644352b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/IndividualStringEncoder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4726a94e5cfe4901aac16800130e0ee0 +timeCreated: 1748533216 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs index 15599e20..f3520786 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs @@ -52,12 +52,12 @@ public byte[] GetDomainSeparator() { string encodeType = "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)"; - byte[] typeHash = SequenceCoder.KeccakHash(encodeType).HexStringToByteArray(); - byte[] nameHash = new TupleCoder().EncodeToString(name, new[] { "string" }).HexStringToByteArray(); - byte[] versionHash = new TupleCoder().EncodeToString(version, new[] { "string" }).HexStringToByteArray(); + byte[] typeHash = SequenceCoder.KeccakHashASCII(encodeType).HexStringToByteArray(); + byte[] nameHash = name.EncodeStringAsBytes(); + byte[] versionHash = version.EncodeStringAsBytes(); byte[] chainIdHash = new NumberCoder().Encode(chainId); byte[] verifyingContractHash = new AddressCoder().Encode(verifyingContract); - byte[] saltHash = salt != null ? new FixedBytesCoder().Encode(salt) : null; + byte[] saltHash = salt != null ? new FixedBytesCoder().Encode(salt) : new byte[]{}; byte[] encoded = ByteArrayExtensions.ConcatenateByteArrays(typeHash, nameHash, versionHash, chainIdHash, verifyingContractHash, saltHash); return encoded; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs index 6b821df1..019970c9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs @@ -28,7 +28,7 @@ public byte[] GetEIP712EncodeData() foreach (var parentWallet in parentWallets) { parentWalletsEncoded = - ByteArrayExtensions.ConcatenateByteArrays(new AddressCoder().Encode(parentWalletsEncoded)); + ByteArrayExtensions.ConcatenateByteArrays(parentWalletsEncoded, new AddressCoder().Encode(parentWallet)); } } @@ -92,6 +92,11 @@ public EncodeSapient DoEncodeSapient(Chain chain) public static Parented DecodeFromSolidityEncoding(string solidityEncodedPayload) { SolidityDecoded decoded = SolidityDecoded.FromSolidityEncoding(solidityEncodedPayload); + return DecodeFromSolidityDecoded(decoded); + } + + public static Parented DecodeFromSolidityDecoded(SolidityDecoded decoded) + { Address[] parentWallets = decoded.parentWallets; Payload payload = null; switch (decoded.kind) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs index 888caa28..dd279ac1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -137,8 +137,9 @@ public byte[] GetSignPayload() SortTypes(); string encodeType = CalculateEncodeType(); byte[] encodeData = CalculateEncodeData(); + string hashedEncodeType = SequenceCoder.KeccakHashASCII(encodeType); byte[] hashStruct = SequenceCoder.KeccakHash( - ByteArrayExtensions.ConcatenateByteArrays(SequenceCoder.KeccakHash(encodeType).HexStringToByteArray(), + ByteArrayExtensions.ConcatenateByteArrays(hashedEncodeType.HexStringToByteArray(), encodeData)); byte[] domainSeparator = domain.GetDomainSeparator(); From a2dce773adfad8f680169a857e04d60722c7bea1 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 29 May 2025 16:58:37 -0400 Subject: [PATCH 030/165] Added additional unit tests to help determine why the Payload integration tests are failing --- .../IntegrationTests/PayloadTests.cs | 3 +- .../UnitTests/CallsPackingTests.cs | 46 +++++++++++++++++++ .../UnitTests/CallsPackingTests.cs.meta | 3 ++ .../UnitTests/SolidityDecodedTests.cs | 24 ++++++++++ .../Primitives/Payload/Call.cs | 17 +++++++ .../Primitives/Payload/Calls.cs | 22 +++++++++ 6 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/CallsPackingTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/CallsPackingTests.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs index 909af0f3..9145e145 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs @@ -34,7 +34,8 @@ private string DoConvertToPacked(string payload, Address wallet) if (decodedPayload.payload.isCalls) { byte[] packed = ((Calls)decodedPayload.payload).Encode(wallet); - return packed.ByteArrayToHexStringWithPrefix(); + string packedHex = packed.ByteArrayToHexStringWithPrefix(); + return packedHex; } throw new Exception("Not implemented or unsupported payload format"); diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/CallsPackingTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/CallsPackingTests.cs new file mode 100644 index 00000000..1bfb215e --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/CallsPackingTests.cs @@ -0,0 +1,46 @@ +using System.Numerics; +using NUnit.Framework; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.UnitTests +{ + public class CallsPackingTests + { + [Test] + public void TestPackCalls() + { + string expected = + "0x13006f000000000000000000000000000000000000000000000000000000000000001b000020565d6c6751f7da3a2225f0577a2fc7d4e04d4807e8e2860dfcbc7d20fbbaf800000031b91f19ca38dc8ebbf91db23bfcc6644095e20cd92de776fad23100abcf"; + + SolidityDecoded decoded = new SolidityDecoded(SolidityDecoded.Kind.Transaction, false, + new[] + { + new Call(new Address("0x5615deb798bb3e4dfa0139dfa1b3d433cc23b72f"), + BigInteger.Parse("27"), + "0x565d6c6751f7da3a2225f0577a2fc7d4e04d4807e8e2860dfcbc7d20fbbaf800" + .HexStringToByteArray(), + BigInteger.Parse("343176436416564113169670386691375668074847034592115607773457142857640911"), false, true, BehaviourOnError.revert) + }, BigInteger.Parse("0"), BigInteger.Parse("0"), + "0x", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + new Address[] { }); + + Parented parented = Parented.DecodeFromSolidityDecoded(decoded); + Assert.IsNotNull(parented); + Assert.True(parented.payload.isCalls); + + Calls calls = (Calls)parented.payload; + Assert.IsNotNull(calls); + Assert.AreEqual(1, calls.calls.Length); + Assert.AreEqual(decoded.calls[0], calls.calls[0]); + + byte[] packed = calls.Encode(); + Assert.IsNotNull(packed); + + string packedHex = packed.ByteArrayToHexStringWithPrefix(); + Assert.AreEqual(expected, packedHex); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/CallsPackingTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/CallsPackingTests.cs.meta new file mode 100644 index 00000000..89a69f00 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/CallsPackingTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d2ddd2fa06f9415bbbd56aa24fa3d70d +timeCreated: 1748546740 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs index b0a306c0..6fb77215 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs @@ -84,6 +84,30 @@ public void FromSolidityEncodingTest2() AssertEqualSolidityDecodings(expected, decoded); } + + [Test] + public void FromSolidityEncodingTest3() + { + string payload = + "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000005615deb798bb3e4dfa0139dfa1b3d433cc23b72f000000000000000000000000000000000000000000000000000000000000001b00000000000000000000000000000000000000000000000000000000000000e0000031b91f19ca38dc8ebbf91db23bfcc6644095e20cd92de776fad23100abcf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020565d6c6751f7da3a2225f0577a2fc7d4e04d4807e8e2860dfcbc7d20fbbaf80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + SolidityDecoded expected = new SolidityDecoded(SolidityDecoded.Kind.Transaction, false, + new[] + { + new Call(new Address("0x5615deb798bb3e4dfa0139dfa1b3d433cc23b72f"), + BigInteger.Parse("27"), + "0x565d6c6751f7da3a2225f0577a2fc7d4e04d4807e8e2860dfcbc7d20fbbaf800" + .HexStringToByteArray(), + BigInteger.Parse("343176436416564113169670386691375668074847034592115607773457142857640911"), false, true, BehaviourOnError.revert) + }, BigInteger.Parse("0"), BigInteger.Parse("0"), + "0x", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + new Address[] { }); + + SolidityDecoded decoded = SolidityDecoded.FromSolidityEncoding(payload); + + AssertEqualSolidityDecodings(expected, decoded); + } [Test] public void FromSolidityEncodingTest_MultipleCalls() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs index 07507069..cfecf9a5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs @@ -34,6 +34,23 @@ public Call(Address to, BigInteger value, byte[] data, BigInteger gasLimit, bool this.behaviorOnError = behaviorOnError; } + public override bool Equals(object obj) + { + if (obj == null || !(obj is Call)) + { + return false; + } + + Call call = (Call)obj; + return to.Equals(call.to) && + value == call.value && + data.Equals(call.data) && + gasLimit == call.gasLimit && + delegateCall == call.delegateCall && + onlyFallback == call.onlyFallback && + behaviorOnError == call.behaviorOnError; + } + public string Hash() { byte[] typeHash = new StaticBytesCoder().Encode(CALL_TYPEHASH); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs index a9e40358..e346d88a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs @@ -29,6 +29,28 @@ public Calls(BigInteger space, BigInteger nonce, Call[] calls) this.calls = calls; } + public override bool Equals(object obj) + { + if (obj == null || !(obj is Calls)) + { + return false; + } + + Calls other = (Calls)obj; + if (space != other.space || nonce != other.nonce || calls.Length != other.calls.Length) + { + return false; + } + for (int i = 0; i < calls.Length; i++) + { + if (!calls[i].Equals(other.calls[i])) + { + return false; + } + } + return true; + } + public override byte[] GetEIP712EncodeData() { byte[] spaceEncoded = new NumberCoder().Encode(space); From ced124a6dc2a6015ed0e42995503ceba80314a37 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Fri, 30 May 2025 10:23:21 -0400 Subject: [PATCH 031/165] Fix TestPackCalls and implementation --- .../UnitTests/CallsPackingTests.cs | 15 ++++++-- .../UnitTests/SolidityDecodedTests.cs | 34 +++++++++++++++++++ .../Primitives/Payload/Call.cs | 14 ++++++-- .../Primitives/Payload/Parented.cs | 27 +++++++++++++++ 4 files changed, 86 insertions(+), 4 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/CallsPackingTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/CallsPackingTests.cs index 1bfb215e..ee19b2ed 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/CallsPackingTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/CallsPackingTests.cs @@ -27,16 +27,27 @@ public void TestPackCalls() "0x0000000000000000000000000000000000000000000000000000000000000000", new Address[] { }); + Parented expectedParented = new Parented(new Address[] { }, + new Calls(BigInteger.Zero, BigInteger.Zero, new Call[] + { + new Call(new Address("0x5615deb798bb3e4dfa0139dfa1b3d433cc23b72f"), + BigInteger.Parse("27"), + "0x565d6c6751f7da3a2225f0577a2fc7d4e04d4807e8e2860dfcbc7d20fbbaf800" + .HexStringToByteArray(), + BigInteger.Parse("343176436416564113169670386691375668074847034592115607773457142857640911"), + false, true, BehaviourOnError.revert) + })); + Parented parented = Parented.DecodeFromSolidityDecoded(decoded); Assert.IsNotNull(parented); - Assert.True(parented.payload.isCalls); + Assert.AreEqual(expectedParented, parented); Calls calls = (Calls)parented.payload; Assert.IsNotNull(calls); Assert.AreEqual(1, calls.calls.Length); Assert.AreEqual(decoded.calls[0], calls.calls[0]); - byte[] packed = calls.Encode(); + byte[] packed = calls.Encode(new Address("0x5615deb798bb3e4dfa0139dfa1b3d433cc23b72f")); Assert.IsNotNull(packed); string packedHex = packed.ByteArrayToHexStringWithPrefix(); diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs index 6fb77215..fb533091 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs @@ -10,6 +10,40 @@ namespace Sequence.EcosystemWallet.UnitTests { public class SolidityDecodedTests { + [Test] + public void DecodeFromSolidityDecodedTest() + { + SolidityDecoded decoded = new SolidityDecoded(SolidityDecoded.Kind.Transaction, false, + new[] + { + new Call(new Address("0x5615deb798bb3e4dfa0139dfa1b3d433cc23b72f"), + BigInteger.Parse("27"), + "0x565d6c6751f7da3a2225f0577a2fc7d4e04d4807e8e2860dfcbc7d20fbbaf800" + .HexStringToByteArray(), + BigInteger.Parse("343176436416564113169670386691375668074847034592115607773457142857640911"), false, true, BehaviourOnError.revert) + }, BigInteger.Parse("0"), BigInteger.Parse("0"), + "0x", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + new Address[] { }); + + Parented expected = new Parented(new Address[] { }, + new Calls(BigInteger.Zero, BigInteger.Zero, new Call[] + { + new Call(new Address("0x5615deb798bb3e4dfa0139dfa1b3d433cc23b72f"), + BigInteger.Parse("27"), + "0x565d6c6751f7da3a2225f0577a2fc7d4e04d4807e8e2860dfcbc7d20fbbaf800" + .HexStringToByteArray(), + BigInteger.Parse("343176436416564113169670386691375668074847034592115607773457142857640911"), + false, true, BehaviourOnError.revert) + })); + + Parented parented = Parented.DecodeFromSolidityDecoded(decoded); + + Assert.IsNotNull(parented); + Assert.AreEqual(expected, parented); + } + [Test] public void FromSolidityEncodingTest() { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs index cfecf9a5..6777d0fa 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs @@ -42,9 +42,19 @@ public override bool Equals(object obj) } Call call = (Call)obj; - return to.Equals(call.to) && + bool toEqual = to.Equals(call.to); + int dataLength = data.Length; + bool dataEqual = dataLength == call.data.Length; + if (dataEqual) + { + for (int i = 0; i < dataLength; i++) + { + dataEqual &= data[i] == call.data[i]; + } + } + return toEqual && value == call.value && - data.Equals(call.data) && + dataEqual && gasLimit == call.gasLimit && delegateCall == call.delegateCall && onlyFallback == call.onlyFallback && diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs index 019970c9..b6686f13 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs @@ -18,6 +18,33 @@ public Parented(Address[] parentWallets, Payload payload) this.parentWallets = parentWallets; this.payload = payload; } + + public override bool Equals(object obj) + { + if (obj == null || !(obj is Parented)) + { + return false; + } + + Parented other = (Parented)obj; + if (parentWallets.Length != other.parentWallets.Length) + { + return false; + } + for (int i = 0; i < parentWallets.Length; i++) + { + if (!parentWallets[i].Equals(other.parentWallets[i])) + { + return false; + } + } + + if (!payload.Equals(other.payload)) + { + return false; + } + return true; + } public byte[] GetEIP712EncodeData() { From c4169b9b9ff37b5fa0bc627b86b53ad2e2120e60 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Fri, 30 May 2025 10:57:49 -0400 Subject: [PATCH 032/165] Fix BytesCoder - simply removing the trailing 0s can cause overflows when trying to take a substring in FixedBytesCoder if we have our byte array ending with 0 values; instead, we should just leave them and take the substring as in the spec --- .../SequenceSDK/Ethereum/ABI/Coders/BytesCoder.cs | 8 +------- .../Sequence/SequenceSDK/Ethereum/ChainId.cs | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/BytesCoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/BytesCoder.cs index 93442d47..7192476b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/BytesCoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/BytesCoder.cs @@ -85,13 +85,7 @@ public string DecodeFromString(string encodedString) { try { - int trailingZero = 0; - for (int i = encodedString.Length - 1; i > 64; i--) - { - if (encodedString[i] == '0') trailingZero++; - else break; - } - string fixedStr = EnsureEvenLength(encodedString.Substring(0, encodedString.Length - trailingZero)); + string fixedStr = EnsureEvenLength(encodedString); return _fixedBytesCoder.DecodeFromString(fixedStr); } catch (Exception ex) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ChainId.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ChainId.cs index 961d2242..7af5c0df 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ChainId.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ChainId.cs @@ -26,7 +26,7 @@ public static string GetChainId(this Chain chain) public static bool IsActive(this Chain chain) { - return !(chain == Chain.None || chain == Chain.AstarZKEvm || chain == Chain.TestnetAstarZKyoto || chain == Chain.TestnetBorne); + return !(chain == Chain.None || chain == Chain.AstarZKEvm || chain == Chain.TestnetAstarZKyoto || chain == Chain.TestnetBorne || chain == Chain.LocalChain); } } From d69ee913c7ad38f0137a4b3eb5f0316b1b300424 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 2 Jun 2025 14:01:20 +0200 Subject: [PATCH 033/165] added permission primitives and its decoding/encoding functions --- .../Primitives/Permission.meta | 3 + .../Permission/ParameterOperation.cs | 14 ++++ .../Permission/ParameterOperation.cs.meta | 3 + .../Primitives/Permission/ParameterRule.cs | 50 +++++++++++++ .../Permission/ParameterRule.cs.meta | 3 + .../Primitives/Permission/Permission.cs | 63 ++++++++++++++++ .../Primitives/Permission/Permission.cs.meta | 3 + .../Permission/SessionPermissions.cs | 72 +++++++++++++++++++ .../Permission/SessionPermissions.cs.meta | 3 + 9 files changed, 214 insertions(+) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission.meta new file mode 100644 index 00000000..6d4b7164 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d47dd022817b431197bc3ed7bdf1ce27 +timeCreated: 1748864100 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs new file mode 100644 index 00000000..5a926f5e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs @@ -0,0 +1,14 @@ +using Newtonsoft.Json; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + [JsonConverter(typeof(EnumConverter))] + public enum ParameterOperation : byte + { + equal = 0x00, + notEqual = 0x01, + greaterThanOrEqual = 0x02, + lessThanOrEqual = 0x03 + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs.meta new file mode 100644 index 00000000..161a0753 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5142edbadf684e05a04175c26d9f1308 +timeCreated: 1748864133 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs new file mode 100644 index 00000000..02700d6a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Numerics; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + public class ParameterRule + { + public bool cumulative; + public ParameterOperation operation; + public byte[] value; + public BigInteger offset; + public byte[] mask; + + public byte[] Encode() + { + byte operationCumulative = (byte)(((byte)operation << 1) | (cumulative ? 1 : 0)); + List result = new() { operationCumulative }; + result.AddRange(value.PadLeft(32)); + result.AddRange(offset.ToByteArray().PadLeft(32)); + result.AddRange(mask.PadLeft(32)); + return result.ToArray(); + } + + public static ParameterRule Decode(byte[] data) + { + if (data.Length != 97) + throw new Exception("Invalid parameter rule length"); + + var operationCumulative = data[0]; + var cumulative = (operationCumulative & 1) == 1; + var operation = (ParameterOperation)(operationCumulative >> 1); + + var value = data.AsSpan(1, 32).ToArray(); + var offset = new BigInteger(data.AsSpan(33, 32).ToArray(), isUnsigned: true, isBigEndian: true); + var mask = data.AsSpan(65, 32).ToArray(); + + return new ParameterRule + { + cumulative = cumulative, + operation = operation, + value = value, + offset = offset, + mask = mask + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs.meta new file mode 100644 index 00000000..07da28f0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6c0ddfdce36c4c458a5d8f11dc4457ff +timeCreated: 1748864200 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs new file mode 100644 index 00000000..153bfec9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + public class Permission + { + public const int MAX_PERMISSIONS_COUNT = (1 << 7) - 1; + public const int MAX_RULES_COUNT = (1 << 8) - 1; + + public Address target; + public ParameterRule[] rules; + + public byte[] Encode() + { + if (rules.Length > MAX_RULES_COUNT) { + throw new Exception("Too many rules"); + } + + List result = new(); + result.AddRange(target.ToString().HexStringToByteArray().PadLeft(20)); + result.Add((byte)rules.Length); + + foreach (var rule in rules) { + result.AddRange(rule.Encode()); + } + + return result.ToArray(); + } + + public static (Permission Permission, int Consumed) Decode(byte[] data, int offset) + { + if (data.Length < offset + 21) + throw new Exception("Data too short for permission"); + + var target = new Address(data.AsSpan(offset, 20).ToArray()); + offset += 20; + + int rulesLength = data[offset]; + offset += 1; + + var rules = new ParameterRule[rulesLength]; + const int ruleSize = 97; + + for (var i = 0; i < rulesLength; i++) { + if (data.Length < offset + ruleSize) + throw new Exception("Data too short for parameter rule"); + + var ruleBytes = data.AsSpan(offset, ruleSize).ToArray(); + var rule = ParameterRule.Decode(ruleBytes); + rules[i] = rule; + offset += ruleSize; + } + + return (new Permission { + target = target, + rules = rules + }, 20 + 1 + ruleSize * rulesLength); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs.meta new file mode 100644 index 00000000..641d631b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0ec6c44fd8a24edca1462fa547616aa8 +timeCreated: 1748864419 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs new file mode 100644 index 00000000..1cecd13c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Numerics; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + public class SessionPermissions + { + public Address signer; + public BigInteger valueLimit; + public BigInteger deadline; + public Permission[] permissions; + + public byte[] Encode() + { + if (permissions.Length > Permission.MAX_PERMISSIONS_COUNT) { + throw new Exception("Too many permissions"); + } + + List result = new(); + result.AddRange(signer.ToString().HexStringToByteArray().PadLeft(20)); + result.AddRange(valueLimit.ToByteArray().PadLeft(32)); + result.AddRange(deadline.ToByteArray().PadLeft(32)); + result.Add((byte)permissions.Length); + + foreach (var permission in permissions) { + result.AddRange(permission.Encode()); + } + + return result.ToArray(); + } + + public static SessionPermissions Decode(byte[] data) + { + if (data.Length < 85) + throw new Exception("Data too short"); + + var ptr = 0; + + var signer = new Address(data.AsSpan(ptr, 20).ToArray()); + ptr += 20; + + var valueLimit = new BigInteger(data.AsSpan(ptr, 32).ToArray(), isUnsigned: true, isBigEndian: true); + ptr += 32; + + var deadline = new BigInteger(data.AsSpan(ptr, 32).ToArray(), isUnsigned: true, isBigEndian: true); + ptr += 32; + + var permissionsLength = data[ptr]; + ptr += 1; + + var permissions = new Permission[permissionsLength]; + for (var i = 0; i < permissionsLength; i++) { + var (permission, consumed) = Permission.Decode(data, ptr); + permissions[i] = permission; + ptr += consumed; + } + + if (permissions.Length == 0) + throw new Exception("No permissions"); + + return new SessionPermissions { + signer = signer, + valueLimit = valueLimit, + deadline = deadline, + permissions = permissions + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs.meta new file mode 100644 index 00000000..0843d6b5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3bd8acfb30404b82bae1266858e20a88 +timeCreated: 1748864320 \ No newline at end of file From 64d262a930e8a60418b24463f9e808e4b6ee1be7 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 2 Jun 2025 14:16:09 -0400 Subject: [PATCH 034/165] Added a unit test to confirm we can successfully build a TypedDataToSign object from a ConfigUpdate Parented payload --- .../UnitTests/TypedDataToSignTests.cs | 78 ++++++++++++++++++ .../UnitTests/TypedDataToSignTests.cs.meta | 3 + .../Primitives/Payload/ConfigUpdate.cs | 2 +- .../Primitives/Payload/Domain.cs | 24 ++++++ .../Primitives/Payload/NamedType.cs | 11 +++ .../Primitives/Payload/TypedDataToSign.cs | 80 ++++++++++++++++++- .../Ethereum/ABI/Types/ABIDataTypes.cs | 42 ++++++++++ 7 files changed, 238 insertions(+), 2 deletions(-) create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs new file mode 100644 index 00000000..90b05dd2 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs @@ -0,0 +1,78 @@ +using System.Collections.Generic; +using NUnit.Framework; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.UnitTests +{ + public class TypedDataToSignTests + { + [Test] + public void TestCreateFromConfigUpdatePayload() + { + Address[] addressArray = new Address[] + { + new Address("0xe86ff51267fb7a1ff020a04971203a2f57eb5ab0"), + new Address("0x6b45dcf3e824145375ab46af51334f823837f90c"), + new Address("0x2d459f147b3fb3ea6e07a4af02201f85aa995aec"), + new Address("0x66e63215a4994d95930c5d39231d36c23ab03fc0"), + new Address("0xf1be39a6aa2279e119a65d15c44456827e48f81a"), + new Address("0xfc9c1687f8ca3e01e4fd1f7a2c07edff2f1657c4"), + new Address("0xa3d430fb60a138d1740231bc499df3c89011ddfa"), + new Address("0x2f6b49aaec1fa5b04485da48dacdd0a2f4786e9b"), + new Address("0x6339f581b1a4be3878c41b84319b9aed756bae7b"), + new Address("0x66067612abc3abd2c48b5820cef62727f46016cd"), + new Address("0xc9a9f3bf19c80ecd30277ac1be0ab17dd538db34"), + new Address("0x6af6509adca19ef0f1c2b183c0a12fbde4f1b3f2"), + new Address("0xd51d83fc620cf678cce893703e753d693f106403"), + new Address("0x262db8e0f4a2fcba5fa7199490f1c609ecfcef1c"), + new Address("0x2205fd44262d7d5ceead32f2f7d9e1aba9c04c9d"), + new Address("0xbe010524b4818ef8168498fc55813a462defcaf3"), + new Address("0x5759cd0751fe51e6bb5232a86b4e0e56e32f20fc"), + new Address("0xd50153fb2144323d989cbbb440670c5a6101dbce"), + new Address("0x622e3a3da94079fa0cbf994e06768035e8791527"), + new Address("0x04b8b03dba0d960415ce5177accf9d399ed852eb"), + new Address("0xb4cb75becc7d6c25a8815d3a31d997105772d12b"), + new Address("0x6aa42b1d0f63dae3a5bf785101c2d2bf26679463"), + new Address("0x992c74ff99dabaacd47ddf171747b927bb9318e9"), + new Address("0x9ff1939e31843cd8df1eb4f9f9b3b4e2688dcdc9"), + new Address("0x9fe63115bd584e296a71ddae97087ebb2724c6fd"), + new Address("0x2c99841fb733c81fc049713cf8a5c250c85b92f4"), + new Address("0xd232072f82e45a6ddbe592f3ffe77b3e0d44fd21") + }; + + TypedDataToSign expected = new TypedDataToSign( + new Domain("Sequence Wallet", "3", Chain.LocalChain, + new Address("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f")), + new Dictionary + { + ["ConfigUpdate"] = new[] + { + new NamedType("imageHash", "bytes32"), + new NamedType("wallets", "address[]") + }, + }, + "ConfigUpdate", + new Dictionary() + { + { + "imageHash", + "0x6810c263f45be5dc8e8e6ffd2ab9bd6f152412edb66111b6f56e39a42c694405" + }, + { + "wallets", addressArray + } + }); + + Address fromWallet = new Address("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"); + Chain chain = Chain.LocalChain; + + Parented parented = new Parented(addressArray, + new ConfigUpdate("0x6810c263f45be5dc8e8e6ffd2ab9bd6f152412edb66111b6f56e39a42c694405")); + + TypedDataToSign result = new TypedDataToSign(fromWallet, chain, parented); + + Assert.AreEqual(expected, result); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs.meta new file mode 100644 index 00000000..bbccdefa --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6009ed5fd3ce4043b1a37488a4f6d3c4 +timeCreated: 1748880137 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs index aa91b6a8..268a5474 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs @@ -6,7 +6,7 @@ namespace Sequence.EcosystemWallet.Primitives { [Serializable] - internal class ConfigUpdate : Payload + public class ConfigUpdate : Payload { public override PayloadType type => PayloadType.ConfigUpdate; public string imageHash; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs index f3520786..0dfc6a25 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs @@ -13,6 +13,30 @@ public class Domain public BigInteger chainId; public Address verifyingContract; public FixedByte salt; + + public override bool Equals(object obj) + { + if (obj == null || !(obj is Domain)) + { + return false; + } + + Domain other = (Domain)obj; + if (salt != null && other.salt != null) + { + if (!salt.Equals(other.salt)) + { + return false; + } + } + else if (salt != null && other.salt == null || + salt == null && other.salt != null) + { + return false; + } + return name.Equals(other.name) && version.Equals(other.version) && chainId.Equals(other.chainId) && + verifyingContract.Equals(other.verifyingContract); + } public Domain(string name, string version, BigInteger chainId, Address verifyingContract, FixedByte salt = null) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs index ea87ce81..cebbe0ce 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs @@ -14,5 +14,16 @@ public NamedType(string name, string type) this.name = name; this.type = type; } + + public override bool Equals(object obj) + { + if (obj == null || !(obj is NamedType)) + { + return false; + } + + NamedType other = (NamedType)obj; + return name.Equals(other.name) && type.Equals(other.type); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs index dd279ac1..186296c3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -9,7 +9,7 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class TypedDataToSign + public class TypedDataToSign { public Domain domain; public Dictionary types; @@ -18,6 +18,84 @@ internal class TypedDataToSign private string[] _types; private Parented _payload; + + public override bool Equals(object obj) + { + if (obj == null || !(obj is TypedDataToSign)) + { + return false; + } + + TypedDataToSign other = (TypedDataToSign)obj; + if (!other.domain.Equals(domain)) + { + return false; + } + + if (types.GetKeys().Length.Equals(other.types.GetKeys().Length)) + { + foreach (var key in types.GetKeys()) + { + NamedType[] namedTypes = types[key]; + NamedType[] otherNamedTypes; + if (other.types.TryGetValue(key, out otherNamedTypes)) + { + int length = namedTypes.Length; + if (length != otherNamedTypes.Length) + { + return false; + } + + for (int i = 0; i < length; i++) + { + if (!namedTypes[i].Equals(otherNamedTypes[i])) + { + return false; + } + } + } + else + { + return false; + } + } + } + else + { + return false; + } + + if (!primaryType.Equals(other.primaryType)) + { + return false; + } + + if (message.GetKeys().Length.Equals(other.message.GetKeys().Length)) + { + foreach (var key in message.GetKeys()) + { + object value = message[key]; + object otherValue; + if (other.message.TryGetValue(key, out otherValue)) + { + if (!value.Equals(otherValue)) + { + return false; + } + } + else + { + return false; + } + } + } + else + { + return false; + } + + return true; + } [Preserve] [JsonConstructor] diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Types/ABIDataTypes.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Types/ABIDataTypes.cs index bf55a624..9ce84099 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Types/ABIDataTypes.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Types/ABIDataTypes.cs @@ -15,6 +15,48 @@ public class FixedByte : IList public bool IsFixedSize { get; } = true; public bool IsReadOnly { get; } private static readonly string ConstructorExceptionMessage = "ABIByte type length should be [0,32]"; + + public override bool Equals(object obj) + { + if (obj == null || !(obj is FixedByte)) + { + return false; + } + + FixedByte other = (FixedByte)obj; + if (Data != null) + { + if (other.Data == null) + { + return false; + } + } + else + { + if (other.Data != null) + { + return false; + } + + return true; + } + + int dataLength = Data.Length; + if (dataLength != other.Data.Length) + { + return false; + } + + for (int i = 0; i < dataLength; i++) + { + if (!Data[i].Equals(other.Data[i])) + { + return false; + } + } + + return true; + } public FixedByte(int count, string str) { From 6024e1ec6ed2221b931444452ed628d87c8108d5 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Tue, 3 Jun 2025 11:20:26 -0400 Subject: [PATCH 035/165] Added a unit test to confirm we can successfully build a TypedDataToSign object from a Message Parented payload --- .../UnitTests/TypedDataToSignTests.cs | 105 ++++++++++++------ .../Primitives/Payload/Message.cs | 2 +- 2 files changed, 73 insertions(+), 34 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs index 90b05dd2..21f3ecd0 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs @@ -7,40 +7,40 @@ namespace Sequence.EcosystemWallet.UnitTests { public class TypedDataToSignTests { + private Address[] _addressArray = new Address[] + { + new Address("0xe86ff51267fb7a1ff020a04971203a2f57eb5ab0"), + new Address("0x6b45dcf3e824145375ab46af51334f823837f90c"), + new Address("0x2d459f147b3fb3ea6e07a4af02201f85aa995aec"), + new Address("0x66e63215a4994d95930c5d39231d36c23ab03fc0"), + new Address("0xf1be39a6aa2279e119a65d15c44456827e48f81a"), + new Address("0xfc9c1687f8ca3e01e4fd1f7a2c07edff2f1657c4"), + new Address("0xa3d430fb60a138d1740231bc499df3c89011ddfa"), + new Address("0x2f6b49aaec1fa5b04485da48dacdd0a2f4786e9b"), + new Address("0x6339f581b1a4be3878c41b84319b9aed756bae7b"), + new Address("0x66067612abc3abd2c48b5820cef62727f46016cd"), + new Address("0xc9a9f3bf19c80ecd30277ac1be0ab17dd538db34"), + new Address("0x6af6509adca19ef0f1c2b183c0a12fbde4f1b3f2"), + new Address("0xd51d83fc620cf678cce893703e753d693f106403"), + new Address("0x262db8e0f4a2fcba5fa7199490f1c609ecfcef1c"), + new Address("0x2205fd44262d7d5ceead32f2f7d9e1aba9c04c9d"), + new Address("0xbe010524b4818ef8168498fc55813a462defcaf3"), + new Address("0x5759cd0751fe51e6bb5232a86b4e0e56e32f20fc"), + new Address("0xd50153fb2144323d989cbbb440670c5a6101dbce"), + new Address("0x622e3a3da94079fa0cbf994e06768035e8791527"), + new Address("0x04b8b03dba0d960415ce5177accf9d399ed852eb"), + new Address("0xb4cb75becc7d6c25a8815d3a31d997105772d12b"), + new Address("0x6aa42b1d0f63dae3a5bf785101c2d2bf26679463"), + new Address("0x992c74ff99dabaacd47ddf171747b927bb9318e9"), + new Address("0x9ff1939e31843cd8df1eb4f9f9b3b4e2688dcdc9"), + new Address("0x9fe63115bd584e296a71ddae97087ebb2724c6fd"), + new Address("0x2c99841fb733c81fc049713cf8a5c250c85b92f4"), + new Address("0xd232072f82e45a6ddbe592f3ffe77b3e0d44fd21") + }; + [Test] public void TestCreateFromConfigUpdatePayload() { - Address[] addressArray = new Address[] - { - new Address("0xe86ff51267fb7a1ff020a04971203a2f57eb5ab0"), - new Address("0x6b45dcf3e824145375ab46af51334f823837f90c"), - new Address("0x2d459f147b3fb3ea6e07a4af02201f85aa995aec"), - new Address("0x66e63215a4994d95930c5d39231d36c23ab03fc0"), - new Address("0xf1be39a6aa2279e119a65d15c44456827e48f81a"), - new Address("0xfc9c1687f8ca3e01e4fd1f7a2c07edff2f1657c4"), - new Address("0xa3d430fb60a138d1740231bc499df3c89011ddfa"), - new Address("0x2f6b49aaec1fa5b04485da48dacdd0a2f4786e9b"), - new Address("0x6339f581b1a4be3878c41b84319b9aed756bae7b"), - new Address("0x66067612abc3abd2c48b5820cef62727f46016cd"), - new Address("0xc9a9f3bf19c80ecd30277ac1be0ab17dd538db34"), - new Address("0x6af6509adca19ef0f1c2b183c0a12fbde4f1b3f2"), - new Address("0xd51d83fc620cf678cce893703e753d693f106403"), - new Address("0x262db8e0f4a2fcba5fa7199490f1c609ecfcef1c"), - new Address("0x2205fd44262d7d5ceead32f2f7d9e1aba9c04c9d"), - new Address("0xbe010524b4818ef8168498fc55813a462defcaf3"), - new Address("0x5759cd0751fe51e6bb5232a86b4e0e56e32f20fc"), - new Address("0xd50153fb2144323d989cbbb440670c5a6101dbce"), - new Address("0x622e3a3da94079fa0cbf994e06768035e8791527"), - new Address("0x04b8b03dba0d960415ce5177accf9d399ed852eb"), - new Address("0xb4cb75becc7d6c25a8815d3a31d997105772d12b"), - new Address("0x6aa42b1d0f63dae3a5bf785101c2d2bf26679463"), - new Address("0x992c74ff99dabaacd47ddf171747b927bb9318e9"), - new Address("0x9ff1939e31843cd8df1eb4f9f9b3b4e2688dcdc9"), - new Address("0x9fe63115bd584e296a71ddae97087ebb2724c6fd"), - new Address("0x2c99841fb733c81fc049713cf8a5c250c85b92f4"), - new Address("0xd232072f82e45a6ddbe592f3ffe77b3e0d44fd21") - }; - TypedDataToSign expected = new TypedDataToSign( new Domain("Sequence Wallet", "3", Chain.LocalChain, new Address("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f")), @@ -60,19 +60,58 @@ public void TestCreateFromConfigUpdatePayload() "0x6810c263f45be5dc8e8e6ffd2ab9bd6f152412edb66111b6f56e39a42c694405" }, { - "wallets", addressArray + "wallets", _addressArray } }); Address fromWallet = new Address("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"); Chain chain = Chain.LocalChain; - Parented parented = new Parented(addressArray, + Parented parented = new Parented(_addressArray, new ConfigUpdate("0x6810c263f45be5dc8e8e6ffd2ab9bd6f152412edb66111b6f56e39a42c694405")); TypedDataToSign result = new TypedDataToSign(fromWallet, chain, parented); Assert.AreEqual(expected, result); } + + [Test] + public void TestCreateFromMessagePayload() + { + TypedDataToSign expected = new TypedDataToSign(new Domain("Sequence Wallet", "3", Chain.LocalChain, + new Address("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f")), new Dictionary() + { + { + "Message", new[] + { + new NamedType("message", "bytes"), + new NamedType("wallets", "address[]") + } + } + }, "Message", new Dictionary() + { + { + "message", + "0xc263f45be5dc8e8e6ffd2ab9bd6f152412edb66111b6f56e39a42c69440581f0e86ff51267fb7a1ff020a049" + }, + { "wallets", _addressArray } + }); + + Address fromWallet = new Address("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"); + Chain chain = Chain.LocalChain; + Parented parented = new Parented(_addressArray, + new Message(new byte[] + { + 194, 99, 244, 91, 229, 220, 142, 142, 111, + 253, 42, 185, 189, 111, 21, 36, 18, 237, + 182, 97, 17, 182, 245, 110, 57, 164, 44, + 105, 68, 5, 129, 240, 232, 111, 245, 18, + 103, 251, 122, 31, 240, 32, 160, 73 + })); + + TypedDataToSign result = new TypedDataToSign(fromWallet, chain, parented); + + Assert.AreEqual(expected, result); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs index 5f2020fe..447d70ac 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs @@ -6,7 +6,7 @@ namespace Sequence.EcosystemWallet.Primitives { [Serializable] - internal class Message : Payload + public class Message : Payload { public override PayloadType type => PayloadType.Message; public byte[] message; From 4695b822d73a48fe3e87f79b038119012538586d Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Tue, 3 Jun 2025 11:46:49 -0400 Subject: [PATCH 036/165] Added a unit test to confirm we can successfully created a TypedDataToSign from a Calls Parented Payload --- .../MostRecentPackage.unitypackage.meta | 7 ++ .../UnitTests/TypedDataToSignTests.cs | 68 +++++++++++++++++++ .../Primitives/Payload/EncodeSapient.cs | 19 ++++++ .../Primitives/Payload/TypedDataToSign.cs | 29 ++++++++ 4 files changed, 123 insertions(+) create mode 100644 Assets/PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta diff --git a/Assets/PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta b/Assets/PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta new file mode 100644 index 00000000..c0cdc525 --- /dev/null +++ b/Assets/PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: aa66cce13570c4036afe2e85742962d9 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs index 21f3ecd0..5afd4e24 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Numerics; using NUnit.Framework; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; @@ -113,5 +114,72 @@ public void TestCreateFromMessagePayload() Assert.AreEqual(expected, result); } + + [Test] + public void TestCreateFromCallsPayload() + { + TypedDataToSign expected = new TypedDataToSign(new Domain("Sequence Wallet", "3", Chain.LocalChain, + new Address("0xd0B2e0C7b8a2D267733B573Bdc87cC73f551b8A4")), new Dictionary() + { + { + "Calls", new NamedType[] + { + new NamedType("calls", "Call[]"), + new NamedType("space", "uint256"), + new NamedType("nonce", "uint256"), + new NamedType("wallets", "address[]") + } + }, + { + "Call", new NamedType[] + { + new NamedType("to", "address"), + new NamedType("value", "uint256"), + new NamedType("data", "bytes"), + new NamedType("gasLimit", "uint256"), + new NamedType("delegateCall", "bool"), + new NamedType("onlyFallback", "bool"), + new NamedType("behaviorOnError", "uint256") + } + } + }, "Calls", new Dictionary() + { + { + "calls", new EncodeSapient.EncodedCall[] + { + new EncodeSapient.EncodedCall(new Call(new Address("0x6810c263f45be5dc8e8e6ffd2ab9bd6f152412ed"), + BigInteger.Parse("19035696402805033763977015876"), + "0xf51267fb7a1ff020a04971203a2f57eb5ab06b45dcf3e824145375ab46af51334f823837f90c2d459f147b3fb3ea6e07a4af02201f85aa995aec66e632" + .HexStringToByteArray(), BigInteger.Parse("29"), false, true, BehaviourOnError.abort)), + new EncodeSapient.EncodedCall(new Call(new Address("0x7fa9385be102ac3eac297483dd6233d62b3e1496"), BigInteger.Parse("0"), + "0x001122".HexStringToByteArray(), BigInteger.Parse("1000000"), false, false, + BehaviourOnError.ignore)), + } + }, + { "space", "1266736520029721018202413622017" }, + { "nonce", "55846603721928660" }, + { "wallets", _addressArray } + }); + + Address fromWallet = new Address("0xd0B2e0C7b8a2D267733B573Bdc87cC73f551b8A4"); + Chain chain = Chain.LocalChain; + + Parented parented = new Parented(_addressArray, + new Calls(BigInteger.Parse("1266736520029721018202413622017"), BigInteger.Parse("55846603721928660"), + new Call[] + { + new Call(new Address("0x6810c263f45be5dc8e8e6ffd2ab9bd6f152412ed"), + BigInteger.Parse("19035696402805033763977015876"), + "0xf51267fb7a1ff020a04971203a2f57eb5ab06b45dcf3e824145375ab46af51334f823837f90c2d459f147b3fb3ea6e07a4af02201f85aa995aec66e632" + .HexStringToByteArray(), BigInteger.Parse("29"), false, true, BehaviourOnError.abort), + new Call(new Address("0x7fa9385be102ac3eac297483dd6233d62b3e1496"), BigInteger.Parse("0"), + "0x001122".HexStringToByteArray(), BigInteger.Parse("1000000"), false, false, + BehaviourOnError.ignore), + })); + + TypedDataToSign result = new TypedDataToSign(fromWallet, chain, parented); + + Assert.AreEqual(expected, result); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs index 23093270..28da1cca 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs @@ -37,6 +37,25 @@ public EncodedCall(Call call) onlyFallback = call.onlyFallback; behaviorOnError = (int)call.behaviorOnError; } + + public override bool Equals(object obj) + { + if (obj == null || !(obj is EncodedCall)) + { + return false; + } + + EncodedCall call = (EncodedCall)obj; + bool toEqual = to.Equals(call.to); + bool dataEqual = data.Equals(call.data); + return toEqual && + value == call.value && + dataEqual && + gasLimit == call.gasLimit && + delegateCall == call.delegateCall && + onlyFallback == call.onlyFallback && + behaviorOnError == call.behaviorOnError; + } } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs index 186296c3..fada6de3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Numerics; using System.Text; @@ -78,6 +79,34 @@ public override bool Equals(object obj) object otherValue; if (other.message.TryGetValue(key, out otherValue)) { + if (value is IEnumerable) + { + if (!(otherValue is IEnumerable)) + { + return false; + } + + IEnumerator valueEnumerator = ((IEnumerable)value).GetEnumerator(); + IEnumerator otherValueEnumerator = ((IEnumerable)otherValue).GetEnumerator(); + + while (valueEnumerator.MoveNext() && otherValueEnumerator.MoveNext()) + { + if (valueEnumerator.Current != null && !valueEnumerator.Current.Equals(otherValueEnumerator.Current)) + { + return false; + } + if (valueEnumerator.Current == null && otherValueEnumerator.Current != null) + { + return false; + } + } + + if (valueEnumerator.MoveNext() || otherValueEnumerator.MoveNext()) + { + return false; + } + continue; + } if (!value.Equals(otherValue)) { return false; From 42446e16e3224dd36da2b5739d7a828cbd0c70cd Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Wed, 4 Jun 2025 13:37:30 -0400 Subject: [PATCH 037/165] Log a bunch of stuff to debug eip712 signing --- .../Primitives/Payload/Call.cs | 13 ++ .../Primitives/Payload/Calls.cs | 21 ++++ .../Primitives/Payload/ConfigUpdate.cs | 8 ++ .../Primitives/Payload/Digest.cs | 7 ++ .../Primitives/Payload/Domain.cs | 6 + .../Primitives/Payload/Message.cs | 8 ++ .../Primitives/Payload/NamedType.cs | 5 + .../Primitives/Payload/Parented.cs | 7 ++ .../Primitives/Payload/Payload.cs | 2 + .../Primitives/Payload/TypedDataToSign.cs | 112 +++++++++++++++++- 10 files changed, 186 insertions(+), 3 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs index 6777d0fa..0c94d284 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs @@ -61,6 +61,19 @@ public override bool Equals(object obj) behaviorOnError == call.behaviorOnError; } + public override string ToString() + { + string dataHex = data != null ? data.ByteArrayToHexStringWithPrefix() : "null"; + // Truncate data if it's too long for display + if (dataHex != null && dataHex.Length > 50) + { + dataHex = dataHex.Substring(0, 47) + "..."; + } + + return $"Call {{ to: {to}, value: {value}, data: {dataHex}, gasLimit: {gasLimit}, " + + $"delegateCall: {delegateCall}, onlyFallback: {onlyFallback}, behaviorOnError: {behaviorOnError} }}"; + } + public string Hash() { byte[] typeHash = new StaticBytesCoder().Encode(CALL_TYPEHASH); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs index e346d88a..91ae886f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Numerics; using NUnit.Framework; using Sequence.ABI; @@ -72,6 +73,26 @@ public override byte[] GetEIP712EncodeData() return encoded; } + public override string ToString() + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + + sb.AppendLine($"Calls {{ space: {space}, nonce: {nonce}, calls: ["); + + if (calls != null) + { + for (int i = 0; i < calls.Length; i++) + { + sb.AppendLine($" {calls[i]},"); + } + } + + string parentWalletsStr = parentWallets != null ? string.Join(", ", parentWallets.Select(w => w.ToString()).ToArray()) : "null"; + sb.AppendLine($"], parentWallets: [{parentWalletsStr}] }}"); + + return sb.ToString(); + } + // Todo: once we're able to test the following code, let's refactor it into separate classes and methods instead of giant methods public byte[] Encode(Address self = null) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs index 268a5474..69ce486d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using Sequence.ABI; using Sequence.Utils; using UnityEngine.Scripting; @@ -21,9 +22,16 @@ public override byte[] GetEIP712EncodeData() { FixedByte bytes = new FixedByte(32, imageHash.HexStringToByteArray()); byte[] encoded = new FixedBytesCoder().Encode(bytes); + string asHex = encoded.ByteArrayToHexStringWithPrefix(); return encoded; } + public override string ToString() + { + string parentWalletsStr = parentWallets != null ? string.Join(", ", parentWallets.Select(w => w.ToString()).ToArray()) : "null"; + return $"ConfigUpdate {{ imageHash: {imageHash}, parentWallets: [{parentWalletsStr}] }}"; + } + internal static ConfigUpdate FromSolidityEncoding(SolidityDecoded decoded) { return new ConfigUpdate(decoded.imageHash.EnsureHexPrefix()); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs index 0615cfc3..00a2bae1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs @@ -2,6 +2,7 @@ using Sequence.ABI; using Sequence.Utils; using UnityEngine.Scripting; +using System.Linq; namespace Sequence.EcosystemWallet.Primitives { @@ -24,6 +25,12 @@ public override byte[] GetEIP712EncodeData() return encoded; } + public override string ToString() + { + string parentWalletsStr = parentWallets != null ? string.Join(", ", parentWallets.Select(w => w.ToString()).ToArray()) : "null"; + return $"Digest {{ digest: {digest}, parentWallets: [{parentWalletsStr}] }}"; + } + internal static Digest FromSolidityEncoding(SolidityDecoded decoded) { return new Digest(decoded.digest.EnsureHexPrefix()); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs index 0dfc6a25..bde1ec54 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs @@ -37,6 +37,12 @@ public override bool Equals(object obj) return name.Equals(other.name) && version.Equals(other.version) && chainId.Equals(other.chainId) && verifyingContract.Equals(other.verifyingContract); } + + public override string ToString() + { + string saltStr = salt != null ? salt.ToString() : "null"; + return $"Domain {{ name: {name}, version: {version}, chainId: {chainId}, verifyingContract: {verifyingContract}, salt: {saltStr} }}"; + } public Domain(string name, string version, BigInteger chainId, Address verifyingContract, FixedByte salt = null) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs index 447d70ac..9ae8235e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using Sequence.ABI; using Sequence.Utils; using UnityEngine.Scripting; @@ -23,6 +24,13 @@ public override byte[] GetEIP712EncodeData() return encoded; } + public override string ToString() + { + string messageHex = message != null ? message.ByteArrayToHexStringWithPrefix() : "null"; + string parentWalletsStr = parentWallets != null ? string.Join(", ", parentWallets.Select(w => w.ToString()).ToArray()) : "null"; + return $"Message {{ message: {messageHex}, parentWallets: [{parentWalletsStr}] }}"; + } + internal static Message FromSolidityEncoding(SolidityDecoded decoded) { return new Message(decoded.message.HexStringToByteArray()); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs index cebbe0ce..f17670d4 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs @@ -25,5 +25,10 @@ public override bool Equals(object obj) NamedType other = (NamedType)obj; return name.Equals(other.name) && type.Equals(other.type); } + + public override string ToString() + { + return $"{type} {name}"; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs index b6686f13..fff120ee 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Numerics; using Sequence.ABI; using Sequence.Utils; @@ -45,6 +46,12 @@ public override bool Equals(object obj) } return true; } + + public override string ToString() + { + string parentWalletsStr = parentWallets != null ? string.Join(", ", parentWallets.Select(w => w.ToString()).ToArray()) : "null"; + return $"Parented {{ payload: {payload}, parentWallets: [{parentWalletsStr}] }}"; + } public byte[] GetEIP712EncodeData() { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Payload.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Payload.cs index 5a611b96..c84baa8f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Payload.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Payload.cs @@ -11,5 +11,7 @@ public abstract class Payload public bool isDigest => type == PayloadType.Digest; public abstract byte[] GetEIP712EncodeData(); + + public abstract override string ToString(); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs index fada6de3..42b66db8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -6,6 +6,7 @@ using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; +using UnityEngine; using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives @@ -126,6 +127,77 @@ public override bool Equals(object obj) return true; } + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + + sb.AppendLine("TypedDataToSign {"); + sb.AppendLine($" PrimaryType: {primaryType}"); + + // Append domain information + sb.AppendLine($" Domain: {domain}"); + + // Append types + sb.AppendLine(" Types: {"); + foreach (var typeEntry in types) + { + sb.AppendLine($" {typeEntry.Key}: ["); + foreach (var namedType in typeEntry.Value) + { + sb.AppendLine($" {namedType}"); + } + sb.AppendLine(" ]"); + } + sb.AppendLine(" }"); + + // Append message + sb.AppendLine(" Message: {"); + foreach (var msgEntry in message) + { + if (msgEntry.Value is byte[]) + { + // Convert byte arrays to hex string + byte[] byteArray = (byte[])msgEntry.Value; + string hexValue = byteArray.ByteArrayToHexStringWithPrefix(); + sb.AppendLine($" {msgEntry.Key}: {hexValue}"); + } + else if (msgEntry.Value is IEnumerable && !(msgEntry.Value is string)) + { + sb.AppendLine($" {msgEntry.Key}: ["); + foreach (var item in (IEnumerable)msgEntry.Value) + { + if (item is byte[]) + { + // Convert byte arrays to hex string + byte[] byteArray = (byte[])item; + string hexValue = byteArray.ByteArrayToHexStringWithPrefix(); + sb.AppendLine($" {hexValue}"); + } + else + { + sb.AppendLine($" {item}"); + } + } + sb.AppendLine(" ]"); + } + else + { + sb.AppendLine($" {msgEntry.Key}: {msgEntry.Value}"); + } + } + sb.AppendLine(" }"); + + // Append payload information if available + if (_payload != null) + { + sb.AppendLine($" Payload: {_payload}"); + } + + sb.AppendLine("}"); + + return sb.ToString(); + } + [Preserve] [JsonConstructor] public TypedDataToSign(Domain domain, Dictionary types, string primaryType, Dictionary message) @@ -242,22 +314,56 @@ public byte[] GetSignPayload() { _types = types.GetKeys(); SortTypes(); + + StringBuilder logBuilder = new StringBuilder(); + logBuilder.Append($"GetSignPayload for TypedDataToSign: {ToString()}\n"); + logBuilder.Append("GetSignPaylod calculations -----\n"); + + logBuilder.Append("Sorted types:"); + foreach (string type in _types) + { + logBuilder.AppendLine($" {type}"); + } + + logBuilder.Append("\n"); + string encodeType = CalculateEncodeType(); + logBuilder.Append($"Encode type: {encodeType}\n"); + byte[] encodeData = CalculateEncodeData(); + logBuilder.Append($"Encode data: {encodeData.ByteArrayToHexStringWithPrefix()}\n"); + string hashedEncodeType = SequenceCoder.KeccakHashASCII(encodeType); + logBuilder.Append($"Hashed encode type: {hashedEncodeType}\n"); + byte[] hashStruct = SequenceCoder.KeccakHash( - ByteArrayExtensions.ConcatenateByteArrays(hashedEncodeType.HexStringToByteArray(), - encodeData)); + ByteArrayExtensions.ConcatenateByteArrays( + hashedEncodeType.HexStringToByteArray(), + encodeData + ) + ); + logBuilder.Append($"Hash struct: {hashStruct.ByteArrayToHexStringWithPrefix()}\n"); + byte[] domainSeparator = domain.GetDomainSeparator(); + logBuilder.Append($"Domain separator: {domainSeparator.ByteArrayToHexStringWithPrefix()}\n"); byte[] signablePayload = ByteArrayExtensions.ConcatenateByteArrays( SequenceCoder.HexStringToByteArray("0x19"), SequenceCoder.HexStringToByteArray("0x01"), domainSeparator, - hashStruct); + hashStruct + ); + logBuilder.Append($"Signable payload: {signablePayload.ByteArrayToHexStringWithPrefix()}\n"); + byte[] hashedMessage = SequenceCoder.KeccakHash(signablePayload); + logBuilder.Append($"Final hashed message: {hashedMessage.ByteArrayToHexStringWithPrefix()}\n"); + + string log = logBuilder.ToString(); + Debug.Log(log); + return hashedMessage; } + private void SortTypes() { From dd28a8d42fc464c9b56e5bd7b0d3e1d45e7b800b Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 5 Jun 2025 08:52:31 -0400 Subject: [PATCH 038/165] Fix how we handle byte[] encoding --- .../SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs | 2 +- .../EcosystemWallet/Primitives/Payload/ConfigUpdate.cs | 3 +-- .../SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs | 3 +-- .../SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs | 2 +- .../EcosystemWallet/Primitives/Payload/Parented.cs | 4 ++++ .../EcosystemWallet/Primitives/Payload/TypedDataToSign.cs | 1 + 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs index 0c94d284..d7bab164 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs @@ -79,7 +79,7 @@ public string Hash() byte[] typeHash = new StaticBytesCoder().Encode(CALL_TYPEHASH); byte[] toHash = new AddressCoder().Encode(to); byte[] valueHash = new NumberCoder().Encode(value); - byte[] dataHash = new StaticBytesCoder().Encode(data); + byte[] dataHash = SequenceCoder.KeccakHash(data); byte[] gasLimitHash = new NumberCoder().Encode(gasLimit); byte[] delegateCallHash = new BooleanCoder().Encode(delegateCall); byte[] onlyFallbackHash = new BooleanCoder().Encode(onlyFallback); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs index 69ce486d..68fc8002 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs @@ -20,8 +20,7 @@ public ConfigUpdate(string imageHash) public override byte[] GetEIP712EncodeData() { - FixedByte bytes = new FixedByte(32, imageHash.HexStringToByteArray()); - byte[] encoded = new FixedBytesCoder().Encode(bytes); + byte[] encoded = SequenceCoder.KeccakHash(imageHash.HexStringToByteArray()); string asHex = encoded.ByteArrayToHexStringWithPrefix(); return encoded; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs index 00a2bae1..8d85fa94 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs @@ -20,8 +20,7 @@ public Digest(string digest) public override byte[] GetEIP712EncodeData() { - FixedByte bytes = new FixedByte(32, digest.HexStringToByteArray()); - byte[] encoded = new FixedBytesCoder().Encode(bytes); + byte[] encoded = SequenceCoder.KeccakHash(digest.HexStringToByteArray()); return encoded; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs index 9ae8235e..2e42b993 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs @@ -20,7 +20,7 @@ public Message(byte[] message) public override byte[] GetEIP712EncodeData() { - byte[] encoded = new BytesCoder().Encode(message); + byte[] encoded = SequenceCoder.KeccakHash(message); return encoded; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs index fff120ee..c28a14e0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs @@ -66,8 +66,12 @@ public byte[] GetEIP712EncodeData() } } + string asHex = parentWalletsEncoded.ByteArrayToHexStringWithPrefix(); + parentWalletsEncoded = SequenceCoder.KeccakHash(parentWalletsEncoded); + asHex = parentWalletsEncoded.ByteArrayToHexStringWithPrefix(); + byte[] encoded = ByteArrayExtensions.ConcatenateByteArrays(payloadEncoded, parentWalletsEncoded); return encoded; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs index 42b66db8..9bb4d4ad 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -344,6 +344,7 @@ public byte[] GetSignPayload() ); logBuilder.Append($"Hash struct: {hashStruct.ByteArrayToHexStringWithPrefix()}\n"); + logBuilder.Append($"Domain {domain.ToString()}"); byte[] domainSeparator = domain.GetDomainSeparator(); logBuilder.Append($"Domain separator: {domainSeparator.ByteArrayToHexStringWithPrefix()}\n"); From 9de346c32b7505c5d4baa05273ea25c922d54dcb Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 5 Jun 2025 09:33:11 -0400 Subject: [PATCH 039/165] Include embedded wallet address when using list sessions --- Assets/SequenceSDK/WaaS/Tests/MockIntentSender.cs | 2 +- .../Sequence/SequenceSDK/EmbeddedWallet/IIntentSender.cs | 2 +- .../Sequence/SequenceSDK/EmbeddedWallet/IntentSender.cs | 8 ++++++-- .../Sequence/SequenceSDK/EmbeddedWallet/SequenceWallet.cs | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Assets/SequenceSDK/WaaS/Tests/MockIntentSender.cs b/Assets/SequenceSDK/WaaS/Tests/MockIntentSender.cs index 67cca0e6..c95b2bf1 100644 --- a/Assets/SequenceSDK/WaaS/Tests/MockIntentSender.cs +++ b/Assets/SequenceSDK/WaaS/Tests/MockIntentSender.cs @@ -46,7 +46,7 @@ public Task PostIntent(string payload, string path) throw new System.NotImplementedException(); } - public Task ListSessions() + public Task ListSessions(Address walletAddress = null) { throw new System.NotImplementedException(); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IIntentSender.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IIntentSender.cs index af279635..bf759bc3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IIntentSender.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IIntentSender.cs @@ -7,7 +7,7 @@ public interface IIntentSender public Task SendIntent(T2 args, IntentType type, uint timeBeforeExpiryInSeconds = 30, uint currentTime = 0); public Task DropSession(string dropSessionId); public Task PostIntent(string payload, string path); - public Task ListSessions(); + public Task ListSessions(Address walletAddress = null); public Task GetTransactionReceipt(SuccessfulTransactionReturn response); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IntentSender.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IntentSender.cs index 00762ea6..d67fa03d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IntentSender.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IntentSender.cs @@ -173,10 +173,14 @@ public async Task PostIntent(string payload, string path) return result; } - public async Task ListSessions() + public async Task ListSessions(Address walletAddress = null) { + if (walletAddress == null) + { + walletAddress = _sessionWallet.GetAddress(); + } Session[] sessions = await SendIntent( - new IntentDataListSessions(_sessionWallet.GetAddress()), IntentType.ListSessions); + new IntentDataListSessions(walletAddress), IntentType.ListSessions); return sessions; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceWallet.cs index a036be79..6b1da6bd 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceWallet.cs @@ -247,7 +247,7 @@ public async Task ListSessions() Session[] results = null; try { - results = await _intentSender.ListSessions(); + results = await _intentSender.ListSessions(GetWalletAddress()); } catch (Exception e) { From 871466dbc7faf88f1201f963af6a372c59263d2f Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 5 Jun 2025 12:47:44 -0400 Subject: [PATCH 040/165] Add additional unit test EIP712 signing and fix how we are EIP712 encoding strings --- .../UnitTests/TypedDataToSignTests.cs | 46 +++++++++++++++++++ .../Primitives/Payload/Domain.cs | 6 +-- .../Primitives/Payload/TypedDataToSign.cs | 2 +- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs index 5afd4e24..25281e9f 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs @@ -181,5 +181,51 @@ public void TestCreateFromCallsPayload() Assert.AreEqual(expected, result); } + + private Address[] _otherAddressArray = new Address[] + { + new Address("0xE86Ff51267fb7a1ff020A04971203a2F57eb5AB0"), + new Address("0x6b45dCf3e824145375aB46Af51334F823837f90C"), + new Address("0x2D459F147b3fb3ea6E07A4af02201f85Aa995aeC"), + new Address("0x66e63215A4994D95930c5D39231D36c23Ab03fC0"), + new Address("0xf1BE39A6AA2279e119A65d15C44456827e48f81a"), + new Address("0xfc9C1687F8CA3e01e4FD1F7a2C07EDFF2f1657c4"), + new Address("0xA3D430FB60a138d1740231bC499df3C89011ddFa"), + new Address("0x2f6B49AaEC1Fa5b04485dA48Dacdd0A2f4786E9b"), + new Address("0x6339f581b1A4bE3878c41b84319b9AEd756bAE7b"), + new Address("0x66067612ABC3ABD2c48b5820cef62727F46016Cd"), + new Address("0xC9A9f3BF19c80ECD30277ac1Be0Ab17dD538dB34"), + new Address("0x6aF6509ADca19EF0F1c2b183C0A12FBde4F1b3f2"), + new Address("0xd51d83Fc620CF678ccE893703E753d693f106403"), + new Address("0x262db8E0F4a2fCbA5fA7199490F1C609ecFCEf1c"), + new Address("0x2205fD44262D7d5ceEAd32F2F7D9E1aBA9c04C9D"), + new Address("0xbE010524b4818Ef8168498fc55813A462DefCaF3"), + new Address("0x5759cD0751fE51e6Bb5232A86b4E0E56e32F20fC"), + new Address("0xd50153fb2144323d989CBBb440670c5A6101dBcE"), + new Address("0x622E3a3dA94079fA0CbF994e06768035e8791527"), + new Address("0x04B8B03dBa0d960415cE5177acCf9D399ED852eb"), + new Address("0xB4cB75bEcC7D6C25a8815D3a31d997105772d12B"), + new Address("0x6aA42b1d0f63dAE3a5bF785101c2D2bF26679463"), + new Address("0x992C74Ff99dAbAacD47dDf171747B927Bb9318E9"), + new Address("0x9fF1939E31843CD8DF1Eb4f9f9B3B4E2688DCDC9"), + new Address("0x9Fe63115bD584E296A71dDAe97087EBb2724C6FD"), + new Address("0x2c99841fB733C81fC049713CF8a5c250c85B92f4"), + new Address("0xD232072F82e45a6DdBe592f3ffe77B3E0D44fd21") + }; + + [Test] + public void TestGetSignedPayload() + { + TypedDataToSign toSign = new TypedDataToSign(new Address("0x4caf9086ccf2e486f331Bde537A559d9Be7D2fc4"), + Chain.LocalChain, + new Parented(_otherAddressArray, + new ConfigUpdate("0x6810c263f45be5dc8e8e6ffd2ab9bd6f152412edb66111b6f56e39a42c694405"))); + + string expected = "0x2c685e56801c1443071309b0faa1ba71991982226f3faba021a6083d2063afdb"; + + string result = toSign.GetSignPayload().ByteArrayToHexStringWithPrefix(); + + Assert.AreEqual(expected, result); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs index bde1ec54..462acf4f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs @@ -83,11 +83,11 @@ public byte[] GetDomainSeparator() string encodeType = "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)"; byte[] typeHash = SequenceCoder.KeccakHashASCII(encodeType).HexStringToByteArray(); - byte[] nameHash = name.EncodeStringAsBytes(); - byte[] versionHash = version.EncodeStringAsBytes(); + byte[] nameHash = SequenceCoder.KeccakHashASCII(name).HexStringToByteArray(); + byte[] versionHash = SequenceCoder.KeccakHashASCII(version).HexStringToByteArray(); byte[] chainIdHash = new NumberCoder().Encode(chainId); byte[] verifyingContractHash = new AddressCoder().Encode(verifyingContract); - byte[] saltHash = salt != null ? new FixedBytesCoder().Encode(salt) : new byte[]{}; + byte[] saltHash = salt != null ? new FixedBytesCoder().Encode(salt) : new FixedBytesCoder().Encode(new byte[32]); byte[] encoded = ByteArrayExtensions.ConcatenateByteArrays(typeHash, nameHash, versionHash, chainIdHash, verifyingContractHash, saltHash); return encoded; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs index 9bb4d4ad..dba0b27b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -344,7 +344,7 @@ public byte[] GetSignPayload() ); logBuilder.Append($"Hash struct: {hashStruct.ByteArrayToHexStringWithPrefix()}\n"); - logBuilder.Append($"Domain {domain.ToString()}"); + logBuilder.Append($"Domain {domain.ToString()}\n"); byte[] domainSeparator = domain.GetDomainSeparator(); logBuilder.Append($"Domain separator: {domainSeparator.ByteArrayToHexStringWithPrefix()}\n"); From d44d3bedfcbe875f2e5edc335e1d143bfb1358d3 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 5 Jun 2025 15:16:29 -0400 Subject: [PATCH 041/165] Get TestGetSignedPayload to pass using nethereum --- .../Sequence-Unity/Plugins/Nethereum.ABI.dll | Bin 0 -> 119296 bytes .../Plugins/Nethereum.ABI.dll.meta | 33 ++ .../Sequence-Unity/Plugins/Nethereum.Hex.dll | Bin 0 -> 13312 bytes .../Plugins/Nethereum.Hex.dll.meta | 33 ++ .../Sequence-Unity/Plugins/Nethereum.RLP.dll | Bin 0 -> 11264 bytes .../Plugins/Nethereum.RLP.dll.meta | 33 ++ .../Sequence-Unity/Plugins/Nethereum.Util.dll | Bin 0 -> 48640 bytes .../Plugins/Nethereum.Util.dll.meta | 33 ++ .../Primitives/Payload/TypedDataToSign.cs | 326 +++++++++++++----- 9 files changed, 375 insertions(+), 83 deletions(-) create mode 100644 Packages/Sequence-Unity/Plugins/Nethereum.ABI.dll create mode 100644 Packages/Sequence-Unity/Plugins/Nethereum.ABI.dll.meta create mode 100644 Packages/Sequence-Unity/Plugins/Nethereum.Hex.dll create mode 100644 Packages/Sequence-Unity/Plugins/Nethereum.Hex.dll.meta create mode 100644 Packages/Sequence-Unity/Plugins/Nethereum.RLP.dll create mode 100644 Packages/Sequence-Unity/Plugins/Nethereum.RLP.dll.meta create mode 100644 Packages/Sequence-Unity/Plugins/Nethereum.Util.dll create mode 100644 Packages/Sequence-Unity/Plugins/Nethereum.Util.dll.meta diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.ABI.dll b/Packages/Sequence-Unity/Plugins/Nethereum.ABI.dll new file mode 100644 index 0000000000000000000000000000000000000000..b35d3fc611cf56d3c414d53b03b7a9e13b9ac108 GIT binary patch literal 119296 zcmd4437izg`9ECKJ<~JOd$7YSGs_{npo`5M3oHr?q8tKphkOc>?g}1w zLevbEO`}lYdhr{P)2skQ-YcZB!2=Umo^wWbc=U9eBc$ za@#2-|M=38Uv4}4$dga@m$e;rY+Gsh$!$wcZks;;fVMCD#~jL$p(*7OXrc@$CPXL}3f;*NSd-^iKn|@%* z#j;A#s!T|-xT91q9SxM$%@p`0@P_`TC^e;{bnHn!7^$m*&LV5mR(#V!$s~FQ?TSC@ zW~rFE;=4*6Q;4XfV5`C3e;ZM&s^E5GbIOC1axL47qw2iDi03M(hOJRBQC}|P+!qBE z^L=EYga)NldbF*&pb^+oW8|R2V3g-; zc%nI`Ho=aAy%8Y0T8MoKG5##1@7)>b_F{HKuZPGMXC%Th1i0<1Nb!(9FZQUT&Tf6a zknoEn`*$O?|5XMXk!OQ{FQVya9Ayldh~;sMFKu=c1t;N;0`OK`8wuUijD@I$Ro9p`O+5;$7S#o&`p;RX<{GJe#zyi_rXjxr4MObaydH6;6jU2LOVRA zJhu-$Q$ih{lJs|_{^Jmo$0Jx7wCKr?Z2A0i2kqHX1E@G`Y#NzsnRbQ-Xf*t&rm91x3q#qH+O1Cs8F;bUBeOq0xd}+B+}U0oV&;plY7k+DoxDGNc0it@1ZZVNp+*q z>2wm=15H=>ZMHQ!5Bh27!?6|ZgN+qa-og z){aOEW2WqIT07(Tdor07_oQ_24NlI@QfD?UqceMg(fO&0&Igy^R!&)k_8Kkyf-z_o zl{URHP`+HMCVZxn5QT*z(cJX`TeOF;6)m4$VUL!dukb?`Haw$CPlcz9*?_U1J0Lg5 z^1cOh$?ZO1PnS*~Qj>fqxK1O8?daf|17A@-VCr7vKV8=2y!Ek91I=*IRtR% z{!B0geysB$$A@Zeu47XpvXvn)H`A^HA}%+mJPS-K?|>2E%N@(|FcvuFb1UXC2uy{H zkrru;KL~uK-_xS(n>pBSAKizR9fP3_-E%2qh#!Rm;=C$lFNcqcxK3dwTYP?Ti0*>R zpn~OaAkTXZ2>gx6ELZv?WU~RfE0LZyM~({glsH?fwar7p@~-3cW16opx4@^O7U^3p z8S;A|SZWbzbuCIn%LJQ(n3P=@Y%hnP!Ns)I%>=d#5VkLat|pFoZ(o`yyU^PY&#XY+ z{)pyK!(?dPQp1s3S(9$7R1kXvQWdkMQOK>IqLo}}8`^Kf0}eeL`4^h3HcmBnO;|&> z#HdgPe!`<63JumkJsccJJ*+_?;5Vh?Ayy_Ft59LlQq&4S*g9IesRCkV70rn1t5S&O z{u;Dx+dCeam?my@r$Hs&Hc-;t#u|7dIv#6ahcx1)D>-?9Y;oC zEo0ID$NeFuFnaUVtdB3Q@#8ifIsPvc|6Fe+yhEUE4@*Gjd>zVT9OA7NLzLgE6ds)# zEgOwk_Zx}ORh&pW%J8`i#95lEm{N6#2M@T0LsZ6{(VHYIJes9PYWTieHAGlT0p)~ z<^Hgi`!;ePD%_-a=$XiobHBrMcFI}~T_eT)t>tLWk>VU{If@!7PP3My0Yr)ut>x%N zkz%K{9NjBY%vsCP93sWx)^Zp+QXFJ0N9iKP{?>9R6)C#bay0Zv^A>L`i$+*Tt0V5T8e^X5ia zcE&po;^>pQPz{*#?nrXfyMS3~Wm_o@N|M4ShCHpTM1W`y5E6kRZ9q_aKB)*LSl$}Z z{z8QQfmDQ4!-F)#Od3A7nMRZ+Rr8`@axMk;Du33Q!$I=CghCW|g^OV}y?+2o+U7@y zY;o?awoOtz^ul}@KGW@CS|edG;M}tnbL2^hd6!c6sCPLZv0_{dlaH16W;sTHg?1Uq zCtn*R0t8gl2#EkeVdN|X1c?Aq3=k4Q{qGC}EyyRW!8|PQtIXcJ0->pYk_{6~=$S-( zZYz)-YnhJ-;5eM?o|*}}yzB#*t!_8Erctr8@|T6tXS@F5qT3v z1cSMK2a**Z-He$Vrahwoyp_!*b7l=AtL7Z3*DzkN{HH`shFXD*0yEU`^8zy@oYlS- z{z{=Qq-<}0F=}(p_Vz;zvnB5qu;#{S!)4;;y{h4OTMY z|CrF1sS@>VQWac=jS;=-odrRphfd`5L8`=kzenZ$h z8Io2}d#EG*4THPNLZ8wfKrj0syKsW1;8|!uPqKAVO?i7*PtK>E_)yoOf-;5FL|MB zD-cuB(x{kuhbuNnJSy*2O;&6xN=#F1O_BA#Vlo!h3xSrMi$&#Ku+WGIjUsPZO?DrB zT`Oige2tWSf;>&oMt8~jiYgC!ffin?wj8~-F6-2FRy3aRPJ?vsW0(ZvsI7(>dzW@a zQQTOepB0VCLcV51k9IUO`M{6)o$-zDK!g<2MQzT9(1N3dU>Q(XKD6T=0ekTbHY@gG zi2yM(Ku83Ly#j!hm|;)4WPs}Q>RDA)hQ9BKs0MWcJH4dN2ZH^LS&0`UobwmuOfvjYx!On zGt6^8c@Bj^+E%Rs?l+@Bh@Yeyb{u6fN#AwLIUhiX){eu0FbMNp@iac6?-6 zs$+-JJXi*M2>YVfCnfaGfEv1CXVS4~+R3Ej`O{KPDt=8mk&0!;9DzNa?80l($yCzc zhzjMVjZ}uO%(NDpkq4q1Cw7vIC8k2iMJ&0^^dReHm zh+9R9hc=w=T}8Ocvzk2UsNf;R8_r5#$8melspUMEoLU+wTH1NFJZs3KrIAvVR%dmy zr4?eRi#&tu!g>_4A(`kHBGsYmA+dFBM5F0gChc@Ru2AAw%DEXw(TyB(}lT&m8_u7zRX{!@t!+-S@aAY@*`i0+`^C&HdRgm@ghK_A0RG0Sht*1Li-RSm-8Ig>;z&JBkiC$#nvsEJpS{~ zKZkpYSKU)n1m0A?0Ytrh*uwz9ig3mP?T`NVb%JKv?~;W`;jw*GoZ|^{BHptWAY0qx znr-e6ws#4jrbtvjv9c)=i&k?E!o(RhB2smv7Tp>faLA#J?e zb+$O;1FT-l7^=&}H33X{xmTAex1s#5-HR@z=MDcvWQ+4yb)Y9j273P(u-4_< zg}TzU3<9$YF)fAKe`N+6N&R=g3};{NJqJf0EMB#4OxX0sOTd3OJ+lNA>{Nqk3Ch}(fVi+R=B&M zx>Y^~W$u{^+p|AMITulImas1072u!grt2&_Zv4xRz+ybns~%B3G|{f#K{~j);5`oO zZZU6X@bk9u=D*Opn_?3{^zKRs?N#{K{)jVh2b#agTmi|?s*XQ@`Z+RFh-DT(( zRzuQ%0Hkyj2PXK8C1v+9+Cka1edeey-O6n^rB;R=yoKVJ630BT07mSn9N@v&hCH+vp&i~rTKH45Ia*b3 z!m}Vm{fEHpMx_W79uN#mvkX}dmQvSsoegaHDOjmK(LW;P@4+-b>Lj)}Pt$go9l1P3 zlW#~C7ACq$(-whcxF1{1vQS8d=rT#wMhuxLiiWApq)9du7gI&VR1-^>;J{juu(eEE z>QY~OS=)+h3m-ylj1#Hywa`z_ZFRj0l$-luSqFJ%JGi|Zz^VK*vrud-$9U{U6Y(0n)C5O zn+4y2*}3O2oz6k0l`$#be`_31i(LoBgFWrZ?Jx_+bVp&WLybhaW8xtKr!obekZlnQ zT_cf8eZp*-4=#O%vA~q-F}j?|;4)*alnSnhO;h9pl ze?25{&oA$0>+(%b2$ltsXy=D|e6hHWD04nNYvQUVxO|$stdXN2#FjVEC9@B1&O=Ol90??-tagyuxVr zu#rvt8_2$W6)E0WXcVo_G<0ELSBc~`eCv~Dj>Zv_rY>&)h1L{jKu}%}^4xWG{9TYG zj`A#U^YaZcNP}6CBfIu8C7}N{6wK?jd>{Q)jubl5ao7Sj62p`W++=nEUU%>UumlaE zxh~rKd2KPCWHD}(Vvs^Fo%c5Y#;fQ8c=?+cO~ebcZM?TYOVONflZb1~!jO8&c)Z%R zQ%M8VDws;tK`xxWTl@xwo;ZdcGaAMVbuooY|nTyl`guSw?IlI#WZK%jBA5UR{;E@-1PW zuq54FCgQmG=e4sZbUMtQl$tsOYT?;{|JdAcxJLP|uR%&uj_a_)7fwua z1dt<_;>+_Xv$&Ubwj(&@=sL>pvmJ&Y=U8nO<%e#EKdI%>wo`^Tl})+h9#;3Tr+%sf9aA#E9RuSO@S^%4B= zgl?p4;caKT{c%yazwD^ncx_Mf?t&2iZUkNL z_34&Vp?2Tyqd6ZH&gwWPL(jqCyoT$%@R3Bg_rA1;sBL>gqm`_-RB<3s}eA4VQRhjW>)~0_ykF)VLV^%IaR-w-D zEfVCQsQep@`SOE!Vv=n7`aK}RDeAu7Tj}dEr0T9MrMQ=+IKudVh6D_X+2MUe&N2O+ zeRyo5c2H^#4N7=D5&l7#KzghcUu4!L(pcI~2+b7fG#N#VYrxh7Ttm_GOY6<{x#Q2=06hL43j5dMH@$@PnL8I?;vY0A;5VdPfF}4^ClRDj5ZW9S<8T zXf{?iiFTXDH={%@fjf0jBh46a^ay3uIdY zw#DkV!%W(X&WO_cE>=}BjdN3VTDDWm^8$IW`h)yQ@g`C>ECbn`BVxHi?TT{hch2&|V08UQ5Z2{SiTiLy zZoS#mX-Gup7}@>&$h*+`v|-ZO+k*-o2RqhO78R7Wym*YhOi*-ao@o9p=G-1IO&2 zks|wNdXizvKdH9-ruYrj0_y@cngS-JeEblOBb6!3V>M-wPtt<5tVL?phM+u_Iu+$X z8^oEQ?;*9UD*Je|f)l)m@Dm7J9PQtTXCa!Y-#pV1M#DZMK#y|#C&~X50;?LW6Xv*< zeIaP|n`0xg^_x{9@LkAWEnTW&1(=)bjH>{n8R~Zj9DsQmiAJ=S{(^p}$9JcH?T634yk}XTejjvN>ChylZiKdk)A9 zUtWcUr?M{rYgH^xpucYp&(xLv4nvrAp+0P*>Pn;QD#T2yt51pGMzplT-8vPkE(M&6(+wT9K^ zLqHFkRpg!lx$rXP{m?1h0kt)gUD(g=Z3ybF9+551Yt{NCMe5gT-x9~nN!Mw$HtS0F zKvY~RvmR3gX*^EpTNU}{#f#-KZ4GV-Yh@eZ+JiN^27E@h6tL)y+7gr$m)gGwQESj>MsIX;*S0N!IdmCaDOD7at0-^GpbaTfKfE5g-l>5E5Bql^#MN zY!MY4FY^|`0@%qq3=gzRTit+ip=GDaJy72*KZp9PD`SbmtuOxoVS~+KHJ0C>t6JA^ zZsMJfq=iOoFgV^~MEw`QhWP1%P7r-0(JyNBNrFxieFV`j5v>n3U`ZCE_$^qZdKpN6 z1r&h&F=D#@O2(7^D~zAXcy5F3iKwBrw}f(zLs0GosU3abC}LIvz_u*P!*}A-@kD2Z z&lP=7w!L$~gcDOM@yKM#>%d(X57J_30H;9D1gTkX=r_kvqlC3=Y$7-~NaptfQ)tuA z=4^9w8H0{f9}iA>BsOs2-HAgDww2M)VRz9%j5EUamLolMz#$oAS3+1m5B!xPTm%4V z`Ob~zp!Sfo+&j@<9~)oaS?lYun5*t9U&^!i%OU+C1v>KvW!`Z=aTAIp#{cFE?&!WI5(~c z7?Si7Q58pN^hiZr<+E(Jc=u*ESwI;^0reKz1(o&Tm7J*FPs`6jOThOXY?Ee1ysq>f z8oc&&p$6$6ETETp^9%7om9`y@OjN#zdEzsC+u$QwTn{G`XG%5dF1G zEHXbh$Xp^o91kIY z<2ScBe=Pj0I}w3za+y*Vr}=@d0GLq9*SZ2=CRGLCE**YBgy{|TSKAPJ>yez|4hu{# z5g@)4AS43B;Q>M->n!hDB*g}hJpCU*7#FJyxDyS+cfF`O0$m+#1848W_q+;9Fwfq# zkMA)~2Lpyv80eJ0jtnqczJ`y4e?1;NcN@5$r)%6#(C7NAsR!sjN1us?rBJ)6^4l1~ zUD)|`r0>Ns8a;h$l;Qm+9Ny0Yp?wu89^6L0X8>ZF-Pz)74mgD7bd%`q$yRWW<=qIq zdYgce7cDLFjUYk$DpDkw9!qSs8anYW)U0Tj-k(qd9+`UskuA~eZX-v< z8O>tyz!?c?gf|;F({qS1(c4WF!WRd^B?82e0YV}`92FoW5_BIBjt&SC0pgedArWx$ zbKq*r{xP7QW61+Mb6&CvPxM-xt$^zMzIKE@ENi~sZ;>-4cF}Im<0SQ1nrSkErij%| zDYpL;2;`87uXKBkV|Dz~misD-LrTpJm`wIHxOuJUCa--nT2v&n z#gMZh$;A2h5n58(Sl41&9+<&g0~GaIsRKrZR>kI2AT%4 z3yhAfL^31|gETH|itpCiCaYKJsP`_o;{GoXa+he`lGZkyV%r;KFHZq(B@X@K?hz8a zUjj}=bGEEUVroAQo4CT=(-?3AlU>-_c4&4%Yuh57gOkXloD2v$J!VU)zIIT6~~ZLVC+*7b-nMQaM2?Q^^P}( z{i+`V*U7{);FY?G_i27hDyDyhreC^UQ)wR-Q`f=I=}N)fgz6i1px=y8_!BnpFuwG_EpW$9-pvY^nN z_4pS&_mX-fgB*~UuogJm{|%JNF3?ZC3JdF5-At^Jx&T<%t;dEbTxytx?hs#~8Avix ztZrsvC-}vQD+{(8uzFu1UxSs|I`Pe#zw>rSmqLSCtwlp}TUy|{rdFKQp%#({UPY>z znA6xs@6I=pS}e;y0cFJqg!g@xSL%o#6%BN7+FS(1LvrMhjL~hg(aqTLi^|y%GpP;R zl7lswE@)uMMG-wG!A_{OFY^)YIT;U(^_eym!O5xD**Y=x#7WgRjE{(^3!n$wvl&m} z^7>ib6cYE*$MbIf7~@Ej#*yX^Fy6B<oM<-V{hUfovuvxIdJjEJYl#D&<=>HATz94I&0*W?Z35!}$;|sb zdEQ4*XwmmO2+{ih7)!z?CEcQ!#B~iH0-H~nNVuEBQx6+E6oik!kr~tMWG*YtbF$S_ zKls8F9S;6CXW=fWKQOxW_@rjsdIB8S9%upTY442S*(gJ84kKK?Xu;-sQymoPb{~V zjNP1QzO5pj>w_N0(!WV>mt8m(vqVuE-mB1`iZ|3K4jYj%WFvgu+1eH~ zDAUhyh5$E^aonM-!v3a}d3gD9yg#!VC+osom*N=47I?{g6h=pd4TIs<1^gD0mZgA3 z^6Wq|UcclMFSjsGOFpXqwj`5HY-KFgS75Os5U+1WRU>e>^tJ?&?cWOQvU^h~9zQ>G z3wf=Z(~K%4cIy(JQ7IvBE-<6QDPVNeo^w_`|^*s6%@r_nDxjM#_-bNl8 zRXKh22~e6IphBB}RyT9eXYWqcTsqYL99;;_bXGiRbu(`*8RJL7j34o&M!~aFj-3oS zr$an!Yo@F0YAkqk&L0@t4@b4_W5_V z2xdy9sx1OkjV)+IGtAUun89wPlqx(XhKImln4!P;U(!K_sBP&`nXSJBSJhKOLG+$r zCu}pEwvp*J=0TAG!Q9e&7p>0bWl0g4b7KO}bWX;XIo9Q0APHZC%gl?PM@l4kp#fo8 zK#&L!%L9Z&fLIYABoaz`T0oEpIALC$i9|x2=sB7o5pb>y5E22RJ3vSTh%*C(L_)H9 z0)j+9*us%zQ14m9FU2PxaBg{j5*9wA{{O&sSY&en$a-^s*m*vEA6Kc+F>wyw@z5x- zeTp_}@%|>YFYCdZjwB>XQlT{kw5SIWlG4c4_kywhxOs#0c~^hk&3$@VKc?(vq}M#W zM5&f#qU~cE$u(4+-(a*=6i=g5MfND6~$oj{|el#wY$c@8C zuPnaTgb?4ViKRnU(|EnEcM@bB(AVauQzosKI+gC2ke(>D+YnERt*y8n^P0gHmtvXv zr)`BT9o@Et@pc?B_MLT5P(DX3Jfd2@o1oKy)aiX$@3VV`av9I*=EF-N$9AmdeZa-J zem$>1JsA7!c8jdk59#^lRpXnK`r} zh2B12UycxA+p>`J!@DqsfDl1Hq%*~l;D`PM732?BZuSFDKwxjQL6kt+*QfWCozK=wXhvCdEdQM&G`~Vl%xMrumbX9;$ z2(EBxCg+5d)c30lMm=n>ltNiCKqpZYx2qSh<6|=)72pqJgU+`mLh9|F2r0g}>zgQ2 z!lRW6Z`$~*Uy{WA9f4T38+uFC&2;Sq$A|%=(D>1f*Gi0)#p8% zL+SL#S+RVB!PO(HbWG%+B=o0g2S=c^pgTnn%Tl$#giTP~Bp!o7vs{M~r{i+^ES<&t)g+VQbVDAgS&xV%f|!<~dhwB8AYL_##D4WtICQ=1R*7E{Q%& zUlQHml!vg%B=u#{S7K`74-O%|M#MlirZhyD78quh2AA~jC10h{nKrjRe5rI9-v{9I zRw^3vCqiB-S{^_|EQak~eC+S|8Gt^#JvNhNc9310L3e1+Y?{j6I|7E;AOoWieT)JD zx8Ei5;y%2-D-$Vv)aS!7b1fGlFcGpaGdbZAZQ2!9IgPf_!@4(DZ_>DWF(%hh&Oq8K znVex(w;B|ghDrp8vjc=gf@vOoDkjm~>q<$vT#M@j{rG(pPJ$1GNSR*q<@f`v@p4b@ z9q=y#zwNbx+&e573fd6a;{2K3{ZJITeHAHk-o=*FSeP-uk2r;T+q;cczZromHC!j( z#@6STCgj^#d=&XOI|0_lH{z+!izSjguu(-iFphjYffexTM{0!%TU@sfxI)t`9z*JC zi!e34E?mO%)Sz9Uz+}-Cc(uvc=f}q3N!q=$-f1 zjLU`Y_yFl{R=60XTBE~YqY6GDJ<;oc(&GNRMk9HMu3G{ty&*Z_L(~Gk(hJ%KJLiOZ zfYU;jb2MVpDB@af8F`GHtEhzZd+{jMZr}AZ5|=U0<2TPSJ%Yva195CyMz91wpGzgY zB9+7R$_+kA+l;Ykn@5|slP!kRimS=*U#pyWFi}pIBE;!^QBK{^Ca&pwj9eT{Zt5=D z$D@+u{xzILukrnJV1(7cy@>yTFXuk^MS#CV{~)!i@9M3K7yC^^#1*;CQs1X(*hz;Z&dt?@#>ncq1!Z z`aKTX$d|`3XtfpKnD&Ir!3hy^)iBRF7qg-zP;&T%PiiWp9cuHgwu!C_AVoKaWGaz% zGwHhg4k^qeu1VLYFr7)&hnhki4pd_n!n4|)Kd+T&rZf3TMAM_`LQ;uP>GGn-cFBSJ zoqQiJ&ezuEJ9L!aw5r2dFKpvh)vzw^U!$wkO&#xJ(r%d}+<|r$9ddK?Dt30d2zYK+ z1`CPIu`GT7@AA&zytfC_@$SF93Gr>8hf4YWTf~uw;Yk@&zU-B{lcyx?n=V_@~)Sde5ZE=%fB8&4sKdrJ6VQZXM+b%md6|X z&6vUaJ3+(c*!~-g`!r@jVnb4o!|lKq$5zH_Ok~1iwTA|uPsfw}tvFU_|D$J)7{S&;? zhSx9DmEPc+$6R#6m2q42mwfo)zhr`&`;ixqfXlpr71R!|#mPxKIz(kMfw>VU7&vQD zie#{s0bAvB$60!1n zsKc;1in^nFm*KWue&gb{>rX^<)|J%tmMoE2vP7bjH(-OO#V5r#dQNZUYKyuOuQA5_kVUNVbA`y}VPlwR&J=_>D|6MhP#*vmMo zxRp24%9{%=cMx@s5{FUm$mr3KAC}Z(M>LU&ifZw&Y8*t&;lejIHz&98;arV&3Go;D zTRwaeYO;WPk>Lq+oeUEct9GS=c2KeslYrx8P-Z-+$nR^5F&3D0bc?>nkuPf0;@_Y5iwh#3zt#rtrP1NIQ$p3Jou4svB*O6tj+ z^jZB$E5CTDnS_}&p-y$+8hz&j*WYe^Ko5WPv7GN6&2q}vhjkTB-#J6>fEUL+br7_{ zmmNvJg=(>j^GA5FY9ICXB8J0P;K4gza&Vp&_u*Lh4I|3z0ui@na9PpP3pN-w@s7+9 zOe8ljLdlp4>sGb^EB%Xuu9%M5pz{T@kcW2&fMr;39UPUesXG=%%WA*OPX$)Z#=9S@|*fq}xv0F(n5S-E+T-+JMj;45%ut!}yz19g20*H_SQ^)b%9$QyjvwR4NFpiMPw$?Q{UQyl$`(R8l)(Pj|{DpeTG?yE~8yIvn@gemaO_*$g(V{B~TkK-g3(bTbQZ+oC9NIU;uf+mEp!IjigA9 zM)LZxHW=O|g7JP`fRG3fUkMNr0pijCArT-h3lI_srU=;M(Z40a9|!8e%un`sVmu?F zhNHare&aS!iaTIEHaem?ACtkPG#={d<2X}MvX!mPvj6Pbt@Tc(wORJOvDteXs*G1& zVpoA@0QaLY@%P1K;?u&`W^=#~SFnpLOis)JKRYbFqk4Z|?n=7~@HnPhOxc_8%5Sds zBL;UmV@Fhq9rX@J=`bN$%!j`4=&LjW40c6eFo^&G&#Yf2C4$>Bv25@qr1OqKkXwV_ zmcUc*dt!40OC84&FR>FCyL=Oxlhz}cGMO|xVWzpkN8fgFC7>LG*WWGBZZU;rNOc_Q zB8FX3ev3J@bSTV^m>kTDNf^4>Qs2v@hgt`_b8muK&xE2Px-MQhUtcB3F_il9bf_S| zg*GyozzQfblp_@8cTD6=mHdhce{v+a^e`Ihe3i!o_T>zHCh%~n_$(A2Ji8$2;|<0g zRS!~jfhJ->G$ukZ;>N;PnZ&I)kM!e5{UoWZ7Ioff&cq!L8*rYk4HkT-vuEGmiovZ} znj>cOXUrV_hMGG9b>Mi%LvB=lGAE|5O*FJ^CJ0?s!sbx9szl~@>!Azu`F~p^e3iLQtcqIwBT0}PiGyNO$ibv~=V1v(OX@=t%kz;`yc7c+Lfvw~q3 z3r&CHLem@&+EW>N@WS`Jz9doZ6Utn}xemwqZ{tb37$w`GHST)R zyLO$H;W-?p4w>K9}LT-rDb!&62QvSY}ENGR5 z>+WrVo7&2CZzrRUO|t{EqldS;sf9Lo0oxLU;5%;DG^$ml5ejJhkqmbwjsY9q zj;bC~4vTwZ@@H2mT0^)%dFvX1-lQ>OOul;H-th~W@?`H_q{l_%IHx)fx@6a$ipuc! zL6qP7$XIFjTn&|tK5L-O7oQ*CY!%a1J15SC5Rn}_IJ)V8pxQ-!UUqZYCB(s+Eb6&Nn@!r|ng5mDwrXi;QFCsBs0sLzP8ri7yXStAmB+^QM&!; z9HN`%Z=LosrX?O^yzBH8eJRPrgABjcmwY+N#Dm;YLoROZj%kOBn1GzQ+Lx49G5myH zQm)tEJNG}q#BcApknJg{#!FHW=j^nv1NyQ;Gu`i5@hF0fCE7hqRfFFbX1 zptuJ^9gc&yl%-2O%l6o1R#PM0yQjj=2D<<@ z^YG$YH6V04Uc=q%wKKGPB!ai=>jH#CfVe(DNCXJ9F#Y~55g={|5E236#sDFaITo*H zcY8=RH3*&!0gpt0xG6wLB&cf;Fn84XNd$t9cLWHDggEaE2oeG3T>(NO;QSHm8-%+9fhi2#Emkcz}=y5KjaMi2$)NKu9E{;FAGCBH(-~Ku83LrvrpU zLP@_L5F`T5X99#ofOs}QNFxqu)Ma6TU(Bm%?_0)#|>cp*SY1byUi_7PI6eFUCg z*PKL<=%oN55g=X;5E236hXFz&K)ezlBm%^y03neLCSwY;%12NKGMXq^s_OhGNGXv} z@m~!H5nTX1c`w2rvXAD0Vgb&#^k$aF^XVR z9*1wO0olCzg+Cao8L+S)VjyJuOEiNFFNWjUASA-Io*wANKg*ks<)MOY7f!Xj8HmbF zL&g5s{ubyAqV`3Qv%LNA(5uKP?@_oav!d)hi+G_EDahcH;uDqemclx`BN*SzgR-^A zE#*Uq$GXykm{W1})?JBx`~8_u#y^0Ms6UGj+uxgym_LUP-1D#xp1ErJx5Md~*%wNG zawY$*(pTmTu-?r=W~P>jma=Hg5IcIlm`fM|7%5!zaY-u|PPK;! z{z*t6=S`@?m#M>NMh6_>fDR1hXO03LSnqNF%SHzcu@#68Td2dy)B&Qj4k7?!33U)| zx$X)&R0uxK(p7ahnL2!KbjXVi4CVKi0v*^QmC@D7}FhQh081ENtgPZ_8T= z%?gd>i}0|#b6ASagUeqP=rVyC>Po+cON*CJgPfIU0XzrGznykc4Xt=p-eUQugM=IA zN;?n2R^xoA&7VZd6F38u;$U;oLn!r@+{Y~xTvW&3h1Rb`7nPTx<>1Dv(kQ0n=KZo5 z*HF)f9{f>5(+8*N?3LZ;go0h#JxC|lO#~Nc^%d7kap-_-%se}BHRPSbIz(Yye8G() zbjZ3se*(@eR1QWou-^(stSfNiefHaF)ut@24(Bzk(ibJ-deLJAxibP~ndz1yG_13`t za?{)P+S}JqXwtq%4f?djtHhpz@w*(WP?l}Ao%#Q!-5$U$EbxE1R=RaV?481s6_%3)z^sUK8Wag$)oI}@A@TXWfiO*@o){NTHuG43j69{61Ah5&tIRdtC8*wXB3c-h!iN$A#}2~p#)&IN6LtrT!B3d9 zU>20c;ZB?>U$>-XY=8VvkIakWmBhHv*@>Gg-YUQ0DTf8p{O)NyMD9NXYWA|V*QZ>3 z@8q9_c+*-;7*i)l5ti=#6FQ>bWpiQrPeus6*FTC|9`ZuOo$$!>QwI^c6C31PEVKJNa{d2=Ik&stvrIo5{_zH_hPOb_Cl#VshT!yA~N>4|=A( z!@|Mi;&yA(!tAbcoipFf_JE;RvOe0t?&f#IkGZ18>Jx)IS`w{|9e5{~^gRB34hVS* z*PQw1B3Ary=@Qg{KDfoYwRzrE;pNf%ZcBc)mer6P)KQll+%YlP+R!mJKi2loLvlH$ zhgq?RstbuS8P+@aiG?+_Io=y$qwYr_KMawne0m#lbmoIQ-qR7+$#ytSONX217U4BC z37%K$r8?uQVBqtK!o1!Vdtq%URlWcyta*JEX2bPNarrStIZ9ve z;KlkIkmX+pmTi6(hQ6TZRt>7XGx+Yzmb;&ND|Hdb#`nBeAQKUL1H}#pWW>H#d(av7 z2;{aE1G)OQInS!pi|tiNP6a zOI?V(S0N93`A{gqUwso}h#_!g9ZM`oM!f53cAVrv9z(~*ZGL*4H*jlmEVjfj!_+?j zX|O|x#8fh`cYI53EAMAudY6~yOovcuPfiv9 z@9_eWwLBf=?^2(C_R+^=`Z#HyhG{Uw7@AEOP~Yr>7-r2FUm>AN%1XALp{XoTDxd(#vy2-7?2 zA9KWER%1rf5`M_Ml6~@$;zIlj%(J8XDtYR+#nVy#F=>spG!H}GHZ$)iU&(sCDqOF} z=__q*57UCYzSkDNl1KrE+y2#f@?c{or?2sqYDW=?*KIj4s`kh2s2j|1QssA`7T41< z(9Dv%X|YiDE|7Amt%tc)bqf^vTm%DI-DH+14^(3Rz5GiSE*mb~a9p@`4b^AlGjbs{ zzm|~SLcn(vh9{SiRawJiAhaKVF`l8Ok5v5%2&>FYTrP*NY9=oau}UjrZA z;L;jixTfwP=0 z#X&-}(oAlV?cV_OrXloi)$upbO!^9RRcF&j`g0-Ml0|a;tJCwWZZ4d=wm%OP-b8sL zgca-h+gk?gixEAUPXV_9IPWF|a(%%nY{%hX8(zht-fe8V zVJw#&Jxn-jv0MoBZY6fw0duBB6eer~(X)ZFoaWu+x2ACIQ1)Fr>fZ)CtZ?0C=t>ig)uO~CEA*Fm%4s@3a&FUYxNQmo{cBvK8^oJf)5Lx zk{0Z;w*b}n4v4>GQJ2V3-x$%ho1?z7Gs8l50>KX)5kcB_+8LHdyqR;!+gjcsS)ug=+EjsFGkKw}j=?#wha7V_U zbQm8q?yiZB`hGigI50u{ojXjP>L_2R$2f-;UG?hBJvtrr+GtYm-n$LdL7g9Wxa!5? z9-W7%Eb7EjH-OVoXLtT#uA>qYDB(Lh5OZRJxqKV)UG?7Hl=Jg3)N20dk2@OGiG_~} zj(TW1IX`M=_^9al#2iX^rXMl+qF3jrdE*%_6={b`xBz8w)ji&>V_fx02g5gZX4tmx z9-WP9K>VXUT{V5gu47=~eA`r49XX!VQ#u*GE%9j*zF#C}-Z1L+g6MqL4xNbiI1CTX zQ-`%hhCd%g9j+L|_?kHk*NaX5G>Y-d;|#Aw*k8RlB{l_Cm9lJ-@E2m+cP0Fpgl|gt z2g&hi3C}4|g40e551+tzVG3>aPqEl}692u#XU}83l*Uo#N+8E{xXF%azH2LpOh!{65($eMXd^*3{Rd) z>VTAISFIXq7TPa7LQ#daAkduQ&m`;7az-mjydUSO!uCf&UA77atG5r0-5zHsU`{ZlB7#wW=z_rlFn6A1R6H>ndHWZ ztELIG9GoriCUXTkZ5n0PlxqY!*g)3_w6lS35NNuAZW3K)PNB>Wb&JUC7_Xs61)4be(OeJCgZ@yU74sj> z%~KQAs{&0MM`$u`;Gmx8P9QWz{aPSvmq&B=;hy6U1iEV1M{^qi{Yjw2NOI1=4Z2KM z9z|%D`j}0w*>T`kqFqY6<6%)UFj!2oSvJuv_Gm+`$svU$j5cv^m6WTLV2<@## z3+?f_8XBY1O(is6bqVbr$RspPXxB-){qXKj%@%?7627&XE6|a`xu2S+(}`X7$Bi}Q z?40n-qTrQ>+xeMEPXantph+H~gVo6bH4ANlS}D+6p&hC&jNC{mbE;{SI-%`rXc{_O@;g+0MQ9TyQs!am>r&cdMe8Hf4FX+j zpc{oVDw-Xkz9~@e$O~bm#p-T>cHj5H+{5?|^#Or4@3MH>JbcmjNMtqi?AVpiaq2Ol zeNSk|siy>5D$w!j8G$AX=Lzb0fnFBc67`ZmO`x?!ma0tx{aI)yVKk;CdH`|vZnMxl z;q=wJ0^KQ`CH0|_VZVP zKHjSbzmC+SJ{RbKT}bOymKA|6sWF6Bs}_OonosB)wSz#8SE-UfuL*RuI$faC1-eG{NPY)TnT^`KR-G-h?}Bz| zP>f!>%)+Bem+0u5~^bgOzEt+LJ0_v)*@wlzF)EuAe~D zh7fvAWdu4{(!Ho!1)6{y=BXd4fnLN-eNi58nf%@Eb+E8Lvq_Gyk5Bd4SFk=y&5Z zbf!Q*Fwn&UT{!-pj?dKZ)D;5xfaU?Z&bEg&srgt>C$vGJr45AMS2u^CkJRn9jn-Oc zk@iP*SBUl}b&o(ZMan1Yfe`JV>d_GNsrsHs`JqTrk*7kmNaXt=C>eP<1l31=6oMKf zuM4!h9Ubu2s9@_+K|X^h110>ejfJ!-WLex zT>!O4J_@C4i~LcbT_nHZk&i>Pog$w|Ivhtpx}78c5NL*!Z)D_O0^yK8Xt~H|0<}pF z`N-#}herl{sX3xv9dK0hF!g-u6E~vP_dgz(V)Kazk4hikJWicm_lY}B-GOkJI<5I+ zaOQS771Ywe6^K8%YqyDK)Xm9N%^7utgl9|m5JH{GR$tDYY&auoOUnwxuV^_J;pWVR z2-gi3DmZWlW-U zkRXzi&5r`}ugnt&&mQnBLd~i1x}9je4i{%%M7~ON2!|!qet@sv@%T#ouCcEp?)PJf zO1U=?KS4Mfgh!X<+Fjm4zE6uiP3{9&iffyG0lW^kN7eY`px;CCw}u?kZ;VI@dR|p8|iD)c%ZAVn9TFH_LF>4E4D| zv??~Q0#9>_;Ys}&-YI3AEA@3GdXVl}!wmlTv5f=E6pObhaQ zXV4A^3)$fa|DG)()I2ZrqYlqCcLH-x(|CkSn-Hwpf& zW@6^Ftbl~9^ro*$?^rK=^8vv;-$E;mY2o_ZIntYS>5gkz1p=v+3zNV`!?N*@TXJnLYN)=Ai_C=pGLTH@Q()Ux9W~D?DaE}uVJm`MEeK$HQE`; zcLp&29>T|C9}OVpuZR~S?+tKN*Z8~Ob!R011x%Yop1(#vLilu?@zWEUzZlJ^L#-VV z4vx)4_`5jc*Cl2~nO0>om_cgJ7~-2EF2egF%?N)I9hz~}59fLrau$W!iSSVC2hebE zY!c$PNqqm7 zME62?WBmA}qaN9933T|;-p@8uW(ldB#Ayh>E8#f%JjA~dJ5S_0^%-?>0C8yxaOP&s7@^tXtnyw?$2cE)lYZSv=xmHWg65! z3^ZrQO_@gJ?4)VwaX-!UQ)vTv)8EN7sWtN=QbhwL^6zB&tBD$FDNKmqMC!B( z)C6chfzD05(fL89SuHfsuR8w>=qLm2w#(l$1JqIj?X}AmKxKiRP0koPA2)Dy8|W_r zonxS`+zLCR&Nt9Vfi4y3O7(VYESpg!F4n_lHx8-GX4UEnl+F%RmsX%b*}>}i3bZLR zMBQbehlUKx?w}qu&?}9@vP0GL2D+zhaimrK*gz*Yj0W_sK+mcf`T2l;XJ}6~)@57O z-zw0c>@cj0YR#T%+>{xv(i(yVch2spMpmG5V>{ORgfsC>Ye#lxwYPzO)H)W>K?Zu? zTj6->O9uLjmyLVsIDwu`&@Lm@QcaUO8mZPA&LzV;vLn^k40Oiuv4E}@=v;6%VMR;- zJsW!qW#H*3{yiJ}7c5a!_X#I$Jt5nnJ``xRdUSXbe*bLn&cZ3Vk5)qkS|hoSR#OGK ztmWPble44MAvK(bRydo~Xtgp#8>7yy(DuxZQFm0J2+qj9Y&h8_#;Q#hseRhM z1lmRev8KD!b2^<^aH9HH(-LgEyQ$>jk<@9oKJ`y{G!NKv$~WMlQ)tSFamrBp|Gz8E62YnK;?N(q5*9?(Jvy zQh9-{R5NqSva{4oLtC6X)|#!BXh_<`9CedGT9-NM7Xm#i7M!aRST{r)6bsH(Lo_57 zoU29~h!&iuP8Vpk+CSHXU-kH|K-z-y)n?5pQs%2)Xqs4XzWTjD=SmBiuRhi^H4FCK zSM5+_?pn%zYKn%?UIu0NQ~Ok)O_}}GF#>5l4^XcQbfr4J^Nj2PYEp+tNetX`cJ@Fu z-9W`X=L4FjA?Ygzse=q{|Eay%gVdJ{w0P>dfQ~cJ4<=lk#hRUg-kfkLpwkR==8P+| zhp4j*bpDL>fG#l5gL~eTU7#*C(8fJ)2XwWDB=?2t#tPJgdyc4*;p@EqD5$bXSG55vlSpzZm#p+W7*^^h;i`BuSMKkE~P zPaDVw?Kt(KfzAc(IQ6=LsP*wGIi_l};~B-@v$3wi_p(*!lab}dD)iyVr?N{lBRCH! zJeOTsfyh~f$azwQ<`rJbez^jXvkH;Zuh9NF?MK;DDiArV5IIX~ifDbMO1nSHmKCr0 zQR+&y`yRi{E?4hXp!c(LfXgKGt?>r?YPH3v)!tGY>>`v=}}V*bbtNNvS+Dd z4K!$0|CZINY@o4#&QTW|==(EUTh3Eg8z?es=a%!;tp+-C<}NK4ss{~pPW_~oi`CNx zx)#~nKx8*W5$v|^P9nkVsb)10?1N1eu%s@Yyy{P3Xb+&;X z>pHUKYIUhV^cp9$T&sRiflh6?LH$HS3AUb_)MkNJC-xcIq;68bHM9>}=SRM&{%B}_ zX>G!4;@=I8^Maf4o=iPgCpa&-StSKplXz{{74|JEWoU2j8pFQHAVaf;&5zuwh8tQM zYiGBryrH#XjJr*ZHPEQG(_3y+lMHloztNG~)pP^h-){g`FXtKPN%XNh)IkERPW)u2 zCUu88+|YVazB|=%2D%L8yHoLIVeL(OTkcYq8XC2}Uwz#`EZ_a=1_N=XbHBPxpexnp z{Dm#|s}~IIhI#WN52#lS^zC^~>H+n012s*bA9+yy%0NS=H>n5JhX&dQ)_q9*#XyI{ zx(}((4D=Faa^F$0aiVA9$N47p9o1-{c|+z$9#)trundVsLz=Jx+omCP!91*qsgpD$ z-t-Z*Od#}*X_vP=qAoPhF4Jb&kE$C4x=ek&bD{lR^?;!rKjf;G$JFNn=`rVV6(7(1 z^z7+zHC>=JYTooc?Z;JFpw;Ssa(miOs7nkjGG|YFqk7mtBLF?Aer}-Mr(Ya-O8r(t zqUY1RHUR(o_w`PB3O4|{JOUqz9<4_8$uAuCDP0$Iqymas_xk)4DjB!Pq= z1Q11&OLBoLAqmM1n_D7?BDf2RYfzjK#ZeshH3;H3jw6oyHikh_6c=1(TyT7!bE>*; zCpXS_zQ6bV{rBec$PQ(6@ zRwiE)yAAs?El#{99yE+v$m`+>!)Px2y4bH7r|^b&$=JR?{k8HE!yJzHcouG@7p5Nuxlp1+4o&B-eDj2{Xjf~y%5^- z`@ZdB>lDpqo+A1k5jPoj-}r9*J{ETy)_Yd>exHb^4Qm{q)bE)1o5M2ueJ&0gmOks0 zeqV?b+J1_>q|e&j_iHiSVSD?2BW^V8qVaqCelK=8Y-+zBME7Yr+>Y@x`u!{h86vbxJ!hvivu@_fxW&Um?z*>-W$)aCu+<@FA0 z=+{#Y%%eE35xIF6^y@80SkHt+dA`H8^h=g=3UtoCn!LSV zs;qNZYrhP+(Xit)@9Q^6oMQyw?$$BaY$hRd`f+w<*y zBV~?Zw?}`}?-Y51!@lj8E$=q0ewIueBWq^raP_m|6Hk?wG218>6r?4dCR>?p7v~mc zCQgtaY0vPJ<3=VA}P*ep&Vyt!y~*ksw=uq{Oi z-6qQf&A8;J$TVi#Mb@whiBn{K35B~xOc+*>I8E*;)$C8hOA>SCmxhh$zaX(dM$abO zb}_oFBC$x0D$|}NW%Y^0@^xn0#b0MvB+isS%+a=Ev+EN}((a*ts{r`(ZPF5frolT+_WTp-6U z(4Ie>`bgqJdA(r^r|wTYLzXPmHZkQ;;+Zn}3}V~G8Kd7$TrBr6J17#$GgPA_tWpcb`qB~MwCeL)(Cy73}lG#B?IjfOZ8+O;guM=x!-?J#rgVHzfUx{^c z7qd;_Q&P%gz1(A1SqgqUR6cCj^HF7Tm3-Q;H=^RiDtS;dob4}(4f0dX#9NV}Nlo(l z#at5NtjL(8)w0d70g=6u*2w&`wJkO(DQT^2Hmq?2!1h82S%T2mSo?+P0^rEC@xx`_m zU@INAE}=!PWkw|*CoYy3JM4jk4f00KI4_sTR>LSSm&o0Q(VfjExz{kdv)Lq{U`F|z zmvpIo$zf-Lz2mSYNtel^hV>gzl(boX?XXg?pB=U?;c^*P$z{fQ*&@3$({s!%GQrrI z(<|jxnQCm;rmyY0Rc0F7F3c6LkfV(4kC-c7Atz`X&OK3FDa#xdC$5&~ILw!Hjr234 zGpbLzPF~`$HDK2{?4qRWWvgMUQ1aX4Jq{}cd)Q&?61K}WC)}o_8{}J#tqANeGkrbW zAdhumCpxenJ22@H_@i)FAeMd(yFTeAneDJ!l5Ug54$DipLzZjCed{i{*f5&K?vg&k zXm-C#t~QM4^Kye>G&9~Muhxv)^)7j*vE>cfm9$IVYuK4X?g4wqumKbICfy~UGHm3; z$HAUAEOhj9NxzdX8`fv^pTOSKO!S)iO49G;NoL!{qKU7AtzAOrzFqt<>GSa2@&m(G z4f#C$9vNMwZH*HTC*3P|Fw<@RUU|1>+_Lt_2MnWDzDGW8!u85LmUN%|v%|gyd)r|@ zB>h2tY*fhbKiOKP;DM#<4si z&+WjPndw!yM`W~@&OxujJu254Mk{oW$%kCF$0hmEegC^NdnG^Nuqm;A-)mfM(7dIOUGDj#u}#Ivgd%yjC9>?s__*XZ z46Dy7OMc&}BPyj297bo09bvq9LiwDZ{GlAkOrPIjIcinl{Qe;yGK|jeh#cR*>2Xbe zBukj-Gx|tgZWyKTvAmzz!HCcqW%8(e)Uc!(acB!|%yg}MBL8G;)JuIL4;e;R@h9>f z!%iJpCO?&j4a*%FCq9**8MZHGaq=??3_DhMapc$Xa+l``c`dW;;pZ0DC7+Nx zv`w6dY65%6VH=abm9IPO-iUw7uN`((^1o!XpKDt5jBZN)QI2xh4aq;tIfk8xx*_?b ztTgPWS-X;dk>O1`+;`(|NdC9H%&>~WJ;}eyJ%&w7dn{S0Ck%UYd|PsedYxH|s3`nP za;RFqnqs*|)TSLt4p)8GXf|u|H_4IeQ^O8rEV80i^jflAC(cPLvSL&#GpxEtN2hdG z51mK0O+rQwOo>;~7ck?t+e=}yF8=gNMlUr^+ju1DrKTE2b=yl78b;%0Z&hX(t%LPe zXK2Q8_EDA0wqyNtY)T(>wav=%QxeqH3pqW}IHf$LpZc1auG>WQgJ$6i(X#MP%|)Eg z@M@%RIVRi(qn4)hS4D<>JE{ikbi;OK zHKwGhMTR|;wGOPB*>(|{(wvf}np-Gm+eK{u%Tv-77CjBSK4pL^W2Vn&kXp!0m+l}{ zrETFoM-G#N)C$A;kK85(DZggo)2R}BJ})(FbjqzMgVi>}T4JRbqVCd+&vuBqPqXmT zChtlaq8>IZck*7aXAEn_YIdeNXxIY-;zXu;#jr1upH0b9ZyEMu@?Y|8#?$}lB2>XO)${YJ`g73;9WDI-*0!-htGm2!&8zeIZu zjs77eTb*v$8QF(ZMyndbRw2%@Dtr@pULy`<{hD&By8cqlZp@AEKVF@GnPwME9n^n< zI%L?kNxA(etDG%l+b*`BGOzzM^(?bZ;oHWQ$!Y2Z!)_lJC#I=GhTSu|Oy;P!4SQsC z9QM#2Hte&^bNc71V}^Z~S(couzA-E_`JDdK)lY_vPA*HHuB@$;`lj&PQ_tz2r=kqo zlUkOXr+R6|C77?0JFrpA4)T-Ge6`UqdZIZ)9X5=feHN)N45MeCMXKi&oF3wwpIofQ zY8IY==bN+CWM&(~(}sp(A8>(T^whaTl^RA*olDdLW;*p!wN%@Xm#Y3{>M~=a)aR=E z45QTNs;8J8kef5A`p;8sS5jVDL}+nM{{?EyRmAjq$Rbt3?0~!jo@c4=m~9syXRPUe zj;g+zJU8)E#0oX=8e#_pox4XJVWzLDD)mpzkh72bRH$Q<$Ae#o0*Q&r+zRtip8hyzAg~U3iY626w6B0W*Eh?QVqDCJX=IEc45@2Y0N0j zP*JDmFw^B(ul`{eol%22ZWzVsS3ej=ar#xmHi}c{tVvzQOvlos;ie;Vph}m{AJmSLs>(!7ODBO0uaCc$<^V9@pl){*V^Hn}Gox%m`LdVuyT%@jW zm=w+GMwe%^>b8U8+$4sLyQKfcYLvs??z2HXY}lVOxAfnr_8ay_<~983Z5ACz1Kl1FEaGi@KCTw#U z)#i2=JJjb!7fVdo;V`PBn;b?tyGixtoE?=rlRxZpv&v-`p0Y;sL4@)otxbq=?w zC$%T8fDik$ssqMGDeP2-45Jiws()%v?rrYqka~bo3U@j-I-|SPzd77dNqb{{uln3V zC9w%tW6y-U)d*&k>qC9+Q3Vd`nQ*UK?6Aay`f5(LC}2b*EuItcvYb_Zqeut73cALx!C(?#2EOs;3O| zj(Y{{dBe_}^=AJ+s+VostoOm*G%RP*k^T>hQD zA2j3AeMCjw%B94)enj;&jB@>mN;d4*a6HRW0}YFbz_TnhLNku#F?Fi3B@B;9eN0U; zEOmG+*bKw&jp>v6xSDO)BQeQf3k|z2W{I_V zjAGfResy_1r@Gyy>xev`Q?Z7T=X0vBW*p~!m1bI?J$23(f_rHtcbf*$b-1u;-HSj-qNZ z?3IaYQvakbFzmgF8^AUh7C-sw)ECv2h7Fv23)l^YrD8_?XLY+_S(s7(S>0{esUufg zFR2F%%N-diUQ&;1#wGC=wa?hTPZ=fuqFyvi_3w>$l>cVf1>;7^m({z5Z64Pf@75eK z?7q`R$-k=44cm8GZ}C_4onaNzM#)#yNyAo6>n&bUp||Tgsv0y(9#S!eH4f@64yitd zb%*U$)!(o_u)V5=7}gWNzWg_JieXvfd*jWX@rEUh7$sj*Ife}w(ObNxiVeGC+V0fX z)#--qopwLinVNA)yrGsD+mfhJ@(p#aVXLBgi#JrGVcYSv`c3|1I(p3T-{WcZn`)!6 zU5Q;SZ>g<@?ZU2>x70SxIEA;>t;RMRPx#+fcNumjp76h|{$SX_+||}Q>Jh_U$qg0n zsAmnkeA*+a@2VFJ+dl0nutS=03h$}6jcs*tnS4*R8+LJVoOn+iGmLtv_tgo*sF!+Q z{bbnd)Apx+pj4}_qYtLN1Quo3=s{)j@2aO^QwPO~zpG@;IQ0+JDaKZcp8Z30nqiC4 zM}DYs3>$(J+EtNZ~Gc{Z@K8MfMSY!J~E>?KdWW&DC#R`uqFl^Jv zQS!JdHSDI5y~T00Kr@cz3w2Hhwu;$N`FTmVv@g^}F58#tT9@rh)#|c+r5Xv1jF z$+xPPVYKJuTa{wizL@T5->E@{y&TgAY@}hAN2aEIuf`d6Q{+IfX@(t%9-8(~RcP4P z(WAiTXeRbW_7?wA?=aggrpBC>_JitoC*^FrI2lot_KRBNu!U*LYGS76e3o?qvzG9G zmY$PlS(g}=JbNYBm4;29eL-4?wcRl9?5$w88+O_3Thc8} z%sOdU&&UI5;nu)il(VC9Z}fq*D67P<*^w`&b+`P6si-&8;;owv>lyiBS}$v_<9RHt zxAlVK`E6PstDV^<@qBiiNU%;i?3c8@R@z;Z9@!$(Q>=VuN9FU`{n9h6_YK<{{bAYw zE97_D^PiDv=>x6H44WP~IDL>6{d;W-i5#9j*t%LXZl6Oeve2BJ;tVi4qfEy(JMviC zFo)6k4R^6`(@t?1l@dOUW#XiBALB48v#~DrVcKa9qp}`v9pId87xzStPM>J?x|^c8 zMqH6yWKFWlndy3;Y%SIddtJt-Pqvy3J6N2bKE*m@SV-QS^r_ZmyD64UV)^*9(x+KZ zF>4WV1<(oeSz80L?BCB57V*{eMVM81{2(0bgk zEt8wm&$K=@?5)TT)6cS|{*gU7^~KfyE8&FmRe&UqV!tCzcWKKmRYwm)3v$W zx?3|by)-&wxfSxTK8KG=QZjtjV#EG6BQxV%tIe>NMvTo^VassTv-I|oK(z@NS7eaG0YOOu4aCO#Wu5fi$oADec zCuP)Ge{$LCtwY8(A!JfUz4a+GozGR)cP`IW)=A@;r6y&pvO*rE^V=YP4av=Du%Zq7 zOSefGjaGtTE#bKtek+xkjG+8qYn-V%FWVKap*okiALe^O4 z8uq*JIU#GUwaj#!>#U8;be!v~t;X|Zk(;s3y58lv-fDGuuD9+sp6|%QjP=%IhCLx? zXPjppF|0l0jEoDc?_J?8w0<$RMIjX#7h1`WQAy~$Tx4Z3(|Nhb8pUjb_(m?xxX2oB zShadzG+PCR4GdkG(PEVvwimXGtuqZfE7YH{!CGe69&234Mr*xcAE1;ju`Xk#Q{QA= z&rGMj$-2dOMxrD(S-T9oB;;R-ms)#V;V!ctbA`LiYBQdT5biSTPcF~R*6S|M&DQ(I zbD$U(vf28`u$^F+TmN!}+hSRdQz_}3ZLy-5Z4is)(1v7{57k+-m)z)){ zJr8z`^^##Z)}y2$0Z!@AUXUW%^w^$z; zTV}}J8Mjz-pQP0F+1_fM$!voN4Y@z#R%^M-cAHgiY~NZBXWV98=(62zZ8EmMTTf=t z_p_vEoJx3-(JhzHBE3ef|1GNyt8qbh3iVrfRVrEIhX(Mq{9l?e z1G&;?-7){#s^ec(V3(&|KEde*Yuqse(o*6rj?L{)RwYgr#l=}-32LNc&AL6q*i&mr z#zzYOk2Ie}a*6{fhFG*uB_@yiZ{_i)1^jh9e~qTF<2X*Y{I*N)jUk^E>=P_gy(^*h z?s(k!bj#Yu?LUyuB{hoT(XviU%O?iJ#VK)BDwS}|xVX3waawv@T&Vb*L+R8>Z$VG_ zbeH*mFUOz^m7wdz;uu1NCxyQ2cflx%^NV3*twnuV;>!I0Ih7le$w%YgN^Mz*4U=ry zwz@sFJi0JYp1PDSL2PyjYb$9iQ|5Wx2K<~Np%VAxkyZCaT64wp|CHy=C1gFyt@o~p zfwXjukj74{0x>J$*395qb8Fo7>uxi@rT+%CW}h9^xRxzG3;F_xt-%)-_)JM-=jYIP zvYup31GiWmo7?B_2!$_<7^JqO>r`vD7f}qhmE=rZBa+e9>vYGXom-}T26AHO&|T&_ z&$`S>#y2RrPU+1zTPA-gbb0DlcVq-$SppIIXPhc&ze+j59EX1hC|Jt zL-B7LLh)?Jl@%i5hm&;>&Q6JIxqqW;N^EkB)DCU=A5%!)!FrurE$b`s23$cB z-!C8xzWRPwK;{2Br?>#;Ys*)UCYkzD`|8s^ZoSt0PWR^stN)}RjV)80T7%x6<)t`l zv=AQIsmyIz=e9J9{O`&Spj+>jH}cr0dwX4X)avZo*Vn18cY4QN>vb90=nfl@E%6G< zQ}Vg%D_5G9A6$miBPsE56!mqw4cBpGz6T9=OBt`XAXOEG90(#$ushH_=+ zBzUCztx&MQnh zz2B8hdAKW^`j$r~knHx?p@LESwBal)d{2Zzk*tiY{YkG_Z*iQGtqNZuA%AWCqto{A zRT`Gh-2(Ns?DiReb40q_U%B;k7E(~JYtQ-na_Yf8 zZjD=xDWMnw<)h4*y313SF!|V49qK(EyD3+eXvww91YgXV!MR0g*!oqFb>E9w9H;2c zL$KWW{=zO9T|T<)1z$B?hqBC_iw+y`vGqE(zs{uG(p{D0yDH2CSPu3-1?{BceMi8@ zzRT#W>6rij*@}BozOw#jPdjF}r#{m!d1TS3`wF)Y^%5P=;*4Ro#(ft5o!q%>?HQLl zMUthURO~$K6y0~Sy8N|X$EoLLo#U}%&~a+d;5>8=)$x3F*kB)>x^DBqE%X1^{NF19 zJ&$tZf0tHVoD`FJKC>W(TGy?Z(OF^~<}>&uB+R8l@$DySdsV~#C#yZWxznYv3g3{T z7y>fxuz05D*62HEwh)-u~8O?Vi zD9_~I5%CdKXf!V48rPn$a{m8sp%RO6--puUT>XEW3Vjbm@>fA@)bZ;S|KFtL|E^S`Ye-DIe+LXif7nri*nd(9aeG4*C6a|C3i#f&jE*E{jA^%$g7IJv;5p<_V9Nj z_t3W=L-yb++~YzX;`7?WUy|G-=(*@qMnhkf+#~4O=pO#IOV}&k$$u&I zI9nsED`&=qeaG@iF7ptS?J$|e*G`taKD8|D9q8-BvY}rcmW!OM4~u4Nv<&Nhci0Jz zKVJ4IJPJ9i`xjxSv-NaXHSsutZ zoWqXAIVQ@KV!z7c;i7=Wy|_;?-6) z%hl|eW$nV-!`Wzo{|c{>^sUYsSrCy9r01r7cpeuulD^(qBk9@c`9?!u@~n~c{B$F0 zvaQJxcSU4d2dCT{5n-Ju-5YU@l%>x{Ot2mp@kT_pI&09|5xEwnz8SUuOT<2uHr`1U zZ3YT; zd`3Hg=SA+6*A2QDcyO2$J80Q(OY3Y>xUWXF~d2Y5OuJ0YRp)*vUHdn zi{9hw$Pk3OJ8U@XCo8I#Y!xx$bt_jq zMku&XW$uwaS!7|ioPEF6ypKLcv&#)!dU7t;;`?Ta`-ye#rupOF&^jh z`iN`cJNEgA>*amcoMg@Wta+U^A&8CQp}ITH=|=PU_F_zC+ySKVWyuH{BYwfCG0>ut zA8t{74Y#OvqzQk>Ont%fx$x`yQ%$lId#ikP%f z=u3B>f;Xcq8khZ6MbR)G@tb;VRHWIcwC0Dhgh*P77~iwI2$7}0aJc{&Eh~U=aw9NJ zUI8qUcl5+>Im(<~J;W+Cy;rzsQiYJ$LGFQZlW;SzyST-ArDqTEqeVXVg%kpR3?b{Q zp@g0=(tE=SdnwTrMzLK24W4v$D*^ht>= zPs9!yiTxx=z%63Vpj=KdpHuX(T+MO|%NtqV$?`tNk605TDTnF!-45iIWe>|6S>DO= zE|zl@`Lr-@P;^GEEbnA&W8BBs&UlznSQJV!rZJ{7?quA@xZk4KJRuxE<4(pSA(7FS z4@wUueJ-Piu_~1On^|sQY-QZZcqd!iSl-9j&Ul#d2wP#(j+Yqn;Fx4|*|bee^#E9cIlD)*OQdzbO|@ z@mSGR!V%Hyqel)-XH6F58H00K&Wp~7d2UcKG!=tAtnoo!JGh1A&5-*I-VGc%_(kB1 z!N-6%4~~dgAN|bW0Wn;6F_cPi%pb+;gDY9~LH=TJT6eN$b^oIX8<#fg@Xl@&l z!*VWTC8LM2nX!d&bL@Wc*pQtp?}q&RkQafk4QXf1Va8+793CR#D8-1l{o;!uX)LER zW}Pxt`U#ostUt_}BaFwOzavZZCVz>SUXeq_h~Cs1(^#L*nk;DU&&pv?vm>*O zHTzieA~cT;X=lx0)*OQ-Yp6)z{3LLG684KJL(^E3&YCP}5;AjHE`~gJsE1`A{zv z#*g~ZnTkY?pD~RwoiUfOlF`H1%-F)%%D9uUjd34iJL6$Sk;E}GrZMI)Rx&m-wlMBw z+{bvBQ6^K^bjDo97RH^7`xrk;q5L=ZC(l;KHpX^FkxKeB#!AL!#_BW*wJV*lbpW-Z zHpT-3NHcIC;YLO=n5-d#Ns~61V#{I7XH6x`&5Rpa)5>xi;{n!)ArwP1V;iH$Bu!2h zVSd(~;;(}?0^c1pa44lx&6qZf(_*Y-Y-Vg5PWpC6F_O=YF^92|ao0$SC+8HhRx&m- zwlcOcwlh|a<`~8h<}g+=HZ!&|wrP1R`Lr>%p2{*~JEIuK@i68vHZ!&|wlTJAoJ^i# z3SkaoC1W#VD`OjDJ7d~Z_GGMNY-Vg@Y-beHICaJx#!AL!##Y95Mv+6F19P~1SgvOI zz;x1xJdTGkhp|#?@;MKTm5j}dqJaGwa~LbNW(NB+wlj)C_GHXqtYmCvY-Ma?6h+i3 z(in3Xn~N!ID`OjDJENG%aWdvGRx&m-wrZS3K5dNcjG}}zIddqLO2*~|96w_lV>_c* z$ni7gFjg`)Gqy6eF}5?Noxw3PRx&m-wlTIdibWhJV-8~_V=H4DV>_cblVfA7WNc<^ zWo%~@XK`$dIgHJWt&HuAVll_VSjpJT*vi<(*v=@<=GYi>7%Lf@8Cx0K7~2`eIqc7v z!&u4K%Gk!(&L}F_lQD;}lChbwm9dSnol#V>KVuGKC1W#VD`Oj@@USOi4r3)_Gh-`b zJEK^_o{Tw+m5j}dZH(=VqKZ8ka~LZbn;Baf+ZjbQdot!QRx&m-wlcOcwlfMZ`!nV+ zHZ!&|wlj*Q?8BJDSjpJT*vi<(*v=@Hk$(5!P;rvZ#`s%g3&NVi9titW*!N+{-BxzHt=ntej&|!2K0N%?@TuYT;p@Yj!?%YY z4F5R%%7|?d&qVw=;?sx|5h^kwGBz?ba%ki!k&`1!B9}zgM_v}WBl7o=KScVY)6tcXjDJ1cHU z+<9>~#kIyAiA#$g6hAcnl=z(ZbK=*=UmAZ!{I2*%;{P3=+hb7=3(rYI@T<|G_^s$L zJZtQR^_&R&;&Y^kfrRxZ5eq2}*aO%TPau0kN`TZCQX>5_7g#FT06dq>f;38`;dx}b zm@Ee4iR2JG$s37ZJRXbRIUa{!H$F|w665i!k2zuvtn*<#1J*@i27a4&9zM-mE-Ij1 zf?o};#xF}Rht&t`x#BGRn*Cz@YCL|&10Jj3(FBk6qCuRGTD%y~-ZnyWsaP#G>r`Efz z?oe7T%cB^ob3X!pIpH(lmV&Q<2lBoL>U?USJ_9MY-!N+ZO9eke6Kw4^jn3%IVzPc) zMCgv^GEOl#w&MdReq93H#!(DI(@8TX?N{K#u@uj{occB{H|^stu}4eEe_KA`5-#CS zhmm|$GU0I!^-UVdx`Y>{kUa9V5bSaD%%l`|6;a90WBof(WYsx$pRbm;r&F$;=N#%7 zbbho|pNr1t#X}+x|7{avfr+CNfZ9jvbxyQihh8MUzW_4{$5HA}j3$g4 zS_#d#WWonh30HEv)vZ+Lb3K=yZ=4s_w`Q#X&Y83dxM11^K^( zasFl68}NCsn9|i}cX--+&`cjhno6$0iL5zw{1NCqF~@+r3+aruOd`~0eIV~E(i9Nd zXF;;g`H#62+ifE$Cj+^CW^p?ol0kai@=wJ44FA7JTG$!ni3ta$&F&8L%}xQ{KYKXv zYMi4&KTExIAD}{C8w$BEP@%u=224bMtuo=0-o-3e2znur%fU!fN|1JbxDvDvf42Y*A7-gim9H=lB zlmfTnw;&b9gwugn;XI_c8mPoI7;U7u7O3#dU?K2&oRbvWfC^u_I1BO(K!q{nY~T)z zK1w_#JkUQ4RN@(&J$~sHh+WzEHF(;K;)VR2SO$4NP>BO56)BzvDtx_d1>_fiO8iNz zg#029e&nQ2< zc?!hy9=QebXrK~fmv;iU$-98tUxNH25byfQmm&WQ#J+U-3glmaO8hEc zg)G#okd=B3*jK#)O+O%d0QDB+B%l)M>K(`#KqUsK_aF}hV&Ay>0CE;kiJ|I4$islB zUv(JrXrL0OsUwib1JN_6k0DP4DltiY0(mk}i7DzBH$f1mt-@CCb&ekmm!HI9q)W`5YkL;ZpyCTnR+UW49Da9*B}xKSO>LsKjIH z7s!tTm3Tt^3i(MOu0(}L#`sPf9t7iyY}k?{o&_qgPlZB$4yf>zvu=f8G?+cB9d;+NO&7e~te+yLNdzB6OpFoAL`HX@5 z15k+{)v1tw0^)jCr$IgmRN@yk0rJ0rXmx55WPx9CQ9@c%AS<8}mNgA>2vCVoD;IJY zP>FCW4{`)hiAbveauiUBXsZx%3{Z(!s~B<|5buUqvmo~XD$&y_h1?6ML?5dRasm+T z+&Ud{KOow_z17&omd$RmJw=ZJn6MT`RC8nKo^9t}hvh~04L1A*uRtrd{R0dehE zD`744@K)RukkRpc2K_8ptz&O3bp>K`sGe%(c#g zJR7J)nRNl=IY1>&w=RM_7pTM;Rtw}sKqbz!Hb6cLh`qJeC6LbsqUW?O#m>k{7{4yV z*mpC2j|}?^MGrYZF2Y`_BeGCksBTq{s&B9tE-7S6$ik4Gp)*34hF%tWUud_m)UeF3 zQDLoNIo;0hwzba2O3$3%>YI3r?hM1JJ*$j2iOMSdFDEvjEs zR@A9clcVmBdNk_UsFP9g(fy(aMqd$qTlC+e$Hkl;vpA+P=I)r#?(yAIy4QAJ*Zs=w zH*|lp`@7xqV`s;f$1aXt9$O!KRqU?Vy|K^4{yp~F*qFE>abx3h<7UVGIquE4Rq;pT zzl%@mF`&n&9)&$l?@`wyq?vX-~%=y(G;XdSc$t7qf=`m@{Nz#*m5m!Z1NQTk(BbaRcU9H)4jh z12dkRFhjW+|F_`(R{YeW=FG@6X zc4N%3w>c)5V~RQEnq!_ho^Fow%<&3yd`d*&{WO93fsXeBbNtX8!=%=Sn`5LoCY$46 za~x-mQ*oryo+@>`GmQQ%KE{c6%<(;=|G*p%8@;7;dJ%lY7q$%VXO2l~{&;~khe3u9 zF@9Nw4>QMXbDU+4ubSgq=6K8;zcR;emMK?r>}ig@&9TrN%gk}UId%)t=i4nrpKpZW z5r)TvEKR5KjWzmMqmMVop5~Zfj{V?A{wanJGvS6AzR1{p=D5M=FA4c5naceV!!I@I zZZY~TMxPz3<3H6LCz#_Tb6jYSXPIM#IacA=3oA8!@V`(*$*nk^8S0m3hOWc^1#)cY zOfd@o6Y)PD|JR8SwGIC}FqgO)|9^-7!{SEuIR2l;{|oqk8UOEN|NG}+i}eNUZ$iEq z@=P^Tgya7N>dKJ8IQFn+V)il>Y| zRO~!iCu8M9;fD}stb8K;QyjyPPONMTzgKRtR>-LlCxj+v@=c&9FLEdDtSb@ko`zt7v~Xs1?HROI^_>uWsg@@hPdjT{NZmYwa6 zZjPtHv(oGLHZ*pKSUa&hdFM5Fk@Sp)x|OBg#zxOFPTa)fN_?Tuzubv1*Y9ueEot%x zeDmsRS0k6@bu*f3tNgyY+Tz;!CchJ4fv2WPp8&_4TU}l1UAe^Dkne4*YVg%l0Lnr6 zx_WPUUA~WF@HDKWGv)x4+tH&byUV=(irGyRwrpu}ZMAo;j#eAlO&5V*8>`Ff>U~vQ zbR4{M(PfVzcMivrT@{p*>U@viLs=N@IAxC|_k3?vUA4EY$&XXyEV7m&ahaVm;>6id zP)p&QLJ1f;=gNui)If6i-ld+V8kDeoK5Xk8a`ZU+d{`*-`gPG4*OoO@dmAXXY|y6= zh)f6T)UHOKW=F;XA`9f*6`}U(6xIovJ)R;#*y0jjqrafWyV6_hr{d+3V`Jx&&_OzD zM{8ed<`XDNU78dV7o=8p4rH_l#9@$)-08)97L7W5^&C&t3U4)KhCP;{ea-N#^;XaG zt>-M-;mVupYrJ`NE9>iOaRRzj?Ka!7t~msnxP2)gMT#C-hO(fcp{}8$W;NmqXac8Y z0_i*#*DkHIV`=b~FZa&Fwe4Kjf$NJ>X>9b>E(_$)^dRe~{7n?pR!3E2|7O<%OXreg zcYT3zxUMcR3P$xamZI+BDlzs`1LiJTwQ(A!v)5Jobs~4SUlZ&!6YMuys_{Y#gY?^t z(sr9bZh;!H8=5h*wTlL$qyFDCm=38>9qA}K_WhJ9uCnY(BaF6%akel4g41(Bp50Va z<5^PUg;-or+q4p+jA7gxc&j@q^Xh79yxjL905x?_gRil!mO|$>HTvsT&h@O(wc6l{ z(O*X_cZqMFzoDthuS=^zUsluC`Ekwg(9oqCEDT(U); z#^qf)b2ozw&G!12dmFq>D@Wqm8d*?0=d|q6bQnD@dvupZF~7LhKW4NjuhU08DpZWt z?SzM#4xWtB7(J$P zw4fdbhgsfreD%-q_!>Zq0|P3U$@G~2kZIWH%*ItXPVP(_D>4l!DAQxO7{`s}L-shK z9jK%7R?n|(FmGONVSy;kJ)>fN z@$7P>P_ZDlWIi;-2-ZOXmyQZ}P#6=SLnGsJLSy5zq2sx@c*+`ZS)e<1x@t1exIxE` zgM^sjt91_=qF}AR!BgdTjU!^InO>RD_GrRE9b&>c+-t@hJ3yZIkLD6 zT^OB5emO~GC5hcwWtWnkmXV5DNp5|;x3)TOdf8lED*;+AN{Xk?&7Hf*-8d@d%q^Hv zj0fP{lnm+0Z{GYF6Ci?o@z>rT9rdOTsI?WsPWZ!=q|wVaGi8lW=g#)eN`7xp??&`jrr?pJu7`x z!nCKrSl2j`YXT<9?|iiN{JJX6t}T;3-@DpY8 z;PwmWg-W&URVK__ucw-N0InY9AjVzM)iO)mcUe_TkGT2bCdgX80a2i!B za%*bpP^K7Pg98UGFb2EW3nRR?5?oL;bHtKakU?JqT^Mxt+=W4}y#+<2Coo+lQCv$` zYgaL?=~C@9q2S!kY+6~5$&`PtcV!*A#9)UqEWfVAVpkU?TwaZSPp$tyxa2nZm)HGP zP+AY@%4lvUg9-#g*z&sS#^5~8t7~eg!a8422;J+^;&_lLZ@I6gy1`rPx`7Vzp^L%0 z0LvUSTj(MV>K(dJcbYT=r;Wn))YoGg&_&>RUcbL<3pbMzANop9O&0<4F_rdpWx&<; zo3{B4U4_t-#^8M0H&I=ruDju`3{ACNXq_fA&+o18!rt-uKo<`BKF(>_U3l=#N*8*} zsT=SpBlzs-dgImGE^K^9*@eEiF}Jp^cHPRlrY?-=oqS8zp)&1psOvP%y-m5N0rw2S zF7rG!U1;Ze8?oFU>}_9@!4@-U1sn338gLzS9hbjL17?h-9nzU~=|YoGp7r4xYUmr}|o)vV~ zbf4d0TyU?Q(_(64eO)7s7b3r|i4Jp{YB7R(X{;zhRYQaNCq|1DMl%nc1PqjK`v!ya z;*dZ|@N)z9qqm3qj{1hYN_ya0ppU<;og2vGCv$c1BMbR$k+_njf1V+Vz<;0`LE>sC@sudCyGN-?v%ZiSayx4r-z zre|uLTydk_t2n85xVzLv?7rXRxB|DI?BJr+{yG^}ZBL~GzIF73G(fR5 ziaFhkI+x0h%?|6@N~BMs(>e*4Qs>1JC_ApEh(;%Kd7gUO@Whc}Nrl7H(KQV7>;(M~ z`>#>fNSN21G)KX6d|5XnAAPB3mb6nC9r)0*Kf@_dp*@z zl@aC|2`KCvc)OUY114G-4lqZWPdls}hSOZqv}_qoCIUJ{y1>`y>!7pq#G`(|l^zEb zFRQI&>z?x2GMUAjCC2CI~0&40uodz3F z<0J!10bOrr6ZOHd=^F~?Jav_GzUO*tJZo8M45UI;qGxCUon0kJz8Whc0fX+f0~}cl z5Ia;}UH!TS-?HT{6L*jSPrKOkEmuI#g}{AVKo^J=+dFF41q@~uOXr7kTH>qm`CV2z zExR`hgqcSj9~v=DOI+f-C8WmehZiRKy44cZjF#x(mzH#BLr?&vp0)F9sZ;X0biN>s zXRX`EzFX2!>S=@1v1uicFLup>+lSVB*J7N(1V%GzV6G)r?m*m}vdd$=cGu&6ASjkm zHG!WN=GlVDqV5>AZ8hzY)V(TJ<2Wr^rPUf|(Uz&RK@Ec?0{eKg8V&gRc{~S0ntbFD zjV0V!Bf1h#qu#nzwiId9EbX)x#%@bIoT4B`I<;+U{)Yhe16I?XMw&hVQPIdhZ;hv6 zZBsagL z&XHLxZY=fqtCn-=QcJd1!MPebDDpftRZVzU&5Pt>Mom+r4n?cu?9D>pc8)17DeYC_ ztz8BY%L$Ft1qsYQ8vI(sy|{70q?u!)V=)TNt`nQ+9-e{Jh`RcULf!@3P`=!Q9V-Q^nzXhAx6p1?$H(^AcjK+G@0swptwz)^ zcJ!L>_tm(X3{xsl7O;TtvZ2QqSq;rHTy|K~&65;nOgO+R@L3LbM)X7m+BgF8ovHt2qo!l66sI@T#FDzHC;M?k70 z?8(N|kGi1sT8HApHOL!=C@r(|0ym~+mm#(lIy(+UVMAS0y^Bw8!t%Y{@&)yBPKT~9 zBFE;;TU{E*7ni=H=Ih2`OU;c0)iQ3wP;ba%pu7LqpE9=MM(x7G1y6x^=PU2v)00B1rz}HPPS3H;)>vHRw0#HH0?m1;<=CQL`?a;y zYFI{h%tw8qEK)hy(<)Z*+*QBvv5pn2)8WABO6_!N?{&`f@CX>5jF5 zoo$&rF&;`AgubVzmltd+4FYBz%~tV3noXQFDO;h_(-$F)&kfkr!xiRM*-Juppo%4C zjmTDTvhEPBB^cYsES=c20*g-W5cYkby;flRanv1`0c?}q>tObPXLUOFxSWuGenje4 zI|I7yS8v~x*a~VjdcxG8yL#Sbh%)xoW0N!GRQEkb?J8(H6c@BjoPxF$OHeZui_HTC zZ)@yQb~x3gJBX`LZ68ypHnj`Y=A8@G)^}Q=vDICawQcIW{$T4H?NtX`;jR>0*Qru$ zwNojWMwqteREwjcdf{idTq{~aw}7z=FF%Wu+hXBUO>@i>;Tjn#MEe84wSkmEnM7Nhj z0)sz1(d+33;*7bS&D8aD&`~l@A#hSI#+O8ZyXJfJE?eLhoqIIy_Z!4?UoF<%3|T|V zI1OyZ8Dnf>W*(c=6|BX5Z*^V3ViejQP*3;KcxOUWhC6Mf;B0r+mDiQjtublab0N@1 zGcAJ1C2a4w(537!vLVgJ4qGnRCs<3qdhZ207_pqEIA}=p5KGJ4zuRhRx^CII0{Hcg zt}I&TOtEb0)HS9KTIZ$JZED^60^z3=dImesTaO+LPYMO?E9$JXUrZr8hsL}|d*|X+ zl+_$=ByA%R&Yfsuc^w*^*)a}71;%ClK4NE!(~QjiMBaE32uPg>T|sSVG*6U2E@%zCQ~M`}dJ-6;?E z$u)N9V1g_i6?#B1@oHk8@)(_;-!`;o9+*j>Ay+lpJm2TR;v?2eprX9$c~2u})|N@{ zn)gzd*02;$!JSC#bpp23)#IvJja_s>X1f=2>=d!t7Q_kKvR+c92@on)=Sz2x*d)Y` z0Y>9opaUg)q1Qh%Q2Rtp_FT&4JiT%$C?~<2jX13?)QHm+w%&QWmrIZayTE=VeO?_^ zlo$=P`dqZ6uQ<1ir2tJa=hOlk9nam(Q$HT88-<@^GOZkK)PA{x)+XpN=yXgKSIooC z#lTibBy5kPjh*h@?cRj*gBl2|9W|P<&1te+)I9N^iv5qTRGRl1oMzuhkJag#ZV@$4CsA}xFmR?KcSUP&>>2%pro`6sb(E=71_?_e#zJ^Al(j%8PQ&VfS z-(%7f0=(#~U+G0(rZp5BUwDS%L3P(JdQwOF8y5FDI2kwbp)mv!()S03>pLw&&<<$W z3v9pXxL3<~Eki@peYvxFp4)3@9aT+d-D;i@af`Q$Q+G^_!Y)UfQ!;_wbew{Vl69Wh zPp7XIn~nI0^#?BcSa z(`~40tk*Any7Z=p;#*LcT341!;an~*9nOMs;hc%fWbO)F8YcpMy}2xAwW!>?);|*W z-dJ+Qf<--T?89n`Gdu(qjC4KPU63yB05daG>dC0$C$ zzmD0KS&t2nT;nL|M&2bwckVhr9k)TUS0@$4z-wQP&KoJ-Ml2SYHsZPw=l+A+O$TMi zr8#qt=x$o*Uq+g{7D|KWfcWqNABwy+__#!)@Uj-~!rNbr2d8&7w2mW*Mh0NmZ%NRXs-*43FfMDb6;S;Fb(&3 zJ3;8xRm_0QZD8OvS{`B+U{2j(6EVjbtkr`k&CJZ}S$L=LKY0b)>`J#68u)cuZ253z zB3KR86>ZN{0t(#>`6}zI)I}4}(ki2g1~YJd>)YtHRZcOi_Zp{j&5`DHMl7#00^d~{ zIj~vPHd4LS@ir)-Z^s1og5WVHO)l8cO`F%pupo*8Gt3?yynxMwg zVXrpVM6ebQ4Ct1|SLO55!vhRUTIPwenB#50Lm-Zjc6M_dECec0Q|^Mf3(0p^f~g%Y z>aGmBxI0?t%??_DcWRPOn)}5vboKn<7`$$cnQ4Ghf1~%9a}JHT)I1c?i5MjYU2H`+ z`I?V8gOf$S87D|*);{Rr2Oa`JK`GeXf+awzmQK7Srw=&^~G^RQ>Y)bw2MDlBID1#j!)=P%S>qVJ^n zL^aELtYQ&uf~?qdf|JuX4s?~<(@QpTyA(^Qbvo?|eXo)283$hu&gTy_<7T86RkXrK zoi-P-Zoga(M${+Qfz0#K139{tH0tu@4RvdZm-01PR@=eX&WBMt9g5+Bfs*GK<|(x( z#f3Q=Ggy1Ygl4m*ASqeG!`<>aHowxsDs4afJdBE3N*zxVAu0lL|yEfwf_XceJx$g_X2u zCBl{=nOUPIoPd+KCdMr|Zk@)(35o4P+O?0{w6;mGEuUhy9OQH4Q%*us(t!UoBsDd$ z`}zLvyYpuM1l-28b56U`ym$ZK-~Zq5-kEowt*)+|?{FR#2W9zo+~erPx9%ZQG8b=d zKUH!GiSNr+pT1^kuM5>@&KIS=%4cfUs_k4dAA9BT`n-t*dv+Nlem!7C;rARCRP*F7 z(Xq;IZ3hf#m9c5HdSr3Mf-7wC(7t^b zT*f@_{#VwdQ>>`2XJdqLHT}-Sr3V5@8Lwfb!p}_7Uox1nT3Uo~g=J!>5S_9R=R_!8 zx*(ttkNzB=J7U8tV9@Vt_<5bA<=SHyRG-sVwKFsP{O0H^bzvWJUXEhvF66vhW`2S_ zb?J8EypFM4bBfc=`OS&j$_ei~oEu!43$-_M;;9?Ik(Se(`98~aiayhvfm-2HBV8kP zlC#ZK_a@SJbEfJ&&h?+<1oTW)1ZRB?HQ5%h;xwqJSTS95kxYg2+s46;mY1+svo86D`5`{5d5V4z9n;3Nu*K05acN?|tVO)**W}}j5v(e?= z`2CFTdPP_DaLq^eGPt)O0)EyIKLUE*x*R7Zq^0dAxyv3*ndW-J%JR%%2WpVyDCwnS z6iHZsapfnB^wUgY$H|mco-N+eoT6TBrT4QoUX2l_t%nHj3S*F)!>ZTmF7cXzWD<@V zIoJI7^?-jAo{CQu2D+82z!ji(@evwz%8&694xw_?z?lM+44`AHj3J&rwDU806D$H8?C39pB=fvQubpWA!SbQ@B8tZV>!?kquHL45vFo(R z8dx;<_H+)`FSV)sJe86_=YI%LQ~ax8w=2BE<86r2I4Mu0&?>XZo^M{AB1=y0FqUiq~=z>t{pjl*=Jk-;S z>;=CQ{*_wi-n@La3X-#uq#j-w#XF$H5oVPAa2MW6u9M7?cTX#K;2?EAHtCe)3fOZJ znbF~|lMYegTHdjvSx;h85Aq%!sg)bdFd*va;?sY`XnquyyTMGpu_k-2hccZyqdD14 z1oA0H7OlJu46((uVIqejDiRZIlwxZP8IohExbc$!@RHq)CYNsGOSV%sjIo3u1kQN zw;XhBu_+crMVS*sWonXly z%8~@}S2QCKB_5sPr2w~cRQ2=B6{=#OEctSHI%mqzQeQ8gvUgcfn|XafqabHBh$|M8 zNz~Lk2zN$M_l~O(_oZve)#s2hYW^eO``Q@0J64YC12fS|K~xsi1pE%9yz)%%^o=q{ zAvTb2^a67wj2EZph+(#3Ra*h@IV9RoCd+Zcf}+4yum987py{@G7AcnoG~WIQu;A#u z4H6NrWBR*5;V4X0sOy6#1L3*=ffl+;<#wgi2Z)0F%0h?!bEI=SL(Y$uEpu0n)k!RO zYPn8k?9Q~ZbJpN7WczOdyUZ{62vs7Ol^^WTw@dIT@*Au;`m7_TWl3#gA9-uRJ$&*Syq-Vhe2xTq8{8;j|oh-& z{9q9KTO??IQyxA2gVve98K1ma3tIGltUu?6_*_9t*ry|m>eov3^=w)Y2<~5M`8%a$ zrKwxZY<7B13}>&lqsCZVy9=&ng>VDA16wdtd$BvR9FjaY9E|H6??$fk9;$2?HqEEI zuxXAx)UXD3gIa91M>=0CW68RABf&hnjoJ{%$}^9iSvAE1Cz)9xpF-4{SwKga?Dsre zZD)QesLS_yT));{epYvWHs=XO2s^!M6ShL!8sW>+L!r+F!p5)YWEW>L zQ5ca&QG_Y_r||sTWwsgqdUkq#iqtKZyMobVon=+$*n`n_`QOLxUy{~Nk=w}ol6{|z z^tzN>l`_9szX?dyVk2AeD!GKbuY0|fZlp}D34@#Ot}?}?*6c?H#2p!GKODq!9b0Y) zLG!duW6{aoP!}B|QC*W_8?grB0rKw@M*{LIJ z{0vLaI(xdppzA|72l;Ss{*D)#IqNJjmZ)j^0F18>PJVgq51n`Y8Kmwa1)(d0E~#%F z=kIP=y}PD7K`F27Qhxu9i1%q%W0oWU8u2*0mxp=bxi(udK$}jjI(z5n znSXHI@A>HBhrf9E>c{?gGQ3X7SeJaElF!AlO3V2k)ipoq zZ-3mgE@^!%7Z=wh&2QyK9Hr$#xzOF0Tki&o-RqJYbA@s;6eU9iOZU=wU2+F43l&!$ zacheVaAPiM=vs<=)3nHXlr$;hTC1UvVj-EZfz~Crv##^83>9g((c!#EmD%9MZE>=hmw>FW9qi&ar7>>HQyO@t6DkD`!m98j`)QVDA zl#fBWm@6mE#Uur*xmZpbQPQ9Y_?eYEvm_JAgup-AKjfLR-X%u?qqN5IH@1mV6tH*X z3PVFVsO8C|YeeJ10FBFmd<<7E<;x`y={3|NCK|2{*P_VZAp*;bxahjU1BohjMZyZ9 zkqE)FMt+!C+S7;|d1#b0(&|Xna4}<6R9H8BDz~yc9~HaGNj*yHu>=veHIjwBOwb3! z=?F*%{B3ZvYK9J&ctH?HVjE{NN+vB)jgo4Q)FHV?#0CfFlIHLBxGo_iR>h#0kNb<= z@ZjEvj|$W-$2*4$5WLw!O_JuzY8}OhNo1w>3$PUP0w_067lv}Y?6=pGpL|adrj-lG zS6nVg^wzrzi~T7};j!2pMG`_|_Ib6Bb|a(B#T4W8R;U0)B+)C#5VTrp-)Gl)`Da+;ZX+2;n)ey$ z?<o?HqU9%5^`x8AO|w5 zK^74T3A^DlQIL#az+D;bhJ+Jqycq^SZv`sFenukGT+|(@!FUPDMU`T_nX~yT%EvIu z>o$4R-E(*`&(vs*858SwUa>oAK9~)X^2I3qV0=Nbms+O!05mq^lN>FT3rX`4fTR@p z$H?b%UC~7%Nb{fP@ko4MQ+-4>Hoc zucSd@60a-vQQt8{$-tx2BOsurXlbrAQXD|DAddYd10ZmZS+NqLB>Sa0BM@SCzPS}l zl-W(GSLRiy7F!15VwdOOS}AVe`P!2AJf&V63kTOInkz~g=Ld0F>rp%H#i5i6!rGK8 zQdM!~G+>uXiD!OFP<1KwA}I(`^RYZOS*eM*SKdHnr;R0#MIzB-{FhP%!yKF4h-G}R zW0JS#gXP!~Qlx#QVlg>nDAnycY1b-Z7$p-}SXf{8w@H7i8YIsq^`v21eh&4vW{o8X zmc6E~QiB8AXIA2@UC-I|Ii%6rw!G0dv{0LrOx>DlVYc5HYYhE$E6k*v3+)$Xxc37r zeu-gP-DdMG(c1n+GPc9Dfntx>2z60oZV_Z_-G$(r z)3Ou-t%wStU!N24TXN;9!JHyPUrL%^Mk%Fgt&f8icn!(SO4G5hbv`qLgniZ!I)D}3 z7Mj@1uOf*uMKKoqNIosd_x9z|WM^^Q*B4qK(7rFE8p-8*VpK6%xL1?eXz;Z8w4WTX zM$BYO1X}gjl(Qb2%S{I{@rd(70>Pk3%P(Bj255ryIbey?W<)@Q4cm$%CiATsur(xw zs2AfI*(R)!r$C7y6Isv|GAcNo;f})FT^?aZ{ECN$YnK(NQ3+^Sg>Sc(cs6BHM&%fL zv(PX`^??yd8Q9QY6iL~UU!OCZ67pWX*A;ufJ)H|+8c8F@CZr~=tm z5s<~!CsV;JwM7);?MJpC;Sdo)(tOdNXug=G%B3CxL4s_HJIkrXZ@y^SQX)uzdIoa` z`7}tWv{fE5!|s*Iaxyk*}fw*Bi-)O<6DiS3pR)hf{?!+m$nxXD45!O z(aK`n>Wk$Ps~qn5R*Cup#@Y_};u7I;YetSg#@U4yeTsEqS<*U$)$|EwK83j{Vsj@D zx3z{Zw!igTnpOT7t7u7VSVSO+VSWOygE>+hhmK6ZBNTWd-%VuB%E=6?7P)b`3x7ti z84>7XuJgHwm8r|2VO+cI+GAIYFeQ;)`|R3l*M63J7DD45f%-}GNc2ux-!_nJVN724 zg#nYqL^g6^h_vo&xtrhmt3Fl}!>!LtxXeer&%2Fdi;9 z-gvh0QcQPWGLQ2U0#MEuH1E5}#)Z;W2C}$Cnzj>b{9>k^$9M*%rkPaFcYwyjtziRf zSc`hUDx?Xkd=pu1qriLCff!RX%?d3Vveqo<{)NRL2tH=TQ*bFL@P zh5XwO?AhYF^)u$2`)aPWtMo@d_ocC?&;7e!|N19y{mFX|9r*cQ{N)Yzzwqs^UOWBx z!<)YQ;Sb*S=kNc_`!D#;?IVN#<|}W$=#Qp;^@jKF8yfljZ#|Iz^$Qoe9=fUY^5doV zzU9|0{q)a%cgyvU?D+kmd;a@p&pY&`>tA{H<^TGXk z9qjxWNcJUwzC@h;p>KqWA+RdPg`LBtU&?m(B(2AFxuUBl8OZmP@;wpR=Eu5ONH>)F z_g$D;BPK)Sxh9R5ibq@9EWj z4Ete{*VV%oB?XL+1Jh+jVZKyQ9<0Eutr-=+PnS>Yaz>Y@6dR@HUHMnIG#^#!c`ggK zKF}bswIh+Vp3RcaWyy0{@~nD_60H|J0GI8Xs|6t^%>nI0s(La-aA8zNB=ZPM za@8d{A-iye`eE@Kwtu69re1ifE^pK223-z@CCq4~l-~^q`#Otxnlu;Hu9}vyrVTyT zmIO2dYw4;slVL{TwIE_Iyh}yeK{&14U4pV5zQ1MtPx7hqsS^(n zBqu`{XYQrqn3fJKDk|nUv=^(Q^{j?yq1BW5dtKR%Ey%7vP6aaZxMi;JnJchITAWw% z+M}2tBq+t)Y$Ut^QSvx zi+@mqhTK^_IV88HMBVO+36v*5Si{{|((qR+Cx{<#6f3e@)GjK6%yaK3tfqxkZ3_@a zS$5J-#JGo4%!K|n>2K9Isub7{#VH!-+O&p<6Md9M(3OqV$gwcI7oRB-#cWfs#_nXi7DzOwxg{!RIH7{(2Cz^0f$MlYuZ_B7WbuNP}NiM!0J|w z2Pz%7cVxg7p#axxV4IS#(n?_t`<8;uuN4{|5>`YCJk^BlmNK#NeM!A9O##ZF>oUPD z*)C-tgCS~QeHxTXv84tKRM1p063Q-VYjiM`cfUtCQ0bOlX`66VUlC}JKk9EcVe&Rs zQl7?OJ1eTKY3EeQ24Fic`Y&oq+jC(j8|6mA8pgUtKOFKJy~w^YX76a!iyL5rh;KSz zrlq1G?YYQ$5~$ezVXq3X*n9(l0cPH4EHlK$s=w9!ZIX3_ z&853hVt~+}EzGk9@>yC5^s}XIO7rMA)b|a}S%Y(FgL5SWh$+*`XRY$twDMV7>m|+S zOgGqFgQ4h3KE3;Zl!c%Sm*aT|BOu#Ro|3X;d`+NQZ2-D*DJUzuRS-nWNH(Mls@9Mu zZVmZ~TSJi9Mnk5sp*9{#Va%fR2|z|3?TbKm_$|{5;k5JPsKK1|R@igmp4YaQQj!f; zMp|A%;#+mO~CTjytbHwfBs2>0Uh9TQNxujy}G?Auhz^J_x2!yXJhvft{(W#H6z| zvj+H5Pz}g6L8vtgFknejDOUloIZ0`A3*hKh!?JK4Yt zOAZ?GFjf}|p`BsJV5Ac{KT+vI=gnzrCM^)vP->ye2;N=1s4RO~4ZhAdYO$V29Qhv5 z>>4%+11DS3e8O+YW2S&2_0sG;B0Fq=aYd%M60dPB+ExCulIyc;uU-4i#gE9-3zH|k zlAQ5WJ!2$(%4eSHH}U~43v>)e$|^F}>J{JW6;q=}Ez^9|YM%Es&nvUgZJC8`Qy5V{ z_6lQ3KZB3`(iwcFqvE;Fisw2i&UIFt>!>)}S#j2&(C#toc?BDa9hGUlkXi&>tk+;q zikE!tOV;$8KJ(3N^aZ3U2vS0*DHUU>=QXy^hEnV)gMSFpV;^mxC;dQA4!Hu`3ZgsP zv1%Awf!4g16;l>QahIv&nuyfbw5Rm>rPbAC)zzidlgp|nBV66WD1w84C3WtWsD{L( z5?G#es*tL-%O-L63Q7V7WI7NsMA?B6?u1}miM_biG4cdCcq4WpOb_LmlF2lURHUBC zimPccu|%r1d`+wN>}N=HN{p${Nmo1|DEi%mY&01wHDut_R+01$uMy)Sx(Hj?yWl>V z-VdhtI(M+Zvw>(gaRbW7wP0%4>Q$2Jy!IprA*mkn#7ZXw9Oe}Dh+7^7=1@Lw&G~+m z&gMz^nE^%Y3-XO;-o9UKE^1`L2fMXKxe?;174xhWwhiuvl5Ir@PSmqbNqfg$6NX($ zLqy!RImHg5HM`aem!Jxd+w}?_HH-N~-INWGC{ZkDuWMa}2Q4{i*D4M2DxA@KT|8CaSs&ZAWqi}r4ldhv?%K7fwr%UKP2*eY zQ`>ipZJ)Z8M}FKt$hiwPUw`#M&WEzM5nsmfa5_oz&3A6yJO*&_+V*?l^gg|r+PscR z8&;P}=u@F-f6n!6+q`x6W}b@QmUEZ;^rhQ&Z5`Ws>)3d0$JDl+^}|!!cJH35jqe`c zzI%Mz*!b4^^cGV5Iky`ev*S=WB=zsU>*UGVxi?*Y`E49+ck1wF&gr|nO@u7vTwl%= z>;N0*pjfx)qD0dY!#Ov=VJ^J?z#p?_RYp4}kkdoilx9WBA61NJWG6`o*u(ji98&c? z-{%cESFHI%5QjM|Yv}=fzRB8lpKiT8))&I4bf6;LL}1U^QN}xUP zin)tcsp;={Ip%p8B@4&(LIIDS@J(h7Ek54)4eu`t(+L?NKl(0>5>^LW- zGri=|&I@ByP3YeoOGXv7Qztoo&8MezKx0}ytuvQM_agbXAK~re*7fK#t?LwzgEshqELp&-bukbuQ-jL z6OE-J{haW|X?#bf^v+DFUe^?F*>tdG*p6c3(7*QKw!VIzw|BWUIoC%b9FlDLn!QW? zsw?-uou9snH zz{(lQz$h4|?>w3sJ)b|p>oI3%GwvR5zlgzD4{d8Y8!aHX{A@^*2!C#>j*d4Lw1+rw za(b3B5f`>BdA*k5D|mG@t~Ae6Ae87RDi3_B9w~y}XgK$KKeg-Ok34wqt5{idJ%C)CeAWyZM8k{EPLYAAaVJ@gM)hNA7>`Z=b#Rb^q;C|K(rI z?b!R)KRfo>KbScFkuSXAsgGXz#=W20`IW1m{?I?YX7qz!{@LbtzVUqZl{=3=vvK@W zAO7^Nf4unE$8Y@H$NumyhEM(4#9K?n-~8h15B}*-Y(M*#6W@66OTV#R24v^2Ui+_H z?z$VKvG3+{=J}jE^98Tis#j`+&jvpG|1{_Je=)10$PMYz@%Q!vdk<_M{lxwM=qtau z|MXQy8rR*v<0199>P=OSUpz5aM159axBVoMuto~<8t2i~?vdYwY?J5QugfaxWpZ+Z4>PrvZY?H~W* zyPF>boA9@&bS31L-ap#W&N+_3Jh69X<~r=YJ32ST`&y^%MR&f>_uj}T%Sp0yxYx|( zY=BYcnoFC?I6FJRW_h{tZ{u?aC-@$3W39=1y0&q@i6^h#$@OaYc2d{!gX-(aU(59x z()#kOI$CjSJ!e*C?1q%T+-eQD(XZR6+Q#4GM~^vv;`uAZ?82O^-Q z_V#6Zit?G#dJ}DbqGY(cN;Bqc+zHrSTsv$FDi9Dt&&0Z*Uz|?Imz-Y!O zFw3(yg8VjqSdVR8rL5u}MKCKsqo*G6c|2?&`eoyIPU)E-|D59OU=sfJ*_=8?M04nA z8_gVO7ami1HCkoxUtx6jM(9@WrmCh*A e(EzUoN8o>;=ZgEYxJ?SraL(5M|NDQB0{;sJr4c*; literal 0 HcmV?d00001 diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.ABI.dll.meta b/Packages/Sequence-Unity/Plugins/Nethereum.ABI.dll.meta new file mode 100644 index 00000000..38f6bea7 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Nethereum.ABI.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 40f447a6c93ce4de085794426dc28452 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + 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/Packages/Sequence-Unity/Plugins/Nethereum.Hex.dll b/Packages/Sequence-Unity/Plugins/Nethereum.Hex.dll new file mode 100644 index 0000000000000000000000000000000000000000..1f9df2c4ce8ee539e1b645a97f9eaf910d0d0d7e GIT binary patch literal 13312 zcmeHOd3YSvk*_|cXEd@09k%2{vc~sV$5@x;1KC)XY}xq0SOVMFV2wsCdGKgj^vu{6 z#zqbXVqzd9KsduqAX!342!VufFM$M>Yjco~00{}<3r9AA5Lj5VzpCyzWH4X$`|{tW z<*t5JuU=KXdiCnP*F9c)%9lwaA|3Z9pAg-PCtphiem)pMb)f2p0lK^3>8bZBYo4Ck zy*-u;4%ya#9T^NpBZ-8S3ig^oJDmu|62XoWx`KmNpBWxI)<44)y?!~-8bzZ&P1}2Z zM%$}2Em)}36V-xZIMm0F$1{k#2RBiXlvT%WCb0c-T@MKQr3VQ8>N%HL`CsnoqD;bN zL+%M&=plNG9dYC}LNo@n)GDIxBkMj74-)zE>V3dh=HcO#xjO~?scHb!Nnc@i{uP8( zVLNF@K@{71P~eV+apzr2FegzW|+le5SaHAA$xU8sWDC)cag26F7mik=>Y-UjVbGS-WIiz#XduJ;Q;IEc7^4X^`YSq!#?@XFpG zcs||Na_LuohjRTHPsOvG{wz`<1*7BN%l)rDol)@l^CW9dRg1cZ`>9zq%$UV6A7zm0 zxX}_Gq$#R}VC3#tbNNZ7uo*+oVOp&EwL+uTXLv2lWq-A|RxPV8uMR^idgU)WtU!4t zCOi@oEJI=f;Wybr_(CG{sF_qytfjrE@*A~5Lo^naC~AnC9pWa3%cP;GD`QtWnq3*k z^8F#ieoY9$RO7E1o1qD6aI9(6<+ejz2l&h87TWN{P;xnt zGu5)wLn~0IHSAp=R=W!QdTp_NHVEPZBh(3&YKKt9ao|!QUzfbdcBvvEge-_CDU-}p zt;!tmyCzRDLKwuFnPp`b0?lu&2FNqtNUmWuEE9&xrPX=ub74k}N0h7kph%xtS3YYW zyr&;F&<7*A7OiHEa81ZyU!bZcgcZy0nBAyKTWdWFhg9|@nsEL`jztI=$cZ)cF$Yfs z#~5E#eWS-$wXmVWR~6w>e?y6{s;$xQt6Fhb#gwek%W9PJI?PmW`KCgzVQoOO#)rzQ zd(}KmbsD%PSa80-dZ#M+!@}z5caoG8CxuSp+JwvyHH7J6)Qxfa=~%AHxFc0_aw=A9 zC#r1eSi^gj$eZQpzbMxDwhHCWz?5HzY@^I9tE#`&I+?|v=JfGXbojwT_dqtnu6P`> z_eOBn7Vd)!b^n6vP@ziCoIXvmHlf<-RH1kCn6k0H38&T?IJovjbeRf`KD4`bv%k#KrkEEh_$7jn#F3dM_gU(nItu(1}Np5Tw3`ihriUDkyC6G zdwZV0rr0xKQ>mxejf&~}h<=af7zE(-u9O{13?!N3 zzp#K^issW#>Y@YKZm?^ocb>G0=k2Ay4?+F(WpS&QnQ$=l3gX&eqYtY{W_G(=I zvGR;jN>jmX&>xiL9)liM8Qv&xmB!`q0>c777M|yn-x&s7Ca_%X)(vVG{vHPkPm9Or zGw3{(;Z4fh1qO8~AAs{i&x3}aURKYB5AP z>?KX5xL}XdA$=IJc%fjI)9aq!X&POX#oo|#`bHLeNAu8~E_S>AH_f2?1v^0RYAIM) zF_mx~fWBtMOD%%2_DzWVjae*;Jipt)d>&{YLnAI$q89->=weqx=2*JK#ct6a0CtUF z2k3eDGeB>-*tmisI)*-Su~)!ZL}k;&7FtyB3>DK17pp0Fl1iviu=D7Sf|sb2juY&1 z-<7_Pv{LHKVun7B*1OmX1#jZSV!PNYz{+Vvu*b=(Xv##o*~PYbU&lV~CBa@-wt0*7 zN%V%(j*NoI`ea%%oh`eZ_V}ji6|_?@_L7458WHSqy23MCucTXC>|#&79;9Ep*iU@N z>NDuAymm9`J;C;il$oT=U=7Z=&!l4nyBylv^jTCX*z3xof=+!l&33Vxg0*^x>a*<> znnMe+oc-z?TAJnTSF34d9w+bE_sneboR=d)y7W5Q<6<`yoTi8AfQx+z zSUuhEVr>QedLvcLWSN)KFFXl-9u2uzTR~c%PY=1+u7VlrLgGC-b9Mq-L~~|2*g(Nq z`mwak#Xj^MP+FjuBUTWVwg4)WU;c?mK!OE5-?l2z&RR4&O=_R2*F&e%UWQ zU0cAqzACz$TF2(Q&`&?IUK#e^lW_CwE(Y`pdT5VGxI`$Z30&bJW=3gff0c* z!0~j3l!pcG7kE(MC4iH##>9*u-43YG!+^7>K;iNjls5^C0&-S;QnLPibfs@EF+2zG z7T-Z?mDOaTGRwFgWnNQSWvyu?&akbr;!ITT^4$dqEV)(IqgKhrt;Bh^RaOGD!rX6_ z+}q(ohr;>3Rq}4DYYFGeR^t5nq-4^&s9q^i?gFJ!X%PF_!kJ11aogY0omvt71#N4T z7sZAdfXzsFF(ZmK*jYhX+E!2=pf=?b{Tt}r4aoGXlub&PvP!wXAg0_$bskOG4EaT< zeW75NGDkVyw-4}zf&<`r-gkl0M-TaK0=&QAo8XTb-%;W$6SaqYj|u-9fcNX~0M77z z2zZyS0bZvc2JAG3X%6zgrp{6B@s$An5AqZ9&jCEqw@_7}{WvMFmU0mtR4%3s>OrN` zy9w|z{WNu0Ii&ZiDm_P4ShIgiQ#Bt=RHkdQ>1w(I8MIJfDSa2^$@C+@>GW&B8hQ<| ziQWf1R$#lp)k5#0k3ruel&HWRG|m&IBrO5lL+1gWLtg>>68*%}PB)PP@3O8Df!7Os zNZ_jiUjxrmMpR**a|GTb@KNPkpuFl~IvEUu0+$Nx5jZ07dVvoKd{rQMg<_bBK-=5-~caBd;mtG+2&LkI$P zs2|A_r_Jn@!k(Cs0QB+YqdVm}22YkUhAu^3BpT<^k9D7m@mxf6v2M*(&LvYhANN;r zUrVo`{CkCM#?`uH;kIoJ+v=&c+gfSvUefDe>(cRfq&IH%G|;N$iS(dpXR$NVk(7&| z!G`ti-NQq|2dv#n>@@9^Wux7iSTe=U6RD;~T9Hmfdm1U%;P|AKaJfwzHDGILrU5gx z?WFD%3rLKS5)7o)wN_s`ZZ5&A^IljSrLN&*${Y;0Tk*IVO~tH4GTdnA$uu{)A7`*KyC=~y0i61z0kA7h`hfjPbovo}33!1NpqVo#1G zW20ypBf4X$eAX=4j`W#>5qn2YN_WJ@P^`e`7ju`DU$K05%1k8T@EmVO%nJ18WOVv7 zD_14@EqgG+LludCimS_vrtMg2c)e*4#*&{c0m0HA8%WzCurQxH1+9I=U-J6sbDo6+?#Vv?nTi2M0fz)>DN=58ca$^id%sfXp zJFv~RBg4oirj1x5SWD~7)OOQ0(}Q7X4EM$3uJyDkxh9svq*$Kli$xL?OQL=h1*4U# zX5C$}fdq1l6R&NOdor%rVD`J&h}K!DRf9uubI^nteam-8O^HleA(J47uQPY0ki4w^ zRG4FxHo%uskb#zx;|U2LJH|Y&d)LGgXAp-DF&j5DZQ`-OL;SofHo#6804~`y58rO? z&ciHr4n;FjDDp(VO}jYWYz!?!){{-yv@Dj&A>Gy*YnRK?g=~dPdnV9it{9GDRiJQG z9&0V6W1z4zH~y|PhnzDHC1-SU_0h~KlkvqmUZ7&pWCrhuMFtWU=0T2>iAISFYY0Z} zj780Ci%hkX8caJ|@8nnnFP0#%kB%hvGZKH2mj#ZzBu85skNEZ^*|?Wuv5bF4t88DA z;cP}tvO9A9MxT03dvvW63+%G2fYA(W#L=p<;qX}uZct?cJDkhJNttpSXrJ2;tY?X6 zB;`i96LAu>(G*2F_u+{z%RAu76J(jBb_8om@{&vFGI{z?a(k>lMb^+Zoe(hSZBnG36q16u_FcZ2G+1E5&c54aBX0~DbY=sQsk;)eh+P*#B}C3Pm*pzZ`uoYKM(!?_@c zdJ7yul+!eXKMQ=^q7Sd6>!A}b{5|}{mUd4UYV54$**HX!`J_{sQusm zT&Cz3l>VKxASrrKQG6bN;_+MzFi<@~RS5)yx|U(dW@CIwky3oBe|$+y;bJKXrBv}S z761}LHIR@J@S`;sN-0o?VktR@?gfV)#A{CI#d{E7g#vwmg~g{DUadmS$R*XNFi2G@ zid5CWzkp_x;=rRQ6<*O*N^BQMUbO<|vM#`YG-u7wQ|aN#3Uo-VIEGZ!G24N#rIery zmiYW$x2hEHjnUQOkxSGmD5`47=90}~p&xt|x?d?(3ZT{Lj?b%%FW!qz7|sJCD?P5)YvHFqkd%S98 zfa4%gsTF#CmH4!R?bvprQhY%aW0Q zhm=YW8fgI*!+HX~r}mV7@^syAPW08^al-50z4hB~k6e#;B&3hv^A)m%p#lKk(ACy} zVaCi==tX7!f{NG9e!BkWFFkPcJNNaUa$r-}`Ct0->_cyT@Zu`-?rZ7}-}Lo?cfa3!th+9@Br6W#jJWA`Wu ze}cg^azhxC`G|ycI%kIi+gL!Ae+Mv6EUEGMzfB35nwx{DMr1!-MGo7*{ z@!H_}bT3w_)#h-wwZlv-jz;JAHZ=A3NBbK4`ugTIj90qVqOKjWAxOeO4$CA?DT-!P zdNiYCfsfuR)h}epNzzSbb zQ%cULC`tQ+dPT`_$z~KW#F!l{7+e@&$PGeY0K%NvP~yV`!hASY^&&LzP!aZE;0MBj z-+%-HFsTxe2{9l6B5Dvw9?j?DH^DmOdbAJ)@HqezTER&86uh$FYYGQQw_3K*jts4{ z64^~KP7v0vqyjz;C`2RPsf=E$$-{!ET%nTe$t(EC?ZIGUeM1Z3JsHhtG3y)p`{$c= zEe-P*)HS!X^w%wD>T9fPX=*YTv^4b22c4)>p^4#j%e%36kaK@+W@vX}Y++nrT=vM@ z5larmBg5;kLn!7Z!AzSVSPK<0n!}9?!&tVO6`JdmYnm4{);IRoH$_^a&GY+uqs@yos!bP+YecWIUSxMdo51(YmXKhcVhLVfs&KgH9?e$Cfd*R%*@iOWzK{4{Mfbtz)iyxGHh_$RB2&{qBU0pPo3h;)lnrJLRJ-V_&~&@BSNKHd~J$d(NUa z-@k3lxtr@3?qaqU(A{U6Jp-TKf4ETetV)|0T)PHyc=51Dp{xpQlW6~(D5 zkxFirK;D`i$F2CKX%6F<+=}BlxZ-9cX>LvAUb|r?jb;oF_4QKM%C^RNE#z7;_-oe+ z?&+(~z5C{=T_o?bnZjlKkd98q z@AI|+F2_6dE}S+_z)55qp6h6Z^Q&w6vHs`79PO1P%YXKXA63c4RA+f{33zniRv?wP z`zx@ek7HBLCz*bn8~B+s}*L+0wh8+;{ec?W8eI83k| zL!<2EQ(Fp$3_i@5a`*_t*L>8evHTVcDl@NXeJu zj1(Ws1|ip`9a(SU{|1Q86I>m9s%6cYv0}{e>_1|EtN49AWbp|(4WHxXLRJEyd~|;w zfb|NEZhNHH^L<`J&9p%J+=#fWrzYrWfyQQ<58b^|T8Qz9g5HE@6U`IYEWC~2G2tzT x)`VK@J@8ei05-J2J4x|XFFe6#;?J`qGyZ7)+1FC%H*!zlm%;zK{{MO4e*xAL@QeTe literal 0 HcmV?d00001 diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.Hex.dll.meta b/Packages/Sequence-Unity/Plugins/Nethereum.Hex.dll.meta new file mode 100644 index 00000000..8fb790ea --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Nethereum.Hex.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 06abfee0dda8e4bd2b5cba60a9c304c6 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + 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/Packages/Sequence-Unity/Plugins/Nethereum.RLP.dll b/Packages/Sequence-Unity/Plugins/Nethereum.RLP.dll new file mode 100644 index 0000000000000000000000000000000000000000..dda28ac62ba89dba324c0cd1915c5c8641053892 GIT binary patch literal 11264 zcmeHNeRNdinSbv0oyla#WWof5zyJouNiyV%Kqv(gl1MZ_NCGAZ4U@?w3{Ga^oe53w zsG+sBww5h!RixNz)t=VfR@-H(Rog?YYujz@x~yy0*0reJdfHv7wO>+Q*x&QsJIR0_ z`_G;|XV3P+eeU~wywCf5y&rRLHtqNnDMX~=K6j4jVLbU-FW`HFDX{$uAMw+1&r^#Y zmb#u=)VDX84UgHG5j#E_PQ=scOfEcRh3)ZlIGGN&ZRrht;b9`PfNuidSb)cJ) z@Cw7Kn4Pr~APU=dqrr|Y#a(c%N4jFRmC8VnZKWyPtSgGU;95`AT7ZhC*QKy+GHJB; z5~9~aM4k%-``0^aFCf1S{gYf{gdzbVZ}hrS!0M%PL?WuH423dfz%#P}A~3Ehf@oKj zker>v!tSGK7DeW=gcq5Q*2|HL3Xyp;NMt_Ra;5?>8myJ629{u)Kz0ErUb!gbt12_h zqs6)>qCr(=A;@NVzt1!dCF_5oXTsbO`q4*^EGk46GqOjn(QWX?qRv1e`A{;mggI%) ztz!8+Cn7~`FKh_bDul}A@CUM}U$3{EZ7DaZHQ78|T@)(P@yt|$Bg}!``j>SPmFRXy zwJt}HV6PmCEaL%Lr%rGk^$eZJj}9IiRIW!**}5LeM1&yAA-wM@$M(&u)#!V8qKpD^ zwJIN~k)oP9@JR$x^2(|n(hnsg7{jX;tvU!f+2CaA)w5*9ulhBE!=V>dB|%4e3+ONq z^sS%=neLNW7}*1H4T#8no{0Q{xC}%Xt5+AXAZh@#AZVyPz1k~!mow4O)=iu{ckYF` zJ{$gz>7fYR@J6Zt%xpE_fv6lh3=~_STtu@nB&&yyWx>#)A5j*#pKDG-tr&Q%b(>cA5s0q6=(p*?WYs|)o-GPD^X zT_kIcAo*m~49yV)L#QlPJnp!9zZlu6r2*(MT%GJ4>y*_9sukhRYtsA6`^}IcwCUyj zf?O=Co)8d0G{q1>RSBrhAi9Ar?l7Wew?Vhbc9u zzEE9IMiBh)&#&tJswt{mGsP%ODN+3#axq2%PpnnW7@TwAjNkP}nB+5E}9UB8&-jQCFTP=Tcv%)@8pnpyc05IH**l^0%LTa>5C$D&TY zDnntOV#g}WK@$FG^a7q<_9udM2-7RyDX%DkMM$rf>q%3`@gS-5I>L`Z_$ zf6~h``Cx~Pa-dFeg!E$uEAWMit300a{*%S#f`rek`JG2ZDyW8ndeyvu>M0)x=mQX3 z5YTrlTsW9Gc`ShR2lasNsXryOdmQ~iO%4ULa!-GLjDQvrbIa3@J}UD9sylo@gR@-Q zHhjgp8Bl5}xlK7a@`HD5fTNi!`pIS)d8JDs8toi?f#QNEubz)1W{Kt zzXl_qIYHJ#K?6b7Au|v#1|SnK@plaOKgpA`%Ab z%31M(wJKpdpkj_wIVM-A2oBCM6wHdl3q(~6^%v>ParU#ipBvEya-_T%AJB zRHu-qubb*erz6Oi(<~Rk3a>{mldoa?P_^MSqGi!}*k?Zh zyZo>#+kn1axu(d*E;g2J1a?3kM{USOMs=rd?*cWm0@S5OrU?&URdJ~tS&3EztFpcn z$SNQ;zk0!6DxVF(+Ig8~5T4iV_;lB*3SG{iTHFoDw!jg)kfT}8tVWM0@m?fT9bI%e zn?{rmMQiV6tr8a;E@+|sjj`HTLv2GH2I8F{1^6^#vE(|UHE{MWZujQwWO^ja63=57 zW|<}1dTAqeUf%MST)M5Z4bOhyM=)oWw5Bpc!1==YL%L$&=RF?ip+89tgngAqUxXVu z5a&D0HRAq|C0H+x+K8Yq9D6OFBgAnN0TF#!j@v}9D2^vO?UVmX)9GgdwkzEB%adA= zet_`nbV81+I#nwS&xv-EfQ#juAxQ#mm2Xvax>nGS3itzwDoH;a@r)uifT;1S9%dp67n}I>r9<)HkqD7FE6zkXLOw&6&e;0(;tv7 zN92e&7VM=&2a&?Ck)#%Z-Hk|p85r|?xJxKY4zJk3)Fdo3X_>&zD9rQV;LVaNHO9O+ zn{J(2N%zZJr>>wc19kvzpZb_+e-N;V?xzOTg zd4VmYjV^YPswj&n=VI?ueagjj%*A%-in5embFtSoMY)9fFLp-wgdS9?=`j~u2CR;% zE17p2eb-o^G*PdMC6uMgD!SRlzG1v1H`ByYN768>mDTiyi~ZhcQr3_fad=baTIKyz z;$qLJYn8PW7T95WTxnC*(Kdm7bWXn};Ro9;hd1W~T9?vF;{yAIha=xg*E*8scPR(# zqXqpo(4lE8M;qwQf_`mupTG{%KS4_yJuI->=xU=|X`|hju$|86?Py8#O-xmZ7HSO7 zVYcL3a>JcL8nT00ctd8^15-07=mz2o#1Dz?q67UvimdJr8At@7E zqR<}EcT)8IwTR(Q3=Q*6$L%4mk^rDab47a*pcgw(zg9xc0=5X)Dd1MX*)$;9aRHM8 zUM=7x;6-#dphRC1@Fx1Gv5dY=J!%boAIJGxDx=fJWq=drR#3hpT>&^@j?hhz&jF^) z1CT$iUoYTC=sBvyPW>DxpQ8Cf=X@%a?nj$7+(fq+4+{8o$ULk(2F*NrnUHxA`hNsH zA$o>aU-cBdNJq@m^cxy5&(Im#XOMIUi1y_I_R{^JTuILWCTPAI zqpK(an5A9ndZBZJfV%~p67VhoPY8HQK$6%7N%}BgShRNwcuHjoX$)^Lt^vG_o}izi zs*0sjX}+{fS}rw99nxo{uSmxw1+}N4=5$mX-iy(8JZ7K_{}phTK}Mp8kgUQIp z9_o>fNKZ@Z6weGkL2w-t{Xyb=lTQu#>*vy8W=u1 zT1&m1JK6{PHukjlZrsw>*=*(ZTDCPl8tdum z&htfwuFl@RJi+N8C_CDFwhXoo^tBJR^z^h0Q2VCtzJWplTLoQh@m!p;1?@|%+%(xv z2=-`pL_7!W)R<`WPG)n~Xlz3!m9i4KWG0=BU23H*JDH%C;bHji91lC}%qZ)!5_q-B zTAlFr}?rHWyD1 z$L(Qq#-*7IQD<8+JC@0Ew#aE()MM?p?5ssC*{n4>l$zXR<>JE#N=pt$+@bNDMH@1s zW66|d3m4-#Yj}or>3FgLYqN&NM@Crtj08GwPiB+n(egv}+3{g(G;UutBi+!k^(BRHN5 zVvm)IPl#4_hM%{f+eTq0ax;wXI6P>v?fB#jEicSUJTuyiQC3F}FpdGuxYVjT1ORlCZKM=1q2`Hjk%L zg#y#KV>NYVyOOzF%4$y!C*$d9U#vauOyiMf=AB#P1q4jd0t{24JCjXv_9-!L+g3U^ zjbonJGg$jX!Wt8D>&gSJekfG%!rNFL=3l^+>D)#O)phhES)0d8TyM4lKvtqFbi4B=Ld67t2 zqnHHP6nIt1W6n;|k+ie9JPDeGAXekS4bIG=&U6;_>-Ob9@s`F9N85DRTC%Q|EjF`T z(!;2>p=8=>5%ocvGW)H~7Cy4MRo%z!nKcF>fntU!>`f^)9;tDspYR85=h>O%^<#_8 z*>xy!UUU)nu}MC;;IK2dlhU-G;&?}sq+tqE4|P#Dp0v(swS!~PDDE_VtA!~;L$nWA zLSPB>OydN^oFP!dz{b%dMUrwQegfbPmR8N$=*=5DioX*4amN?0T(;$n{wq633FBNG zmLyXH2+ZcDpMk7}Wy$Z?XP0(Lr9K?m0_~=(%d<)(iAf7+c4-n&@k*M;1Wkv$86+)C z6+v>uSilkUp<6{B;gKpd6@vKDftD$t7r&`WN5QMm{60fvofTSz-*ilXD0)FXNoJrO z&>Lts!ipcgO^=}n3uIO#m0qorY=W*DQfV1_1<5oF1%%Q~Uedrf@gFaCWOT+^T=v6D z_O)~q_n6}`R1E`brE|Q7ra=)mp#ZJYG7pnP%V!wim_pPnax4H|p?PMPP92oF8%J>d zoH-@3EP{ZzIROEC0WFa58IGk?FZ@J&TqzPUHNh%1ilELkc?`2c=++Dc1fQXl4wRP7 z4(#I0gr(8}zZoV*gQPoD1UJa3m2vycA6^qY_f*ZlZZ&V*d*7!g_C2zB>Ms6XtWFVq z8a1KI0Kj{CTk3GMMmb9KoOE#2{FkqPs`j6s|JJ>yzp-b>4gI}0e&SQhZvKxqp6j%Z zAFDZg&u2$|d;8dY(WE^8^dGXC#(9EtzK?|yUZyjg#!`Sy>E#~-d< z@W$!H&NrXKa_tEsD7)m+m!RJ*EXXisxvOyN-q75zqPd~5wxNF5szVDGQ8T>gv9K{D zaZs4tW~Y|!&E>|jtCueyN#^#B55*Fh(dE-_&a@DK7k2E8{rq&-!HqxaioUe!z~b)K z@<$p2`yc+otC^pi48QcuT|c@gqTO?@_bz8 z+QSDw^QEqjzj^DC`))e?)K@3|@w%xkxBl+8e|U2C^0wojvyT=3_VurQtLg4twb?U) zXBJ=E5nA!avAew`+sbcxgL3J7Zl_U49`RTSA*0Evr&TZJUvO9an$1J6sr^$lv*bv9aMH>fP8P%^^4FYJw8DAp{Ad2JKOE}dhK${oN^Qc~gGRH7 zjBQ!s818V-RYJ>!Avs^&pRxbr5#X;DMEGNjsq-D-wGV%*^bT~E+lae=H@+cZ0nJ~l z6?}%H?bM5RIoqin=b>Ke#9vx%2HpwS;r!JVeN+AQS>CZKc;mvAf36c4zbQKZ4HA>v za7)k{#~0)doVWO7#pka*I92g=vFOzYE}yEh;Ky;YN`jjfe4+={qgWIq*p!1*67-RG z(6nF3)WUD)Un9+krH#vkewzan|Fp#?G@P zj1DopN1Kt|4q01#Wy;&z2#I>U%Z-WA+5b|=v&T6ho5tAq`8;jGW>9mqSMV&HBS+EG zIfce>Hsw<#;SCRwA!?y94tU@^_s>A3vihefUSBlS*ki_5d z3A?tqIykCqS3X0G@%fiv>3?tE8hnM6aDujB*D!qGbMlOb@1=w22E^&Yz86NdFs4=1 zNUIRxTHJd88(?V@Mr@>&7<)*xnh}3Kr8nT&Kq~}n6teY@vGBg#p*4VuofF?vJ+Pq# l(aDNf4IvVfi0FISkU;qCi@Ly{M(Z>J) literal 0 HcmV?d00001 diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.RLP.dll.meta b/Packages/Sequence-Unity/Plugins/Nethereum.RLP.dll.meta new file mode 100644 index 00000000..a3d62c74 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Nethereum.RLP.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 20de9378e7c1d48fe8d5baa1e69510bc +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + 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/Packages/Sequence-Unity/Plugins/Nethereum.Util.dll b/Packages/Sequence-Unity/Plugins/Nethereum.Util.dll new file mode 100644 index 0000000000000000000000000000000000000000..74a48a3a571e60885810aaad99b2ce7113c42afa GIT binary patch literal 48640 zcmd443w)eK^*28AJiE{CKAYWSlV&$*lJ16HSaNGFZE2yDrcFx&z0ss4DVB7TY};*< zY`UA2meQJVmmimwOGPZSfC38o6Ga6@K|yY!AQu%xET||bC{h&#%Kv-LJp1gXEf;;? z&;RoV_RKkF&YYP!bLPzDd3L*G^)8_cAsqO8@PQEbAf>;#3_lu-Alo1Qj$hpE`AOwH za`8_p+czZAk-=1QeJa);>4^;tB!?p1@knZTAd(n}v@C0j^e21cbv~at$x^+1fe?$O zE}EWv`|p|B4v1qSURf{1x4a?Ko@)y z0D0V3v^)1NBE;IdR65lICb#VX5b9`Vkbu(PT>M{`iuWZUNNp8D*+AUKgbn5jG0!F} z%kOWXTW3CTP)#LYP&V^ejbdq03J~vnB`iy*to2 zN7V@yUq76L4RUiaB#x@aXfYf?OO^xLL@<|#o!DzakMH*DyiT8R?9o z|J6}+vpN`!qF|JJrRllUYCU=!vTC$Ym7aq9V6=*=sMGW)H9B}mR?X9+KA^RlUd0ks zE3C{~kA~K9M?+Pjs9sn8jS*8NYD@>0WaUbSJHrW9>CtM`G`ZF>Wn8s0S_9m11g9)o zORZtuqtJ^62J~bdc+sf<1v0%0Ez_fy0h%dz(x5k(SKVf~lbF+{uTYORAdTp-L9`KA zMMH&4ADfwM0zWzpz*`+WJX7)Ap^iMao}3Pu#xJ<4F4b#YJ7<6>kh;|jJsb_!Cyysh z)Tyd1dUPhz8jZTCTB^#2qcG@Ixw*4Qt^gJ#_o;E|(Gy5PQ1$sM=rh_L$SsiDab*hb zeb8HduHpKSe&@L>8mjcMx!m!?c+nG4d2OA$qQ2&^9Iojw9!panU7-%ID;z!f+z&qZ zAY{AgYAs)q!x~7AMdBcjHZULcC^`-D7$U!;9V+&sm*7qTtvSe54UOyw2)8htH6AV8 zNSHhc`g~y%sz^6Mr&L^$=1p$ zrNJx|(YYv6|EYB6(7@Y^CHl(>#HQXeh<_UGMc}QSB2|S<- zm8pL<>PI{X=)rn#Dj(A!-2$m|R41twWY6lVLNS>K#_CxVE2HWTWzbN0F``@%iqHr~ zI|20iN2sGk^$rgAPOhiXtw+Q))6Z`3rj}5B3%Nd4qQ@Ius%Fa!X!I$_HjP@h;#YfB zO1(C`=sh=YS)l|<)mrT<)YvR+i9)HG?k?LH#Y$pg%-EFCR=W?7pg#CA#)2}U(VSZm z#9UP_uCA)6UK1EXTJ|wsb}!Y?b(lu5-W7~unj2M`!Oq8hmjY%LE-r(aXpm8hSxfMBewmaBZYPj7s zt`xj%u-cg#Mv{cznr8KJOc?Is)k?Y}6OAaYnboG@1_R?`nzfoymD-My2FEt;lg5iR zW>dg&6y0mNiZvwGaO4$g8Gl#`T{QvAvS5;d5!r%ODZQ409?!oTUuNbZ#u_T7X#%re zn6}MfKg$Noz>Zvw2)|l&Jw_`xO}t<*&4FWzmccMohDqUae^sso_v zXc-v)qi0}RnpKTj6w%0to|#L0iil(KMHK55)_ARIW4<*viM7{g#iw$w$tde zD!zVfdz!`_R(1{9KUno~VrP+9sOpum+UhgfEK^3iNbE4PG4JCFu02XY=6zhj*ii~H z@8b$~AEhAkcpbwcNBjE#hZ2M0Lgq_(Q*^Zr2%0a!i)8@{;cvnOkv9$j z@@8w;tOa50Fmz_!1K|wq*94|0uY+pBnAJ5JB8B>^cZBy=YvEq6;p&U7rzT^kX3)Z9 zn3}7vvj7`~4PaXZI_K6uhyXrT5Nn4nFm-ty(1TM8QkSD+seRPD1oy5skE4$jq4ZFb zreW1pJUX@*)nPr!aa3fBRs#(NN=J}soj{hwXv2=Y_V|! z=tFjuBZ?W0*vi{0mz!dxQMDy+J_ z8o;2!RScNZ?MNmeQy}wkkicdiO~DobV`_NQgUFa{twPp{>T;tA7a*5oG}{ad9390; zC&eyHu-0SI)p-^Y-3)bRItA#hZggcf9MLow;ri$h61B0wT5Be^0N5fFbr7yLM$ZOP z`;aTS6{!xr$D+b^7xhi;FHG`%@V6m98`HDv-f7_TbgJ4oc8X|fxj6^<7$P2{Fwy|& zyCMdC{sV=Y`9R*rYkDiN6c!EPAwA02aTkX(0qk86m zX!$@X^cRwTr5k4oHj`VZ;jZqd_Zprn`Htcg z*V?C7WHTb-10lL5^gQi#Lxnpy^}A}n?c{iNSUs>M*U^CrJk+(^I(m+*V*+aLr0OH6 zM08OdIMt$H?%mPzs0~I9 zHmg=8zty7-I4k0fgAtnWw5I~Ok!CnHpQxv(UQ!=;f2pT0Bqd|^m-gATE{$MijQBVT zskw#KPlS%%&g4bV9l5Q}+~d?yG&4pJbP)>K zpJ+{?KTTa96r_%mSXYt&=}S=8Iegtwayddk+2o)W{S0`~O95`49MYrzV^ee=VkWO3 zyYR(NxFmTwWxBxOF*zP}l%TJUOg*2bdY-rINxcu$!8aGFV>Mg~K^J^NHz*|X8OJ3~ zgbu`ufFl)$MDj{V)D)!pfv27X$Z0SY3|&5#Z{-{}Q&Ws6VyRKJO5-Xx`jwm+5o?7w zq^WUq3UrwNKFk)@ok&6I4^(BXo~csZE3wY-yt;zaNyy2`*4PRKf=xNzYE^1GgkVJN z=E)`c&67*5RvucQa>o$xA-uCp>h}fTl2qO0N zl;}G?kL0l8nAG+;>I~Fhj{133G*cJCGVEwxt}k^ZXiQwXTiZ)DBW#%5hCJLp-2eiY zZ=C3yq_OxIM)F1ye4R5icy9Q;)BqxHi-EM#)pcDZKzE5W+GsT zal9@b3KE&z2gT~l{U&rxfUcmacBjEPKLJMz@|76Y?dHyK=?v^=Vo2wGowC?RLQPJ+ zxE+Ul<%LbfT8K-8>pOj(usLmx?y+-Ao9eTMkflLsg*~Ct_o; zDtrpZ4VQpxk>4Q3=I=ysaQL0c{V>e+)xMor&WXH+KD zBVaT-0!Fnoid>${=OHW=xjmuIB98&!tv)B<4tORL9qSdKT$0u+mNVFJCXEdb6He5p zg0awuJ9+IY@9n672tGys+7~R)I?6pQ`MYSq?$OL zkUEjmuqU-ZA!cfsLcFO?h2*7r6yi(uE5x5VTOs+W^9dQDsi9)W3Ft>9{PQV_DbYJ& zn$(pLiGBr`8MztoE7~lxS`7%c|9|3jyka~VVgL`N9qZFQazf0I=Uwd=vwk? zs4QyGJ{>U&YjE-#NQ~&+fL10JAXWb-Dfg|z%8lQNF4Oh{@mQm^jn5Z3OA8JdwE9~+ z32W>ZL5}theDK$IPKS!gwV^3Hu^2cG8ErTqq`!@dCXY}~)J?7T5V#jiQpg*Z9Icr> zJ)9&Ep{G1)w9}ZJ{0^YnSWni2Sap*3fnfxb-$OEm_aPeXzdx+a_99rvE8_@vmDZhl zl)<_jNTUMmGaWm=OJ<3hXroTbP2-U9eI#i(xf#W-wmSL%Fy1?zhO(2W><_>(4SmNC zk>+dB2a(j~0eJ{W^hW?nAvh0%$f$h;_~B|-aq}`;Bu#CR=xp^UsX}G+%n$vfXMX>S zu8$DTjH)@Bjz=a~aE&Ndc^uG~#&T=W7#etZ=O|vS?qm4+v8pc1$Q8y~o+-@At|$5g zot`~bt97!I$6ks73=jS33*Z5Gj;o$>Yv4`+-hfXTKC|&T1)ml8tifjkK52Y*;)BuW z6$@*(_%c4<#ODEgevHr0@p&1aKjZUHd}h86kh+>C<7#SB>a!n*-jo%{LGQ|PKNfu? zD|>YGw^@OsqfV#Y-rA2t&&nMEJ7QFZz9eKiyzUauwx!}T{LAA?^g%V1>q32w?` zVEgnqsB^MU*={1U!H9GRiDEP@LtVX%k-&!GNQwQ2>16r@a$TfCiE>;mr%IBP5T(RH;ReG=N}nRPWk z5U1T%2+Nma1#W^JiuULOJBu-WuSjg1 z>S0X3rrKmA>Zj_SMqyj}tg_4J(>n81gaYX^$Qq%-YCN4{Biel|+8r*rJO(i{L?_dg zhC8@%U(i?G67tZ2A3F<&E7XN2Wi>^H`$`g=yg0NGo79uLx??L{kr8O2>>{Tt)cv$K z;H)uR;mxt9y?BD=^Hen6!)Net37(&!Vv5xi1EW-LDL2o=4#o%uoHtVaAzyV(!0G9L zc5q!~Ys%bZYgTt47ip2B#I?HAy}F}pO~B#J;|jv1jZfn6qD3MSS}E{X{ZQM9;NqBY zCUK7Pno1O9-5lxLsWxPB zq9`j%)3+nkId%{LUQRdx;1z@u06u|m0>HzB6R299N?@{T=aNwNBvmy<TkqZGOY&Xtj+1qLsz+|TekB=}WqeH%O)HuSU{;m-FXWM^nfkFq2hK>a}j zU>AxRtJy-Z5iiX3<8}6zx+*<#06BHXD1P1e>Zr~mSXTfEjAR`>8PpKwPE_Mfy+NYSk|>_~v$b=_3#0KI zxq=#@Xa#m3T2Ku{P}x1mCbyc=8S3GYQT=lYL^Qsi(s%$XsJb=C)AYIjHU5%kmT!UY?64S%kl=`uQ)@X&t89 z(}4qYQ$EIm9gQ^vO}Df0i<(i|&E28BszYo-dtuIiBh=_{R5TQ%ZbQ>jzoGWAH9u)T zLJk!iEW@c{r9HaQ_4Hn}f;#Ewu8!(0 z)@m9zrh}Pr;@Zl4ys8ieJugVd!Rlkxj0`xesHN)mMBjx8Vk$f9ku2{D zv3DsyGQ@=_2psmIxn7HMKSDX@#?o#xxY1j^LF36^Tk@e=Ie(+!>WpF&WG3=5hE@(w zL8BAH<8YPsBs$!sJ?uJY7G=0QxnVB%M!bk)G+vXLyED03)IoQ@kQ0hs+5vN^i$JOwE(PKqckB7Z>|A`e8G56{`BjVEsbg;K?o z7Q@H(X%omDK^4Gl_i1Hty?t6KIURU~Cm1A&Ok5l`1a$pSet~)5a?<+@HBjt|Mh#CVuD8XkS^)kE6Td#mPP!@?B8JJEGoaQB36Ewp>>&*&8w z!u3!GQ5+v|Z@_l|hTDo?qAomthSqRNFRKj~P+Fo*prn+vUV&OvE>)xQ9VHz~ z!codKvwrNkm3}-HTb-@r1+D{m6r&LJd0j>vEYgf?5m%`Rj`4`9?2z=R?GJdY8QdK% zp`L^by4PwY=*e2GbobgSY;8D$y2V*~Ne5@@rRXQeLC2Un9P}jrMO1O4jyfdQfl~$Q zQ0>XsWJ0#R2e`ef@Qk&$UyuF*l-940=XRoD%vG%h8x2<()VECkCyed?E3EIR{ojNB zQ+2$mUm3qyjjQ0~Rf#nf0^=J?m2x$op(O0DuOo}@?$-k%xNAoY$6ZjVUQ7O5V@~=#{H1aLwWN7i3Go>$7G4$Yu1gWsX|UHUC9D z*)pHJo@@V$da`9Q^_&2^;W-c9UCgyxB{rOSwk6z&m^Vvc5e03T@)s}*$M-RMEL%?G z!10OnJm;!fsMX|Y$>-q$LkNszRpYAmpi$$h=*tdQBw*?~mliFe`GGgS=urtD5B1z~ zxL2TZIht^&JB))<|6v^5Pkl&jB}djq&yY&8aR;x4?&j!XZvfs5V*Va3bJZu1x#lP` zx+t>hB3G++W1od*p?Co-`8h7r#$3gXA31$*^YTJvmKx1?jauyrH)fBhD=)S3;jund8Tlp|*HG zw#>{iWvE>rQs#PH>zo{%Isq@a>_zRVzaZG)6>q}%Js|b=9L7<-hez$li;LN>-DLs{ z?>oI(5PeZSF!a3~CsesvnR0P71z*>@!7fLPvE^>aDMx+h`l#C|ccWcS*&(;S8?ACD z!FJ>aS}nd{#j^z8;mXVx*!hY?=50!N2sy~7(OF%Mfkjzso0FenVLtOae>4@bo8i|B zaIq3_USEW_3u+1seo7xOZgvOoIwIawu-+Gd>c;2YY#6%V3KqGlCm8|P^+oQ0JLm~G z0&c4|h0@Iy0(+4w;Bqzo!b8656x0{;LGDX2%|Y%9W8^c`7u!2OrZ0%^;^W6JWQ`xb zQkgRjA3uKCa{t-*Wy`7YGw4|Zy>Es-Bjn))pDPkx7h5r}+H_;}!aEV>ZoH=2IT>$I zyy=E-sxq?=FGGgODRa$@*)o|IlN#woIz#8z=j_wzDt;oKdHSZ`kbD6SV&_iK`H8ko zH|9J)x0&lQPb_xeiV=@5egzFXCeji3EN$El?2sKu&`}&o53z`~c6=Xw$C%?@k;>tv zNZgjyt;RB5tQ2Y6CxNdN1b1MicT{iDwzIzNL|yOITuN_n2kvhj)lJ%Vu4X$?yYXe1 z9mfFCLaYuuL0d27hdQ{B#=@!~eE55rrfOUTgs3J(sJgF6oP0K}1gxF~VTJ8fOV#-F zi|F?`jf%Vs9itaFX-&Yq7IW-=h7UEBXxqs=Y^Wy01Jzx#8sE*C&B0RJJ{kEtsQdiB z+dP^KSu_6{6<`ly~z|WAtL++tQXPf15_5{Kq4qW z-$&38L9`-z<)8F8#2=BKZ0qs57U*D5?q+X+3mcTLn2Y?!3EJ<)vZ3Zv*+wbE3Q(Nt))8DGYLO^M_@G#=+a05fq@ z3|pH!$aKJ8BbZAO3arG&pDZ^u6X@Ve%Xe{x#91BXn| z=PGs-D@L_NMgNT)Th&$RcR`}w_bAbKypQCNaR~4u>YbNU?*|a2dT|azTD${Wd#YEl zqlKzoqEx-`VO_v%0^@ojSe)uXULCTJqxRe%E#~$aWnJmB+rC zbbwCc#AxEnfl(Y0&Dz;oaI(q0hKJ&GXlknO_<9SrYt=99(6$pdPdk^AL&cc)QY*HK zKnV_cnHt!8FM6p2@30kV+o>(&W|St$&1j+$@lps^vxiibT$d+m5*rt_x!kB1%qk(v zX)aF?qx*QP3Jdtf*B=le?2qIO)mFS~!J@W}TG&QpQP_wKY}tqgX@?JV#zr)F+x=j; zwo~3m+lchRM){Peae|G|F}4wLVIxX%Y{Y|_u@ToW)<)D8vJs`Wjfk*p#8q-#xi-pj zKbeili)gwy7>YEy{K@fO9s1LAj8s4|sDa0?4{ti)WV%tzE zF|a;O68EhV;vK}zi7VU0-Djz{i6)-1vK2NL4}qrF^d`>hOLmhm{xpo!8T)Ro_Dlfr zZ`ni_EL8h?d}iQ-BBBe7U*Z!24h!;IN!x&v9Oe+P|RQfZ-2G1!$L;RiLw@t!7>wW<*Dz8U74Do%>Sp|l;(Ii;Ru$(#Hb4MY$nc?xC zSG*cg z2>(gp2T1b# zLc%}r6K;A4)^U6Oz;K??RA`FROTL3z^7AP7ST41QdsobLZ3$8zeayeRfMlKv6TE=? zp5k_Xjp0+A`z-6Zi1E3VBpF5T{Nf7z0^KkE5xPJ(#PeS2(PdofpWF*C_xdHqzrb*Y zoP)A&F@9murm!JSlLXrte!hY<-(E!UwG!&%HrDoeZu6^LdmiI^89u}CM&`c(i;=gz z3TGz|gzsSs(&C;NT3}O`V#JA}`A{J4fOUz2_kvo(dGsqQMEx4Rx&S$b7zNc=vc`Wp zz8&d;bOC< z8`@&!?c}@?u00?|#ZAbISFVBW0^&Sw=W%&T%lRyMJ(nvI7qgb{phu_U4&i?|ua>op z6IU^H71uWo?a6P~YizLh?0?RDt+wc%Scdgrsk<<-h48 zDk6R+Mv(XAGDRKYb}lJ=qC_CC5z)6moC%5~o0$4)v8$A*=}hghsN*H|Z}z7S_>{!a6qcg*Kv#mI zmaRt(hf}M?S#pYShFO#$Mjb{GsL|NSB3u$d{y{gD0>x`I!nJ@ZxHLozwc=fr!%Z}N;4pS9d?=x z;)0L|Fj3|Mylp(;Ly(tZlG|rG#GlPq@rHW7`*z(S{$Uba>Lb{W?;tqD33<2cO>(w2 z4!e#pWTZGN{5o27orCaim6e)?xC>Bv$?VQS)ji`rHCHe%`% z7WGis+lZpiTU3SbZN%PJEoxrrJBYmpEo##ExAEH`vQpr0kC+b1Bm5S1W91?2OUf+j z6_oRep7o8!a*i+aqM4WFBR4E5n6=v-o!h{r6d z4OFT4vqiam%k}Zrx9Kku50x#~%S8P|Rqnyk<$AezO;J3472++MT47cQ_av4?UZ)ur zA)8ujR*Hp+a=)Q(z;C=QW$JwQzx94lXIOc+RaD8zqRYy=yTXYZ*9}a)Du)7TbBegw zrnZ{LirZB=@kl`8&gpE<^P`_bnw|I8^XF&atsfWdTUR_p;>yB0Bc7(1ptHrBKJuG&Ft~G0L@j-bH zi-(<6vQ{)Qwa0yN`SoV4Xtt^SW}P_ArfxH*ici_pSIm0xO^dp^{BFdwpW4)S%trAC zn|i=(;+Om2k?yO@A2Fv1A1;3s^%HZt7;jV0m@~vgi@LJx1@m|@#iF!=7tEQW*`ltf zc)^?{mRZy&s1w8*iyAC=**sCKv#1k5og{{s+AZ#JylkENGK(E;~`K+W)$_L=0F|F{owY zc14NDTz@l97Y8lsVb?q63NgEe%Iy|Es1V+Ev4N>QVrt=S<|^@oMfF5H-ZR9sTCPF# zL;~JUv6rcfFw*n1GsWMT+Fi1xxWv0gjH^?U&b)F^8<@IURFqBjt`&c^^2lGh#WA>? zK&!>fib-0Jm}^nbnGN1vvB{#YbI$Uv6ZhR8lOms2hW8yo2J?7Ijkj8gEMMwWtlChQw1AbtesmN-`&Wa?G9)Rpp{E7}{W97VTtygNm&MLq01&pRS6 zWJ<-sQ9)n7!l=xE!~+&pTzG@`N^#JlLZEhuNz+w1t?&!p z-C`M27l|kHcI#J(ZkxKpd$pkN)nwXvjX2vX*PZuu?=|8IOY#NhZhepVf=%7w{j9*E zZ}LUwxyzlM9PLt+l8YXHniAVvnM* z=FG|airCN8MPhf}67wtKQH#1TGC%LDqI@=Kp}af1|0~)p>YKsc`q#veqIgBPOPtG; zYS~@l5~lWuWscUoyTn5_)tz^@C_72D?2f!c;@hHuDdjKsh&d|H{j=~$-aTTK$`eDr z3qh^3sVnlnBevMob$R!Ri!JI&-~PPsi>qzw_PhtgEjIP_ydR2hFf}UvmiOJfhr~lx zUY+*`c|Q_!PFB4w_1-2Q76TUbT=`>pkBAYQdOGhh@l}gD*Y~TuAB*qX)bI0tA`aNp z8+lI(ZLZRJuJ7-8KNE#E^+DbU;WaUxDK(m} ziRFqCrrVvS98_+A&gm>Lz1{0`rrME-m#_ps;N zhA#gsrYK4ddaFRyTh!lO4d$Oki$(p_)#ZCbEVHP0eCvIG75z*-B;WB3`2Hq7XXQ;T zm*OAdHjDaQUX}cZxSOd_@j$r~dF3rs`=}@}ocR9QHB4O~rZ~EM?}(NKly`x+XZ+c| zcg1~7jfzq1X5SYtE>wAEdAoe?i@{Tf8Wj=84xf;BThu{(Q(BYHT2xU1QBxL?^PzCt-{Q}_Cc zE8A@<;-4yaTGZ*V zOQXEZrf&32lY1@d3E1U$dAm*B>6MESN&J>WY@mMl|kIbMI% zH&@QKsV9BSa-BuJ54*I;PutW>z6El>P5s_?ihRPRj`N=?-?6D_{$;XexvHTBHd`TE zZR((}O?KJTyS|ljt4-y1!Ab(_2J^n%YqDB4M=<%oIA1zAwd;CLk{0gd% zv~2QkkqtJL_HUJonA$CNmbLlMkwZ3hrvF^I-==!}JLMBLwaGss-?6E*|2#RVP1W$8 zcf0=rxz(Z`c8>Zlly}03(inAc2h*QT`m@5!werMug`_sfSYYSiDP|3J2Ms&cx! zCjWlglv?qAD!*sty&ajJ|5N!)PTrI9S9acR{Ym-ToV=&(8s3ha znE#agQ;y`%HGD?;6y<3OcY-Rn@?`NsNOoD&{Ne%Rt!GNr_l&&2%A@+8l}}g{)%UD?Y7Nye zDqg`2-?Q@1Oug*6cEYm!XXQafaqZ8_cdb0C{aNXthd*f9P2>J$JS*EQifVsWp2?Kj zc|0rEGo@_(tW1u{+dd}m{4se~j>-EhQ|IHo$0g>oa$io~bMiJTuSLvqJ|~~Z$@{r{ z*2+6Woap+w40TbfRa<^8!%Urz=Tx(tKbI{zdB2d0tvo9C3%QG_mt}KAieJbttR*ck z%SzYnpzgLP%KN2!G?vYy=VDT{j{i8QiRVg>E`#5R!c&J=U6lK$2;r|(68?GL(dAWL zxuq1|qV2}Jpg^~CN!ucCwk4~J3b02yJD)hmmSuBS z7iDFX{Qq6pUQTTr1(f2G;7gq(KYiRMmH#9&cbe#A3+Li51<6C!u@B^WW-hM0G?zo3rir_`oeIAPUagBldyZ&A zakhakg@U<~523#qJKV>8!EaQ8^Cs(5@P6PL?((zzcR6>RL7ZE|1bRn ziJ&HKU*YWU72amf`+{q*RNk&Jt zhve0GIRt5Q3eqM;Zv6j$1y{4_!{*fgZGMDT4VtaF_2%N5P%_FsYBWC#e-O6KtiLJ( ztmT;V$?@NCwEs8HSyk$zIh3mjCI6p};B8o;{yQH~rE;zG;dq!Mq=K~KOFSFT!Uo<| zHn==^=IRwOeEfJ9WjsC;@Sepn_?FqH@JnBp;hA9_zR}i*XMl}(es70%xQe(Oujtnq@c6M6E2pm}T0T|0ULQ7oRBZ;*-Sl;1u9gL9O}>*P93UJ@l69 zdP}|^cm!}xGEIlDdzvM zBqReGJqaz<9&?o=cYhH{ey?m2;Pbd$mD+bI>j0;hHvoRU@@?om5Fz+=K&kCQEyrop zl9$EB<#XiAc=px;n66w5_=i9%_z(KKfbXi@1b6`;$)iVNG=H&du<&E@DYw{9aIk>N zK3u$8-o#I7rS^FEI@I2UHoS~yv$ugy&tzw5Z~DFt&ei1)$mj9G=OchL%Fm014$jKT%YfhL zx{76P1pHgzD#sVl=KCP&DgU8EY8&!jb==9ey_4VW`I+{f%j>*be5s_$c_-f*+{f~p zns#;gQs)!kpQk+`G(6LOh)cbtZE{`Vl-dja&pCgfW<6wZ z-hiLq>ZI|y(@B1Nmouhqa{d7L1@P^+YT;7TB)!eFSkn7h?Xu2z-L+Y|$GzpcSN_V;DyB(#%jq%s zkmEgYD)0kVk73Ce=YC8c%XlSjbXr)$r&vP^%lq*L;@{nVyu|*V+l^mrKHcNT+jgrw zZZTJ^@n~Y3cmZ&f;pKpCaT8?RuvRzVJ7PWHd!i3e$jyKbxdqTIw*%(M5x@d@A>cT9 zDPW1b60lre0~nE?1Dqsp1dPgC0Bhv!fc5e#fYapH0cXl@1J0KB0nU{_0Bn&D11^$3 z23#zk0$eVi1H4JT2>6D4*;6Q<*Qjl8XjImz6Kr7E%J6iCoeX0P6AU*q+{W-ioiyxb zcmv?EShKej)?sa5@2SJPo)_oW;aj1*04Iw71*{hL05&l^QG6fxe8x{>*e0F^=S=Y) zV2@}isKc*sEeA}C3k&9p?a(#kZKcDgQE&O~T3vXf0EzG$EZxBTbA7svh z%y|%;WrYX0g}-GeB(+w`{}FEnB8*o`s%tLe&5W;Qe1zfo4EHmPxXJq*uhcniY^8UB`` zZm>MV`3&hh821+(FsVl2B^Y5i!tepS7xAM41S;Y)oXc=6!x4u289u=907Ky;`4->j z0ecx9@U#AWg8TEY76%LVGae~m%>jaQ8Lkab3+EORXD!2rib+od|1xNG;6P=OyeD5A zLomW{E<-VqISfaR{T1Z*Gd#dh;LA+Vz;G_ZwG2lX?q?{DV;P2X8LnkG!tg-V+hS>8 zZS~vY#=!n+l03k0(#+2TmzewXEzkmayj&?$a;qGb7s^ZJjq)pq6GixEG-hFM(5vmz zZq@G89?%}uUecsKS3gZ(sqfV9&>z>I)_s>n7L3t}?fYowXNd zf$=ycPQVE-g4?Gm+&xue|10noZYNHBhxD@mAFk*DToqmq_*}RT@Vmxlz{Ux~fCCe@ z0sgXLhlOi+uUd!R$GVqn!wN9VDlVd$f}QzoRu{r+**t8RGlEr(lnb_p0%J^N=_fbNdSMdGWvaM^}^D z&oz%;pqJ~P)t}VwcKp+EjB}xLyYqbKN~6O#(>TlcuJH@wH^v|E!-1vvSL&Kw8(h0w zcesAx`i-l`{m!!jR&|WfIUHAN_``*sXmiuM?zq&m|C-&KaZ{6(BK%bMrU<2(l7ye? zz5w?<^owJbsA;?`Y!FfKMYnO&HT@`0c;x;LZSt{+5bwbNN+P z+F_-ut@JD_U2CP?R@!T&8?Cg@O5e3oT`Il#RvNIta57d8hq|^-XfoKzAIigmf`cZyvX&oyw4TT zT<(B2&7H@;NG!U#+J<67iJse4ATiXwZ7|-JI46EmW4)L?XI59&v@Rg?V|_it zeX*hVqF8#v!c?+vkkUyN&0A0gfU6k~6b+shYgMG1W z^ZR1ybbVL-+M}==vTV+u7aQu?FsB#Fk0xE;)o?U+LzYeX3x@}KkSrbU>x*^w#eufY zPxcSSQW+Pl1lVpEa*TTd=tgmldgP6CVt3BDZ zvUOmnsZlJ>CEAk~w>_zH*;n>KA)^Ni`uvzoH1n{wJU zV_HtTK-fJ6x+I=jA8$|6Fp(=v&neb0Bc~XM_3@#umF){>qWmlrO!f}<#pj6G%TtLh z@Z#3~!M=EZe1Kd(InWXxiY5Beb40UHHXs|#TfoGOX*op0j2xn=k%+~)ViuvqKrCtQ zXkD^$N!Ps2_675owJhjrYhArSw6!<4FF?Vir?f8;%Ui|L_|S%UDn8s_w_@>fvAA{K zisluaUCS3Y&tI@;+2WQ3D@4b#6=L;*70bGsTUu5uXluhioy{ca?P^}JqPbHnShBpm zlPj_qTVj2~@vbh>+#3^%WBuJo$RBHo7_Onc1S zfuSRFtfn53(LB&APD#Z8dlOp{y>TGRQ}IDcVFF4L1HJLBE0V)N2jWBNA;`v3y<$Zi zQLra2TGJGgmZi?vkQj=$4HB!ZF9CQ;e5iGR#DS;c>)<4W4I~N9p3~ITl}-+)lpKYK z`S{1+#k^Q|H%uvrfo80u{w_fzARekq3}lFYiwRS%hz%fjesXZzvULilm7ooV0GlVB zXpe0|LkG4bDal4n(VC5!qLt!$GELD`v?_BCF|m$Kuke=SFy*fph9CCF+31U4k1UH8 zAd7?k6UFO|l4-+0L6pX}xo>?kl^EL4zckh#7tN_SIzk~2F0vusX7M;}!HjQ5WuiT~ zn8KrluN+7q!lo^H*#H{N-bxE%dO`<`4G`4X0F_u|`lNZe`D%A4|stoVj_Rx9#i%mbdm~+veeT{2cUg`3A~dmRit< zWFaCtTB4?1j*;t>z0t4KHY_@jSrMlm#YL>|?AW$+dkPC4nk#x>yac8;yaVgQrj>(? z&&ON?3kwYi4G^9p&=+4fv;vbK=O*-NO)C(BB>J z?TzP8m+*P(`U-WO3`Jd|exY;?TAg zSp3r2n$_^I@QQd}Y%60q`I(k2Phr{Y8OkZRxQ)v8ky~fEE%Ba2f2Fe%|F|wX~))yQ(ZN(-5jOHn1(5VMPz-4<))2w5Q7Es;EmlDS=%UEg_7P z*PcEcAC8Oe#8A3*K;aZhcn0&VMbuOTrW6pKG>8*Jiivo%U}!^@9=3C~Pz=C41W2Tp z#@EB7TQFsLI%EEA7#`R}n`(;aEs6E<^bk`^DK7RAUqy4mT4}9Vw$6&iqI=o8byz-!9Y(Ev1WZHY*-envwVnh5N`Mf3V^7k zt!JCXXdCWMtE~7|>^Dhx=`dz_$_nblAR9Js!M=%RDfo8i66s736Uo$itVf7!!ahH! zpwno@>Xm7zqE^$=MJrZTP*E6ogqX28n2%WOc`wcx-I?<7txPY84Q=4TTpS-*4-_`1 zDza4W7+Ty`8g@h`wS6-E5`!fyj2GKw!$WAZ#Tkg7ZDD5 zmvxk#;Ii(GI3{7g9q&7=^@0Y0xnQ5<#bH|fvzR$237%=K z17cnh@jo_jSnqSYEyzmPpABFVVpOqE4sf+?*oiWdnfT0Dk{A#R5-@KZ$f-#HY{z=A zUL^m=;fg~bBPYNWRByj54 zM$>(D92{#QNyjm;e0stBUmxe`%lXvY)- zh`=v{LxRrhyJYsoVfHhHsq=Y`JE-HlpZ-o#lpP z@4Vqe9~H-B=}k~*$S~9xWT@G5hPt}CE!l;A$z+Oy93(jq|;r>TUR0;=7jC>|?xd7>w&FdC0cHU>qZ3*-Gm7Mf%YY+bc#whdy=uS-Df zIzA3%X$WO5j6@51Oe3)<-Un}`p}-Lm#^mML@|+ZhQo0Em!?3Q6)Xh>R$R2*fLq~<6~jCI*iml4DMWA-N$Yo9X*cNIg{ne{){PfOS*(2&!z!>X(6 zp-Ss|II%n$I>+Al30$tK&D>#pnq|C~IgF3{nT(;ZPotX{n{G+OaM;8i4lG38ws=o+ zpf}A!*N!t@Uxs0C(9}k6**a@Lm(vY}tu3>Qq-mB)VgyrLa8GeWHn}C8|LlBqEW%!o zHU?=c%C!w`!?A=;!0pMVMl!8MG&Ih%DTNI1?sM5XMcHkoY2BPwObn|++HgLx&~Dbb zA-J9ZLgp%uOfP4dKSCH{OhM*fwHY z9;Ys+(6c(4PHEAj?z0ZFVp{aawjRObxtSJc;QERUibX1oeT%)jrL9kzwrIS{W+`0a zpwS$0=++S4LLaqbfP1Cu?9*miWUps(n6@Zpc+OcNN5Y!==vNMtdYD5ZP*~wMhlz&J zFxWNZWLew39FAo}T1wDnY>N20-L`Gc4I>38J4~jtTL)`QF)wm0!h6QtMJJuPZ&G1Z zm9it@5k;v7W2YE~A@c-e>!ckSxB$?6`B7j|w#?MXgSG}f~+wd2j^Euhr_gExOe zyk}E-xIa_4HT_{Zw%Q|$9M0jTCr4xd;LtW}7oX0sv)!@WE0fWSOUdLm+FxZjt?A~0 z1*9X(z=rKGUd-xYx@#c5J~PLZ7o|nI3)g~&Gwt)bx=cx18&A4<#EBgf6T2RqadA(b z$;x4<8|isCgW5-Y!s$?IMHfV{#Cjrg*BvXUSvi=KxWeIsWUMbEO-qr5!{;n4jjb)# zZrr0~I4Eo7^{Q&rwmGNuv`NFD@$t&;!C2;^*cQI2gcz=e(ALame0kq66a3r)=oSQT zdO%0f3D>?cg`*fYNbo@Rw2b3eqlAg5%x`TsL}s^c*%{N2`YzOg4fmY1MbAXFoSA1Y zvxqEpE8-Xqir9;BM@T6-H_k#J+BPKC;nWL^?hi$pNRn8QSid1FswkFKXo|DZZ#n=Z zdJ;oq1H=M_)BU}Qek!Q+@}tS-?&OyE;zU1$$=ZJ2Ya^l-GMh^$ z!y~hK=R1VGF=t`?(P3;D=@!_+5Tl5J*pZIYv4XF7u}xEJc`k={Oj$<86%dheGZSB+ zo*u6x2>U^S2m^=*MObxI zv{NgP=<2Z$JZTuhH3EQ&QixnQ>RFyh=LouTz^z@*-h)=poE$5tFefp9`z?VRNJ^Gq zDlUz0wawa2_!e%)%Aua6$+N|Be3rzvj@__`Zr&u|(l5R>yR=fJG((Bmo+N11tCpWM zaatMTsm%~k3kK47wgL>tMclsO0Z2a@l%=6DOSIs!ds}u5Cg0?!df0xOg9@Lv~?T49#=26;;k0pq*R== z9KS?~J8Aq|q-lJTVgT>lY`}Z?X`~oez;5u@<3BtQVjks^6m(3aGV4Jl1n#Awg>r`Q zZY^;Wz|#04OdZz+sMiX7xf#Ee6vHp%4nv;^#L*sSVxSHeKK~TNOQEiO@qc)wxWw6oay84c2`w;p_T9fFLYU=`*hv+;O6rMytJ_(6_;MDKt zF;f3kO%p#}uQ;v=Z!yguqx1^4TY%kJoq$us`5?%NvhKL;t&NlQ94;Im1YT+V$wjRZnJ;*0Z#4sM@U6~Og zOT}RKI7Tc9oOF;Msv2bI==y2&(kRylJs(!%CmFr5I>bpw(>j0_#nG)lR)p}V2R0zz z#_j~L8~wy=a!$e$x08&lQzPXe(6yh%2k{U#=4PPt4esOergf)16QSh>#zoXqg3D*O6&PQk)OdV zx_B&Yam$Xzwel)IJkOFi_TwZhx!O-AXGu5xC(>4#S^s$%tK`Z5ZAq(qS1ab3ip2@` zv|-Q`vm+LlB6JNX#Y^-2qe#~ao|-!pZ7F)64N01lN%(dIaiJbi~V4Rqqx9oPmT zCQ~fQ?PE&NoS|BCR-t8T9%bTob}hk6PCV1PA%8Y&-vEr_7}(0ne%D+&n|*5g{G;*U;QffIu;!egc{^qDjA>xvkFP!j;kw*eU%+aba8r zYTOa0bUHmAj{)Jrkqeoc>jt39iN0JqJrThfMZy^og(IJHf%+2ON=0@j z5|hc|!X46?$8rFd%OXL<<>0o`4=4c&r4Sg|bJRya&<;dZ+R_`9ryCY>Bgqp^%5~Gn?Q%IPoKCmf=W?)WIV#!ZH~i-a3>qKOqw{7gI`v{6EKC8`2$ zF5w9-%m|^wKm2HV;RZ0_AL#JNR{|qqDW4#*3P)Q} zHEN^|+(}+c2BXQK8Fm-Z67U4pL~fCTO*Y_zkS*lNc80F@Swo?d}` z)1=AzBQ!zd@;@??qCqOs@DMg3T)A5al!qGSo${ACM zk{fx9jPoNn9Yv_}lJNzaHT5$!aP|Z-K{`xGAr4@KfK>QBE)uy9O(qqTdda>&!ar_Q zIC3v~gzV9Nu)$IbJx8Y0|7SP1E6`x#u#x z{0C3>W(ab74^2uBCMCIy#Qgu-JO9`yjw_DOp4aCy=B{Tu zAs~F+9**Pl9q;sLOvl=asLN|V!lwi1aJ?@7MTLVus29hKnVwfgr^8tVfG|b z%BF|K>fkneF;!Hae_mi3>8DHlm>VWyD-o`el;b$@Nv4#c<3X#IUj(%rCg34@LBN2> zx1|N+l~PiidCn)VJb$tx|FY1CM#)ycd&9y?QtXs;Qe>PQlM01Ydwh~Zhb6(M0Z1D3 zvX4|X6_ARg5nxNrkrkA8LN?w_{izk`l%+`M74F^BPlaELE!n?KXI z+PveK6V9gDRj+J3n)>aFKi~Dnlii=#vZ8J4gI}8V#n<0Cu{gK)oAnnS`PN-;?|6F0 zgm+g}Mt|~~xszYXKD2blt?|ld&uk0rnz*@W=kls^d#k=O@7uLcec{5))`y#(jeq{F zXU45K+Is%fxj$Z9GC%&w&ey)Sv-8(~IkSD@htAd?I$rYh{<=x;ypipA_wc^3_wJ+J z^E^fPzva5xB^34^OI`D6?LFdh9XVo!%Q!c#5?y+R;iCmO9LHc>wxb%iR1Ob!#^q28 z<8n@haXHMw@R1fAHisFPa~zDzQ5A;Gi8z&Vv?wQZK3B^O!oN6-kAvL&F%EOY35a#o}Hz zz&2YR6#^BFa+e&G!WbzP8xToWEhw*xOWBkBEhf{-VdhGvCKNqM29#aRVjc*(g%?0$ zkvNb-LMAenIgCuWXEDKvL~)c1*s0Bf-|f{2GbHbW$9s4vBs%yr&03H%J(jJ1U}k z-(&B6Y<%1)3d9^rh+meJ#HfryI+G1jPZ)+G)lyVZJxl#S{s`PrlDNff>5nJ}pAINs zg(M;AF(uXXFF(2879n4E)FM;BLq^CV1I8i~Z2pMQf+{E<2?Eg|Fg6HqBW%_EF#`1J z^8P5YQT|x#qei1>8iT~ck-&n_d3Aq@w6MMDsDLi_8f{ami%nH7(zdKj{m4o1b*vC> zL|%zHP?0?4;gRS^62-c~PN@fhM*;ONHh@!~;u;FJgd#SzIFcx}ebv@c<`u>BiLo310`b8*}imSuRr^{Kt)Dja*Xqdwi z8Y;%9ZVN$-dTgxJ=25MUmDw1zsKEfq1DCup3BINRJy68B!?WC!5>Hz~i7;P=5djo| z#pn~w$9eBX4(WngefnyIqK`li(ES(%1(S31?n z%eIA%nUHL~r5%fr-FsB$uQi=}Z#tQRir6(Hn;HDgnc7uTt|HYznQB1!NJu!7OgASn z1!NpE!wc7DW~Wo>?o>l(Q#LcJYh^am+??%fXl`h1Zpfq{A~%x|mod$biL&oW%Od** zHrz3=dTP(wwQC0F%$R|(zGvOaWVWw&#z;F0Au>3k?f>h=pp-z0<~A}4>V02 z33M6w)mFsR-ei}l2m4FS^^Qs0F_^2K7OaV$R?V6@Rwq{51-+eJ#@z0hC6{3yy*{S) zDqCIIg<5;{y>R~tKD)j3U*W58I4+~<(apL0XJ1oxtleSoQd{yQ+bvD6!`VrS#f?sKco-&mgd?zP>$*WNdN z`mx_d(kG7%XaBxv>DYza#((%nZIcg-JKH{Y`0Gm!KK`?VudRRK^mB(+e(rA@4p*Ju ze|G-&pBVGY&+N=^Uf()p=QrxEdt&hMm)cI9!H%`%#M{-2FZOJuvS0i#-cB z9*;isQsoVA?Y{VjvQ0CW?0W9__e8_%TPN=^&TUIY`ThLgJjVaW%JD7@HECJX_^*4O z|2{80aHWu4dM#^fX`A=zgzcvv`PIV5X8rZm#k;THE*v+{>7f4%40f=7IXBRfySJmI zFKbsV4|dq@-!am6ItB-_g_!Nq9jyHajFq*6xsH1ZI|dnmmq8}ibgeXPi{_^rn@m8* zRG$von)=6m;fX_`yLU|-d}iih+7n#ASGYQejrNBxf#WNaH}?&+tX_Q^i_T2%V3r-1 zxullk>$-RYI4n#4gc3E3YWo1pi^Dwc+Zv>>xG^2DSV<2^)X)RFR z`|K+*ZMHClhp!Aa1$e+2bmE7sg|ecmjt#V^(^^VB{056a2$%q83va<$YH90|-L*hV zH3gEqVJyHd2X+AH0!#*oG?uuetsOoy;yLG)dSxdVz?T)VKtU_1o^3L)*d_VKpK4tV zjxJnpG}KrcWsSJYVo;0L&=$|$+(QXthum~(V~QPt^EfLjr|f$JW);*1SF5G%b{~g0 zE7}4+C?kv)FRg*x256YWc_UU!~gUe_P)3KriSbPuMZpt{s}TODir_# literal 0 HcmV?d00001 diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.Util.dll.meta b/Packages/Sequence-Unity/Plugins/Nethereum.Util.dll.meta new file mode 100644 index 00000000..82b50423 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Nethereum.Util.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 817e298eb67b64c7d8069be55026f218 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + 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/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs index dba0b27b..7dca3148 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using System.Numerics; using System.Text; using Newtonsoft.Json; @@ -8,6 +9,8 @@ using Sequence.Utils; using UnityEngine; using UnityEngine.Scripting; +using Nethereum.ABI.EIP712; +using Nethereum.Util; namespace Sequence.EcosystemWallet.Primitives { @@ -310,111 +313,268 @@ public TypedDataToSign(Address wallet, Chain chain, Parented payload) } } + // Todo clean up this AI slop + // Todo replace Nethereum public byte[] GetSignPayload() { - _types = types.GetKeys(); - SortTypes(); - - StringBuilder logBuilder = new StringBuilder(); - logBuilder.Append($"GetSignPayload for TypedDataToSign: {ToString()}\n"); - logBuilder.Append("GetSignPaylod calculations -----\n"); - - logBuilder.Append("Sorted types:"); - foreach (string type in _types) + try { - logBuilder.AppendLine($" {type}"); + // Use Nethereum's EIP-712 encoder + var eip712TypedDataEncoder = new Eip712TypedDataEncoder(); + byte[] encodedTypedData; + + // Check if we have salt data to determine which domain type to use + if (domain.salt?.Data != null && domain.salt.Data.Length > 0) + { + // Convert to Nethereum's TypedData format with salt + var nethereumTypedDataWithSalt = ConvertToNethereumTypedDataWithSalt(); + encodedTypedData = eip712TypedDataEncoder.EncodeTypedData(nethereumTypedDataWithSalt); + } + else + { + // Convert to Nethereum's TypedData format without salt + var nethereumTypedData = ConvertToNethereumTypedDataWithoutSalt(); + encodedTypedData = eip712TypedDataEncoder.EncodeTypedData(nethereumTypedData); + } + + Debug.Log($"EIP-712 encoded payload: {encodedTypedData.ByteArrayToHexStringWithPrefix()}"); + + return SequenceCoder.KeccakHash(encodedTypedData); + } + catch (Exception ex) + { + Debug.LogError($"Error encoding EIP-712 data: {ex.Message}"); + throw; } - - logBuilder.Append("\n"); - - string encodeType = CalculateEncodeType(); - logBuilder.Append($"Encode type: {encodeType}\n"); - - byte[] encodeData = CalculateEncodeData(); - logBuilder.Append($"Encode data: {encodeData.ByteArrayToHexStringWithPrefix()}\n"); - - string hashedEncodeType = SequenceCoder.KeccakHashASCII(encodeType); - logBuilder.Append($"Hashed encode type: {hashedEncodeType}\n"); - - byte[] hashStruct = SequenceCoder.KeccakHash( - ByteArrayExtensions.ConcatenateByteArrays( - hashedEncodeType.HexStringToByteArray(), - encodeData - ) - ); - logBuilder.Append($"Hash struct: {hashStruct.ByteArrayToHexStringWithPrefix()}\n"); - - logBuilder.Append($"Domain {domain.ToString()}\n"); - byte[] domainSeparator = domain.GetDomainSeparator(); - logBuilder.Append($"Domain separator: {domainSeparator.ByteArrayToHexStringWithPrefix()}\n"); - - byte[] signablePayload = ByteArrayExtensions.ConcatenateByteArrays( - SequenceCoder.HexStringToByteArray("0x19"), - SequenceCoder.HexStringToByteArray("0x01"), - domainSeparator, - hashStruct - ); - logBuilder.Append($"Signable payload: {signablePayload.ByteArrayToHexStringWithPrefix()}\n"); - - byte[] hashedMessage = SequenceCoder.KeccakHash(signablePayload); - logBuilder.Append($"Final hashed message: {hashedMessage.ByteArrayToHexStringWithPrefix()}\n"); - - string log = logBuilder.ToString(); - Debug.Log(log); - - return hashedMessage; } - - private void SortTypes() + private TypedData ConvertToNethereumTypedDataWithSalt() { - int typesCount = _types.Length; - if (typesCount == 0) + // Convert domain using Nethereum's DomainWithSalt + var nethereumDomain = new Nethereum.ABI.EIP712.DomainWithSalt() { - throw new ArgumentException($"Must have at least one entry in {nameof(types)} dictionary"); + Name = domain.name, + Version = domain.version, + ChainId = domain.chainId, + VerifyingContract = domain.verifyingContract, + Salt = domain.salt.Data + }; + + // Convert types to Nethereum format + var nethereumTypes = new Dictionary(); + + // Add the required EIP712Domain type definition with salt + var domainMembers = new List + { + new MemberDescription { Name = "name", Type = "string" }, + new MemberDescription { Name = "version", Type = "string" }, + new MemberDescription { Name = "chainId", Type = "uint256" }, + new MemberDescription { Name = "verifyingContract", Type = "address" }, + new MemberDescription { Name = "salt", Type = "bytes32" } + }; + + nethereumTypes["EIP712Domain"] = domainMembers.ToArray(); + + foreach (var typeEntry in types) + { + var members = new MemberDescription[typeEntry.Value.Length]; + for (int i = 0; i < typeEntry.Value.Length; i++) + { + members[i] = new MemberDescription + { + Name = typeEntry.Value[i].name, + Type = typeEntry.Value[i].type + }; + } + nethereumTypes[typeEntry.Key] = members; } - List newTypes = new List(); - newTypes.Add(primaryType); - Array.Sort(_types); - for (int i = 0; i < typesCount; i++) + // Convert message to proper format + var convertedMessage = ConvertMessageForNethereum(); + + return new TypedData + { + Domain = nethereumDomain, + Types = nethereumTypes, + PrimaryType = primaryType, + Message = convertedMessage + }; + } + + private TypedData ConvertToNethereumTypedDataWithoutSalt() + { + // Convert domain using Nethereum's Domain (without salt) + var nethereumDomain = new Nethereum.ABI.EIP712.Domain() + { + Name = domain.name, + Version = domain.version, + ChainId = (int)domain.chainId, + VerifyingContract = domain.verifyingContract.ToString() + }; + + // Convert types to Nethereum format + var nethereumTypes = new Dictionary(); + + // Add the required EIP712Domain type definition without salt + var domainMembers = new List { - if (_types[i] == primaryType) + new MemberDescription { Name = "name", Type = "string" }, + new MemberDescription { Name = "version", Type = "string" }, + new MemberDescription { Name = "chainId", Type = "uint256" }, + new MemberDescription { Name = "verifyingContract", Type = "address" } + }; + + nethereumTypes["EIP712Domain"] = domainMembers.ToArray(); + + foreach (var typeEntry in types) + { + var members = new MemberDescription[typeEntry.Value.Length]; + for (int i = 0; i < typeEntry.Value.Length; i++) { - continue; + members[i] = new MemberDescription + { + Name = typeEntry.Value[i].name, + Type = typeEntry.Value[i].type + }; } - newTypes.Add(_types[i]); + nethereumTypes[typeEntry.Key] = members; } - - _types = newTypes.ToArray(); + + // Convert message to proper format + var convertedMessage = ConvertMessageForNethereum(); + + return new TypedData + { + Domain = nethereumDomain, + Types = nethereumTypes, + PrimaryType = primaryType, + Message = convertedMessage + }; } - - private string CalculateEncodeType() + + private MemberValue[] ConvertMessageForNethereum() { - StringBuilder encodeType = new StringBuilder(); - int typeCount = _types.Length; - for (int i = 0; i < typeCount; i++) + var memberValues = new List(); + + // Get the primary type definition to ensure correct ordering + if (!types.TryGetValue(primaryType, out NamedType[] namedTypes)) { - string type = _types[i]; - encodeType.Append(type); - encodeType.Append("("); - foreach (var namedTypes in types[type]) + Debug.LogError($"Primary type '{primaryType}' not found in types dictionary"); + return memberValues.ToArray(); + } + + // Process fields in the order they appear in the type definition + foreach (var namedType in namedTypes) + { + if (!message.TryGetValue(namedType.name, out object value)) + { + Debug.LogError($"Field '{namedType.name}' not found in message for type '{primaryType}'"); + continue; + } + + object convertedValue; + + // Skip null values for bytes32 and other non-nullable types + if (value == null) + { + if (namedType.type == "bytes32" || namedType.type == "address" || namedType.type.StartsWith("uint")) + { + Debug.LogError($"Null value found for non-nullable type '{namedType.type}' in field '{namedType.name}'"); + continue; + } + } + + Debug.Log($"Converting field '{namedType.name}' of type '{namedType.type}' with value: {value}"); + + // Handle different value types for Nethereum compatibility + if (value is string strValue) + { + // Check if it's a hex string that should be converted to BigInteger + if (strValue.StartsWith("0x")) + { + // Convert based on the specific type + if (namedType.type == "uint256") + { + convertedValue = BigInteger.Parse(strValue.Substring(2), System.Globalization.NumberStyles.HexNumber); + } + else if (namedType.type == "bytes32") + { + // Convert bytes32 hex string to byte array + convertedValue = strValue.HexStringToByteArray(); + } + else + { + // Keep as hex string for other types (address, bytes) + convertedValue = strValue; + } + } + else if (BigInteger.TryParse(strValue, out BigInteger bigIntValue)) + { + convertedValue = bigIntValue; + } + else + { + convertedValue = strValue; + } + } + else if (value is Address[] addresses) + { + convertedValue = addresses.Select(addr => addr.ToString()).ToArray(); + } + else if (value is EncodeSapient.EncodedCall[] calls) + { + convertedValue = calls.Select(ConvertCallForNethereum).ToArray(); + } + else if (value is byte[] bytes) { - encodeType.Append(namedTypes.type); - encodeType.Append(" "); - encodeType.Append(namedTypes.name); - encodeType.Append(","); + convertedValue = bytes.ByteArrayToHexStringWithPrefix(); } - encodeType.Remove(encodeType.Length - 1, 1); // remove last comma - encodeType.Append(")"); + else + { + convertedValue = value; + } + + Debug.Log($"Converted field '{namedType.name}' to: {convertedValue}"); + + memberValues.Add(new MemberValue + { + TypeName = namedType.type, + Value = convertedValue + }); } - - return encodeType.ToString(); + + Debug.Log($"Created {memberValues.Count} member values for type '{primaryType}'"); + return memberValues.ToArray(); } - - private byte[] CalculateEncodeData() + + private Dictionary ConvertCallForNethereum(EncodeSapient.EncodedCall call) + { + return new Dictionary + { + ["to"] = call.to.ToString(), + ["value"] = call.value, + ["data"] = call.data, + ["gasLimit"] = call.gasLimit, + ["delegateCall"] = call.delegateCall, + ["onlyFallback"] = call.onlyFallback, + ["behaviorOnError"] = call.behaviorOnError + }; + } + + private string GetFieldType(string fieldName) { - return _payload.GetEIP712EncodeData(); + // Find the field type in the primary type definition + if (types.TryGetValue(primaryType, out NamedType[] namedTypes)) + { + foreach (var namedType in namedTypes) + { + if (namedType.name == fieldName) + { + return namedType.type; + } + } + } + return "string"; // default fallback } } } \ No newline at end of file From 4919b6ad2c5157ae10c96436665184d12ec43e99 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 5 Jun 2025 17:20:10 -0400 Subject: [PATCH 042/165] Fix our conversion of Calls payloads into a type that nethereum can understand, adding some unit tests in the process. --- .../SequenceEcosystemWalletTests.asmdef | 3 +- .../UnitTests/NethereumConversionTests.cs | 429 ++++++++++++++++++ .../NethereumConversionTests.cs.meta | 11 + .../Primitives/Payload/TypedDataToSign.cs | 113 ++--- 4 files changed, 487 insertions(+), 69 deletions(-) create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef b/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef index c2a09c02..5b5c0eb6 100644 --- a/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef +++ b/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef @@ -20,7 +20,8 @@ "allowUnsafeCode": false, "overrideReferences": true, "precompiledReferences": [ - "Newtonsoft.Json.dll" + "Newtonsoft.Json.dll", + "Nethereum.ABI.dll" ], "autoReferenced": true, "defineConstraints": [ diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs new file mode 100644 index 00000000..12875fb4 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs @@ -0,0 +1,429 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using System.Reflection; +using NUnit.Framework; +using Sequence.ABI; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; +using UnityEngine; +using Nethereum.ABI.EIP712; + +namespace Sequence.EcosystemWallet.UnitTests +{ + public class NethereumConversionTests + { + private Address[] _testAddressArray = new Address[] + { + new Address("0x04b8b03dba0d960415ce5177accf9d399ed852eb"), + new Address("0xb4cb75becc7d6c25a8815d3a31d997105772d12b"), + new Address("0x6aa42b1d0f63dae3a5bf785101c2d2bf26679463") + }; + + [Test] + public void TestConversionToNethereumWithCallsPayload() + { + // Arrange + Address fromWallet = new Address("0xd0B2e0C7b8a2D267733B573Bdc87cC73f551b8A4"); + Chain chain = Chain.LocalChain; + + Parented parented = new Parented(_testAddressArray, + new Calls(BigInteger.Parse("1266736520029721018202413622017"), BigInteger.Parse("55846603721928660"), + new Call[] + { + new Call(new Address("0x6810c263f45be5dc8e8e6ffd2ab9bd6f152412ed"), + BigInteger.Parse("19035696402805033763977015876"), + "0xf51267fb7a1ff020a04971203a2f57eb5ab06b45dcf3e824145375ab46af51334f823837f90c2d459f147b3fb3ea6e07a4af02201f85aa995aec66e632" + .HexStringToByteArray(), BigInteger.Parse("29"), false, true, BehaviourOnError.abort), + new Call(new Address("0x7fa9385be102ac3eac297483dd6233d62b3e1496"), BigInteger.Parse("0"), + "0x001122".HexStringToByteArray(), BigInteger.Parse("1000000"), false, false, + BehaviourOnError.ignore), + })); + + TypedDataToSign typedData = new TypedDataToSign(fromWallet, chain, parented); + + var convertedWithoutSalt = CallConvertToNethereumTypedDataWithoutSalt(typedData); + + Assert.IsNotNull(convertedWithoutSalt); + Assert.AreEqual("Calls", convertedWithoutSalt.PrimaryType); + Assert.IsNotNull(convertedWithoutSalt.Types); + Assert.IsNotNull(convertedWithoutSalt.Message); + Assert.IsTrue(convertedWithoutSalt.Types.ContainsKey("EIP712Domain")); + Assert.IsTrue(convertedWithoutSalt.Types.ContainsKey("Calls")); + Assert.IsTrue(convertedWithoutSalt.Types.ContainsKey("Call")); + + // Validate message structure thoroughly + var message = convertedWithoutSalt.Message; + Assert.AreEqual(4, message.Length, "Calls message should have exactly 4 fields"); + + // Find each field by TypeName and validate + var callsField = Array.Find(message, m => m.TypeName == "Call[]"); + Assert.IsNotNull(callsField, "Should have Call[] field"); + Assert.IsInstanceOf(callsField.Value, "Call[] value should be MemberValue[][]"); + var callsArray = (MemberValue[][])callsField.Value; + Assert.AreEqual(2, callsArray.Length, "Should have 2 calls"); + + // Validate first call structure + var firstCall = callsArray[0]; + Assert.AreEqual(7, firstCall.Length, "Call should have exactly 7 fields"); + + // Validate call field structure (each field is a MemberValue) + var toField = Array.Find(firstCall, f => f.TypeName == "address"); + Assert.IsNotNull(toField, "Call should have 'to' field with address type"); + Assert.IsInstanceOf(toField.Value, "Call 'to' should be string"); + + var dataField = Array.Find(firstCall, f => f.TypeName == "bytes"); + Assert.IsNotNull(dataField, "Call should have 'data' field with bytes type"); + Assert.IsInstanceOf(dataField.Value, "Call 'data' should be byte[]"); + + // Validate counts of field types (3 uint256, 2 bool, 1 address, 1 bytes) + Assert.AreEqual(1, firstCall.Count(f => f.TypeName == "address"), "Call should have exactly 1 address field"); + Assert.AreEqual(1, firstCall.Count(f => f.TypeName == "bytes"), "Call should have exactly 1 bytes field"); + Assert.AreEqual(3, firstCall.Count(f => f.TypeName == "uint256"), "Call should have exactly 3 uint256 fields"); + Assert.AreEqual(2, firstCall.Count(f => f.TypeName == "bool"), "Call should have exactly 2 bool fields"); + + // Validate uint256 fields have BigInteger values + var uint256Fields = firstCall.Where(f => f.TypeName == "uint256").ToArray(); + foreach (var field in uint256Fields) + { + Assert.IsInstanceOf(field.Value, "All uint256 fields should have BigInteger values"); + } + + // Validate bool fields have bool values + var boolFields = firstCall.Where(f => f.TypeName == "bool").ToArray(); + foreach (var field in boolFields) + { + Assert.IsInstanceOf(field.Value, "All bool fields should have bool values"); + } + + var gasLimitField = Array.Find(firstCall, f => f.TypeName == "uint256" && IsCallGasLimitField(firstCall, f)); + Assert.IsNotNull(gasLimitField, "Call should have 'gasLimit' field with uint256 type"); + Assert.IsInstanceOf(gasLimitField.Value, "Call 'gasLimit' should be BigInteger"); + + var delegateCallField = Array.Find(firstCall, f => f.TypeName == "bool" && IsCallDelegateCallField(firstCall, f)); + Assert.IsNotNull(delegateCallField, "Call should have 'delegateCall' field with bool type"); + Assert.IsInstanceOf(delegateCallField.Value, "Call 'delegateCall' should be bool"); + + var onlyFallbackField = Array.Find(firstCall, f => f.TypeName == "bool" && IsCallOnlyFallbackField(firstCall, f)); + Assert.IsNotNull(onlyFallbackField, "Call should have 'onlyFallback' field with bool type"); + Assert.IsInstanceOf(onlyFallbackField.Value, "Call 'onlyFallback' should be bool"); + + var behaviorOnErrorField = Array.Find(firstCall, f => f.TypeName == "uint256" && IsCallBehaviorOnErrorField(firstCall, f)); + Assert.IsNotNull(behaviorOnErrorField, "Call should have 'behaviorOnError' field with uint256 type"); + Assert.IsInstanceOf(behaviorOnErrorField.Value, "Call 'behaviorOnError' should be BigInteger"); + + var spaceField = Array.Find(message, m => m.TypeName == "uint256" && IsSpaceField(message, m)); + Assert.IsNotNull(spaceField, "Should have space field with uint256 type"); + Assert.IsInstanceOf(spaceField.Value, "Space value should be BigInteger"); + + var nonceField = Array.Find(message, m => m.TypeName == "uint256" && IsNonceField(message, m)); + Assert.IsNotNull(nonceField, "Should have nonce field with uint256 type"); + Assert.IsInstanceOf(nonceField.Value, "Nonce value should be BigInteger"); + + var walletsField = Array.Find(message, m => m.TypeName == "address[]"); + Assert.IsNotNull(walletsField, "Should have wallets field with address[] type"); + Assert.IsInstanceOf(walletsField.Value, "Wallets value should be string[]"); + var walletsArray = (string[])walletsField.Value; + Assert.AreEqual(3, walletsArray.Length, "Should have 3 wallet addresses"); + + // Log detailed information + Debug.Log($"Message validation passed. Fields found:"); + foreach (var member in message) + { + Debug.Log($" Field: TypeName={member.TypeName}, Value type={member.Value?.GetType()}, Value={member.Value}"); + } + } + + [Test] + public void TestConversionToNethereumWithMessagePayload() + { + // Arrange + Address fromWallet = new Address("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"); + Chain chain = Chain.LocalChain; + + Parented parented = new Parented(_testAddressArray, + new Message(new byte[] + { + 194, 99, 244, 91, 229, 220, 142, 142, 111, + 253, 42, 185, 189, 111, 21, 36, 18, 237, + 182, 97, 17, 182, 245, 110, 57, 164, 44, + 105, 68, 5, 129, 240, 232, 111, 245, 18, + 103, 251, 122, 31, 240, 32, 160, 73 + })); + + TypedDataToSign typedData = new TypedDataToSign(fromWallet, chain, parented); + + // Act & Assert + var convertedWithoutSalt = CallConvertToNethereumTypedDataWithoutSalt(typedData); + Assert.IsNotNull(convertedWithoutSalt); + Assert.AreEqual("Message", convertedWithoutSalt.PrimaryType); + Assert.IsNotNull(convertedWithoutSalt.Types); + Assert.IsNotNull(convertedWithoutSalt.Message); + Assert.IsTrue(convertedWithoutSalt.Types.ContainsKey("EIP712Domain")); + Assert.IsTrue(convertedWithoutSalt.Types.ContainsKey("Message")); + + // Validate message structure thoroughly + var message = convertedWithoutSalt.Message; + Assert.AreEqual(2, message.Length, "Message payload should have exactly 2 fields"); + + // Find and validate message field + var messageField = Array.Find(message, m => m.TypeName == "bytes"); + Assert.IsNotNull(messageField, "Should have message field with bytes type"); + Assert.IsInstanceOf(messageField.Value, "Message value should be hex string"); + var messageHex = (string)messageField.Value; + Assert.IsTrue(messageHex.StartsWith("0x"), "Message should be hex string with 0x prefix"); + + // Find and validate wallets field + var walletsField = Array.Find(message, m => m.TypeName == "address[]"); + Assert.IsNotNull(walletsField, "Should have wallets field with address[] type"); + Assert.IsInstanceOf(walletsField.Value, "Wallets value should be string[]"); + var walletsArray = (string[])walletsField.Value; + Assert.AreEqual(3, walletsArray.Length, "Should have 3 wallet addresses"); + + // Log detailed information + Debug.Log($"Message payload validation passed. Fields found:"); + foreach (var member in message) + { + Debug.Log($" Field: TypeName={member.TypeName}, Value type={member.Value?.GetType()}, Value={member.Value}"); + } + } + + [Test] + public void TestConversionToNethereumWithConfigUpdatePayload() + { + // Arrange + Address fromWallet = new Address("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"); + Chain chain = Chain.LocalChain; + + Parented parented = new Parented(_testAddressArray, + new ConfigUpdate("0x6810c263f45be5dc8e8e6ffd2ab9bd6f152412edb66111b6f56e39a42c694405")); + + TypedDataToSign typedData = new TypedDataToSign(fromWallet, chain, parented); + + // Act & Assert + var convertedWithoutSalt = CallConvertToNethereumTypedDataWithoutSalt(typedData); + Assert.IsNotNull(convertedWithoutSalt); + Assert.AreEqual("ConfigUpdate", convertedWithoutSalt.PrimaryType); + Assert.IsNotNull(convertedWithoutSalt.Types); + Assert.IsNotNull(convertedWithoutSalt.Message); + Assert.IsTrue(convertedWithoutSalt.Types.ContainsKey("EIP712Domain")); + Assert.IsTrue(convertedWithoutSalt.Types.ContainsKey("ConfigUpdate")); + + // Validate message structure thoroughly + var message = convertedWithoutSalt.Message; + Assert.AreEqual(2, message.Length, "ConfigUpdate payload should have exactly 2 fields"); + + // Find and validate imageHash field + var imageHashField = Array.Find(message, m => m.TypeName == "bytes32"); + Assert.IsNotNull(imageHashField, "Should have imageHash field with bytes32 type"); + Assert.IsInstanceOf(imageHashField.Value, "ImageHash value should be byte[]"); + var imageHashBytes = (byte[])imageHashField.Value; + Assert.AreEqual(32, imageHashBytes.Length, "ImageHash should be exactly 32 bytes"); + + // Find and validate wallets field + var walletsField = Array.Find(message, m => m.TypeName == "address[]"); + Assert.IsNotNull(walletsField, "Should have wallets field with address[] type"); + Assert.IsInstanceOf(walletsField.Value, "Wallets value should be string[]"); + var walletsArray = (string[])walletsField.Value; + Assert.AreEqual(3, walletsArray.Length, "Should have 3 wallet addresses"); + + // Log detailed information + Debug.Log($"ConfigUpdate payload validation passed. Fields found:"); + foreach (var member in message) + { + Debug.Log($" Field: TypeName={member.TypeName}, Value type={member.Value?.GetType()}, Value={member.Value}"); + } + } + + [Test] + public void TestConversionToNethereumWithSalt() + { + // Arrange + Address fromWallet = new Address("0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f"); + Chain chain = Chain.LocalChain; + + // Create a domain with salt + var saltData = new byte[32]; + for (int i = 0; i < 32; i++) saltData[i] = (byte)i; // Fill with test data + var salt = new FixedByte(32, saltData); + + var domain = new Sequence.EcosystemWallet.Primitives.Domain("Sequence Wallet", "3", chain, fromWallet, salt); + var types = new Dictionary + { + ["ConfigUpdate"] = new[] + { + new NamedType("imageHash", "bytes32"), + new NamedType("wallets", "address[]") + } + }; + var message = new Dictionary + { + ["imageHash"] = "0x6810c263f45be5dc8e8e6ffd2ab9bd6f152412edb66111b6f56e39a42c694405", + ["wallets"] = _testAddressArray + }; + + TypedDataToSign typedData = new TypedDataToSign(domain, types, "ConfigUpdate", message); + + // Act & Assert + var convertedWithSalt = CallConvertToNethereumTypedDataWithSalt(typedData); + Assert.IsNotNull(convertedWithSalt); + Assert.AreEqual("ConfigUpdate", convertedWithSalt.PrimaryType); + Assert.IsNotNull(convertedWithSalt.Types); + Assert.IsNotNull(convertedWithSalt.Message); + Assert.IsTrue(convertedWithSalt.Types.ContainsKey("EIP712Domain")); + Assert.IsTrue(convertedWithSalt.Types.ContainsKey("ConfigUpdate")); + Assert.IsNotNull(convertedWithSalt.Domain.Salt); + + // Validate message structure thoroughly + var messageData = convertedWithSalt.Message; + Assert.AreEqual(2, messageData.Length, "ConfigUpdate payload should have exactly 2 fields"); + + // Find and validate imageHash field + var imageHashField = Array.Find(messageData, m => m.TypeName == "bytes32"); + Assert.IsNotNull(imageHashField, "Should have imageHash field with bytes32 type"); + Assert.IsInstanceOf(imageHashField.Value, "ImageHash value should be byte[]"); + var imageHashBytes = (byte[])imageHashField.Value; + Assert.AreEqual(32, imageHashBytes.Length, "ImageHash should be exactly 32 bytes"); + + // Find and validate wallets field + var walletsField = Array.Find(messageData, m => m.TypeName == "address[]"); + Assert.IsNotNull(walletsField, "Should have wallets field with address[] type"); + Assert.IsInstanceOf(walletsField.Value, "Wallets value should be string[]"); + var walletsArray = (string[])walletsField.Value; + Assert.AreEqual(3, walletsArray.Length, "Should have 3 wallet addresses"); + + // Validate domain salt + Assert.AreEqual(32, convertedWithSalt.Domain.Salt.Length, "Domain salt should be exactly 32 bytes"); + + // Log detailed information + Debug.Log($"ConfigUpdate with salt payload validation passed. Fields found:"); + foreach (var member in messageData) + { + Debug.Log($" Field: TypeName={member.TypeName}, Value type={member.Value?.GetType()}, Value={member.Value}"); + } + } + + [Test] + public void TestMessageConversionForCallsPayload() + { + // Arrange + Address fromWallet = new Address("0xd0B2e0C7b8a2D267733B573Bdc87cC73f551b8A4"); + Chain chain = Chain.LocalChain; + + Parented parented = new Parented(_testAddressArray, + new Calls(BigInteger.Parse("100"), BigInteger.Parse("200"), + new Call[] + { + new Call(new Address("0x1234567890123456789012345678901234567890"), + BigInteger.Parse("1000"), "0x1234".HexStringToByteArray(), + BigInteger.Parse("50000"), false, false, BehaviourOnError.ignore) + })); + + TypedDataToSign typedData = new TypedDataToSign(fromWallet, chain, parented); + + // Act & Assert + var convertedMessage = CallConvertMessageForNethereum(typedData); + Assert.IsNotNull(convertedMessage); + Assert.Greater(convertedMessage.Length, 0); + + // Verify we have the expected fields for Calls + Assert.IsTrue(Array.Exists(convertedMessage, m => m.TypeName == "Call[]")); + Assert.IsTrue(Array.Exists(convertedMessage, m => m.TypeName == "uint256")); + Assert.IsTrue(Array.Exists(convertedMessage, m => m.TypeName == "address[]")); + + // Validate message structure thoroughly + Assert.AreEqual(4, convertedMessage.Length, "Calls message should have exactly 4 fields"); + + // Find and validate calls field + var callsField = Array.Find(convertedMessage, m => m.TypeName == "Call[]"); + Assert.IsNotNull(callsField, "Should have Call[] field"); + Assert.IsInstanceOf(callsField.Value, "Call[] value should be MemberValue[][]"); + var callsArray = (MemberValue[][])callsField.Value; + Assert.AreEqual(1, callsArray.Length, "Should have 1 call"); + + // Validate call structure + var call = callsArray[0]; + Assert.AreEqual(7, call.Length, "Call should have exactly 7 fields"); + + // Validate call has all required field types + Assert.IsTrue(Array.Exists(call, f => f.TypeName == "address"), "Call should have address field"); + Assert.IsTrue(Array.Exists(call, f => f.TypeName == "bytes"), "Call should have bytes field"); + Assert.AreEqual(3, call.Count(f => f.TypeName == "uint256"), "Call should have exactly 3 uint256 fields"); + Assert.AreEqual(2, call.Count(f => f.TypeName == "bool"), "Call should have exactly 2 bool fields"); + + Debug.Log($"Message conversion validation passed. Converted message has {convertedMessage.Length} members"); + foreach (var member in convertedMessage) + { + Debug.Log($" Field: TypeName={member.TypeName}, Value type={member.Value?.GetType()}, Value={member.Value}"); + } + } + + // Helper methods using reflection to access internal methods + private TypedData CallConvertToNethereumTypedDataWithoutSalt(TypedDataToSign instance) + { + var method = typeof(TypedDataToSign).GetMethod("ConvertToNethereumTypedDataWithoutSalt", + BindingFlags.NonPublic | BindingFlags.Instance); + return (TypedData)method.Invoke(instance, null); + } + + private TypedData CallConvertToNethereumTypedDataWithSalt(TypedDataToSign instance) + { + var method = typeof(TypedDataToSign).GetMethod("ConvertToNethereumTypedDataWithSalt", + BindingFlags.NonPublic | BindingFlags.Instance); + return (TypedData)method.Invoke(instance, null); + } + + private MemberValue[] CallConvertMessageForNethereum(TypedDataToSign instance) + { + var method = typeof(TypedDataToSign).GetMethod("ConvertMessageForNethereum", + BindingFlags.NonPublic | BindingFlags.Instance); + return (MemberValue[])method.Invoke(instance, null); + } + + // Helper methods to identify space and nonce fields since they have the same type + private bool IsSpaceField(MemberValue[] message, MemberValue field) + { + // Space should be the first uint256 field in the Calls struct order + var uint256Fields = message.Where(m => m.TypeName == "uint256").ToArray(); + return uint256Fields.Length >= 1 && uint256Fields[0] == field; + } + + private bool IsNonceField(MemberValue[] message, MemberValue field) + { + // Nonce should be the second uint256 field in the Calls struct order + var uint256Fields = message.Where(m => m.TypeName == "uint256").ToArray(); + return uint256Fields.Length >= 2 && uint256Fields[1] == field; + } + + private bool IsCallValueField(MemberValue[] call, MemberValue field) + { + return field.TypeName == "uint256" && + call.Any(f => f.TypeName == "uint256" && f.Value.Equals(field.Value)); + } + + private bool IsCallGasLimitField(MemberValue[] call, MemberValue field) + { + return field.TypeName == "uint256" && + call.Any(f => f.TypeName == "uint256" && f.Value.Equals(field.Value)); + } + + private bool IsCallDelegateCallField(MemberValue[] call, MemberValue field) + { + return field.TypeName == "bool" && + call.Any(f => f.TypeName == "bool" && f.Value.Equals(field.Value)); + } + + private bool IsCallOnlyFallbackField(MemberValue[] call, MemberValue field) + { + return field.TypeName == "bool" && + call.Any(f => f.TypeName == "bool" && f.Value.Equals(field.Value)); + } + + private bool IsCallBehaviorOnErrorField(MemberValue[] call, MemberValue field) + { + return field.TypeName == "uint256" && + call.Any(f => f.TypeName == "uint256" && f.Value.Equals(field.Value)); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs.meta new file mode 100644 index 00000000..c190cc29 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9b70393f60bd34b17a2db8c5e45b3feb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs index 7dca3148..4e276866 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -313,50 +313,45 @@ public TypedDataToSign(Address wallet, Chain chain, Parented payload) } } - // Todo clean up this AI slop - // Todo replace Nethereum public byte[] GetSignPayload() { - try + // Use Nethereum's EIP-712 encoder + var eip712TypedDataEncoder = new Eip712TypedDataEncoder(); + + // Check if we have salt data to determine which domain type to use + bool hasSalt = domain.salt?.Data != null && domain.salt.Data.Length > 0; + + byte[] encodedTypedData; + if (hasSalt) { - // Use Nethereum's EIP-712 encoder - var eip712TypedDataEncoder = new Eip712TypedDataEncoder(); - byte[] encodedTypedData; - - // Check if we have salt data to determine which domain type to use - if (domain.salt?.Data != null && domain.salt.Data.Length > 0) - { - // Convert to Nethereum's TypedData format with salt - var nethereumTypedDataWithSalt = ConvertToNethereumTypedDataWithSalt(); - encodedTypedData = eip712TypedDataEncoder.EncodeTypedData(nethereumTypedDataWithSalt); - } - else - { - // Convert to Nethereum's TypedData format without salt - var nethereumTypedData = ConvertToNethereumTypedDataWithoutSalt(); - encodedTypedData = eip712TypedDataEncoder.EncodeTypedData(nethereumTypedData); - } - - Debug.Log($"EIP-712 encoded payload: {encodedTypedData.ByteArrayToHexStringWithPrefix()}"); - - return SequenceCoder.KeccakHash(encodedTypedData); + // Convert to Nethereum's TypedData format with salt + var nethereumTypedDataWithSalt = ConvertToNethereumTypedDataWithSalt(); + encodedTypedData = eip712TypedDataEncoder.EncodeTypedData(nethereumTypedDataWithSalt); } - catch (Exception ex) + else { - Debug.LogError($"Error encoding EIP-712 data: {ex.Message}"); - throw; + // Convert to Nethereum's TypedData format without salt + var nethereumTypedData = ConvertToNethereumTypedDataWithoutSalt(); + encodedTypedData = eip712TypedDataEncoder.EncodeTypedData(nethereumTypedData); } + + return SequenceCoder.KeccakHash(encodedTypedData); } - private TypedData ConvertToNethereumTypedDataWithSalt() + internal TypedData ConvertToNethereumTypedDataWithSalt() { + if (domain.salt == null || domain.salt.Data == null || domain.salt.Data.Length == 0) + { + throw new ArgumentException("Domain salt is required for EIP-712 with salt."); + } + // Convert domain using Nethereum's DomainWithSalt var nethereumDomain = new Nethereum.ABI.EIP712.DomainWithSalt() { Name = domain.name, Version = domain.version, - ChainId = domain.chainId, - VerifyingContract = domain.verifyingContract, + ChainId = (int)domain.chainId, + VerifyingContract = domain.verifyingContract.ToString(), Salt = domain.salt.Data }; @@ -400,8 +395,8 @@ public byte[] GetSignPayload() Message = convertedMessage }; } - - private TypedData ConvertToNethereumTypedDataWithoutSalt() + + internal TypedData ConvertToNethereumTypedDataWithoutSalt() { // Convert domain using Nethereum's Domain (without salt) var nethereumDomain = new Nethereum.ABI.EIP712.Domain() @@ -411,7 +406,7 @@ public byte[] GetSignPayload() ChainId = (int)domain.chainId, VerifyingContract = domain.verifyingContract.ToString() }; - + // Convert types to Nethereum format var nethereumTypes = new Dictionary(); @@ -439,10 +434,10 @@ public byte[] GetSignPayload() } nethereumTypes[typeEntry.Key] = members; } - + // Convert message to proper format var convertedMessage = ConvertMessageForNethereum(); - + return new TypedData { Domain = nethereumDomain, @@ -452,10 +447,10 @@ public byte[] GetSignPayload() }; } - private MemberValue[] ConvertMessageForNethereum() + internal MemberValue[] ConvertMessageForNethereum() { var memberValues = new List(); - + // Get the primary type definition to ensure correct ordering if (!types.TryGetValue(primaryType, out NamedType[] namedTypes)) { @@ -523,7 +518,19 @@ private MemberValue[] ConvertMessageForNethereum() } else if (value is EncodeSapient.EncodedCall[] calls) { - convertedValue = calls.Select(ConvertCallForNethereum).ToArray(); + // Convert each call to a MemberValue[] representing the Call struct + var callMemberArrays = calls.Select(call => new MemberValue[] + { + new MemberValue { TypeName = "address", Value = call.to.ToString() }, + new MemberValue { TypeName = "uint256", Value = call.value }, + new MemberValue { TypeName = "bytes", Value = call.data.HexStringToByteArray() }, + new MemberValue { TypeName = "uint256", Value = call.gasLimit }, + new MemberValue { TypeName = "bool", Value = call.delegateCall }, + new MemberValue { TypeName = "bool", Value = call.onlyFallback }, + new MemberValue { TypeName = "uint256", Value = call.behaviorOnError } + }).ToArray(); + + convertedValue = callMemberArrays; } else if (value is byte[] bytes) { @@ -546,35 +553,5 @@ private MemberValue[] ConvertMessageForNethereum() Debug.Log($"Created {memberValues.Count} member values for type '{primaryType}'"); return memberValues.ToArray(); } - - private Dictionary ConvertCallForNethereum(EncodeSapient.EncodedCall call) - { - return new Dictionary - { - ["to"] = call.to.ToString(), - ["value"] = call.value, - ["data"] = call.data, - ["gasLimit"] = call.gasLimit, - ["delegateCall"] = call.delegateCall, - ["onlyFallback"] = call.onlyFallback, - ["behaviorOnError"] = call.behaviorOnError - }; - } - - private string GetFieldType(string fieldName) - { - // Find the field type in the primary type definition - if (types.TryGetValue(primaryType, out NamedType[] namedTypes)) - { - foreach (var namedType in namedTypes) - { - if (namedType.name == fieldName) - { - return namedType.type; - } - } - } - return "string"; // default fallback - } } } \ No newline at end of file From 9895e819881ab05c933e9431d879cbc0fc64fe00 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 9 Jun 2025 11:36:42 -0400 Subject: [PATCH 043/165] Change how we get minimum bytes needed such that tests are now passing --- .../EcosystemWallet/Primitives/Payload/TypedDataToSign.cs | 1 + .../Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs index 4e276866..74062c47 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -313,6 +313,7 @@ public TypedDataToSign(Address wallet, Chain chain, Parented payload) } } + // Todo replace nethereum (introduced after commit 871466dbc7faf88f1201f963af6a372c59263d2f in commit d44d3bedfcbe875f2e5edc335e1d143bfb1358d3) - I think we were close with our own implementation so worth looking at it, even if only as a reference public byte[] GetSignPayload() { // Use Nethereum's EIP-712 encoder diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs index 39848e15..4b8d7582 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs @@ -17,7 +17,11 @@ public static string BigIntegerToHexString(this BigInteger value) public static int MinimumBytesNeeded(this BigInteger value) { - return (int)Math.Ceiling(value.ToString("X").Length / 2.0); + if (value == 0) return 1; // Special case: 0 needs 1 byte + + // Use the same method as ByteArrayFromNumber to ensure consistency + byte[] bytes = value.ToByteArray(isUnsigned: true, isBigEndian: true); + return bytes.Length; } } } From 043254095cac49a6302d448f0ed178c0b0573bb6 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 9 Jun 2025 14:32:54 -0400 Subject: [PATCH 044/165] Cleaner Calls.Encode implementation --- .../Primitives/Payload/Call.cs | 123 ++++++++++++++ .../Primitives/Payload/Calls.cs | 151 ++++++------------ .../SequenceSDK/Utils/BigIntegerExtensions.cs | 7 +- 3 files changed, 178 insertions(+), 103 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs index d7bab164..cc93cabe 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs @@ -73,6 +73,129 @@ public override string ToString() return $"Call {{ to: {to}, value: {value}, data: {dataHex}, gasLimit: {gasLimit}, " + $"delegateCall: {delegateCall}, onlyFallback: {onlyFallback}, behaviorOnError: {behaviorOnError} }}"; } + + internal byte[] Encode(byte[] outBytes, Address self) + { + int flags = SetFlags(self); + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, flags.ByteArrayFromNumber(1)); + outBytes = SetToAddress(outBytes, flags); + outBytes = SetHasValue(outBytes, flags); + outBytes = SetData(outBytes, flags); + outBytes = SetGasLimit(outBytes, flags); + return outBytes; + } + + /// + /// Set flags in this format + /// call flags layout (1 byte): + /// bit 0 => toSelf (call.to == this) + /// bit 1 => hasValue (call.value != 0) + /// bit 2 => hasData (call.data.length > 0) + /// bit 3 => hasGasLimit (call.gasLimit != 0) + /// bit 4 => delegateCall + /// bit 5 => onlyFallback + /// bits [6..7] => behaviorOnError => 0=ignore, 1=revert, 2=abort + /// + /// + /// + private int SetFlags(Address self) + { + int flags = 0; + if (self != null && self.Equals(to)) + { + flags |= 0x01; + } + + if (value != BigInteger.Zero) + { + flags |= 0x02; + } + + if (data != null && data.Length > 0) + { + flags |= 0x04; + } + + if (gasLimit != BigInteger.Zero) + { + flags |= 0x08; + } + + if (delegateCall) + { + flags |= 0x10; + } + + if (onlyFallback) + { + flags |= 0x20; + } + + flags |= (int)behaviorOnError << 6; + + return flags; + } + + private byte[] SetToAddress(byte[] outBytes, int flags) + { + // If toSelf bit not set, store 20-byte address + if ((flags & 0x01) == 0) + { + byte[] toAddressBytes = to.Value.HexStringToByteArray(); + if (toAddressBytes.Length != 20) + { + throw new SystemException($"Invalid '{nameof(to)}' address {to}, must be 20 bytes long but got {toAddressBytes.Length} bytes"); + } + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, toAddressBytes); + } + + return outBytes; + } + + private byte[] SetHasValue(byte[] outBytes, int flags) + { + // If hasValue, store 32 bytes of value + if ((flags & 0x02) != 0) + { + byte[] valueBytes = value.ByteArrayFromNumber().PadLeft(32); + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, valueBytes); + } + + return outBytes; + } + + private byte[] SetData(byte[] outBytes, int flags) + { + // If hasData, store 3 bytes of data length + data + if ((flags & 0x04) != 0) + { + if (data == null) + { + throw new SystemException($"If ({nameof(flags)} & 0x04) != 0, then {nameof(data)} cannot be null"); + } + int callDataLength = data!.Length; + if (callDataLength > 0xffffff) + { + throw new ArgumentException($"{nameof(data)} is too large, length cannot exceed 0xffffff, given {callDataLength.ToHexadecimal()}"); + } + // 3 bytes => up to 16,777,215 + byte[] callDataLengthBytes = callDataLength.ByteArrayFromNumber(3); + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, callDataLengthBytes, data); + } + + return outBytes; + } + + private byte[] SetGasLimit(byte[] outBytes, int flags) + { + // If hasGasLimit, store 32 bytes of gasLimit + if ((flags & 0x08) != 0) + { + byte[] gasBytes = gasLimit.ByteArrayFromNumber().PadLeft(32); + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, gasBytes); + } + return outBytes; + } public string Hash() { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs index 91ae886f..b1761882 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs @@ -105,6 +105,21 @@ public byte[] Encode(Address self = null) $"{nameof(nonce)} is too large, need {nonceBytesNeeded} bytes to represent it, but max is {MaxNonceBytes}"); } + int globalFlag = SetGlobalFlag(nonceBytesNeeded, (uint)callsLength); + + // Start building the output + // We'll accumulate in a Bytes object as we go + byte[] outBytes = globalFlag.ByteArrayFromNumber(1); + outBytes = SetSpaceBytes(outBytes); + outBytes = SetNonceBytes(outBytes, nonceBytesNeeded); + outBytes = StoreCallsLength(outBytes, callsLength); + outBytes = EncodeCalls(outBytes, callsLength, self); + + return outBytes; + } + + private int SetGlobalFlag(int nonceBytesNeeded, uint callsLength) + { /* globalFlag layout: bit 0: spaceZeroFlag => 1 if space == 0, else 0 @@ -128,10 +143,20 @@ public byte[] Encode(Address self = null) { globalFlag |= 0x10; } + + if (GetCallsCountSize(callsLength) > 1) + { + globalFlag |= 0x20; // We need more than one byte for the calls count + // bit [5] => callsCountSizeFlag: 1 => 2 bytes, 0 => 1 byte + } + return globalFlag; + } + + private int GetCallsCountSize(uint callsLength) + { /* If there's more than one call, we decide if we store the #calls in 1 or 2 bytes. - bit [5] => callsCountSizeFlag: 1 => 2 bytes, 0 => 1 byte */ int callsCountSize = 0; if (callsLength != 1) @@ -143,34 +168,43 @@ public byte[] Encode(Address self = null) else if (callsLength < MaxCalls) { callsCountSize = 2; - globalFlag |= 0x20; } else { throw new ArgumentException($"{calls} is too large, cannot have more than {MaxCalls} calls, given {callsLength}"); } } - - // Start building the output - // We'll accumulate in a Bytes object as we go - byte[] outBytes = globalFlag.ByteArrayFromNumber(1); - + return callsCountSize; + } + + private byte[] SetSpaceBytes(byte[] outBytes) + { // If space isn't 0, store it as exactly 20 bytes (like uint160) if (space != BigInteger.Zero) { byte[] spaceBytes = space.ByteArrayFromNumber().PadLeft(20); outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, spaceBytes); } - + + return outBytes; + } + + private byte[] SetNonceBytes(byte[] outBytes, int nonceBytesNeeded) + { // Encode nonce in nonceBytesNeeded if (nonceBytesNeeded > 0) { - // We'll store nonce in exactly nonceBytesNeeded bytes byte[] nonceBytes = nonce.ByteArrayFromNumber().PadLeft(nonceBytesNeeded); outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, nonceBytes); } - - // Store callsLength if not single-call + + + return outBytes; + } + + private byte[] StoreCallsLength(byte[] outBytes, int callsLength) + { + int callsCountSize = GetCallsCountSize((uint)callsLength); if (callsLength != 1) { if (callsCountSize > 2 || callsCountSize <= 0) @@ -180,97 +214,16 @@ public byte[] Encode(Address self = null) } outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, callsLength.ByteArrayFromNumber(callsCountSize)); } - - // Now encode each call + + return outBytes; + } + + private byte[] EncodeCalls(byte[] outBytes, int callsLength, Address self) + { for (int i = 0; i < callsLength; i++) { Call call = calls[i]; - /* - call flags layout (1 byte): - bit 0 => toSelf (call.to == this) - bit 1 => hasValue (call.value != 0) - bit 2 => hasData (call.data.length > 0) - bit 3 => hasGasLimit (call.gasLimit != 0) - bit 4 => delegateCall - bit 5 => onlyFallback - bits [6..7] => behaviorOnError => 0=ignore, 1=revert, 2=abort - */ - int flags = 0; - if (self != null && self.Equals(call.to)) - { - flags |= 0x01; - } - - if (call.value != BigInteger.Zero) - { - flags |= 0x02; - } - - if (call.data != null && call.data.Length > 0) - { - flags |= 0x04; - } - - if (call.gasLimit != BigInteger.Zero) - { - flags |= 0x08; - } - - if (call.delegateCall) - { - flags |= 0x10; - } - - if (call.onlyFallback) - { - flags |= 0x20; - } - - flags |= (int)call.behaviorOnError << 6; - - outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, flags.ByteArrayFromNumber(1)); - - // If toSelf bit not set, store 20-byte address - if ((flags & 0x01) == 0) - { - byte[] toAddressBytes = call.to.Value.HexStringToByteArray(); - if (toAddressBytes.Length != 20) - { - throw new SystemException($"Invalid '{nameof(call.to)}' address {call.to}, must be 20 bytes long but got {toAddressBytes.Length} bytes"); - } - outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, toAddressBytes); - } - - // If hasValue, store 32 bytes of value - if ((flags & 0x02) != 0) - { - byte[] valueBytes = call.value.ByteArrayFromNumber().PadLeft(32); - outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, valueBytes); - } - - // If hasData, store 3 bytes of data length + data - if ((flags & 0x04) != 0) - { - if (call.data == null) - { - throw new SystemException($"If ({nameof(flags)} & 0x04) != 0, then {nameof(call.data)} cannot be null"); - } - int callDataLength = call.data!.Length; - if (callDataLength > 0xffffff) - { - throw new ArgumentException($"{nameof(call.data)} is too large, length cannot exceed 0xffffff, given {callDataLength.ToHexadecimal()}"); - } - // 3 bytes => up to 16,777,215 - byte[] callDataLengthBytes = callDataLength.ByteArrayFromNumber(3); - outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, callDataLengthBytes, call.data); - } - - // If hasGasLimit, store 32 bytes of gasLimit - if ((flags & 0x08) != 0) - { - byte[] gasBytes = call.gasLimit.ByteArrayFromNumber().PadLeft(32); - outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, gasBytes); - } + outBytes = call.Encode(outBytes, self); } return outBytes; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs index 4b8d7582..5e9444ea 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs @@ -17,10 +17,9 @@ public static string BigIntegerToHexString(this BigInteger value) public static int MinimumBytesNeeded(this BigInteger value) { - if (value == 0) return 1; // Special case: 0 needs 1 byte - - // Use the same method as ByteArrayFromNumber to ensure consistency - byte[] bytes = value.ToByteArray(isUnsigned: true, isBigEndian: true); + if (value == 0) return 1; + + byte[] bytes = value.ByteArrayFromNumber(); return bytes.Length; } } From 755ed3413dccd27fbc627741564af2eab1a336e4 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 9 Jun 2025 15:22:53 -0400 Subject: [PATCH 045/165] Cleanup Calls.Decode implementation --- .../Primitives/Payload/CallDecoder.cs | 155 +++++++++++++++++ .../Primitives/Payload/CallDecoder.cs.meta | 3 + .../Primitives/Payload/Calls.cs | 163 +----------------- .../Primitives/Payload/CallsDecoder.cs | 110 ++++++++++++ .../Primitives/Payload/CallsDecoder.cs.meta | 3 + 5 files changed, 273 insertions(+), 161 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallDecoder.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallDecoder.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsDecoder.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsDecoder.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallDecoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallDecoder.cs new file mode 100644 index 00000000..e0be812b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallDecoder.cs @@ -0,0 +1,155 @@ +using System; +using System.Numerics; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class CallDecoder + { + private int _flags; + private int _pointer; + private byte[] _packed; + + public CallDecoder(int pointer, byte[] packed) + { + if (packed == null || packed.Length == 0) + { + throw new ArgumentNullException("Invalid packed data: missing globalFlag; given empty byte[]"); + } + this._pointer = pointer; + this._packed = packed; + + + if (this._pointer + 1 > this._packed.Length) + { + throw new Exception("Invalid packed data: missing call flags"); + } + _flags = packed[pointer]; + this._pointer++; + } + + public Call Decode(Address self) + { + Address to = GetTo(self); + BigInteger value = GetValue(); + byte[] data = GetData(); + BigInteger gasLimit = GetGasLimit(); + bool delegateCall = GetDelegateCall(); + bool onlyFallback = GetOnlyFallback(); + BehaviourOnError behaviorOnError = GetBehaviorOnError(); + + return new Call(to, value, data, gasLimit, delegateCall, onlyFallback, behaviorOnError); + } + + private Address GetTo(Address self) + { + // bit 0 => toSelf + Address to; + if ((_flags & 0x01) == 0x01) + { + if (self == null) + { + throw new Exception("Missing 'self' address for toSelf call"); + } + to = self; + } + else + { + if (_pointer + 20 > _packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for address"); + } + + byte[] toBytes = _packed.Slice(_pointer, 20); + to = new Address(toBytes); + _pointer += 20; + } + + return self; + } + + private BigInteger GetValue() + { + // bit 1 => hasValue + BigInteger value = BigInteger.Zero; + if ((_flags & 0x02) == 0x02) + { + if (_pointer + 32 > _packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for value"); + } + + byte[] valueBytes = _packed.Slice(_pointer, 32); + value = new BigInteger(valueBytes, isUnsigned: true, isBigEndian: true); + _pointer += 32; + } + + return value; + } + + private byte[] GetData() + { + // bit 2 => hasData + byte[] data = "0x".HexStringToByteArray(); + if ((_flags & 0x04) == 0x04) + { + if (_pointer + 3 > _packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for data length"); + } + + byte[] dataLengthBytes = _packed.Slice(_pointer, 3); + int dataLength = (int)new BigInteger(dataLengthBytes, isUnsigned: true, isBigEndian: true); + _pointer += 3; + + if (_pointer + dataLength > _packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for call data"); + } + + data = _packed.Slice(_pointer, dataLength); + _pointer += dataLength; + } + + return data; + } + + private BigInteger GetGasLimit() + { + // bit 3 => hasGasLimit + BigInteger gasLimit = BigInteger.Zero; + if ((_flags & 0x08) == 0x08) + { + if (_pointer + 32 > _packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for gasLimit"); + } + + byte[] gasLimitBytes = _packed.Slice(_pointer, 32); + gasLimit = new BigInteger(gasLimitBytes, isUnsigned: true, isBigEndian: true); + _pointer += 32; + } + + return gasLimit; + } + + private bool GetDelegateCall() + { + // bit 4 => delegateCall + return (_flags & 0x10) == 0x10; + } + + private bool GetOnlyFallback() + { + // bit 5 => onlyFallback + return (_flags & 0x20) == 0x20; + } + + private BehaviourOnError GetBehaviorOnError() + { + // bits 6..7 => behaviorOnError + BehaviourOnError behaviorOnError = (BehaviourOnError)((_flags & 0xc0) >> 6); + return behaviorOnError; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallDecoder.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallDecoder.cs.meta new file mode 100644 index 00000000..de3a0df1 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallDecoder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ff2d2741b5c54784a9a8b3dd493f5195 +timeCreated: 1749495671 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs index b1761882..ca7191fb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs @@ -231,167 +231,8 @@ private byte[] EncodeCalls(byte[] outBytes, int callsLength, Address self) public static Calls Decode(byte[] packed, Address self = null) { - int pointer = 0; - if (packed == null || packed.Length == 0) - { - throw new Exception("Invalid packed data: missing globalFlag; given empty byte[]"); - } - - // Read globalFlag - int globalFlag = packed[pointer]; - pointer++; - - // bit 0 => spaceZeroFlag - bool spaceZeroFlag = (globalFlag & 0x01) == 0x01; - BigInteger space = BigInteger.Zero; - - if (!spaceZeroFlag) - { - if (pointer + 20 > packed.Length) - { - throw new Exception("Invalid packed data: not enough bytes for space"); - } - - byte[] spaceBytes = packed.Slice(pointer, 20); - space = new BigInteger(spaceBytes, isUnsigned: true, isBigEndian: true); - pointer += 20; - } - - - // bits [1..3] => nonceSize - int nonceSize = (globalFlag >> 1) & 0x07; - BigInteger nonce = BigInteger.Zero; - if (nonceSize > 0) - { - if (pointer + nonceSize > packed.Length) - { - throw new Exception("Invalid packed data: not enough bytes for nonce"); - } - - byte[] nonceBytes = packed.Slice(pointer, nonceSize); - nonce = new BigInteger(nonceBytes, isUnsigned: true, isBigEndian: true); - pointer += nonceSize; - } - - // bit [4] => singleCallFlag - BigInteger callsCount = 1; - bool singleCallFlag = (globalFlag & 0x10) == 0x10; - if (!singleCallFlag) - { - // bit [5] => callsCountSizeFlag => 1 => 2 bytes, 0 => 1 byte - int countSize = (globalFlag & 0x20) == 0x20 ? 2 : 1; - if (pointer + countSize > packed.Length) - { - throw new Exception("Invalid packed data: not enough bytes for callsCount"); - } - - byte[] callsCountBytes = packed.Slice(pointer, countSize); - callsCount = new BigInteger(callsCountBytes, isUnsigned: true, isBigEndian: true); - pointer += countSize; - } - - List calls = new List(); - for (int i = 0; i < callsCount; i++) - { - if (pointer + 1 > packed.Length) - { - throw new Exception("Invalid packed data: missing call flags"); - } - int flags = packed[pointer]; - pointer++; - - // bit 0 => toSelf - Address to; - if ((flags & 0x01) == 0x01) - { - if (self == null) - { - throw new Exception("Missing 'self' address for toSelf call"); - } - to = self; - } - else - { - if (pointer + 20 > packed.Length) - { - throw new Exception("Invalid packed data: not enough bytes for address"); - } - - byte[] toBytes = packed.Slice(pointer, 20); - to = new Address(toBytes); - pointer += 20; - } - - // bit 1 => hasValue - BigInteger value = BigInteger.Zero; - if ((flags & 0x02) == 0x02) - { - if (pointer + 32 > packed.Length) - { - throw new Exception("Invalid packed data: not enough bytes for value"); - } - - byte[] valueBytes = packed.Slice(pointer, 32); - value = new BigInteger(valueBytes, isUnsigned: true, isBigEndian: true); - pointer += 32; - } - - // bit 2 => hasData - byte[] data = "0x".HexStringToByteArray(); - if ((flags & 0x04) == 0x04) - { - if (pointer + 3 > packed.Length) - { - throw new Exception("Invalid packed data: not enough bytes for data length"); - } - - byte[] dataLengthBytes = packed.Slice(pointer, 3); - int dataLength = (int)new BigInteger(dataLengthBytes, isUnsigned: true, isBigEndian: true); - pointer += 3; - - if (pointer + dataLength > packed.Length) - { - throw new Exception("Invalid packed data: not enough bytes for call data"); - } - - data = packed.Slice(pointer, dataLength); - pointer += dataLength; - } - - // bit 3 => hasGasLimit - BigInteger gasLimit = BigInteger.Zero; - if ((flags & 0x08) == 0x08) - { - if (pointer + 32 > packed.Length) - { - throw new Exception("Invalid packed data: not enough bytes for gasLimit"); - } - - byte[] gasLimitBytes = packed.Slice(pointer, 32); - gasLimit = new BigInteger(gasLimitBytes, isUnsigned: true, isBigEndian: true); - pointer += 32; - } - - // bits 4..5 => delegateCall, onlyFallback - bool delegateCall = (flags & 0x10) == 0x10; - bool onlyFallback = (flags & 0x20) == 0x20; - - // bits 6..7 => behaviorOnError - BehaviourOnError behaviorOnError = (BehaviourOnError)((flags & 0xc0) >> 6); - - Call call = new Call( - to, - value, - data, - gasLimit, - delegateCall, - onlyFallback, - behaviorOnError - ); - calls.Add(call); - } - - return new Calls(space, nonce, calls.ToArray()); + CallsDecoder decoder = new CallsDecoder(packed); + return decoder.Decode(self); } internal static Calls FromSolidityEncoding(SolidityDecoded decoded) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsDecoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsDecoder.cs new file mode 100644 index 00000000..a64ef429 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsDecoder.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using System.Numerics; +using Sequence.Utils; +using UnityEditor.IMGUI.Controls; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class CallsDecoder + { + private int _globalFlag; + private int _pointer; + private byte[] _packed; + + public CallsDecoder(byte[] packed) + { + if (packed == null || packed.Length == 0) + { + throw new ArgumentNullException("Invalid packed data: missing globalFlag; given empty byte[]"); + } + this._packed = packed; + this._pointer = 0; + + this._globalFlag = packed[_pointer]; + this._pointer++; + } + + public Calls Decode(Address self) + { + BigInteger space = GetSpace(); + BigInteger nonce = GetNonce(); + Call[] calls = GetCalls(self); + return new Calls(space, nonce, calls); + } + + private BigInteger GetSpace() + { + bool spaceZeroFlag = (_globalFlag & 0x01) == 0x01; + BigInteger space = BigInteger.Zero; + + if (!spaceZeroFlag) + { + if (_pointer + 20 > _packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for space"); + } + + byte[] spaceBytes = _packed.Slice(_pointer, 20); + space = new BigInteger(spaceBytes, isUnsigned: true, isBigEndian: true); + _pointer += 20; + } + + return space; + } + + private BigInteger GetNonce() + { + int nonceSize = (_globalFlag >> 1) & 0x07; + BigInteger nonce = BigInteger.Zero; + if (nonceSize > 0) + { + if (_pointer + nonceSize > _packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for nonce"); + } + + byte[] nonceBytes = _packed.Slice(_pointer, nonceSize); + nonce = new BigInteger(nonceBytes, isUnsigned: true, isBigEndian: true); + _pointer += nonceSize; + } + + return nonce; + } + + private BigInteger GetCallsCount() + { + BigInteger callsCount = 1; + // bit [4] => singleCallFlag + bool singleCallFlag = (_globalFlag & 0x10) == 0x10; + if (!singleCallFlag) + { + // bit [5] => callsCountSizeFlag => 1 => 2 bytes, 0 => 1 byte + int countSize = (_globalFlag & 0x20) == 0x20 ? 2 : 1; + if (_pointer + countSize > _packed.Length) + { + throw new Exception("Invalid packed data: not enough bytes for callsCount"); + } + + byte[] callsCountBytes = _packed.Slice(_pointer, countSize); + callsCount = new BigInteger(callsCountBytes, isUnsigned: true, isBigEndian: true); + _pointer += countSize; + } + return callsCount; + } + + private Call[] GetCalls(Address self) + { + int callsCount = (int)GetCallsCount(); + CallDecoder decoder = new CallDecoder(_pointer, _packed); + List calls = new List(); + for (int i = 0; i < callsCount; i++) + { + Call call = decoder.Decode(self); + calls.Add(call); + } + + return calls.ToArray(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsDecoder.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsDecoder.cs.meta new file mode 100644 index 00000000..6c4e10ff --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsDecoder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3a74faae99444d39822193ba234be264 +timeCreated: 1749494752 \ No newline at end of file From 55aac5ca52152ab6a76c5c043191ba5c0b4dabac Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 9 Jun 2025 16:11:14 -0400 Subject: [PATCH 046/165] Create CallsEncoder and CallEncoder as we've done with decoding as this is much cleaner to read --- .../Primitives/Payload/Call.cs | 123 -------------- .../Primitives/Payload/CallEncoder.cs | 155 +++++++++++++++++ .../Primitives/Payload/CallEncoder.cs.meta | 3 + .../Primitives/Payload/Calls.cs | 132 +-------------- .../Primitives/Payload/CallsEncoder.cs | 157 ++++++++++++++++++ .../Primitives/Payload/CallsEncoder.cs.meta | 3 + 6 files changed, 320 insertions(+), 253 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsEncoder.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsEncoder.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs index cc93cabe..d7bab164 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs @@ -73,129 +73,6 @@ public override string ToString() return $"Call {{ to: {to}, value: {value}, data: {dataHex}, gasLimit: {gasLimit}, " + $"delegateCall: {delegateCall}, onlyFallback: {onlyFallback}, behaviorOnError: {behaviorOnError} }}"; } - - internal byte[] Encode(byte[] outBytes, Address self) - { - int flags = SetFlags(self); - outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, flags.ByteArrayFromNumber(1)); - outBytes = SetToAddress(outBytes, flags); - outBytes = SetHasValue(outBytes, flags); - outBytes = SetData(outBytes, flags); - outBytes = SetGasLimit(outBytes, flags); - return outBytes; - } - - /// - /// Set flags in this format - /// call flags layout (1 byte): - /// bit 0 => toSelf (call.to == this) - /// bit 1 => hasValue (call.value != 0) - /// bit 2 => hasData (call.data.length > 0) - /// bit 3 => hasGasLimit (call.gasLimit != 0) - /// bit 4 => delegateCall - /// bit 5 => onlyFallback - /// bits [6..7] => behaviorOnError => 0=ignore, 1=revert, 2=abort - /// - /// - /// - private int SetFlags(Address self) - { - int flags = 0; - if (self != null && self.Equals(to)) - { - flags |= 0x01; - } - - if (value != BigInteger.Zero) - { - flags |= 0x02; - } - - if (data != null && data.Length > 0) - { - flags |= 0x04; - } - - if (gasLimit != BigInteger.Zero) - { - flags |= 0x08; - } - - if (delegateCall) - { - flags |= 0x10; - } - - if (onlyFallback) - { - flags |= 0x20; - } - - flags |= (int)behaviorOnError << 6; - - return flags; - } - - private byte[] SetToAddress(byte[] outBytes, int flags) - { - // If toSelf bit not set, store 20-byte address - if ((flags & 0x01) == 0) - { - byte[] toAddressBytes = to.Value.HexStringToByteArray(); - if (toAddressBytes.Length != 20) - { - throw new SystemException($"Invalid '{nameof(to)}' address {to}, must be 20 bytes long but got {toAddressBytes.Length} bytes"); - } - outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, toAddressBytes); - } - - return outBytes; - } - - private byte[] SetHasValue(byte[] outBytes, int flags) - { - // If hasValue, store 32 bytes of value - if ((flags & 0x02) != 0) - { - byte[] valueBytes = value.ByteArrayFromNumber().PadLeft(32); - outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, valueBytes); - } - - return outBytes; - } - - private byte[] SetData(byte[] outBytes, int flags) - { - // If hasData, store 3 bytes of data length + data - if ((flags & 0x04) != 0) - { - if (data == null) - { - throw new SystemException($"If ({nameof(flags)} & 0x04) != 0, then {nameof(data)} cannot be null"); - } - int callDataLength = data!.Length; - if (callDataLength > 0xffffff) - { - throw new ArgumentException($"{nameof(data)} is too large, length cannot exceed 0xffffff, given {callDataLength.ToHexadecimal()}"); - } - // 3 bytes => up to 16,777,215 - byte[] callDataLengthBytes = callDataLength.ByteArrayFromNumber(3); - outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, callDataLengthBytes, data); - } - - return outBytes; - } - - private byte[] SetGasLimit(byte[] outBytes, int flags) - { - // If hasGasLimit, store 32 bytes of gasLimit - if ((flags & 0x08) != 0) - { - byte[] gasBytes = gasLimit.ByteArrayFromNumber().PadLeft(32); - outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, gasBytes); - } - return outBytes; - } public string Hash() { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs new file mode 100644 index 00000000..b1cfc888 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs @@ -0,0 +1,155 @@ +using System; +using System.Numerics; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class CallEncoder + { + private byte[] outBytes; + private Address to; + private BigInteger value; + private byte[] data; + private BigInteger gasLimit; + private bool delegateCall; + private bool onlyFallback; + private BehaviourOnError behaviorOnError; + private int flags; + + public CallEncoder(byte[] outBytes, Call call) + { + this.outBytes = outBytes; + this.to = call.to; + this.value = call.value; + this.data = call.data; + this.gasLimit = call.gasLimit; + this.delegateCall = call.delegateCall; + this.onlyFallback = call.onlyFallback; + this.behaviorOnError = call.behaviorOnError; + } + + public byte[] Encode(Address self) + { + flags = SetFlags(self); + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, flags.ByteArrayFromNumber(1)); + outBytes = AddToAddress(outBytes); + outBytes = AddValue(outBytes); + outBytes = AddData(outBytes); + outBytes = AddGasLimit(outBytes); + return outBytes; + } + + /// + /// Set flags in this format + /// call flags layout (1 byte): + /// bit 0 => toSelf (call.to == this) + /// bit 1 => hasValue (call.value != 0) + /// bit 2 => hasData (call.data.length > 0) + /// bit 3 => hasGasLimit (call.gasLimit != 0) + /// bit 4 => delegateCall + /// bit 5 => onlyFallback + /// bits [6..7] => behaviorOnError => 0=ignore, 1=revert, 2=abort + /// + /// + /// + private int SetFlags(Address self) + { + int flags = 0; + if (self != null && self.Equals(to)) + { + flags |= 0x01; + } + + if (value != BigInteger.Zero) + { + flags |= 0x02; + } + + if (data != null && data.Length > 0) + { + flags |= 0x04; + } + + if (gasLimit != BigInteger.Zero) + { + flags |= 0x08; + } + + if (delegateCall) + { + flags |= 0x10; + } + + if (onlyFallback) + { + flags |= 0x20; + } + + flags |= (int)behaviorOnError << 6; + + return flags; + } + + private byte[] AddToAddress(byte[] bytes) + { + // If toSelf bit not set, store 20-byte address + if ((flags & 0x01) == 0) + { + byte[] toAddressBytes = to.Value.HexStringToByteArray(); + if (toAddressBytes.Length != 20) + { + throw new SystemException($"Invalid '{nameof(to)}' address {to}, must be 20 bytes long but got {toAddressBytes.Length} bytes"); + } + bytes = ByteArrayExtensions.ConcatenateByteArrays(bytes, toAddressBytes); + } + + return bytes; + } + + private byte[] AddValue(byte[] bytes) + { + // If hasValue bit set, store 32-byte value + if ((flags & 0x02) == 0x02) + { + byte[] valueBytes = value.ByteArrayFromNumber().PadLeft(32); + bytes = ByteArrayExtensions.ConcatenateByteArrays(bytes, valueBytes); + } + + return bytes; + } + + private byte[] AddData(byte[] bytes) + { + // If hasData, store 3 bytes of data length + data + if ((flags & 0x04) != 0) + { + if (data == null) + { + throw new SystemException($"If ({nameof(flags)} & 0x04) != 0, then {nameof(data)} cannot be null"); + } + int callDataLength = data!.Length; + if (callDataLength > 0xffffff) + { + throw new ArgumentException($"{nameof(data)} is too large, length cannot exceed 0xffffff, given {callDataLength.ToHexadecimal()}"); + } + // 3 bytes => up to 16,777,215 + byte[] callDataLengthBytes = callDataLength.ByteArrayFromNumber(3); + bytes = ByteArrayExtensions.ConcatenateByteArrays(bytes, callDataLengthBytes, data); + } + + return bytes; + } + + private byte[] AddGasLimit(byte[] bytes) + { + // If hasGasLimit, store 32-byte gas limit + if ((flags & 0x08) != 0) + { + byte[] gasLimitBytes = gasLimit.ByteArrayFromNumber().PadLeft(32); + bytes = ByteArrayExtensions.ConcatenateByteArrays(bytes, gasLimitBytes); + } + + return bytes; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs.meta new file mode 100644 index 00000000..21e7e1f1 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 14fbc743d1bb4fb7aca82da96457e2e7 +timeCreated: 1749497867 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs index ca7191fb..5efc2f07 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs @@ -97,136 +97,8 @@ public override string ToString() public byte[] Encode(Address self = null) { - int callsLength = calls.Length; - int nonceBytesNeeded = nonce.MinimumBytesNeeded(); - if (nonceBytesNeeded > MaxNonceBytes) - { - throw new ArgumentException( - $"{nameof(nonce)} is too large, need {nonceBytesNeeded} bytes to represent it, but max is {MaxNonceBytes}"); - } - - int globalFlag = SetGlobalFlag(nonceBytesNeeded, (uint)callsLength); - - // Start building the output - // We'll accumulate in a Bytes object as we go - byte[] outBytes = globalFlag.ByteArrayFromNumber(1); - outBytes = SetSpaceBytes(outBytes); - outBytes = SetNonceBytes(outBytes, nonceBytesNeeded); - outBytes = StoreCallsLength(outBytes, callsLength); - outBytes = EncodeCalls(outBytes, callsLength, self); - - return outBytes; - } - - private int SetGlobalFlag(int nonceBytesNeeded, uint callsLength) - { - /* - globalFlag layout: - bit 0: spaceZeroFlag => 1 if space == 0, else 0 - bits [1..3]: how many bytes we use to encode nonce - bit 4: singleCallFlag => 1 if there's exactly one call - bit 5: callsCountSizeFlag => 1 if #calls stored in 2 bytes, 0 if in 1 byte - (bits [6..7] are unused/free) - */ - int globalFlag = 0; - - if (space == BigInteger.Zero) - { - globalFlag |= 0x01; - } - - // bits [1..3] => how many bytes for the nonce - globalFlag |= nonceBytesNeeded << 1; - - // bit [4] => singleCallFlag - if (callsLength == 1) - { - globalFlag |= 0x10; - } - - if (GetCallsCountSize(callsLength) > 1) - { - globalFlag |= 0x20; // We need more than one byte for the calls count - // bit [5] => callsCountSizeFlag: 1 => 2 bytes, 0 => 1 byte - } - - return globalFlag; - } - - private int GetCallsCountSize(uint callsLength) - { - /* - If there's more than one call, we decide if we store the #calls in 1 or 2 bytes. - */ - int callsCountSize = 0; - if (callsLength != 1) - { - if (callsLength < 256) - { - callsCountSize = 1; - } - else if (callsLength < MaxCalls) - { - callsCountSize = 2; - } - else - { - throw new ArgumentException($"{calls} is too large, cannot have more than {MaxCalls} calls, given {callsLength}"); - } - } - return callsCountSize; - } - - private byte[] SetSpaceBytes(byte[] outBytes) - { - // If space isn't 0, store it as exactly 20 bytes (like uint160) - if (space != BigInteger.Zero) - { - byte[] spaceBytes = space.ByteArrayFromNumber().PadLeft(20); - outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, spaceBytes); - } - - return outBytes; - } - - private byte[] SetNonceBytes(byte[] outBytes, int nonceBytesNeeded) - { - // Encode nonce in nonceBytesNeeded - if (nonceBytesNeeded > 0) - { - byte[] nonceBytes = nonce.ByteArrayFromNumber().PadLeft(nonceBytesNeeded); - outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, nonceBytes); - } - - - return outBytes; - } - - private byte[] StoreCallsLength(byte[] outBytes, int callsLength) - { - int callsCountSize = GetCallsCountSize((uint)callsLength); - if (callsLength != 1) - { - if (callsCountSize > 2 || callsCountSize <= 0) - { - throw new SystemException( - $"If {nameof(callsLength)} != 1, then {callsCountSize} must be 1 or 2, given {callsCountSize}"); - } - outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, callsLength.ByteArrayFromNumber(callsCountSize)); - } - - return outBytes; - } - - private byte[] EncodeCalls(byte[] outBytes, int callsLength, Address self) - { - for (int i = 0; i < callsLength; i++) - { - Call call = calls[i]; - outBytes = call.Encode(outBytes, self); - } - - return outBytes; + CallsEncoder encoder = new CallsEncoder(self, this); + return encoder.Encode(); } public static Calls Decode(byte[] packed, Address self = null) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsEncoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsEncoder.cs new file mode 100644 index 00000000..75a0c19f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsEncoder.cs @@ -0,0 +1,157 @@ +using System; +using System.Numerics; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class CallsEncoder + { + private Address self; + private int globalFlag; + + private BigInteger space; + private BigInteger nonce; + private Call[] calls; + private int callsLength; + private int nonceBytesNeeded; + + public CallsEncoder(Address self, Calls calls) + { + this.self = self; + this.space = calls.space; + this.nonce = calls.nonce; + this.calls = calls.calls; + } + + public byte[] Encode() + { + callsLength = calls.Length; + nonceBytesNeeded = nonce.MinimumBytesNeeded(); + if (nonceBytesNeeded > Calls.MaxNonceBytes) + { + throw new ArgumentException( + $"{nameof(nonce)} is too large, need {nonceBytesNeeded} bytes to represent it, but max is {Calls.MaxNonceBytes}"); + } + + SetGlobalFlag(); + + // Start building the output + // We'll accumulate in a byte[] as we go + byte[] outBytes = globalFlag.ByteArrayFromNumber(1); + outBytes = AddSpaceBytes(outBytes); + outBytes = AddNonceBytes(outBytes); + outBytes = AddCallsLength(outBytes); + outBytes = AddCalls(outBytes); + + return outBytes; + } + + private void SetGlobalFlag() + { + /* + globalFlag layout: + bit 0: spaceZeroFlag => 1 if space == 0, else 0 + bits [1..3]: how many bytes we use to encode nonce + bit 4: singleCallFlag => 1 if there's exactly one call + bit 5: callsCountSizeFlag => 1 if #calls stored in 2 bytes, 0 if in 1 byte + (bits [6..7] are unused/free) + */ + globalFlag = 0; + + if (space == BigInteger.Zero) + { + globalFlag |= 0x01; + } + + // bits [1..3] => how many bytes for the nonce + globalFlag |= nonceBytesNeeded << 1; + + // bit [4] => singleCallFlag + if (callsLength == 1) + { + globalFlag |= 0x10; + } + + if (GetCallsCountSize() > 1) + { + globalFlag |= 0x20; // We need more than one byte for the calls count + // bit [5] => callsCountSizeFlag: 1 => 2 bytes, 0 => 1 byte + } + } + + private int GetCallsCountSize() + { + /* + If there's more than one call, we decide if we store the #calls in 1 or 2 bytes. + */ + int callsCountSize = 0; + if (callsLength != 1) + { + if (callsLength < 256) + { + callsCountSize = 1; + } + else if (callsLength < Calls.MaxCalls) + { + callsCountSize = 2; + } + else + { + throw new ArgumentException($"{calls} is too large, cannot have more than {Calls.MaxCalls} calls, given {callsLength}"); + } + } + return callsCountSize; + } + + private byte[] AddSpaceBytes(byte[] outBytes) + { + // If space isn't 0, store it as exactly 20 bytes (like uint160) + if (space != BigInteger.Zero) + { + byte[] spaceBytes = space.ByteArrayFromNumber().PadLeft(20); + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, spaceBytes); + } + + return outBytes; + } + + private byte[] AddNonceBytes(byte[] outBytes) + { + // Encode nonce in nonceBytesNeeded + if (nonceBytesNeeded > 0) + { + byte[] nonceBytes = nonce.ByteArrayFromNumber().PadLeft(nonceBytesNeeded); + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, nonceBytes); + } + + return outBytes; + } + + private byte[] AddCallsLength(byte[] outBytes) + { + int callsCountSize = GetCallsCountSize(); + if (callsLength != 1) + { + if (callsCountSize > 2 || callsCountSize <= 0) + { + throw new SystemException( + $"If {nameof(callsLength)} != 1, then {callsCountSize} must be 1 or 2, given {callsCountSize}"); + } + outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, callsLength.ByteArrayFromNumber(callsCountSize)); + } + + return outBytes; + } + + private byte[] AddCalls(byte[] outBytes) + { + for (int i = 0; i < callsLength; i++) + { + CallEncoder encoder = new CallEncoder(outBytes, calls[i]); + outBytes = encoder.Encode(self); + } + + return outBytes; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsEncoder.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsEncoder.cs.meta new file mode 100644 index 00000000..fb31ea55 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsEncoder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bfe2fd16e3404a6a83642c14ad076075 +timeCreated: 1749496991 \ No newline at end of file From dbd42bfec232955adbdfd25449b6dcec3f2c9637 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 9 Jun 2025 17:05:33 -0400 Subject: [PATCH 047/165] Cleanup how we convert from our data types (TypedDataToSign + NamedType) to the Nethereum equivalents --- .../ConvertTypedDataToSignToNethereum.cs | 259 ++++++++++++++++++ .../ConvertTypedDataToSignToNethereum.cs.meta | 3 + .../Primitives/Payload/Domain.cs | 5 + .../Primitives/Payload/NamedType.cs | 6 + .../Primitives/Payload/TypedDataToSign.cs | 230 +--------------- 5 files changed, 279 insertions(+), 224 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConvertTypedDataToSignToNethereum.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConvertTypedDataToSignToNethereum.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConvertTypedDataToSignToNethereum.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConvertTypedDataToSignToNethereum.cs new file mode 100644 index 00000000..18e31c5f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConvertTypedDataToSignToNethereum.cs @@ -0,0 +1,259 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using Nethereum.ABI.EIP712; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class ConvertTypedDataToSignToNethereum + { + private Domain domain; + private Dictionary types; + private string primaryType; + private Dictionary message; + + public ConvertTypedDataToSignToNethereum(TypedDataToSign typedDataToSign) + { + if (typedDataToSign == null) + { + throw new ArgumentNullException(nameof(typedDataToSign), "TypedDataToSign cannot be null."); + } + + this.domain = typedDataToSign.domain; + this.types = typedDataToSign.types; + this.primaryType = typedDataToSign.primaryType; + this.message = typedDataToSign.message; + + if (domain == null || types == null || string.IsNullOrEmpty(primaryType) || message == null) + { + throw new ArgumentException("Invalid TypedDataToSign structure."); + } + } + + internal TypedData ConvertToNethereumTypedDataWithSalt() + { + if (domain.salt == null || domain.salt.Data == null || domain.salt.Data.Length == 0) + { + throw new ArgumentException("Domain salt is required for EIP-712 with salt."); + } + + DomainWithSalt nethereumDomain = new Nethereum.ABI.EIP712.DomainWithSalt() + { + Name = domain.name, + Version = domain.version, + ChainId = domain.chainId, + VerifyingContract = domain.verifyingContract.ToString(), + Salt = domain.salt.Data + }; + + var nethereumTypes = new Dictionary() + { + { + "EIP712Domain", new MemberDescription[] + { + new MemberDescription { Name = "name", Type = "string" }, + new MemberDescription { Name = "version", Type = "string" }, + new MemberDescription { Name = "chainId", Type = "uint256" }, + new MemberDescription { Name = "verifyingContract", Type = "address" }, + new MemberDescription { Name = "salt", Type = "bytes32" } + } + } + }; + + nethereumTypes = AddNamedTypesInNethereumFormat(nethereumTypes); + + var convertedMessage = ConvertMessageForNethereum(); + + return new TypedData + { + Domain = nethereumDomain, + Types = nethereumTypes, + PrimaryType = primaryType, + Message = convertedMessage + }; + } + + internal TypedData ConvertToNethereumTypedDataWithoutSalt() + { + var nethereumDomain = new Nethereum.ABI.EIP712.Domain() + { + Name = domain.name, + Version = domain.version, + ChainId = domain.chainId, + VerifyingContract = domain.verifyingContract.ToString() + }; + + var nethereumTypes = new Dictionary() + { + { + "EIP712Domain", new MemberDescription[] + { + new MemberDescription { Name = "name", Type = "string" }, + new MemberDescription { Name = "version", Type = "string" }, + new MemberDescription { Name = "chainId", Type = "uint256" }, + new MemberDescription { Name = "verifyingContract", Type = "address" } + } + } + }; + + nethereumTypes = AddNamedTypesInNethereumFormat(nethereumTypes); + + var convertedMessage = ConvertMessageForNethereum(); + + return new TypedData + { + Domain = nethereumDomain, + Types = nethereumTypes, + PrimaryType = primaryType, + Message = convertedMessage + }; + } + + private Dictionary AddNamedTypesInNethereumFormat(Dictionary nethereumTypes) + { + foreach (var typeEntry in types) + { + var members = new MemberDescription[typeEntry.Value.Length]; + for (int i = 0; i < typeEntry.Value.Length; i++) + { + members[i] = new MemberDescription + { + Name = typeEntry.Value[i].name, + Type = typeEntry.Value[i].type + }; + } + nethereumTypes[typeEntry.Key] = members; + } + + return nethereumTypes; + } + + private MemberValue[] ConvertMessageForNethereum() + { + var memberValues = new List(); + + if (!types.TryGetValue(primaryType, out NamedType[] namedTypes)) + { + throw new ArgumentException($"Primary type {primaryType} not found int the provided types."); + } + + foreach (var namedType in namedTypes) + { + if (!message.TryGetValue(namedType.name, out object value)) + { + Debug.LogError($"Field '{namedType.name}' not found in message for type '{primaryType}'"); + continue; + } + + if (value == null) + { + if (namedType.type == "bytes32" || namedType.type == "address" || namedType.type.StartsWith("uint")) + { + Debug.LogError($"Null value found for non-nullable type '{namedType.type}' in field '{namedType.name}'"); + continue; + } + } + + MemberValue memberValue = new ConvertNamedTypeToMemberValue(namedType, message, value).ConvertToNethereumMemberValue(); + + memberValues.Add(memberValue); + } + + return memberValues.ToArray(); + } + + private class ConvertNamedTypeToMemberValue + { + private string name; + private string type; + private Dictionary message; + private object value; + + private object convertedValue; + + public ConvertNamedTypeToMemberValue(NamedType type, Dictionary message, object value) + { + this.name = type.name; + this.type = type.type; + this.message = message; + this.value = value; + } + + public MemberValue ConvertToNethereumMemberValue() + { + if (value is string valueString) + { + ConvertFromString(valueString); + } + else if (value is Address[] addresses) + { + convertedValue = addresses.Select(addr => addr.ToString()).ToArray(); + } + else if (value is EncodeSapient.EncodedCall[] calls) + { + var callMemberArrays = calls.Select(call => new MemberValue[] + { + new MemberValue { TypeName = "address", Value = call.to.ToString() }, + new MemberValue { TypeName = "uint256", Value = call.value }, + new MemberValue { TypeName = "bytes", Value = call.data.HexStringToByteArray() }, + new MemberValue { TypeName = "uint256", Value = call.gasLimit }, + new MemberValue { TypeName = "bool", Value = call.delegateCall }, + new MemberValue { TypeName = "bool", Value = call.onlyFallback }, + new MemberValue { TypeName = "uint256", Value = call.behaviorOnError } + }).ToArray(); + + convertedValue = callMemberArrays; + } + else if (value is byte[] bytes) + { + convertedValue = bytes.ByteArrayToHexStringWithPrefix(); + } + else + { + convertedValue = value; + } + + return new MemberValue + { + TypeName = type, + Value = convertedValue + }; + } + + private void ConvertFromString(string valueString) + { + if (valueString.IsHexFormat()) + { + ConvertFromHex(valueString); + } + else if (BigInteger.TryParse(valueString, out BigInteger bigIntValue)) + { + convertedValue = bigIntValue; + } + else + { + convertedValue = valueString; + } + } + + private void ConvertFromHex(string hex) + { + if (type == "uint256") + { + convertedValue = hex.HexStringToBigInteger(); + } + else if (type == "bytes32") + { + convertedValue = hex.HexStringToByteArray(); + } + else + { + convertedValue = hex; + } + } + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConvertTypedDataToSignToNethereum.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConvertTypedDataToSignToNethereum.cs.meta new file mode 100644 index 00000000..1f716d0c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConvertTypedDataToSignToNethereum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3def7168749147e184d1f492ec5359d0 +timeCreated: 1749500832 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs index 462acf4f..13439e4d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs @@ -92,5 +92,10 @@ public byte[] GetDomainSeparator() chainIdHash, verifyingContractHash, saltHash); return encoded; } + + public bool HasSalt() + { + return salt?.Data != null && salt.Data.Length > 0; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs index f17670d4..4a54365d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs @@ -1,4 +1,10 @@ using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using Nethereum.ABI.EIP712; +using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs index 74062c47..7d42ca79 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -316,243 +316,25 @@ public TypedDataToSign(Address wallet, Chain chain, Parented payload) // Todo replace nethereum (introduced after commit 871466dbc7faf88f1201f963af6a372c59263d2f in commit d44d3bedfcbe875f2e5edc335e1d143bfb1358d3) - I think we were close with our own implementation so worth looking at it, even if only as a reference public byte[] GetSignPayload() { - // Use Nethereum's EIP-712 encoder var eip712TypedDataEncoder = new Eip712TypedDataEncoder(); - // Check if we have salt data to determine which domain type to use - bool hasSalt = domain.salt?.Data != null && domain.salt.Data.Length > 0; - + bool hasSalt = domain.HasSalt(); byte[] encodedTypedData; + ConvertTypedDataToSignToNethereum converter = new ConvertTypedDataToSignToNethereum(this); if (hasSalt) { - // Convert to Nethereum's TypedData format with salt - var nethereumTypedDataWithSalt = ConvertToNethereumTypedDataWithSalt(); + TypedData nethereumTypedDataWithSalt = + converter.ConvertToNethereumTypedDataWithSalt(); encodedTypedData = eip712TypedDataEncoder.EncodeTypedData(nethereumTypedDataWithSalt); } else { - // Convert to Nethereum's TypedData format without salt - var nethereumTypedData = ConvertToNethereumTypedDataWithoutSalt(); + TypedData nethereumTypedData = + converter.ConvertToNethereumTypedDataWithoutSalt(); encodedTypedData = eip712TypedDataEncoder.EncodeTypedData(nethereumTypedData); } return SequenceCoder.KeccakHash(encodedTypedData); } - - internal TypedData ConvertToNethereumTypedDataWithSalt() - { - if (domain.salt == null || domain.salt.Data == null || domain.salt.Data.Length == 0) - { - throw new ArgumentException("Domain salt is required for EIP-712 with salt."); - } - - // Convert domain using Nethereum's DomainWithSalt - var nethereumDomain = new Nethereum.ABI.EIP712.DomainWithSalt() - { - Name = domain.name, - Version = domain.version, - ChainId = (int)domain.chainId, - VerifyingContract = domain.verifyingContract.ToString(), - Salt = domain.salt.Data - }; - - // Convert types to Nethereum format - var nethereumTypes = new Dictionary(); - - // Add the required EIP712Domain type definition with salt - var domainMembers = new List - { - new MemberDescription { Name = "name", Type = "string" }, - new MemberDescription { Name = "version", Type = "string" }, - new MemberDescription { Name = "chainId", Type = "uint256" }, - new MemberDescription { Name = "verifyingContract", Type = "address" }, - new MemberDescription { Name = "salt", Type = "bytes32" } - }; - - nethereumTypes["EIP712Domain"] = domainMembers.ToArray(); - - foreach (var typeEntry in types) - { - var members = new MemberDescription[typeEntry.Value.Length]; - for (int i = 0; i < typeEntry.Value.Length; i++) - { - members[i] = new MemberDescription - { - Name = typeEntry.Value[i].name, - Type = typeEntry.Value[i].type - }; - } - nethereumTypes[typeEntry.Key] = members; - } - - // Convert message to proper format - var convertedMessage = ConvertMessageForNethereum(); - - return new TypedData - { - Domain = nethereumDomain, - Types = nethereumTypes, - PrimaryType = primaryType, - Message = convertedMessage - }; - } - - internal TypedData ConvertToNethereumTypedDataWithoutSalt() - { - // Convert domain using Nethereum's Domain (without salt) - var nethereumDomain = new Nethereum.ABI.EIP712.Domain() - { - Name = domain.name, - Version = domain.version, - ChainId = (int)domain.chainId, - VerifyingContract = domain.verifyingContract.ToString() - }; - - // Convert types to Nethereum format - var nethereumTypes = new Dictionary(); - - // Add the required EIP712Domain type definition without salt - var domainMembers = new List - { - new MemberDescription { Name = "name", Type = "string" }, - new MemberDescription { Name = "version", Type = "string" }, - new MemberDescription { Name = "chainId", Type = "uint256" }, - new MemberDescription { Name = "verifyingContract", Type = "address" } - }; - - nethereumTypes["EIP712Domain"] = domainMembers.ToArray(); - - foreach (var typeEntry in types) - { - var members = new MemberDescription[typeEntry.Value.Length]; - for (int i = 0; i < typeEntry.Value.Length; i++) - { - members[i] = new MemberDescription - { - Name = typeEntry.Value[i].name, - Type = typeEntry.Value[i].type - }; - } - nethereumTypes[typeEntry.Key] = members; - } - - // Convert message to proper format - var convertedMessage = ConvertMessageForNethereum(); - - return new TypedData - { - Domain = nethereumDomain, - Types = nethereumTypes, - PrimaryType = primaryType, - Message = convertedMessage - }; - } - - internal MemberValue[] ConvertMessageForNethereum() - { - var memberValues = new List(); - - // Get the primary type definition to ensure correct ordering - if (!types.TryGetValue(primaryType, out NamedType[] namedTypes)) - { - Debug.LogError($"Primary type '{primaryType}' not found in types dictionary"); - return memberValues.ToArray(); - } - - // Process fields in the order they appear in the type definition - foreach (var namedType in namedTypes) - { - if (!message.TryGetValue(namedType.name, out object value)) - { - Debug.LogError($"Field '{namedType.name}' not found in message for type '{primaryType}'"); - continue; - } - - object convertedValue; - - // Skip null values for bytes32 and other non-nullable types - if (value == null) - { - if (namedType.type == "bytes32" || namedType.type == "address" || namedType.type.StartsWith("uint")) - { - Debug.LogError($"Null value found for non-nullable type '{namedType.type}' in field '{namedType.name}'"); - continue; - } - } - - Debug.Log($"Converting field '{namedType.name}' of type '{namedType.type}' with value: {value}"); - - // Handle different value types for Nethereum compatibility - if (value is string strValue) - { - // Check if it's a hex string that should be converted to BigInteger - if (strValue.StartsWith("0x")) - { - // Convert based on the specific type - if (namedType.type == "uint256") - { - convertedValue = BigInteger.Parse(strValue.Substring(2), System.Globalization.NumberStyles.HexNumber); - } - else if (namedType.type == "bytes32") - { - // Convert bytes32 hex string to byte array - convertedValue = strValue.HexStringToByteArray(); - } - else - { - // Keep as hex string for other types (address, bytes) - convertedValue = strValue; - } - } - else if (BigInteger.TryParse(strValue, out BigInteger bigIntValue)) - { - convertedValue = bigIntValue; - } - else - { - convertedValue = strValue; - } - } - else if (value is Address[] addresses) - { - convertedValue = addresses.Select(addr => addr.ToString()).ToArray(); - } - else if (value is EncodeSapient.EncodedCall[] calls) - { - // Convert each call to a MemberValue[] representing the Call struct - var callMemberArrays = calls.Select(call => new MemberValue[] - { - new MemberValue { TypeName = "address", Value = call.to.ToString() }, - new MemberValue { TypeName = "uint256", Value = call.value }, - new MemberValue { TypeName = "bytes", Value = call.data.HexStringToByteArray() }, - new MemberValue { TypeName = "uint256", Value = call.gasLimit }, - new MemberValue { TypeName = "bool", Value = call.delegateCall }, - new MemberValue { TypeName = "bool", Value = call.onlyFallback }, - new MemberValue { TypeName = "uint256", Value = call.behaviorOnError } - }).ToArray(); - - convertedValue = callMemberArrays; - } - else if (value is byte[] bytes) - { - convertedValue = bytes.ByteArrayToHexStringWithPrefix(); - } - else - { - convertedValue = value; - } - - Debug.Log($"Converted field '{namedType.name}' to: {convertedValue}"); - - memberValues.Add(new MemberValue - { - TypeName = namedType.type, - Value = convertedValue - }); - } - - Debug.Log($"Created {memberValues.Count} member values for type '{primaryType}'"); - return memberValues.ToArray(); - } } } \ No newline at end of file From 6067f635b6481ba988dd8b33572226839db50f61 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 9 Jun 2025 17:18:42 -0400 Subject: [PATCH 048/165] More cleanup --- .../UnitTests/NethereumConversionTests.cs | 1 + .../Primitives/Payload/Calls.cs | 21 ++++++++++ .../Primitives/Payload/ConfigUpdate.cs | 10 +++++ .../Primitives/Payload/Message.cs | 10 +++++ .../Primitives/Payload/TypedDataToSign.cs | 41 ++----------------- 5 files changed, 45 insertions(+), 38 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs index 12875fb4..8bec64d0 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs @@ -12,6 +12,7 @@ namespace Sequence.EcosystemWallet.UnitTests { + // AI generated, but can be useful for debugging public class NethereumConversionTests { private Address[] _testAddressArray = new Address[] diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs index 5efc2f07..a41fc614 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs @@ -13,6 +13,27 @@ namespace Sequence.EcosystemWallet.Primitives [Serializable] public class Calls : Payload { + public static readonly Dictionary Types = new Dictionary() + { + ["Calls"] = new[] + { + new NamedType("calls", "Call[]"), + new NamedType("space", "uint256"), + new NamedType("nonce", "uint256"), + new NamedType("wallets", "address[]"), + }, + ["Call"] = new[] + { + new NamedType("to", "address"), + new NamedType("value", "uint256"), + new NamedType("data", "bytes"), + new NamedType("gasLimit", "uint256"), + new NamedType("delegateCall", "bool"), + new NamedType("onlyFallback", "bool"), + new NamedType("behaviorOnError", "uint256"), + } + }; + public const uint MaxNonceBytes = 15; public const uint MaxCalls = 65536; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs index 68fc8002..2c2ff280 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using Sequence.ABI; using Sequence.Utils; @@ -9,6 +10,15 @@ namespace Sequence.EcosystemWallet.Primitives [Serializable] public class ConfigUpdate : Payload { + public static readonly Dictionary Types = new Dictionary + { + ["ConfigUpdate"] = new[] + { + new NamedType("imageHash", "bytes32"), + new NamedType("wallets", "address[]"), + } + }; + public override PayloadType type => PayloadType.ConfigUpdate; public string imageHash; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs index 2e42b993..ee733a59 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using Sequence.ABI; using Sequence.Utils; @@ -9,6 +10,15 @@ namespace Sequence.EcosystemWallet.Primitives [Serializable] public class Message : Payload { + public static readonly Dictionary Types = new Dictionary + { + ["Message"] = new[] + { + new NamedType("message", "bytes"), + new NamedType("wallets", "address[]"), + } + }; + public override PayloadType type => PayloadType.Message; public byte[] message; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs index 7d42ca79..0b37ad0b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -216,7 +216,6 @@ public TypedDataToSign(Domain domain, Dictionary types, str } } - // Todo: once we have tests working, let's refactor this so it isn't one giant function public TypedDataToSign(Address wallet, Chain chain, Parented payload) { _payload = payload; @@ -225,28 +224,8 @@ public TypedDataToSign(Address wallet, Chain chain, Parented payload) { case PayloadType.Call: { - types = new Dictionary() - { - ["Calls"] = new[] - { - new NamedType("calls", "Call[]"), - new NamedType("space", "uint256"), - new NamedType("nonce", "uint256"), - new NamedType("wallets", "address[]"), - }, - ["Call"] = new[] - { - new NamedType("to", "address"), - new NamedType("value", "uint256"), - new NamedType("data", "bytes"), - new NamedType("gasLimit", "uint256"), - new NamedType("delegateCall", "bool"), - new NamedType("onlyFallback", "bool"), - new NamedType("behaviorOnError", "uint256"), - } - }; + types = Calls.Types; - // We ensure 'behaviorOnError' is turned into a numeric value Calls callPayload = (Calls)payload.payload; message = new Dictionary { @@ -267,14 +246,7 @@ public TypedDataToSign(Address wallet, Chain chain, Parented payload) } case PayloadType.Message: { - types = new Dictionary - { - ["Message"] = new[] - { - new NamedType("message", "bytes"), - new NamedType("wallets", "address[]"), - } - }; + types = Message.Types; var messagePayload = (Message)payload.payload; message = new Dictionary @@ -287,14 +259,7 @@ public TypedDataToSign(Address wallet, Chain chain, Parented payload) } case PayloadType.ConfigUpdate: { - types = new Dictionary - { - ["ConfigUpdate"] = new[] - { - new NamedType("imageHash", "bytes32"), - new NamedType("wallets", "address[]"), - } - }; + types = ConfigUpdate.Types; var configPayload = (ConfigUpdate)payload.payload; message = new Dictionary From c148c78667ff5a013ce539276901da056db57223 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Mon, 9 Jun 2025 17:33:02 -0400 Subject: [PATCH 049/165] Added a readme explaining how to update Nethereum if needed --- Packages/Sequence-Unity/Plugins/Nethereum.meta | 8 ++++++++ .../Plugins/{ => Nethereum}/Nethereum.ABI.dll | Bin .../Plugins/{ => Nethereum}/Nethereum.ABI.dll.meta | 0 .../Plugins/{ => Nethereum}/Nethereum.Hex.dll | Bin .../Plugins/{ => Nethereum}/Nethereum.Hex.dll.meta | 0 .../Plugins/{ => Nethereum}/Nethereum.RLP.dll | Bin .../Plugins/{ => Nethereum}/Nethereum.RLP.dll.meta | 0 .../Plugins/{ => Nethereum}/Nethereum.Util.dll | Bin .../Plugins/{ => Nethereum}/Nethereum.Util.dll.meta | 0 Packages/Sequence-Unity/Plugins/Nethereum/README.md | 9 +++++++++ .../Sequence-Unity/Plugins/Nethereum/README.md.meta | 3 +++ 11 files changed, 20 insertions(+) create mode 100644 Packages/Sequence-Unity/Plugins/Nethereum.meta rename Packages/Sequence-Unity/Plugins/{ => Nethereum}/Nethereum.ABI.dll (100%) rename Packages/Sequence-Unity/Plugins/{ => Nethereum}/Nethereum.ABI.dll.meta (100%) rename Packages/Sequence-Unity/Plugins/{ => Nethereum}/Nethereum.Hex.dll (100%) rename Packages/Sequence-Unity/Plugins/{ => Nethereum}/Nethereum.Hex.dll.meta (100%) rename Packages/Sequence-Unity/Plugins/{ => Nethereum}/Nethereum.RLP.dll (100%) rename Packages/Sequence-Unity/Plugins/{ => Nethereum}/Nethereum.RLP.dll.meta (100%) rename Packages/Sequence-Unity/Plugins/{ => Nethereum}/Nethereum.Util.dll (100%) rename Packages/Sequence-Unity/Plugins/{ => Nethereum}/Nethereum.Util.dll.meta (100%) create mode 100644 Packages/Sequence-Unity/Plugins/Nethereum/README.md create mode 100644 Packages/Sequence-Unity/Plugins/Nethereum/README.md.meta diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.meta b/Packages/Sequence-Unity/Plugins/Nethereum.meta new file mode 100644 index 00000000..072a0135 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Nethereum.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2a66fba38794144d1b19469d269af868 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.ABI.dll b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.ABI.dll similarity index 100% rename from Packages/Sequence-Unity/Plugins/Nethereum.ABI.dll rename to Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.ABI.dll diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.ABI.dll.meta b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.ABI.dll.meta similarity index 100% rename from Packages/Sequence-Unity/Plugins/Nethereum.ABI.dll.meta rename to Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.ABI.dll.meta diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.Hex.dll b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Hex.dll similarity index 100% rename from Packages/Sequence-Unity/Plugins/Nethereum.Hex.dll rename to Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Hex.dll diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.Hex.dll.meta b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Hex.dll.meta similarity index 100% rename from Packages/Sequence-Unity/Plugins/Nethereum.Hex.dll.meta rename to Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Hex.dll.meta diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.RLP.dll b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.RLP.dll similarity index 100% rename from Packages/Sequence-Unity/Plugins/Nethereum.RLP.dll rename to Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.RLP.dll diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.RLP.dll.meta b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.RLP.dll.meta similarity index 100% rename from Packages/Sequence-Unity/Plugins/Nethereum.RLP.dll.meta rename to Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.RLP.dll.meta diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.Util.dll b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Util.dll similarity index 100% rename from Packages/Sequence-Unity/Plugins/Nethereum.Util.dll rename to Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Util.dll diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.Util.dll.meta b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Util.dll.meta similarity index 100% rename from Packages/Sequence-Unity/Plugins/Nethereum.Util.dll.meta rename to Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Util.dll.meta diff --git a/Packages/Sequence-Unity/Plugins/Nethereum/README.md b/Packages/Sequence-Unity/Plugins/Nethereum/README.md new file mode 100644 index 00000000..2744fb5f --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Nethereum/README.md @@ -0,0 +1,9 @@ +How to Update Nethereum Dependencies + +1. Search for the package you need on https://www.nuget.org/packages +2. Select the version you want and click 'Download package' +3. Unzip the downloaded package + a) To unzip on Mac: + b) Open terminal and navigate to the directory where the package is downloaded + c) Run the command: `unzip .nupkg` +4. Copy the .dll from the netstandard2.0 folder to here \ No newline at end of file diff --git a/Packages/Sequence-Unity/Plugins/Nethereum/README.md.meta b/Packages/Sequence-Unity/Plugins/Nethereum/README.md.meta new file mode 100644 index 00000000..3affc7bb --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Nethereum/README.md.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d5ac338ab73c4da9836938e8ff05f96d +timeCreated: 1749504556 \ No newline at end of file From 9a1e238601e2ee15d476ef86303f3b558e0f8572 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 12 Jun 2025 14:42:13 -0400 Subject: [PATCH 050/165] Fix broken unit tests by fixing class access level --- .../UnitTests/NethereumConversionTests.cs | 18 +++++++----------- .../ConvertTypedDataToSignToNethereum.cs | 8 ++++---- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs index 8bec64d0..ceddd7f3 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; -using System.Reflection; using NUnit.Framework; using Sequence.ABI; using Sequence.EcosystemWallet.Primitives; @@ -360,26 +359,23 @@ public void TestMessageConversionForCallsPayload() } } - // Helper methods using reflection to access internal methods + // Helper methods using the converter class directly private TypedData CallConvertToNethereumTypedDataWithoutSalt(TypedDataToSign instance) { - var method = typeof(TypedDataToSign).GetMethod("ConvertToNethereumTypedDataWithoutSalt", - BindingFlags.NonPublic | BindingFlags.Instance); - return (TypedData)method.Invoke(instance, null); + var converter = new ConvertTypedDataToSignToNethereum(instance); + return converter.ConvertToNethereumTypedDataWithoutSalt(); } private TypedData CallConvertToNethereumTypedDataWithSalt(TypedDataToSign instance) { - var method = typeof(TypedDataToSign).GetMethod("ConvertToNethereumTypedDataWithSalt", - BindingFlags.NonPublic | BindingFlags.Instance); - return (TypedData)method.Invoke(instance, null); + var converter = new ConvertTypedDataToSignToNethereum(instance); + return converter.ConvertToNethereumTypedDataWithSalt(); } private MemberValue[] CallConvertMessageForNethereum(TypedDataToSign instance) { - var method = typeof(TypedDataToSign).GetMethod("ConvertMessageForNethereum", - BindingFlags.NonPublic | BindingFlags.Instance); - return (MemberValue[])method.Invoke(instance, null); + var converter = new ConvertTypedDataToSignToNethereum(instance); + return converter.ConvertMessageForNethereum(); } // Helper methods to identify space and nonce fields since they have the same type diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConvertTypedDataToSignToNethereum.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConvertTypedDataToSignToNethereum.cs index 18e31c5f..75b1e667 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConvertTypedDataToSignToNethereum.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConvertTypedDataToSignToNethereum.cs @@ -8,7 +8,7 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class ConvertTypedDataToSignToNethereum + public class ConvertTypedDataToSignToNethereum { private Domain domain; private Dictionary types; @@ -33,7 +33,7 @@ public ConvertTypedDataToSignToNethereum(TypedDataToSign typedDataToSign) } } - internal TypedData ConvertToNethereumTypedDataWithSalt() + public TypedData ConvertToNethereumTypedDataWithSalt() { if (domain.salt == null || domain.salt.Data == null || domain.salt.Data.Length == 0) { @@ -76,7 +76,7 @@ public ConvertTypedDataToSignToNethereum(TypedDataToSign typedDataToSign) }; } - internal TypedData ConvertToNethereumTypedDataWithoutSalt() + public TypedData ConvertToNethereumTypedDataWithoutSalt() { var nethereumDomain = new Nethereum.ABI.EIP712.Domain() { @@ -131,7 +131,7 @@ private Dictionary AddNamedTypesInNethereumFormat(D return nethereumTypes; } - private MemberValue[] ConvertMessageForNethereum() + public MemberValue[] ConvertMessageForNethereum() { var memberValues = new List(); From 9aa2418bc69ef96b796ce99949fe8f566aa3986c Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 12 Jun 2025 14:46:55 -0400 Subject: [PATCH 051/165] Added FindSignerLeaf and GetSigners methods --- .../Primitives/Config/Config.cs | 10 +++ .../EcosystemWallet/Primitives/Config/Leaf.cs | 7 +- .../Primitives/Config/SapientSigner.cs | 8 ++ .../Primitives/Config/SapientSigner.cs.meta | 3 + .../Primitives/Config/Signer.cs | 88 +++++++++++++++++++ .../Primitives/Config/Signer.cs.meta | 3 + .../Primitives/Config/Topology.cs | 33 +++++++ 7 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSigner.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSigner.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs index 6ed9305f..896d07c9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs @@ -8,5 +8,15 @@ internal class Config public BigInteger checkpoint; public Topology topology; public Address checkpointer; + + public Leaf FindSignerLeaf(Address address) + { + if (topology == null) + { + return null; + } + + return topology.FindSignerLeaf(address); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs index 2cdef16c..9c66ffed 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs @@ -2,6 +2,11 @@ namespace Sequence.EcosystemWallet.Primitives { internal abstract class Leaf : RawLeaf { - + public bool isSignerLeaf => this is SignerLeaf; + public bool isSapientSignerLeaf => this is SapientSignerLeaf; + public bool isSubdigestLeaf => this is SubdigestLeaf; + public bool isAnyAddressSubdigestLeaf => this is AnyAddressSubdigestLeaf; + public bool isNodeLeaf => this is NodeLeaf; + public bool isNestedLeaf => this is NestedLeaf; } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSigner.cs new file mode 100644 index 00000000..47e646c0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSigner.cs @@ -0,0 +1,8 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + internal class SapientSigner + { + public Address address; + public string imageHash; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSigner.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSigner.cs.meta new file mode 100644 index 00000000..e3a8d21f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSigner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 46460864f16b498083767fddd18e64d9 +timeCreated: 1749748371 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs new file mode 100644 index 00000000..ecaeded2 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class Signer + { + public Address[] signers; + public SapientSigner[] sapientSigners; + public bool isComplete; + + public static Signer[] GetSigners(Config configuration) + { + if (configuration == null || configuration.topology == null) + { + return null; + } + + return GetSigners(configuration.topology); + } + + public static Signer[] GetSigners(Topology topology) + { + if (topology == null) + { + return null; + } + + var signers = new List
(); + var sapientSigners = new List(); + bool isComplete = true; + + void Scan(Topology top) + { + if (top.IsNode()) + { + Scan(top.Node.left); + Scan(top.Node.right); + } + else if (top.IsLeaf()) + { + if (top.Leaf.isSignerLeaf) + { + SignerLeaf signerLeaf = (SignerLeaf)top.Leaf; + if (signerLeaf.weight > 0) + { + signers.Add(signerLeaf.address); + } + } + else if (top.Leaf.isSapientSignerLeaf) + { + SapientSignerLeaf sapientLeaf = (SapientSignerLeaf)top.Leaf; + sapientSigners.Add(new SapientSigner + { + address = sapientLeaf.address, + imageHash = sapientLeaf.imageHash + }); + } + else if (top.Leaf.isNodeLeaf) + { + isComplete = false; + } + else if (top.Leaf.isNestedLeaf) + { + NestedLeaf nestedLeaf = (NestedLeaf)top.Leaf; + if (nestedLeaf.weight > 0) + { + Scan(nestedLeaf.tree); + } + } + } + } + + Scan(topology); + + return new Signer[] + { + new Signer + { + signers = signers.ToArray(), + sapientSigners = sapientSigners.ToArray(), + isComplete = isComplete + } + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs.meta new file mode 100644 index 00000000..294f2f97 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ee645338ed2746a3834fefbeaae5e833 +timeCreated: 1749748321 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index cd1f3b48..5b5a0e40 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -24,5 +24,38 @@ public bool IsNode() { return this.Node != null; } + + public Leaf FindSignerLeaf(Address address) + { + if (IsNode()) + { + Leaf leftResult = Node.left.FindSignerLeaf(address); + if (leftResult != null) + { + return leftResult; + } + return Node.right.FindSignerLeaf(address); + } + else if (IsLeaf()) + { + if (Leaf.isSignerLeaf) + { + SignerLeaf signerLeaf = (SignerLeaf)Leaf; + if (signerLeaf.address.Equals(address)) + { + return signerLeaf; + } + } + else if (Leaf.isSapientSignerLeaf) + { + SapientSignerLeaf sapientLeaf = (SapientSignerLeaf)Leaf; + if (sapientLeaf.address.Equals(address)) + { + return sapientLeaf; + } + } + } + return null; + } } } \ No newline at end of file From 4ae07900997d6ae5f93ece25036386045e13c183 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 12 Jun 2025 15:58:09 -0400 Subject: [PATCH 052/165] Added ability to get weight of a topology or config - adding Weight class --- .../Primitives/Config/Weigth.cs | 85 +++++++++++++++++++ .../Primitives/Config/Weigth.cs.meta | 3 + 2 files changed, 88 insertions(+) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs new file mode 100644 index 00000000..fcd13fad --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs @@ -0,0 +1,85 @@ +using System; +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class Weigth + { + public BigInteger weight; + public BigInteger maxWeight; + + public static Weigth GetWeight(RawTopology topology, Func canSign) + { + if (topology == null) + { + return new Weigth { weight = 0, maxWeight = 0 }; + } + + if (topology.IsNode()) + { + var left = GetWeight(topology.Node.left, canSign); + var right = GetWeight(topology.Node.right, canSign); + return new Weigth + { + weight = left.weight + right.weight, + maxWeight = left.maxWeight + right.maxWeight + }; + } + else if (topology.IsLeaf()) + { + return GetWeightForLeaf(topology.Leaf, canSign); + } + + return new Weigth { weight = 0, maxWeight = 0 }; + } + + public static Weigth GetWeight(RawConfig configuration, Func canSign) + { + if (configuration?.topology == null) + { + return new Weigth { weight = 0, maxWeight = 0 }; + } + + return GetWeight(configuration.topology, canSign); + } + + private static Weigth GetWeightForLeaf(RawLeaf leaf, Func canSign) + { + if (leaf is SignedSignerLeaf signedSigner) + { + return new Weigth { weight = signedSigner.weight, maxWeight = signedSigner.weight }; + } + if (leaf is SignedSapientSignerLeaf signedSapient) + { + return new Weigth { weight = signedSapient.weight, maxWeight = signedSapient.weight }; + } + if (leaf is RawSignerLeaf rawSigner) + { + return new Weigth { weight = rawSigner.weight, maxWeight = rawSigner.weight }; + } + if (leaf is SignerLeaf signer) + { + BigInteger maxWeight = canSign(signer) ? signer.weight : 0; + return new Weigth { weight = 0, maxWeight = maxWeight }; + } + if (leaf is SapientSignerLeaf sapient) + { + BigInteger maxWeight = canSign(sapient) ? sapient.weight : 0; + return new Weigth { weight = 0, maxWeight = maxWeight }; + } + if (leaf is SubdigestLeaf || leaf is AnyAddressSubdigestLeaf || leaf is NodeLeaf) + { + return new Weigth { weight = 0, maxWeight = 0 }; + } + if (leaf is RawNestedLeaf rawNested) + { + var result = GetWeight(rawNested.tree, canSign); + BigInteger weight = result.weight >= rawNested.threshold ? rawNested.weight : 0; + BigInteger maxWeight = result.maxWeight >= rawNested.threshold ? rawNested.weight : 0; + return new Weigth { weight = weight, maxWeight = maxWeight }; + } + + return new Weigth { weight = 0, maxWeight = 0 }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs.meta new file mode 100644 index 00000000..940804a6 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 457086af22864215b1882e7fefc9ce63 +timeCreated: 1749754054 \ No newline at end of file From 9980b2e28ed1e1e1f23fb8ccbea566a09daf16b3 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Thu, 12 Jun 2025 16:27:17 -0400 Subject: [PATCH 053/165] Added HashConfiguration method --- .../Primitives/Config/Config.cs | 24 +++++ .../Primitives/Config/Topology.cs | 76 ++++++++++++++++ .../Primitives/Config/WeightCalculator.cs | 91 +++++++++++++++++++ .../Config/WeightCalculator.cs.meta | 11 +++ .../Primitives/Config/Weigth.cs | 1 + 5 files changed, 203 insertions(+) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs index 896d07c9..11c9e595 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs @@ -1,4 +1,6 @@ using System.Numerics; +using Sequence.ABI; +using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives { @@ -18,5 +20,27 @@ public Leaf FindSignerLeaf(Address address) return topology.FindSignerLeaf(address); } + + public byte[] HashConfiguration() + { + if (topology == null) + { + return null; + } + + byte[] root = topology.HashConfiguration(); + + byte[] thresholdBytes = threshold.ByteArrayFromNumber().PadLeft(32); + root = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(root, thresholdBytes)); + + byte[] checkpointBytes = checkpoint.ByteArrayFromNumber().PadLeft(32); + root = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(root, checkpointBytes)); + + string checkpointerAddress = checkpointer?.Value ?? "0x0000000000000000000000000000000000000000"; + byte[] checkpointerBytes = checkpointerAddress.HexStringToByteArray().PadLeft(32); + root = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(root, checkpointerBytes)); + + return root; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index 5b5a0e40..01c91a22 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -1,3 +1,9 @@ +using System; +using System.Numerics; +using System.Text; +using Sequence.ABI; +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { internal class Topology @@ -57,5 +63,75 @@ public Leaf FindSignerLeaf(Address address) } return null; } + + // Todo once tests are passing refactor to use a HashConfiguration method on the leafs specifically, we can add an abstract method to be overwritten + public byte[] HashConfiguration() + { + if (IsNode()) + { + byte[] leftHash = Node.left.HashConfiguration(); + byte[] rightHash = Node.right.HashConfiguration(); + return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(leftHash, rightHash)); + } + + if (Leaf.isSignerLeaf) + { + SignerLeaf signerLeaf = (SignerLeaf)Leaf; + byte[] prefix = Encoding.UTF8.GetBytes("Sequence signer:\n"); + byte[] address = signerLeaf.address.Value.HexStringToByteArray(); + byte[] weight = signerLeaf.weight.ByteArrayFromNumber().PadLeft(32); + + return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, address, weight)); + } + + if (Leaf.isSapientSignerLeaf) + { + SapientSignerLeaf sapientLeaf = (SapientSignerLeaf)Leaf; + byte[] prefix = Encoding.UTF8.GetBytes("Sequence sapient config:\n"); + byte[] address = sapientLeaf.address.Value.HexStringToByteArray(); + byte[] weight = sapientLeaf.weight.ByteArrayFromNumber().PadLeft(32); + byte[] imageHash = sapientLeaf.imageHash.HexStringToByteArray().PadLeft(32); + + return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, address, weight, imageHash)); + } + + if (Leaf.isSubdigestLeaf) + { + SubdigestLeaf subdigestLeaf = (SubdigestLeaf)Leaf; + byte[] prefix = Encoding.UTF8.GetBytes("Sequence static digest:\n"); + byte[] digest = subdigestLeaf.digest; + + return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, digest)); + } + + if (Leaf.isAnyAddressSubdigestLeaf) + { + AnyAddressSubdigestLeaf anyAddressSubdigestLeaf = (AnyAddressSubdigestLeaf)Leaf; + byte[] prefix = Encoding.UTF8.GetBytes("Sequence any address subdigest:\n"); + byte[] digest = anyAddressSubdigestLeaf.digest; + + return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, digest)); + } + + if (Leaf.isNodeLeaf) + { + // In the JS code, this just returns the topology itself, but in C# we need to return bytes + // Since NodeLeaf doesn't have any properties to hash, we'll return a byte array + return new byte[]{}; + } + + if (Leaf.isNestedLeaf) + { + NestedLeaf nestedLeaf = (NestedLeaf)Leaf; + byte[] prefix = Encoding.UTF8.GetBytes("Sequence nested config:\n"); + byte[] treeHash = nestedLeaf.tree.HashConfiguration(); + byte[] threshold = nestedLeaf.threshold.ByteArrayFromNumber().PadLeft(32); + byte[] weight = nestedLeaf.weight.ByteArrayFromNumber().PadLeft(32); + + return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, treeHash, threshold, weight)); + } + + throw new InvalidOperationException($"Invalid topology, given {GetType()}"); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs new file mode 100644 index 00000000..5631c6a0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs @@ -0,0 +1,91 @@ +using System; +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + internal class WeightCalculator + { + public struct WeightResult + { + public BigInteger weight; + public BigInteger maxWeight; + } + + public static WeightResult GetWeight(RawTopology topology, Func canSign) + { + if (topology == null) + { + return new WeightResult { weight = 0, maxWeight = 0 }; + } + + if (topology.IsNode()) + { + var left = GetWeight(topology.Node.left, canSign); + var right = GetWeight(topology.Node.right, canSign); + return new WeightResult + { + weight = left.weight + right.weight, + maxWeight = left.maxWeight + right.maxWeight + }; + } + else if (topology.IsLeaf()) + { + return GetWeightForLeaf(topology.Leaf, canSign); + } + + return new WeightResult { weight = 0, maxWeight = 0 }; + } + + public static WeightResult GetWeight(RawConfig configuration, Func canSign) + { + if (configuration?.topology == null) + { + return new WeightResult { weight = 0, maxWeight = 0 }; + } + + return GetWeight(configuration.topology, canSign); + } + + private static WeightResult GetWeightForLeaf(RawLeaf leaf, Func canSign) + { + // Handle signed leaves (they have weight) + if (leaf is SignedSignerLeaf signedSigner) + { + return new WeightResult { weight = signedSigner.weight, maxWeight = signedSigner.weight }; + } + else if (leaf is SignedSapientSignerLeaf signedSapient) + { + return new WeightResult { weight = signedSapient.weight, maxWeight = signedSapient.weight }; + } + else if (leaf is RawSignerLeaf rawSigner) + { + return new WeightResult { weight = rawSigner.weight, maxWeight = rawSigner.weight }; + } + // Handle unsigned leaves that can potentially be signed + else if (leaf is SignerLeaf signer) + { + BigInteger maxWeight = canSign(signer) ? signer.weight : 0; + return new WeightResult { weight = 0, maxWeight = maxWeight }; + } + else if (leaf is SapientSignerLeaf sapient) + { + BigInteger maxWeight = canSign(sapient) ? sapient.weight : 0; + return new WeightResult { weight = 0, maxWeight = maxWeight }; + } + // Handle other leaf types + else if (leaf is SubdigestLeaf || leaf is AnyAddressSubdigestLeaf || leaf is NodeLeaf) + { + return new WeightResult { weight = 0, maxWeight = 0 }; + } + else if (leaf is RawNestedLeaf rawNested) + { + var result = GetWeight(rawNested.tree, canSign); + BigInteger weight = result.weight >= rawNested.threshold ? rawNested.weight : 0; + BigInteger maxWeight = result.maxWeight >= rawNested.threshold ? rawNested.weight : 0; + return new WeightResult { weight = weight, maxWeight = maxWeight }; + } + + return new WeightResult { weight = 0, maxWeight = 0 }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs.meta new file mode 100644 index 00000000..08dda4bd --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ed7f1a79a8a9f41b696860cf81826754 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs index fcd13fad..5f3cc1aa 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs @@ -43,6 +43,7 @@ public static Weigth GetWeight(RawConfig configuration, Func canSign return GetWeight(configuration.topology, canSign); } + // Todo once tests are passing refactor to get the weight on the leafs directly, we can create an abstract method and overwrite it private static Weigth GetWeightForLeaf(RawLeaf leaf, Func canSign) { if (leaf is SignedSignerLeaf signedSigner) From 27c302b148a9587e1511b96556a58dd70ef97ae4 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Fri, 13 Jun 2025 10:03:16 -0400 Subject: [PATCH 054/165] Added ability to make topology from leaves --- .../EcosystemWallet/Primitives/Config/Node.cs | 6 ++++ .../Primitives/Config/Topology.cs | 28 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs index 698d9c2c..14be45c1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs @@ -4,5 +4,11 @@ internal class Node { public Topology left; public Topology right; + + public Node(Topology left, Topology right) + { + this.left = left; + this.right = right; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index 01c91a22..ac498aab 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -1,6 +1,7 @@ using System; using System.Numerics; using System.Text; +using System.Collections.Generic; using Sequence.ABI; using Sequence.Utils; @@ -21,6 +22,33 @@ public Topology(Node node) this.Node = node; } + public static Topology FromLeaves(List leaves) + { + if (leaves == null || leaves.Count == 0) + { + throw new ArgumentException("Cannot create topology from empty leaves"); + } + + if (leaves.Count == 1) + { + return new Topology(leaves[0]); + } + + if (leaves.Count == 2) + { + return new Topology(new Node( + new Topology(leaves[0]), + new Topology(leaves[1]) + )); + } + + int midPoint = leaves.Count / 2; + return new Topology(new Node( + FromLeaves(leaves.GetRange(0, midPoint)), + FromLeaves(leaves.GetRange(midPoint, leaves.Count - midPoint)) + )); + } + public bool IsLeaf() { return this.Leaf != null; From a8487683aa0cbd499772424e3f8185edc804ff63 Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Fri, 13 Jun 2025 15:30:55 -0400 Subject: [PATCH 055/165] Added Topology.Encode method --- .../Primitives/Config/Config.cs | 14 ++++ .../Primitives/Config/Topology.cs | 70 +++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs index 11c9e595..86ae272f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs @@ -1,4 +1,5 @@ using System.Numerics; +using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; @@ -42,5 +43,18 @@ public byte[] HashConfiguration() return root; } + + public string ToJson() + { + var jsonObject = new + { + threshold = threshold.ToString(), + checkpoint = checkpoint.ToString(), + topology = topology?.Encode(), + checkpointer = checkpointer?.Value + }; + + return JsonConvert.SerializeObject(jsonObject); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index ac498aab..03a18968 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -92,6 +92,76 @@ public Leaf FindSignerLeaf(Address address) return null; } + // Todo refactor + public object Encode() + { + if (IsNode()) + { + return new object[] + { + Node.left.Encode(), + Node.right.Encode() + }; + } + else if (Leaf.isSignerLeaf) + { + SignerLeaf signerLeaf = (SignerLeaf)Leaf; + return new + { + type = "signer", + address = signerLeaf.address, + weight = signerLeaf.weight.ToString() + }; + } + else if (Leaf.isSapientSignerLeaf) + { + SapientSignerLeaf sapientLeaf = (SapientSignerLeaf)Leaf; + return new + { + type = "sapient-signer", + address = sapientLeaf.address, + weight = sapientLeaf.weight.ToString(), + imageHash = sapientLeaf.imageHash + }; + } + else if (Leaf.isSubdigestLeaf) + { + SubdigestLeaf subdigestLeaf = (SubdigestLeaf)Leaf; + return new + { + type = "subdigest", + digest = subdigestLeaf.digest.ByteArrayToHexString() + }; + } + else if (Leaf.isAnyAddressSubdigestLeaf) + { + AnyAddressSubdigestLeaf anyAddressSubdigestLeaf = (AnyAddressSubdigestLeaf)Leaf; + return new + { + type = "any-address-subdigest", + digest = anyAddressSubdigestLeaf.digest.ByteArrayToHexString() + }; + } + else if (Leaf.isNodeLeaf) + { + NodeLeaf nodeLeaf = (NodeLeaf)Leaf; + return nodeLeaf.Value.ByteArrayToHexString(); + } + else if (Leaf.isNestedLeaf) + { + NestedLeaf nestedLeaf = (NestedLeaf)Leaf; + return new + { + type = "nested", + tree = nestedLeaf.tree.Encode(), + weight = nestedLeaf.weight.ToString(), + threshold = nestedLeaf.threshold.ToString() + }; + } + + throw new InvalidOperationException("Invalid topology"); + } + // Todo once tests are passing refactor to use a HashConfiguration method on the leafs specifically, we can add an abstract method to be overwritten public byte[] HashConfiguration() { From 51c16c1b3c1320edeae44a631fc895f110ace63e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 17 Jun 2025 10:05:26 +0200 Subject: [PATCH 056/165] added config and dev tools tests, topology decoding --- .../IntegrationTests/ConfigTests.cs | 159 ++++++++++++++++++ .../IntegrationTests/ConfigTests.cs.meta | 3 + .../IntegrationTests/DevToolsTest.cs | 24 +++ .../IntegrationTests/DevToolsTest.cs.meta | 3 + .../IntegrationTests/Server/Server.cs | 5 + .../Config/AnyAddressSubdigestLeaf.cs | 2 +- .../Primitives/Config/Config.cs | 20 ++- .../EcosystemWallet/Primitives/Config/Leaf.cs | 2 +- .../Primitives/Config/NestedLeaf.cs | 2 +- .../EcosystemWallet/Primitives/Config/Node.cs | 2 +- .../Primitives/Config/NodeLeaf.cs | 2 +- .../Primitives/Config/SapientSigner.cs | 2 +- .../Primitives/Config/SapientSignerLeaf.cs | 2 +- .../Primitives/Config/Signer.cs | 2 +- .../Primitives/Config/SignerLeaf.cs | 2 +- .../Primitives/Config/SubdigestLeaf.cs | 2 +- .../Primitives/Config/Topology.cs | 80 ++++++++- .../Primitives/Config/WeightCalculator.cs | 2 +- .../Primitives/Config/Weigth.cs | 2 +- .../Primitives/Signature/RawConfig.cs | 2 +- .../Primitives/Signature/RawLeaf.cs | 2 +- .../Primitives/Signature/RawNode.cs | 2 +- .../Primitives/Signature/RawSignerLeaf.cs | 4 +- .../Primitives/Signature/RawTopology.cs | 2 +- .../Signature/SignatureOfSapientSignerLeaf.cs | 2 +- .../Signature/SignatureOfSignerLeaf.cs | 2 +- 26 files changed, 312 insertions(+), 22 deletions(-) create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs new file mode 100644 index 00000000..9063950f --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; +using System.Numerics; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public class ConfigTests + { + public Task ConfigNew(Dictionary parameters) + { + var threshold = (string)parameters["threshold"]; + var checkpoint = (string)parameters["checkpoint"]; + var content = ((string)parameters["content"]).Split(' '); + var checkpointer = (string)parameters["checkpointer"]; + + var config = new Primitives.Config + { + threshold = BigInteger.Parse(threshold), + checkpoint = checkpoint.HexStringToBigInteger(), + topology = Topology.FromLeaves(ParseContentToLeafs(content)), + checkpointer = new Address(checkpointer) + }; + + return Task.FromResult(config.ToJson()); + } + + public async Task ConfigEncode(Dictionary parameters) + { + throw new NotImplementedException("Not implemented"); + } + + public Task ConfigImageHash(Dictionary parameters) + { + var input = (JsonToken)parameters["input"]; + var inputJson = JsonConvert.SerializeObject(input); + + var config = Primitives.Config.FromJson(inputJson); + var imageHash = config.HashConfiguration().ByteArrayToHexStringWithPrefix(); + return Task.FromResult(imageHash); + } + + private List ParseContentToLeafs(string[] elements) + { + var leaves = new List(); + var index = 0; + + while (index < elements.Length) + { + string firstElement = elements[index]; + string firstElementType = firstElement.Split(':')[0]; + + if (firstElementType == "signer") + { + var parts = firstElement.Split(':'); + string address = parts[1]; + BigInteger weight = BigInteger.Parse(parts[2]); + + leaves.Add(new SignerLeaf + { + address = new Address(address), + weight = weight + }); + + index++; + } + else if (firstElementType == SubdigestLeaf.type) + { + var parts = firstElement.Split(':'); + string digest = parts[1]; + + leaves.Add(new SubdigestLeaf + { + digest = digest.HexStringToByteArray() + }); + + index++; + } + else if (firstElementType == AnyAddressSubdigestLeaf.type) + { + var parts = firstElement.Split(':'); + string digest = parts[1]; + + leaves.Add(new AnyAddressSubdigestLeaf + { + digest = digest.HexStringToByteArray() + }); + + index++; + } + else if (firstElementType == "sapient") + { + var parts = firstElement.Split(':'); + string imageHash = parts[1]; + string address = parts[2]; + BigInteger weight = BigInteger.Parse(parts[3]); + + if (!imageHash.StartsWith("0x") || imageHash.Length != 66) + throw new Exception($"Invalid image hash: {imageHash}"); + + leaves.Add(new SapientSignerLeaf + { + imageHash = imageHash, + address = new Address(address), + weight = weight + }); + + index++; + } + else if (firstElementType == NestedLeaf.type) + { + var parts = firstElement.Split(':'); + BigInteger threshold = BigInteger.Parse(parts[1]); + BigInteger weight = BigInteger.Parse(parts[2]); + + if (index + 1 >= elements.Length || !elements[index + 1].StartsWith("(")) + throw new Exception("Missing nested element group after 'nested'"); + + string nestedGroup = elements[index + 1]; + if (!nestedGroup.EndsWith(")")) + throw new Exception("Unclosed nested group: " + nestedGroup); + + string inner = nestedGroup.Substring(1, nestedGroup.Length - 2); + string[] innerElements = inner.Split(' ', StringSplitOptions.RemoveEmptyEntries); + + leaves.Add(new NestedLeaf + { + threshold = threshold, + weight = weight, + tree = Topology.FromLeaves(ParseContentToLeafs(innerElements)) + }); + + index++; + } + else if (firstElementType == "node") + { + var parts = firstElement.Split(':'); + string hash = parts[1]; + + leaves.Add(new NodeLeaf + { + Value = hash.HexStringToByteArray() + }); + + index++; + } + else + { + throw new Exception($"Invalid element: {firstElement}"); + } + } + + return leaves; + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs.meta new file mode 100644 index 00000000..0c901dad --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6cb18b91df9a4eb0b23d829424d21f90 +timeCreated: 1750107270 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs new file mode 100644 index 00000000..dfff012d --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public class DevToolsTest + { + public async Task DevToolsRandomConfig(Dictionary parameters) + { + var maxDepth = (int)parameters["maxDepth"]; + var seed = (string)parameters["seed"]; + var minThresholdOnNested = (int)parameters["minThresholdOnNested"]; + var checkpointer = (string)parameters["checkpointer"]; + + throw new NotImplementedException("Not implemented"); + } + + public async Task DevToolsRandomSessionTopology(Dictionary parameters) + { + throw new NotImplementedException("Not implemented"); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs.meta new file mode 100644 index 00000000..3a0c6a18 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fa674b79ccbe4a95a6f31ef385b33de9 +timeCreated: 1750143753 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs index 62e58d13..7dffc4d7 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs @@ -19,6 +19,11 @@ internal class Server ["payload_toPacked"] = async (parameters) => await new PayloadTests().PayloadToPacked(parameters), ["payload_toJson"] = async (parameters) => await new PayloadTests().PayloadToJson(parameters), ["payload_hashFor"] = async (parameters) => await new PayloadTests().PayloadHashFor(parameters), + ["config_new"] = async (parameters) => await new ConfigTests().ConfigNew(parameters), + ["config_encode"] = async (parameters) => await new ConfigTests().ConfigEncode(parameters), + ["config_imageHash"] = async (parameters) => await new ConfigTests().ConfigImageHash(parameters), + ["devTools_randomConfig"] = async (parameters) => await new DevToolsTest().DevToolsRandomConfig(parameters), + ["devTools_randomSessionTopology"] = async (parameters) => await new DevToolsTest().DevToolsRandomConfig(parameters), }; public async Task HandleSingleRequest( diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs index 586934f2..4a92a2c7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class AnyAddressSubdigestLeaf : Leaf + public class AnyAddressSubdigestLeaf : Leaf { public const string type = "any-address-subdigest"; public byte[] digest; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs index 86ae272f..0a0a1cfe 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Numerics; using Newtonsoft.Json; using Sequence.ABI; @@ -5,7 +6,7 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class Config + public class Config { public BigInteger threshold; public BigInteger checkpoint; @@ -44,6 +45,23 @@ public byte[] HashConfiguration() return root; } + public static Config FromJson(string json) + { + var parsed = JsonConvert.DeserializeObject>(json); + var threshold = (string)parsed["threshold"]; + var checkpoint = (string)parsed["checkpoint"]; + var checkpointer = (string)parsed["checkpointer"]; + var topology = JsonConvert.SerializeObject((Dictionary)parsed["topology"]); + + return new Config + { + threshold = BigInteger.Parse(threshold), + checkpoint = BigInteger.Parse(checkpoint), + checkpointer = new Address(checkpointer), + topology = Topology.Decode(topology) + }; + } + public string ToJson() { var jsonObject = new diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs index 9c66ffed..2f6077af 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal abstract class Leaf : RawLeaf + public abstract class Leaf : RawLeaf { public bool isSignerLeaf => this is SignerLeaf; public bool isSapientSignerLeaf => this is SapientSignerLeaf; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs index e950dde5..9f14a0b2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs @@ -2,7 +2,7 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class NestedLeaf : Leaf + public class NestedLeaf : Leaf { public const string type = "nested"; public Topology tree; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs index 14be45c1..a2305bcf 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class Node + public class Node { public Topology left; public Topology right; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs index c45b73dd..d88dd6b6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class NodeLeaf : Leaf + public class NodeLeaf : Leaf { public byte[] Value; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSigner.cs index 47e646c0..ba4a700d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSigner.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class SapientSigner + public class SapientSigner { public Address address; public string imageHash; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs index 6e743de4..e87e8628 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs @@ -2,7 +2,7 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class SapientSignerLeaf : Leaf + public class SapientSignerLeaf : Leaf { public const string type = "sapient-signer"; public Address address; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs index ecaeded2..266545b1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs @@ -4,7 +4,7 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class Signer + public class Signer { public Address[] signers; public SapientSigner[] sapientSigners; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs index 5395e705..00542d86 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs @@ -2,7 +2,7 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class SignerLeaf : Leaf + public class SignerLeaf : Leaf { public const string type = "signer"; public Address address; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs index 6e68af81..ac147427 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class SubdigestLeaf : Leaf + public class SubdigestLeaf : Leaf { public const string type = "subdigest"; public byte[] digest; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index 03a18968..fc296b5a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -2,12 +2,13 @@ using System.Numerics; using System.Text; using System.Collections.Generic; +using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives { - internal class Topology + public class Topology { public Node Node; public Leaf Leaf; @@ -162,6 +163,83 @@ public object Encode() throw new InvalidOperationException("Invalid topology"); } + public static Topology Decode(string input) + { + // Case: array → binary node + /* if (obj is List list) + { + if (list.Count != 2) + { + throw new Exception("Invalid node structure in JSON"); + } + + return new List + { + DecodeTopology(list[0]), + DecodeTopology(list[1]) + }; + } + + // Case: string → leaf node (digest hash or node ID) + if (input.IsHexFormat()) + { + Leaf + return hex; + }*/ + + var data = JsonConvert.DeserializeObject>(input); + string type = (string)data["type"]; + Leaf leaf; + + switch (type) + { + case "signer": + leaf = new SignerLeaf + { + address = new Address((string)data["address"]), + weight = BigInteger.Parse((string)data["weight"]) + }; + + break; + case "sapient-signer": + leaf = new SapientSignerLeaf + { + address = new Address((string)data["address"]), + weight = BigInteger.Parse((string)data["weight"]), + imageHash = (string)data["imageHash"] + }; + + break; + case "subdigest": + leaf = new SubdigestLeaf + { + digest = ((string)data["digest"]).HexStringToByteArray() + }; + + break; + case "any-address-subdigest": + leaf = new AnyAddressSubdigestLeaf + { + digest = ((string)data["digest"]).HexStringToByteArray() + }; + + break; + case "nested": + leaf = new NestedLeaf + { + tree = FromLeaves(null), + weight = BigInteger.Parse((string)data["weight"]), + threshold = BigInteger.Parse((string)data["threshold"]) + }; + + break; + default: + throw new Exception("Invalid type in topology JSON"); + } + + return new Topology(leaf); + } + // Todo once tests are passing refactor to use a HashConfiguration method on the leafs specifically, we can add an abstract method to be overwritten public byte[] HashConfiguration() { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs index 5631c6a0..eb50b760 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs @@ -3,7 +3,7 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class WeightCalculator + public class WeightCalculator { public struct WeightResult { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs index 5f3cc1aa..bb7e3504 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs @@ -3,7 +3,7 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class Weigth + public class Weigth { public BigInteger weight; public BigInteger maxWeight; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs index b5d07045..a2483296 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs @@ -2,7 +2,7 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class RawConfig + public class RawConfig { public BigInteger threshold; public BigInteger checkpoint; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs index 88ef4c98..f1c07f4c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal abstract class RawLeaf + public abstract class RawLeaf { } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs index fd93ca7f..0c01fc86 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class RawNode + public class RawNode { public RawTopology left; public RawTopology right; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs index 33283d32..d988f4ae 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs @@ -2,14 +2,14 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class RawSignerLeaf : RawLeaf + public class RawSignerLeaf : RawLeaf { public const string type = "unrecovered-signer"; public BigInteger weight; public SignatureType signature; } - internal abstract class SignatureType + public abstract class SignatureType { } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs index db8e5dad..53d1954d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class RawTopology + public class RawTopology { public RawLeaf Leaf { get; private set; } public RawNode Node { get; private set; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs index 68da0579..8f887aed 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class SignatureOfSapientSignerLeaf : SignatureType + public class SignatureOfSapientSignerLeaf : SignatureType { public Address address; public byte[] data; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs index 0b8ccd53..94583104 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal abstract class SignatureOfSignerLeaf : SignatureType + public abstract class SignatureOfSignerLeaf : SignatureType { } From a187fdbba58d4f1605a384728d35606674296b07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 17 Jun 2025 15:41:53 +0200 Subject: [PATCH 057/165] signing topologies --- .../IntegrationTests/ConfigTests.cs | 61 ++++---- .../IntegrationTests/DevToolsTest.cs | 12 +- .../IntegrationTests/Server/Server.cs | 6 +- .../IntegrationTests/SignatureTests.cs | 36 +++++ .../IntegrationTests/SignatureTests.cs.meta | 3 + .../IntegrationTests/Utils.meta | 3 + .../IntegrationTests/Utils/ConfigUtils.cs | 28 ++++ .../Utils/ConfigUtils.cs.meta | 3 + .../Utils/IntegrationTestParamsUtils.cs | 23 +++ .../Utils/IntegrationTestParamsUtils.cs.meta | 3 + .../IntegrationTests/Utils/SignatureUtils.cs | 136 ++++++++++++++++++ .../Utils/SignatureUtils.cs.meta | 3 + .../Android/AndroidKeyBridge.java.meta | 2 +- .../Primitives/Config/Config.cs | 18 +-- .../Primitives/Config/SapientSignerLeaf.cs | 2 +- .../Primitives/Config/SignerLeaf.cs | 2 +- .../Primitives/Config/Topology.cs | 12 +- .../Primitives/Signature/ChainedSignature.cs | 57 ++++++++ .../Signature/ChainedSignature.cs.meta | 3 + .../Primitives/Signature/RSY.cs | 2 +- .../Primitives/Signature/RawSignature.cs | 80 ++++++++++- .../Primitives/Signature/Signature.cs | 68 ++++++++- .../Signature/SignatureOfSignerLeafErc1271.cs | 2 +- .../Signature/SignatureOfSignerLeafEthSign.cs | 2 +- .../Signature/SignatureOfSignerLeafHash.cs | 2 +- .../Signature/SignedSapientSignerLeaf.cs | 2 +- .../Primitives/Signature/SignedSignerLeaf.cs | 2 +- .../SequenceSDK/Utils/DictionaryExtensions.cs | 3 +- 28 files changed, 496 insertions(+), 80 deletions(-) create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs index 9063950f..60891e8a 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Numerics; using System.Threading.Tasks; -using Newtonsoft.Json; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; @@ -14,43 +13,42 @@ public Task ConfigNew(Dictionary parameters) { var threshold = (string)parameters["threshold"]; var checkpoint = (string)parameters["checkpoint"]; - var content = ((string)parameters["content"]).Split(' '); - var checkpointer = (string)parameters["checkpointer"]; + var content = (string)parameters["content"]; + + var checkpointer = parameters.TryGetValue("checkpointer", out var checkpointerValue) && + checkpointerValue != null ? new Address(checkpointerValue as string) : null; var config = new Primitives.Config { threshold = BigInteger.Parse(threshold), checkpoint = checkpoint.HexStringToBigInteger(), topology = Topology.FromLeaves(ParseContentToLeafs(content)), - checkpointer = new Address(checkpointer) + checkpointer = checkpointer }; return Task.FromResult(config.ToJson()); } - public async Task ConfigEncode(Dictionary parameters) + public Task ConfigEncode(Dictionary parameters) { - throw new NotImplementedException("Not implemented"); + throw new System.NotImplementedException(); } public Task ConfigImageHash(Dictionary parameters) { - var input = (JsonToken)parameters["input"]; - var inputJson = JsonConvert.SerializeObject(input); - - var config = Primitives.Config.FromJson(inputJson); + var input = parameters["input"].ToString(); + var config = ConfigUtils.FromJson(input); var imageHash = config.HashConfiguration().ByteArrayToHexStringWithPrefix(); return Task.FromResult(imageHash); } - private List ParseContentToLeafs(string[] elements) + private List ParseContentToLeafs(string elements) { var leaves = new List(); - var index = 0; - while (index < elements.Length) + while (!string.IsNullOrWhiteSpace(elements)) { - string firstElement = elements[index]; + string firstElement = elements.Split(' ')[0]; string firstElementType = firstElement.Split(':')[0]; if (firstElementType == "signer") @@ -61,13 +59,13 @@ private List ParseContentToLeafs(string[] elements) leaves.Add(new SignerLeaf { - address = new Address(address), + address = new Address(address), weight = weight }); - index++; + elements = elements.Substring(firstElement.Length).TrimStart(); } - else if (firstElementType == SubdigestLeaf.type) + else if (firstElementType == "subdigest") { var parts = firstElement.Split(':'); string digest = parts[1]; @@ -77,9 +75,9 @@ private List ParseContentToLeafs(string[] elements) digest = digest.HexStringToByteArray() }); - index++; + elements = elements.Substring(firstElement.Length).TrimStart(); } - else if (firstElementType == AnyAddressSubdigestLeaf.type) + else if (firstElementType == "any-address-subdigest") { var parts = firstElement.Split(':'); string digest = parts[1]; @@ -89,7 +87,7 @@ private List ParseContentToLeafs(string[] elements) digest = digest.HexStringToByteArray() }); - index++; + elements = elements.Substring(firstElement.Length).TrimStart(); } else if (firstElementType == "sapient") { @@ -108,32 +106,29 @@ private List ParseContentToLeafs(string[] elements) weight = weight }); - index++; + elements = elements.Substring(firstElement.Length).TrimStart(); } - else if (firstElementType == NestedLeaf.type) + else if (firstElementType == "nested") { var parts = firstElement.Split(':'); BigInteger threshold = BigInteger.Parse(parts[1]); BigInteger weight = BigInteger.Parse(parts[2]); - if (index + 1 >= elements.Length || !elements[index + 1].StartsWith("(")) - throw new Exception("Missing nested element group after 'nested'"); - - string nestedGroup = elements[index + 1]; - if (!nestedGroup.EndsWith(")")) - throw new Exception("Unclosed nested group: " + nestedGroup); + int start = elements.IndexOf('('); + int end = elements.IndexOf(')'); + if (start == -1 || end == -1) + throw new Exception($"Missing ( ) for nested element: {elements}"); - string inner = nestedGroup.Substring(1, nestedGroup.Length - 2); - string[] innerElements = inner.Split(' ', StringSplitOptions.RemoveEmptyEntries); + string inner = elements.Substring(start + 1, end - start - 1); leaves.Add(new NestedLeaf { threshold = threshold, weight = weight, - tree = Topology.FromLeaves(ParseContentToLeafs(innerElements)) + tree = Topology.FromLeaves(ParseContentToLeafs(inner)) }); - index++; + elements = elements.Substring(end + 1).TrimStart(); } else if (firstElementType == "node") { @@ -145,7 +140,7 @@ private List ParseContentToLeafs(string[] elements) Value = hash.HexStringToByteArray() }); - index++; + elements = elements.Substring(firstElement.Length).TrimStart(); } else { diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs index dfff012d..e1014f91 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs @@ -6,19 +6,19 @@ namespace Sequence.EcosystemWallet.IntegrationTests { public class DevToolsTest { - public async Task DevToolsRandomConfig(Dictionary parameters) + public Task DevToolsRandomConfig(Dictionary parameters) { - var maxDepth = (int)parameters["maxDepth"]; + var maxDepth = parameters["maxDepth"].ToString(); var seed = (string)parameters["seed"]; - var minThresholdOnNested = (int)parameters["minThresholdOnNested"]; + var minThresholdOnNested = parameters["minThresholdOnNested"].ToString(); var checkpointer = (string)parameters["checkpointer"]; - throw new NotImplementedException("Not implemented"); + return Task.FromResult(""); } - public async Task DevToolsRandomSessionTopology(Dictionary parameters) + public Task DevToolsRandomSessionTopology(Dictionary parameters) { - throw new NotImplementedException("Not implemented"); + return Task.FromResult(""); } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs index 7dffc4d7..c0554282 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs @@ -23,7 +23,9 @@ internal class Server ["config_encode"] = async (parameters) => await new ConfigTests().ConfigEncode(parameters), ["config_imageHash"] = async (parameters) => await new ConfigTests().ConfigImageHash(parameters), ["devTools_randomConfig"] = async (parameters) => await new DevToolsTest().DevToolsRandomConfig(parameters), - ["devTools_randomSessionTopology"] = async (parameters) => await new DevToolsTest().DevToolsRandomConfig(parameters), + ["devTools_randomSessionTopology"] = async (parameters) => await new DevToolsTest().DevToolsRandomSessionTopology(parameters), + ["signature_encode"] = async (parameters) => await new SignatureTests().SignatureEncode(parameters), + ["signature_concat"] = async (parameters) => await new SignatureTests().SignatureConcat(parameters), }; public async Task HandleSingleRequest( @@ -117,7 +119,7 @@ public async Task HandleSingleRequest( JsonRpcErrorResponse error = new JsonRpcErrorResponse(new JsonRpcErrorResponse.Error(-32000, $"Unknown error: {ex.Message}"), id); if (!silent) { - Debug.LogError($"[{DateTime.UtcNow:O}] Error response: {(debug ? JsonConvert.SerializeObject(error) : error.error.message)}"); + Debug.LogError($"[{DateTime.UtcNow:O}] Error response: {(debug ? JsonConvert.SerializeObject(error) : error.error.message)} {ex.StackTrace}"); } return error; } diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs new file mode 100644 index 00000000..6d492adf --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Newtonsoft.Json; +using UnityEngine; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public class SignatureTests + { + public Task SignatureEncode(Dictionary parameters) + { + var signatures = (string)parameters["signatures"]; + var chainId = (bool)parameters["chainId"]; + + var input = parameters.GetNestedObjects("input"); + Debug.Log($"## Parameters {JsonConvert.SerializeObject(parameters)}"); + Debug.Log($"## Input {JsonConvert.SerializeObject(input)}"); + + var threshold = (string)input["threshold"]; + var checkpoint = (string)input["checkpoint"]; + var checkpointer = input.GetAddress("checkpointer"); + + return Task.FromResult(""); + } + + public Task SignatureDecode(Dictionary parameters) + { + throw new System.NotImplementedException(); + } + + public Task SignatureConcat(Dictionary parameters) + { + return Task.FromResult(""); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs.meta new file mode 100644 index 00000000..3813916d --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e9f2efd497c548a0938a764d667b4db5 +timeCreated: 1750148218 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils.meta new file mode 100644 index 00000000..7390b3ec --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9f231ef218604f2bbd211b7963016a43 +timeCreated: 1750151204 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs new file mode 100644 index 00000000..ed28e755 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.Numerics; +using Newtonsoft.Json; +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public static class ConfigUtils + { + public static Primitives.Config FromJson(string json) + { + var input = JsonConvert.DeserializeObject>(json); + + var threshold = (string)input["threshold"]; + var checkpoint = (string)input["checkpoint"]; + var checkpointer = input.GetAddress("checkpointer"); + var topology = input["topology"].ToString(); + + return new Primitives.Config + { + threshold = BigInteger.Parse(threshold), + checkpoint = BigInteger.Parse(checkpoint), + checkpointer = checkpointer, + topology = Topology.Decode(topology) + }; + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs.meta new file mode 100644 index 00000000..cf60d559 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: aacb7d23ba7c4954b30a4ee98a7dbd31 +timeCreated: 1750156470 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs new file mode 100644 index 00000000..1373421f --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public static class IntegrationTestParamsUtils + { + public static Address GetAddress(this Dictionary @params, string key) + { + return @params.TryGetValue(key, out var value) && + value is string valueStr ? new Address(valueStr) : null; + } + + public static Dictionary GetNestedObjects(this Dictionary dict, string key) + { + if (!dict.TryGetValue(key, out var inputObj)) + return null; + + var inputJson = inputObj.ToString(); + return JsonConvert.DeserializeObject>(inputJson); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs.meta new file mode 100644 index 00000000..66d67d29 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7010a713448445a18de2c793d2b75624 +timeCreated: 1750151241 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs new file mode 100644 index 00000000..a1ad111d --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public static class SignatureUtils + { + public static async Task DoEncode(string input, List signatures, bool noChainId, + string? checkpointerData = null) + { + var config = ConfigUtils.FromJson(input); + var allSignatures = signatures.Select(s => + { + var values = s.Split(':'); + return new + { + Address = new Address(values[0]), + Type = values[1], + Values = values.Skip(2).ToArray() + }; + }).ToList(); + + var fullTopology = Signature.FillLeaves(config.topology, leaf => + { + if (leaf.isSignerLeaf) + { + var signerLeaf = leaf as SignerLeaf; + var candidate = allSignatures.FirstOrDefault(s => s.Address == signerLeaf.address); + if (candidate == null) + return null; + + switch (candidate.Type) + { + case "erc1271": + return new SignatureOfSignerLeafErc1271 + { + address = candidate.Address, + data = candidate.Values[0].HexStringToByteArray() + }; + case "eth_sign": + return new SignatureOfSignerLeafEthSign + { + r = new BigInteger(candidate.Values[0].HexStringToByteArray(32)), + s = new BigInteger(candidate.Values[1].HexStringToByteArray(32)), + yParity = OxSignature.VToYParity(int.Parse(candidate.Values[2])), + }; + case "hash": + return new SignatureOfSignerLeafHash + { + r = new BigInteger(candidate.Values[0].HexStringToByteArray(32)), + s = new BigInteger(candidate.Values[1].HexStringToByteArray(32)), + yParity = OxSignature.VToYParity(int.Parse(candidate.Values[2])), + }; + case "sapient": + case "sapient_compact": + throw new Exception($"Incorrect type for leaf"); + default: + throw new Exception($"Unsupported signature type: {candidate.Type}"); + } + } + + if (leaf.isSapientSignerLeaf) + { + var signerLeaf = leaf as SapientSignerLeaf; + var candidate = allSignatures.FirstOrDefault(s => s.Address == signerLeaf.address); + if (candidate == null) + return null; + + switch (candidate.Type) + { + case "sapient": + case "sapient_compact": + return new SignatureOfSapientSignerLeaf + { + address = candidate.Address, + data = candidate.Values[0].HexStringToByteArray(), + }; + case "eth_sign": + case "hash": + case "erc1271": + throw new Exception($"Incorrect type for leaf"); + default: + throw new Exception($"Unsupported signature type: {candidate.Type}"); + } + } + + return null; + }); + + var encoded = Signature.EncodeSignature(new SignatureEncodingInput + { + NoChainId = noChainId, + Configuration = new Configuration + { + topology = fullTopology, + }, + CheckpointerData = checkpointerData != null ? checkpointerData.ToByteArray() : null + }); + + return Hex.FromBytes(encoded); + } + + public static async Task DoConcat(List signatures) + { + if (signatures.Count == 0) + throw new Exception("No signatures provided"); + + var decoded = signatures + .Select(s => Signature.DecodeSignature(Bytes.FromHex(s))) + .ToList(); + + var reEncoded = Signature.EncodeSignature(new SignatureEncodingInput + { + // Copy the base structure + NoChainId = decoded[0].NoChainId, + Configuration = decoded[0].Configuration, + CheckpointerData = decoded[0].CheckpointerData, + Suffix = decoded.Skip(1).ToList() + }); + + return Hex.FromBytes(reEncoded); + } + + public static async Task DoDecode(string signature) + { + var bytes = Bytes.FromHex(signature); + var decoded = Signature.DecodeSignature(bytes); + return Signature.RawSignatureToJson(decoded); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs.meta new file mode 100644 index 00000000..4e11d2b6 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1af89f654c804ffcbe9f059a8b9a3fbc +timeCreated: 1750156421 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta b/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta index fc8abc26..2b981aa8 100644 --- a/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta +++ b/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta @@ -28,7 +28,7 @@ PluginImporter: - first: Android: Android second: - enabled: 1 + enabled: 0 settings: CPU: ARMv7 - first: diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs index 0a0a1cfe..de4bf123 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs @@ -3,6 +3,7 @@ using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -45,23 +46,6 @@ public byte[] HashConfiguration() return root; } - public static Config FromJson(string json) - { - var parsed = JsonConvert.DeserializeObject>(json); - var threshold = (string)parsed["threshold"]; - var checkpoint = (string)parsed["checkpoint"]; - var checkpointer = (string)parsed["checkpointer"]; - var topology = JsonConvert.SerializeObject((Dictionary)parsed["topology"]); - - return new Config - { - threshold = BigInteger.Parse(threshold), - checkpoint = BigInteger.Parse(checkpoint), - checkpointer = new Address(checkpointer), - topology = Topology.Decode(topology) - }; - } - public string ToJson() { var jsonObject = new diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs index e87e8628..35ae1bd3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs @@ -9,6 +9,6 @@ public class SapientSignerLeaf : Leaf public BigInteger weight; public string imageHash; public bool signed; - public SignatureOfSapientSignerLeaf signature; + public SignatureType signature; } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs index 00542d86..73a5c3bf 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs @@ -8,6 +8,6 @@ public class SignerLeaf : Leaf public Address address; public BigInteger weight; public bool signed; - public SignatureOfSignerLeaf signature; + public SignatureType signature; } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index fc296b5a..ba74c906 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -165,23 +165,19 @@ public object Encode() public static Topology Decode(string input) { - // Case: array → binary node - /* if (obj is List list) + if (input.StartsWith("[")) { + var list = JsonConvert.DeserializeObject>(input); if (list.Count != 2) { throw new Exception("Invalid node structure in JSON"); } - return new List - { - DecodeTopology(list[0]), - DecodeTopology(list[1]) - }; + return new Topology(new Node(Decode(list[0].ToString()), Decode(list[1].ToString()))); } // Case: string → leaf node (digest hash or node ID) - if (input.IsHexFormat()) + /*if (input.IsHexFormat()) { Leaf return hex; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs new file mode 100644 index 00000000..e9c3acf9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs @@ -0,0 +1,57 @@ +using System; +using System.Linq; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class ChainedSignature + { + public RawSignature[] signatures; + + public ChainedSignature(RawSignature[] signatures) + { + this.signatures = signatures; + } + + public byte[] Encode() + { + if (signatures == null || signatures.Length == 0) + throw new ArgumentException("Signatures list cannot be empty."); + + byte flag = 0x01; + + var sigForCheckpointer = signatures[^1]; + if (sigForCheckpointer.configuration.checkpointer != null) + { + flag |= 0x40; + } + + byte[] output = new byte[] { flag }; + + if (sigForCheckpointer.configuration.checkpointer != null) + { + output = sigForCheckpointer.configuration.checkpointer.Value.HexStringToByteArray().PadLeft(20).Concat(output).ToArray(); + + var checkpointerDataSize = sigForCheckpointer.checkpointerData?.Length ?? 0; + if (checkpointerDataSize > 16777215) + throw new Exception("Checkpointer data too large"); + + output = output.Concat(sigForCheckpointer.checkpointerData ?? new byte[0]).ToArray(); + } + + for (int i = 0; i < signatures.Length; i++) + { + var signature = signatures[i]; + bool isLast = i == signatures.Length - 1; + + var encoded = signature.Encode(skipCheckpointerData: true, skipCheckpointerAddress: isLast); + if (encoded.Length > 16777215) + throw new Exception("Chained signature too large"); + + output = output.Concat(encoded).ToArray(); + } + + return output; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs.meta new file mode 100644 index 00000000..0e794478 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6ad1783d9cd9402f8bf6b23d53269bbf +timeCreated: 1750161157 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs index 8590f394..9c293c27 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs @@ -2,7 +2,7 @@ namespace Sequence.EcosystemWallet.Primitives { - internal abstract class RSY : SignatureOfSignerLeaf + public abstract class RSY : SignatureOfSignerLeaf { public abstract string type { get; } public BigInteger r; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs index 5a1e53a0..3b14ddfb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -1,6 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { - internal class RawSignature + public class RawSignature { public bool noChainId; public byte[] checkpointerData; @@ -13,5 +18,78 @@ public class Erc6492 public Address to; public byte[] data; } + + public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAddress = false) + { + if (suffix is { Length: > 0 }) + { + var head = new RawSignature + { + noChainId = this.noChainId, + checkpointerData = this.checkpointerData, + configuration = this.configuration, + erc6492 = this.erc6492 + }; + + var chained = new List { head }; + chained.AddRange(suffix); + + var chainedSignature = new ChainedSignature(chained.ToArray()); + return chainedSignature.Encode(); + } + + byte flag = 0; + if (noChainId) + flag |= 0x02; + + int bytesForCheckpoint = configuration.checkpoint.MinimumBytesNeeded(); + if (bytesForCheckpoint > 7) + throw new Exception("Checkpoint too large"); + + flag |= (byte)(bytesForCheckpoint << 2); + + int bytesForThreshold = configuration.threshold.MinimumBytesNeeded(); + bytesForThreshold = bytesForThreshold == 0 ? 1 : bytesForThreshold; + if (bytesForThreshold > 2) + throw new Exception("Threshold too large"); + + flag |= bytesForThreshold == 2 ? (byte)0x20 : (byte)0x00; + + if (!string.IsNullOrEmpty(configuration.checkpointer) && !skipCheckpointerAddress) + { + flag |= 0x40; + } + + byte[] output = new byte[] { flag }; + + if (!string.IsNullOrEmpty(configuration.checkpointer) && !skipCheckpointerAddress) + { + output = output.Concat(configuration.checkpointer.Value.ToByteArray().PadLeft(20)).ToArray(); + if (!skipCheckpointerData) + { + int checkpointerDataSize = checkpointerData?.Length ?? 0; + if (checkpointerDataSize > 16777215) + throw new Exception("Checkpointer data too large"); + + output = output.Concat(checkpointerData ?? new byte[0]).ToArray(); + } + } + + var checkpointBytes = configuration.checkpoint.ToByteArray().PadLeft(bytesForCheckpoint); + output = output.Concat(checkpointBytes).ToArray(); + + var thresholdBytes = configuration.threshold.ToByteArray().PadLeft(bytesForThreshold); + output = output.Concat(thresholdBytes).ToArray(); + + var topologyBytes = EncodeTopology(configuration.topology, signature); + output = Bytes.Concat(output, topologyBytes); + + return erc6492 != null ? Wrap(output, erc6492) : output; + } + + public static RawSignature Decode(byte[] erc6492Signature) + { + + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs index ecd4bdcc..dd9d1184 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs @@ -1,7 +1,71 @@ +using System; + namespace Sequence.EcosystemWallet.Primitives { - internal class Signature + public class Signature { - + public static Topology FillLeaves(Topology topology, Func signatureFor) + { + if (topology.IsNode()) + { + return new Topology(new Node( + FillLeaves(topology.Node.left, signatureFor), + FillLeaves(topology.Node.right, signatureFor))); + } + + if (!topology.IsLeaf()) + throw new ArgumentException("Cannot create topology from empty leaves"); + + if (topology.Leaf.isSignerLeaf) + { + var leaf = topology.Leaf as SignerLeaf; + var signature = signatureFor(leaf); + var newLeaf = signature != null ? new SignedSignerLeaf + { + address = leaf.address, + weight = leaf.weight, + signed = true, + signature = signature + } : leaf; + + return new Topology(newLeaf); + } + + if (topology.Leaf.isSapientSignerLeaf) + { + var leaf = topology.Leaf as SapientSignerLeaf; + var signature = signatureFor(leaf); + var newLeaf = signature != null ? new SignedSapientSignerLeaf + { + address = leaf.address, + imageHash = leaf.imageHash, + weight = leaf.weight, + signed = true, + signature = signature + } : leaf; + + return new Topology(newLeaf); + } + + if (topology.Leaf.isNestedLeaf) + { + var nested = topology.Leaf as NestedLeaf; + return new Topology(new NestedLeaf + { + weight = nested.weight, + threshold = nested.threshold, + tree = FillLeaves(nested.tree, signatureFor) + }); + } + + if (topology.Leaf.isSubdigestLeaf || + topology.Leaf.isAnyAddressSubdigestLeaf || + topology.Leaf.isNodeLeaf) + { + return topology; + } + + throw new Exception("Invalid topology"); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs index fa789f29..79c987a7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class SignatureOfSignerLeafErc1271 : SignatureOfSignerLeaf + public class SignatureOfSignerLeafErc1271 : SignatureOfSignerLeaf { public const string type = "erc1271"; public Address address; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs index 0251ae24..df6b0be7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class SignatureOfSignerLeafEthSign : RSY + public class SignatureOfSignerLeafEthSign : RSY { public override string type => "eth_sign"; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs index 8659d457..223bc0f3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class SignatureOfSignerLeafHash : RSY + public class SignatureOfSignerLeafHash : RSY { public override string type => "hash"; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs index 1cc97627..3ad952c3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class SignedSapientSignerLeaf : SapientSignerLeaf + public class SignedSapientSignerLeaf : SapientSignerLeaf { public bool signed = true; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs index 13d8ec20..01023394 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class SignedSignerLeaf : SignerLeaf + public class SignedSignerLeaf : SignerLeaf { public bool signed = true; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs index d69bffa4..93eea371 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Unity.Plastic.Newtonsoft.Json; namespace Sequence.Utils { @@ -36,7 +37,5 @@ public static TKey[] GetKeys(this Dictionary dict) return keys; } - - } } \ No newline at end of file From 771780f68c3232c19da561bdd7319ee86a74a882 Mon Sep 17 00:00:00 2001 From: Peter Kieltyka Date: Tue, 17 Jun 2025 11:39:12 -0400 Subject: [PATCH 058/165] update testchain, and include wallet-contracts-v3 artifacts --- .gitignore | 1 - Makefile | 16 +- .../Estimator.sol/Estimator.json | 1444 ++++++++++ .../Factory.sol/Factory.json | 51 + .../wallet-contracts-v3/Guest.sol/Guest.json | 335 +++ .../Simulator.sol/Simulator.json | 84 + .../Stage1Module.sol/Stage1Module.json | 1468 ++++++++++ .../Stage2Module.sol/Stage2Module.json | 1420 ++++++++++ .../Wallet.sol/Wallet.json | 10 + .../passkeys/Passkeys.sol/Passkeys.json | 93 + .../recovery/Recovery.sol/Recovery.json | 537 ++++ .../SessionErrors.sol/SessionErrors.json | 105 + .../SessionManager.sol/SessionManager.json | 448 +++ .../sessions/SessionSig.sol/SessionSig.json | 156 + .../ExplicitSessionManager.json | 241 ++ .../IExplicitSessionManager.json | 36 + .../Permission.sol/LibPermission.json | 16 + .../PermissionValidator.json | 179 ++ .../Attestation.sol/LibAttestation.json | 10 + .../ISignalsImplicitMode.json | 116 + .../ImplicitSessionManager.json | 10 + .../modules/Calls.sol/Calls.json | 1116 ++++++++ .../modules/Hooks.sol/Hooks.json | 256 ++ .../modules/Hooks.sol/IERC1155Receiver.json | 89 + .../modules/Hooks.sol/IERC223Receiver.json | 34 + .../modules/Hooks.sol/IERC721Receiver.json | 45 + .../Implementation.sol/Implementation.json | 61 + .../modules/Nonce.sol/Nonce.json | 70 + .../modules/Payload.sol/Payload.json | 113 + .../modules/Storage.sol/Storage.json | 10 + .../modules/auth/BaseAuth.sol/BaseAuth.json | 628 +++++ .../modules/auth/BaseSig.sol/BaseSig.json | 103 + .../modules/auth/SelfAuth.sol/SelfAuth.json | 22 + .../auth/Stage1Auth.sol/Stage1Auth.json | 751 +++++ .../auth/Stage2Auth.sol/Stage2Auth.json | 698 +++++ .../modules/interfaces/IAuth.sol/IAuth.json | 10 + .../ICheckpointer.sol/ICheckpointer.json | 47 + .../IDelegatedExtension.json | 49 + .../interfaces/IERC1271.sol/IERC1271.json | 35 + .../IPartialAuth.sol/IPartialAuth.json | 144 + .../interfaces/ISapient.sol/ISapient.json | 119 + .../ISapient.sol/ISapientCompact.json | 35 + .../utils/Base64.sol/Base64.json | 10 + .../utils/LibBytes.sol/LibBytes.json | 10 + .../LibBytesPointer.sol/LibBytesPointer.json | 10 + .../utils/LibOptim.sol/LibOptim.json | 10 + .../utils/P256.sol/P256.json | 16 + .../utils/WebAuthn.sol/WebAuthn.json | 10 + testchain/hardhat.config.js | 2 +- testchain/package.json | 28 +- testchain/pnpm-lock.yaml | 2071 ++++++++++++++ testchain/yarn.lock | 2508 ----------------- 52 files changed, 13354 insertions(+), 2532 deletions(-) create mode 100644 testchain/artifacts/wallet-contracts-v3/Estimator.sol/Estimator.json create mode 100644 testchain/artifacts/wallet-contracts-v3/Factory.sol/Factory.json create mode 100644 testchain/artifacts/wallet-contracts-v3/Guest.sol/Guest.json create mode 100644 testchain/artifacts/wallet-contracts-v3/Simulator.sol/Simulator.json create mode 100644 testchain/artifacts/wallet-contracts-v3/Stage1Module.sol/Stage1Module.json create mode 100644 testchain/artifacts/wallet-contracts-v3/Stage2Module.sol/Stage2Module.json create mode 100644 testchain/artifacts/wallet-contracts-v3/Wallet.sol/Wallet.json create mode 100644 testchain/artifacts/wallet-contracts-v3/extensions/passkeys/Passkeys.sol/Passkeys.json create mode 100644 testchain/artifacts/wallet-contracts-v3/extensions/recovery/Recovery.sol/Recovery.json create mode 100644 testchain/artifacts/wallet-contracts-v3/extensions/sessions/SessionErrors.sol/SessionErrors.json create mode 100644 testchain/artifacts/wallet-contracts-v3/extensions/sessions/SessionManager.sol/SessionManager.json create mode 100644 testchain/artifacts/wallet-contracts-v3/extensions/sessions/SessionSig.sol/SessionSig.json create mode 100644 testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/ExplicitSessionManager.sol/ExplicitSessionManager.json create mode 100644 testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/IExplicitSessionManager.sol/IExplicitSessionManager.json create mode 100644 testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/Permission.sol/LibPermission.json create mode 100644 testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/PermissionValidator.sol/PermissionValidator.json create mode 100644 testchain/artifacts/wallet-contracts-v3/extensions/sessions/implicit/Attestation.sol/LibAttestation.json create mode 100644 testchain/artifacts/wallet-contracts-v3/extensions/sessions/implicit/ISignalsImplicitMode.sol/ISignalsImplicitMode.json create mode 100644 testchain/artifacts/wallet-contracts-v3/extensions/sessions/implicit/ImplicitSessionManager.sol/ImplicitSessionManager.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/Calls.sol/Calls.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/Hooks.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/IERC1155Receiver.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/IERC223Receiver.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/IERC721Receiver.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/Implementation.sol/Implementation.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/Nonce.sol/Nonce.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/Payload.sol/Payload.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/Storage.sol/Storage.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/auth/BaseAuth.sol/BaseAuth.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/auth/BaseSig.sol/BaseSig.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/auth/SelfAuth.sol/SelfAuth.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/auth/Stage1Auth.sol/Stage1Auth.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/auth/Stage2Auth.sol/Stage2Auth.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/interfaces/IAuth.sol/IAuth.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/interfaces/ICheckpointer.sol/ICheckpointer.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/interfaces/IDelegatedExtension.sol/IDelegatedExtension.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/interfaces/IERC1271.sol/IERC1271.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/interfaces/IPartialAuth.sol/IPartialAuth.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/interfaces/ISapient.sol/ISapient.json create mode 100644 testchain/artifacts/wallet-contracts-v3/modules/interfaces/ISapient.sol/ISapientCompact.json create mode 100644 testchain/artifacts/wallet-contracts-v3/utils/Base64.sol/Base64.json create mode 100644 testchain/artifacts/wallet-contracts-v3/utils/LibBytes.sol/LibBytes.json create mode 100644 testchain/artifacts/wallet-contracts-v3/utils/LibBytesPointer.sol/LibBytesPointer.json create mode 100644 testchain/artifacts/wallet-contracts-v3/utils/LibOptim.sol/LibOptim.json create mode 100644 testchain/artifacts/wallet-contracts-v3/utils/P256.sol/P256.json create mode 100644 testchain/artifacts/wallet-contracts-v3/utils/WebAuthn.sol/WebAuthn.json create mode 100644 testchain/pnpm-lock.yaml delete mode 100644 testchain/yarn.lock diff --git a/.gitignore b/.gitignore index ed8edee2..66b8acd0 100644 --- a/.gitignore +++ b/.gitignore @@ -122,5 +122,4 @@ Assets/SequenceSDK/WaaS/Tests/Resources/ # Foundry /testchain/lib -/testchain/artifacts/* diff --git a/Makefile b/Makefile index 30b6c404..8f27417f 100644 --- a/Makefile +++ b/Makefile @@ -23,32 +23,32 @@ all: # Testchain # bootstrap: - cd ./testchain && yarn install + cd ./testchain && pnpm install start-testchain: - cd ./testchain && yarn start:hardhat + cd ./testchain && pnpm start:hardhat start-testchain-verbose: - cd ./testchain && yarn start:hardhat:verbose + cd ./testchain && pnpm start:hardhat:verbose start-testchain-geth: - cd ./testchain && yarn start:geth + cd ./testchain && pnpm start:geth start-testchain-geth-verbose: - cd ./testchain && yarn start:geth:verbose + cd ./testchain && pnpm start:geth:verbose check-testchain-running: @curl http://localhost:8545 -H"Content-type: application/json" -X POST -d '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' --write-out '%{http_code}' --silent --output /dev/null | grep 200 > /dev/null \ || { echo "*****"; echo "Oops! testchain is not running. Please run 'make start-testchain' in another terminal or use 'test-concurrently'."; echo "*****"; exit 1; } test-testchain: - cd ./testchain && (yarn start:hardhat & echo $$! > .pid) && yarn test > ../chaintest.out && cd .. && make stop && cat chaintest.out + cd ./testchain && (pnpm start:hardhat & echo $$! > .pid) && pnpm test > ../chaintest.out && cd .. && make stop && cat chaintest.out stop: -pkill -F ./testchain/.pid && rm testchain/.pid test: - rm TestResults*.xml ; cd ./testchain && (yarn start:hardhat & echo $$! > .pid) && cd .. && \ + rm TestResults*.xml ; cd ./testchain && (pnpm start:hardhat & echo $$! > .pid) && cd .. && \ Unity -batchmode -runTests -projectPath "$(pwd)" -testPlatform editmode -testResults TestResults_Edit.xml ; Unity -quit && \ Unity -runTests -projectPath "$(pwd)" -testPlatform playmode -testResults TestResults_Play.xml ; \ make stop && \ @@ -65,7 +65,7 @@ test-ui: head -n 2 TestResults_Play.xml | grep -Eo 'result="[^"]+"|total="[^"]+"|passed="[^"]+"|failed="[^"]+"|inconclusive="[^"]+"|skipped="[^"]+"|start-time="[^"]+"|end-time="[^"]+"|duration="[^"]+"' | grep -Ev 'clr-version=|engine-version=|asserts=|id=|testcasecount=' | sed -E 's/^[^"]+"([^"]+)"[^"]+"([^"]+)".*/\1: \2/' test-sdk: - rm TestResults*.xml ; cd ./testchain && (yarn start:hardhat & echo $$! > .pid) && cd .. && \ + rm TestResults*.xml ; cd ./testchain && (pnpm start:hardhat & echo $$! > .pid) && cd .. && \ Unity -batchmode -runTests -projectPath "$(pwd)" -testPlatform editmode -testResults TestResults_Edit.xml ; Unity -quit && \ make stop && \ echo "Edit mode Test results: " && \ diff --git a/testchain/artifacts/wallet-contracts-v3/Estimator.sol/Estimator.json b/testchain/artifacts/wallet-contracts-v3/Estimator.sol/Estimator.json new file mode 100644 index 00000000..0b37f0d8 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/Estimator.sol/Estimator.json @@ -0,0 +1,1444 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Estimator", + "sourceName": "src/Estimator.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + } + ], + "name": "BadNonce", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "HookAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "HookDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "ImageHashIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_signer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidERC1271Signature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + } + ], + "name": "InvalidKind", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSapientSignature", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_flag", + "type": "uint256" + } + ], + "name": "InvalidSignatureFlag", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "InvalidSignatureWeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_expires", + "type": "uint256" + } + ], + "name": "InvalidStaticSignatureExpired", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_caller", + "type": "address" + }, + { + "internalType": "address", + "name": "_expectedCaller", + "type": "address" + } + ], + "name": "InvalidStaticSignatureWrongCaller", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "LowWeightChainedSignature", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_gasLeft", + "type": "uint256" + } + ], + "name": "NotEnoughGas", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + } + ], + "name": "OnlySelf", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "Reverted", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "internalType": "struct Snapshot", + "name": "_snapshot", + "type": "tuple" + } + ], + "name": "UnusedSnapshot", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_nextCheckpoint", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_checkpoint", + "type": "uint256" + } + ], + "name": "WrongChainedCheckpointOrder", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "CallAborted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "CallFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "CallSkipped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "CallSucceeded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + }, + { + "indexed": false, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "DefinedHook", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "newImageHash", + "type": "bytes32" + } + ], + "name": "ImageHashUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_newNonce", + "type": "uint256" + } + ], + "name": "NonceChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint96", + "name": "_timestamp", + "type": "uint96" + } + ], + "name": "StaticSignatureSet", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + }, + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "addHook", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_payload", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "estimate", + "outputs": [ + { + "internalType": "uint256", + "name": "gasUsed", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_payload", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + } + ], + "name": "getStaticSignature", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "imageHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "readHook", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + } + ], + "name": "readNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverPartialSignature", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isValidImage", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "opHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverSapientSignature", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "removeHook", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_payload", + "type": "bytes" + } + ], + "name": "selfExecute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "internalType": "uint96", + "name": "_timestamp", + "type": "uint96" + } + ], + "name": "setStaticSignature", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "tokenReceived", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_imageHash", + "type": "bytes32" + } + ], + "name": "updateImageHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_implementation", + "type": "address" + } + ], + "name": "updateImplementation", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x6080604052348015600f57600080fd5b506142b88061001f6000396000f3fe6080604052600436106101635760003560e01c80638943ec02116100c0578063ad55366b11610074578063bc197c8111610059578063bc197c81146104d7578063f23a6e611461051f578063f727ef1c146105655761016a565b8063ad55366b14610471578063b93ea7ad146104c45761016a565b806392dcb3fc116100a557806392dcb3fc146103fd578063975befdb14610449578063aaf10f421461045c5761016a565b80638943ec02146103bc5780638c3f5563146103dd5761016a565b80631f6a1eb9116101175780634fcf3eca116100fc5780634fcf3eca1461038157806351605d80146103945780636ea44577146103a95761016a565b80631f6a1eb91461034e57806329561426146103615761016a565b8063150b7a0211610148578063150b7a02146102735780631626ba7e146102e95780631a9b2337146103095761016a565b8063025b22bc1461022d57806313792a4a146102405761016a565b3661016a57005b6004361061022b5760006101866101813683613343565b610585565b905073ffffffffffffffffffffffffffffffffffffffff811615610229576000808273ffffffffffffffffffffffffffffffffffffffff166000366040516101cf9291906133a9565b600060405180830381855af49150503d806000811461020a576040519150601f19603f3d011682016040523d82523d6000602084013e61020f565b606091505b50915091508161022157805160208201fd5b805160208201f35b505b005b61022b61023b3660046133e2565b6105d9565b34801561024c57600080fd5b5061026061025b366004613786565b610625565b6040519081526020015b60405180910390f35b34801561027f57600080fd5b506102b861028e3660046138cd565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161026a565b3480156102f557600080fd5b506102b861030436600461393c565b610790565b34801561031557600080fd5b5061032961032436600461399d565b610827565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161026a565b61022b61035c3660046139ba565b610832565b34801561036d57600080fd5b5061022b61037c366004613a2b565b6108bb565b61022b61038f36600461399d565b6108ff565b3480156103a057600080fd5b506102606109c1565b61022b6103b7366004613a44565b6109f0565b3480156103c857600080fd5b5061022b6103d7366004613a86565b50505050565b3480156103e957600080fd5b506102606103f8366004613a2b565b610a5d565b34801561040957600080fd5b5061041d610418366004613a2b565b610a89565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520161026a565b6102606104573660046139ba565b610a9e565b34801561046857600080fd5b50610329610b3c565b34801561047d57600080fd5b5061049161048c366004613786565b610b46565b604080519687526020870195909552921515938501939093526060840152608083019190915260a082015260c00161026a565b61022b6104d2366004613ac8565b610b80565b3480156104e357600080fd5b506102b86104f2366004613b42565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561052b57600080fd5b506102b861053a366004613c09565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b34801561057157600080fd5b5061022b610580366004613c81565b610c45565b60006105d37fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff000000000000000000000000000000000000000000000000000000008416610d00565b92915050565b333014610619576040517fa19dbf000000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b61062281610d5e565b50565b60008084610100015151600161063b9190613d01565b67ffffffffffffffff811115610653576106536133fd565b60405190808252806020026020018201604052801561067c578160200160208202803683370190505b50905060005b856101000151518110156106ee5785610100015181815181106106a7576106a7613d14565b60200260200101518282815181106106c1576106c1613d14565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600101610682565b503381866101000151518151811061070857610708613d14565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261010085018190526000610742868686610db3565b50905080610782578585856040517ff58cc8b500000000000000000000000000000000000000000000000000000000815260040161061093929190613fc6565b5060019150505b9392505050565b604080516101208101825260006020820181905260609282018390528282018190526080820181905260a0820183905260c082018190526101008201929092526003815260e0810185905260006107e8828686610db3565b509050806107fc5750600091506107899050565b507f20c13b0b0000000000000000000000000000000000000000000000000000000095945050505050565b60006105d382610585565b60005a905060006108438686610f9a565b9050610857816060015182608001516113b8565b600080610865838787610db3565b91509150816108a6578286866040517fa2b6d61b00000000000000000000000000000000000000000000000000000000815260040161061093929190613fc6565b6108b18482856114a0565b5050505050505050565b3330146108f6576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610610565b610622816117ff565b33301461093a576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610610565b600061094582610585565b73ffffffffffffffffffffffffffffffffffffffff16036109b6576040517f1c3812cc0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000082166004820152602401610610565b61062281600061188f565b60006109eb7fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85490565b905090565b333014610a2b576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610610565b60005a90506000610a3c8484610f9a565b90506000610a498261194f565b9050610a568382846114a0565b5050505050565b60006105d37f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610d00565b600080610a95836119ca565b91509150915091565b6000805a90506000610ab08787610f9a565b6060810151909150610aca90610ac581610a5d565b6113b8565b600080610ad8838888610db3565b9150915081610b19578287876040517fa2b6d61b00000000000000000000000000000000000000000000000000000000815260040161061093929190613fc6565b610b24848285611a16565b5a610b2f9085613ff6565b9998505050505050505050565b60006109eb305490565b600080600080600080610b5d898989600080611c5e565b939950919750945092509050610b7283611f83565b935093975093979195509350565b333014610bbb576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610610565b6000610bc683610585565b73ffffffffffffffffffffffffffffffffffffffff1614610c37576040517f5b4d6d6a0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000083166004820152602401610610565b610c41828261188f565b5050565b333014610c80576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610610565b610c998383836bffffffffffffffffffffffff16611f97565b6040805184815273ffffffffffffffffffffffffffffffffffffffff841660208201526bffffffffffffffffffffffff83168183015290517febf265acfac1c01de588ed7ef49743b9c3ce8d6d1edeaf510a1f5453228515b19181900360600190a1505050565b6000808383604051602001610d1f929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b610d66813055565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03906020015b60405180910390a150565b600080600084846000818110610dcb57610dcb613d14565b7fff000000000000000000000000000000000000000000000000000000000000009201359182169250507f80000000000000000000000000000000000000000000000000000000000000009081169003610f2057610e288661194f565b9150600080610e36846119ca565b91509150428111610e7d576040517ff95b6ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101829052604401610610565b73ffffffffffffffffffffffffffffffffffffffff821615801590610eb8575073ffffffffffffffffffffffffffffffffffffffff82163314155b15610f14576040517f8945c3130000000000000000000000000000000000000000000000000000000081526004810185905233602482015273ffffffffffffffffffffffffffffffffffffffff83166044820152606401610610565b60019450505050610f92565b6000806000610f33898989600080611c5e565b985092955090935091505082821015610f82576040517ffd41fcba0000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610610565b610f8b81611f83565b9550505050505b935093915050565b604080516101208101825260008082526020820181905260609282018390528282018190526080820181905260a0820183905260c0820181905260e0820152610100810191909152823560f81c60018082168103610ffe576000606084015261100f565b84810135606090811c908401526014015b6007600183901c1680156110625760016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0187840135610100929092039190911c166080850152908101905b600083601016601003611077575060016110a0565b836020166020036110935750600282019186013560f01c6110a0565b50600182019186013560f81c5b8067ffffffffffffffff8111156110b9576110b96133fd565b60405190808252806020026020018201604052801561114457816020015b6111316040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016060815260200160008152602001600015158152602001600015158152602001600081525090565b8152602001906001900390816110d75790505b50604086015260005b818110156113ad5760018085019489013560f81c9080821690036111ac57308760400151838151811061118257611182613d14565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff90911690526111f6565b8489013560601c60148601886040015184815181106111cd576111cd613d14565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff90921690915294505b600280821690036112345784890135602086018860400151848151811061121f5761121f613d14565b60200260200101516020018197508281525050505b600480821690036112cc57600385019489013560e81c89868a6112578483613d01565b9261126493929190614009565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060408901518051859081106112af576112af613d14565b6020908102919091010151604001526112c88187613d01565b9550505b6008808216900361130a578489013560208601886040015184815181106112f5576112f5613d14565b60200260200101516060018197508281525050505b8060101660ff166010148760400151838151811061132a5761132a613d14565b602002602001015160800190151590811515815250508060201660ff166020148760400151838151811061136057611360613d14565b602090810291909101015190151560a090910152604087015180516003600684901c1691908490811061139557611395613d14565b602090810291909101015160c001525060010161114d565b505050505092915050565b60006113c383610a5d565b905081811461140f576040517f9b6514f4000000000000000000000000000000000000000000000000000000008152600481018490526024810183905260448101829052606401610610565b604080517f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e60208083019190915281830186905282518083038401815260609092019092528051910120600183019081905560408051858152602081018390527f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881910160405180910390a150505050565b604081015151600090815b818110156117f7576000846040015182815181106114cb576114cb613d14565b602002602001015190508060a0015180156114e4575083155b156115285760408051878152602081018490527f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b910160405180910390a1506117ef565b606081015160009450801580159061153f5750805a105b1561157c5785835a6040517f2139527400000000000000000000000000000000000000000000000000000000815260040161061093929190614033565b600082608001511561165057825161164990831561159a578361159c565b5a5b634c4e814c60e01b8b8d898b8e606001518b604001516040516024016115c796959493929190614058565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612026565b9050611677565b8251602084015161167491908415611668578461166a565b5a5b866040015161203c565b90505b806117b25760c08301516116d357600195507f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d88856116b4612054565b6040516116c393929190614095565b60405180910390a15050506117ef565b60c08301517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161173d578684611708612054565b6040517f7f6b0bb1000000000000000000000000000000000000000000000000000000008152600401610610939291906140b4565b60c08301517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016117b2577fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b8885611793612054565b6040516117a293929190614095565b60405180910390a15050506117f7565b60408051898152602081018690527f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a910160405180910390a15050505b6001016114ab565b505050505050565b80611836576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61185f7fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8829055565b6040518181527f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa90602001610da8565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008516828401819052835180840385018152606084018086528151919093012073ffffffffffffffffffffffffffffffffffffffff8616908190559152608082015290517f0d7fc113eaf016db4681a1ba86d083ce3e0961f321062a75ac2b0aeb33deeed19181900360a00190a15050565b600080611960836020015130612073565b9050600061196d84612140565b6040517f1901000000000000000000000000000000000000000000000000000000000000602082015260228101849052604281018290529091506062015b6040516020818303038152906040528051906020012092505050919050565b600080806119f87fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e8685610d00565b606081901c956bffffffffffffffffffffffff909116945092505050565b604081015151600090815b818110156117f757600084604001518281518110611a4157611a41613d14565b602002602001015190508060a001518015611a5a575083155b15611a9e5760408051878152602081018490527f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b910160405180910390a150611c56565b6060810151600094508015801590611ab55750805a105b15611af25785835a6040517f2139527400000000000000000000000000000000000000000000000000000000815260040161061093929190614033565b6000826080015115611b17578251611b1090831561159a578361159c565b9050611b32565b82516020840151611b2f91908415611668578461166a565b90505b80611c195760c0830151611b8e57600195507f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d8885611b6f612054565b604051611b7e93929190614095565b60405180910390a1505050611c56565b60c08301517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01611bc3578684611708612054565b60c08301517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611c19577fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b8885611793612054565b60408051898152602081018690527f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a910160405180910390a15050505b600101611a21565b6040805180820182526000808252602082018190529182918291829182918a3560f81c91600191808416148015611ca9575073ffffffffffffffffffffffffffffffffffffffff8916155b15611dc5578b82013560601c985060149091019089611dc55760038201918c013560e81c60008d848e611cdc8583613d01565b92611ce993929190614009565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040517fccce3bc80000000000000000000000000000000000000000000000000000000081529293505073ffffffffffffffffffffffffffffffffffffffff8d169163ccce3bc89150611d7490309085906004016140df565b6040805180830381865afa158015611d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db49190614116565b9250611dc08285613d01565b935050505b82600116600103611dff57611ded8d8a838f8f87908092611de893929190614009565b6123ac565b97509750975097509750505050611f76565b6002838116811460208f015283901c60071660016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018e850135610100929092039190911c16838201909650925060009050611e6a6001600586901c811690613d01565b60016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018f860135610100929092039190911c1699509092019150611eb58d61194f565b9350611ed38d858e8e86908092611ece93929190614009565b6125f0565b600090815260208a815260408083208352888252808320835273ffffffffffffffffffffffffffffffffffffffff8d1690915290208251919850965015801590611f1e575080518614155b8015611f2e575080602001518511155b15611f72576040517fccbb534f0000000000000000000000000000000000000000000000000000000081528151600482015260208201516024820152604401610610565b5050505b9550955095509550959050565b6000611f8e82612f82565b50600192915050565b6120217fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e86847fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b166bffffffffffffffffffffffff8516176040805160208082019590955280820193909352805180840382018152606090930190528151919092012055565b505050565b60008060008351602085018787f4949350505050565b6000806000835160208501878988f195945050505050565b60603d604051915060208201818101604052818352816000823e505090565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de856120e357466120e6565b60005b6040805160208101959095528401929092526060830152608082015273ffffffffffffffffffffffffffffffffffffffff831660a082015260c0015b60405160208183030381529060405280519060200120905092915050565b6000808261010001516040516020016121599190614167565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120835190915060ff166122025760006121aa8460400151612f8d565b606080860151608080880151604080517f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a260208201529081018690529384019290925282015260a0810184905290915060c0016119ab565b825160ff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016122925760a08301518051602091820120604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46693810193909352820152606081018290526080015b60405160208183030381529060405280519060200120915050919050565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016123025760c0830151604080517f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e460208201529081019190915260608101829052608001612274565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd016123725760e0830151604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46660208201529081019190915260608101829052608001612274565b82516040517f0481832000000000000000000000000000000000000000000000000000000000815260ff9091166004820152602401610610565b600080600080600061240e604051806101200160405280600060ff168152602001600015158152602001606081526020016000815260200160008152602001606081526020016000801916815260200160008019168152602001606081525090565b6002815260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b888210156125985760038201916000908b013560e81c6124568482613d01565b9150600090508a821461246a57600061246c565b8d5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036124c4576124b38f8d8d879086926124ab93929190614009565b600185611c5e565b939d50919b509950975095506124e6565b6124da858d8d879086926124ab93929190614009565b50929c50909a50985096505b89891015612532576124fa82858d8f614009565b8b8b6040517fb006aba000000000000000000000000000000000000000000000000000000000815260040161061094939291906141b3565b819350878d60000151036125455760008d525b828710612588576040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004810188905260248101849052604401610610565b50505060c0820185905283612436565b8a51158015906125ac57508a602001518511155b15611f72576040517fccbb534f0000000000000000000000000000000000000000000000000000000081528b51600482015260208c01516024820152604401610610565b60008060005b83811015612f7857600181019085013560f881901c9060fc1c8061271357600f8216600081900361262e5750600183019287013560f81c5b60408051600080825260208281018085528d9052601b8c89019182013560ff81811c928301908116868801529235606086018190527f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82166080870181905296909a0199959094919390929160019060a0015b6020604051602081039080840390855afa1580156126c3573d6000803e3d6000fd5b5050506020604051035190508660ff168c019b5060006126e6828960ff1661301e565b90508b6126f35780612702565b60008c81526020829052604090205b9b50505050505050505050506125f6565b6001810361277757600f821660008190036127355750600183019287013560f81c5b601484019388013560601c600061274f8260ff851661301e565b90508661275c578061276b565b60008781526020829052604090205b965050505050506125f6565b6002810361296c576003821660008190036127995750600183019287013560f81c5b60008489013560601c60148601955090506003600285901c16600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c168288018098508192505050600081880190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff16631626ba7e8f8f8f8d90879261285793929190614009565b6040518463ffffffff1660e01b8152600401612875939291906141da565b602060405180830381865afa158015612892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128b691906141f4565b7fffffffff000000000000000000000000000000000000000000000000000000001614612927578c848d8d8b9085926128f193929190614009565b6040517fb2fed7ae0000000000000000000000000000000000000000000000000000000081526004016106109493929190614211565b8097508460ff168a0199506000612941858760ff1661301e565b90508961294e578061295d565b60008a81526020829052604090205b995050505050505050506125f6565b600381036129a0576020830192870135846129875780612996565b60008581526020829052604090205b94505050506125f6565b60048103612a4357600f8216600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018a870135610100929092039190911c16858301809650819250505060008186019050600080612a158e8e8e8e8c908892611ece93929190614009565b91509150829750818a019950612a35898260009182526020526040902090565b9850505050505050506125f6565b60068103612b0d576003600283901c166000819003612a695750600183019287013560f81c5b600383166000819003612a835750600284019388013560f01c5b6000858a013560e81c600387018162ffffff169150809750819250505060008187019050600080612ac18f8f8f8f8d908892611ece93929190614009565b91509150829850848210612ad457998501995b6000612ae1828789613085565b90508a612aee5780612afd565b60008b81526020829052604090205b9a505050505050505050506125f6565b60058103612b7a576020830192870135888103612b48577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505b6000612b53826130e9565b905085612b605780612b6f565b60008681526020829052604090205b9550505050506125f6565b60078103612c8057600f82166000819003612b9c5750600183019287013560f81c5b600080858a0135602087019650915089860135602087016040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018e905290975090915060ff82901c907f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690601b830190600090600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff851690820152606081018890526080810185905260a0016126a1565b60088103612cd45760208301928701356000612c9c8b8261313d565b9050808203612cc9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505b600061274f826131b8565b60098103612e0c57600382166000819003612cf65750600183019287013560f81c5b60008489013560601c601486019550905060006003600286901c1660016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c168188018098508193505050506000818701905060008373ffffffffffffffffffffffffffffffffffffffff166313792a4a8f8e8e8c908792612d9093929190614009565b6040518463ffffffff1660e01b8152600401612dae93929190613fc6565b602060405180830381865afa158015612dcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612def9190614247565b90508197508460ff168a0199506000612941858760ff16846131f3565b600a8103612f4357600382166000819003612e2e5750600183019287013560f81c5b60008489013560601c60148601955090506003600285901c16600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c1682880180985081925050506000818801905060008473ffffffffffffffffffffffffffffffffffffffff1663898bd9218f8f8f8d908792612ec793929190614009565b6040518463ffffffff1660e01b8152600401612ee5939291906141da565b602060405180830381865afa158015612f02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f269190614247565b90508198508560ff168b019a506000612ae1868860ff16846131f3565b6040517fb2505f7c00000000000000000000000000000000000000000000000000000000815260048101829052602401610610565b5094509492505050565b60006105d382613261565b6000606060005b835181101561300f576000612fc1858381518110612fb457612fb4613d14565b6020026020010151613294565b90508281604051602001612fd6929190614260565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052925050600101612f94565b50805160209091012092915050565b6040517f53657175656e6365207369676e65723a0a00000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b16603182015260458101829052600090606501612122565b6040517f53657175656e6365206e657374656420636f6e6669673a0a000000000000000060208201526038810184905260588101839052607881018290526000906098015b6040516020818303038152906040528051906020012090509392505050565b6040517f53657175656e636520737461746963206469676573743a0a00000000000000006020820152603881018290526000906058015b604051602081830303815290604052805190602001209050919050565b60008061314e846020015184612073565b9050600061315b85612140565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526022810184905260428101829052909150606201604051602081830303815290604052805190602001209250505092915050565b604080517f53657175656e636520616e792061646472657373207375626469676573743a0a6020820152908101829052600090606001613120565b6040517f53657175656e63652073617069656e7420636f6e6669673a0a0000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166039820152604d8101839052606d8101829052600090608d016130ca565b600081158015906105d35750507fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8541490565b60007f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef43782600001518360200151846040015180519060200120856060015186608001518760a001518860c0015160405160200161312098979695949392919097885273ffffffffffffffffffffffffffffffffffffffff969096166020880152604087019490945260608601929092526080850152151560a0840152151560c083015260e08201526101000190565b80357fffffffff0000000000000000000000000000000000000000000000000000000081169060048410156133a2577fffffffff00000000000000000000000000000000000000000000000000000000808560040360031b1b82161691505b5092915050565b8183823760009101908152919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146133dd57600080fd5b919050565b6000602082840312156133f457600080fd5b610789826133b9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561344f5761344f6133fd565b60405290565b604051610120810167ffffffffffffffff8111828210171561344f5761344f6133fd565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134c0576134c06133fd565b604052919050565b803560ff811681146133dd57600080fd5b803580151581146133dd57600080fd5b600067ffffffffffffffff821115613503576135036133fd565b5060051b60200190565b600082601f83011261351e57600080fd5b813567ffffffffffffffff811115613538576135386133fd565b61356960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613479565b81815284602083860101111561357e57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126135ac57600080fd5b81356135bf6135ba826134e9565b613479565b8082825260208201915060208360051b8601019250858311156135e157600080fd5b602085015b838110156136ce57803567ffffffffffffffff81111561360557600080fd5b860160e08189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001121561363957600080fd5b61364161342c565b61364d602083016133b9565b815260408201356020820152606082013567ffffffffffffffff81111561367357600080fd5b6136828a60208386010161350d565b6040830152506080820135606082015261369e60a083016134d9565b60808201526136af60c083016134d9565b60a082015260e0919091013560c08201528352602092830192016135e6565b5095945050505050565b600082601f8301126136e957600080fd5b81356136f76135ba826134e9565b8082825260208201915060208360051b86010192508583111561371957600080fd5b602085015b838110156136ce5761372f816133b9565b83526020928301920161371e565b60008083601f84011261374f57600080fd5b50813567ffffffffffffffff81111561376757600080fd5b60208301915083602082850101111561377f57600080fd5b9250929050565b60008060006040848603121561379b57600080fd5b833567ffffffffffffffff8111156137b257600080fd5b840161012081870312156137c557600080fd5b6137cd613455565b6137d6826134c8565b81526137e4602083016134d9565b6020820152604082013567ffffffffffffffff81111561380357600080fd5b61380f8882850161359b565b604083015250606082810135908201526080808301359082015260a082013567ffffffffffffffff81111561384357600080fd5b61384f8882850161350d565b60a08301525060c0828101359082015260e0808301359082015261010082013567ffffffffffffffff81111561388457600080fd5b613890888285016136d8565b61010083015250935050602084013567ffffffffffffffff8111156138b457600080fd5b6138c08682870161373d565b9497909650939450505050565b6000806000806000608086880312156138e557600080fd5b6138ee866133b9565b94506138fc602087016133b9565b935060408601359250606086013567ffffffffffffffff81111561391f57600080fd5b61392b8882890161373d565b969995985093965092949392505050565b60008060006040848603121561395157600080fd5b83359250602084013567ffffffffffffffff8111156138b457600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461062257600080fd5b6000602082840312156139af57600080fd5b81356107898161396f565b600080600080604085870312156139d057600080fd5b843567ffffffffffffffff8111156139e757600080fd5b6139f38782880161373d565b909550935050602085013567ffffffffffffffff811115613a1357600080fd5b613a1f8782880161373d565b95989497509550505050565b600060208284031215613a3d57600080fd5b5035919050565b60008060208385031215613a5757600080fd5b823567ffffffffffffffff811115613a6e57600080fd5b613a7a8582860161373d565b90969095509350505050565b60008060008060608587031215613a9c57600080fd5b613aa5856133b9565b935060208501359250604085013567ffffffffffffffff811115613a1357600080fd5b60008060408385031215613adb57600080fd5b8235613ae68161396f565b9150613af4602084016133b9565b90509250929050565b60008083601f840112613b0f57600080fd5b50813567ffffffffffffffff811115613b2757600080fd5b6020830191508360208260051b850101111561377f57600080fd5b60008060008060008060008060a0898b031215613b5e57600080fd5b613b67896133b9565b9750613b7560208a016133b9565b9650604089013567ffffffffffffffff811115613b9157600080fd5b613b9d8b828c01613afd565b909750955050606089013567ffffffffffffffff811115613bbd57600080fd5b613bc98b828c01613afd565b909550935050608089013567ffffffffffffffff811115613be957600080fd5b613bf58b828c0161373d565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215613c2257600080fd5b613c2b876133b9565b9550613c39602088016133b9565b94506040870135935060608701359250608087013567ffffffffffffffff811115613c6357600080fd5b613c6f89828a0161373d565b979a9699509497509295939492505050565b600080600060608486031215613c9657600080fd5b83359250613ca6602085016133b9565b915060408401356bffffffffffffffffffffffff81168114613cc757600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105d3576105d3613cd2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60005b83811015613d5e578181015183820152602001613d46565b50506000910152565b60008151808452613d7f816020860160208601613d43565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208501945060208160051b8301016020850160005b83811015613e81577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0858403018852815173ffffffffffffffffffffffffffffffffffffffff815116845260208101516020850152604081015160e06040860152613e3d60e0860182613d67565b6060838101519087015260808084015115159087015260a08084015115159087015260c0928301519290950191909152506020978801979190910190600101613dcf565b50909695505050505050565b600081518084526020840193506020830160005b82811015613ed557815173ffffffffffffffffffffffffffffffffffffffff16865260209586019590910190600101613ea1565b5093949350505050565b805160ff16825260006020820151613efb602085018215159052565b5060408201516101206040850152613f17610120850182613db1565b9050606083015160608501526080830151608085015260a083015184820360a0860152613f448282613d67565b91505060c083015160c085015260e083015160e0850152610100830151848203610100860152613f748282613e8d565b95945050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081526000613fd96040830186613edf565b8281036020840152613fec818587613f7d565b9695505050505050565b818103818111156105d3576105d3613cd2565b6000808585111561401957600080fd5b8386111561402657600080fd5b5050820193919092039150565b6060815260006140466060830186613edf565b60208301949094525060400152919050565b86815285602082015284604082015283606082015282608082015260c060a0820152600061408960c0830184613d67565b98975050505050505050565b838152826020820152606060408201526000613f746060830184613d67565b6060815260006140c76060830186613edf565b8460208401528281036040840152613fec8185613d67565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061410e6040830184613d67565b949350505050565b6000604082840312801561412957600080fd5b506040805190810167ffffffffffffffff8111828210171561414d5761414d6133fd565b604052825181526020928301519281019290925250919050565b8151600090829060208501835b828110156141a857815173ffffffffffffffffffffffffffffffffffffffff16845260209384019390910190600101614174565b509195945050505050565b6060815260006141c7606083018688613f7d565b6020830194909452506040015292915050565b838152604060208201526000613f74604083018486613f7d565b60006020828403121561420657600080fd5b81516107898161396f565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000613fec606083018486613f7d565b60006020828403121561425957600080fd5b5051919050565b60008351614272818460208801613d43565b919091019182525060200191905056fea26469706673582212207478396388582c6d197eb43e1bb7658c82fc494983fa9e400c6e3dfe04350be964736f6c634300081b0033", + "deployedBytecode": "0x6080604052600436106101635760003560e01c80638943ec02116100c0578063ad55366b11610074578063bc197c8111610059578063bc197c81146104d7578063f23a6e611461051f578063f727ef1c146105655761016a565b8063ad55366b14610471578063b93ea7ad146104c45761016a565b806392dcb3fc116100a557806392dcb3fc146103fd578063975befdb14610449578063aaf10f421461045c5761016a565b80638943ec02146103bc5780638c3f5563146103dd5761016a565b80631f6a1eb9116101175780634fcf3eca116100fc5780634fcf3eca1461038157806351605d80146103945780636ea44577146103a95761016a565b80631f6a1eb91461034e57806329561426146103615761016a565b8063150b7a0211610148578063150b7a02146102735780631626ba7e146102e95780631a9b2337146103095761016a565b8063025b22bc1461022d57806313792a4a146102405761016a565b3661016a57005b6004361061022b5760006101866101813683613343565b610585565b905073ffffffffffffffffffffffffffffffffffffffff811615610229576000808273ffffffffffffffffffffffffffffffffffffffff166000366040516101cf9291906133a9565b600060405180830381855af49150503d806000811461020a576040519150601f19603f3d011682016040523d82523d6000602084013e61020f565b606091505b50915091508161022157805160208201fd5b805160208201f35b505b005b61022b61023b3660046133e2565b6105d9565b34801561024c57600080fd5b5061026061025b366004613786565b610625565b6040519081526020015b60405180910390f35b34801561027f57600080fd5b506102b861028e3660046138cd565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161026a565b3480156102f557600080fd5b506102b861030436600461393c565b610790565b34801561031557600080fd5b5061032961032436600461399d565b610827565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161026a565b61022b61035c3660046139ba565b610832565b34801561036d57600080fd5b5061022b61037c366004613a2b565b6108bb565b61022b61038f36600461399d565b6108ff565b3480156103a057600080fd5b506102606109c1565b61022b6103b7366004613a44565b6109f0565b3480156103c857600080fd5b5061022b6103d7366004613a86565b50505050565b3480156103e957600080fd5b506102606103f8366004613a2b565b610a5d565b34801561040957600080fd5b5061041d610418366004613a2b565b610a89565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520161026a565b6102606104573660046139ba565b610a9e565b34801561046857600080fd5b50610329610b3c565b34801561047d57600080fd5b5061049161048c366004613786565b610b46565b604080519687526020870195909552921515938501939093526060840152608083019190915260a082015260c00161026a565b61022b6104d2366004613ac8565b610b80565b3480156104e357600080fd5b506102b86104f2366004613b42565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561052b57600080fd5b506102b861053a366004613c09565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b34801561057157600080fd5b5061022b610580366004613c81565b610c45565b60006105d37fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff000000000000000000000000000000000000000000000000000000008416610d00565b92915050565b333014610619576040517fa19dbf000000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b61062281610d5e565b50565b60008084610100015151600161063b9190613d01565b67ffffffffffffffff811115610653576106536133fd565b60405190808252806020026020018201604052801561067c578160200160208202803683370190505b50905060005b856101000151518110156106ee5785610100015181815181106106a7576106a7613d14565b60200260200101518282815181106106c1576106c1613d14565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600101610682565b503381866101000151518151811061070857610708613d14565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261010085018190526000610742868686610db3565b50905080610782578585856040517ff58cc8b500000000000000000000000000000000000000000000000000000000815260040161061093929190613fc6565b5060019150505b9392505050565b604080516101208101825260006020820181905260609282018390528282018190526080820181905260a0820183905260c082018190526101008201929092526003815260e0810185905260006107e8828686610db3565b509050806107fc5750600091506107899050565b507f20c13b0b0000000000000000000000000000000000000000000000000000000095945050505050565b60006105d382610585565b60005a905060006108438686610f9a565b9050610857816060015182608001516113b8565b600080610865838787610db3565b91509150816108a6578286866040517fa2b6d61b00000000000000000000000000000000000000000000000000000000815260040161061093929190613fc6565b6108b18482856114a0565b5050505050505050565b3330146108f6576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610610565b610622816117ff565b33301461093a576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610610565b600061094582610585565b73ffffffffffffffffffffffffffffffffffffffff16036109b6576040517f1c3812cc0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000082166004820152602401610610565b61062281600061188f565b60006109eb7fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85490565b905090565b333014610a2b576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610610565b60005a90506000610a3c8484610f9a565b90506000610a498261194f565b9050610a568382846114a0565b5050505050565b60006105d37f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610d00565b600080610a95836119ca565b91509150915091565b6000805a90506000610ab08787610f9a565b6060810151909150610aca90610ac581610a5d565b6113b8565b600080610ad8838888610db3565b9150915081610b19578287876040517fa2b6d61b00000000000000000000000000000000000000000000000000000000815260040161061093929190613fc6565b610b24848285611a16565b5a610b2f9085613ff6565b9998505050505050505050565b60006109eb305490565b600080600080600080610b5d898989600080611c5e565b939950919750945092509050610b7283611f83565b935093975093979195509350565b333014610bbb576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610610565b6000610bc683610585565b73ffffffffffffffffffffffffffffffffffffffff1614610c37576040517f5b4d6d6a0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000083166004820152602401610610565b610c41828261188f565b5050565b333014610c80576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610610565b610c998383836bffffffffffffffffffffffff16611f97565b6040805184815273ffffffffffffffffffffffffffffffffffffffff841660208201526bffffffffffffffffffffffff83168183015290517febf265acfac1c01de588ed7ef49743b9c3ce8d6d1edeaf510a1f5453228515b19181900360600190a1505050565b6000808383604051602001610d1f929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b610d66813055565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03906020015b60405180910390a150565b600080600084846000818110610dcb57610dcb613d14565b7fff000000000000000000000000000000000000000000000000000000000000009201359182169250507f80000000000000000000000000000000000000000000000000000000000000009081169003610f2057610e288661194f565b9150600080610e36846119ca565b91509150428111610e7d576040517ff95b6ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101829052604401610610565b73ffffffffffffffffffffffffffffffffffffffff821615801590610eb8575073ffffffffffffffffffffffffffffffffffffffff82163314155b15610f14576040517f8945c3130000000000000000000000000000000000000000000000000000000081526004810185905233602482015273ffffffffffffffffffffffffffffffffffffffff83166044820152606401610610565b60019450505050610f92565b6000806000610f33898989600080611c5e565b985092955090935091505082821015610f82576040517ffd41fcba0000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610610565b610f8b81611f83565b9550505050505b935093915050565b604080516101208101825260008082526020820181905260609282018390528282018190526080820181905260a0820183905260c0820181905260e0820152610100810191909152823560f81c60018082168103610ffe576000606084015261100f565b84810135606090811c908401526014015b6007600183901c1680156110625760016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0187840135610100929092039190911c166080850152908101905b600083601016601003611077575060016110a0565b836020166020036110935750600282019186013560f01c6110a0565b50600182019186013560f81c5b8067ffffffffffffffff8111156110b9576110b96133fd565b60405190808252806020026020018201604052801561114457816020015b6111316040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016060815260200160008152602001600015158152602001600015158152602001600081525090565b8152602001906001900390816110d75790505b50604086015260005b818110156113ad5760018085019489013560f81c9080821690036111ac57308760400151838151811061118257611182613d14565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff90911690526111f6565b8489013560601c60148601886040015184815181106111cd576111cd613d14565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff90921690915294505b600280821690036112345784890135602086018860400151848151811061121f5761121f613d14565b60200260200101516020018197508281525050505b600480821690036112cc57600385019489013560e81c89868a6112578483613d01565b9261126493929190614009565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060408901518051859081106112af576112af613d14565b6020908102919091010151604001526112c88187613d01565b9550505b6008808216900361130a578489013560208601886040015184815181106112f5576112f5613d14565b60200260200101516060018197508281525050505b8060101660ff166010148760400151838151811061132a5761132a613d14565b602002602001015160800190151590811515815250508060201660ff166020148760400151838151811061136057611360613d14565b602090810291909101015190151560a090910152604087015180516003600684901c1691908490811061139557611395613d14565b602090810291909101015160c001525060010161114d565b505050505092915050565b60006113c383610a5d565b905081811461140f576040517f9b6514f4000000000000000000000000000000000000000000000000000000008152600481018490526024810183905260448101829052606401610610565b604080517f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e60208083019190915281830186905282518083038401815260609092019092528051910120600183019081905560408051858152602081018390527f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881910160405180910390a150505050565b604081015151600090815b818110156117f7576000846040015182815181106114cb576114cb613d14565b602002602001015190508060a0015180156114e4575083155b156115285760408051878152602081018490527f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b910160405180910390a1506117ef565b606081015160009450801580159061153f5750805a105b1561157c5785835a6040517f2139527400000000000000000000000000000000000000000000000000000000815260040161061093929190614033565b600082608001511561165057825161164990831561159a578361159c565b5a5b634c4e814c60e01b8b8d898b8e606001518b604001516040516024016115c796959493929190614058565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612026565b9050611677565b8251602084015161167491908415611668578461166a565b5a5b866040015161203c565b90505b806117b25760c08301516116d357600195507f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d88856116b4612054565b6040516116c393929190614095565b60405180910390a15050506117ef565b60c08301517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161173d578684611708612054565b6040517f7f6b0bb1000000000000000000000000000000000000000000000000000000008152600401610610939291906140b4565b60c08301517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016117b2577fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b8885611793612054565b6040516117a293929190614095565b60405180910390a15050506117f7565b60408051898152602081018690527f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a910160405180910390a15050505b6001016114ab565b505050505050565b80611836576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61185f7fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8829055565b6040518181527f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa90602001610da8565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008516828401819052835180840385018152606084018086528151919093012073ffffffffffffffffffffffffffffffffffffffff8616908190559152608082015290517f0d7fc113eaf016db4681a1ba86d083ce3e0961f321062a75ac2b0aeb33deeed19181900360a00190a15050565b600080611960836020015130612073565b9050600061196d84612140565b6040517f1901000000000000000000000000000000000000000000000000000000000000602082015260228101849052604281018290529091506062015b6040516020818303038152906040528051906020012092505050919050565b600080806119f87fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e8685610d00565b606081901c956bffffffffffffffffffffffff909116945092505050565b604081015151600090815b818110156117f757600084604001518281518110611a4157611a41613d14565b602002602001015190508060a001518015611a5a575083155b15611a9e5760408051878152602081018490527f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b910160405180910390a150611c56565b6060810151600094508015801590611ab55750805a105b15611af25785835a6040517f2139527400000000000000000000000000000000000000000000000000000000815260040161061093929190614033565b6000826080015115611b17578251611b1090831561159a578361159c565b9050611b32565b82516020840151611b2f91908415611668578461166a565b90505b80611c195760c0830151611b8e57600195507f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d8885611b6f612054565b604051611b7e93929190614095565b60405180910390a1505050611c56565b60c08301517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01611bc3578684611708612054565b60c08301517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611c19577fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b8885611793612054565b60408051898152602081018690527f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a910160405180910390a15050505b600101611a21565b6040805180820182526000808252602082018190529182918291829182918a3560f81c91600191808416148015611ca9575073ffffffffffffffffffffffffffffffffffffffff8916155b15611dc5578b82013560601c985060149091019089611dc55760038201918c013560e81c60008d848e611cdc8583613d01565b92611ce993929190614009565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040517fccce3bc80000000000000000000000000000000000000000000000000000000081529293505073ffffffffffffffffffffffffffffffffffffffff8d169163ccce3bc89150611d7490309085906004016140df565b6040805180830381865afa158015611d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db49190614116565b9250611dc08285613d01565b935050505b82600116600103611dff57611ded8d8a838f8f87908092611de893929190614009565b6123ac565b97509750975097509750505050611f76565b6002838116811460208f015283901c60071660016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018e850135610100929092039190911c16838201909650925060009050611e6a6001600586901c811690613d01565b60016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018f860135610100929092039190911c1699509092019150611eb58d61194f565b9350611ed38d858e8e86908092611ece93929190614009565b6125f0565b600090815260208a815260408083208352888252808320835273ffffffffffffffffffffffffffffffffffffffff8d1690915290208251919850965015801590611f1e575080518614155b8015611f2e575080602001518511155b15611f72576040517fccbb534f0000000000000000000000000000000000000000000000000000000081528151600482015260208201516024820152604401610610565b5050505b9550955095509550959050565b6000611f8e82612f82565b50600192915050565b6120217fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e86847fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b166bffffffffffffffffffffffff8516176040805160208082019590955280820193909352805180840382018152606090930190528151919092012055565b505050565b60008060008351602085018787f4949350505050565b6000806000835160208501878988f195945050505050565b60603d604051915060208201818101604052818352816000823e505090565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de856120e357466120e6565b60005b6040805160208101959095528401929092526060830152608082015273ffffffffffffffffffffffffffffffffffffffff831660a082015260c0015b60405160208183030381529060405280519060200120905092915050565b6000808261010001516040516020016121599190614167565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120835190915060ff166122025760006121aa8460400151612f8d565b606080860151608080880151604080517f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a260208201529081018690529384019290925282015260a0810184905290915060c0016119ab565b825160ff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016122925760a08301518051602091820120604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46693810193909352820152606081018290526080015b60405160208183030381529060405280519060200120915050919050565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016123025760c0830151604080517f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e460208201529081019190915260608101829052608001612274565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd016123725760e0830151604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46660208201529081019190915260608101829052608001612274565b82516040517f0481832000000000000000000000000000000000000000000000000000000000815260ff9091166004820152602401610610565b600080600080600061240e604051806101200160405280600060ff168152602001600015158152602001606081526020016000815260200160008152602001606081526020016000801916815260200160008019168152602001606081525090565b6002815260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b888210156125985760038201916000908b013560e81c6124568482613d01565b9150600090508a821461246a57600061246c565b8d5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036124c4576124b38f8d8d879086926124ab93929190614009565b600185611c5e565b939d50919b509950975095506124e6565b6124da858d8d879086926124ab93929190614009565b50929c50909a50985096505b89891015612532576124fa82858d8f614009565b8b8b6040517fb006aba000000000000000000000000000000000000000000000000000000000815260040161061094939291906141b3565b819350878d60000151036125455760008d525b828710612588576040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004810188905260248101849052604401610610565b50505060c0820185905283612436565b8a51158015906125ac57508a602001518511155b15611f72576040517fccbb534f0000000000000000000000000000000000000000000000000000000081528b51600482015260208c01516024820152604401610610565b60008060005b83811015612f7857600181019085013560f881901c9060fc1c8061271357600f8216600081900361262e5750600183019287013560f81c5b60408051600080825260208281018085528d9052601b8c89019182013560ff81811c928301908116868801529235606086018190527f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82166080870181905296909a0199959094919390929160019060a0015b6020604051602081039080840390855afa1580156126c3573d6000803e3d6000fd5b5050506020604051035190508660ff168c019b5060006126e6828960ff1661301e565b90508b6126f35780612702565b60008c81526020829052604090205b9b50505050505050505050506125f6565b6001810361277757600f821660008190036127355750600183019287013560f81c5b601484019388013560601c600061274f8260ff851661301e565b90508661275c578061276b565b60008781526020829052604090205b965050505050506125f6565b6002810361296c576003821660008190036127995750600183019287013560f81c5b60008489013560601c60148601955090506003600285901c16600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c168288018098508192505050600081880190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff16631626ba7e8f8f8f8d90879261285793929190614009565b6040518463ffffffff1660e01b8152600401612875939291906141da565b602060405180830381865afa158015612892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128b691906141f4565b7fffffffff000000000000000000000000000000000000000000000000000000001614612927578c848d8d8b9085926128f193929190614009565b6040517fb2fed7ae0000000000000000000000000000000000000000000000000000000081526004016106109493929190614211565b8097508460ff168a0199506000612941858760ff1661301e565b90508961294e578061295d565b60008a81526020829052604090205b995050505050505050506125f6565b600381036129a0576020830192870135846129875780612996565b60008581526020829052604090205b94505050506125f6565b60048103612a4357600f8216600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018a870135610100929092039190911c16858301809650819250505060008186019050600080612a158e8e8e8e8c908892611ece93929190614009565b91509150829750818a019950612a35898260009182526020526040902090565b9850505050505050506125f6565b60068103612b0d576003600283901c166000819003612a695750600183019287013560f81c5b600383166000819003612a835750600284019388013560f01c5b6000858a013560e81c600387018162ffffff169150809750819250505060008187019050600080612ac18f8f8f8f8d908892611ece93929190614009565b91509150829850848210612ad457998501995b6000612ae1828789613085565b90508a612aee5780612afd565b60008b81526020829052604090205b9a505050505050505050506125f6565b60058103612b7a576020830192870135888103612b48577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505b6000612b53826130e9565b905085612b605780612b6f565b60008681526020829052604090205b9550505050506125f6565b60078103612c8057600f82166000819003612b9c5750600183019287013560f81c5b600080858a0135602087019650915089860135602087016040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018e905290975090915060ff82901c907f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690601b830190600090600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff851690820152606081018890526080810185905260a0016126a1565b60088103612cd45760208301928701356000612c9c8b8261313d565b9050808203612cc9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505b600061274f826131b8565b60098103612e0c57600382166000819003612cf65750600183019287013560f81c5b60008489013560601c601486019550905060006003600286901c1660016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c168188018098508193505050506000818701905060008373ffffffffffffffffffffffffffffffffffffffff166313792a4a8f8e8e8c908792612d9093929190614009565b6040518463ffffffff1660e01b8152600401612dae93929190613fc6565b602060405180830381865afa158015612dcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612def9190614247565b90508197508460ff168a0199506000612941858760ff16846131f3565b600a8103612f4357600382166000819003612e2e5750600183019287013560f81c5b60008489013560601c60148601955090506003600285901c16600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c1682880180985081925050506000818801905060008473ffffffffffffffffffffffffffffffffffffffff1663898bd9218f8f8f8d908792612ec793929190614009565b6040518463ffffffff1660e01b8152600401612ee5939291906141da565b602060405180830381865afa158015612f02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f269190614247565b90508198508560ff168b019a506000612ae1868860ff16846131f3565b6040517fb2505f7c00000000000000000000000000000000000000000000000000000000815260048101829052602401610610565b5094509492505050565b60006105d382613261565b6000606060005b835181101561300f576000612fc1858381518110612fb457612fb4613d14565b6020026020010151613294565b90508281604051602001612fd6929190614260565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052925050600101612f94565b50805160209091012092915050565b6040517f53657175656e6365207369676e65723a0a00000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b16603182015260458101829052600090606501612122565b6040517f53657175656e6365206e657374656420636f6e6669673a0a000000000000000060208201526038810184905260588101839052607881018290526000906098015b6040516020818303038152906040528051906020012090509392505050565b6040517f53657175656e636520737461746963206469676573743a0a00000000000000006020820152603881018290526000906058015b604051602081830303815290604052805190602001209050919050565b60008061314e846020015184612073565b9050600061315b85612140565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526022810184905260428101829052909150606201604051602081830303815290604052805190602001209250505092915050565b604080517f53657175656e636520616e792061646472657373207375626469676573743a0a6020820152908101829052600090606001613120565b6040517f53657175656e63652073617069656e7420636f6e6669673a0a0000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166039820152604d8101839052606d8101829052600090608d016130ca565b600081158015906105d35750507fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8541490565b60007f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef43782600001518360200151846040015180519060200120856060015186608001518760a001518860c0015160405160200161312098979695949392919097885273ffffffffffffffffffffffffffffffffffffffff969096166020880152604087019490945260608601929092526080850152151560a0840152151560c083015260e08201526101000190565b80357fffffffff0000000000000000000000000000000000000000000000000000000081169060048410156133a2577fffffffff00000000000000000000000000000000000000000000000000000000808560040360031b1b82161691505b5092915050565b8183823760009101908152919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146133dd57600080fd5b919050565b6000602082840312156133f457600080fd5b610789826133b9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561344f5761344f6133fd565b60405290565b604051610120810167ffffffffffffffff8111828210171561344f5761344f6133fd565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134c0576134c06133fd565b604052919050565b803560ff811681146133dd57600080fd5b803580151581146133dd57600080fd5b600067ffffffffffffffff821115613503576135036133fd565b5060051b60200190565b600082601f83011261351e57600080fd5b813567ffffffffffffffff811115613538576135386133fd565b61356960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613479565b81815284602083860101111561357e57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126135ac57600080fd5b81356135bf6135ba826134e9565b613479565b8082825260208201915060208360051b8601019250858311156135e157600080fd5b602085015b838110156136ce57803567ffffffffffffffff81111561360557600080fd5b860160e08189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001121561363957600080fd5b61364161342c565b61364d602083016133b9565b815260408201356020820152606082013567ffffffffffffffff81111561367357600080fd5b6136828a60208386010161350d565b6040830152506080820135606082015261369e60a083016134d9565b60808201526136af60c083016134d9565b60a082015260e0919091013560c08201528352602092830192016135e6565b5095945050505050565b600082601f8301126136e957600080fd5b81356136f76135ba826134e9565b8082825260208201915060208360051b86010192508583111561371957600080fd5b602085015b838110156136ce5761372f816133b9565b83526020928301920161371e565b60008083601f84011261374f57600080fd5b50813567ffffffffffffffff81111561376757600080fd5b60208301915083602082850101111561377f57600080fd5b9250929050565b60008060006040848603121561379b57600080fd5b833567ffffffffffffffff8111156137b257600080fd5b840161012081870312156137c557600080fd5b6137cd613455565b6137d6826134c8565b81526137e4602083016134d9565b6020820152604082013567ffffffffffffffff81111561380357600080fd5b61380f8882850161359b565b604083015250606082810135908201526080808301359082015260a082013567ffffffffffffffff81111561384357600080fd5b61384f8882850161350d565b60a08301525060c0828101359082015260e0808301359082015261010082013567ffffffffffffffff81111561388457600080fd5b613890888285016136d8565b61010083015250935050602084013567ffffffffffffffff8111156138b457600080fd5b6138c08682870161373d565b9497909650939450505050565b6000806000806000608086880312156138e557600080fd5b6138ee866133b9565b94506138fc602087016133b9565b935060408601359250606086013567ffffffffffffffff81111561391f57600080fd5b61392b8882890161373d565b969995985093965092949392505050565b60008060006040848603121561395157600080fd5b83359250602084013567ffffffffffffffff8111156138b457600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461062257600080fd5b6000602082840312156139af57600080fd5b81356107898161396f565b600080600080604085870312156139d057600080fd5b843567ffffffffffffffff8111156139e757600080fd5b6139f38782880161373d565b909550935050602085013567ffffffffffffffff811115613a1357600080fd5b613a1f8782880161373d565b95989497509550505050565b600060208284031215613a3d57600080fd5b5035919050565b60008060208385031215613a5757600080fd5b823567ffffffffffffffff811115613a6e57600080fd5b613a7a8582860161373d565b90969095509350505050565b60008060008060608587031215613a9c57600080fd5b613aa5856133b9565b935060208501359250604085013567ffffffffffffffff811115613a1357600080fd5b60008060408385031215613adb57600080fd5b8235613ae68161396f565b9150613af4602084016133b9565b90509250929050565b60008083601f840112613b0f57600080fd5b50813567ffffffffffffffff811115613b2757600080fd5b6020830191508360208260051b850101111561377f57600080fd5b60008060008060008060008060a0898b031215613b5e57600080fd5b613b67896133b9565b9750613b7560208a016133b9565b9650604089013567ffffffffffffffff811115613b9157600080fd5b613b9d8b828c01613afd565b909750955050606089013567ffffffffffffffff811115613bbd57600080fd5b613bc98b828c01613afd565b909550935050608089013567ffffffffffffffff811115613be957600080fd5b613bf58b828c0161373d565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215613c2257600080fd5b613c2b876133b9565b9550613c39602088016133b9565b94506040870135935060608701359250608087013567ffffffffffffffff811115613c6357600080fd5b613c6f89828a0161373d565b979a9699509497509295939492505050565b600080600060608486031215613c9657600080fd5b83359250613ca6602085016133b9565b915060408401356bffffffffffffffffffffffff81168114613cc757600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105d3576105d3613cd2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60005b83811015613d5e578181015183820152602001613d46565b50506000910152565b60008151808452613d7f816020860160208601613d43565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208501945060208160051b8301016020850160005b83811015613e81577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0858403018852815173ffffffffffffffffffffffffffffffffffffffff815116845260208101516020850152604081015160e06040860152613e3d60e0860182613d67565b6060838101519087015260808084015115159087015260a08084015115159087015260c0928301519290950191909152506020978801979190910190600101613dcf565b50909695505050505050565b600081518084526020840193506020830160005b82811015613ed557815173ffffffffffffffffffffffffffffffffffffffff16865260209586019590910190600101613ea1565b5093949350505050565b805160ff16825260006020820151613efb602085018215159052565b5060408201516101206040850152613f17610120850182613db1565b9050606083015160608501526080830151608085015260a083015184820360a0860152613f448282613d67565b91505060c083015160c085015260e083015160e0850152610100830151848203610100860152613f748282613e8d565b95945050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081526000613fd96040830186613edf565b8281036020840152613fec818587613f7d565b9695505050505050565b818103818111156105d3576105d3613cd2565b6000808585111561401957600080fd5b8386111561402657600080fd5b5050820193919092039150565b6060815260006140466060830186613edf565b60208301949094525060400152919050565b86815285602082015284604082015283606082015282608082015260c060a0820152600061408960c0830184613d67565b98975050505050505050565b838152826020820152606060408201526000613f746060830184613d67565b6060815260006140c76060830186613edf565b8460208401528281036040840152613fec8185613d67565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061410e6040830184613d67565b949350505050565b6000604082840312801561412957600080fd5b506040805190810167ffffffffffffffff8111828210171561414d5761414d6133fd565b604052825181526020928301519281019290925250919050565b8151600090829060208501835b828110156141a857815173ffffffffffffffffffffffffffffffffffffffff16845260209384019390910190600101614174565b509195945050505050565b6060815260006141c7606083018688613f7d565b6020830194909452506040015292915050565b838152604060208201526000613f74604083018486613f7d565b60006020828403121561420657600080fd5b81516107898161396f565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000613fec606083018486613f7d565b60006020828403121561425957600080fd5b5051919050565b60008351614272818460208801613d43565b919091019182525060200191905056fea26469706673582212207478396388582c6d197eb43e1bb7658c82fc494983fa9e400c6e3dfe04350be964736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/Factory.sol/Factory.json b/testchain/artifacts/wallet-contracts-v3/Factory.sol/Factory.json new file mode 100644 index 00000000..46acc895 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/Factory.sol/Factory.json @@ -0,0 +1,51 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Factory", + "sourceName": "src/Factory.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_mainModule", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_salt", + "type": "bytes32" + } + ], + "name": "DeployFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_mainModule", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_salt", + "type": "bytes32" + } + ], + "name": "deploy", + "outputs": [ + { + "internalType": "address", + "name": "_contract", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x6080604052348015600e575f5ffd5b5061035a8061001c5f395ff3fe60806040526004361061001d575f3560e01c806332c02a1414610021575b5f5ffd5b61003b600480360381019061003691906101ba565b610051565b6040516100489190610207565b60405180910390f35b5f5f6040518060600160405280602c81526020016102f9602c91398473ffffffffffffffffffffffffffffffffffffffff1660405160200161009492919061029b565b60405160208183030381529060405290508281516020830134f591505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036101225783836040517f8caac8050000000000000000000000000000000000000000000000000000000081526004016101199291906102d1565b60405180910390fd5b5092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101568261012d565b9050919050565b6101668161014c565b8114610170575f5ffd5b50565b5f813590506101818161015d565b92915050565b5f819050919050565b61019981610187565b81146101a3575f5ffd5b50565b5f813590506101b481610190565b92915050565b5f5f604083850312156101d0576101cf610129565b5b5f6101dd85828601610173565b92505060206101ee858286016101a6565b9150509250929050565b6102018161014c565b82525050565b5f60208201905061021a5f8301846101f8565b92915050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f61024c82610220565b610256818561022a565b9350610266818560208601610234565b80840191505092915050565b5f819050919050565b5f819050919050565b61029561029082610272565b61027b565b82525050565b5f6102a68285610242565b91506102b28284610284565b6020820191508190509392505050565b6102cb81610187565b82525050565b5f6040820190506102e45f8301856101f8565b6102f160208301846102c2565b939250505056fe603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3a264697066735822122009e132ab9d1c11bdbac018e6131534eb4d4460c20d453928a5a0b89cf4ecf4fc64736f6c634300081c0033", + "deployedBytecode": "0x60806040526004361061001d575f3560e01c806332c02a1414610021575b5f5ffd5b61003b600480360381019061003691906101ba565b610051565b6040516100489190610207565b60405180910390f35b5f5f6040518060600160405280602c81526020016102f9602c91398473ffffffffffffffffffffffffffffffffffffffff1660405160200161009492919061029b565b60405160208183030381529060405290508281516020830134f591505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036101225783836040517f8caac8050000000000000000000000000000000000000000000000000000000081526004016101199291906102d1565b60405180910390fd5b5092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101568261012d565b9050919050565b6101668161014c565b8114610170575f5ffd5b50565b5f813590506101818161015d565b92915050565b5f819050919050565b61019981610187565b81146101a3575f5ffd5b50565b5f813590506101b481610190565b92915050565b5f5f604083850312156101d0576101cf610129565b5b5f6101dd85828601610173565b92505060206101ee858286016101a6565b9150509250929050565b6102018161014c565b82525050565b5f60208201905061021a5f8301846101f8565b92915050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f61024c82610220565b610256818561022a565b9350610266818560208601610234565b80840191505092915050565b5f819050919050565b5f819050919050565b61029561029082610272565b61027b565b82525050565b5f6102a68285610242565b91506102b28284610284565b6020820191508190509392505050565b6102cb81610187565b82525050565b5f6040820190506102e45f8301856101f8565b6102f160208301846102c2565b939250505056fe603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3a264697066735822122009e132ab9d1c11bdbac018e6131534eb4d4460c20d453928a5a0b89cf4ecf4fc64736f6c634300081c0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/Guest.sol/Guest.json b/testchain/artifacts/wallet-contracts-v3/Guest.sol/Guest.json new file mode 100644 index 00000000..022b7f05 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/Guest.sol/Guest.json @@ -0,0 +1,335 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Guest", + "sourceName": "src/Guest.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "DelegateCallNotAllowed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + } + ], + "name": "InvalidKind", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_gasLeft", + "type": "uint256" + } + ], + "name": "NotEnoughGas", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "Reverted", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "CallAborted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "CallFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "CallSkipped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "CallSucceeded", + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "fallback" + } + ], + "bytecode": "0x6080604052348015600e575f5ffd5b506117588061001c5f395ff3fe608060405234801561000f575f5ffd5b505f61001b5f36610035565b90505f610027826104d7565b90506100338282610527565b005b61003d610d03565b5f815f019060ff16908160ff16815250505f5f61005a85856107e8565b915060ff16915060018083160361007a575f8360600181815250506100b6565b61008f8186866107fe9290919263ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff169150846060018193508281525050505b5f6007600184901c1690505f8111156100f3576100e58282888861082f9190939291909392919063ffffffff16565b856080018194508281525050505b5f601080851603610107576001905061015f565b60208085160361013a5761012683888861085c9290919263ffffffff16565b8161ffff169150809450819250505061015e565b61014f83888861087b9290919263ffffffff16565b8160ff16915080945081925050505b5b8067ffffffffffffffff81111561017957610178610d9f565b5b6040519080825280602002602001820160405280156101b257816020015b61019f610d4e565b8152602001906001900390816101975790505b5085604001819052505f5f90505b818110156104cc575f6101de858a8a61087b9290919263ffffffff16565b8096508192505050600180821660ff160361024d57308760400151838151811061020b5761020a610dcc565b5b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506102b9565b610262858a8a6108969290919263ffffffff16565b8860400151848151811061027957610278610dcc565b5b60200260200101515f018197508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050505b600280821660ff1603610307576102db858a8a6108c79290919263ffffffff16565b886040015184815181106102f2576102f1610dcc565b5b60200260200101516020018197508281525050505b600480821660ff16036103cf575f61032a868b8b6108dd9290919263ffffffff16565b8162ffffff169150809750819250505089898790838961034a9190610e2f565b9261035793929190610e6a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050886040015184815181106103b0576103af610dcc565b5b60200260200101516040018190525080866103cb9190610e2f565b9550505b600880821660ff160361041d576103f1858a8a6108c79290919263ffffffff16565b8860400151848151811061040857610407610dcc565b5b60200260200101516060018197508281525050505b601080821660ff16148760400151838151811061043d5761043c610dcc565b5b60200260200101516080019015159081151581525050602080821660ff16148760400151838151811061047357610472610dcc565b5b602002602001015160a0019015159081151581525050600660c0821660ff16901c60ff16876040015183815181106104ae576104ad610dcc565b5b602002602001015160c00181815250505080806001019150506101c0565b505050505092915050565b5f5f6104e78360200151306108fd565b90505f6104f3846109a1565b90508181604051602001610508929190610f21565b6040516020818303038152906040528051906020012092505050919050565b5f5f90505f83604001515190505f5f90505b818110156107e1575f8560400151828151811061055957610558610dcc565b5b602002602001015190508060a001518015610572575083155b156105b6577f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b85836040516105a8929190610f75565b60405180910390a1506107d4565b5f93505f816060015190505f81141580156105d05750805a105b156106165786835a6040517f2139527400000000000000000000000000000000000000000000000000000000815260040161060d9392919061136a565b60405180910390fd5b81608001511561065d57826040517f230d1ccc00000000000000000000000000000000000000000000000000000000815260040161065491906113a6565b60405180910390fd5b5f610683835f015184602001515f85146106775784610679565b5a5b8660400151610bd5565b905080610797575f60ff168360c00151036106e657600195507f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d87856106c7610bec565b6040516106d693929190611407565b60405180910390a15050506107d4565b600160ff168360c001510361073d5787846106ff610bec565b6040517f7f6b0bb100000000000000000000000000000000000000000000000000000000815260040161073493929190611443565b60405180910390fd5b600260ff168360c0015103610796577fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b8785610777610bec565b60405161078693929190611407565b60405180910390a15050506107e1565b5b7f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a87856040516107c8929190610f75565b60405180910390a15050505b8080600101915050610539565b5050505050565b5f5f83358060f81c925060019150509250929050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f858401356008840261010003600180866008021b0382821c1693508486019250505094509492505050565b5f5f8483013561ffff8160f01c16925060028401915050935093915050565b5f5f848301358060f81c925060018401915050935093915050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f848301359150602083019050935093915050565b5f5f8483013562ffffff8160e81c16925060038401915050935093915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de8561096c574661096e565b5f5b85604051602001610983959493929190611495565b60405160208183030381529060405280519060200120905092915050565b5f5f8261010001516040516020016109b99190611572565b6040516020818303038152906040528051906020012090505f60ff16835f015160ff1603610a51575f6109ef8460400151610c0a565b90507f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2818560600151866080015185604051602001610a32959493929190611588565b6040516020818303038152906040528051906020012092505050610bd0565b600160ff16835f015160ff1603610ac0577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360a001518051906020012082604051602001610aa2939291906115d9565b60405160208183030381529060405280519060200120915050610bd0565b600260ff16835f015160ff1603610b28577f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e48360c0015182604051602001610b0a939291906115d9565b60405160208183030381529060405280519060200120915050610bd0565b600360ff16835f015160ff1603610b90577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360e0015182604051602001610b72939291906115d9565b60405160208183030381529060405280519060200120915050610bd0565b825f01516040517f04818320000000000000000000000000000000000000000000000000000000008152600401610bc7919061161d565b60405180910390fd5b919050565b5f5f5f835160208501878988f19050949350505050565b60603d604051915060208201818101604052818352815f823e505090565b5f60605f5f90505b8351811015610c73575f610c3f858381518110610c3257610c31610dcc565b5b6020026020010151610c84565b90508281604051602001610c54929190611670565b6040516020818303038152906040529250508080600101915050610c12565b508080519060200120915050919050565b5f7f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437825f01518360200151846040015180519060200120856060015186608001518760a001518860c00151604051602001610ce69897969594939291906116a6565b604051602081830303815290604052805190602001209050919050565b6040518061012001604052805f60ff1681526020015f15158152602001606081526020015f81526020015f8152602001606081526020015f81526020015f8152602001606081525090565b6040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f8152602001606081526020015f81526020015f151581526020015f151581526020015f81525090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610e3982610df9565b9150610e4483610df9565b9250828201905080821115610e5c57610e5b610e02565b5b92915050565b5f5ffd5b5f5ffd5b5f5f85851115610e7d57610e7c610e62565b5b83861115610e8e57610e8d610e66565b5b6001850283019150848603905094509492505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f610ee2600283610ea4565b9150610eed82610eae565b600282019050919050565b5f819050919050565b5f819050919050565b610f1b610f1682610ef8565b610f01565b82525050565b5f610f2b82610ed6565b9150610f378285610f0a565b602082019150610f478284610f0a565b6020820191508190509392505050565b610f6081610ef8565b82525050565b610f6f81610df9565b82525050565b5f604082019050610f885f830185610f57565b610f956020830184610f66565b9392505050565b5f60ff82169050919050565b610fb181610f9c565b82525050565b5f8115159050919050565b610fcb81610fb7565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61102382610ffa565b9050919050565b61103381611019565b82525050565b61104281610df9565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61108a82611048565b6110948185611052565b93506110a4818560208601611062565b6110ad81611070565b840191505092915050565b5f60e083015f8301516110cd5f86018261102a565b5060208301516110e06020860182611039565b50604083015184820360408601526110f88282611080565b915050606083015161110d6060860182611039565b5060808301516111206080860182610fc2565b5060a083015161113360a0860182610fc2565b5060c083015161114660c0860182611039565b508091505092915050565b5f61115c83836110b8565b905092915050565b5f602082019050919050565b5f61117a82610fd1565b6111848185610fdb565b93508360208202850161119685610feb565b805f5b858110156111d157848403895281516111b28582611151565b94506111bd83611164565b925060208a01995050600181019050611199565b50829750879550505050505092915050565b6111ec81610ef8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f611226838361102a565b60208301905092915050565b5f602082019050919050565b5f611248826111f2565b61125281856111fc565b935061125d8361120c565b805f5b8381101561128d578151611274888261121b565b975061127f83611232565b925050600181019050611260565b5085935050505092915050565b5f61012083015f8301516112b05f860182610fa8565b5060208301516112c36020860182610fc2565b50604083015184820360408601526112db8282611170565b91505060608301516112f06060860182611039565b5060808301516113036080860182611039565b5060a083015184820360a086015261131b8282611080565b91505060c083015161133060c08601826111e3565b5060e083015161134360e08601826111e3565b5061010083015184820361010086015261135d828261123e565b9150508091505092915050565b5f6060820190508181035f830152611382818661129a565b90506113916020830185610f66565b61139e6040830184610f66565b949350505050565b5f6020820190506113b95f830184610f66565b92915050565b5f82825260208201905092915050565b5f6113d982611048565b6113e381856113bf565b93506113f3818560208601611062565b6113fc81611070565b840191505092915050565b5f60608201905061141a5f830186610f57565b6114276020830185610f66565b818103604083015261143981846113cf565b9050949350505050565b5f6060820190508181035f83015261145b818661129a565b905061146a6020830185610f66565b818103604083015261147c81846113cf565b9050949350505050565b61148f81611019565b82525050565b5f60a0820190506114a85f830188610f57565b6114b56020830187610f57565b6114c26040830186610f57565b6114cf6060830185610f66565b6114dc6080830184611486565b9695505050505050565b5f81905092915050565b6114f981611019565b82525050565b5f61150a83836114f0565b60208301905092915050565b5f611520826111f2565b61152a81856114e6565b93506115358361120c565b805f5b8381101561156557815161154c88826114ff565b975061155783611232565b925050600181019050611538565b5085935050505092915050565b5f61157d8284611516565b915081905092915050565b5f60a08201905061159b5f830188610f57565b6115a86020830187610f57565b6115b56040830186610f66565b6115c26060830185610f66565b6115cf6080830184610f57565b9695505050505050565b5f6060820190506115ec5f830186610f57565b6115f96020830185610f57565b6116066040830184610f57565b949350505050565b61161781610f9c565b82525050565b5f6020820190506116305f83018461160e565b92915050565b5f81905092915050565b5f61164a82611048565b6116548185611636565b9350611664818560208601611062565b80840191505092915050565b5f61167b8285611640565b91506116878284610f0a565b6020820191508190509392505050565b6116a081610fb7565b82525050565b5f610100820190506116ba5f83018b610f57565b6116c7602083018a611486565b6116d46040830189610f66565b6116e16060830188610f57565b6116ee6080830187610f66565b6116fb60a0830186611697565b61170860c0830185611697565b61171560e0830184610f66565b999850505050505050505056fea2646970667358221220405f34bddc0ba9d44e3f985d8aad5d56facfea4a265ddc093628987cbf971bba64736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b505f61001b5f36610035565b90505f610027826104d7565b90506100338282610527565b005b61003d610d03565b5f815f019060ff16908160ff16815250505f5f61005a85856107e8565b915060ff16915060018083160361007a575f8360600181815250506100b6565b61008f8186866107fe9290919263ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff169150846060018193508281525050505b5f6007600184901c1690505f8111156100f3576100e58282888861082f9190939291909392919063ffffffff16565b856080018194508281525050505b5f601080851603610107576001905061015f565b60208085160361013a5761012683888861085c9290919263ffffffff16565b8161ffff169150809450819250505061015e565b61014f83888861087b9290919263ffffffff16565b8160ff16915080945081925050505b5b8067ffffffffffffffff81111561017957610178610d9f565b5b6040519080825280602002602001820160405280156101b257816020015b61019f610d4e565b8152602001906001900390816101975790505b5085604001819052505f5f90505b818110156104cc575f6101de858a8a61087b9290919263ffffffff16565b8096508192505050600180821660ff160361024d57308760400151838151811061020b5761020a610dcc565b5b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506102b9565b610262858a8a6108969290919263ffffffff16565b8860400151848151811061027957610278610dcc565b5b60200260200101515f018197508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050505b600280821660ff1603610307576102db858a8a6108c79290919263ffffffff16565b886040015184815181106102f2576102f1610dcc565b5b60200260200101516020018197508281525050505b600480821660ff16036103cf575f61032a868b8b6108dd9290919263ffffffff16565b8162ffffff169150809750819250505089898790838961034a9190610e2f565b9261035793929190610e6a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050886040015184815181106103b0576103af610dcc565b5b60200260200101516040018190525080866103cb9190610e2f565b9550505b600880821660ff160361041d576103f1858a8a6108c79290919263ffffffff16565b8860400151848151811061040857610407610dcc565b5b60200260200101516060018197508281525050505b601080821660ff16148760400151838151811061043d5761043c610dcc565b5b60200260200101516080019015159081151581525050602080821660ff16148760400151838151811061047357610472610dcc565b5b602002602001015160a0019015159081151581525050600660c0821660ff16901c60ff16876040015183815181106104ae576104ad610dcc565b5b602002602001015160c00181815250505080806001019150506101c0565b505050505092915050565b5f5f6104e78360200151306108fd565b90505f6104f3846109a1565b90508181604051602001610508929190610f21565b6040516020818303038152906040528051906020012092505050919050565b5f5f90505f83604001515190505f5f90505b818110156107e1575f8560400151828151811061055957610558610dcc565b5b602002602001015190508060a001518015610572575083155b156105b6577f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b85836040516105a8929190610f75565b60405180910390a1506107d4565b5f93505f816060015190505f81141580156105d05750805a105b156106165786835a6040517f2139527400000000000000000000000000000000000000000000000000000000815260040161060d9392919061136a565b60405180910390fd5b81608001511561065d57826040517f230d1ccc00000000000000000000000000000000000000000000000000000000815260040161065491906113a6565b60405180910390fd5b5f610683835f015184602001515f85146106775784610679565b5a5b8660400151610bd5565b905080610797575f60ff168360c00151036106e657600195507f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d87856106c7610bec565b6040516106d693929190611407565b60405180910390a15050506107d4565b600160ff168360c001510361073d5787846106ff610bec565b6040517f7f6b0bb100000000000000000000000000000000000000000000000000000000815260040161073493929190611443565b60405180910390fd5b600260ff168360c0015103610796577fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b8785610777610bec565b60405161078693929190611407565b60405180910390a15050506107e1565b5b7f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a87856040516107c8929190610f75565b60405180910390a15050505b8080600101915050610539565b5050505050565b5f5f83358060f81c925060019150509250929050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f858401356008840261010003600180866008021b0382821c1693508486019250505094509492505050565b5f5f8483013561ffff8160f01c16925060028401915050935093915050565b5f5f848301358060f81c925060018401915050935093915050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f848301359150602083019050935093915050565b5f5f8483013562ffffff8160e81c16925060038401915050935093915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de8561096c574661096e565b5f5b85604051602001610983959493929190611495565b60405160208183030381529060405280519060200120905092915050565b5f5f8261010001516040516020016109b99190611572565b6040516020818303038152906040528051906020012090505f60ff16835f015160ff1603610a51575f6109ef8460400151610c0a565b90507f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2818560600151866080015185604051602001610a32959493929190611588565b6040516020818303038152906040528051906020012092505050610bd0565b600160ff16835f015160ff1603610ac0577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360a001518051906020012082604051602001610aa2939291906115d9565b60405160208183030381529060405280519060200120915050610bd0565b600260ff16835f015160ff1603610b28577f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e48360c0015182604051602001610b0a939291906115d9565b60405160208183030381529060405280519060200120915050610bd0565b600360ff16835f015160ff1603610b90577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360e0015182604051602001610b72939291906115d9565b60405160208183030381529060405280519060200120915050610bd0565b825f01516040517f04818320000000000000000000000000000000000000000000000000000000008152600401610bc7919061161d565b60405180910390fd5b919050565b5f5f5f835160208501878988f19050949350505050565b60603d604051915060208201818101604052818352815f823e505090565b5f60605f5f90505b8351811015610c73575f610c3f858381518110610c3257610c31610dcc565b5b6020026020010151610c84565b90508281604051602001610c54929190611670565b6040516020818303038152906040529250508080600101915050610c12565b508080519060200120915050919050565b5f7f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437825f01518360200151846040015180519060200120856060015186608001518760a001518860c00151604051602001610ce69897969594939291906116a6565b604051602081830303815290604052805190602001209050919050565b6040518061012001604052805f60ff1681526020015f15158152602001606081526020015f81526020015f8152602001606081526020015f81526020015f8152602001606081525090565b6040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f8152602001606081526020015f81526020015f151581526020015f151581526020015f81525090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610e3982610df9565b9150610e4483610df9565b9250828201905080821115610e5c57610e5b610e02565b5b92915050565b5f5ffd5b5f5ffd5b5f5f85851115610e7d57610e7c610e62565b5b83861115610e8e57610e8d610e66565b5b6001850283019150848603905094509492505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f610ee2600283610ea4565b9150610eed82610eae565b600282019050919050565b5f819050919050565b5f819050919050565b610f1b610f1682610ef8565b610f01565b82525050565b5f610f2b82610ed6565b9150610f378285610f0a565b602082019150610f478284610f0a565b6020820191508190509392505050565b610f6081610ef8565b82525050565b610f6f81610df9565b82525050565b5f604082019050610f885f830185610f57565b610f956020830184610f66565b9392505050565b5f60ff82169050919050565b610fb181610f9c565b82525050565b5f8115159050919050565b610fcb81610fb7565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61102382610ffa565b9050919050565b61103381611019565b82525050565b61104281610df9565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61108a82611048565b6110948185611052565b93506110a4818560208601611062565b6110ad81611070565b840191505092915050565b5f60e083015f8301516110cd5f86018261102a565b5060208301516110e06020860182611039565b50604083015184820360408601526110f88282611080565b915050606083015161110d6060860182611039565b5060808301516111206080860182610fc2565b5060a083015161113360a0860182610fc2565b5060c083015161114660c0860182611039565b508091505092915050565b5f61115c83836110b8565b905092915050565b5f602082019050919050565b5f61117a82610fd1565b6111848185610fdb565b93508360208202850161119685610feb565b805f5b858110156111d157848403895281516111b28582611151565b94506111bd83611164565b925060208a01995050600181019050611199565b50829750879550505050505092915050565b6111ec81610ef8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f611226838361102a565b60208301905092915050565b5f602082019050919050565b5f611248826111f2565b61125281856111fc565b935061125d8361120c565b805f5b8381101561128d578151611274888261121b565b975061127f83611232565b925050600181019050611260565b5085935050505092915050565b5f61012083015f8301516112b05f860182610fa8565b5060208301516112c36020860182610fc2565b50604083015184820360408601526112db8282611170565b91505060608301516112f06060860182611039565b5060808301516113036080860182611039565b5060a083015184820360a086015261131b8282611080565b91505060c083015161133060c08601826111e3565b5060e083015161134360e08601826111e3565b5061010083015184820361010086015261135d828261123e565b9150508091505092915050565b5f6060820190508181035f830152611382818661129a565b90506113916020830185610f66565b61139e6040830184610f66565b949350505050565b5f6020820190506113b95f830184610f66565b92915050565b5f82825260208201905092915050565b5f6113d982611048565b6113e381856113bf565b93506113f3818560208601611062565b6113fc81611070565b840191505092915050565b5f60608201905061141a5f830186610f57565b6114276020830185610f66565b818103604083015261143981846113cf565b9050949350505050565b5f6060820190508181035f83015261145b818661129a565b905061146a6020830185610f66565b818103604083015261147c81846113cf565b9050949350505050565b61148f81611019565b82525050565b5f60a0820190506114a85f830188610f57565b6114b56020830187610f57565b6114c26040830186610f57565b6114cf6060830185610f66565b6114dc6080830184611486565b9695505050505050565b5f81905092915050565b6114f981611019565b82525050565b5f61150a83836114f0565b60208301905092915050565b5f611520826111f2565b61152a81856114e6565b93506115358361120c565b805f5b8381101561156557815161154c88826114ff565b975061155783611232565b925050600181019050611538565b5085935050505092915050565b5f61157d8284611516565b915081905092915050565b5f60a08201905061159b5f830188610f57565b6115a86020830187610f57565b6115b56040830186610f66565b6115c26060830185610f66565b6115cf6080830184610f57565b9695505050505050565b5f6060820190506115ec5f830186610f57565b6115f96020830185610f57565b6116066040830184610f57565b949350505050565b61161781610f9c565b82525050565b5f6020820190506116305f83018461160e565b92915050565b5f81905092915050565b5f61164a82611048565b6116548185611636565b9350611664818560208601611062565b80840191505092915050565b5f61167b8285611640565b91506116878284610f0a565b6020820191508190509392505050565b6116a081610fb7565b82525050565b5f610100820190506116ba5f83018b610f57565b6116c7602083018a611486565b6116d46040830189610f66565b6116e16060830188610f57565b6116ee6080830187610f66565b6116fb60a0830186611697565b61170860c0830185611697565b61171560e0830184610f66565b999850505050505050505056fea2646970667358221220405f34bddc0ba9d44e3f985d8aad5d56facfea4a265ddc093628987cbf971bba64736f6c634300081c0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/Simulator.sol/Simulator.json b/testchain/artifacts/wallet-contracts-v3/Simulator.sol/Simulator.json new file mode 100644 index 00000000..5ff39d54 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/Simulator.sol/Simulator.json @@ -0,0 +1,84 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Simulator", + "sourceName": "src/Simulator.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "_calls", + "type": "tuple[]" + } + ], + "name": "simulate", + "outputs": [ + { + "components": [ + { + "internalType": "enum Simulator.Status", + "name": "status", + "type": "uint8" + }, + { + "internalType": "bytes", + "name": "result", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasUsed", + "type": "uint256" + } + ], + "internalType": "struct Simulator.Result[]", + "name": "results", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6080604052348015600f57600080fd5b50610ac28061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a27c392214610030575b600080fd5b61004361003e3660046105e4565b610059565b60405161005091906106ee565b60405180910390f35b606060005a90506000838067ffffffffffffffff81111561007c5761007c6107cc565b6040519080825280602002602001820160405280156100d257816020015b6100bf6040805160608101909152806000815260200160608152602001600081525090565b81526020019060019003908161009a5790505b50935060005b8181101561058c5760008787838181106100f4576100f46107fb565b9050602002810190610106919061082a565b61010f90610977565b90508060a001518015610120575083155b1561012b5750610584565b60608101516000945080158015906101425750805a105b156101dc57600587848151811061015b5761015b6107fb565b60200260200101516000019060058111156101785761017861065b565b9081600581111561018b5761018b61065b565b9052505a6040516020016101a191815260200190565b6040516020818303038152906040528784815181106101c2576101c26107fb565b602002602001015160200181905250505050505050610591565b60008260800151156102e25760005a84519091506102ad9084156102005784610202565b5a5b634c4e814c60e01b60008c8a8c60008c6040015160405160240161022b96959493929190610a0f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610597565b91505a6102ba9082610a52565b8986815181106102cc576102cc6107fb565b602002602001015160400181815250505061033c565b60005a8451602086015191925061030b9185156102ff5785610301565b5a5b87604001516105ad565b91505a6103189082610a52565b89868151811061032a5761032a6107fb565b60200260200101516040018181525050505b806105105760c08301516103c657600195506002888581518110610362576103626107fb565b602002602001015160000190600581111561037f5761037f61065b565b908160058111156103925761039261065b565b90525061039d6105c5565b8885815181106103af576103af6107fb565b602002602001015160200181905250505050610584565b60c08301517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161046d576004888581518110610405576104056107fb565b60200260200101516000019060058111156104225761042261065b565b908160058111156104355761043561065b565b9052506104406105c5565b888581518110610452576104526107fb565b60200260200101516020018190525050505050505050610591565b60c08301517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016105105760038885815181106104ac576104ac6107fb565b60200260200101516000019060058111156104c9576104c961065b565b908160058111156104dc576104dc61065b565b9052506104e76105c5565b8885815181106104f9576104f96107fb565b60200260200101516020018190525050505061058c565b6001888581518110610524576105246107fb565b60200260200101516000019060058111156105415761054161065b565b908160058111156105545761055461065b565b90525061055f6105c5565b888581518110610571576105716107fb565b6020026020010151602001819052505050505b6001016100d8565b505050505b92915050565b60008060008351602085018787f4949350505050565b6000806000835160208501878988f195945050505050565b60603d604051915060208201818101604052818352816000823e505090565b600080602083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b8301601f8101851361061f57600080fd5b803567ffffffffffffffff81111561063657600080fd5b8560208260051b840101111561064b57600080fd5b6020919091019590945092505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000815180845260005b818110156106b057602081850181015186830182015201610694565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156107c0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08786030184528151805160068110610780577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8087525060208101516060602088015261079d606088018261068a565b604092830151979092019690965294506020938401939190910190600101610716565b50929695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2183360301811261085e57600080fd5b9190910192915050565b60405160e0810167ffffffffffffffff8111828210171561088b5761088b6107cc565b60405290565b803573ffffffffffffffffffffffffffffffffffffffff811681146108b557600080fd5b919050565b600082601f8301126108cb57600080fd5b813567ffffffffffffffff8111156108e5576108e56107cc565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810167ffffffffffffffff81118282101715610932576109326107cc565b60405281815283820160200185101561094a57600080fd5b816020850160208301376000918101602001919091529392505050565b803580151581146108b557600080fd5b600060e0823603121561098957600080fd5b610991610868565b61099a83610891565b815260208381013590820152604083013567ffffffffffffffff8111156109c057600080fd5b6109cc368286016108ba565b604083015250606083810135908201526109e860808401610967565b60808201526109f960a08401610967565b60a082015260c092830135928101929092525090565b60ff8716815285602082015284604082015283606082015260ff8316608082015260c060a08201526000610a4660c083018461068a565b98975050505050505050565b81810381811115610591577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220d11a1ece8fb20fac672ee0d608fef08ee9a0091cd1c29a5a56eadbe79560f7a864736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063a27c392214610030575b600080fd5b61004361003e3660046105e4565b610059565b60405161005091906106ee565b60405180910390f35b606060005a90506000838067ffffffffffffffff81111561007c5761007c6107cc565b6040519080825280602002602001820160405280156100d257816020015b6100bf6040805160608101909152806000815260200160608152602001600081525090565b81526020019060019003908161009a5790505b50935060005b8181101561058c5760008787838181106100f4576100f46107fb565b9050602002810190610106919061082a565b61010f90610977565b90508060a001518015610120575083155b1561012b5750610584565b60608101516000945080158015906101425750805a105b156101dc57600587848151811061015b5761015b6107fb565b60200260200101516000019060058111156101785761017861065b565b9081600581111561018b5761018b61065b565b9052505a6040516020016101a191815260200190565b6040516020818303038152906040528784815181106101c2576101c26107fb565b602002602001015160200181905250505050505050610591565b60008260800151156102e25760005a84519091506102ad9084156102005784610202565b5a5b634c4e814c60e01b60008c8a8c60008c6040015160405160240161022b96959493929190610a0f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610597565b91505a6102ba9082610a52565b8986815181106102cc576102cc6107fb565b602002602001015160400181815250505061033c565b60005a8451602086015191925061030b9185156102ff5785610301565b5a5b87604001516105ad565b91505a6103189082610a52565b89868151811061032a5761032a6107fb565b60200260200101516040018181525050505b806105105760c08301516103c657600195506002888581518110610362576103626107fb565b602002602001015160000190600581111561037f5761037f61065b565b908160058111156103925761039261065b565b90525061039d6105c5565b8885815181106103af576103af6107fb565b602002602001015160200181905250505050610584565b60c08301517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161046d576004888581518110610405576104056107fb565b60200260200101516000019060058111156104225761042261065b565b908160058111156104355761043561065b565b9052506104406105c5565b888581518110610452576104526107fb565b60200260200101516020018190525050505050505050610591565b60c08301517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016105105760038885815181106104ac576104ac6107fb565b60200260200101516000019060058111156104c9576104c961065b565b908160058111156104dc576104dc61065b565b9052506104e76105c5565b8885815181106104f9576104f96107fb565b60200260200101516020018190525050505061058c565b6001888581518110610524576105246107fb565b60200260200101516000019060058111156105415761054161065b565b908160058111156105545761055461065b565b90525061055f6105c5565b888581518110610571576105716107fb565b6020026020010151602001819052505050505b6001016100d8565b505050505b92915050565b60008060008351602085018787f4949350505050565b6000806000835160208501878988f195945050505050565b60603d604051915060208201818101604052818352816000823e505090565b600080602083850312156105f757600080fd5b823567ffffffffffffffff81111561060e57600080fd5b8301601f8101851361061f57600080fd5b803567ffffffffffffffff81111561063657600080fd5b8560208260051b840101111561064b57600080fd5b6020919091019590945092505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000815180845260005b818110156106b057602081850181015186830182015201610694565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156107c0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08786030184528151805160068110610780577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8087525060208101516060602088015261079d606088018261068a565b604092830151979092019690965294506020938401939190910190600101610716565b50929695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2183360301811261085e57600080fd5b9190910192915050565b60405160e0810167ffffffffffffffff8111828210171561088b5761088b6107cc565b60405290565b803573ffffffffffffffffffffffffffffffffffffffff811681146108b557600080fd5b919050565b600082601f8301126108cb57600080fd5b813567ffffffffffffffff8111156108e5576108e56107cc565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810167ffffffffffffffff81118282101715610932576109326107cc565b60405281815283820160200185101561094a57600080fd5b816020850160208301376000918101602001919091529392505050565b803580151581146108b557600080fd5b600060e0823603121561098957600080fd5b610991610868565b61099a83610891565b815260208381013590820152604083013567ffffffffffffffff8111156109c057600080fd5b6109cc368286016108ba565b604083015250606083810135908201526109e860808401610967565b60808201526109f960a08401610967565b60a082015260c092830135928101929092525090565b60ff8716815285602082015284604082015283606082015260ff8316608082015260c060a08201526000610a4660c083018461068a565b98975050505050505050565b81810381811115610591577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220d11a1ece8fb20fac672ee0d608fef08ee9a0091cd1c29a5a56eadbe79560f7a864736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/Stage1Module.sol/Stage1Module.json b/testchain/artifacts/wallet-contracts-v3/Stage1Module.sol/Stage1Module.json new file mode 100644 index 00000000..abb5ae4a --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/Stage1Module.sol/Stage1Module.json @@ -0,0 +1,1468 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Stage1Module", + "sourceName": "src/Stage1Module.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_factory", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + } + ], + "name": "BadNonce", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "HookAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "HookDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "ImageHashIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_signer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidERC1271Signature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + } + ], + "name": "InvalidKind", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSapientSignature", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_flag", + "type": "uint256" + } + ], + "name": "InvalidSignatureFlag", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes1", + "name": "_type", + "type": "bytes1" + } + ], + "name": "InvalidSignatureType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "InvalidSignatureWeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_expires", + "type": "uint256" + } + ], + "name": "InvalidStaticSignatureExpired", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_caller", + "type": "address" + }, + { + "internalType": "address", + "name": "_expectedCaller", + "type": "address" + } + ], + "name": "InvalidStaticSignatureWrongCaller", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "LowWeightChainedSignature", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_gasLeft", + "type": "uint256" + } + ], + "name": "NotEnoughGas", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + } + ], + "name": "OnlySelf", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "Reverted", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "internalType": "struct Snapshot", + "name": "_snapshot", + "type": "tuple" + } + ], + "name": "UnusedSnapshot", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_nextCheckpoint", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_checkpoint", + "type": "uint256" + } + ], + "name": "WrongChainedCheckpointOrder", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "CallAborted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "CallFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "CallSkipped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "CallSucceeded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + }, + { + "indexed": false, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "DefinedHook", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "newImageHash", + "type": "bytes32" + } + ], + "name": "ImageHashUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_newNonce", + "type": "uint256" + } + ], + "name": "NonceChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint96", + "name": "_timestamp", + "type": "uint96" + } + ], + "name": "StaticSignatureSet", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "FACTORY", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INIT_CODE_HASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAGE_2_IMPLEMENTATION", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + }, + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "addHook", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_payload", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + } + ], + "name": "getStaticSignature", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "readHook", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + } + ], + "name": "readNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverPartialSignature", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isValidImage", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "opHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverSapientSignature", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "removeHook", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_payload", + "type": "bytes" + } + ], + "name": "selfExecute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "internalType": "uint96", + "name": "_timestamp", + "type": "uint96" + } + ], + "name": "setStaticSignature", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "tokenReceived", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_imageHash", + "type": "bytes32" + } + ], + "name": "updateImageHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_implementation", + "type": "address" + } + ], + "name": "updateImplementation", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x60e060405234801561000f575f5ffd5b5060405161ab9738038061ab9783398181016040528101906100319190610196565b8060405161003e9061012b565b604051809103905ff080158015610057573d5f5f3e3d5ffd5b505f6040518060600160405280602c815260200161ab6b602c91393073ffffffffffffffffffffffffffffffffffffffff1660405160200161009a92919061023c565b60405160208183030381529060405280519060200120905080608081815250508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505050505050610263565b615398806157d383390190565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101658261013c565b9050919050565b6101758161015b565b811461017f575f5ffd5b50565b5f815190506101908161016c565b92915050565b5f602082840312156101ab576101aa610138565b5b5f6101b884828501610182565b91505092915050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f6101ed826101c1565b6101f781856101cb565b93506102078185602086016101d5565b80840191505092915050565b5f819050919050565b5f819050919050565b61023661023182610213565b61021c565b82525050565b5f61024782856101e3565b91506102538284610225565b6020820191508190509392505050565b60805160a05160c0516155316102a25f395f8181610bfe0152611a0401525f81816109f401526131d301525f818161095401526131f501526155315ff3fe60806040526004361061012d575f3560e01c80636ea44577116100aa578063aaf10f421161006e578063aaf10f42146104b5578063ad55366b146104df578063b93ea7ad14610520578063bc197c811461053c578063f23a6e6114610578578063f727ef1c146105b457610134565b80636ea44577146103ce5780638943ec02146103ea5780638c3f55631461041257806392dcb3fc1461044e5780639f69ef541461048b57610134565b80631f6a1eb9116100f15780631f6a1eb91461031a578063257671f51461033657806329561426146103605780632dd31000146103885780634fcf3eca146103b257610134565b8063025b22bc1461020e57806313792a4a1461022a578063150b7a02146102665780631626ba7e146102a25780631a9b2337146102de57610134565b3661013457005b60045f3690501061020c575f6101555f369061015091906135ab565b6105dc565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461020a575f5f8273ffffffffffffffffffffffffffffffffffffffff165f366040516101b3929190613645565b5f60405180830381855af49150503d805f81146101eb576040519150601f19603f3d011682016040523d82523d5f602084013e6101f0565b606091505b50915091508161020257805160208201fd5b805160208201f35b505b005b610228600480360381019061022391906136c8565b610631565b005b348015610235575f5ffd5b50610250600480360381019061024b9190613cf3565b6106ad565b60405161025d9190613d7b565b60405180910390f35b348015610271575f5ffd5b5061028c60048036038101906102879190613d94565b61085c565b6040516102999190613e27565b60405180910390f35b3480156102ad575f5ffd5b506102c860048036038101906102c39190613e40565b610870565b6040516102d59190613e27565b60405180910390f35b3480156102e9575f5ffd5b5061030460048036038101906102ff9190613ec7565b6108b2565b6040516103119190613f01565b60405180910390f35b610334600480360381019061032f9190613f1a565b6108c3565b005b348015610341575f5ffd5b5061034a610952565b6040516103579190613d7b565b60405180910390f35b34801561036b575f5ffd5b5061038660048036038101906103819190613f98565b610976565b005b348015610393575f5ffd5b5061039c6109f2565b6040516103a99190613f01565b60405180910390f35b6103cc60048036038101906103c79190613ec7565b610a16565b005b6103e860048036038101906103e39190613fc3565b610b0b565b005b3480156103f5575f5ffd5b50610410600480360381019061040b919061400e565b610baa565b005b34801561041d575f5ffd5b506104386004803603810190610433919061407f565b610bb0565b60405161044591906140b9565b60405180910390f35b348015610459575f5ffd5b50610474600480360381019061046f9190613f98565b610be8565b6040516104829291906140d2565b60405180910390f35b348015610496575f5ffd5b5061049f610bfc565b6040516104ac9190613f01565b60405180910390f35b3480156104c0575f5ffd5b506104c9610c20565b6040516104d69190613f01565b60405180910390f35b3480156104ea575f5ffd5b5061050560048036038101906105009190613cf3565b610c2e565b60405161051796959493929190614108565b60405180910390f35b61053a60048036038101906105359190614167565b610c6c565b005b348015610547575f5ffd5b50610562600480360381019061055d91906141fa565b610d62565b60405161056f9190613e27565b60405180910390f35b348015610583575f5ffd5b5061059e600480360381019061059991906142d1565b610d79565b6040516105ab9190613e27565b60405180910390f35b3480156105bf575f5ffd5b506105da60048036038101906105d591906143a8565b610d8e565b005b5f6106287fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1205f1b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916610e57565b5f1c9050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106a157336040517fa19dbf000000000000000000000000000000000000000000000000000000000081526004016106989190613f01565b60405180910390fd5b6106aa81610e8f565b50565b5f5f6001856101000151516106c29190614425565b67ffffffffffffffff8111156106db576106da613707565b5b6040519080825280602002602001820160405280156107095781602001602082028036833780820191505090505b5090505f5f90505b8561010001515181101561079957856101000151818151811061073757610736614458565b5b602002602001015182828151811061075257610751614458565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610711565b50338186610100015151815181106107b4576107b3614458565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808561010001819052505f610804868686610ed2565b5090508061084d578585856040517ff58cc8b500000000000000000000000000000000000000000000000000000000815260040161084493929190614838565b60405180910390fd5b60015f1b925050509392505050565b5f63150b7a0260e01b905095945050505050565b5f5f61087b856110c2565b90505f610889828686610ed2565b5090508061089e575f60e01b925050506108ab565b6320c13b0b60e01b925050505b9392505050565b5f6108bc826105dc565b9050919050565b5f5a90505f6108d286866110eb565b90506108e68160600151826080015161158d565b5f5f6108f3838787610ed2565b915091508161093d578286866040517fa2b6d61b00000000000000000000000000000000000000000000000000000000815260040161093493929190614838565b60405180910390fd5b610948848285611631565b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109e657336040517fa19dbf000000000000000000000000000000000000000000000000000000000081526004016109dd9190613f01565b60405180910390fd5b6109ef81611961565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a8657336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610a7d9190613f01565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16610aa6826105dc565b73ffffffffffffffffffffffffffffffffffffffff1603610afe57806040517f1c3812cc000000000000000000000000000000000000000000000000000000008152600401610af59190613e27565b60405180910390fd5b610b08815f611a2b565b50565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7b57336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610b729190613f01565b60405180910390fd5b5f5a90505f610b8a84846110eb565b90505f610b9682611acc565b9050610ba3838284611631565b5050505050565b50505050565b5f610bdf7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e5f1b835f1b610e57565b5f1c9050919050565b5f5f610bf383611b1c565b91509150915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f610c29611b6d565b905090565b5f5f5f5f5f5f610c418989895f5f611b75565b809550819650829750839950849a505050505050610c5e83611eb2565b935093975093979195509350565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cdc57336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610cd39190613f01565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16610cfc836105dc565b73ffffffffffffffffffffffffffffffffffffffff1614610d5457816040517f5b4d6d6a000000000000000000000000000000000000000000000000000000008152600401610d4b9190613e27565b60405180910390fd5b610d5e8282611a2b565b5050565b5f63bc197c8160e01b905098975050505050505050565b5f63f23a6e6160e01b90509695505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dfe57336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610df59190613f01565b60405180910390fd5b610e178383836bffffffffffffffffffffffff16611ec3565b7febf265acfac1c01de588ed7ef49743b9c3ce8d6d1edeaf510a1f5453228515b1838383604051610e4a9392919061487e565b60405180910390a1505050565b5f5f8383604051602001610e6c9291906148b3565b604051602081830303815290604052805190602001209050805491505092915050565b610e9881611f21565b7f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca0381604051610ec79190613f01565b60405180910390a150565b5f5f5f84845f818110610ee857610ee7614458565b5b9050013560f81c60f81b9050608060f81b608060f81b82167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361104157610f3086611acc565b91505f5f610f3d84611b1c565b91509150428111610f875783816040517ff95b6ab7000000000000000000000000000000000000000000000000000000008152600401610f7e9291906148da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610fef57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611035578333836040517f8945c31300000000000000000000000000000000000000000000000000000000815260040161102c93929190614901565b60405180910390fd5b600194505050506110ba565b5f5f5f6110518989895f5f611b75565b905080985081945082955083965050505050828210156110aa5782826040517ffd41fcba0000000000000000000000000000000000000000000000000000000081526004016110a1929190614936565b60405180910390fd5b6110b381611eb2565b9550505050505b935093915050565b6110ca6134b6565b6003815f019060ff16908160ff1681525050818160e0018181525050919050565b6110f36134b6565b5f815f019060ff16908160ff16815250505f5f6111108585611f27565b915060ff169150600180831603611130575f83606001818152505061116c565b611145818686611f3d9290919263ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff169150846060018193508281525050505b5f6007600184901c1690505f8111156111a95761119b82828888611f6e9190939291909392919063ffffffff16565b856080018194508281525050505b5f6010808516036111bd5760019050611215565b6020808516036111f0576111dc838888611f9b9290919263ffffffff16565b8161ffff1691508094508192505050611214565b611205838888611fba9290919263ffffffff16565b8160ff16915080945081925050505b5b8067ffffffffffffffff81111561122f5761122e613707565b5b60405190808252806020026020018201604052801561126857816020015b611255613501565b81526020019060019003908161124d5790505b5085604001819052505f5f90505b81811015611582575f611294858a8a611fba9290919263ffffffff16565b8096508192505050600180821660ff16036113035730876040015183815181106112c1576112c0614458565b5b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061136f565b611318858a8a611fd59290919263ffffffff16565b8860400151848151811061132f5761132e614458565b5b60200260200101515f018197508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050505b600280821660ff16036113bd57611391858a8a6120069290919263ffffffff16565b886040015184815181106113a8576113a7614458565b5b60200260200101516020018197508281525050505b600480821660ff1603611485575f6113e0868b8b61201c9290919263ffffffff16565b8162ffffff16915080975081925050508989879083896114009190614425565b9261140d93929190614965565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508860400151848151811061146657611465614458565b5b60200260200101516040018190525080866114819190614425565b9550505b600880821660ff16036114d3576114a7858a8a6120069290919263ffffffff16565b886040015184815181106114be576114bd614458565b5b60200260200101516060018197508281525050505b601080821660ff1614876040015183815181106114f3576114f2614458565b5b60200260200101516080019015159081151581525050602080821660ff16148760400151838151811061152957611528614458565b5b602002602001015160a0019015159081151581525050600660c0821660ff16901c60ff168760400151838151811061156457611563614458565b5b602002602001015160c0018181525050508080600101915050611276565b505050505092915050565b5f61159783610bb0565b90508181146115e1578282826040517f9b6514f40000000000000000000000000000000000000000000000000000000081526004016115d89392919061499f565b60405180910390fd5b5f6001830190506115f2848261203c565b7f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f8818482604051611623929190614936565b60405180910390a150505050565b5f5f90505f82604001515190505f5f90505b81811015611959575f8460400151828151811061166357611662614458565b5b602002602001015190508060a00151801561167c575083155b156116c0577f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b86836040516116b29291906148da565b60405180910390a15061194c565b5f93505f816060015190505f81141580156116da5750805a105b156117205785835a6040517f21395274000000000000000000000000000000000000000000000000000000008152600401611717939291906149d4565b60405180910390fd5b5f8260800151156117d5576117ce835f01515f841461173f5783611741565b5a5b634c4e814c60e01b8b8d898b8e606001518b6040015160405160240161176c96959493929190614a48565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612071565b90506117fd565b6117fa835f015184602001515f85146117ee57846117f0565b5a5b8660400151612086565b90505b8061190f575f60ff168360c001510361185e57600195507f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d888561183f61209d565b60405161184e93929190614aae565b60405180910390a150505061194c565b600160ff168360c00151036118b557868461187761209d565b6040517f7f6b0bb10000000000000000000000000000000000000000000000000000000081526004016118ac93929190614aea565b60405180910390fd5b600260ff168360c001510361190e577fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b88856118ef61209d565b6040516118fe93929190614aae565b60405180910390a1505050611959565b5b7f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a88856040516119409291906148da565b60405180910390a15050505b8080600101915050611643565b505050505050565b5f5f1b810361199c576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119c87fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b826120bb565b7f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa816040516119f79190613d7b565b60405180910390a1611a287f0000000000000000000000000000000000000000000000000000000000000000610e8f565b50565b611a8f7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1205f1b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff165f1b6120c2565b7f0d7fc113eaf016db4681a1ba86d083ce3e0961f321062a75ac2b0aeb33deeed18282604051611ac0929190614b2d565b60405180910390a15050565b5f5f611adc8360200151306120f7565b90505f611ae88461219b565b90508181604051602001611afd929190614bc8565b6040516020818303038152906040528051906020012092505050919050565b5f5f5f611b4b7fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e865f1b85610e57565b5f1c9050606081901c816bffffffffffffffffffffffff169250925050915091565b5f3054905090565b5f5f5f5f5f5f5f611b868b8b611f27565b915060ff169150611b95613552565b6040808416148015611bd257505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16145b15611d0e57611bec828d8d611fd59290919263ffffffff16565b809350819a50505089611d0d575f611c0f838e8e61201c9290919263ffffffff16565b8162ffffff16915080945081925050505f8d8d85908487611c309190614425565b92611c3d93929190614965565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505090508a73ffffffffffffffffffffffffffffffffffffffff1663ccce3bc830836040518363ffffffff1660e01b8152600401611cbc929190614bfe565b6040805180830381865afa158015611cd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cfa9190614ca1565b92508184611d089190614425565b935050505b5b600180841603611d4757611d358d8a838f8f87908092611d3093929190614965565b6123cf565b97509750975097509750505050611ea5565b6002808416148d60200190151590811515815250505f6002601c8516901c9050611d8383828f8f611f6e9190939291909392919063ffffffff16565b8094508197505050505f6001600560208616901c611da19190614425565b9050611dbf83828f8f611f6e9190939291909392919063ffffffff16565b809450819a50505050611dd18d611acc565b9350611def8d858e8e86908092611dea93929190614965565b612631565b8097508198505050611e0386895f1b6131a5565b9550611e1186865f1b6131a5565b9550611e35868a73ffffffffffffffffffffffffffffffffffffffff165f1b6131a5565b95505f5f1b815f015114158015611e4f575085815f015114155b8015611e5f575080602001518511155b15611ea157806040517fccbb534f000000000000000000000000000000000000000000000000000000008152600401611e989190614cf9565b60405180910390fd5b5050505b9550955095509550959050565b5f611ebc826131b9565b9050919050565b611f1c7fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e865f1b846bffffffffffffffffffffffff841660608673ffffffffffffffffffffffffffffffffffffffff16901b175f1b6120c2565b505050565b80305550565b5f5f83358060f81c925060019150509250929050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f858401356008840261010003600180866008021b0382821c1693508486019250505094509492505050565b5f5f8483013561ffff8160f01c16925060028401915050935093915050565b5f5f848301358060f81c925060018401915050935093915050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f848301359150602083019050935093915050565b5f5f8483013562ffffff8160e81c16925060038401915050935093915050565b61206d7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e5f1b835f1b835f1b6120c2565b5050565b5f5f5f8351602085018787f490509392505050565b5f5f5f835160208501878988f19050949350505050565b60603d604051915060208201818101604052818352815f823e505090565b8082555050565b5f83836040516020016120d69291906148b3565b60405160208183030381529060405280519060200120905081815550505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de856121665746612168565b5f5b8560405160200161217d959493929190614d12565b60405160208183030381529060405280519060200120905092915050565b5f5f8261010001516040516020016121b39190614def565b6040516020818303038152906040528051906020012090505f60ff16835f015160ff160361224b575f6121e9846040015161325c565b90507f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a281856060015186608001518560405160200161222c959493929190614e05565b60405160208183030381529060405280519060200120925050506123ca565b600160ff16835f015160ff16036122ba577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360a00151805190602001208260405160200161229c93929190614e56565b604051602081830303815290604052805190602001209150506123ca565b600260ff16835f015160ff1603612322577f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e48360c001518260405160200161230493929190614e56565b604051602081830303815290604052805190602001209150506123ca565b600360ff16835f015160ff160361238a577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360e001518260405160200161236c93929190614e56565b604051602081830303815290604052805190602001209150506123ca565b825f01516040517f048183200000000000000000000000000000000000000000000000000000000081526004016123c19190614e9a565b60405180910390fd5b919050565b5f5f5f5f5f6123dc6134b6565b6002815f019060ff16908160ff16815250505f5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505b898990508210156125c6575f5f612436848d8d61201c9290919263ffffffff16565b8162ffffff169150809550819250505083816124529190614425565b9150505f8b8b90508214612466575f612468565b8d5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036124c8576124af8f8d8d879086926124a793929190614965565b600185611b75565b809a50819b50829c50839d50849e5050505050506124f8565b6124e6858d8d879086926124de93929190614965565b600185611b75565b50809a50819b50829c50839d50505050505b89891015612553578b8b8590849261251293929190614965565b8b8b6040517fb006aba000000000000000000000000000000000000000000000000000000000815260040161254a9493929190614eb3565b60405180910390fd5b819350878d5f01510361256c575f5f1b8d5f0181815250505b8287106125b25786836040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004016125a9929190614936565b60405180910390fd5b878560c00181815250508692505050612414565b5f5f1b8b5f0151141580156125df57508a602001518511155b15612621578a6040517fccbb534f0000000000000000000000000000000000000000000000000000000081526004016126189190614cf9565b60405180910390fd5b5050509550955095509550959050565b5f5f5f5b8484905081101561319b575f612656828787611fba9290919263ffffffff16565b8160ff16915080935081925050505f600460f08316901c90505f81036127ae575f600f831690505f8160ff16036126a55761269c848989611fba9290919263ffffffff16565b80955081925050505b5f5f6126bc868b8b6132d69290919263ffffffff16565b80975081935050506126d9868b8b6132d69290919263ffffffff16565b80975081925050505f60ff82901c5f1c90505f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835f1c165f1b90505f601b830190505f60018f8388866040515f815260200160405260405161273f9493929190614ef1565b6020604051602081039080840390855afa15801561275f573d5f5f3e3d5ffd5b5050506020604051035190508660ff168c019b505f612781828960ff166132ec565b90505f5f1b8c03612792578061279d565b61279c8c826131a5565b5b9b5050505050505050505050612635565b60018103612839575f600f831690505f8160ff16036127e5576127dc848989611fba9290919263ffffffff16565b80955081925050505b5f6127fb858a8a611fd59290919263ffffffff16565b80965081925050505f612811828460ff166132ec565b90505f5f1b8703612822578061282d565b61282c87826131a5565b5b96505050505050612635565b60028103612a38575f6003831690505f8160ff160361287057612867848989611fba9290919263ffffffff16565b80955081925050505b5f612886858a8a611fd59290919263ffffffff16565b80965081925050505f6002600c861660ff16901c60ff1690505f6128bc87838d8d611f6e9190939291909392919063ffffffff16565b80985081925050505f81880190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff16631626ba7e8f8f8f8d90879261292093929190614965565b6040518463ffffffff1660e01b815260040161293e93929190614f34565b602060405180830381865afa158015612959573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297d9190614f78565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146129f4578c848d8d8b9085926129b593929190614965565b6040517fb2fed7ae0000000000000000000000000000000000000000000000000000000081526004016129eb9493929190614fa3565b60405180910390fd5b8097508460ff168a0199505f612a0d858760ff166132ec565b90505f5f1b8a03612a1e5780612a29565b612a288a826131a5565b5b99505050505050505050612635565b60038103612a82575f612a568489896132d69290919263ffffffff16565b80955081925050505f5f1b8503612a6d5780612a78565b612a7785826131a5565b5b9450505050612635565b60048103612b01575f600f831660ff1690505f612ab185838b8b611f6e9190939291909392919063ffffffff16565b80965081925050505f81860190505f5f612add8e8e8e8e8c908892612ad893929190614965565b612631565b91509150829750818a019950612af389826131a5565b985050505050505050612635565b60068103612c11575f6002600c841660ff16901c60ff1690505f8103612b4557612b36848989611fba9290919263ffffffff16565b8160ff16915080955081925050505b5f6003841660ff1690505f8103612b7b57612b6b858a8a611f9b9290919263ffffffff16565b8161ffff16915080965081925050505b5f612b91868b8b61201c9290919263ffffffff16565b8162ffffff16915080975081925050505f81870190505f5f612bc58f8f8f8f8d908892612bc093929190614965565b612631565b91509150829850848210612bd957858b019a505b5f612be582878961331e565b90505f5f1b8b03612bf65780612c01565b612c008b826131a5565b5b9a50505050505050505050612635565b60058103612c93575f612c2f8489896132d69290919263ffffffff16565b8095508192505050888103612c62577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505b5f612c6c82613353565b90505f5f1b8603612c7d5780612c88565b612c8786826131a5565b5b955050505050612635565b60078103612df9575f600f831690505f8160ff1603612cca57612cc1848989611fba9290919263ffffffff16565b80955081925050505b5f5f612ce1868b8b6132d69290919263ffffffff16565b8097508193505050612cfe868b8b6132d69290919263ffffffff16565b80975081925050505f60ff82901c5f1c90505f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835f1c165f1b90505f601b830190505f60018f604051602001612d55919061502b565b604051602081830303815290604052805190602001208388866040515f8152602001604052604051612d8a9493929190614ef1565b6020604051602081039080840390855afa158015612daa573d5f5f3e3d5ffd5b5050506020604051035190508660ff168c019b505f612dcc828960ff166132ec565b90505f5f1b8c03612ddd5780612de8565b612de78c826131a5565b5b9b5050505050505050505050612635565b60088103612e92575f612e178489896132d69290919263ffffffff16565b80955081925050505f612e335f8c61338290919063ffffffff16565b9050808203612e60577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505b5f612e6a836133d3565b90505f5f1b8703612e7b5780612e86565b612e8587826131a5565b5b96505050505050612635565b60098103612ff8575f6003831690505f8160ff1603612ec957612ec0848989611fba9290919263ffffffff16565b80955081925050505b5f612edf858a8a611fd59290919263ffffffff16565b80965081925050505f5f6002600c871660ff16901c60ff169050612f1587828d8d611f6e9190939291909392919063ffffffff16565b8098508193505050505f81870190505f8373ffffffffffffffffffffffffffffffffffffffff166313792a4a8f8e8e8c908792612f5493929190614965565b6040518463ffffffff1660e01b8152600401612f7293929190615050565b602060405180830381865afa158015612f8d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fb19190615087565b90508197508460ff168a0199505f612fcd858760ff1684613402565b90505f5f1b8a03612fde5780612fe9565b612fe88a826131a5565b5b99505050505050505050612635565b600a810361315e575f6003831690505f8160ff160361302f57613026848989611fba9290919263ffffffff16565b80955081925050505b5f613045858a8a611fd59290919263ffffffff16565b80965081925050505f6002600c861660ff16901c60ff1690505f61307b87838d8d611f6e9190939291909392919063ffffffff16565b80985081925050505f81880190505f8473ffffffffffffffffffffffffffffffffffffffff1663898bd9218f8f8f8d9087926130b993929190614965565b6040518463ffffffff1660e01b81526004016130d793929190614f34565b602060405180830381865afa1580156130f2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131169190615087565b90508198508560ff168b019a505f613132868860ff1684613402565b90505f5f1b8b03613143578061314e565b61314d8b826131a5565b5b9a50505050505050505050612635565b806040517fb2505f7c00000000000000000000000000000000000000000000000000000000815260040161319291906140b9565b60405180910390fd5b5094509492505050565b5f825f528160205260405f20905092915050565b5f3073ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000060405160200161322693929190615141565b604051602081830303815290604052805190602001205f1c73ffffffffffffffffffffffffffffffffffffffff16149050919050565b5f60605f5f90505b83518110156132c5575f61329185838151811061328457613283614458565b5b6020026020010151613437565b905082816040516020016132a69291906151b8565b6040516020818303038152906040529250508080600101915050613264565b508080519060200120915050919050565b5f5f848301359150602083019050935093915050565b5f8282604051602001613300929190615249565b60405160208183030381529060405280519060200120905092915050565b5f838383604051602001613334939291906152c9565b6040516020818303038152906040528051906020012090509392505050565b5f81604051602001613365919061535a565b604051602081830303815290604052805190602001209050919050565b5f5f6133928460200151846120f7565b90505f61339e8561219b565b905081816040516020016133b3929190614bc8565b604051602081830303815290604052805190602001209250505092915050565b5f816040516020016133e591906153c9565b604051602081830303815290604052805190602001209050919050565b5f83838360405160200161341893929190615438565b6040516020818303038152906040528051906020012090509392505050565b5f7f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437825f01518360200151846040015180519060200120856060015186608001518760a001518860c0015160405160200161349998979695949392919061547f565b604051602081830303815290604052805190602001209050919050565b6040518061012001604052805f60ff1681526020015f15158152602001606081526020015f81526020015f8152602001606081526020015f81526020015f8152602001606081525090565b6040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f8152602001606081526020015f81526020015f151581526020015f151581526020015f81525090565b60405180604001604052805f81526020015f81525090565b5f82905092915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b5f82821b905092915050565b5f6135b6838361356a565b826135c18135613574565b92506004821015613601576135fc7fffffffff000000000000000000000000000000000000000000000000000000008360040360080261359f565b831692505b505092915050565b5f81905092915050565b828183375f83830152505050565b5f61362c8385613609565b9350613639838584613613565b82840190509392505050565b5f613651828486613621565b91508190509392505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6136978261366e565b9050919050565b6136a78161368d565b81146136b1575f5ffd5b50565b5f813590506136c28161369e565b92915050565b5f602082840312156136dd576136dc613666565b5b5f6136ea848285016136b4565b91505092915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61373d826136f7565b810181811067ffffffffffffffff8211171561375c5761375b613707565b5b80604052505050565b5f61376e61365d565b905061377a8282613734565b919050565b5f5ffd5b5f60ff82169050919050565b61379881613783565b81146137a2575f5ffd5b50565b5f813590506137b38161378f565b92915050565b5f8115159050919050565b6137cd816137b9565b81146137d7575f5ffd5b50565b5f813590506137e8816137c4565b92915050565b5f5ffd5b5f67ffffffffffffffff82111561380c5761380b613707565b5b602082029050602081019050919050565b5f5ffd5b5f819050919050565b61383381613821565b811461383d575f5ffd5b50565b5f8135905061384e8161382a565b92915050565b5f5ffd5b5f67ffffffffffffffff82111561387257613871613707565b5b61387b826136f7565b9050602081019050919050565b5f61389a61389584613858565b613765565b9050828152602081018484840111156138b6576138b5613854565b5b6138c1848285613613565b509392505050565b5f82601f8301126138dd576138dc6137ee565b5b81356138ed848260208601613888565b91505092915050565b5f60e0828403121561390b5761390a6136f3565b5b61391560e0613765565b90505f613924848285016136b4565b5f83015250602061393784828501613840565b602083015250604082013567ffffffffffffffff81111561395b5761395a61377f565b5b613967848285016138c9565b604083015250606061397b84828501613840565b606083015250608061398f848285016137da565b60808301525060a06139a3848285016137da565b60a08301525060c06139b784828501613840565b60c08301525092915050565b5f6139d56139d0846137f2565b613765565b905080838252602082019050602084028301858111156139f8576139f761381d565b5b835b81811015613a3f57803567ffffffffffffffff811115613a1d57613a1c6137ee565b5b808601613a2a89826138f6565b855260208501945050506020810190506139fa565b5050509392505050565b5f82601f830112613a5d57613a5c6137ee565b5b8135613a6d8482602086016139c3565b91505092915050565b5f819050919050565b613a8881613a76565b8114613a92575f5ffd5b50565b5f81359050613aa381613a7f565b92915050565b5f67ffffffffffffffff821115613ac357613ac2613707565b5b602082029050602081019050919050565b5f613ae6613ae184613aa9565b613765565b90508083825260208201905060208402830185811115613b0957613b0861381d565b5b835b81811015613b325780613b1e88826136b4565b845260208401935050602081019050613b0b565b5050509392505050565b5f82601f830112613b5057613b4f6137ee565b5b8135613b60848260208601613ad4565b91505092915050565b5f6101208284031215613b7f57613b7e6136f3565b5b613b8a610120613765565b90505f613b99848285016137a5565b5f830152506020613bac848285016137da565b602083015250604082013567ffffffffffffffff811115613bd057613bcf61377f565b5b613bdc84828501613a49565b6040830152506060613bf084828501613840565b6060830152506080613c0484828501613840565b60808301525060a082013567ffffffffffffffff811115613c2857613c2761377f565b5b613c34848285016138c9565b60a08301525060c0613c4884828501613a95565b60c08301525060e0613c5c84828501613a95565b60e08301525061010082013567ffffffffffffffff811115613c8157613c8061377f565b5b613c8d84828501613b3c565b6101008301525092915050565b5f5ffd5b5f5f83601f840112613cb357613cb26137ee565b5b8235905067ffffffffffffffff811115613cd057613ccf613c9a565b5b602083019150836001820283011115613cec57613ceb61381d565b5b9250929050565b5f5f5f60408486031215613d0a57613d09613666565b5b5f84013567ffffffffffffffff811115613d2757613d2661366a565b5b613d3386828701613b69565b935050602084013567ffffffffffffffff811115613d5457613d5361366a565b5b613d6086828701613c9e565b92509250509250925092565b613d7581613a76565b82525050565b5f602082019050613d8e5f830184613d6c565b92915050565b5f5f5f5f5f60808688031215613dad57613dac613666565b5b5f613dba888289016136b4565b9550506020613dcb888289016136b4565b9450506040613ddc88828901613840565b935050606086013567ffffffffffffffff811115613dfd57613dfc61366a565b5b613e0988828901613c9e565b92509250509295509295909350565b613e2181613574565b82525050565b5f602082019050613e3a5f830184613e18565b92915050565b5f5f5f60408486031215613e5757613e56613666565b5b5f613e6486828701613a95565b935050602084013567ffffffffffffffff811115613e8557613e8461366a565b5b613e9186828701613c9e565b92509250509250925092565b613ea681613574565b8114613eb0575f5ffd5b50565b5f81359050613ec181613e9d565b92915050565b5f60208284031215613edc57613edb613666565b5b5f613ee984828501613eb3565b91505092915050565b613efb8161368d565b82525050565b5f602082019050613f145f830184613ef2565b92915050565b5f5f5f5f60408587031215613f3257613f31613666565b5b5f85013567ffffffffffffffff811115613f4f57613f4e61366a565b5b613f5b87828801613c9e565b9450945050602085013567ffffffffffffffff811115613f7e57613f7d61366a565b5b613f8a87828801613c9e565b925092505092959194509250565b5f60208284031215613fad57613fac613666565b5b5f613fba84828501613a95565b91505092915050565b5f5f60208385031215613fd957613fd8613666565b5b5f83013567ffffffffffffffff811115613ff657613ff561366a565b5b61400285828601613c9e565b92509250509250929050565b5f5f5f5f6060858703121561402657614025613666565b5b5f614033878288016136b4565b945050602061404487828801613840565b935050604085013567ffffffffffffffff8111156140655761406461366a565b5b61407187828801613c9e565b925092505092959194509250565b5f6020828403121561409457614093613666565b5b5f6140a184828501613840565b91505092915050565b6140b381613821565b82525050565b5f6020820190506140cc5f8301846140aa565b92915050565b5f6040820190506140e55f830185613ef2565b6140f260208301846140aa565b9392505050565b614102816137b9565b82525050565b5f60c08201905061411b5f8301896140aa565b61412860208301886140aa565b61413560408301876140f9565b6141426060830186613d6c565b61414f60808301856140aa565b61415c60a0830184613d6c565b979650505050505050565b5f5f6040838503121561417d5761417c613666565b5b5f61418a85828601613eb3565b925050602061419b858286016136b4565b9150509250929050565b5f5f83601f8401126141ba576141b96137ee565b5b8235905067ffffffffffffffff8111156141d7576141d6613c9a565b5b6020830191508360208202830111156141f3576141f261381d565b5b9250929050565b5f5f5f5f5f5f5f5f60a0898b03121561421657614215613666565b5b5f6142238b828c016136b4565b98505060206142348b828c016136b4565b975050604089013567ffffffffffffffff8111156142555761425461366a565b5b6142618b828c016141a5565b9650965050606089013567ffffffffffffffff8111156142845761428361366a565b5b6142908b828c016141a5565b9450945050608089013567ffffffffffffffff8111156142b3576142b261366a565b5b6142bf8b828c01613c9e565b92509250509295985092959890939650565b5f5f5f5f5f5f60a087890312156142eb576142ea613666565b5b5f6142f889828a016136b4565b965050602061430989828a016136b4565b955050604061431a89828a01613840565b945050606061432b89828a01613840565b935050608087013567ffffffffffffffff81111561434c5761434b61366a565b5b61435889828a01613c9e565b92509250509295509295509295565b5f6bffffffffffffffffffffffff82169050919050565b61438781614367565b8114614391575f5ffd5b50565b5f813590506143a28161437e565b92915050565b5f5f5f606084860312156143bf576143be613666565b5b5f6143cc86828701613a95565b93505060206143dd868287016136b4565b92505060406143ee86828701614394565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61442f82613821565b915061443a83613821565b9250828201905080821115614452576144516143f8565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61448e81613783565b82525050565b61449d816137b9565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6144d58161368d565b82525050565b6144e481613821565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f61451c826144ea565b61452681856144f4565b9350614536818560208601614504565b61453f816136f7565b840191505092915050565b5f60e083015f83015161455f5f8601826144cc565b50602083015161457260208601826144db565b506040830151848203604086015261458a8282614512565b915050606083015161459f60608601826144db565b5060808301516145b26080860182614494565b5060a08301516145c560a0860182614494565b5060c08301516145d860c08601826144db565b508091505092915050565b5f6145ee838361454a565b905092915050565b5f602082019050919050565b5f61460c826144a3565b61461681856144ad565b935083602082028501614628856144bd565b805f5b85811015614663578484038952815161464485826145e3565b945061464f836145f6565b925060208a0199505060018101905061462b565b50829750879550505050505092915050565b61467e81613a76565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f6146b883836144cc565b60208301905092915050565b5f602082019050919050565b5f6146da82614684565b6146e4818561468e565b93506146ef8361469e565b805f5b8381101561471f57815161470688826146ad565b9750614711836146c4565b9250506001810190506146f2565b5085935050505092915050565b5f61012083015f8301516147425f860182614485565b5060208301516147556020860182614494565b506040830151848203604086015261476d8282614602565b915050606083015161478260608601826144db565b50608083015161479560808601826144db565b5060a083015184820360a08601526147ad8282614512565b91505060c08301516147c260c0860182614675565b5060e08301516147d560e0860182614675565b506101008301518482036101008601526147ef82826146d0565b9150508091505092915050565b5f82825260208201905092915050565b5f61481783856147fc565b9350614824838584613613565b61482d836136f7565b840190509392505050565b5f6040820190508181035f830152614850818661472c565b9050818103602083015261486581848661480c565b9050949350505050565b61487881614367565b82525050565b5f6060820190506148915f830186613d6c565b61489e6020830185613ef2565b6148ab604083018461486f565b949350505050565b5f6040820190506148c65f830185613d6c565b6148d36020830184613d6c565b9392505050565b5f6040820190506148ed5f830185613d6c565b6148fa60208301846140aa565b9392505050565b5f6060820190506149145f830186613d6c565b6149216020830185613ef2565b61492e6040830184613ef2565b949350505050565b5f6040820190506149495f8301856140aa565b61495660208301846140aa565b9392505050565b5f5ffd5b5f5ffd5b5f5f858511156149785761497761495d565b5b8386111561498957614988614961565b5b6001850283019150848603905094509492505050565b5f6060820190506149b25f8301866140aa565b6149bf60208301856140aa565b6149cc60408301846140aa565b949350505050565b5f6060820190508181035f8301526149ec818661472c565b90506149fb60208301856140aa565b614a0860408301846140aa565b949350505050565b5f614a1a826144ea565b614a2481856147fc565b9350614a34818560208601614504565b614a3d816136f7565b840191505092915050565b5f60c082019050614a5b5f830189613d6c565b614a6860208301886140aa565b614a7560408301876140aa565b614a8260608301866140aa565b614a8f60808301856140aa565b81810360a0830152614aa18184614a10565b9050979650505050505050565b5f606082019050614ac15f830186613d6c565b614ace60208301856140aa565b8181036040830152614ae08184614a10565b9050949350505050565b5f6060820190508181035f830152614b02818661472c565b9050614b1160208301856140aa565b8181036040830152614b238184614a10565b9050949350505050565b5f604082019050614b405f830185613e18565b614b4d6020830184613ef2565b9392505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f614b92600283614b54565b9150614b9d82614b5e565b600282019050919050565b5f819050919050565b614bc2614bbd82613a76565b614ba8565b82525050565b5f614bd282614b86565b9150614bde8285614bb1565b602082019150614bee8284614bb1565b6020820191508190509392505050565b5f604082019050614c115f830185613ef2565b8181036020830152614c238184614a10565b90509392505050565b5f81519050614c3a81613a7f565b92915050565b5f81519050614c4e8161382a565b92915050565b5f60408284031215614c6957614c686136f3565b5b614c736040613765565b90505f614c8284828501614c2c565b5f830152506020614c9584828501614c40565b60208301525092915050565b5f60408284031215614cb657614cb5613666565b5b5f614cc384828501614c54565b91505092915050565b604082015f820151614ce05f850182614675565b506020820151614cf360208501826144db565b50505050565b5f604082019050614d0c5f830184614ccc565b92915050565b5f60a082019050614d255f830188613d6c565b614d326020830187613d6c565b614d3f6040830186613d6c565b614d4c60608301856140aa565b614d596080830184613ef2565b9695505050505050565b5f81905092915050565b614d768161368d565b82525050565b5f614d878383614d6d565b60208301905092915050565b5f614d9d82614684565b614da78185614d63565b9350614db28361469e565b805f5b83811015614de2578151614dc98882614d7c565b9750614dd4836146c4565b925050600181019050614db5565b5085935050505092915050565b5f614dfa8284614d93565b915081905092915050565b5f60a082019050614e185f830188613d6c565b614e256020830187613d6c565b614e3260408301866140aa565b614e3f60608301856140aa565b614e4c6080830184613d6c565b9695505050505050565b5f606082019050614e695f830186613d6c565b614e766020830185613d6c565b614e836040830184613d6c565b949350505050565b614e9481613783565b82525050565b5f602082019050614ead5f830184614e8b565b92915050565b5f6060820190508181035f830152614ecc81868861480c565b9050614edb60208301856140aa565b614ee860408301846140aa565b95945050505050565b5f608082019050614f045f830187613d6c565b614f116020830186614e8b565b614f1e6040830185613d6c565b614f2b6060830184613d6c565b95945050505050565b5f604082019050614f475f830186613d6c565b8181036020830152614f5a81848661480c565b9050949350505050565b5f81519050614f7281613e9d565b92915050565b5f60208284031215614f8d57614f8c613666565b5b5f614f9a84828501614f64565b91505092915050565b5f606082019050614fb65f830187613d6c565b614fc36020830186613ef2565b8181036040830152614fd681848661480c565b905095945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f82015250565b5f615015601c83614b54565b915061502082614fe1565b601c82019050919050565b5f61503582615009565b91506150418284614bb1565b60208201915081905092915050565b5f6040820190508181035f830152615068818661472c565b9050818103602083015261507d81848661480c565b9050949350505050565b5f6020828403121561509c5761509b613666565b5b5f6150a984828501614c2c565b91505092915050565b7fff000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6150e6600183614b54565b91506150f1826150b2565b600182019050919050565b5f8160601b9050919050565b5f615112826150fc565b9050919050565b5f61512382615108565b9050919050565b61513b6151368261368d565b615119565b82525050565b5f61514b826150da565b9150615157828661512a565b6014820191506151678285614bb1565b6020820191506151778284614bb1565b602082019150819050949350505050565b5f615192826144ea565b61519c8185613609565b93506151ac818560208601614504565b80840191505092915050565b5f6151c38285615188565b91506151cf8284614bb1565b6020820191508190509392505050565b7f53657175656e6365207369676e65723a0a0000000000000000000000000000005f82015250565b5f615213601183614b54565b915061521e826151df565b601182019050919050565b5f819050919050565b61524361523e82613821565b615229565b82525050565b5f61525382615207565b915061525f828561512a565b60148201915061526f8284615232565b6020820191508190509392505050565b7f53657175656e6365206e657374656420636f6e6669673a0a00000000000000005f82015250565b5f6152b3601883614b54565b91506152be8261527f565b601882019050919050565b5f6152d3826152a7565b91506152df8286614bb1565b6020820191506152ef8285615232565b6020820191506152ff8284615232565b602082019150819050949350505050565b7f53657175656e636520737461746963206469676573743a0a00000000000000005f82015250565b5f615344601883614b54565b915061534f82615310565b601882019050919050565b5f61536482615338565b91506153708284614bb1565b60208201915081905092915050565b7f53657175656e636520616e792061646472657373207375626469676573743a0a5f82015250565b5f6153b3602083614b54565b91506153be8261537f565b602082019050919050565b5f6153d3826153a7565b91506153df8284614bb1565b60208201915081905092915050565b7f53657175656e63652073617069656e7420636f6e6669673a0a000000000000005f82015250565b5f615422601983614b54565b915061542d826153ee565b601982019050919050565b5f61544282615416565b915061544e828661512a565b60148201915061545e8285615232565b60208201915061546e8284614bb1565b602082019150819050949350505050565b5f610100820190506154935f83018b613d6c565b6154a0602083018a613ef2565b6154ad60408301896140aa565b6154ba6060830188613d6c565b6154c760808301876140aa565b6154d460a08301866140f9565b6154e160c08301856140f9565b6154ee60e08301846140aa565b999850505050505050505056fea26469706673582212203719e46a9a86dab24a35db4a3d94c62713d15f05ffd1a322e60a2ef3b78ffbf964736f6c634300081c00336080604052348015600e575f5ffd5b5061537c8061001c5f395ff3fe608060405260043610610117575f3560e01c80636ea445771161009f578063ad55366b11610063578063ad55366b14610475578063b93ea7ad146104b6578063bc197c81146104d2578063f23a6e611461050e578063f727ef1c1461054a5761011e565b80636ea445771461038e5780638943ec02146103aa5780638c3f5563146103d257806392dcb3fc1461040e578063aaf10f421461044b5761011e565b80631a9b2337116100e65780631a9b2337146102c85780631f6a1eb91461030457806329561426146103205780634fcf3eca1461034857806351605d80146103645761011e565b8063025b22bc146101f857806313792a4a14610214578063150b7a02146102505780631626ba7e1461028c5761011e565b3661011e57005b60045f369050106101f6575f61013f5f369061013a9190613487565b610572565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146101f4575f5f8273ffffffffffffffffffffffffffffffffffffffff165f3660405161019d929190613521565b5f60405180830381855af49150503d805f81146101d5576040519150601f19603f3d011682016040523d82523d5f602084013e6101da565b606091505b5091509150816101ec57805160208201fd5b805160208201f35b505b005b610212600480360381019061020d91906135a4565b6105c7565b005b34801561021f575f5ffd5b5061023a60048036038101906102359190613bcf565b610643565b6040516102479190613c57565b60405180910390f35b34801561025b575f5ffd5b5061027660048036038101906102719190613c70565b6107f2565b6040516102839190613d03565b60405180910390f35b348015610297575f5ffd5b506102b260048036038101906102ad9190613d1c565b610806565b6040516102bf9190613d03565b60405180910390f35b3480156102d3575f5ffd5b506102ee60048036038101906102e99190613da3565b610848565b6040516102fb9190613ddd565b60405180910390f35b61031e60048036038101906103199190613df6565b610859565b005b34801561032b575f5ffd5b5061034660048036038101906103419190613e74565b6108e8565b005b610362600480360381019061035d9190613da3565b610964565b005b34801561036f575f5ffd5b50610378610a59565b6040516103859190613c57565b60405180910390f35b6103a860048036038101906103a39190613e9f565b610a8a565b005b3480156103b5575f5ffd5b506103d060048036038101906103cb9190613eea565b610b29565b005b3480156103dd575f5ffd5b506103f860048036038101906103f39190613f5b565b610b2f565b6040516104059190613f95565b60405180910390f35b348015610419575f5ffd5b50610434600480360381019061042f9190613e74565b610b67565b604051610442929190613fae565b60405180910390f35b348015610456575f5ffd5b5061045f610b7b565b60405161046c9190613ddd565b60405180910390f35b348015610480575f5ffd5b5061049b60048036038101906104969190613bcf565b610b89565b6040516104ad96959493929190613fe4565b60405180910390f35b6104d060048036038101906104cb9190614043565b610bc7565b005b3480156104dd575f5ffd5b506104f860048036038101906104f391906140d6565b610cbd565b6040516105059190613d03565b60405180910390f35b348015610519575f5ffd5b50610534600480360381019061052f91906141ad565b610cd4565b6040516105419190613d03565b60405180910390f35b348015610555575f5ffd5b50610570600480360381019061056b9190614284565b610ce9565b005b5f6105be7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1205f1b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916610db2565b5f1c9050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461063757336040517fa19dbf0000000000000000000000000000000000000000000000000000000000815260040161062e9190613ddd565b60405180910390fd5b61064081610dea565b50565b5f5f6001856101000151516106589190614301565b67ffffffffffffffff811115610671576106706135e3565b5b60405190808252806020026020018201604052801561069f5781602001602082028036833780820191505090505b5090505f5f90505b8561010001515181101561072f5785610100015181815181106106cd576106cc614334565b5b60200260200101518282815181106106e8576106e7614334565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506106a7565b503381866101000151518151811061074a57610749614334565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808561010001819052505f61079a868686610e2d565b509050806107e3578585856040517ff58cc8b50000000000000000000000000000000000000000000000000000000081526004016107da93929190614714565b60405180910390fd5b60015f1b925050509392505050565b5f63150b7a0260e01b905095945050505050565b5f5f6108118561101d565b90505f61081f828686610e2d565b50905080610834575f60e01b92505050610841565b6320c13b0b60e01b925050505b9392505050565b5f61085282610572565b9050919050565b5f5a90505f6108688686611046565b905061087c816060015182608001516114e8565b5f5f610889838787610e2d565b91509150816108d3578286866040517fa2b6d61b0000000000000000000000000000000000000000000000000000000081526004016108ca93929190614714565b60405180910390fd5b6108de84828561158c565b5050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461095857336040517fa19dbf0000000000000000000000000000000000000000000000000000000000815260040161094f9190613ddd565b60405180910390fd5b610961816118bc565b50565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109d457336040517fa19dbf000000000000000000000000000000000000000000000000000000000081526004016109cb9190613ddd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff166109f482610572565b73ffffffffffffffffffffffffffffffffffffffff1603610a4c57806040517f1c3812cc000000000000000000000000000000000000000000000000000000008152600401610a439190613d03565b60405180910390fd5b610a56815f61195d565b50565b5f610a857fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b6119fe565b905090565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610afa57336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610af19190613ddd565b60405180910390fd5b5f5a90505f610b098484611046565b90505f610b1582611a08565b9050610b2283828461158c565b5050505050565b50505050565b5f610b5e7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e5f1b835f1b610db2565b5f1c9050919050565b5f5f610b7283611a58565b91509150915091565b5f610b84611aa9565b905090565b5f5f5f5f5f5f610b9c8989895f5f611ab1565b809550819650829750839950849a505050505050610bb983611dee565b935093975093979195509350565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c3757336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610c2e9190613ddd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16610c5783610572565b73ffffffffffffffffffffffffffffffffffffffff1614610caf57816040517f5b4d6d6a000000000000000000000000000000000000000000000000000000008152600401610ca69190613d03565b60405180910390fd5b610cb9828261195d565b5050565b5f63bc197c8160e01b905098975050505050505050565b5f63f23a6e6160e01b90509695505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d5957336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610d509190613ddd565b60405180910390fd5b610d728383836bffffffffffffffffffffffff16611dff565b7febf265acfac1c01de588ed7ef49743b9c3ce8d6d1edeaf510a1f5453228515b1838383604051610da59392919061475a565b60405180910390a1505050565b5f5f8383604051602001610dc792919061478f565b604051602081830303815290604052805190602001209050805491505092915050565b610df381611e5d565b7f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca0381604051610e229190613ddd565b60405180910390a150565b5f5f5f84845f818110610e4357610e42614334565b5b9050013560f81c60f81b9050608060f81b608060f81b82167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f9c57610e8b86611a08565b91505f5f610e9884611a58565b91509150428111610ee25783816040517ff95b6ab7000000000000000000000000000000000000000000000000000000008152600401610ed99291906147b6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610f4a57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15610f90578333836040517f8945c313000000000000000000000000000000000000000000000000000000008152600401610f87939291906147dd565b60405180910390fd5b60019450505050611015565b5f5f5f610fac8989895f5f611ab1565b905080985081945082955083965050505050828210156110055782826040517ffd41fcba000000000000000000000000000000000000000000000000000000008152600401610ffc929190614812565b60405180910390fd5b61100e81611dee565b9550505050505b935093915050565b611025613392565b6003815f019060ff16908160ff1681525050818160e0018181525050919050565b61104e613392565b5f815f019060ff16908160ff16815250505f5f61106b8585611e63565b915060ff16915060018083160361108b575f8360600181815250506110c7565b6110a0818686611e799290919263ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff169150846060018193508281525050505b5f6007600184901c1690505f811115611104576110f682828888611eaa9190939291909392919063ffffffff16565b856080018194508281525050505b5f6010808516036111185760019050611170565b60208085160361114b57611137838888611ed79290919263ffffffff16565b8161ffff169150809450819250505061116f565b611160838888611ef69290919263ffffffff16565b8160ff16915080945081925050505b5b8067ffffffffffffffff81111561118a576111896135e3565b5b6040519080825280602002602001820160405280156111c357816020015b6111b06133dd565b8152602001906001900390816111a85790505b5085604001819052505f5f90505b818110156114dd575f6111ef858a8a611ef69290919263ffffffff16565b8096508192505050600180821660ff160361125e57308760400151838151811061121c5761121b614334565b5b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506112ca565b611273858a8a611f119290919263ffffffff16565b8860400151848151811061128a57611289614334565b5b60200260200101515f018197508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050505b600280821660ff1603611318576112ec858a8a611f429290919263ffffffff16565b8860400151848151811061130357611302614334565b5b60200260200101516020018197508281525050505b600480821660ff16036113e0575f61133b868b8b611f589290919263ffffffff16565b8162ffffff169150809750819250505089898790838961135b9190614301565b9261136893929190614841565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050886040015184815181106113c1576113c0614334565b5b60200260200101516040018190525080866113dc9190614301565b9550505b600880821660ff160361142e57611402858a8a611f429290919263ffffffff16565b8860400151848151811061141957611418614334565b5b60200260200101516060018197508281525050505b601080821660ff16148760400151838151811061144e5761144d614334565b5b60200260200101516080019015159081151581525050602080821660ff16148760400151838151811061148457611483614334565b5b602002602001015160a0019015159081151581525050600660c0821660ff16901c60ff16876040015183815181106114bf576114be614334565b5b602002602001015160c00181815250505080806001019150506111d1565b505050505092915050565b5f6114f283610b2f565b905081811461153c578282826040517f9b6514f40000000000000000000000000000000000000000000000000000000081526004016115339392919061487b565b60405180910390fd5b5f60018301905061154d8482611f78565b7f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881848260405161157e929190614812565b60405180910390a150505050565b5f5f90505f82604001515190505f5f90505b818110156118b4575f846040015182815181106115be576115bd614334565b5b602002602001015190508060a0015180156115d7575083155b1561161b577f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b868360405161160d9291906147b6565b60405180910390a1506118a7565b5f93505f816060015190505f81141580156116355750805a105b1561167b5785835a6040517f21395274000000000000000000000000000000000000000000000000000000008152600401611672939291906148b0565b60405180910390fd5b5f82608001511561173057611729835f01515f841461169a578361169c565b5a5b634c4e814c60e01b8b8d898b8e606001518b604001516040516024016116c796959493929190614924565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611fad565b9050611758565b611755835f015184602001515f8514611749578461174b565b5a5b8660400151611fc2565b90505b8061186a575f60ff168360c00151036117b957600195507f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d888561179a611fd9565b6040516117a99392919061498a565b60405180910390a15050506118a7565b600160ff168360c00151036118105786846117d2611fd9565b6040517f7f6b0bb1000000000000000000000000000000000000000000000000000000008152600401611807939291906149c6565b60405180910390fd5b600260ff168360c0015103611869577fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b888561184a611fd9565b6040516118599392919061498a565b60405180910390a15050506118b4565b5b7f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a888560405161189b9291906147b6565b60405180910390a15050505b808060010191505061159e565b505050505050565b5f5f1b81036118f7576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119237fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b82611ff7565b7f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa816040516119529190613c57565b60405180910390a150565b6119c17fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1205f1b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff165f1b611ffe565b7f0d7fc113eaf016db4681a1ba86d083ce3e0961f321062a75ac2b0aeb33deeed182826040516119f2929190614a09565b60405180910390a15050565b5f81549050919050565b5f5f611a18836020015130612033565b90505f611a24846120d7565b90508181604051602001611a39929190614aa4565b6040516020818303038152906040528051906020012092505050919050565b5f5f5f611a877fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e865f1b85610db2565b5f1c9050606081901c816bffffffffffffffffffffffff169250925050915091565b5f3054905090565b5f5f5f5f5f5f5f611ac28b8b611e63565b915060ff169150611ad161342e565b6040808416148015611b0e57505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16145b15611c4a57611b28828d8d611f119290919263ffffffff16565b809350819a50505089611c49575f611b4b838e8e611f589290919263ffffffff16565b8162ffffff16915080945081925050505f8d8d85908487611b6c9190614301565b92611b7993929190614841565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505090508a73ffffffffffffffffffffffffffffffffffffffff1663ccce3bc830836040518363ffffffff1660e01b8152600401611bf8929190614ada565b6040805180830381865afa158015611c12573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c369190614b7d565b92508184611c449190614301565b935050505b5b600180841603611c8357611c718d8a838f8f87908092611c6c93929190614841565b61230b565b97509750975097509750505050611de1565b6002808416148d60200190151590811515815250505f6002601c8516901c9050611cbf83828f8f611eaa9190939291909392919063ffffffff16565b8094508197505050505f6001600560208616901c611cdd9190614301565b9050611cfb83828f8f611eaa9190939291909392919063ffffffff16565b809450819a50505050611d0d8d611a08565b9350611d2b8d858e8e86908092611d2693929190614841565b61256d565b8097508198505050611d3f86895f1b6130e1565b9550611d4d86865f1b6130e1565b9550611d71868a73ffffffffffffffffffffffffffffffffffffffff165f1b6130e1565b95505f5f1b815f015114158015611d8b575085815f015114155b8015611d9b575080602001518511155b15611ddd57806040517fccbb534f000000000000000000000000000000000000000000000000000000008152600401611dd49190614bd5565b60405180910390fd5b5050505b9550955095509550959050565b5f611df8826130f5565b9050919050565b611e587fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e865f1b846bffffffffffffffffffffffff841660608673ffffffffffffffffffffffffffffffffffffffff16901b175f1b611ffe565b505050565b80305550565b5f5f83358060f81c925060019150509250929050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f858401356008840261010003600180866008021b0382821c1693508486019250505094509492505050565b5f5f8483013561ffff8160f01c16925060028401915050935093915050565b5f5f848301358060f81c925060018401915050935093915050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f848301359150602083019050935093915050565b5f5f8483013562ffffff8160e81c16925060038401915050935093915050565b611fa97f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e5f1b835f1b835f1b611ffe565b5050565b5f5f5f8351602085018787f490509392505050565b5f5f5f835160208501878988f19050949350505050565b60603d604051915060208201818101604052818352815f823e505090565b8082555050565b5f838360405160200161201292919061478f565b60405160208183030381529060405280519060200120905081815550505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de856120a257466120a4565b5f5b856040516020016120b9959493929190614bee565b60405160208183030381529060405280519060200120905092915050565b5f5f8261010001516040516020016120ef9190614ccb565b6040516020818303038152906040528051906020012090505f60ff16835f015160ff1603612187575f6121258460400151613138565b90507f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2818560600151866080015185604051602001612168959493929190614ce1565b6040516020818303038152906040528051906020012092505050612306565b600160ff16835f015160ff16036121f6577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360a0015180519060200120826040516020016121d893929190614d32565b60405160208183030381529060405280519060200120915050612306565b600260ff16835f015160ff160361225e577f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e48360c001518260405160200161224093929190614d32565b60405160208183030381529060405280519060200120915050612306565b600360ff16835f015160ff16036122c6577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360e00151826040516020016122a893929190614d32565b60405160208183030381529060405280519060200120915050612306565b825f01516040517f048183200000000000000000000000000000000000000000000000000000000081526004016122fd9190614d76565b60405180910390fd5b919050565b5f5f5f5f5f612318613392565b6002815f019060ff16908160ff16815250505f5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505b89899050821015612502575f5f612372848d8d611f589290919263ffffffff16565b8162ffffff1691508095508192505050838161238e9190614301565b9150505f8b8b905082146123a2575f6123a4565b8d5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303612404576123eb8f8d8d879086926123e393929190614841565b600185611ab1565b809a50819b50829c50839d50849e505050505050612434565b612422858d8d8790869261241a93929190614841565b600185611ab1565b50809a50819b50829c50839d50505050505b8989101561248f578b8b8590849261244e93929190614841565b8b8b6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016124869493929190614d8f565b60405180910390fd5b819350878d5f0151036124a8575f5f1b8d5f0181815250505b8287106124ee5786836040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004016124e5929190614812565b60405180910390fd5b878560c00181815250508692505050612350565b5f5f1b8b5f01511415801561251b57508a602001518511155b1561255d578a6040517fccbb534f0000000000000000000000000000000000000000000000000000000081526004016125549190614bd5565b60405180910390fd5b5050509550955095509550959050565b5f5f5f5b848490508110156130d7575f612592828787611ef69290919263ffffffff16565b8160ff16915080935081925050505f600460f08316901c90505f81036126ea575f600f831690505f8160ff16036125e1576125d8848989611ef69290919263ffffffff16565b80955081925050505b5f5f6125f8868b8b6131b29290919263ffffffff16565b8097508193505050612615868b8b6131b29290919263ffffffff16565b80975081925050505f60ff82901c5f1c90505f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835f1c165f1b90505f601b830190505f60018f8388866040515f815260200160405260405161267b9493929190614dcd565b6020604051602081039080840390855afa15801561269b573d5f5f3e3d5ffd5b5050506020604051035190508660ff168c019b505f6126bd828960ff166131c8565b90505f5f1b8c036126ce57806126d9565b6126d88c826130e1565b5b9b5050505050505050505050612571565b60018103612775575f600f831690505f8160ff160361272157612718848989611ef69290919263ffffffff16565b80955081925050505b5f612737858a8a611f119290919263ffffffff16565b80965081925050505f61274d828460ff166131c8565b90505f5f1b870361275e5780612769565b61276887826130e1565b5b96505050505050612571565b60028103612974575f6003831690505f8160ff16036127ac576127a3848989611ef69290919263ffffffff16565b80955081925050505b5f6127c2858a8a611f119290919263ffffffff16565b80965081925050505f6002600c861660ff16901c60ff1690505f6127f887838d8d611eaa9190939291909392919063ffffffff16565b80985081925050505f81880190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff16631626ba7e8f8f8f8d90879261285c93929190614841565b6040518463ffffffff1660e01b815260040161287a93929190614e10565b602060405180830381865afa158015612895573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128b99190614e54565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612930578c848d8d8b9085926128f193929190614841565b6040517fb2fed7ae0000000000000000000000000000000000000000000000000000000081526004016129279493929190614e7f565b60405180910390fd5b8097508460ff168a0199505f612949858760ff166131c8565b90505f5f1b8a0361295a5780612965565b6129648a826130e1565b5b99505050505050505050612571565b600381036129be575f6129928489896131b29290919263ffffffff16565b80955081925050505f5f1b85036129a957806129b4565b6129b385826130e1565b5b9450505050612571565b60048103612a3d575f600f831660ff1690505f6129ed85838b8b611eaa9190939291909392919063ffffffff16565b80965081925050505f81860190505f5f612a198e8e8e8e8c908892612a1493929190614841565b61256d565b91509150829750818a019950612a2f89826130e1565b985050505050505050612571565b60068103612b4d575f6002600c841660ff16901c60ff1690505f8103612a8157612a72848989611ef69290919263ffffffff16565b8160ff16915080955081925050505b5f6003841660ff1690505f8103612ab757612aa7858a8a611ed79290919263ffffffff16565b8161ffff16915080965081925050505b5f612acd868b8b611f589290919263ffffffff16565b8162ffffff16915080975081925050505f81870190505f5f612b018f8f8f8f8d908892612afc93929190614841565b61256d565b91509150829850848210612b1557858b019a505b5f612b218287896131fa565b90505f5f1b8b03612b325780612b3d565b612b3c8b826130e1565b5b9a50505050505050505050612571565b60058103612bcf575f612b6b8489896131b29290919263ffffffff16565b8095508192505050888103612b9e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505b5f612ba88261322f565b90505f5f1b8603612bb95780612bc4565b612bc386826130e1565b5b955050505050612571565b60078103612d35575f600f831690505f8160ff1603612c0657612bfd848989611ef69290919263ffffffff16565b80955081925050505b5f5f612c1d868b8b6131b29290919263ffffffff16565b8097508193505050612c3a868b8b6131b29290919263ffffffff16565b80975081925050505f60ff82901c5f1c90505f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835f1c165f1b90505f601b830190505f60018f604051602001612c919190614f07565b604051602081830303815290604052805190602001208388866040515f8152602001604052604051612cc69493929190614dcd565b6020604051602081039080840390855afa158015612ce6573d5f5f3e3d5ffd5b5050506020604051035190508660ff168c019b505f612d08828960ff166131c8565b90505f5f1b8c03612d195780612d24565b612d238c826130e1565b5b9b5050505050505050505050612571565b60088103612dce575f612d538489896131b29290919263ffffffff16565b80955081925050505f612d6f5f8c61325e90919063ffffffff16565b9050808203612d9c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505b5f612da6836132af565b90505f5f1b8703612db75780612dc2565b612dc187826130e1565b5b96505050505050612571565b60098103612f34575f6003831690505f8160ff1603612e0557612dfc848989611ef69290919263ffffffff16565b80955081925050505b5f612e1b858a8a611f119290919263ffffffff16565b80965081925050505f5f6002600c871660ff16901c60ff169050612e5187828d8d611eaa9190939291909392919063ffffffff16565b8098508193505050505f81870190505f8373ffffffffffffffffffffffffffffffffffffffff166313792a4a8f8e8e8c908792612e9093929190614841565b6040518463ffffffff1660e01b8152600401612eae93929190614f2c565b602060405180830381865afa158015612ec9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eed9190614f63565b90508197508460ff168a0199505f612f09858760ff16846132de565b90505f5f1b8a03612f1a5780612f25565b612f248a826130e1565b5b99505050505050505050612571565b600a810361309a575f6003831690505f8160ff1603612f6b57612f62848989611ef69290919263ffffffff16565b80955081925050505b5f612f81858a8a611f119290919263ffffffff16565b80965081925050505f6002600c861660ff16901c60ff1690505f612fb787838d8d611eaa9190939291909392919063ffffffff16565b80985081925050505f81880190505f8473ffffffffffffffffffffffffffffffffffffffff1663898bd9218f8f8f8d908792612ff593929190614841565b6040518463ffffffff1660e01b815260040161301393929190614e10565b602060405180830381865afa15801561302e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130529190614f63565b90508198508560ff168b019a505f61306e868860ff16846132de565b90505f5f1b8b0361307f578061308a565b6130898b826130e1565b5b9a50505050505050505050612571565b806040517fb2505f7c0000000000000000000000000000000000000000000000000000000081526004016130ce9190613f95565b60405180910390fd5b5094509492505050565b5f825f528160205260405f20905092915050565b5f5f5f1b8214158015613131575061312e7fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b6119fe565b82145b9050919050565b5f60605f5f90505b83518110156131a1575f61316d8583815181106131605761315f614334565b5b6020026020010151613313565b90508281604051602001613182929190614fbe565b6040516020818303038152906040529250508080600101915050613140565b508080519060200120915050919050565b5f5f848301359150602083019050935093915050565b5f82826040516020016131dc929190615094565b60405160208183030381529060405280519060200120905092915050565b5f83838360405160200161321093929190615114565b6040516020818303038152906040528051906020012090509392505050565b5f8160405160200161324191906151a5565b604051602081830303815290604052805190602001209050919050565b5f5f61326e846020015184612033565b90505f61327a856120d7565b9050818160405160200161328f929190614aa4565b604051602081830303815290604052805190602001209250505092915050565b5f816040516020016132c19190615214565b604051602081830303815290604052805190602001209050919050565b5f8383836040516020016132f493929190615283565b6040516020818303038152906040528051906020012090509392505050565b5f7f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437825f01518360200151846040015180519060200120856060015186608001518760a001518860c001516040516020016133759897969594939291906152ca565b604051602081830303815290604052805190602001209050919050565b6040518061012001604052805f60ff1681526020015f15158152602001606081526020015f81526020015f8152602001606081526020015f81526020015f8152602001606081525090565b6040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f8152602001606081526020015f81526020015f151581526020015f151581526020015f81525090565b60405180604001604052805f81526020015f81525090565b5f82905092915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b5f82821b905092915050565b5f6134928383613446565b8261349d8135613450565b925060048210156134dd576134d87fffffffff000000000000000000000000000000000000000000000000000000008360040360080261347b565b831692505b505092915050565b5f81905092915050565b828183375f83830152505050565b5f61350883856134e5565b93506135158385846134ef565b82840190509392505050565b5f61352d8284866134fd565b91508190509392505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6135738261354a565b9050919050565b61358381613569565b811461358d575f5ffd5b50565b5f8135905061359e8161357a565b92915050565b5f602082840312156135b9576135b8613542565b5b5f6135c684828501613590565b91505092915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613619826135d3565b810181811067ffffffffffffffff82111715613638576136376135e3565b5b80604052505050565b5f61364a613539565b90506136568282613610565b919050565b5f5ffd5b5f60ff82169050919050565b6136748161365f565b811461367e575f5ffd5b50565b5f8135905061368f8161366b565b92915050565b5f8115159050919050565b6136a981613695565b81146136b3575f5ffd5b50565b5f813590506136c4816136a0565b92915050565b5f5ffd5b5f67ffffffffffffffff8211156136e8576136e76135e3565b5b602082029050602081019050919050565b5f5ffd5b5f819050919050565b61370f816136fd565b8114613719575f5ffd5b50565b5f8135905061372a81613706565b92915050565b5f5ffd5b5f67ffffffffffffffff82111561374e5761374d6135e3565b5b613757826135d3565b9050602081019050919050565b5f61377661377184613734565b613641565b90508281526020810184848401111561379257613791613730565b5b61379d8482856134ef565b509392505050565b5f82601f8301126137b9576137b86136ca565b5b81356137c9848260208601613764565b91505092915050565b5f60e082840312156137e7576137e66135cf565b5b6137f160e0613641565b90505f61380084828501613590565b5f8301525060206138138482850161371c565b602083015250604082013567ffffffffffffffff8111156138375761383661365b565b5b613843848285016137a5565b60408301525060606138578482850161371c565b606083015250608061386b848285016136b6565b60808301525060a061387f848285016136b6565b60a08301525060c06138938482850161371c565b60c08301525092915050565b5f6138b16138ac846136ce565b613641565b905080838252602082019050602084028301858111156138d4576138d36136f9565b5b835b8181101561391b57803567ffffffffffffffff8111156138f9576138f86136ca565b5b80860161390689826137d2565b855260208501945050506020810190506138d6565b5050509392505050565b5f82601f830112613939576139386136ca565b5b813561394984826020860161389f565b91505092915050565b5f819050919050565b61396481613952565b811461396e575f5ffd5b50565b5f8135905061397f8161395b565b92915050565b5f67ffffffffffffffff82111561399f5761399e6135e3565b5b602082029050602081019050919050565b5f6139c26139bd84613985565b613641565b905080838252602082019050602084028301858111156139e5576139e46136f9565b5b835b81811015613a0e57806139fa8882613590565b8452602084019350506020810190506139e7565b5050509392505050565b5f82601f830112613a2c57613a2b6136ca565b5b8135613a3c8482602086016139b0565b91505092915050565b5f6101208284031215613a5b57613a5a6135cf565b5b613a66610120613641565b90505f613a7584828501613681565b5f830152506020613a88848285016136b6565b602083015250604082013567ffffffffffffffff811115613aac57613aab61365b565b5b613ab884828501613925565b6040830152506060613acc8482850161371c565b6060830152506080613ae08482850161371c565b60808301525060a082013567ffffffffffffffff811115613b0457613b0361365b565b5b613b10848285016137a5565b60a08301525060c0613b2484828501613971565b60c08301525060e0613b3884828501613971565b60e08301525061010082013567ffffffffffffffff811115613b5d57613b5c61365b565b5b613b6984828501613a18565b6101008301525092915050565b5f5ffd5b5f5f83601f840112613b8f57613b8e6136ca565b5b8235905067ffffffffffffffff811115613bac57613bab613b76565b5b602083019150836001820283011115613bc857613bc76136f9565b5b9250929050565b5f5f5f60408486031215613be657613be5613542565b5b5f84013567ffffffffffffffff811115613c0357613c02613546565b5b613c0f86828701613a45565b935050602084013567ffffffffffffffff811115613c3057613c2f613546565b5b613c3c86828701613b7a565b92509250509250925092565b613c5181613952565b82525050565b5f602082019050613c6a5f830184613c48565b92915050565b5f5f5f5f5f60808688031215613c8957613c88613542565b5b5f613c9688828901613590565b9550506020613ca788828901613590565b9450506040613cb88882890161371c565b935050606086013567ffffffffffffffff811115613cd957613cd8613546565b5b613ce588828901613b7a565b92509250509295509295909350565b613cfd81613450565b82525050565b5f602082019050613d165f830184613cf4565b92915050565b5f5f5f60408486031215613d3357613d32613542565b5b5f613d4086828701613971565b935050602084013567ffffffffffffffff811115613d6157613d60613546565b5b613d6d86828701613b7a565b92509250509250925092565b613d8281613450565b8114613d8c575f5ffd5b50565b5f81359050613d9d81613d79565b92915050565b5f60208284031215613db857613db7613542565b5b5f613dc584828501613d8f565b91505092915050565b613dd781613569565b82525050565b5f602082019050613df05f830184613dce565b92915050565b5f5f5f5f60408587031215613e0e57613e0d613542565b5b5f85013567ffffffffffffffff811115613e2b57613e2a613546565b5b613e3787828801613b7a565b9450945050602085013567ffffffffffffffff811115613e5a57613e59613546565b5b613e6687828801613b7a565b925092505092959194509250565b5f60208284031215613e8957613e88613542565b5b5f613e9684828501613971565b91505092915050565b5f5f60208385031215613eb557613eb4613542565b5b5f83013567ffffffffffffffff811115613ed257613ed1613546565b5b613ede85828601613b7a565b92509250509250929050565b5f5f5f5f60608587031215613f0257613f01613542565b5b5f613f0f87828801613590565b9450506020613f208782880161371c565b935050604085013567ffffffffffffffff811115613f4157613f40613546565b5b613f4d87828801613b7a565b925092505092959194509250565b5f60208284031215613f7057613f6f613542565b5b5f613f7d8482850161371c565b91505092915050565b613f8f816136fd565b82525050565b5f602082019050613fa85f830184613f86565b92915050565b5f604082019050613fc15f830185613dce565b613fce6020830184613f86565b9392505050565b613fde81613695565b82525050565b5f60c082019050613ff75f830189613f86565b6140046020830188613f86565b6140116040830187613fd5565b61401e6060830186613c48565b61402b6080830185613f86565b61403860a0830184613c48565b979650505050505050565b5f5f6040838503121561405957614058613542565b5b5f61406685828601613d8f565b925050602061407785828601613590565b9150509250929050565b5f5f83601f840112614096576140956136ca565b5b8235905067ffffffffffffffff8111156140b3576140b2613b76565b5b6020830191508360208202830111156140cf576140ce6136f9565b5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156140f2576140f1613542565b5b5f6140ff8b828c01613590565b98505060206141108b828c01613590565b975050604089013567ffffffffffffffff81111561413157614130613546565b5b61413d8b828c01614081565b9650965050606089013567ffffffffffffffff8111156141605761415f613546565b5b61416c8b828c01614081565b9450945050608089013567ffffffffffffffff81111561418f5761418e613546565b5b61419b8b828c01613b7a565b92509250509295985092959890939650565b5f5f5f5f5f5f60a087890312156141c7576141c6613542565b5b5f6141d489828a01613590565b96505060206141e589828a01613590565b95505060406141f689828a0161371c565b945050606061420789828a0161371c565b935050608087013567ffffffffffffffff81111561422857614227613546565b5b61423489828a01613b7a565b92509250509295509295509295565b5f6bffffffffffffffffffffffff82169050919050565b61426381614243565b811461426d575f5ffd5b50565b5f8135905061427e8161425a565b92915050565b5f5f5f6060848603121561429b5761429a613542565b5b5f6142a886828701613971565b93505060206142b986828701613590565b92505060406142ca86828701614270565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61430b826136fd565b9150614316836136fd565b925082820190508082111561432e5761432d6142d4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61436a8161365f565b82525050565b61437981613695565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6143b181613569565b82525050565b6143c0816136fd565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6143f8826143c6565b61440281856143d0565b93506144128185602086016143e0565b61441b816135d3565b840191505092915050565b5f60e083015f83015161443b5f8601826143a8565b50602083015161444e60208601826143b7565b506040830151848203604086015261446682826143ee565b915050606083015161447b60608601826143b7565b50608083015161448e6080860182614370565b5060a08301516144a160a0860182614370565b5060c08301516144b460c08601826143b7565b508091505092915050565b5f6144ca8383614426565b905092915050565b5f602082019050919050565b5f6144e88261437f565b6144f28185614389565b93508360208202850161450485614399565b805f5b8581101561453f578484038952815161452085826144bf565b945061452b836144d2565b925060208a01995050600181019050614507565b50829750879550505050505092915050565b61455a81613952565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f61459483836143a8565b60208301905092915050565b5f602082019050919050565b5f6145b682614560565b6145c0818561456a565b93506145cb8361457a565b805f5b838110156145fb5781516145e28882614589565b97506145ed836145a0565b9250506001810190506145ce565b5085935050505092915050565b5f61012083015f83015161461e5f860182614361565b5060208301516146316020860182614370565b506040830151848203604086015261464982826144de565b915050606083015161465e60608601826143b7565b50608083015161467160808601826143b7565b5060a083015184820360a086015261468982826143ee565b91505060c083015161469e60c0860182614551565b5060e08301516146b160e0860182614551565b506101008301518482036101008601526146cb82826145ac565b9150508091505092915050565b5f82825260208201905092915050565b5f6146f383856146d8565b93506147008385846134ef565b614709836135d3565b840190509392505050565b5f6040820190508181035f83015261472c8186614608565b905081810360208301526147418184866146e8565b9050949350505050565b61475481614243565b82525050565b5f60608201905061476d5f830186613c48565b61477a6020830185613dce565b614787604083018461474b565b949350505050565b5f6040820190506147a25f830185613c48565b6147af6020830184613c48565b9392505050565b5f6040820190506147c95f830185613c48565b6147d66020830184613f86565b9392505050565b5f6060820190506147f05f830186613c48565b6147fd6020830185613dce565b61480a6040830184613dce565b949350505050565b5f6040820190506148255f830185613f86565b6148326020830184613f86565b9392505050565b5f5ffd5b5f5ffd5b5f5f8585111561485457614853614839565b5b838611156148655761486461483d565b5b6001850283019150848603905094509492505050565b5f60608201905061488e5f830186613f86565b61489b6020830185613f86565b6148a86040830184613f86565b949350505050565b5f6060820190508181035f8301526148c88186614608565b90506148d76020830185613f86565b6148e46040830184613f86565b949350505050565b5f6148f6826143c6565b61490081856146d8565b93506149108185602086016143e0565b614919816135d3565b840191505092915050565b5f60c0820190506149375f830189613c48565b6149446020830188613f86565b6149516040830187613f86565b61495e6060830186613f86565b61496b6080830185613f86565b81810360a083015261497d81846148ec565b9050979650505050505050565b5f60608201905061499d5f830186613c48565b6149aa6020830185613f86565b81810360408301526149bc81846148ec565b9050949350505050565b5f6060820190508181035f8301526149de8186614608565b90506149ed6020830185613f86565b81810360408301526149ff81846148ec565b9050949350505050565b5f604082019050614a1c5f830185613cf4565b614a296020830184613dce565b9392505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f614a6e600283614a30565b9150614a7982614a3a565b600282019050919050565b5f819050919050565b614a9e614a9982613952565b614a84565b82525050565b5f614aae82614a62565b9150614aba8285614a8d565b602082019150614aca8284614a8d565b6020820191508190509392505050565b5f604082019050614aed5f830185613dce565b8181036020830152614aff81846148ec565b90509392505050565b5f81519050614b168161395b565b92915050565b5f81519050614b2a81613706565b92915050565b5f60408284031215614b4557614b446135cf565b5b614b4f6040613641565b90505f614b5e84828501614b08565b5f830152506020614b7184828501614b1c565b60208301525092915050565b5f60408284031215614b9257614b91613542565b5b5f614b9f84828501614b30565b91505092915050565b604082015f820151614bbc5f850182614551565b506020820151614bcf60208501826143b7565b50505050565b5f604082019050614be85f830184614ba8565b92915050565b5f60a082019050614c015f830188613c48565b614c0e6020830187613c48565b614c1b6040830186613c48565b614c286060830185613f86565b614c356080830184613dce565b9695505050505050565b5f81905092915050565b614c5281613569565b82525050565b5f614c638383614c49565b60208301905092915050565b5f614c7982614560565b614c838185614c3f565b9350614c8e8361457a565b805f5b83811015614cbe578151614ca58882614c58565b9750614cb0836145a0565b925050600181019050614c91565b5085935050505092915050565b5f614cd68284614c6f565b915081905092915050565b5f60a082019050614cf45f830188613c48565b614d016020830187613c48565b614d0e6040830186613f86565b614d1b6060830185613f86565b614d286080830184613c48565b9695505050505050565b5f606082019050614d455f830186613c48565b614d526020830185613c48565b614d5f6040830184613c48565b949350505050565b614d708161365f565b82525050565b5f602082019050614d895f830184614d67565b92915050565b5f6060820190508181035f830152614da88186886146e8565b9050614db76020830185613f86565b614dc46040830184613f86565b95945050505050565b5f608082019050614de05f830187613c48565b614ded6020830186614d67565b614dfa6040830185613c48565b614e076060830184613c48565b95945050505050565b5f604082019050614e235f830186613c48565b8181036020830152614e368184866146e8565b9050949350505050565b5f81519050614e4e81613d79565b92915050565b5f60208284031215614e6957614e68613542565b5b5f614e7684828501614e40565b91505092915050565b5f606082019050614e925f830187613c48565b614e9f6020830186613dce565b8181036040830152614eb28184866146e8565b905095945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f82015250565b5f614ef1601c83614a30565b9150614efc82614ebd565b601c82019050919050565b5f614f1182614ee5565b9150614f1d8284614a8d565b60208201915081905092915050565b5f6040820190508181035f830152614f448186614608565b90508181036020830152614f598184866146e8565b9050949350505050565b5f60208284031215614f7857614f77613542565b5b5f614f8584828501614b08565b91505092915050565b5f614f98826143c6565b614fa281856134e5565b9350614fb28185602086016143e0565b80840191505092915050565b5f614fc98285614f8e565b9150614fd58284614a8d565b6020820191508190509392505050565b7f53657175656e6365207369676e65723a0a0000000000000000000000000000005f82015250565b5f615019601183614a30565b915061502482614fe5565b601182019050919050565b5f8160601b9050919050565b5f6150458261502f565b9050919050565b5f6150568261503b565b9050919050565b61506e61506982613569565b61504c565b82525050565b5f819050919050565b61508e615089826136fd565b615074565b82525050565b5f61509e8261500d565b91506150aa828561505d565b6014820191506150ba828461507d565b6020820191508190509392505050565b7f53657175656e6365206e657374656420636f6e6669673a0a00000000000000005f82015250565b5f6150fe601883614a30565b9150615109826150ca565b601882019050919050565b5f61511e826150f2565b915061512a8286614a8d565b60208201915061513a828561507d565b60208201915061514a828461507d565b602082019150819050949350505050565b7f53657175656e636520737461746963206469676573743a0a00000000000000005f82015250565b5f61518f601883614a30565b915061519a8261515b565b601882019050919050565b5f6151af82615183565b91506151bb8284614a8d565b60208201915081905092915050565b7f53657175656e636520616e792061646472657373207375626469676573743a0a5f82015250565b5f6151fe602083614a30565b9150615209826151ca565b602082019050919050565b5f61521e826151f2565b915061522a8284614a8d565b60208201915081905092915050565b7f53657175656e63652073617069656e7420636f6e6669673a0a000000000000005f82015250565b5f61526d601983614a30565b915061527882615239565b601982019050919050565b5f61528d82615261565b9150615299828661505d565b6014820191506152a9828561507d565b6020820191506152b98284614a8d565b602082019150819050949350505050565b5f610100820190506152de5f83018b613c48565b6152eb602083018a613dce565b6152f86040830189613f86565b6153056060830188613c48565b6153126080830187613f86565b61531f60a0830186613fd5565b61532c60c0830185613fd5565b61533960e0830184613f86565b999850505050505050505056fea264697066735822122019b5533fc4cbee24a73438e1a10df64732fe25b8872932ba010c1d5c7babb5eb64736f6c634300081c0033603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3", + "deployedBytecode": "0x60806040526004361061012d575f3560e01c80636ea44577116100aa578063aaf10f421161006e578063aaf10f42146104b5578063ad55366b146104df578063b93ea7ad14610520578063bc197c811461053c578063f23a6e6114610578578063f727ef1c146105b457610134565b80636ea44577146103ce5780638943ec02146103ea5780638c3f55631461041257806392dcb3fc1461044e5780639f69ef541461048b57610134565b80631f6a1eb9116100f15780631f6a1eb91461031a578063257671f51461033657806329561426146103605780632dd31000146103885780634fcf3eca146103b257610134565b8063025b22bc1461020e57806313792a4a1461022a578063150b7a02146102665780631626ba7e146102a25780631a9b2337146102de57610134565b3661013457005b60045f3690501061020c575f6101555f369061015091906135ab565b6105dc565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461020a575f5f8273ffffffffffffffffffffffffffffffffffffffff165f366040516101b3929190613645565b5f60405180830381855af49150503d805f81146101eb576040519150601f19603f3d011682016040523d82523d5f602084013e6101f0565b606091505b50915091508161020257805160208201fd5b805160208201f35b505b005b610228600480360381019061022391906136c8565b610631565b005b348015610235575f5ffd5b50610250600480360381019061024b9190613cf3565b6106ad565b60405161025d9190613d7b565b60405180910390f35b348015610271575f5ffd5b5061028c60048036038101906102879190613d94565b61085c565b6040516102999190613e27565b60405180910390f35b3480156102ad575f5ffd5b506102c860048036038101906102c39190613e40565b610870565b6040516102d59190613e27565b60405180910390f35b3480156102e9575f5ffd5b5061030460048036038101906102ff9190613ec7565b6108b2565b6040516103119190613f01565b60405180910390f35b610334600480360381019061032f9190613f1a565b6108c3565b005b348015610341575f5ffd5b5061034a610952565b6040516103579190613d7b565b60405180910390f35b34801561036b575f5ffd5b5061038660048036038101906103819190613f98565b610976565b005b348015610393575f5ffd5b5061039c6109f2565b6040516103a99190613f01565b60405180910390f35b6103cc60048036038101906103c79190613ec7565b610a16565b005b6103e860048036038101906103e39190613fc3565b610b0b565b005b3480156103f5575f5ffd5b50610410600480360381019061040b919061400e565b610baa565b005b34801561041d575f5ffd5b506104386004803603810190610433919061407f565b610bb0565b60405161044591906140b9565b60405180910390f35b348015610459575f5ffd5b50610474600480360381019061046f9190613f98565b610be8565b6040516104829291906140d2565b60405180910390f35b348015610496575f5ffd5b5061049f610bfc565b6040516104ac9190613f01565b60405180910390f35b3480156104c0575f5ffd5b506104c9610c20565b6040516104d69190613f01565b60405180910390f35b3480156104ea575f5ffd5b5061050560048036038101906105009190613cf3565b610c2e565b60405161051796959493929190614108565b60405180910390f35b61053a60048036038101906105359190614167565b610c6c565b005b348015610547575f5ffd5b50610562600480360381019061055d91906141fa565b610d62565b60405161056f9190613e27565b60405180910390f35b348015610583575f5ffd5b5061059e600480360381019061059991906142d1565b610d79565b6040516105ab9190613e27565b60405180910390f35b3480156105bf575f5ffd5b506105da60048036038101906105d591906143a8565b610d8e565b005b5f6106287fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1205f1b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916610e57565b5f1c9050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106a157336040517fa19dbf000000000000000000000000000000000000000000000000000000000081526004016106989190613f01565b60405180910390fd5b6106aa81610e8f565b50565b5f5f6001856101000151516106c29190614425565b67ffffffffffffffff8111156106db576106da613707565b5b6040519080825280602002602001820160405280156107095781602001602082028036833780820191505090505b5090505f5f90505b8561010001515181101561079957856101000151818151811061073757610736614458565b5b602002602001015182828151811061075257610751614458565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610711565b50338186610100015151815181106107b4576107b3614458565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808561010001819052505f610804868686610ed2565b5090508061084d578585856040517ff58cc8b500000000000000000000000000000000000000000000000000000000815260040161084493929190614838565b60405180910390fd5b60015f1b925050509392505050565b5f63150b7a0260e01b905095945050505050565b5f5f61087b856110c2565b90505f610889828686610ed2565b5090508061089e575f60e01b925050506108ab565b6320c13b0b60e01b925050505b9392505050565b5f6108bc826105dc565b9050919050565b5f5a90505f6108d286866110eb565b90506108e68160600151826080015161158d565b5f5f6108f3838787610ed2565b915091508161093d578286866040517fa2b6d61b00000000000000000000000000000000000000000000000000000000815260040161093493929190614838565b60405180910390fd5b610948848285611631565b5050505050505050565b7f3d775581bb67d50f55369a85e3b4f558c1ee99b96fe0799dbfbdd62ec77d625f81565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109e657336040517fa19dbf000000000000000000000000000000000000000000000000000000000081526004016109dd9190613f01565b60405180910390fd5b6109ef81611961565b50565b7f000000000000000000000000bd0f8abd58b4449b39c57ac9d5c67433239ac44781565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a8657336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610a7d9190613f01565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16610aa6826105dc565b73ffffffffffffffffffffffffffffffffffffffff1603610afe57806040517f1c3812cc000000000000000000000000000000000000000000000000000000008152600401610af59190613e27565b60405180910390fd5b610b08815f611a2b565b50565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7b57336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610b729190613f01565b60405180910390fd5b5f5a90505f610b8a84846110eb565b90505f610b9682611acc565b9050610ba3838284611631565b5050505050565b50505050565b5f610bdf7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e5f1b835f1b610e57565b5f1c9050919050565b5f5f610bf383611b1c565b91509150915091565b7f000000000000000000000000a29874c88b8fd557e42219b04b0cec693e1712f581565b5f610c29611b6d565b905090565b5f5f5f5f5f5f610c418989895f5f611b75565b809550819650829750839950849a505050505050610c5e83611eb2565b935093975093979195509350565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cdc57336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610cd39190613f01565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16610cfc836105dc565b73ffffffffffffffffffffffffffffffffffffffff1614610d5457816040517f5b4d6d6a000000000000000000000000000000000000000000000000000000008152600401610d4b9190613e27565b60405180910390fd5b610d5e8282611a2b565b5050565b5f63bc197c8160e01b905098975050505050505050565b5f63f23a6e6160e01b90509695505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dfe57336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610df59190613f01565b60405180910390fd5b610e178383836bffffffffffffffffffffffff16611ec3565b7febf265acfac1c01de588ed7ef49743b9c3ce8d6d1edeaf510a1f5453228515b1838383604051610e4a9392919061487e565b60405180910390a1505050565b5f5f8383604051602001610e6c9291906148b3565b604051602081830303815290604052805190602001209050805491505092915050565b610e9881611f21565b7f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca0381604051610ec79190613f01565b60405180910390a150565b5f5f5f84845f818110610ee857610ee7614458565b5b9050013560f81c60f81b9050608060f81b608060f81b82167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361104157610f3086611acc565b91505f5f610f3d84611b1c565b91509150428111610f875783816040517ff95b6ab7000000000000000000000000000000000000000000000000000000008152600401610f7e9291906148da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610fef57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611035578333836040517f8945c31300000000000000000000000000000000000000000000000000000000815260040161102c93929190614901565b60405180910390fd5b600194505050506110ba565b5f5f5f6110518989895f5f611b75565b905080985081945082955083965050505050828210156110aa5782826040517ffd41fcba0000000000000000000000000000000000000000000000000000000081526004016110a1929190614936565b60405180910390fd5b6110b381611eb2565b9550505050505b935093915050565b6110ca6134b6565b6003815f019060ff16908160ff1681525050818160e0018181525050919050565b6110f36134b6565b5f815f019060ff16908160ff16815250505f5f6111108585611f27565b915060ff169150600180831603611130575f83606001818152505061116c565b611145818686611f3d9290919263ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff169150846060018193508281525050505b5f6007600184901c1690505f8111156111a95761119b82828888611f6e9190939291909392919063ffffffff16565b856080018194508281525050505b5f6010808516036111bd5760019050611215565b6020808516036111f0576111dc838888611f9b9290919263ffffffff16565b8161ffff1691508094508192505050611214565b611205838888611fba9290919263ffffffff16565b8160ff16915080945081925050505b5b8067ffffffffffffffff81111561122f5761122e613707565b5b60405190808252806020026020018201604052801561126857816020015b611255613501565b81526020019060019003908161124d5790505b5085604001819052505f5f90505b81811015611582575f611294858a8a611fba9290919263ffffffff16565b8096508192505050600180821660ff16036113035730876040015183815181106112c1576112c0614458565b5b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061136f565b611318858a8a611fd59290919263ffffffff16565b8860400151848151811061132f5761132e614458565b5b60200260200101515f018197508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050505b600280821660ff16036113bd57611391858a8a6120069290919263ffffffff16565b886040015184815181106113a8576113a7614458565b5b60200260200101516020018197508281525050505b600480821660ff1603611485575f6113e0868b8b61201c9290919263ffffffff16565b8162ffffff16915080975081925050508989879083896114009190614425565b9261140d93929190614965565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508860400151848151811061146657611465614458565b5b60200260200101516040018190525080866114819190614425565b9550505b600880821660ff16036114d3576114a7858a8a6120069290919263ffffffff16565b886040015184815181106114be576114bd614458565b5b60200260200101516060018197508281525050505b601080821660ff1614876040015183815181106114f3576114f2614458565b5b60200260200101516080019015159081151581525050602080821660ff16148760400151838151811061152957611528614458565b5b602002602001015160a0019015159081151581525050600660c0821660ff16901c60ff168760400151838151811061156457611563614458565b5b602002602001015160c0018181525050508080600101915050611276565b505050505092915050565b5f61159783610bb0565b90508181146115e1578282826040517f9b6514f40000000000000000000000000000000000000000000000000000000081526004016115d89392919061499f565b60405180910390fd5b5f6001830190506115f2848261203c565b7f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f8818482604051611623929190614936565b60405180910390a150505050565b5f5f90505f82604001515190505f5f90505b81811015611959575f8460400151828151811061166357611662614458565b5b602002602001015190508060a00151801561167c575083155b156116c0577f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b86836040516116b29291906148da565b60405180910390a15061194c565b5f93505f816060015190505f81141580156116da5750805a105b156117205785835a6040517f21395274000000000000000000000000000000000000000000000000000000008152600401611717939291906149d4565b60405180910390fd5b5f8260800151156117d5576117ce835f01515f841461173f5783611741565b5a5b634c4e814c60e01b8b8d898b8e606001518b6040015160405160240161176c96959493929190614a48565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612071565b90506117fd565b6117fa835f015184602001515f85146117ee57846117f0565b5a5b8660400151612086565b90505b8061190f575f60ff168360c001510361185e57600195507f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d888561183f61209d565b60405161184e93929190614aae565b60405180910390a150505061194c565b600160ff168360c00151036118b557868461187761209d565b6040517f7f6b0bb10000000000000000000000000000000000000000000000000000000081526004016118ac93929190614aea565b60405180910390fd5b600260ff168360c001510361190e577fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b88856118ef61209d565b6040516118fe93929190614aae565b60405180910390a1505050611959565b5b7f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a88856040516119409291906148da565b60405180910390a15050505b8080600101915050611643565b505050505050565b5f5f1b810361199c576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119c87fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b826120bb565b7f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa816040516119f79190613d7b565b60405180910390a1611a287f000000000000000000000000a29874c88b8fd557e42219b04b0cec693e1712f5610e8f565b50565b611a8f7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1205f1b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff165f1b6120c2565b7f0d7fc113eaf016db4681a1ba86d083ce3e0961f321062a75ac2b0aeb33deeed18282604051611ac0929190614b2d565b60405180910390a15050565b5f5f611adc8360200151306120f7565b90505f611ae88461219b565b90508181604051602001611afd929190614bc8565b6040516020818303038152906040528051906020012092505050919050565b5f5f5f611b4b7fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e865f1b85610e57565b5f1c9050606081901c816bffffffffffffffffffffffff169250925050915091565b5f3054905090565b5f5f5f5f5f5f5f611b868b8b611f27565b915060ff169150611b95613552565b6040808416148015611bd257505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16145b15611d0e57611bec828d8d611fd59290919263ffffffff16565b809350819a50505089611d0d575f611c0f838e8e61201c9290919263ffffffff16565b8162ffffff16915080945081925050505f8d8d85908487611c309190614425565b92611c3d93929190614965565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505090508a73ffffffffffffffffffffffffffffffffffffffff1663ccce3bc830836040518363ffffffff1660e01b8152600401611cbc929190614bfe565b6040805180830381865afa158015611cd6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cfa9190614ca1565b92508184611d089190614425565b935050505b5b600180841603611d4757611d358d8a838f8f87908092611d3093929190614965565b6123cf565b97509750975097509750505050611ea5565b6002808416148d60200190151590811515815250505f6002601c8516901c9050611d8383828f8f611f6e9190939291909392919063ffffffff16565b8094508197505050505f6001600560208616901c611da19190614425565b9050611dbf83828f8f611f6e9190939291909392919063ffffffff16565b809450819a50505050611dd18d611acc565b9350611def8d858e8e86908092611dea93929190614965565b612631565b8097508198505050611e0386895f1b6131a5565b9550611e1186865f1b6131a5565b9550611e35868a73ffffffffffffffffffffffffffffffffffffffff165f1b6131a5565b95505f5f1b815f015114158015611e4f575085815f015114155b8015611e5f575080602001518511155b15611ea157806040517fccbb534f000000000000000000000000000000000000000000000000000000008152600401611e989190614cf9565b60405180910390fd5b5050505b9550955095509550959050565b5f611ebc826131b9565b9050919050565b611f1c7fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e865f1b846bffffffffffffffffffffffff841660608673ffffffffffffffffffffffffffffffffffffffff16901b175f1b6120c2565b505050565b80305550565b5f5f83358060f81c925060019150509250929050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f858401356008840261010003600180866008021b0382821c1693508486019250505094509492505050565b5f5f8483013561ffff8160f01c16925060028401915050935093915050565b5f5f848301358060f81c925060018401915050935093915050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f848301359150602083019050935093915050565b5f5f8483013562ffffff8160e81c16925060038401915050935093915050565b61206d7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e5f1b835f1b835f1b6120c2565b5050565b5f5f5f8351602085018787f490509392505050565b5f5f5f835160208501878988f19050949350505050565b60603d604051915060208201818101604052818352815f823e505090565b8082555050565b5f83836040516020016120d69291906148b3565b60405160208183030381529060405280519060200120905081815550505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de856121665746612168565b5f5b8560405160200161217d959493929190614d12565b60405160208183030381529060405280519060200120905092915050565b5f5f8261010001516040516020016121b39190614def565b6040516020818303038152906040528051906020012090505f60ff16835f015160ff160361224b575f6121e9846040015161325c565b90507f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a281856060015186608001518560405160200161222c959493929190614e05565b60405160208183030381529060405280519060200120925050506123ca565b600160ff16835f015160ff16036122ba577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360a00151805190602001208260405160200161229c93929190614e56565b604051602081830303815290604052805190602001209150506123ca565b600260ff16835f015160ff1603612322577f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e48360c001518260405160200161230493929190614e56565b604051602081830303815290604052805190602001209150506123ca565b600360ff16835f015160ff160361238a577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360e001518260405160200161236c93929190614e56565b604051602081830303815290604052805190602001209150506123ca565b825f01516040517f048183200000000000000000000000000000000000000000000000000000000081526004016123c19190614e9a565b60405180910390fd5b919050565b5f5f5f5f5f6123dc6134b6565b6002815f019060ff16908160ff16815250505f5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505b898990508210156125c6575f5f612436848d8d61201c9290919263ffffffff16565b8162ffffff169150809550819250505083816124529190614425565b9150505f8b8b90508214612466575f612468565b8d5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036124c8576124af8f8d8d879086926124a793929190614965565b600185611b75565b809a50819b50829c50839d50849e5050505050506124f8565b6124e6858d8d879086926124de93929190614965565b600185611b75565b50809a50819b50829c50839d50505050505b89891015612553578b8b8590849261251293929190614965565b8b8b6040517fb006aba000000000000000000000000000000000000000000000000000000000815260040161254a9493929190614eb3565b60405180910390fd5b819350878d5f01510361256c575f5f1b8d5f0181815250505b8287106125b25786836040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004016125a9929190614936565b60405180910390fd5b878560c00181815250508692505050612414565b5f5f1b8b5f0151141580156125df57508a602001518511155b15612621578a6040517fccbb534f0000000000000000000000000000000000000000000000000000000081526004016126189190614cf9565b60405180910390fd5b5050509550955095509550959050565b5f5f5f5b8484905081101561319b575f612656828787611fba9290919263ffffffff16565b8160ff16915080935081925050505f600460f08316901c90505f81036127ae575f600f831690505f8160ff16036126a55761269c848989611fba9290919263ffffffff16565b80955081925050505b5f5f6126bc868b8b6132d69290919263ffffffff16565b80975081935050506126d9868b8b6132d69290919263ffffffff16565b80975081925050505f60ff82901c5f1c90505f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835f1c165f1b90505f601b830190505f60018f8388866040515f815260200160405260405161273f9493929190614ef1565b6020604051602081039080840390855afa15801561275f573d5f5f3e3d5ffd5b5050506020604051035190508660ff168c019b505f612781828960ff166132ec565b90505f5f1b8c03612792578061279d565b61279c8c826131a5565b5b9b5050505050505050505050612635565b60018103612839575f600f831690505f8160ff16036127e5576127dc848989611fba9290919263ffffffff16565b80955081925050505b5f6127fb858a8a611fd59290919263ffffffff16565b80965081925050505f612811828460ff166132ec565b90505f5f1b8703612822578061282d565b61282c87826131a5565b5b96505050505050612635565b60028103612a38575f6003831690505f8160ff160361287057612867848989611fba9290919263ffffffff16565b80955081925050505b5f612886858a8a611fd59290919263ffffffff16565b80965081925050505f6002600c861660ff16901c60ff1690505f6128bc87838d8d611f6e9190939291909392919063ffffffff16565b80985081925050505f81880190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff16631626ba7e8f8f8f8d90879261292093929190614965565b6040518463ffffffff1660e01b815260040161293e93929190614f34565b602060405180830381865afa158015612959573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297d9190614f78565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146129f4578c848d8d8b9085926129b593929190614965565b6040517fb2fed7ae0000000000000000000000000000000000000000000000000000000081526004016129eb9493929190614fa3565b60405180910390fd5b8097508460ff168a0199505f612a0d858760ff166132ec565b90505f5f1b8a03612a1e5780612a29565b612a288a826131a5565b5b99505050505050505050612635565b60038103612a82575f612a568489896132d69290919263ffffffff16565b80955081925050505f5f1b8503612a6d5780612a78565b612a7785826131a5565b5b9450505050612635565b60048103612b01575f600f831660ff1690505f612ab185838b8b611f6e9190939291909392919063ffffffff16565b80965081925050505f81860190505f5f612add8e8e8e8e8c908892612ad893929190614965565b612631565b91509150829750818a019950612af389826131a5565b985050505050505050612635565b60068103612c11575f6002600c841660ff16901c60ff1690505f8103612b4557612b36848989611fba9290919263ffffffff16565b8160ff16915080955081925050505b5f6003841660ff1690505f8103612b7b57612b6b858a8a611f9b9290919263ffffffff16565b8161ffff16915080965081925050505b5f612b91868b8b61201c9290919263ffffffff16565b8162ffffff16915080975081925050505f81870190505f5f612bc58f8f8f8f8d908892612bc093929190614965565b612631565b91509150829850848210612bd957858b019a505b5f612be582878961331e565b90505f5f1b8b03612bf65780612c01565b612c008b826131a5565b5b9a50505050505050505050612635565b60058103612c93575f612c2f8489896132d69290919263ffffffff16565b8095508192505050888103612c62577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505b5f612c6c82613353565b90505f5f1b8603612c7d5780612c88565b612c8786826131a5565b5b955050505050612635565b60078103612df9575f600f831690505f8160ff1603612cca57612cc1848989611fba9290919263ffffffff16565b80955081925050505b5f5f612ce1868b8b6132d69290919263ffffffff16565b8097508193505050612cfe868b8b6132d69290919263ffffffff16565b80975081925050505f60ff82901c5f1c90505f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835f1c165f1b90505f601b830190505f60018f604051602001612d55919061502b565b604051602081830303815290604052805190602001208388866040515f8152602001604052604051612d8a9493929190614ef1565b6020604051602081039080840390855afa158015612daa573d5f5f3e3d5ffd5b5050506020604051035190508660ff168c019b505f612dcc828960ff166132ec565b90505f5f1b8c03612ddd5780612de8565b612de78c826131a5565b5b9b5050505050505050505050612635565b60088103612e92575f612e178489896132d69290919263ffffffff16565b80955081925050505f612e335f8c61338290919063ffffffff16565b9050808203612e60577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505b5f612e6a836133d3565b90505f5f1b8703612e7b5780612e86565b612e8587826131a5565b5b96505050505050612635565b60098103612ff8575f6003831690505f8160ff1603612ec957612ec0848989611fba9290919263ffffffff16565b80955081925050505b5f612edf858a8a611fd59290919263ffffffff16565b80965081925050505f5f6002600c871660ff16901c60ff169050612f1587828d8d611f6e9190939291909392919063ffffffff16565b8098508193505050505f81870190505f8373ffffffffffffffffffffffffffffffffffffffff166313792a4a8f8e8e8c908792612f5493929190614965565b6040518463ffffffff1660e01b8152600401612f7293929190615050565b602060405180830381865afa158015612f8d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fb19190615087565b90508197508460ff168a0199505f612fcd858760ff1684613402565b90505f5f1b8a03612fde5780612fe9565b612fe88a826131a5565b5b99505050505050505050612635565b600a810361315e575f6003831690505f8160ff160361302f57613026848989611fba9290919263ffffffff16565b80955081925050505b5f613045858a8a611fd59290919263ffffffff16565b80965081925050505f6002600c861660ff16901c60ff1690505f61307b87838d8d611f6e9190939291909392919063ffffffff16565b80985081925050505f81880190505f8473ffffffffffffffffffffffffffffffffffffffff1663898bd9218f8f8f8d9087926130b993929190614965565b6040518463ffffffff1660e01b81526004016130d793929190614f34565b602060405180830381865afa1580156130f2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131169190615087565b90508198508560ff168b019a505f613132868860ff1684613402565b90505f5f1b8b03613143578061314e565b61314d8b826131a5565b5b9a50505050505050505050612635565b806040517fb2505f7c00000000000000000000000000000000000000000000000000000000815260040161319291906140b9565b60405180910390fd5b5094509492505050565b5f825f528160205260405f20905092915050565b5f3073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000bd0f8abd58b4449b39c57ac9d5c67433239ac447837f3d775581bb67d50f55369a85e3b4f558c1ee99b96fe0799dbfbdd62ec77d625f60405160200161322693929190615141565b604051602081830303815290604052805190602001205f1c73ffffffffffffffffffffffffffffffffffffffff16149050919050565b5f60605f5f90505b83518110156132c5575f61329185838151811061328457613283614458565b5b6020026020010151613437565b905082816040516020016132a69291906151b8565b6040516020818303038152906040529250508080600101915050613264565b508080519060200120915050919050565b5f5f848301359150602083019050935093915050565b5f8282604051602001613300929190615249565b60405160208183030381529060405280519060200120905092915050565b5f838383604051602001613334939291906152c9565b6040516020818303038152906040528051906020012090509392505050565b5f81604051602001613365919061535a565b604051602081830303815290604052805190602001209050919050565b5f5f6133928460200151846120f7565b90505f61339e8561219b565b905081816040516020016133b3929190614bc8565b604051602081830303815290604052805190602001209250505092915050565b5f816040516020016133e591906153c9565b604051602081830303815290604052805190602001209050919050565b5f83838360405160200161341893929190615438565b6040516020818303038152906040528051906020012090509392505050565b5f7f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437825f01518360200151846040015180519060200120856060015186608001518760a001518860c0015160405160200161349998979695949392919061547f565b604051602081830303815290604052805190602001209050919050565b6040518061012001604052805f60ff1681526020015f15158152602001606081526020015f81526020015f8152602001606081526020015f81526020015f8152602001606081525090565b6040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f8152602001606081526020015f81526020015f151581526020015f151581526020015f81525090565b60405180604001604052805f81526020015f81525090565b5f82905092915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b5f82821b905092915050565b5f6135b6838361356a565b826135c18135613574565b92506004821015613601576135fc7fffffffff000000000000000000000000000000000000000000000000000000008360040360080261359f565b831692505b505092915050565b5f81905092915050565b828183375f83830152505050565b5f61362c8385613609565b9350613639838584613613565b82840190509392505050565b5f613651828486613621565b91508190509392505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6136978261366e565b9050919050565b6136a78161368d565b81146136b1575f5ffd5b50565b5f813590506136c28161369e565b92915050565b5f602082840312156136dd576136dc613666565b5b5f6136ea848285016136b4565b91505092915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61373d826136f7565b810181811067ffffffffffffffff8211171561375c5761375b613707565b5b80604052505050565b5f61376e61365d565b905061377a8282613734565b919050565b5f5ffd5b5f60ff82169050919050565b61379881613783565b81146137a2575f5ffd5b50565b5f813590506137b38161378f565b92915050565b5f8115159050919050565b6137cd816137b9565b81146137d7575f5ffd5b50565b5f813590506137e8816137c4565b92915050565b5f5ffd5b5f67ffffffffffffffff82111561380c5761380b613707565b5b602082029050602081019050919050565b5f5ffd5b5f819050919050565b61383381613821565b811461383d575f5ffd5b50565b5f8135905061384e8161382a565b92915050565b5f5ffd5b5f67ffffffffffffffff82111561387257613871613707565b5b61387b826136f7565b9050602081019050919050565b5f61389a61389584613858565b613765565b9050828152602081018484840111156138b6576138b5613854565b5b6138c1848285613613565b509392505050565b5f82601f8301126138dd576138dc6137ee565b5b81356138ed848260208601613888565b91505092915050565b5f60e0828403121561390b5761390a6136f3565b5b61391560e0613765565b90505f613924848285016136b4565b5f83015250602061393784828501613840565b602083015250604082013567ffffffffffffffff81111561395b5761395a61377f565b5b613967848285016138c9565b604083015250606061397b84828501613840565b606083015250608061398f848285016137da565b60808301525060a06139a3848285016137da565b60a08301525060c06139b784828501613840565b60c08301525092915050565b5f6139d56139d0846137f2565b613765565b905080838252602082019050602084028301858111156139f8576139f761381d565b5b835b81811015613a3f57803567ffffffffffffffff811115613a1d57613a1c6137ee565b5b808601613a2a89826138f6565b855260208501945050506020810190506139fa565b5050509392505050565b5f82601f830112613a5d57613a5c6137ee565b5b8135613a6d8482602086016139c3565b91505092915050565b5f819050919050565b613a8881613a76565b8114613a92575f5ffd5b50565b5f81359050613aa381613a7f565b92915050565b5f67ffffffffffffffff821115613ac357613ac2613707565b5b602082029050602081019050919050565b5f613ae6613ae184613aa9565b613765565b90508083825260208201905060208402830185811115613b0957613b0861381d565b5b835b81811015613b325780613b1e88826136b4565b845260208401935050602081019050613b0b565b5050509392505050565b5f82601f830112613b5057613b4f6137ee565b5b8135613b60848260208601613ad4565b91505092915050565b5f6101208284031215613b7f57613b7e6136f3565b5b613b8a610120613765565b90505f613b99848285016137a5565b5f830152506020613bac848285016137da565b602083015250604082013567ffffffffffffffff811115613bd057613bcf61377f565b5b613bdc84828501613a49565b6040830152506060613bf084828501613840565b6060830152506080613c0484828501613840565b60808301525060a082013567ffffffffffffffff811115613c2857613c2761377f565b5b613c34848285016138c9565b60a08301525060c0613c4884828501613a95565b60c08301525060e0613c5c84828501613a95565b60e08301525061010082013567ffffffffffffffff811115613c8157613c8061377f565b5b613c8d84828501613b3c565b6101008301525092915050565b5f5ffd5b5f5f83601f840112613cb357613cb26137ee565b5b8235905067ffffffffffffffff811115613cd057613ccf613c9a565b5b602083019150836001820283011115613cec57613ceb61381d565b5b9250929050565b5f5f5f60408486031215613d0a57613d09613666565b5b5f84013567ffffffffffffffff811115613d2757613d2661366a565b5b613d3386828701613b69565b935050602084013567ffffffffffffffff811115613d5457613d5361366a565b5b613d6086828701613c9e565b92509250509250925092565b613d7581613a76565b82525050565b5f602082019050613d8e5f830184613d6c565b92915050565b5f5f5f5f5f60808688031215613dad57613dac613666565b5b5f613dba888289016136b4565b9550506020613dcb888289016136b4565b9450506040613ddc88828901613840565b935050606086013567ffffffffffffffff811115613dfd57613dfc61366a565b5b613e0988828901613c9e565b92509250509295509295909350565b613e2181613574565b82525050565b5f602082019050613e3a5f830184613e18565b92915050565b5f5f5f60408486031215613e5757613e56613666565b5b5f613e6486828701613a95565b935050602084013567ffffffffffffffff811115613e8557613e8461366a565b5b613e9186828701613c9e565b92509250509250925092565b613ea681613574565b8114613eb0575f5ffd5b50565b5f81359050613ec181613e9d565b92915050565b5f60208284031215613edc57613edb613666565b5b5f613ee984828501613eb3565b91505092915050565b613efb8161368d565b82525050565b5f602082019050613f145f830184613ef2565b92915050565b5f5f5f5f60408587031215613f3257613f31613666565b5b5f85013567ffffffffffffffff811115613f4f57613f4e61366a565b5b613f5b87828801613c9e565b9450945050602085013567ffffffffffffffff811115613f7e57613f7d61366a565b5b613f8a87828801613c9e565b925092505092959194509250565b5f60208284031215613fad57613fac613666565b5b5f613fba84828501613a95565b91505092915050565b5f5f60208385031215613fd957613fd8613666565b5b5f83013567ffffffffffffffff811115613ff657613ff561366a565b5b61400285828601613c9e565b92509250509250929050565b5f5f5f5f6060858703121561402657614025613666565b5b5f614033878288016136b4565b945050602061404487828801613840565b935050604085013567ffffffffffffffff8111156140655761406461366a565b5b61407187828801613c9e565b925092505092959194509250565b5f6020828403121561409457614093613666565b5b5f6140a184828501613840565b91505092915050565b6140b381613821565b82525050565b5f6020820190506140cc5f8301846140aa565b92915050565b5f6040820190506140e55f830185613ef2565b6140f260208301846140aa565b9392505050565b614102816137b9565b82525050565b5f60c08201905061411b5f8301896140aa565b61412860208301886140aa565b61413560408301876140f9565b6141426060830186613d6c565b61414f60808301856140aa565b61415c60a0830184613d6c565b979650505050505050565b5f5f6040838503121561417d5761417c613666565b5b5f61418a85828601613eb3565b925050602061419b858286016136b4565b9150509250929050565b5f5f83601f8401126141ba576141b96137ee565b5b8235905067ffffffffffffffff8111156141d7576141d6613c9a565b5b6020830191508360208202830111156141f3576141f261381d565b5b9250929050565b5f5f5f5f5f5f5f5f60a0898b03121561421657614215613666565b5b5f6142238b828c016136b4565b98505060206142348b828c016136b4565b975050604089013567ffffffffffffffff8111156142555761425461366a565b5b6142618b828c016141a5565b9650965050606089013567ffffffffffffffff8111156142845761428361366a565b5b6142908b828c016141a5565b9450945050608089013567ffffffffffffffff8111156142b3576142b261366a565b5b6142bf8b828c01613c9e565b92509250509295985092959890939650565b5f5f5f5f5f5f60a087890312156142eb576142ea613666565b5b5f6142f889828a016136b4565b965050602061430989828a016136b4565b955050604061431a89828a01613840565b945050606061432b89828a01613840565b935050608087013567ffffffffffffffff81111561434c5761434b61366a565b5b61435889828a01613c9e565b92509250509295509295509295565b5f6bffffffffffffffffffffffff82169050919050565b61438781614367565b8114614391575f5ffd5b50565b5f813590506143a28161437e565b92915050565b5f5f5f606084860312156143bf576143be613666565b5b5f6143cc86828701613a95565b93505060206143dd868287016136b4565b92505060406143ee86828701614394565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61442f82613821565b915061443a83613821565b9250828201905080821115614452576144516143f8565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61448e81613783565b82525050565b61449d816137b9565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6144d58161368d565b82525050565b6144e481613821565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f61451c826144ea565b61452681856144f4565b9350614536818560208601614504565b61453f816136f7565b840191505092915050565b5f60e083015f83015161455f5f8601826144cc565b50602083015161457260208601826144db565b506040830151848203604086015261458a8282614512565b915050606083015161459f60608601826144db565b5060808301516145b26080860182614494565b5060a08301516145c560a0860182614494565b5060c08301516145d860c08601826144db565b508091505092915050565b5f6145ee838361454a565b905092915050565b5f602082019050919050565b5f61460c826144a3565b61461681856144ad565b935083602082028501614628856144bd565b805f5b85811015614663578484038952815161464485826145e3565b945061464f836145f6565b925060208a0199505060018101905061462b565b50829750879550505050505092915050565b61467e81613a76565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f6146b883836144cc565b60208301905092915050565b5f602082019050919050565b5f6146da82614684565b6146e4818561468e565b93506146ef8361469e565b805f5b8381101561471f57815161470688826146ad565b9750614711836146c4565b9250506001810190506146f2565b5085935050505092915050565b5f61012083015f8301516147425f860182614485565b5060208301516147556020860182614494565b506040830151848203604086015261476d8282614602565b915050606083015161478260608601826144db565b50608083015161479560808601826144db565b5060a083015184820360a08601526147ad8282614512565b91505060c08301516147c260c0860182614675565b5060e08301516147d560e0860182614675565b506101008301518482036101008601526147ef82826146d0565b9150508091505092915050565b5f82825260208201905092915050565b5f61481783856147fc565b9350614824838584613613565b61482d836136f7565b840190509392505050565b5f6040820190508181035f830152614850818661472c565b9050818103602083015261486581848661480c565b9050949350505050565b61487881614367565b82525050565b5f6060820190506148915f830186613d6c565b61489e6020830185613ef2565b6148ab604083018461486f565b949350505050565b5f6040820190506148c65f830185613d6c565b6148d36020830184613d6c565b9392505050565b5f6040820190506148ed5f830185613d6c565b6148fa60208301846140aa565b9392505050565b5f6060820190506149145f830186613d6c565b6149216020830185613ef2565b61492e6040830184613ef2565b949350505050565b5f6040820190506149495f8301856140aa565b61495660208301846140aa565b9392505050565b5f5ffd5b5f5ffd5b5f5f858511156149785761497761495d565b5b8386111561498957614988614961565b5b6001850283019150848603905094509492505050565b5f6060820190506149b25f8301866140aa565b6149bf60208301856140aa565b6149cc60408301846140aa565b949350505050565b5f6060820190508181035f8301526149ec818661472c565b90506149fb60208301856140aa565b614a0860408301846140aa565b949350505050565b5f614a1a826144ea565b614a2481856147fc565b9350614a34818560208601614504565b614a3d816136f7565b840191505092915050565b5f60c082019050614a5b5f830189613d6c565b614a6860208301886140aa565b614a7560408301876140aa565b614a8260608301866140aa565b614a8f60808301856140aa565b81810360a0830152614aa18184614a10565b9050979650505050505050565b5f606082019050614ac15f830186613d6c565b614ace60208301856140aa565b8181036040830152614ae08184614a10565b9050949350505050565b5f6060820190508181035f830152614b02818661472c565b9050614b1160208301856140aa565b8181036040830152614b238184614a10565b9050949350505050565b5f604082019050614b405f830185613e18565b614b4d6020830184613ef2565b9392505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f614b92600283614b54565b9150614b9d82614b5e565b600282019050919050565b5f819050919050565b614bc2614bbd82613a76565b614ba8565b82525050565b5f614bd282614b86565b9150614bde8285614bb1565b602082019150614bee8284614bb1565b6020820191508190509392505050565b5f604082019050614c115f830185613ef2565b8181036020830152614c238184614a10565b90509392505050565b5f81519050614c3a81613a7f565b92915050565b5f81519050614c4e8161382a565b92915050565b5f60408284031215614c6957614c686136f3565b5b614c736040613765565b90505f614c8284828501614c2c565b5f830152506020614c9584828501614c40565b60208301525092915050565b5f60408284031215614cb657614cb5613666565b5b5f614cc384828501614c54565b91505092915050565b604082015f820151614ce05f850182614675565b506020820151614cf360208501826144db565b50505050565b5f604082019050614d0c5f830184614ccc565b92915050565b5f60a082019050614d255f830188613d6c565b614d326020830187613d6c565b614d3f6040830186613d6c565b614d4c60608301856140aa565b614d596080830184613ef2565b9695505050505050565b5f81905092915050565b614d768161368d565b82525050565b5f614d878383614d6d565b60208301905092915050565b5f614d9d82614684565b614da78185614d63565b9350614db28361469e565b805f5b83811015614de2578151614dc98882614d7c565b9750614dd4836146c4565b925050600181019050614db5565b5085935050505092915050565b5f614dfa8284614d93565b915081905092915050565b5f60a082019050614e185f830188613d6c565b614e256020830187613d6c565b614e3260408301866140aa565b614e3f60608301856140aa565b614e4c6080830184613d6c565b9695505050505050565b5f606082019050614e695f830186613d6c565b614e766020830185613d6c565b614e836040830184613d6c565b949350505050565b614e9481613783565b82525050565b5f602082019050614ead5f830184614e8b565b92915050565b5f6060820190508181035f830152614ecc81868861480c565b9050614edb60208301856140aa565b614ee860408301846140aa565b95945050505050565b5f608082019050614f045f830187613d6c565b614f116020830186614e8b565b614f1e6040830185613d6c565b614f2b6060830184613d6c565b95945050505050565b5f604082019050614f475f830186613d6c565b8181036020830152614f5a81848661480c565b9050949350505050565b5f81519050614f7281613e9d565b92915050565b5f60208284031215614f8d57614f8c613666565b5b5f614f9a84828501614f64565b91505092915050565b5f606082019050614fb65f830187613d6c565b614fc36020830186613ef2565b8181036040830152614fd681848661480c565b905095945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f82015250565b5f615015601c83614b54565b915061502082614fe1565b601c82019050919050565b5f61503582615009565b91506150418284614bb1565b60208201915081905092915050565b5f6040820190508181035f830152615068818661472c565b9050818103602083015261507d81848661480c565b9050949350505050565b5f6020828403121561509c5761509b613666565b5b5f6150a984828501614c2c565b91505092915050565b7fff000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6150e6600183614b54565b91506150f1826150b2565b600182019050919050565b5f8160601b9050919050565b5f615112826150fc565b9050919050565b5f61512382615108565b9050919050565b61513b6151368261368d565b615119565b82525050565b5f61514b826150da565b9150615157828661512a565b6014820191506151678285614bb1565b6020820191506151778284614bb1565b602082019150819050949350505050565b5f615192826144ea565b61519c8185613609565b93506151ac818560208601614504565b80840191505092915050565b5f6151c38285615188565b91506151cf8284614bb1565b6020820191508190509392505050565b7f53657175656e6365207369676e65723a0a0000000000000000000000000000005f82015250565b5f615213601183614b54565b915061521e826151df565b601182019050919050565b5f819050919050565b61524361523e82613821565b615229565b82525050565b5f61525382615207565b915061525f828561512a565b60148201915061526f8284615232565b6020820191508190509392505050565b7f53657175656e6365206e657374656420636f6e6669673a0a00000000000000005f82015250565b5f6152b3601883614b54565b91506152be8261527f565b601882019050919050565b5f6152d3826152a7565b91506152df8286614bb1565b6020820191506152ef8285615232565b6020820191506152ff8284615232565b602082019150819050949350505050565b7f53657175656e636520737461746963206469676573743a0a00000000000000005f82015250565b5f615344601883614b54565b915061534f82615310565b601882019050919050565b5f61536482615338565b91506153708284614bb1565b60208201915081905092915050565b7f53657175656e636520616e792061646472657373207375626469676573743a0a5f82015250565b5f6153b3602083614b54565b91506153be8261537f565b602082019050919050565b5f6153d3826153a7565b91506153df8284614bb1565b60208201915081905092915050565b7f53657175656e63652073617069656e7420636f6e6669673a0a000000000000005f82015250565b5f615422601983614b54565b915061542d826153ee565b601982019050919050565b5f61544282615416565b915061544e828661512a565b60148201915061545e8285615232565b60208201915061546e8284614bb1565b602082019150819050949350505050565b5f610100820190506154935f83018b613d6c565b6154a0602083018a613ef2565b6154ad60408301896140aa565b6154ba6060830188613d6c565b6154c760808301876140aa565b6154d460a08301866140f9565b6154e160c08301856140f9565b6154ee60e08301846140aa565b999850505050505050505056fea26469706673582212203719e46a9a86dab24a35db4a3d94c62713d15f05ffd1a322e60a2ef3b78ffbf964736f6c634300081c0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/Stage2Module.sol/Stage2Module.json b/testchain/artifacts/wallet-contracts-v3/Stage2Module.sol/Stage2Module.json new file mode 100644 index 00000000..d474e2c6 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/Stage2Module.sol/Stage2Module.json @@ -0,0 +1,1420 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Stage2Module", + "sourceName": "src/Stage2Module.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + } + ], + "name": "BadNonce", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "HookAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "HookDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "ImageHashIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_signer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidERC1271Signature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + } + ], + "name": "InvalidKind", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSapientSignature", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_flag", + "type": "uint256" + } + ], + "name": "InvalidSignatureFlag", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "InvalidSignatureWeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_expires", + "type": "uint256" + } + ], + "name": "InvalidStaticSignatureExpired", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_caller", + "type": "address" + }, + { + "internalType": "address", + "name": "_expectedCaller", + "type": "address" + } + ], + "name": "InvalidStaticSignatureWrongCaller", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "LowWeightChainedSignature", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_gasLeft", + "type": "uint256" + } + ], + "name": "NotEnoughGas", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + } + ], + "name": "OnlySelf", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "Reverted", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "internalType": "struct Snapshot", + "name": "_snapshot", + "type": "tuple" + } + ], + "name": "UnusedSnapshot", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_nextCheckpoint", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_checkpoint", + "type": "uint256" + } + ], + "name": "WrongChainedCheckpointOrder", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "CallAborted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "CallFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "CallSkipped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "CallSucceeded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + }, + { + "indexed": false, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "DefinedHook", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "newImageHash", + "type": "bytes32" + } + ], + "name": "ImageHashUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_newNonce", + "type": "uint256" + } + ], + "name": "NonceChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint96", + "name": "_timestamp", + "type": "uint96" + } + ], + "name": "StaticSignatureSet", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + }, + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "addHook", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_payload", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + } + ], + "name": "getStaticSignature", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "imageHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "readHook", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + } + ], + "name": "readNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverPartialSignature", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isValidImage", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "opHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverSapientSignature", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "removeHook", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_payload", + "type": "bytes" + } + ], + "name": "selfExecute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "internalType": "uint96", + "name": "_timestamp", + "type": "uint96" + } + ], + "name": "setStaticSignature", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "tokenReceived", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_imageHash", + "type": "bytes32" + } + ], + "name": "updateImageHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_implementation", + "type": "address" + } + ], + "name": "updateImplementation", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405260043610610117575f3560e01c80636ea445771161009f578063ad55366b11610063578063ad55366b14610475578063b93ea7ad146104b6578063bc197c81146104d2578063f23a6e611461050e578063f727ef1c1461054a5761011e565b80636ea445771461038e5780638943ec02146103aa5780638c3f5563146103d257806392dcb3fc1461040e578063aaf10f421461044b5761011e565b80631a9b2337116100e65780631a9b2337146102c85780631f6a1eb91461030457806329561426146103205780634fcf3eca1461034857806351605d80146103645761011e565b8063025b22bc146101f857806313792a4a14610214578063150b7a02146102505780631626ba7e1461028c5761011e565b3661011e57005b60045f369050106101f6575f61013f5f369061013a9190613487565b610572565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146101f4575f5f8273ffffffffffffffffffffffffffffffffffffffff165f3660405161019d929190613521565b5f60405180830381855af49150503d805f81146101d5576040519150601f19603f3d011682016040523d82523d5f602084013e6101da565b606091505b5091509150816101ec57805160208201fd5b805160208201f35b505b005b610212600480360381019061020d91906135a4565b6105c7565b005b34801561021f575f5ffd5b5061023a60048036038101906102359190613bcf565b610643565b6040516102479190613c57565b60405180910390f35b34801561025b575f5ffd5b5061027660048036038101906102719190613c70565b6107f2565b6040516102839190613d03565b60405180910390f35b348015610297575f5ffd5b506102b260048036038101906102ad9190613d1c565b610806565b6040516102bf9190613d03565b60405180910390f35b3480156102d3575f5ffd5b506102ee60048036038101906102e99190613da3565b610848565b6040516102fb9190613ddd565b60405180910390f35b61031e60048036038101906103199190613df6565b610859565b005b34801561032b575f5ffd5b5061034660048036038101906103419190613e74565b6108e8565b005b610362600480360381019061035d9190613da3565b610964565b005b34801561036f575f5ffd5b50610378610a59565b6040516103859190613c57565b60405180910390f35b6103a860048036038101906103a39190613e9f565b610a8a565b005b3480156103b5575f5ffd5b506103d060048036038101906103cb9190613eea565b610b29565b005b3480156103dd575f5ffd5b506103f860048036038101906103f39190613f5b565b610b2f565b6040516104059190613f95565b60405180910390f35b348015610419575f5ffd5b50610434600480360381019061042f9190613e74565b610b67565b604051610442929190613fae565b60405180910390f35b348015610456575f5ffd5b5061045f610b7b565b60405161046c9190613ddd565b60405180910390f35b348015610480575f5ffd5b5061049b60048036038101906104969190613bcf565b610b89565b6040516104ad96959493929190613fe4565b60405180910390f35b6104d060048036038101906104cb9190614043565b610bc7565b005b3480156104dd575f5ffd5b506104f860048036038101906104f391906140d6565b610cbd565b6040516105059190613d03565b60405180910390f35b348015610519575f5ffd5b50610534600480360381019061052f91906141ad565b610cd4565b6040516105419190613d03565b60405180910390f35b348015610555575f5ffd5b50610570600480360381019061056b9190614284565b610ce9565b005b5f6105be7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1205f1b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916610db2565b5f1c9050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461063757336040517fa19dbf0000000000000000000000000000000000000000000000000000000000815260040161062e9190613ddd565b60405180910390fd5b61064081610dea565b50565b5f5f6001856101000151516106589190614301565b67ffffffffffffffff811115610671576106706135e3565b5b60405190808252806020026020018201604052801561069f5781602001602082028036833780820191505090505b5090505f5f90505b8561010001515181101561072f5785610100015181815181106106cd576106cc614334565b5b60200260200101518282815181106106e8576106e7614334565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506106a7565b503381866101000151518151811061074a57610749614334565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808561010001819052505f61079a868686610e2d565b509050806107e3578585856040517ff58cc8b50000000000000000000000000000000000000000000000000000000081526004016107da93929190614714565b60405180910390fd5b60015f1b925050509392505050565b5f63150b7a0260e01b905095945050505050565b5f5f6108118561101d565b90505f61081f828686610e2d565b50905080610834575f60e01b92505050610841565b6320c13b0b60e01b925050505b9392505050565b5f61085282610572565b9050919050565b5f5a90505f6108688686611046565b905061087c816060015182608001516114e8565b5f5f610889838787610e2d565b91509150816108d3578286866040517fa2b6d61b0000000000000000000000000000000000000000000000000000000081526004016108ca93929190614714565b60405180910390fd5b6108de84828561158c565b5050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461095857336040517fa19dbf0000000000000000000000000000000000000000000000000000000000815260040161094f9190613ddd565b60405180910390fd5b610961816118bc565b50565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109d457336040517fa19dbf000000000000000000000000000000000000000000000000000000000081526004016109cb9190613ddd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff166109f482610572565b73ffffffffffffffffffffffffffffffffffffffff1603610a4c57806040517f1c3812cc000000000000000000000000000000000000000000000000000000008152600401610a439190613d03565b60405180910390fd5b610a56815f61195d565b50565b5f610a857fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b6119fe565b905090565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610afa57336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610af19190613ddd565b60405180910390fd5b5f5a90505f610b098484611046565b90505f610b1582611a08565b9050610b2283828461158c565b5050505050565b50505050565b5f610b5e7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e5f1b835f1b610db2565b5f1c9050919050565b5f5f610b7283611a58565b91509150915091565b5f610b84611aa9565b905090565b5f5f5f5f5f5f610b9c8989895f5f611ab1565b809550819650829750839950849a505050505050610bb983611dee565b935093975093979195509350565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c3757336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610c2e9190613ddd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16610c5783610572565b73ffffffffffffffffffffffffffffffffffffffff1614610caf57816040517f5b4d6d6a000000000000000000000000000000000000000000000000000000008152600401610ca69190613d03565b60405180910390fd5b610cb9828261195d565b5050565b5f63bc197c8160e01b905098975050505050505050565b5f63f23a6e6160e01b90509695505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d5957336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610d509190613ddd565b60405180910390fd5b610d728383836bffffffffffffffffffffffff16611dff565b7febf265acfac1c01de588ed7ef49743b9c3ce8d6d1edeaf510a1f5453228515b1838383604051610da59392919061475a565b60405180910390a1505050565b5f5f8383604051602001610dc792919061478f565b604051602081830303815290604052805190602001209050805491505092915050565b610df381611e5d565b7f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca0381604051610e229190613ddd565b60405180910390a150565b5f5f5f84845f818110610e4357610e42614334565b5b9050013560f81c60f81b9050608060f81b608060f81b82167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f9c57610e8b86611a08565b91505f5f610e9884611a58565b91509150428111610ee25783816040517ff95b6ab7000000000000000000000000000000000000000000000000000000008152600401610ed99291906147b6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610f4a57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15610f90578333836040517f8945c313000000000000000000000000000000000000000000000000000000008152600401610f87939291906147dd565b60405180910390fd5b60019450505050611015565b5f5f5f610fac8989895f5f611ab1565b905080985081945082955083965050505050828210156110055782826040517ffd41fcba000000000000000000000000000000000000000000000000000000008152600401610ffc929190614812565b60405180910390fd5b61100e81611dee565b9550505050505b935093915050565b611025613392565b6003815f019060ff16908160ff1681525050818160e0018181525050919050565b61104e613392565b5f815f019060ff16908160ff16815250505f5f61106b8585611e63565b915060ff16915060018083160361108b575f8360600181815250506110c7565b6110a0818686611e799290919263ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff169150846060018193508281525050505b5f6007600184901c1690505f811115611104576110f682828888611eaa9190939291909392919063ffffffff16565b856080018194508281525050505b5f6010808516036111185760019050611170565b60208085160361114b57611137838888611ed79290919263ffffffff16565b8161ffff169150809450819250505061116f565b611160838888611ef69290919263ffffffff16565b8160ff16915080945081925050505b5b8067ffffffffffffffff81111561118a576111896135e3565b5b6040519080825280602002602001820160405280156111c357816020015b6111b06133dd565b8152602001906001900390816111a85790505b5085604001819052505f5f90505b818110156114dd575f6111ef858a8a611ef69290919263ffffffff16565b8096508192505050600180821660ff160361125e57308760400151838151811061121c5761121b614334565b5b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506112ca565b611273858a8a611f119290919263ffffffff16565b8860400151848151811061128a57611289614334565b5b60200260200101515f018197508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050505b600280821660ff1603611318576112ec858a8a611f429290919263ffffffff16565b8860400151848151811061130357611302614334565b5b60200260200101516020018197508281525050505b600480821660ff16036113e0575f61133b868b8b611f589290919263ffffffff16565b8162ffffff169150809750819250505089898790838961135b9190614301565b9261136893929190614841565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050886040015184815181106113c1576113c0614334565b5b60200260200101516040018190525080866113dc9190614301565b9550505b600880821660ff160361142e57611402858a8a611f429290919263ffffffff16565b8860400151848151811061141957611418614334565b5b60200260200101516060018197508281525050505b601080821660ff16148760400151838151811061144e5761144d614334565b5b60200260200101516080019015159081151581525050602080821660ff16148760400151838151811061148457611483614334565b5b602002602001015160a0019015159081151581525050600660c0821660ff16901c60ff16876040015183815181106114bf576114be614334565b5b602002602001015160c00181815250505080806001019150506111d1565b505050505092915050565b5f6114f283610b2f565b905081811461153c578282826040517f9b6514f40000000000000000000000000000000000000000000000000000000081526004016115339392919061487b565b60405180910390fd5b5f60018301905061154d8482611f78565b7f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881848260405161157e929190614812565b60405180910390a150505050565b5f5f90505f82604001515190505f5f90505b818110156118b4575f846040015182815181106115be576115bd614334565b5b602002602001015190508060a0015180156115d7575083155b1561161b577f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b868360405161160d9291906147b6565b60405180910390a1506118a7565b5f93505f816060015190505f81141580156116355750805a105b1561167b5785835a6040517f21395274000000000000000000000000000000000000000000000000000000008152600401611672939291906148b0565b60405180910390fd5b5f82608001511561173057611729835f01515f841461169a578361169c565b5a5b634c4e814c60e01b8b8d898b8e606001518b604001516040516024016116c796959493929190614924565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611fad565b9050611758565b611755835f015184602001515f8514611749578461174b565b5a5b8660400151611fc2565b90505b8061186a575f60ff168360c00151036117b957600195507f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d888561179a611fd9565b6040516117a99392919061498a565b60405180910390a15050506118a7565b600160ff168360c00151036118105786846117d2611fd9565b6040517f7f6b0bb1000000000000000000000000000000000000000000000000000000008152600401611807939291906149c6565b60405180910390fd5b600260ff168360c0015103611869577fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b888561184a611fd9565b6040516118599392919061498a565b60405180910390a15050506118b4565b5b7f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a888560405161189b9291906147b6565b60405180910390a15050505b808060010191505061159e565b505050505050565b5f5f1b81036118f7576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119237fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b82611ff7565b7f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa816040516119529190613c57565b60405180910390a150565b6119c17fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1205f1b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff165f1b611ffe565b7f0d7fc113eaf016db4681a1ba86d083ce3e0961f321062a75ac2b0aeb33deeed182826040516119f2929190614a09565b60405180910390a15050565b5f81549050919050565b5f5f611a18836020015130612033565b90505f611a24846120d7565b90508181604051602001611a39929190614aa4565b6040516020818303038152906040528051906020012092505050919050565b5f5f5f611a877fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e865f1b85610db2565b5f1c9050606081901c816bffffffffffffffffffffffff169250925050915091565b5f3054905090565b5f5f5f5f5f5f5f611ac28b8b611e63565b915060ff169150611ad161342e565b6040808416148015611b0e57505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16145b15611c4a57611b28828d8d611f119290919263ffffffff16565b809350819a50505089611c49575f611b4b838e8e611f589290919263ffffffff16565b8162ffffff16915080945081925050505f8d8d85908487611b6c9190614301565b92611b7993929190614841565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505090508a73ffffffffffffffffffffffffffffffffffffffff1663ccce3bc830836040518363ffffffff1660e01b8152600401611bf8929190614ada565b6040805180830381865afa158015611c12573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c369190614b7d565b92508184611c449190614301565b935050505b5b600180841603611c8357611c718d8a838f8f87908092611c6c93929190614841565b61230b565b97509750975097509750505050611de1565b6002808416148d60200190151590811515815250505f6002601c8516901c9050611cbf83828f8f611eaa9190939291909392919063ffffffff16565b8094508197505050505f6001600560208616901c611cdd9190614301565b9050611cfb83828f8f611eaa9190939291909392919063ffffffff16565b809450819a50505050611d0d8d611a08565b9350611d2b8d858e8e86908092611d2693929190614841565b61256d565b8097508198505050611d3f86895f1b6130e1565b9550611d4d86865f1b6130e1565b9550611d71868a73ffffffffffffffffffffffffffffffffffffffff165f1b6130e1565b95505f5f1b815f015114158015611d8b575085815f015114155b8015611d9b575080602001518511155b15611ddd57806040517fccbb534f000000000000000000000000000000000000000000000000000000008152600401611dd49190614bd5565b60405180910390fd5b5050505b9550955095509550959050565b5f611df8826130f5565b9050919050565b611e587fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e865f1b846bffffffffffffffffffffffff841660608673ffffffffffffffffffffffffffffffffffffffff16901b175f1b611ffe565b505050565b80305550565b5f5f83358060f81c925060019150509250929050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f858401356008840261010003600180866008021b0382821c1693508486019250505094509492505050565b5f5f8483013561ffff8160f01c16925060028401915050935093915050565b5f5f848301358060f81c925060018401915050935093915050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f848301359150602083019050935093915050565b5f5f8483013562ffffff8160e81c16925060038401915050935093915050565b611fa97f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e5f1b835f1b835f1b611ffe565b5050565b5f5f5f8351602085018787f490509392505050565b5f5f5f835160208501878988f19050949350505050565b60603d604051915060208201818101604052818352815f823e505090565b8082555050565b5f838360405160200161201292919061478f565b60405160208183030381529060405280519060200120905081815550505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de856120a257466120a4565b5f5b856040516020016120b9959493929190614bee565b60405160208183030381529060405280519060200120905092915050565b5f5f8261010001516040516020016120ef9190614ccb565b6040516020818303038152906040528051906020012090505f60ff16835f015160ff1603612187575f6121258460400151613138565b90507f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2818560600151866080015185604051602001612168959493929190614ce1565b6040516020818303038152906040528051906020012092505050612306565b600160ff16835f015160ff16036121f6577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360a0015180519060200120826040516020016121d893929190614d32565b60405160208183030381529060405280519060200120915050612306565b600260ff16835f015160ff160361225e577f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e48360c001518260405160200161224093929190614d32565b60405160208183030381529060405280519060200120915050612306565b600360ff16835f015160ff16036122c6577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360e00151826040516020016122a893929190614d32565b60405160208183030381529060405280519060200120915050612306565b825f01516040517f048183200000000000000000000000000000000000000000000000000000000081526004016122fd9190614d76565b60405180910390fd5b919050565b5f5f5f5f5f612318613392565b6002815f019060ff16908160ff16815250505f5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505b89899050821015612502575f5f612372848d8d611f589290919263ffffffff16565b8162ffffff1691508095508192505050838161238e9190614301565b9150505f8b8b905082146123a2575f6123a4565b8d5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303612404576123eb8f8d8d879086926123e393929190614841565b600185611ab1565b809a50819b50829c50839d50849e505050505050612434565b612422858d8d8790869261241a93929190614841565b600185611ab1565b50809a50819b50829c50839d50505050505b8989101561248f578b8b8590849261244e93929190614841565b8b8b6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016124869493929190614d8f565b60405180910390fd5b819350878d5f0151036124a8575f5f1b8d5f0181815250505b8287106124ee5786836040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004016124e5929190614812565b60405180910390fd5b878560c00181815250508692505050612350565b5f5f1b8b5f01511415801561251b57508a602001518511155b1561255d578a6040517fccbb534f0000000000000000000000000000000000000000000000000000000081526004016125549190614bd5565b60405180910390fd5b5050509550955095509550959050565b5f5f5f5b848490508110156130d7575f612592828787611ef69290919263ffffffff16565b8160ff16915080935081925050505f600460f08316901c90505f81036126ea575f600f831690505f8160ff16036125e1576125d8848989611ef69290919263ffffffff16565b80955081925050505b5f5f6125f8868b8b6131b29290919263ffffffff16565b8097508193505050612615868b8b6131b29290919263ffffffff16565b80975081925050505f60ff82901c5f1c90505f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835f1c165f1b90505f601b830190505f60018f8388866040515f815260200160405260405161267b9493929190614dcd565b6020604051602081039080840390855afa15801561269b573d5f5f3e3d5ffd5b5050506020604051035190508660ff168c019b505f6126bd828960ff166131c8565b90505f5f1b8c036126ce57806126d9565b6126d88c826130e1565b5b9b5050505050505050505050612571565b60018103612775575f600f831690505f8160ff160361272157612718848989611ef69290919263ffffffff16565b80955081925050505b5f612737858a8a611f119290919263ffffffff16565b80965081925050505f61274d828460ff166131c8565b90505f5f1b870361275e5780612769565b61276887826130e1565b5b96505050505050612571565b60028103612974575f6003831690505f8160ff16036127ac576127a3848989611ef69290919263ffffffff16565b80955081925050505b5f6127c2858a8a611f119290919263ffffffff16565b80965081925050505f6002600c861660ff16901c60ff1690505f6127f887838d8d611eaa9190939291909392919063ffffffff16565b80985081925050505f81880190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff16631626ba7e8f8f8f8d90879261285c93929190614841565b6040518463ffffffff1660e01b815260040161287a93929190614e10565b602060405180830381865afa158015612895573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128b99190614e54565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612930578c848d8d8b9085926128f193929190614841565b6040517fb2fed7ae0000000000000000000000000000000000000000000000000000000081526004016129279493929190614e7f565b60405180910390fd5b8097508460ff168a0199505f612949858760ff166131c8565b90505f5f1b8a0361295a5780612965565b6129648a826130e1565b5b99505050505050505050612571565b600381036129be575f6129928489896131b29290919263ffffffff16565b80955081925050505f5f1b85036129a957806129b4565b6129b385826130e1565b5b9450505050612571565b60048103612a3d575f600f831660ff1690505f6129ed85838b8b611eaa9190939291909392919063ffffffff16565b80965081925050505f81860190505f5f612a198e8e8e8e8c908892612a1493929190614841565b61256d565b91509150829750818a019950612a2f89826130e1565b985050505050505050612571565b60068103612b4d575f6002600c841660ff16901c60ff1690505f8103612a8157612a72848989611ef69290919263ffffffff16565b8160ff16915080955081925050505b5f6003841660ff1690505f8103612ab757612aa7858a8a611ed79290919263ffffffff16565b8161ffff16915080965081925050505b5f612acd868b8b611f589290919263ffffffff16565b8162ffffff16915080975081925050505f81870190505f5f612b018f8f8f8f8d908892612afc93929190614841565b61256d565b91509150829850848210612b1557858b019a505b5f612b218287896131fa565b90505f5f1b8b03612b325780612b3d565b612b3c8b826130e1565b5b9a50505050505050505050612571565b60058103612bcf575f612b6b8489896131b29290919263ffffffff16565b8095508192505050888103612b9e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505b5f612ba88261322f565b90505f5f1b8603612bb95780612bc4565b612bc386826130e1565b5b955050505050612571565b60078103612d35575f600f831690505f8160ff1603612c0657612bfd848989611ef69290919263ffffffff16565b80955081925050505b5f5f612c1d868b8b6131b29290919263ffffffff16565b8097508193505050612c3a868b8b6131b29290919263ffffffff16565b80975081925050505f60ff82901c5f1c90505f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835f1c165f1b90505f601b830190505f60018f604051602001612c919190614f07565b604051602081830303815290604052805190602001208388866040515f8152602001604052604051612cc69493929190614dcd565b6020604051602081039080840390855afa158015612ce6573d5f5f3e3d5ffd5b5050506020604051035190508660ff168c019b505f612d08828960ff166131c8565b90505f5f1b8c03612d195780612d24565b612d238c826130e1565b5b9b5050505050505050505050612571565b60088103612dce575f612d538489896131b29290919263ffffffff16565b80955081925050505f612d6f5f8c61325e90919063ffffffff16565b9050808203612d9c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505b5f612da6836132af565b90505f5f1b8703612db75780612dc2565b612dc187826130e1565b5b96505050505050612571565b60098103612f34575f6003831690505f8160ff1603612e0557612dfc848989611ef69290919263ffffffff16565b80955081925050505b5f612e1b858a8a611f119290919263ffffffff16565b80965081925050505f5f6002600c871660ff16901c60ff169050612e5187828d8d611eaa9190939291909392919063ffffffff16565b8098508193505050505f81870190505f8373ffffffffffffffffffffffffffffffffffffffff166313792a4a8f8e8e8c908792612e9093929190614841565b6040518463ffffffff1660e01b8152600401612eae93929190614f2c565b602060405180830381865afa158015612ec9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eed9190614f63565b90508197508460ff168a0199505f612f09858760ff16846132de565b90505f5f1b8a03612f1a5780612f25565b612f248a826130e1565b5b99505050505050505050612571565b600a810361309a575f6003831690505f8160ff1603612f6b57612f62848989611ef69290919263ffffffff16565b80955081925050505b5f612f81858a8a611f119290919263ffffffff16565b80965081925050505f6002600c861660ff16901c60ff1690505f612fb787838d8d611eaa9190939291909392919063ffffffff16565b80985081925050505f81880190505f8473ffffffffffffffffffffffffffffffffffffffff1663898bd9218f8f8f8d908792612ff593929190614841565b6040518463ffffffff1660e01b815260040161301393929190614e10565b602060405180830381865afa15801561302e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130529190614f63565b90508198508560ff168b019a505f61306e868860ff16846132de565b90505f5f1b8b0361307f578061308a565b6130898b826130e1565b5b9a50505050505050505050612571565b806040517fb2505f7c0000000000000000000000000000000000000000000000000000000081526004016130ce9190613f95565b60405180910390fd5b5094509492505050565b5f825f528160205260405f20905092915050565b5f5f5f1b8214158015613131575061312e7fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b6119fe565b82145b9050919050565b5f60605f5f90505b83518110156131a1575f61316d8583815181106131605761315f614334565b5b6020026020010151613313565b90508281604051602001613182929190614fbe565b6040516020818303038152906040529250508080600101915050613140565b508080519060200120915050919050565b5f5f848301359150602083019050935093915050565b5f82826040516020016131dc929190615094565b60405160208183030381529060405280519060200120905092915050565b5f83838360405160200161321093929190615114565b6040516020818303038152906040528051906020012090509392505050565b5f8160405160200161324191906151a5565b604051602081830303815290604052805190602001209050919050565b5f5f61326e846020015184612033565b90505f61327a856120d7565b9050818160405160200161328f929190614aa4565b604051602081830303815290604052805190602001209250505092915050565b5f816040516020016132c19190615214565b604051602081830303815290604052805190602001209050919050565b5f8383836040516020016132f493929190615283565b6040516020818303038152906040528051906020012090509392505050565b5f7f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437825f01518360200151846040015180519060200120856060015186608001518760a001518860c001516040516020016133759897969594939291906152ca565b604051602081830303815290604052805190602001209050919050565b6040518061012001604052805f60ff1681526020015f15158152602001606081526020015f81526020015f8152602001606081526020015f81526020015f8152602001606081525090565b6040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f8152602001606081526020015f81526020015f151581526020015f151581526020015f81525090565b60405180604001604052805f81526020015f81525090565b5f82905092915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b5f82821b905092915050565b5f6134928383613446565b8261349d8135613450565b925060048210156134dd576134d87fffffffff000000000000000000000000000000000000000000000000000000008360040360080261347b565b831692505b505092915050565b5f81905092915050565b828183375f83830152505050565b5f61350883856134e5565b93506135158385846134ef565b82840190509392505050565b5f61352d8284866134fd565b91508190509392505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6135738261354a565b9050919050565b61358381613569565b811461358d575f5ffd5b50565b5f8135905061359e8161357a565b92915050565b5f602082840312156135b9576135b8613542565b5b5f6135c684828501613590565b91505092915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613619826135d3565b810181811067ffffffffffffffff82111715613638576136376135e3565b5b80604052505050565b5f61364a613539565b90506136568282613610565b919050565b5f5ffd5b5f60ff82169050919050565b6136748161365f565b811461367e575f5ffd5b50565b5f8135905061368f8161366b565b92915050565b5f8115159050919050565b6136a981613695565b81146136b3575f5ffd5b50565b5f813590506136c4816136a0565b92915050565b5f5ffd5b5f67ffffffffffffffff8211156136e8576136e76135e3565b5b602082029050602081019050919050565b5f5ffd5b5f819050919050565b61370f816136fd565b8114613719575f5ffd5b50565b5f8135905061372a81613706565b92915050565b5f5ffd5b5f67ffffffffffffffff82111561374e5761374d6135e3565b5b613757826135d3565b9050602081019050919050565b5f61377661377184613734565b613641565b90508281526020810184848401111561379257613791613730565b5b61379d8482856134ef565b509392505050565b5f82601f8301126137b9576137b86136ca565b5b81356137c9848260208601613764565b91505092915050565b5f60e082840312156137e7576137e66135cf565b5b6137f160e0613641565b90505f61380084828501613590565b5f8301525060206138138482850161371c565b602083015250604082013567ffffffffffffffff8111156138375761383661365b565b5b613843848285016137a5565b60408301525060606138578482850161371c565b606083015250608061386b848285016136b6565b60808301525060a061387f848285016136b6565b60a08301525060c06138938482850161371c565b60c08301525092915050565b5f6138b16138ac846136ce565b613641565b905080838252602082019050602084028301858111156138d4576138d36136f9565b5b835b8181101561391b57803567ffffffffffffffff8111156138f9576138f86136ca565b5b80860161390689826137d2565b855260208501945050506020810190506138d6565b5050509392505050565b5f82601f830112613939576139386136ca565b5b813561394984826020860161389f565b91505092915050565b5f819050919050565b61396481613952565b811461396e575f5ffd5b50565b5f8135905061397f8161395b565b92915050565b5f67ffffffffffffffff82111561399f5761399e6135e3565b5b602082029050602081019050919050565b5f6139c26139bd84613985565b613641565b905080838252602082019050602084028301858111156139e5576139e46136f9565b5b835b81811015613a0e57806139fa8882613590565b8452602084019350506020810190506139e7565b5050509392505050565b5f82601f830112613a2c57613a2b6136ca565b5b8135613a3c8482602086016139b0565b91505092915050565b5f6101208284031215613a5b57613a5a6135cf565b5b613a66610120613641565b90505f613a7584828501613681565b5f830152506020613a88848285016136b6565b602083015250604082013567ffffffffffffffff811115613aac57613aab61365b565b5b613ab884828501613925565b6040830152506060613acc8482850161371c565b6060830152506080613ae08482850161371c565b60808301525060a082013567ffffffffffffffff811115613b0457613b0361365b565b5b613b10848285016137a5565b60a08301525060c0613b2484828501613971565b60c08301525060e0613b3884828501613971565b60e08301525061010082013567ffffffffffffffff811115613b5d57613b5c61365b565b5b613b6984828501613a18565b6101008301525092915050565b5f5ffd5b5f5f83601f840112613b8f57613b8e6136ca565b5b8235905067ffffffffffffffff811115613bac57613bab613b76565b5b602083019150836001820283011115613bc857613bc76136f9565b5b9250929050565b5f5f5f60408486031215613be657613be5613542565b5b5f84013567ffffffffffffffff811115613c0357613c02613546565b5b613c0f86828701613a45565b935050602084013567ffffffffffffffff811115613c3057613c2f613546565b5b613c3c86828701613b7a565b92509250509250925092565b613c5181613952565b82525050565b5f602082019050613c6a5f830184613c48565b92915050565b5f5f5f5f5f60808688031215613c8957613c88613542565b5b5f613c9688828901613590565b9550506020613ca788828901613590565b9450506040613cb88882890161371c565b935050606086013567ffffffffffffffff811115613cd957613cd8613546565b5b613ce588828901613b7a565b92509250509295509295909350565b613cfd81613450565b82525050565b5f602082019050613d165f830184613cf4565b92915050565b5f5f5f60408486031215613d3357613d32613542565b5b5f613d4086828701613971565b935050602084013567ffffffffffffffff811115613d6157613d60613546565b5b613d6d86828701613b7a565b92509250509250925092565b613d8281613450565b8114613d8c575f5ffd5b50565b5f81359050613d9d81613d79565b92915050565b5f60208284031215613db857613db7613542565b5b5f613dc584828501613d8f565b91505092915050565b613dd781613569565b82525050565b5f602082019050613df05f830184613dce565b92915050565b5f5f5f5f60408587031215613e0e57613e0d613542565b5b5f85013567ffffffffffffffff811115613e2b57613e2a613546565b5b613e3787828801613b7a565b9450945050602085013567ffffffffffffffff811115613e5a57613e59613546565b5b613e6687828801613b7a565b925092505092959194509250565b5f60208284031215613e8957613e88613542565b5b5f613e9684828501613971565b91505092915050565b5f5f60208385031215613eb557613eb4613542565b5b5f83013567ffffffffffffffff811115613ed257613ed1613546565b5b613ede85828601613b7a565b92509250509250929050565b5f5f5f5f60608587031215613f0257613f01613542565b5b5f613f0f87828801613590565b9450506020613f208782880161371c565b935050604085013567ffffffffffffffff811115613f4157613f40613546565b5b613f4d87828801613b7a565b925092505092959194509250565b5f60208284031215613f7057613f6f613542565b5b5f613f7d8482850161371c565b91505092915050565b613f8f816136fd565b82525050565b5f602082019050613fa85f830184613f86565b92915050565b5f604082019050613fc15f830185613dce565b613fce6020830184613f86565b9392505050565b613fde81613695565b82525050565b5f60c082019050613ff75f830189613f86565b6140046020830188613f86565b6140116040830187613fd5565b61401e6060830186613c48565b61402b6080830185613f86565b61403860a0830184613c48565b979650505050505050565b5f5f6040838503121561405957614058613542565b5b5f61406685828601613d8f565b925050602061407785828601613590565b9150509250929050565b5f5f83601f840112614096576140956136ca565b5b8235905067ffffffffffffffff8111156140b3576140b2613b76565b5b6020830191508360208202830111156140cf576140ce6136f9565b5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156140f2576140f1613542565b5b5f6140ff8b828c01613590565b98505060206141108b828c01613590565b975050604089013567ffffffffffffffff81111561413157614130613546565b5b61413d8b828c01614081565b9650965050606089013567ffffffffffffffff8111156141605761415f613546565b5b61416c8b828c01614081565b9450945050608089013567ffffffffffffffff81111561418f5761418e613546565b5b61419b8b828c01613b7a565b92509250509295985092959890939650565b5f5f5f5f5f5f60a087890312156141c7576141c6613542565b5b5f6141d489828a01613590565b96505060206141e589828a01613590565b95505060406141f689828a0161371c565b945050606061420789828a0161371c565b935050608087013567ffffffffffffffff81111561422857614227613546565b5b61423489828a01613b7a565b92509250509295509295509295565b5f6bffffffffffffffffffffffff82169050919050565b61426381614243565b811461426d575f5ffd5b50565b5f8135905061427e8161425a565b92915050565b5f5f5f6060848603121561429b5761429a613542565b5b5f6142a886828701613971565b93505060206142b986828701613590565b92505060406142ca86828701614270565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61430b826136fd565b9150614316836136fd565b925082820190508082111561432e5761432d6142d4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61436a8161365f565b82525050565b61437981613695565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6143b181613569565b82525050565b6143c0816136fd565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6143f8826143c6565b61440281856143d0565b93506144128185602086016143e0565b61441b816135d3565b840191505092915050565b5f60e083015f83015161443b5f8601826143a8565b50602083015161444e60208601826143b7565b506040830151848203604086015261446682826143ee565b915050606083015161447b60608601826143b7565b50608083015161448e6080860182614370565b5060a08301516144a160a0860182614370565b5060c08301516144b460c08601826143b7565b508091505092915050565b5f6144ca8383614426565b905092915050565b5f602082019050919050565b5f6144e88261437f565b6144f28185614389565b93508360208202850161450485614399565b805f5b8581101561453f578484038952815161452085826144bf565b945061452b836144d2565b925060208a01995050600181019050614507565b50829750879550505050505092915050565b61455a81613952565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f61459483836143a8565b60208301905092915050565b5f602082019050919050565b5f6145b682614560565b6145c0818561456a565b93506145cb8361457a565b805f5b838110156145fb5781516145e28882614589565b97506145ed836145a0565b9250506001810190506145ce565b5085935050505092915050565b5f61012083015f83015161461e5f860182614361565b5060208301516146316020860182614370565b506040830151848203604086015261464982826144de565b915050606083015161465e60608601826143b7565b50608083015161467160808601826143b7565b5060a083015184820360a086015261468982826143ee565b91505060c083015161469e60c0860182614551565b5060e08301516146b160e0860182614551565b506101008301518482036101008601526146cb82826145ac565b9150508091505092915050565b5f82825260208201905092915050565b5f6146f383856146d8565b93506147008385846134ef565b614709836135d3565b840190509392505050565b5f6040820190508181035f83015261472c8186614608565b905081810360208301526147418184866146e8565b9050949350505050565b61475481614243565b82525050565b5f60608201905061476d5f830186613c48565b61477a6020830185613dce565b614787604083018461474b565b949350505050565b5f6040820190506147a25f830185613c48565b6147af6020830184613c48565b9392505050565b5f6040820190506147c95f830185613c48565b6147d66020830184613f86565b9392505050565b5f6060820190506147f05f830186613c48565b6147fd6020830185613dce565b61480a6040830184613dce565b949350505050565b5f6040820190506148255f830185613f86565b6148326020830184613f86565b9392505050565b5f5ffd5b5f5ffd5b5f5f8585111561485457614853614839565b5b838611156148655761486461483d565b5b6001850283019150848603905094509492505050565b5f60608201905061488e5f830186613f86565b61489b6020830185613f86565b6148a86040830184613f86565b949350505050565b5f6060820190508181035f8301526148c88186614608565b90506148d76020830185613f86565b6148e46040830184613f86565b949350505050565b5f6148f6826143c6565b61490081856146d8565b93506149108185602086016143e0565b614919816135d3565b840191505092915050565b5f60c0820190506149375f830189613c48565b6149446020830188613f86565b6149516040830187613f86565b61495e6060830186613f86565b61496b6080830185613f86565b81810360a083015261497d81846148ec565b9050979650505050505050565b5f60608201905061499d5f830186613c48565b6149aa6020830185613f86565b81810360408301526149bc81846148ec565b9050949350505050565b5f6060820190508181035f8301526149de8186614608565b90506149ed6020830185613f86565b81810360408301526149ff81846148ec565b9050949350505050565b5f604082019050614a1c5f830185613cf4565b614a296020830184613dce565b9392505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f614a6e600283614a30565b9150614a7982614a3a565b600282019050919050565b5f819050919050565b614a9e614a9982613952565b614a84565b82525050565b5f614aae82614a62565b9150614aba8285614a8d565b602082019150614aca8284614a8d565b6020820191508190509392505050565b5f604082019050614aed5f830185613dce565b8181036020830152614aff81846148ec565b90509392505050565b5f81519050614b168161395b565b92915050565b5f81519050614b2a81613706565b92915050565b5f60408284031215614b4557614b446135cf565b5b614b4f6040613641565b90505f614b5e84828501614b08565b5f830152506020614b7184828501614b1c565b60208301525092915050565b5f60408284031215614b9257614b91613542565b5b5f614b9f84828501614b30565b91505092915050565b604082015f820151614bbc5f850182614551565b506020820151614bcf60208501826143b7565b50505050565b5f604082019050614be85f830184614ba8565b92915050565b5f60a082019050614c015f830188613c48565b614c0e6020830187613c48565b614c1b6040830186613c48565b614c286060830185613f86565b614c356080830184613dce565b9695505050505050565b5f81905092915050565b614c5281613569565b82525050565b5f614c638383614c49565b60208301905092915050565b5f614c7982614560565b614c838185614c3f565b9350614c8e8361457a565b805f5b83811015614cbe578151614ca58882614c58565b9750614cb0836145a0565b925050600181019050614c91565b5085935050505092915050565b5f614cd68284614c6f565b915081905092915050565b5f60a082019050614cf45f830188613c48565b614d016020830187613c48565b614d0e6040830186613f86565b614d1b6060830185613f86565b614d286080830184613c48565b9695505050505050565b5f606082019050614d455f830186613c48565b614d526020830185613c48565b614d5f6040830184613c48565b949350505050565b614d708161365f565b82525050565b5f602082019050614d895f830184614d67565b92915050565b5f6060820190508181035f830152614da88186886146e8565b9050614db76020830185613f86565b614dc46040830184613f86565b95945050505050565b5f608082019050614de05f830187613c48565b614ded6020830186614d67565b614dfa6040830185613c48565b614e076060830184613c48565b95945050505050565b5f604082019050614e235f830186613c48565b8181036020830152614e368184866146e8565b9050949350505050565b5f81519050614e4e81613d79565b92915050565b5f60208284031215614e6957614e68613542565b5b5f614e7684828501614e40565b91505092915050565b5f606082019050614e925f830187613c48565b614e9f6020830186613dce565b8181036040830152614eb28184866146e8565b905095945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f82015250565b5f614ef1601c83614a30565b9150614efc82614ebd565b601c82019050919050565b5f614f1182614ee5565b9150614f1d8284614a8d565b60208201915081905092915050565b5f6040820190508181035f830152614f448186614608565b90508181036020830152614f598184866146e8565b9050949350505050565b5f60208284031215614f7857614f77613542565b5b5f614f8584828501614b08565b91505092915050565b5f614f98826143c6565b614fa281856134e5565b9350614fb28185602086016143e0565b80840191505092915050565b5f614fc98285614f8e565b9150614fd58284614a8d565b6020820191508190509392505050565b7f53657175656e6365207369676e65723a0a0000000000000000000000000000005f82015250565b5f615019601183614a30565b915061502482614fe5565b601182019050919050565b5f8160601b9050919050565b5f6150458261502f565b9050919050565b5f6150568261503b565b9050919050565b61506e61506982613569565b61504c565b82525050565b5f819050919050565b61508e615089826136fd565b615074565b82525050565b5f61509e8261500d565b91506150aa828561505d565b6014820191506150ba828461507d565b6020820191508190509392505050565b7f53657175656e6365206e657374656420636f6e6669673a0a00000000000000005f82015250565b5f6150fe601883614a30565b9150615109826150ca565b601882019050919050565b5f61511e826150f2565b915061512a8286614a8d565b60208201915061513a828561507d565b60208201915061514a828461507d565b602082019150819050949350505050565b7f53657175656e636520737461746963206469676573743a0a00000000000000005f82015250565b5f61518f601883614a30565b915061519a8261515b565b601882019050919050565b5f6151af82615183565b91506151bb8284614a8d565b60208201915081905092915050565b7f53657175656e636520616e792061646472657373207375626469676573743a0a5f82015250565b5f6151fe602083614a30565b9150615209826151ca565b602082019050919050565b5f61521e826151f2565b915061522a8284614a8d565b60208201915081905092915050565b7f53657175656e63652073617069656e7420636f6e6669673a0a000000000000005f82015250565b5f61526d601983614a30565b915061527882615239565b601982019050919050565b5f61528d82615261565b9150615299828661505d565b6014820191506152a9828561507d565b6020820191506152b98284614a8d565b602082019150819050949350505050565b5f610100820190506152de5f83018b613c48565b6152eb602083018a613dce565b6152f86040830189613f86565b6153056060830188613c48565b6153126080830187613f86565b61531f60a0830186613fd5565b61532c60c0830185613fd5565b61533960e0830184613f86565b999850505050505050505056fea264697066735822122019b5533fc4cbee24a73438e1a10df64732fe25b8872932ba010c1d5c7babb5eb64736f6c634300081c0033", + "deployedBytecode": "0x608060405260043610610117575f3560e01c80636ea445771161009f578063ad55366b11610063578063ad55366b14610475578063b93ea7ad146104b6578063bc197c81146104d2578063f23a6e611461050e578063f727ef1c1461054a5761011e565b80636ea445771461038e5780638943ec02146103aa5780638c3f5563146103d257806392dcb3fc1461040e578063aaf10f421461044b5761011e565b80631a9b2337116100e65780631a9b2337146102c85780631f6a1eb91461030457806329561426146103205780634fcf3eca1461034857806351605d80146103645761011e565b8063025b22bc146101f857806313792a4a14610214578063150b7a02146102505780631626ba7e1461028c5761011e565b3661011e57005b60045f369050106101f6575f61013f5f369061013a9190613487565b610572565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146101f4575f5f8273ffffffffffffffffffffffffffffffffffffffff165f3660405161019d929190613521565b5f60405180830381855af49150503d805f81146101d5576040519150601f19603f3d011682016040523d82523d5f602084013e6101da565b606091505b5091509150816101ec57805160208201fd5b805160208201f35b505b005b610212600480360381019061020d91906135a4565b6105c7565b005b34801561021f575f5ffd5b5061023a60048036038101906102359190613bcf565b610643565b6040516102479190613c57565b60405180910390f35b34801561025b575f5ffd5b5061027660048036038101906102719190613c70565b6107f2565b6040516102839190613d03565b60405180910390f35b348015610297575f5ffd5b506102b260048036038101906102ad9190613d1c565b610806565b6040516102bf9190613d03565b60405180910390f35b3480156102d3575f5ffd5b506102ee60048036038101906102e99190613da3565b610848565b6040516102fb9190613ddd565b60405180910390f35b61031e60048036038101906103199190613df6565b610859565b005b34801561032b575f5ffd5b5061034660048036038101906103419190613e74565b6108e8565b005b610362600480360381019061035d9190613da3565b610964565b005b34801561036f575f5ffd5b50610378610a59565b6040516103859190613c57565b60405180910390f35b6103a860048036038101906103a39190613e9f565b610a8a565b005b3480156103b5575f5ffd5b506103d060048036038101906103cb9190613eea565b610b29565b005b3480156103dd575f5ffd5b506103f860048036038101906103f39190613f5b565b610b2f565b6040516104059190613f95565b60405180910390f35b348015610419575f5ffd5b50610434600480360381019061042f9190613e74565b610b67565b604051610442929190613fae565b60405180910390f35b348015610456575f5ffd5b5061045f610b7b565b60405161046c9190613ddd565b60405180910390f35b348015610480575f5ffd5b5061049b60048036038101906104969190613bcf565b610b89565b6040516104ad96959493929190613fe4565b60405180910390f35b6104d060048036038101906104cb9190614043565b610bc7565b005b3480156104dd575f5ffd5b506104f860048036038101906104f391906140d6565b610cbd565b6040516105059190613d03565b60405180910390f35b348015610519575f5ffd5b50610534600480360381019061052f91906141ad565b610cd4565b6040516105419190613d03565b60405180910390f35b348015610555575f5ffd5b50610570600480360381019061056b9190614284565b610ce9565b005b5f6105be7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1205f1b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916610db2565b5f1c9050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461063757336040517fa19dbf0000000000000000000000000000000000000000000000000000000000815260040161062e9190613ddd565b60405180910390fd5b61064081610dea565b50565b5f5f6001856101000151516106589190614301565b67ffffffffffffffff811115610671576106706135e3565b5b60405190808252806020026020018201604052801561069f5781602001602082028036833780820191505090505b5090505f5f90505b8561010001515181101561072f5785610100015181815181106106cd576106cc614334565b5b60200260200101518282815181106106e8576106e7614334565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506106a7565b503381866101000151518151811061074a57610749614334565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808561010001819052505f61079a868686610e2d565b509050806107e3578585856040517ff58cc8b50000000000000000000000000000000000000000000000000000000081526004016107da93929190614714565b60405180910390fd5b60015f1b925050509392505050565b5f63150b7a0260e01b905095945050505050565b5f5f6108118561101d565b90505f61081f828686610e2d565b50905080610834575f60e01b92505050610841565b6320c13b0b60e01b925050505b9392505050565b5f61085282610572565b9050919050565b5f5a90505f6108688686611046565b905061087c816060015182608001516114e8565b5f5f610889838787610e2d565b91509150816108d3578286866040517fa2b6d61b0000000000000000000000000000000000000000000000000000000081526004016108ca93929190614714565b60405180910390fd5b6108de84828561158c565b5050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461095857336040517fa19dbf0000000000000000000000000000000000000000000000000000000000815260040161094f9190613ddd565b60405180910390fd5b610961816118bc565b50565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109d457336040517fa19dbf000000000000000000000000000000000000000000000000000000000081526004016109cb9190613ddd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff166109f482610572565b73ffffffffffffffffffffffffffffffffffffffff1603610a4c57806040517f1c3812cc000000000000000000000000000000000000000000000000000000008152600401610a439190613d03565b60405180910390fd5b610a56815f61195d565b50565b5f610a857fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b6119fe565b905090565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610afa57336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610af19190613ddd565b60405180910390fd5b5f5a90505f610b098484611046565b90505f610b1582611a08565b9050610b2283828461158c565b5050505050565b50505050565b5f610b5e7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e5f1b835f1b610db2565b5f1c9050919050565b5f5f610b7283611a58565b91509150915091565b5f610b84611aa9565b905090565b5f5f5f5f5f5f610b9c8989895f5f611ab1565b809550819650829750839950849a505050505050610bb983611dee565b935093975093979195509350565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c3757336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610c2e9190613ddd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16610c5783610572565b73ffffffffffffffffffffffffffffffffffffffff1614610caf57816040517f5b4d6d6a000000000000000000000000000000000000000000000000000000008152600401610ca69190613d03565b60405180910390fd5b610cb9828261195d565b5050565b5f63bc197c8160e01b905098975050505050505050565b5f63f23a6e6160e01b90509695505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d5957336040517fa19dbf00000000000000000000000000000000000000000000000000000000008152600401610d509190613ddd565b60405180910390fd5b610d728383836bffffffffffffffffffffffff16611dff565b7febf265acfac1c01de588ed7ef49743b9c3ce8d6d1edeaf510a1f5453228515b1838383604051610da59392919061475a565b60405180910390a1505050565b5f5f8383604051602001610dc792919061478f565b604051602081830303815290604052805190602001209050805491505092915050565b610df381611e5d565b7f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca0381604051610e229190613ddd565b60405180910390a150565b5f5f5f84845f818110610e4357610e42614334565b5b9050013560f81c60f81b9050608060f81b608060f81b82167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f9c57610e8b86611a08565b91505f5f610e9884611a58565b91509150428111610ee25783816040517ff95b6ab7000000000000000000000000000000000000000000000000000000008152600401610ed99291906147b6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610f4a57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15610f90578333836040517f8945c313000000000000000000000000000000000000000000000000000000008152600401610f87939291906147dd565b60405180910390fd5b60019450505050611015565b5f5f5f610fac8989895f5f611ab1565b905080985081945082955083965050505050828210156110055782826040517ffd41fcba000000000000000000000000000000000000000000000000000000008152600401610ffc929190614812565b60405180910390fd5b61100e81611dee565b9550505050505b935093915050565b611025613392565b6003815f019060ff16908160ff1681525050818160e0018181525050919050565b61104e613392565b5f815f019060ff16908160ff16815250505f5f61106b8585611e63565b915060ff16915060018083160361108b575f8360600181815250506110c7565b6110a0818686611e799290919263ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff169150846060018193508281525050505b5f6007600184901c1690505f811115611104576110f682828888611eaa9190939291909392919063ffffffff16565b856080018194508281525050505b5f6010808516036111185760019050611170565b60208085160361114b57611137838888611ed79290919263ffffffff16565b8161ffff169150809450819250505061116f565b611160838888611ef69290919263ffffffff16565b8160ff16915080945081925050505b5b8067ffffffffffffffff81111561118a576111896135e3565b5b6040519080825280602002602001820160405280156111c357816020015b6111b06133dd565b8152602001906001900390816111a85790505b5085604001819052505f5f90505b818110156114dd575f6111ef858a8a611ef69290919263ffffffff16565b8096508192505050600180821660ff160361125e57308760400151838151811061121c5761121b614334565b5b60200260200101515f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506112ca565b611273858a8a611f119290919263ffffffff16565b8860400151848151811061128a57611289614334565b5b60200260200101515f018197508273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050505b600280821660ff1603611318576112ec858a8a611f429290919263ffffffff16565b8860400151848151811061130357611302614334565b5b60200260200101516020018197508281525050505b600480821660ff16036113e0575f61133b868b8b611f589290919263ffffffff16565b8162ffffff169150809750819250505089898790838961135b9190614301565b9261136893929190614841565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050886040015184815181106113c1576113c0614334565b5b60200260200101516040018190525080866113dc9190614301565b9550505b600880821660ff160361142e57611402858a8a611f429290919263ffffffff16565b8860400151848151811061141957611418614334565b5b60200260200101516060018197508281525050505b601080821660ff16148760400151838151811061144e5761144d614334565b5b60200260200101516080019015159081151581525050602080821660ff16148760400151838151811061148457611483614334565b5b602002602001015160a0019015159081151581525050600660c0821660ff16901c60ff16876040015183815181106114bf576114be614334565b5b602002602001015160c00181815250505080806001019150506111d1565b505050505092915050565b5f6114f283610b2f565b905081811461153c578282826040517f9b6514f40000000000000000000000000000000000000000000000000000000081526004016115339392919061487b565b60405180910390fd5b5f60018301905061154d8482611f78565b7f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881848260405161157e929190614812565b60405180910390a150505050565b5f5f90505f82604001515190505f5f90505b818110156118b4575f846040015182815181106115be576115bd614334565b5b602002602001015190508060a0015180156115d7575083155b1561161b577f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b868360405161160d9291906147b6565b60405180910390a1506118a7565b5f93505f816060015190505f81141580156116355750805a105b1561167b5785835a6040517f21395274000000000000000000000000000000000000000000000000000000008152600401611672939291906148b0565b60405180910390fd5b5f82608001511561173057611729835f01515f841461169a578361169c565b5a5b634c4e814c60e01b8b8d898b8e606001518b604001516040516024016116c796959493929190614924565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611fad565b9050611758565b611755835f015184602001515f8514611749578461174b565b5a5b8660400151611fc2565b90505b8061186a575f60ff168360c00151036117b957600195507f115f347c00e69f252cd6b63c4f81022a9564c6befe8aa719cb74640a4a306f0d888561179a611fd9565b6040516117a99392919061498a565b60405180910390a15050506118a7565b600160ff168360c00151036118105786846117d2611fd9565b6040517f7f6b0bb1000000000000000000000000000000000000000000000000000000008152600401611807939291906149c6565b60405180910390fd5b600260ff168360c0015103611869577fc2c704302430fe0dc8d95f272e2f4e54bbbc51a3327fd5d75ab41f9fc8fd129b888561184a611fd9565b6040516118599392919061498a565b60405180910390a15050506118b4565b5b7f5a589b1d8062f33451d29cae3dabd9b2e36c62aee644178c600977ca8dda661a888560405161189b9291906147b6565b60405180910390a15050505b808060010191505061159e565b505050505050565b5f5f1b81036118f7576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119237fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b82611ff7565b7f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa816040516119529190613c57565b60405180910390a150565b6119c17fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1205f1b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff165f1b611ffe565b7f0d7fc113eaf016db4681a1ba86d083ce3e0961f321062a75ac2b0aeb33deeed182826040516119f2929190614a09565b60405180910390a15050565b5f81549050919050565b5f5f611a18836020015130612033565b90505f611a24846120d7565b90508181604051602001611a39929190614aa4565b6040516020818303038152906040528051906020012092505050919050565b5f5f5f611a877fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e865f1b85610db2565b5f1c9050606081901c816bffffffffffffffffffffffff169250925050915091565b5f3054905090565b5f5f5f5f5f5f5f611ac28b8b611e63565b915060ff169150611ad161342e565b6040808416148015611b0e57505f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16145b15611c4a57611b28828d8d611f119290919263ffffffff16565b809350819a50505089611c49575f611b4b838e8e611f589290919263ffffffff16565b8162ffffff16915080945081925050505f8d8d85908487611b6c9190614301565b92611b7993929190614841565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505090508a73ffffffffffffffffffffffffffffffffffffffff1663ccce3bc830836040518363ffffffff1660e01b8152600401611bf8929190614ada565b6040805180830381865afa158015611c12573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c369190614b7d565b92508184611c449190614301565b935050505b5b600180841603611c8357611c718d8a838f8f87908092611c6c93929190614841565b61230b565b97509750975097509750505050611de1565b6002808416148d60200190151590811515815250505f6002601c8516901c9050611cbf83828f8f611eaa9190939291909392919063ffffffff16565b8094508197505050505f6001600560208616901c611cdd9190614301565b9050611cfb83828f8f611eaa9190939291909392919063ffffffff16565b809450819a50505050611d0d8d611a08565b9350611d2b8d858e8e86908092611d2693929190614841565b61256d565b8097508198505050611d3f86895f1b6130e1565b9550611d4d86865f1b6130e1565b9550611d71868a73ffffffffffffffffffffffffffffffffffffffff165f1b6130e1565b95505f5f1b815f015114158015611d8b575085815f015114155b8015611d9b575080602001518511155b15611ddd57806040517fccbb534f000000000000000000000000000000000000000000000000000000008152600401611dd49190614bd5565b60405180910390fd5b5050505b9550955095509550959050565b5f611df8826130f5565b9050919050565b611e587fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e865f1b846bffffffffffffffffffffffff841660608673ffffffffffffffffffffffffffffffffffffffff16901b175f1b611ffe565b505050565b80305550565b5f5f83358060f81c925060019150509250929050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f858401356008840261010003600180866008021b0382821c1693508486019250505094509492505050565b5f5f8483013561ffff8160f01c16925060028401915050935093915050565b5f5f848301358060f81c925060018401915050935093915050565b5f5f8483013573ffffffffffffffffffffffffffffffffffffffff8160601c16925060148401915050935093915050565b5f5f848301359150602083019050935093915050565b5f5f8483013562ffffff8160e81c16925060038401915050935093915050565b611fa97f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e5f1b835f1b835f1b611ffe565b5050565b5f5f5f8351602085018787f490509392505050565b5f5f5f835160208501878988f19050949350505050565b60603d604051915060208201818101604052818352815f823e505090565b8082555050565b5f838360405160200161201292919061478f565b60405160208183030381529060405280519060200120905081815550505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de856120a257466120a4565b5f5b856040516020016120b9959493929190614bee565b60405160208183030381529060405280519060200120905092915050565b5f5f8261010001516040516020016120ef9190614ccb565b6040516020818303038152906040528051906020012090505f60ff16835f015160ff1603612187575f6121258460400151613138565b90507f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2818560600151866080015185604051602001612168959493929190614ce1565b6040516020818303038152906040528051906020012092505050612306565b600160ff16835f015160ff16036121f6577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360a0015180519060200120826040516020016121d893929190614d32565b60405160208183030381529060405280519060200120915050612306565b600260ff16835f015160ff160361225e577f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e48360c001518260405160200161224093929190614d32565b60405160208183030381529060405280519060200120915050612306565b600360ff16835f015160ff16036122c6577fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d4668360e00151826040516020016122a893929190614d32565b60405160208183030381529060405280519060200120915050612306565b825f01516040517f048183200000000000000000000000000000000000000000000000000000000081526004016122fd9190614d76565b60405180910390fd5b919050565b5f5f5f5f5f612318613392565b6002815f019060ff16908160ff16815250505f5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505b89899050821015612502575f5f612372848d8d611f589290919263ffffffff16565b8162ffffff1691508095508192505050838161238e9190614301565b9150505f8b8b905082146123a2575f6123a4565b8d5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303612404576123eb8f8d8d879086926123e393929190614841565b600185611ab1565b809a50819b50829c50839d50849e505050505050612434565b612422858d8d8790869261241a93929190614841565b600185611ab1565b50809a50819b50829c50839d50505050505b8989101561248f578b8b8590849261244e93929190614841565b8b8b6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016124869493929190614d8f565b60405180910390fd5b819350878d5f0151036124a8575f5f1b8d5f0181815250505b8287106124ee5786836040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004016124e5929190614812565b60405180910390fd5b878560c00181815250508692505050612350565b5f5f1b8b5f01511415801561251b57508a602001518511155b1561255d578a6040517fccbb534f0000000000000000000000000000000000000000000000000000000081526004016125549190614bd5565b60405180910390fd5b5050509550955095509550959050565b5f5f5f5b848490508110156130d7575f612592828787611ef69290919263ffffffff16565b8160ff16915080935081925050505f600460f08316901c90505f81036126ea575f600f831690505f8160ff16036125e1576125d8848989611ef69290919263ffffffff16565b80955081925050505b5f5f6125f8868b8b6131b29290919263ffffffff16565b8097508193505050612615868b8b6131b29290919263ffffffff16565b80975081925050505f60ff82901c5f1c90505f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835f1c165f1b90505f601b830190505f60018f8388866040515f815260200160405260405161267b9493929190614dcd565b6020604051602081039080840390855afa15801561269b573d5f5f3e3d5ffd5b5050506020604051035190508660ff168c019b505f6126bd828960ff166131c8565b90505f5f1b8c036126ce57806126d9565b6126d88c826130e1565b5b9b5050505050505050505050612571565b60018103612775575f600f831690505f8160ff160361272157612718848989611ef69290919263ffffffff16565b80955081925050505b5f612737858a8a611f119290919263ffffffff16565b80965081925050505f61274d828460ff166131c8565b90505f5f1b870361275e5780612769565b61276887826130e1565b5b96505050505050612571565b60028103612974575f6003831690505f8160ff16036127ac576127a3848989611ef69290919263ffffffff16565b80955081925050505b5f6127c2858a8a611f119290919263ffffffff16565b80965081925050505f6002600c861660ff16901c60ff1690505f6127f887838d8d611eaa9190939291909392919063ffffffff16565b80985081925050505f81880190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff16631626ba7e8f8f8f8d90879261285c93929190614841565b6040518463ffffffff1660e01b815260040161287a93929190614e10565b602060405180830381865afa158015612895573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128b99190614e54565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612930578c848d8d8b9085926128f193929190614841565b6040517fb2fed7ae0000000000000000000000000000000000000000000000000000000081526004016129279493929190614e7f565b60405180910390fd5b8097508460ff168a0199505f612949858760ff166131c8565b90505f5f1b8a0361295a5780612965565b6129648a826130e1565b5b99505050505050505050612571565b600381036129be575f6129928489896131b29290919263ffffffff16565b80955081925050505f5f1b85036129a957806129b4565b6129b385826130e1565b5b9450505050612571565b60048103612a3d575f600f831660ff1690505f6129ed85838b8b611eaa9190939291909392919063ffffffff16565b80965081925050505f81860190505f5f612a198e8e8e8e8c908892612a1493929190614841565b61256d565b91509150829750818a019950612a2f89826130e1565b985050505050505050612571565b60068103612b4d575f6002600c841660ff16901c60ff1690505f8103612a8157612a72848989611ef69290919263ffffffff16565b8160ff16915080955081925050505b5f6003841660ff1690505f8103612ab757612aa7858a8a611ed79290919263ffffffff16565b8161ffff16915080965081925050505b5f612acd868b8b611f589290919263ffffffff16565b8162ffffff16915080975081925050505f81870190505f5f612b018f8f8f8f8d908892612afc93929190614841565b61256d565b91509150829850848210612b1557858b019a505b5f612b218287896131fa565b90505f5f1b8b03612b325780612b3d565b612b3c8b826130e1565b5b9a50505050505050505050612571565b60058103612bcf575f612b6b8489896131b29290919263ffffffff16565b8095508192505050888103612b9e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505b5f612ba88261322f565b90505f5f1b8603612bb95780612bc4565b612bc386826130e1565b5b955050505050612571565b60078103612d35575f600f831690505f8160ff1603612c0657612bfd848989611ef69290919263ffffffff16565b80955081925050505b5f5f612c1d868b8b6131b29290919263ffffffff16565b8097508193505050612c3a868b8b6131b29290919263ffffffff16565b80975081925050505f60ff82901c5f1c90505f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff835f1c165f1b90505f601b830190505f60018f604051602001612c919190614f07565b604051602081830303815290604052805190602001208388866040515f8152602001604052604051612cc69493929190614dcd565b6020604051602081039080840390855afa158015612ce6573d5f5f3e3d5ffd5b5050506020604051035190508660ff168c019b505f612d08828960ff166131c8565b90505f5f1b8c03612d195780612d24565b612d238c826130e1565b5b9b5050505050505050505050612571565b60088103612dce575f612d538489896131b29290919263ffffffff16565b80955081925050505f612d6f5f8c61325e90919063ffffffff16565b9050808203612d9c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505b5f612da6836132af565b90505f5f1b8703612db75780612dc2565b612dc187826130e1565b5b96505050505050612571565b60098103612f34575f6003831690505f8160ff1603612e0557612dfc848989611ef69290919263ffffffff16565b80955081925050505b5f612e1b858a8a611f119290919263ffffffff16565b80965081925050505f5f6002600c871660ff16901c60ff169050612e5187828d8d611eaa9190939291909392919063ffffffff16565b8098508193505050505f81870190505f8373ffffffffffffffffffffffffffffffffffffffff166313792a4a8f8e8e8c908792612e9093929190614841565b6040518463ffffffff1660e01b8152600401612eae93929190614f2c565b602060405180830381865afa158015612ec9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eed9190614f63565b90508197508460ff168a0199505f612f09858760ff16846132de565b90505f5f1b8a03612f1a5780612f25565b612f248a826130e1565b5b99505050505050505050612571565b600a810361309a575f6003831690505f8160ff1603612f6b57612f62848989611ef69290919263ffffffff16565b80955081925050505b5f612f81858a8a611f119290919263ffffffff16565b80965081925050505f6002600c861660ff16901c60ff1690505f612fb787838d8d611eaa9190939291909392919063ffffffff16565b80985081925050505f81880190505f8473ffffffffffffffffffffffffffffffffffffffff1663898bd9218f8f8f8d908792612ff593929190614841565b6040518463ffffffff1660e01b815260040161301393929190614e10565b602060405180830381865afa15801561302e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130529190614f63565b90508198508560ff168b019a505f61306e868860ff16846132de565b90505f5f1b8b0361307f578061308a565b6130898b826130e1565b5b9a50505050505050505050612571565b806040517fb2505f7c0000000000000000000000000000000000000000000000000000000081526004016130ce9190613f95565b60405180910390fd5b5094509492505050565b5f825f528160205260405f20905092915050565b5f5f5f1b8214158015613131575061312e7fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85f1b6119fe565b82145b9050919050565b5f60605f5f90505b83518110156131a1575f61316d8583815181106131605761315f614334565b5b6020026020010151613313565b90508281604051602001613182929190614fbe565b6040516020818303038152906040529250508080600101915050613140565b508080519060200120915050919050565b5f5f848301359150602083019050935093915050565b5f82826040516020016131dc929190615094565b60405160208183030381529060405280519060200120905092915050565b5f83838360405160200161321093929190615114565b6040516020818303038152906040528051906020012090509392505050565b5f8160405160200161324191906151a5565b604051602081830303815290604052805190602001209050919050565b5f5f61326e846020015184612033565b90505f61327a856120d7565b9050818160405160200161328f929190614aa4565b604051602081830303815290604052805190602001209250505092915050565b5f816040516020016132c19190615214565b604051602081830303815290604052805190602001209050919050565b5f8383836040516020016132f493929190615283565b6040516020818303038152906040528051906020012090509392505050565b5f7f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437825f01518360200151846040015180519060200120856060015186608001518760a001518860c001516040516020016133759897969594939291906152ca565b604051602081830303815290604052805190602001209050919050565b6040518061012001604052805f60ff1681526020015f15158152602001606081526020015f81526020015f8152602001606081526020015f81526020015f8152602001606081525090565b6040518060e001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f8152602001606081526020015f81526020015f151581526020015f151581526020015f81525090565b60405180604001604052805f81526020015f81525090565b5f82905092915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b5f82821b905092915050565b5f6134928383613446565b8261349d8135613450565b925060048210156134dd576134d87fffffffff000000000000000000000000000000000000000000000000000000008360040360080261347b565b831692505b505092915050565b5f81905092915050565b828183375f83830152505050565b5f61350883856134e5565b93506135158385846134ef565b82840190509392505050565b5f61352d8284866134fd565b91508190509392505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6135738261354a565b9050919050565b61358381613569565b811461358d575f5ffd5b50565b5f8135905061359e8161357a565b92915050565b5f602082840312156135b9576135b8613542565b5b5f6135c684828501613590565b91505092915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613619826135d3565b810181811067ffffffffffffffff82111715613638576136376135e3565b5b80604052505050565b5f61364a613539565b90506136568282613610565b919050565b5f5ffd5b5f60ff82169050919050565b6136748161365f565b811461367e575f5ffd5b50565b5f8135905061368f8161366b565b92915050565b5f8115159050919050565b6136a981613695565b81146136b3575f5ffd5b50565b5f813590506136c4816136a0565b92915050565b5f5ffd5b5f67ffffffffffffffff8211156136e8576136e76135e3565b5b602082029050602081019050919050565b5f5ffd5b5f819050919050565b61370f816136fd565b8114613719575f5ffd5b50565b5f8135905061372a81613706565b92915050565b5f5ffd5b5f67ffffffffffffffff82111561374e5761374d6135e3565b5b613757826135d3565b9050602081019050919050565b5f61377661377184613734565b613641565b90508281526020810184848401111561379257613791613730565b5b61379d8482856134ef565b509392505050565b5f82601f8301126137b9576137b86136ca565b5b81356137c9848260208601613764565b91505092915050565b5f60e082840312156137e7576137e66135cf565b5b6137f160e0613641565b90505f61380084828501613590565b5f8301525060206138138482850161371c565b602083015250604082013567ffffffffffffffff8111156138375761383661365b565b5b613843848285016137a5565b60408301525060606138578482850161371c565b606083015250608061386b848285016136b6565b60808301525060a061387f848285016136b6565b60a08301525060c06138938482850161371c565b60c08301525092915050565b5f6138b16138ac846136ce565b613641565b905080838252602082019050602084028301858111156138d4576138d36136f9565b5b835b8181101561391b57803567ffffffffffffffff8111156138f9576138f86136ca565b5b80860161390689826137d2565b855260208501945050506020810190506138d6565b5050509392505050565b5f82601f830112613939576139386136ca565b5b813561394984826020860161389f565b91505092915050565b5f819050919050565b61396481613952565b811461396e575f5ffd5b50565b5f8135905061397f8161395b565b92915050565b5f67ffffffffffffffff82111561399f5761399e6135e3565b5b602082029050602081019050919050565b5f6139c26139bd84613985565b613641565b905080838252602082019050602084028301858111156139e5576139e46136f9565b5b835b81811015613a0e57806139fa8882613590565b8452602084019350506020810190506139e7565b5050509392505050565b5f82601f830112613a2c57613a2b6136ca565b5b8135613a3c8482602086016139b0565b91505092915050565b5f6101208284031215613a5b57613a5a6135cf565b5b613a66610120613641565b90505f613a7584828501613681565b5f830152506020613a88848285016136b6565b602083015250604082013567ffffffffffffffff811115613aac57613aab61365b565b5b613ab884828501613925565b6040830152506060613acc8482850161371c565b6060830152506080613ae08482850161371c565b60808301525060a082013567ffffffffffffffff811115613b0457613b0361365b565b5b613b10848285016137a5565b60a08301525060c0613b2484828501613971565b60c08301525060e0613b3884828501613971565b60e08301525061010082013567ffffffffffffffff811115613b5d57613b5c61365b565b5b613b6984828501613a18565b6101008301525092915050565b5f5ffd5b5f5f83601f840112613b8f57613b8e6136ca565b5b8235905067ffffffffffffffff811115613bac57613bab613b76565b5b602083019150836001820283011115613bc857613bc76136f9565b5b9250929050565b5f5f5f60408486031215613be657613be5613542565b5b5f84013567ffffffffffffffff811115613c0357613c02613546565b5b613c0f86828701613a45565b935050602084013567ffffffffffffffff811115613c3057613c2f613546565b5b613c3c86828701613b7a565b92509250509250925092565b613c5181613952565b82525050565b5f602082019050613c6a5f830184613c48565b92915050565b5f5f5f5f5f60808688031215613c8957613c88613542565b5b5f613c9688828901613590565b9550506020613ca788828901613590565b9450506040613cb88882890161371c565b935050606086013567ffffffffffffffff811115613cd957613cd8613546565b5b613ce588828901613b7a565b92509250509295509295909350565b613cfd81613450565b82525050565b5f602082019050613d165f830184613cf4565b92915050565b5f5f5f60408486031215613d3357613d32613542565b5b5f613d4086828701613971565b935050602084013567ffffffffffffffff811115613d6157613d60613546565b5b613d6d86828701613b7a565b92509250509250925092565b613d8281613450565b8114613d8c575f5ffd5b50565b5f81359050613d9d81613d79565b92915050565b5f60208284031215613db857613db7613542565b5b5f613dc584828501613d8f565b91505092915050565b613dd781613569565b82525050565b5f602082019050613df05f830184613dce565b92915050565b5f5f5f5f60408587031215613e0e57613e0d613542565b5b5f85013567ffffffffffffffff811115613e2b57613e2a613546565b5b613e3787828801613b7a565b9450945050602085013567ffffffffffffffff811115613e5a57613e59613546565b5b613e6687828801613b7a565b925092505092959194509250565b5f60208284031215613e8957613e88613542565b5b5f613e9684828501613971565b91505092915050565b5f5f60208385031215613eb557613eb4613542565b5b5f83013567ffffffffffffffff811115613ed257613ed1613546565b5b613ede85828601613b7a565b92509250509250929050565b5f5f5f5f60608587031215613f0257613f01613542565b5b5f613f0f87828801613590565b9450506020613f208782880161371c565b935050604085013567ffffffffffffffff811115613f4157613f40613546565b5b613f4d87828801613b7a565b925092505092959194509250565b5f60208284031215613f7057613f6f613542565b5b5f613f7d8482850161371c565b91505092915050565b613f8f816136fd565b82525050565b5f602082019050613fa85f830184613f86565b92915050565b5f604082019050613fc15f830185613dce565b613fce6020830184613f86565b9392505050565b613fde81613695565b82525050565b5f60c082019050613ff75f830189613f86565b6140046020830188613f86565b6140116040830187613fd5565b61401e6060830186613c48565b61402b6080830185613f86565b61403860a0830184613c48565b979650505050505050565b5f5f6040838503121561405957614058613542565b5b5f61406685828601613d8f565b925050602061407785828601613590565b9150509250929050565b5f5f83601f840112614096576140956136ca565b5b8235905067ffffffffffffffff8111156140b3576140b2613b76565b5b6020830191508360208202830111156140cf576140ce6136f9565b5b9250929050565b5f5f5f5f5f5f5f5f60a0898b0312156140f2576140f1613542565b5b5f6140ff8b828c01613590565b98505060206141108b828c01613590565b975050604089013567ffffffffffffffff81111561413157614130613546565b5b61413d8b828c01614081565b9650965050606089013567ffffffffffffffff8111156141605761415f613546565b5b61416c8b828c01614081565b9450945050608089013567ffffffffffffffff81111561418f5761418e613546565b5b61419b8b828c01613b7a565b92509250509295985092959890939650565b5f5f5f5f5f5f60a087890312156141c7576141c6613542565b5b5f6141d489828a01613590565b96505060206141e589828a01613590565b95505060406141f689828a0161371c565b945050606061420789828a0161371c565b935050608087013567ffffffffffffffff81111561422857614227613546565b5b61423489828a01613b7a565b92509250509295509295509295565b5f6bffffffffffffffffffffffff82169050919050565b61426381614243565b811461426d575f5ffd5b50565b5f8135905061427e8161425a565b92915050565b5f5f5f6060848603121561429b5761429a613542565b5b5f6142a886828701613971565b93505060206142b986828701613590565b92505060406142ca86828701614270565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61430b826136fd565b9150614316836136fd565b925082820190508082111561432e5761432d6142d4565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b61436a8161365f565b82525050565b61437981613695565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6143b181613569565b82525050565b6143c0816136fd565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6143f8826143c6565b61440281856143d0565b93506144128185602086016143e0565b61441b816135d3565b840191505092915050565b5f60e083015f83015161443b5f8601826143a8565b50602083015161444e60208601826143b7565b506040830151848203604086015261446682826143ee565b915050606083015161447b60608601826143b7565b50608083015161448e6080860182614370565b5060a08301516144a160a0860182614370565b5060c08301516144b460c08601826143b7565b508091505092915050565b5f6144ca8383614426565b905092915050565b5f602082019050919050565b5f6144e88261437f565b6144f28185614389565b93508360208202850161450485614399565b805f5b8581101561453f578484038952815161452085826144bf565b945061452b836144d2565b925060208a01995050600181019050614507565b50829750879550505050505092915050565b61455a81613952565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f61459483836143a8565b60208301905092915050565b5f602082019050919050565b5f6145b682614560565b6145c0818561456a565b93506145cb8361457a565b805f5b838110156145fb5781516145e28882614589565b97506145ed836145a0565b9250506001810190506145ce565b5085935050505092915050565b5f61012083015f83015161461e5f860182614361565b5060208301516146316020860182614370565b506040830151848203604086015261464982826144de565b915050606083015161465e60608601826143b7565b50608083015161467160808601826143b7565b5060a083015184820360a086015261468982826143ee565b91505060c083015161469e60c0860182614551565b5060e08301516146b160e0860182614551565b506101008301518482036101008601526146cb82826145ac565b9150508091505092915050565b5f82825260208201905092915050565b5f6146f383856146d8565b93506147008385846134ef565b614709836135d3565b840190509392505050565b5f6040820190508181035f83015261472c8186614608565b905081810360208301526147418184866146e8565b9050949350505050565b61475481614243565b82525050565b5f60608201905061476d5f830186613c48565b61477a6020830185613dce565b614787604083018461474b565b949350505050565b5f6040820190506147a25f830185613c48565b6147af6020830184613c48565b9392505050565b5f6040820190506147c95f830185613c48565b6147d66020830184613f86565b9392505050565b5f6060820190506147f05f830186613c48565b6147fd6020830185613dce565b61480a6040830184613dce565b949350505050565b5f6040820190506148255f830185613f86565b6148326020830184613f86565b9392505050565b5f5ffd5b5f5ffd5b5f5f8585111561485457614853614839565b5b838611156148655761486461483d565b5b6001850283019150848603905094509492505050565b5f60608201905061488e5f830186613f86565b61489b6020830185613f86565b6148a86040830184613f86565b949350505050565b5f6060820190508181035f8301526148c88186614608565b90506148d76020830185613f86565b6148e46040830184613f86565b949350505050565b5f6148f6826143c6565b61490081856146d8565b93506149108185602086016143e0565b614919816135d3565b840191505092915050565b5f60c0820190506149375f830189613c48565b6149446020830188613f86565b6149516040830187613f86565b61495e6060830186613f86565b61496b6080830185613f86565b81810360a083015261497d81846148ec565b9050979650505050505050565b5f60608201905061499d5f830186613c48565b6149aa6020830185613f86565b81810360408301526149bc81846148ec565b9050949350505050565b5f6060820190508181035f8301526149de8186614608565b90506149ed6020830185613f86565b81810360408301526149ff81846148ec565b9050949350505050565b5f604082019050614a1c5f830185613cf4565b614a296020830184613dce565b9392505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f614a6e600283614a30565b9150614a7982614a3a565b600282019050919050565b5f819050919050565b614a9e614a9982613952565b614a84565b82525050565b5f614aae82614a62565b9150614aba8285614a8d565b602082019150614aca8284614a8d565b6020820191508190509392505050565b5f604082019050614aed5f830185613dce565b8181036020830152614aff81846148ec565b90509392505050565b5f81519050614b168161395b565b92915050565b5f81519050614b2a81613706565b92915050565b5f60408284031215614b4557614b446135cf565b5b614b4f6040613641565b90505f614b5e84828501614b08565b5f830152506020614b7184828501614b1c565b60208301525092915050565b5f60408284031215614b9257614b91613542565b5b5f614b9f84828501614b30565b91505092915050565b604082015f820151614bbc5f850182614551565b506020820151614bcf60208501826143b7565b50505050565b5f604082019050614be85f830184614ba8565b92915050565b5f60a082019050614c015f830188613c48565b614c0e6020830187613c48565b614c1b6040830186613c48565b614c286060830185613f86565b614c356080830184613dce565b9695505050505050565b5f81905092915050565b614c5281613569565b82525050565b5f614c638383614c49565b60208301905092915050565b5f614c7982614560565b614c838185614c3f565b9350614c8e8361457a565b805f5b83811015614cbe578151614ca58882614c58565b9750614cb0836145a0565b925050600181019050614c91565b5085935050505092915050565b5f614cd68284614c6f565b915081905092915050565b5f60a082019050614cf45f830188613c48565b614d016020830187613c48565b614d0e6040830186613f86565b614d1b6060830185613f86565b614d286080830184613c48565b9695505050505050565b5f606082019050614d455f830186613c48565b614d526020830185613c48565b614d5f6040830184613c48565b949350505050565b614d708161365f565b82525050565b5f602082019050614d895f830184614d67565b92915050565b5f6060820190508181035f830152614da88186886146e8565b9050614db76020830185613f86565b614dc46040830184613f86565b95945050505050565b5f608082019050614de05f830187613c48565b614ded6020830186614d67565b614dfa6040830185613c48565b614e076060830184613c48565b95945050505050565b5f604082019050614e235f830186613c48565b8181036020830152614e368184866146e8565b9050949350505050565b5f81519050614e4e81613d79565b92915050565b5f60208284031215614e6957614e68613542565b5b5f614e7684828501614e40565b91505092915050565b5f606082019050614e925f830187613c48565b614e9f6020830186613dce565b8181036040830152614eb28184866146e8565b905095945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f82015250565b5f614ef1601c83614a30565b9150614efc82614ebd565b601c82019050919050565b5f614f1182614ee5565b9150614f1d8284614a8d565b60208201915081905092915050565b5f6040820190508181035f830152614f448186614608565b90508181036020830152614f598184866146e8565b9050949350505050565b5f60208284031215614f7857614f77613542565b5b5f614f8584828501614b08565b91505092915050565b5f614f98826143c6565b614fa281856134e5565b9350614fb28185602086016143e0565b80840191505092915050565b5f614fc98285614f8e565b9150614fd58284614a8d565b6020820191508190509392505050565b7f53657175656e6365207369676e65723a0a0000000000000000000000000000005f82015250565b5f615019601183614a30565b915061502482614fe5565b601182019050919050565b5f8160601b9050919050565b5f6150458261502f565b9050919050565b5f6150568261503b565b9050919050565b61506e61506982613569565b61504c565b82525050565b5f819050919050565b61508e615089826136fd565b615074565b82525050565b5f61509e8261500d565b91506150aa828561505d565b6014820191506150ba828461507d565b6020820191508190509392505050565b7f53657175656e6365206e657374656420636f6e6669673a0a00000000000000005f82015250565b5f6150fe601883614a30565b9150615109826150ca565b601882019050919050565b5f61511e826150f2565b915061512a8286614a8d565b60208201915061513a828561507d565b60208201915061514a828461507d565b602082019150819050949350505050565b7f53657175656e636520737461746963206469676573743a0a00000000000000005f82015250565b5f61518f601883614a30565b915061519a8261515b565b601882019050919050565b5f6151af82615183565b91506151bb8284614a8d565b60208201915081905092915050565b7f53657175656e636520616e792061646472657373207375626469676573743a0a5f82015250565b5f6151fe602083614a30565b9150615209826151ca565b602082019050919050565b5f61521e826151f2565b915061522a8284614a8d565b60208201915081905092915050565b7f53657175656e63652073617069656e7420636f6e6669673a0a000000000000005f82015250565b5f61526d601983614a30565b915061527882615239565b601982019050919050565b5f61528d82615261565b9150615299828661505d565b6014820191506152a9828561507d565b6020820191506152b98284614a8d565b602082019150819050949350505050565b5f610100820190506152de5f83018b613c48565b6152eb602083018a613dce565b6152f86040830189613f86565b6153056060830188613c48565b6153126080830187613f86565b61531f60a0830186613fd5565b61532c60c0830185613fd5565b61533960e0830184613f86565b999850505050505050505056fea264697066735822122019b5533fc4cbee24a73438e1a10df64732fe25b8872932ba010c1d5c7babb5eb64736f6c634300081c0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/Wallet.sol/Wallet.json b/testchain/artifacts/wallet-contracts-v3/Wallet.sol/Wallet.json new file mode 100644 index 00000000..ff243778 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/Wallet.sol/Wallet.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Wallet", + "sourceName": "src/Wallet.sol", + "abi": [], + "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122006810a8b042453f1e22e4ea22ad0c0938973f7afe38950b62340b5fae5cc7b6a64736f6c634300081b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122006810a8b042453f1e22e4ea22ad0c0938973f7afe38950b62340b5fae5cc7b6a64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/extensions/passkeys/Passkeys.sol/Passkeys.json b/testchain/artifacts/wallet-contracts-v3/extensions/passkeys/Passkeys.sol/Passkeys.json new file mode 100644 index 00000000..d3cdbb3a --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/extensions/passkeys/Passkeys.sol/Passkeys.json @@ -0,0 +1,93 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Passkeys", + "sourceName": "src/extensions/passkeys/Passkeys.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "authenticatorData", + "type": "bytes" + }, + { + "internalType": "string", + "name": "clientDataJSON", + "type": "string" + }, + { + "internalType": "uint256", + "name": "challengeIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "typeIndex", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct WebAuthn.WebAuthnAuth", + "name": "_webAuthnAuth", + "type": "tuple" + }, + { + "internalType": "bool", + "name": "_requireUserVerification", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "_x", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_y", + "type": "bytes32" + } + ], + "name": "InvalidPasskeySignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_digest", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverSapientSignatureCompact", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6080604052348015600f57600080fd5b50610be78061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063898bd92114610030575b600080fd5b61004361003e3660046107ba565b610055565b60405190815260200160405180910390f35b6000806000806000806100688888610100565b945094509450945094506100a08960405160200161008891815260200190565b60405160208183030381529060405285878686610492565b6100e757848484846040517f12a693e60000000000000000000000000000000000000000000000000000000081526004016100de949392919061089c565b60405180910390fd5b6100f3848484846105cc565b9998505050505050505050565b6040805160c081018252606080825260208201819052600092820183905281018290526080810182905260a0810182905290808080808787828161014657610146610942565b7fff000000000000000000000000000000000000000000000000000000000000009201359182169250507f200000000000000000000000000000000000000000000000000000000000000016600003610460577f010000000000000000000000000000000000000000000000000000000000000081161515945060ff600160f983901c8116810182169160fa84901c8216820181169160fb85901c8116810182169160fc86901c8216820116907f4000000000000000000000000000000000000000000000000000000000000000861615610225578c81013596506020015b60006102738e8e848992810135600884026101008190039190911c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600190921b9190910116939201919050565b8093508192505050600081830190508e8e8490839261029493929190610971565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508d60000181905250809250505060006103328e8e848892810135600884026101008190039190911c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600190921b9190910116939201919050565b8093508192505050600081830190508e8e8490839261035393929190610971565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060208e015291505060016008840290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018e830135610100929092039190911c1683820160408d0191909152905060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018e830135610100929092039190911c1682820160608d019190915290508c8101356020820160808d019190915290508c8101356020820160a08d019190915290508c8101356020820190995090508c81013597505050505050610487565b61046d876001818b610971565b81019061047a9190610abc565b9399509197509550935091505b509295509295909350565b60008060006104a388600180610613565b905060208601518051602082019150604088015160608901518451600d81017f226368616c6c656e6765223a220000000000000000000000000000000000000060981c87528484820110602282868901015160001a14168160138901208286890120141685846014011085851760801c107f2274797065223a22776562617574686e2e67657422000000000000000000000060581c8589015160581c14161698505080865250505087515189151560021b600117808160218c51015116146020831188161696505085156105a057602089510181810180516020600160208601856020868a8c60025afa60011b5afa51915295503d90506105a057fe5b50505082156105c1576105be8287608001518860a001518888610724565b92505b505095945050505050565b60008381526020839052604081208560006105f1828660009182526020526040902090565b9050610607838260009182526020526040902090565b98975050505050505050565b60608351801561071c576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526106708515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f18603f52602083018181018388602001018051600082525b60038a0199508951603f8160121c1651600053603f81600c1c1651600153603f8160061c1651600253603f81165160035350600051845260048401935082841061068f5790526020016040527f3d3d000000000000000000000000000000000000000000000000000000000000600384066002048083039190915260008615159091029182900352900382525b509392505050565b6000604051868152856020820152846040820152836060820152826080820152600080526020600060a0836101005afa503d6107845760203d60a0836dd01ea45f9efd5c54f037fa57ea1a5afa503d6107845763d0d5039b3d526004601cfd5b506000516001147f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8851110905095945050505050565b6000806000604084860312156107cf57600080fd5b83359250602084013567ffffffffffffffff8111156107ed57600080fd5b8401601f810186136107fe57600080fd5b803567ffffffffffffffff81111561081557600080fd5b86602082840101111561082757600080fd5b939660209190910195509293505050565b6000815180845260005b8181101561085e57602081850181015186830182015201610842565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b608081526000855160c060808401526108b9610140840182610838565b905060208701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808483030160a08501526108f48282610838565b604089015160c0860152606089015160e0860152608089015161010086015260a089015161012086015287151560208601529250610930915050565b60408201939093526060015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000808585111561098157600080fd5b8386111561098e57600080fd5b5050820193919092039150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156109ed576109ed61099b565b60405290565b600082601f830112610a0457600080fd5b81356020830160008067ffffffffffffffff841115610a2557610a2561099b565b506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85018116603f0116810181811067ffffffffffffffff82111715610a7257610a7261099b565b604052838152905080828401871015610a8a57600080fd5b838360208301376000602085830101528094505050505092915050565b80358015158114610ab757600080fd5b919050565b600080600080600060a08688031215610ad457600080fd5b853567ffffffffffffffff811115610aeb57600080fd5b860160c08189031215610afd57600080fd5b610b056109ca565b813567ffffffffffffffff811115610b1c57600080fd5b610b288a8285016109f3565b825250602082013567ffffffffffffffff811115610b4557600080fd5b610b518a8285016109f3565b60208381019190915260408481013590840152606080850135908401526080808501359084015260a09384013593830193909352509550610b93908701610aa7565b9497949650505050604083013592606081013592608090910135915056fea2646970667358221220886b2877641f1cd8a61d649a52512fd474d058f0d4195e2fedd5058062c6efb464736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063898bd92114610030575b600080fd5b61004361003e3660046107ba565b610055565b60405190815260200160405180910390f35b6000806000806000806100688888610100565b945094509450945094506100a08960405160200161008891815260200190565b60405160208183030381529060405285878686610492565b6100e757848484846040517f12a693e60000000000000000000000000000000000000000000000000000000081526004016100de949392919061089c565b60405180910390fd5b6100f3848484846105cc565b9998505050505050505050565b6040805160c081018252606080825260208201819052600092820183905281018290526080810182905260a0810182905290808080808787828161014657610146610942565b7fff000000000000000000000000000000000000000000000000000000000000009201359182169250507f200000000000000000000000000000000000000000000000000000000000000016600003610460577f010000000000000000000000000000000000000000000000000000000000000081161515945060ff600160f983901c8116810182169160fa84901c8216820181169160fb85901c8116810182169160fc86901c8216820116907f4000000000000000000000000000000000000000000000000000000000000000861615610225578c81013596506020015b60006102738e8e848992810135600884026101008190039190911c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600190921b9190910116939201919050565b8093508192505050600081830190508e8e8490839261029493929190610971565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508d60000181905250809250505060006103328e8e848892810135600884026101008190039190911c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600190921b9190910116939201919050565b8093508192505050600081830190508e8e8490839261035393929190610971565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060208e015291505060016008840290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018e830135610100929092039190911c1683820160408d0191909152905060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018e830135610100929092039190911c1682820160608d019190915290508c8101356020820160808d019190915290508c8101356020820160a08d019190915290508c8101356020820190995090508c81013597505050505050610487565b61046d876001818b610971565b81019061047a9190610abc565b9399509197509550935091505b509295509295909350565b60008060006104a388600180610613565b905060208601518051602082019150604088015160608901518451600d81017f226368616c6c656e6765223a220000000000000000000000000000000000000060981c87528484820110602282868901015160001a14168160138901208286890120141685846014011085851760801c107f2274797065223a22776562617574686e2e67657422000000000000000000000060581c8589015160581c14161698505080865250505087515189151560021b600117808160218c51015116146020831188161696505085156105a057602089510181810180516020600160208601856020868a8c60025afa60011b5afa51915295503d90506105a057fe5b50505082156105c1576105be8287608001518860a001518888610724565b92505b505095945050505050565b60008381526020839052604081208560006105f1828660009182526020526040902090565b9050610607838260009182526020526040902090565b98975050505050505050565b60608351801561071c576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526106708515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f18603f52602083018181018388602001018051600082525b60038a0199508951603f8160121c1651600053603f81600c1c1651600153603f8160061c1651600253603f81165160035350600051845260048401935082841061068f5790526020016040527f3d3d000000000000000000000000000000000000000000000000000000000000600384066002048083039190915260008615159091029182900352900382525b509392505050565b6000604051868152856020820152846040820152836060820152826080820152600080526020600060a0836101005afa503d6107845760203d60a0836dd01ea45f9efd5c54f037fa57ea1a5afa503d6107845763d0d5039b3d526004601cfd5b506000516001147f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8851110905095945050505050565b6000806000604084860312156107cf57600080fd5b83359250602084013567ffffffffffffffff8111156107ed57600080fd5b8401601f810186136107fe57600080fd5b803567ffffffffffffffff81111561081557600080fd5b86602082840101111561082757600080fd5b939660209190910195509293505050565b6000815180845260005b8181101561085e57602081850181015186830182015201610842565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b608081526000855160c060808401526108b9610140840182610838565b905060208701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808483030160a08501526108f48282610838565b604089015160c0860152606089015160e0860152608089015161010086015260a089015161012086015287151560208601529250610930915050565b60408201939093526060015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000808585111561098157600080fd5b8386111561098e57600080fd5b5050820193919092039150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156109ed576109ed61099b565b60405290565b600082601f830112610a0457600080fd5b81356020830160008067ffffffffffffffff841115610a2557610a2561099b565b506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85018116603f0116810181811067ffffffffffffffff82111715610a7257610a7261099b565b604052838152905080828401871015610a8a57600080fd5b838360208301376000602085830101528094505050505092915050565b80358015158114610ab757600080fd5b919050565b600080600080600060a08688031215610ad457600080fd5b853567ffffffffffffffff811115610aeb57600080fd5b860160c08189031215610afd57600080fd5b610b056109ca565b813567ffffffffffffffff811115610b1c57600080fd5b610b288a8285016109f3565b825250602082013567ffffffffffffffff811115610b4557600080fd5b610b518a8285016109f3565b60208381019190915260408481013590840152606080850135908401526080808501359084015260a09384013593830193909352509550610b93908701610aa7565b9497949650505050604083013592606081013592608090910135915056fea2646970667358221220886b2877641f1cd8a61d649a52512fd474d058f0d4195e2fedd5058062c6efb464736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/extensions/recovery/Recovery.sol/Recovery.json b/testchain/artifacts/wallet-contracts-v3/extensions/recovery/Recovery.sol/Recovery.json new file mode 100644 index 00000000..a37a94a0 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/extensions/recovery/Recovery.sol/Recovery.json @@ -0,0 +1,537 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Recovery", + "sourceName": "src/extensions/recovery/Recovery.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "_signer", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_payloadHash", + "type": "bytes32" + } + ], + "name": "AlreadyQueued", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + } + ], + "name": "InvalidKind", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "_signer", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_flag", + "type": "uint256" + } + ], + "name": "InvalidSignatureFlag", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_wallet", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "_payloadHash", + "type": "bytes32" + } + ], + "name": "QueueNotReady", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_wallet", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "_signer", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "_payloadHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_timestamp", + "type": "uint256" + } + ], + "name": "NewQueuedPayload", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "_signer", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "queuePayload", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "queuedPayloadHashes", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_payloadHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverSapientSignatureCompact", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_wallet", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + } + ], + "name": "recoveryPayloadHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "timestampForQueuedPayload", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "_signer", + "type": "address" + } + ], + "name": "totalQueuedPayloads", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6080604052348015600f57600080fd5b50611a208061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c8063b05f87db11610050578063b05f87db146100df578063d834bcbf146100f4578063ec08af331461010757600080fd5b80630e159f8014610077578063898bd921146100b9578063b00c8484146100cc575b600080fd5b6100a7610085366004610de3565b6000602081815293815260408082208552928152828120909352825290205481565b60405190815260200160405180910390f35b6100a76100c7366004610e69565b61014d565b6100a76100da366004610ece565b6101b0565b6100f26100ed366004610f1c565b61023f565b005b6100a7610102366004610de3565b6103eb565b6100a7610115366004610fad565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b600080600061015e33878787610429565b91509150816101a7576040517f904689fc000000000000000000000000000000000000000000000000000000008152336004820152602481018790526044015b60405180910390fd5b95945050505050565b6000806101cc6101c66040850160208601610ff0565b85610679565b905060006101e16101dc85611342565b610745565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018490526042810182905290915060620160405160208183030381529060405280519060200120925050505b92915050565b61024c85858585856109cb565b61028c5784848484846040517f44b7a40500000000000000000000000000000000000000000000000000000000815260040161019e9594939291906116bd565b60006102a061029a85611342565b87610bcf565b73ffffffffffffffffffffffffffffffffffffffff808816600090815260208181526040808320938a168352928152828220848352905220549091501561033a576040517f654c8bbf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8088166004830152861660248201526044810182905260640161019e565b73ffffffffffffffffffffffffffffffffffffffff868116600081815260208181526040808320948a16808452948252808320868452825280832042908190558484526001808452828520878652845282852080549182018155855293839020909301869055805193845290830193909352818301849052606082015290517faeb5575092e25ccd826d5de3515c096028bb338c1f304db40dc831c3746ee0ae9181900360800190a1505050505050565b6001602052826000526040600020602052816000526040600020818154811061041357600080fd5b9060005260206000200160009250925050505481565b60008060005b8381101561066f57600181019085013560f81c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81016105955773ffffffffffffffffffffffffffffffffffffffff8816600090815260208181526040808320898601803560601c8086529184528285208c8652909352922054601f90940193601482013560e81c916017013560c01c9080158015906104cf5750818110155b80156104e45750826104e18242611856565b10155b156104ee57600197505b604080517f53657175656e6365207265636f76657279206c6561663a0a0000000000000000602080830191909152606087901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166038830152604c8201869052606c80830186905283518084039091018152608c9092019092528051910120876105795780610588565b60008881526020829052604090205b975050505050505061042f565b600381036105c8576020820191860135836105b057806105bf565b60008481526020829052604090205b9350505061042f565b6004810361063a57600382019186013560e81c60006105e78285611869565b90506000806106088c8c8c8c8a9088926106039392919061187c565b610429565b9150915082955087806106185750815b975061062e878260009182526020526040902090565b9650505050505061042f565b6040517fb2505f7c0000000000000000000000000000000000000000000000000000000081526004810182905260240161019e565b5094509492505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fd50a220b5983c5d6e86926072ffa8a3197ae49602ffc9dd0e60d62d561a2e1d57fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6856106e957466106ec565b60005b6040805160208101959095528401929092526060830152608082015273ffffffffffffffffffffffffffffffffffffffff831660a082015260c00160405160208183030381529060405280519060200120905092915050565b60008082610100015160405160200161075e91906118a6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120835190915060ff166108215760006107af8460400151610bed565b606080860151608080880151604080517f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a260208201529081018690529384019290925282015260a0810184905290915060c0016040516020818303038152906040528051906020012092505050919050565b825160ff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016108b15760a08301518051602091820120604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46693810193909352820152606081018290526080015b60405160208183030381529060405280519060200120915050919050565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016109215760c0830151604080517f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e460208201529081019190915260608101829052608001610893565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd016109915760e0830151604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46660208201529081019190915260608101829052608001610893565b82516040517f0481832000000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161019e565b6000806109d887866101b0565b905073ffffffffffffffffffffffffffffffffffffffff86163b15610ad8576040517f1626ba7e0000000000000000000000000000000000000000000000000000000081527f20c13b0b000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff881690631626ba7e90610a6f908590899089906004016118f2565b602060405180830381865afa158015610a8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab0919061190c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506101a7565b600080610ae78587018761194e565b909250905060ff81901c7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82166000610b2183601b611970565b604080516000808252602082018084528a905260ff84169282019290925260608101889052608081018590529192509060019060a0016020604051602081039080840390855afa158015610b79573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8e81169116149850505050505050505095945050505050565b600080610be0846020015184610c7e565b905060006101e185610745565b6000606060005b8351811015610c6f576000610c21858381518110610c1457610c14611989565b6020026020010151610cee565b90508281604051602001610c369291906119b8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052925050600101610bf4565b50805160209091012092915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de856106e957466106ec565b60007f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef43782600001518360200151846040015180519060200120856060015186608001518760a001518860c00151604051602001610d9d98979695949392919097885273ffffffffffffffffffffffffffffffffffffffff969096166020880152604087019490945260608601929092526080850152151560a0840152151560c083015260e08201526101000190565b604051602081830303815290604052805190602001209050919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610dde57600080fd5b919050565b600080600060608486031215610df857600080fd5b610e0184610dba565b9250610e0f60208501610dba565b929592945050506040919091013590565b60008083601f840112610e3257600080fd5b50813567ffffffffffffffff811115610e4a57600080fd5b602083019150836020828501011115610e6257600080fd5b9250929050565b600080600060408486031215610e7e57600080fd5b83359250602084013567ffffffffffffffff811115610e9c57600080fd5b610ea886828701610e20565b9497909650939450505050565b60006101208284031215610ec857600080fd5b50919050565b60008060408385031215610ee157600080fd5b610eea83610dba565b9150602083013567ffffffffffffffff811115610f0657600080fd5b610f1285828601610eb5565b9150509250929050565b600080600080600060808688031215610f3457600080fd5b610f3d86610dba565b9450610f4b60208701610dba565b9350604086013567ffffffffffffffff811115610f6757600080fd5b610f7388828901610eb5565b935050606086013567ffffffffffffffff811115610f9057600080fd5b610f9c88828901610e20565b969995985093965092949392505050565b60008060408385031215610fc057600080fd5b610fc983610dba565b9150610fd760208401610dba565b90509250929050565b80358015158114610dde57600080fd5b60006020828403121561100257600080fd5b61100b82610fe0565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561106457611064611012565b60405290565b604051610120810167ffffffffffffffff8111828210171561106457611064611012565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156110d5576110d5611012565b604052919050565b803560ff81168114610dde57600080fd5b600067ffffffffffffffff82111561110857611108611012565b5060051b60200190565b600082601f83011261112357600080fd5b813567ffffffffffffffff81111561113d5761113d611012565b61116e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161108e565b81815284602083860101111561118357600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126111b157600080fd5b81356111c46111bf826110ee565b61108e565b8082825260208201915060208360051b8601019250858311156111e657600080fd5b602085015b838110156112d357803567ffffffffffffffff81111561120a57600080fd5b860160e08189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001121561123e57600080fd5b611246611041565b61125260208301610dba565b815260408201356020820152606082013567ffffffffffffffff81111561127857600080fd5b6112878a602083860101611112565b604083015250608082013560608201526112a360a08301610fe0565b60808201526112b460c08301610fe0565b60a082015260e0919091013560c08201528352602092830192016111eb565b5095945050505050565b600082601f8301126112ee57600080fd5b81356112fc6111bf826110ee565b8082825260208201915060208360051b86010192508583111561131e57600080fd5b602085015b838110156112d35761133481610dba565b835260209283019201611323565b6000610120823603121561135557600080fd5b61135d61106a565b611366836110dd565b815261137460208401610fe0565b6020820152604083013567ffffffffffffffff81111561139357600080fd5b61139f368286016111a0565b604083015250606083810135908201526080808401359082015260a083013567ffffffffffffffff8111156113d357600080fd5b6113df36828601611112565b60a08301525060c0838101359082015260e0808401359082015261010083013567ffffffffffffffff81111561141457600080fd5b611420368286016112dd565b6101008301525092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261146257600080fd5b830160208101925035905067ffffffffffffffff81111561148257600080fd5b8060051b3603821315610e6257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126114c957600080fd5b830160208101925035905067ffffffffffffffff8111156114e957600080fd5b803603821315610e6257600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60008383855260208501945060208460051b8201018360005b8681101561165c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084840301885281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff218736030181126115bb57600080fd5b860173ffffffffffffffffffffffffffffffffffffffff6115db82610dba565b168452602081810135908501526115f56040820182611494565b60e0604087015261160a60e0870182846114f8565b606084810135908801529150611624905060808301610fe0565b1515608086015261163760a08301610fe0565b151560a086015260c0918201359190940152602097880197919091019060010161155a565b50909695505050505050565b81835260208301925060008160005b848110156116b35773ffffffffffffffffffffffffffffffffffffffff61169d83610dba565b1686526020958601959190910190600101611677565b5093949350505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201526080604082015261171060808201611709866110dd565b60ff169052565b600061171e60208601610fe0565b151560a0830152611732604086018661142d565b61012060c08501526117496101a085018284611541565b606088013560e08601526080880135610100860152915061176f905060a0870187611494565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80858403016101208601526117a58382846114f8565b60c089013561014087015260e089013561016087015292506117ce91505061010087018761142d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8085840301610180860152611804838284611668565b92505050828103606084015261181b8185876114f8565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561023957610239611827565b8082018082111561023957610239611827565b6000808585111561188c57600080fd5b8386111561189957600080fd5b5050820193919092039150565b8151600090829060208501835b828110156118e757815173ffffffffffffffffffffffffffffffffffffffff168452602093840193909101906001016118b3565b509195945050505050565b8381526040602082015260006101a76040830184866114f8565b60006020828403121561191e57600080fd5b81517fffffffff000000000000000000000000000000000000000000000000000000008116811461100b57600080fd5b6000806040838503121561196157600080fd5b50508035926020909101359150565b60ff818116838216019081111561023957610239611827565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000835160005b818110156119d957602081870181015185830152016119bf565b50919091019182525060200191905056fea2646970667358221220fa5bdf6b1345165d4f08a1576f8d10f987ed0e1d41f56b38d2a23a240623d64364736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100725760003560e01c8063b05f87db11610050578063b05f87db146100df578063d834bcbf146100f4578063ec08af331461010757600080fd5b80630e159f8014610077578063898bd921146100b9578063b00c8484146100cc575b600080fd5b6100a7610085366004610de3565b6000602081815293815260408082208552928152828120909352825290205481565b60405190815260200160405180910390f35b6100a76100c7366004610e69565b61014d565b6100a76100da366004610ece565b6101b0565b6100f26100ed366004610f1c565b61023f565b005b6100a7610102366004610de3565b6103eb565b6100a7610115366004610fad565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b600080600061015e33878787610429565b91509150816101a7576040517f904689fc000000000000000000000000000000000000000000000000000000008152336004820152602481018790526044015b60405180910390fd5b95945050505050565b6000806101cc6101c66040850160208601610ff0565b85610679565b905060006101e16101dc85611342565b610745565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018490526042810182905290915060620160405160208183030381529060405280519060200120925050505b92915050565b61024c85858585856109cb565b61028c5784848484846040517f44b7a40500000000000000000000000000000000000000000000000000000000815260040161019e9594939291906116bd565b60006102a061029a85611342565b87610bcf565b73ffffffffffffffffffffffffffffffffffffffff808816600090815260208181526040808320938a168352928152828220848352905220549091501561033a576040517f654c8bbf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8088166004830152861660248201526044810182905260640161019e565b73ffffffffffffffffffffffffffffffffffffffff868116600081815260208181526040808320948a16808452948252808320868452825280832042908190558484526001808452828520878652845282852080549182018155855293839020909301869055805193845290830193909352818301849052606082015290517faeb5575092e25ccd826d5de3515c096028bb338c1f304db40dc831c3746ee0ae9181900360800190a1505050505050565b6001602052826000526040600020602052816000526040600020818154811061041357600080fd5b9060005260206000200160009250925050505481565b60008060005b8381101561066f57600181019085013560f81c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81016105955773ffffffffffffffffffffffffffffffffffffffff8816600090815260208181526040808320898601803560601c8086529184528285208c8652909352922054601f90940193601482013560e81c916017013560c01c9080158015906104cf5750818110155b80156104e45750826104e18242611856565b10155b156104ee57600197505b604080517f53657175656e6365207265636f76657279206c6561663a0a0000000000000000602080830191909152606087901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166038830152604c8201869052606c80830186905283518084039091018152608c9092019092528051910120876105795780610588565b60008881526020829052604090205b975050505050505061042f565b600381036105c8576020820191860135836105b057806105bf565b60008481526020829052604090205b9350505061042f565b6004810361063a57600382019186013560e81c60006105e78285611869565b90506000806106088c8c8c8c8a9088926106039392919061187c565b610429565b9150915082955087806106185750815b975061062e878260009182526020526040902090565b9650505050505061042f565b6040517fb2505f7c0000000000000000000000000000000000000000000000000000000081526004810182905260240161019e565b5094509492505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fd50a220b5983c5d6e86926072ffa8a3197ae49602ffc9dd0e60d62d561a2e1d57fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6856106e957466106ec565b60005b6040805160208101959095528401929092526060830152608082015273ffffffffffffffffffffffffffffffffffffffff831660a082015260c00160405160208183030381529060405280519060200120905092915050565b60008082610100015160405160200161075e91906118a6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120835190915060ff166108215760006107af8460400151610bed565b606080860151608080880151604080517f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a260208201529081018690529384019290925282015260a0810184905290915060c0016040516020818303038152906040528051906020012092505050919050565b825160ff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016108b15760a08301518051602091820120604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46693810193909352820152606081018290526080015b60405160208183030381529060405280519060200120915050919050565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016109215760c0830151604080517f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e460208201529081019190915260608101829052608001610893565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd016109915760e0830151604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46660208201529081019190915260608101829052608001610893565b82516040517f0481832000000000000000000000000000000000000000000000000000000000815260ff909116600482015260240161019e565b6000806109d887866101b0565b905073ffffffffffffffffffffffffffffffffffffffff86163b15610ad8576040517f1626ba7e0000000000000000000000000000000000000000000000000000000081527f20c13b0b000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff881690631626ba7e90610a6f908590899089906004016118f2565b602060405180830381865afa158015610a8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab0919061190c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506101a7565b600080610ae78587018761194e565b909250905060ff81901c7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82166000610b2183601b611970565b604080516000808252602082018084528a905260ff84169282019290925260608101889052608081018590529192509060019060a0016020604051602081039080840390855afa158015610b79573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8e81169116149850505050505050505095945050505050565b600080610be0846020015184610c7e565b905060006101e185610745565b6000606060005b8351811015610c6f576000610c21858381518110610c1457610c14611989565b6020026020010151610cee565b90508281604051602001610c369291906119b8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052925050600101610bf4565b50805160209091012092915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de856106e957466106ec565b60007f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef43782600001518360200151846040015180519060200120856060015186608001518760a001518860c00151604051602001610d9d98979695949392919097885273ffffffffffffffffffffffffffffffffffffffff969096166020880152604087019490945260608601929092526080850152151560a0840152151560c083015260e08201526101000190565b604051602081830303815290604052805190602001209050919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610dde57600080fd5b919050565b600080600060608486031215610df857600080fd5b610e0184610dba565b9250610e0f60208501610dba565b929592945050506040919091013590565b60008083601f840112610e3257600080fd5b50813567ffffffffffffffff811115610e4a57600080fd5b602083019150836020828501011115610e6257600080fd5b9250929050565b600080600060408486031215610e7e57600080fd5b83359250602084013567ffffffffffffffff811115610e9c57600080fd5b610ea886828701610e20565b9497909650939450505050565b60006101208284031215610ec857600080fd5b50919050565b60008060408385031215610ee157600080fd5b610eea83610dba565b9150602083013567ffffffffffffffff811115610f0657600080fd5b610f1285828601610eb5565b9150509250929050565b600080600080600060808688031215610f3457600080fd5b610f3d86610dba565b9450610f4b60208701610dba565b9350604086013567ffffffffffffffff811115610f6757600080fd5b610f7388828901610eb5565b935050606086013567ffffffffffffffff811115610f9057600080fd5b610f9c88828901610e20565b969995985093965092949392505050565b60008060408385031215610fc057600080fd5b610fc983610dba565b9150610fd760208401610dba565b90509250929050565b80358015158114610dde57600080fd5b60006020828403121561100257600080fd5b61100b82610fe0565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561106457611064611012565b60405290565b604051610120810167ffffffffffffffff8111828210171561106457611064611012565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156110d5576110d5611012565b604052919050565b803560ff81168114610dde57600080fd5b600067ffffffffffffffff82111561110857611108611012565b5060051b60200190565b600082601f83011261112357600080fd5b813567ffffffffffffffff81111561113d5761113d611012565b61116e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161108e565b81815284602083860101111561118357600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126111b157600080fd5b81356111c46111bf826110ee565b61108e565b8082825260208201915060208360051b8601019250858311156111e657600080fd5b602085015b838110156112d357803567ffffffffffffffff81111561120a57600080fd5b860160e08189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001121561123e57600080fd5b611246611041565b61125260208301610dba565b815260408201356020820152606082013567ffffffffffffffff81111561127857600080fd5b6112878a602083860101611112565b604083015250608082013560608201526112a360a08301610fe0565b60808201526112b460c08301610fe0565b60a082015260e0919091013560c08201528352602092830192016111eb565b5095945050505050565b600082601f8301126112ee57600080fd5b81356112fc6111bf826110ee565b8082825260208201915060208360051b86010192508583111561131e57600080fd5b602085015b838110156112d35761133481610dba565b835260209283019201611323565b6000610120823603121561135557600080fd5b61135d61106a565b611366836110dd565b815261137460208401610fe0565b6020820152604083013567ffffffffffffffff81111561139357600080fd5b61139f368286016111a0565b604083015250606083810135908201526080808401359082015260a083013567ffffffffffffffff8111156113d357600080fd5b6113df36828601611112565b60a08301525060c0838101359082015260e0808401359082015261010083013567ffffffffffffffff81111561141457600080fd5b611420368286016112dd565b6101008301525092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261146257600080fd5b830160208101925035905067ffffffffffffffff81111561148257600080fd5b8060051b3603821315610e6257600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126114c957600080fd5b830160208101925035905067ffffffffffffffff8111156114e957600080fd5b803603821315610e6257600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60008383855260208501945060208460051b8201018360005b8681101561165c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084840301885281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff218736030181126115bb57600080fd5b860173ffffffffffffffffffffffffffffffffffffffff6115db82610dba565b168452602081810135908501526115f56040820182611494565b60e0604087015261160a60e0870182846114f8565b606084810135908801529150611624905060808301610fe0565b1515608086015261163760a08301610fe0565b151560a086015260c0918201359190940152602097880197919091019060010161155a565b50909695505050505050565b81835260208301925060008160005b848110156116b35773ffffffffffffffffffffffffffffffffffffffff61169d83610dba565b1686526020958601959190910190600101611677565b5093949350505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff851660208201526080604082015261171060808201611709866110dd565b60ff169052565b600061171e60208601610fe0565b151560a0830152611732604086018661142d565b61012060c08501526117496101a085018284611541565b606088013560e08601526080880135610100860152915061176f905060a0870187611494565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80858403016101208601526117a58382846114f8565b60c089013561014087015260e089013561016087015292506117ce91505061010087018761142d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8085840301610180860152611804838284611668565b92505050828103606084015261181b8185876114f8565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561023957610239611827565b8082018082111561023957610239611827565b6000808585111561188c57600080fd5b8386111561189957600080fd5b5050820193919092039150565b8151600090829060208501835b828110156118e757815173ffffffffffffffffffffffffffffffffffffffff168452602093840193909101906001016118b3565b509195945050505050565b8381526040602082015260006101a76040830184866114f8565b60006020828403121561191e57600080fd5b81517fffffffff000000000000000000000000000000000000000000000000000000008116811461100b57600080fd5b6000806040838503121561196157600080fd5b50508035926020909101359150565b60ff818116838216019081111561023957610239611827565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000835160005b818110156119d957602081870181015185830152016119bf565b50919091019182525060200191905056fea2646970667358221220fa5bdf6b1345165d4f08a1576f8d10f987ed0e1d41f56b38d2a23a240623d64364736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/extensions/sessions/SessionErrors.sol/SessionErrors.json b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/SessionErrors.sol/SessionErrors.json new file mode 100644 index 00000000..077e8b6e --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/SessionErrors.sol/SessionErrors.json @@ -0,0 +1,105 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SessionErrors", + "sourceName": "src/extensions/sessions/SessionErrors.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "BlacklistedAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidAttestation", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidBlacklist", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidDelegateCall", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidIdentitySigner", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidImplicitResult", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidLimitUsageIncrement", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "flag", + "type": "uint256" + } + ], + "name": "InvalidNodeType", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPermission", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSelfCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "invalidSigner", + "type": "address" + } + ], + "name": "InvalidSessionSigner", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidValue", + "type": "error" + }, + { + "inputs": [], + "name": "MissingPermission", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "SessionExpired", + "type": "error" + } + ], + "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ca0584545d97da73be765afb80b3ec759a7113a046de85b2d773bba83475a2c164736f6c634300081b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ca0584545d97da73be765afb80b3ec759a7113a046de85b2d773bba83475a2c164736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/extensions/sessions/SessionManager.sol/SessionManager.json b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/SessionManager.sol/SessionManager.json new file mode 100644 index 00000000..2bedf7e6 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/SessionManager.sol/SessionManager.json @@ -0,0 +1,448 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SessionManager", + "sourceName": "src/extensions/sessions/SessionManager.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "BlacklistedAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidAttestation", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidBlacklist", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidCallsLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidDelegateCall", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidIdentitySigner", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidImplicitResult", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidLimitUsageIncrement", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "flag", + "type": "uint256" + } + ], + "name": "InvalidNodeType", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPayloadKind", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPermission", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSelfCall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "invalidSigner", + "type": "address" + } + ], + "name": "InvalidSessionSigner", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidValue", + "type": "error" + }, + { + "inputs": [], + "name": "MissingPermission", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "SessionExpired", + "type": "error" + }, + { + "inputs": [], + "name": "VALUE_TRACKING_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "usageHash", + "type": "bytes32" + } + ], + "name": "getLimitUsage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "usageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "usageAmount", + "type": "uint256" + } + ], + "internalType": "struct UsageLimit[]", + "name": "limits", + "type": "tuple[]" + } + ], + "name": "incrementUsageLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "encodedSignature", + "type": "bytes" + } + ], + "name": "recoverSapientSignature", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "components": [ + { + "internalType": "bool", + "name": "cumulative", + "type": "bool" + }, + { + "internalType": "enum ParameterOperation", + "name": "operation", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "value", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "offset", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "mask", + "type": "bytes32" + } + ], + "internalType": "struct ParameterRule[]", + "name": "rules", + "type": "tuple[]" + } + ], + "internalType": "struct Permission", + "name": "permission", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call", + "name": "call", + "type": "tuple" + }, + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "signer", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "usageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "usageAmount", + "type": "uint256" + } + ], + "internalType": "struct UsageLimit[]", + "name": "usageLimits", + "type": "tuple[]" + } + ], + "name": "validatePermission", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "usageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "usageAmount", + "type": "uint256" + } + ], + "internalType": "struct UsageLimit[]", + "name": "newUsageLimits", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6080604052348015600f57600080fd5b50613ca38061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c8063313dade711610050578063313dade71461010157806342de141814610122578063f916f3b21461013757600080fd5b806301ffc9a71461007757806313792a4a1461009f57806323b3713e146100c0575b600080fd5b61008a610085366004612c87565b610177565b60405190151581526020015b60405180910390f35b6100b26100ad366004612cd0565b6101d3565b604051908152602001610096565b6100b26100ce366004612d9f565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260208181526040808320938352929052205490565b61011461010f366004612f95565b61074d565b604051610096929190613194565b6101356101303660046131b7565b610b4b565b005b61015273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610096565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f13792a4a0000000000000000000000000000000000000000000000000000000014806101cd57506101cd82610c78565b92915050565b6000806101e3602086018661322e565b60ff161461021d576040517f7205212000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61022a6040850185613251565b9050600003610265576040517f542f0af500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610272858585610d10565b90503360006102846040880188613251565b905067ffffffffffffffff81111561029e5761029e612dc9565b60405190808252806020026020018201604052801561030957816020015b6102f66040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001600081525090565b8152602001906001900390816102bc5790505b50905060005b61031c6040890189613251565b90508110156105b0573661033360408a018a613251565b83818110610343576103436132b9565b905060200281019061035591906132e8565b905061036760a0820160808301613326565b1561039e576040517faa25f2ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000856080015183815181106103b6576103b66132b9565b602002602001015190508060000151156103e8576103e38286836020015184606001518a6040015161126f565b6105a6565b6104226040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001600081525090565b60005b855181101561056857600073ffffffffffffffffffffffffffffffffffffffff16868281518110610458576104586132b9565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16036104eb5760208381015173ffffffffffffffffffffffffffffffffffffffff168352604080516000808252928101909152906104d9565b60408051808201909152600080825260208201528152602001906001900390816104b25790505b50602083015260006040830152610568565b826020015173ffffffffffffffffffffffffffffffffffffffff16868281518110610518576105186132b9565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff160361056057858181518110610551576105516132b9565b60200260200101519150610568565b600101610425565b6105838c868986602001518c6060015188604001518861150c565b915081868281518110610598576105986132b9565b602002602001018190525050505b505060010161030f565b506000815167ffffffffffffffff8111156105cd576105cd612dc9565b60405190808252806020026020018201604052801561063857816020015b6106256040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001600081525090565b8152602001906001900390816105eb5790505b5090506000805b83518110156106e557600084828151811061065c5761065c6132b9565b60200260200101516020015151118061069257506000848281518110610684576106846132b9565b602002602001015160400151115b156106dd578381815181106106a9576106a96132b9565b60200260200101518383815181106106c3576106c36132b9565b602002602001018190525081806106d990613370565b9250505b60010161063f565b50808252366106f760408b018b613251565b600161070660408e018e613251565b6107119291506133a8565b818110610720576107206132b9565b905060200281019061073291906132e8565b905061073e818461195f565b50509251979650505050505050565b6000606061075e60208701876133bb565b73ffffffffffffffffffffffffffffffffffffffff16876000015173ffffffffffffffffffffffffffffffffffffffff161461079f57506000905081610b41565b86602001515183516107b191906133d6565b67ffffffffffffffff8111156107c9576107c9612dc9565b60405190808252806020026020018201604052801561080e57816020015b60408051808201909152600080825260208201528152602001906001900390816107e75790505b50905060005b835181101561085c5783818151811061082f5761082f6132b9565b6020026020010151828281518110610849576108496132b9565b6020908102919091010152600101610814565b50825160005b886020015151811015610b3957600089602001518281518110610887576108876132b9565b6020026020010151905060006108b182606001518b80604001906108ab91906133e9565b50013590565b608083015183519116915015610a485760405181906000906108db908b908f90889060200161347d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012083830190925260008084529083018190529092509060005b89518110156109f5576000801b8a8281518110610948576109486132b9565b602002602001015160000151036109a157604051806040016040528085815260200160008152509150818a8281518110610984576109846132b9565b602090810291909101015261099a8160016133d6565b98506109f5565b838a82815181106109b4576109b46132b9565b602002602001015160000151036109ed578981815181106109d7576109d76132b9565b60200260200101519150816020015192506109f5565b600101610929565b5081600003610a305773ffffffffffffffffffffffffffffffffffffffff8d1660009081526020818152604080832086845290915290205491505b610a3a82856133d6565b602090910181905293505050505b600082602001516003811115610a6057610a6061344e565b03610a855781604001518114610a80576000879550955050505050610b41565b610b2f565b600382602001516003811115610a9d57610a9d61344e565b03610abe576040820151811115610a80576000879550955050505050610b41565b600182602001516003811115610ad657610ad661344e565b03610af65781604001518103610a80576000879550955050505050610b41565b600282602001516003811115610b0e57610b0e61344e565b03610b2f576040820151811015610b2f576000879550955050505050610b41565b5050600101610862565b508152600191505b9550959350505050565b3360005b82811015610c7257610baa82858584818110610b6d57610b6d6132b9565b9050604002016000013573ffffffffffffffffffffffffffffffffffffffff91909116600090815260208181526040808320938352929052205490565b848483818110610bbc57610bbc6132b9565b905060400201602001351015610bfd576040517e2a700a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6a82858584818110610c1357610c136132b9565b90506040020160000135868685818110610c2f57610c2f6132b9565b9050604002016020013573ffffffffffffffffffffffffffffffffffffffff9092166000908152602081815260408083209383529290522055565b600101610b4f565b50505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f13792a4a0000000000000000000000000000000000000000000000000000000014806101cd57507fffffffff0000000000000000000000000000000000000000000000000000000082167f42de1418000000000000000000000000000000000000000000000000000000001492915050565b6040805160a0810182526000808252602082018190526060928201839052828201839052608082019290925290600390843560e81c610d67868487610d5585836133d6565b92610d6293929190613581565b611d5a565b9094509150610d7681846133d6565b602085015190935073ffffffffffffffffffffffffffffffffffffffff16610dca576040517f9e5c658b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600182019160609086013560f81c8067ffffffffffffffff811115610df257610df2612dc9565b604051908082528060200260200182016040528015610e6657816020015b610e536040805160c0810182526000808252602080830182905282840182905260608084019290925260808301829052835190810190935282529060a082015290565b815260200190600190039081610e105790505b50915060005b8160ff16811015610fe557610eba6040805160c0810182526000808252602080830182905282840182905260608084019290925260808301829052835190810190935282529060a082015290565b610ec589898861236b565b9650905060008080610ed88c8c8b612482565b9b50919450925090506000610eec856124d5565b6040805160008082526020820180845284905260ff86169282019290925260608101879052608081018690529192509060019060a0016020604051602081039080840390855afa158015610f44573d6000803e3d6000fd5b5050506020604051035190508b6020015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fb9576040517f9e5c658b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505080848381518110610fd157610fd16132b9565b602090810291909101015250600101610e6c565b5060008160ff16118015610ff7575082155b1561102e576040517feb62520400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600061103e6040890189613251565b905090508067ffffffffffffffff81111561105b5761105b612dc9565b60405190808252806020026020018201604052801561109457816020015b611081612c23565b8152602001906001900390816110795790505b50608086015260005b81811015611263576110ad612c23565b8589013560f81c608081161580158352600190970196611131578451607f8216908110611106576040517fbd8ba84d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b858160ff168151811061111b5761111b6132b9565b602002602001015183606001819052505061113b565b60ff811660408301525b506000808061114b8c8c8b612482565b809c508194508295508396505050505060006111988e80604001906111709190613251565b88818110611180576111806132b9565b905060200281019061119291906132e8565b8f6124ee565b60408051600081526020810180835283905260ff851691810191909152606081018690526080810185905290915060019060a0016020604051602081039080840390855afa1580156111ee573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff16602087015250505050608088015180518392508490811061124f5761124f6132b9565b60209081029190910101525060010161109d565b50505050509392505050565b815173ffffffffffffffffffffffffffffffffffffffff8481169116146112df576040517fc1e84ed600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b6112ef60a0860160808701613326565b15611326576040517faa25f2ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113308382612566565b1561137f576040517fd33f19e700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016112d6565b61139561138f60208701876133bb565b82612566565b156113f2576113a760208601866133bb565b6040517fd33f19e700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016112d6565b60208501351561142e576040517faa7feadc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061143d60208701876133bb565b73ffffffffffffffffffffffffffffffffffffffff1663c58ab92d8685896040518463ffffffff1660e01b81526004016114799392919061374c565b602060405180830381865afa158015611496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ba919061384b565b905060006114c8848761266f565b9050808214611503576040517f0881ad5d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050505050565b6115466040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001600081525090565b6115876040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081525090565b60005b855181101561160c578673ffffffffffffffffffffffffffffffffffffffff168682815181106115bc576115bc6132b9565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1603611604578581815181106115f5576115f56132b9565b6020026020010151915061160c565b60010161158a565b50805173ffffffffffffffffffffffffffffffffffffffff16611673576040517fc1e84ed600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024016112d6565b6040810151158015906116895750806040015142115b156116c85780604001516040517fb1bbfdd50000000000000000000000000000000000000000000000000000000081526004016112d691815260200190565b366116d660408b018b613251565b8a8181106116e6576116e66132b9565b90506020028101906116f891906132e8565b905061170a60a0820160808301613326565b15611741576040517faa25f2ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3061174f60208301836133bb565b73ffffffffffffffffffffffffffffffffffffffff160361182a57600061177960408301836133e9565b61178891600491600091613581565b61179191613864565b90506000826020013511806117e857507fffffffff0000000000000000000000000000000000000000000000000000000081167f42de14180000000000000000000000000000000000000000000000000000000014155b1561181f576040517f540733ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b849350505050611954565b8160600151518560ff161061186b576040517f3f904dc000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082606001518660ff1681518110611886576118866132b9565b602002602001015190506000806118a483858d8d8b6020015161074d565b91509150816118df576040517f868a64de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808801829052840135156119095783602001358760400181815161190591906133d6565b9052505b84602001518760400151111561194b576040517faa7feadc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b86955050505050505b979650505050505050565b805115611d56573061197460208401846133bb565b73ffffffffffffffffffffffffffffffffffffffff1614158061199c575060c0820135600114155b156119d2576040517e2a700a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8251811015611a47578281815181106119f1576119f16132b9565b6020026020010151602001515182611a0991906133d6565b91506000838281518110611a1f57611a1f6132b9565b6020026020010151604001511115611a3f5781611a3b81613370565b9250505b6001016119d6565b5060008167ffffffffffffffff811115611a6357611a63612dc9565b604051908082528060200260200182016040528015611aa857816020015b6040805180820190915260008082526020820152815260200190600190039081611a815790505b5090506000805b8451811015611c4f5760005b858281518110611acd57611acd6132b9565b60200260200101516020015151811015611b4957858281518110611af357611af36132b9565b6020026020010151602001518181518110611b1057611b106132b9565b6020026020010151848480611b2490613370565b955081518110611b3657611b366132b9565b6020908102919091010152600101611abb565b506000858281518110611b5e57611b5e6132b9565b6020026020010151604001511115611c47576040518060400160405280868381518110611b8d57611b8d6132b9565b60200260200101516000015173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee604051602001611be192919073ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b604051602081830303815290604052805190602001208152602001868381518110611c0e57611c0e6132b9565b602002602001015160400151815250838380611c2990613370565b945081518110611c3b57611c3b6132b9565b60200260200101819052505b600101611aaf565b5060006342de141860e01b83604051602401611c6b91906138ca565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093178352815190922090925090600090611cff908901896133e9565b604051611d0d9291906138dd565b60405180910390209050818114611d4f576040517e2a700a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505b5050565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526000808080611d9460568761391c565b90508067ffffffffffffffff811115611daf57611daf612dc9565b604051908082528060200260200182016040528015611e2157816020015b611e0e6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081525090565b815260200190600190039081611dcd5790505b506060860152505b8482101561235857600182019186013560f881901c9060fc1c80611f2f57611e886040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081525090565b888501803560601c8252601481013560208301526034013560408201526054850194611eb58a8a8861270d565b606084019190915295506000611ed5611ed088848d8f613581565b6127cd565b8951909150611ee45780611ef5565b885160009081526020829052604090205b8952506060880151829086611f0981613370565b975081518110611f1b57611f1b6132b9565b602002602001018190525050505050611e29565b60018103611f68578551602085019489013590611f4c5780611f5d565b865160009081526020829052604090205b875250611e29915050565b6002810361215157600f8216848101946001600890920291821b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01908a0135610100929092039190911c166000611fc082876133d6565b9050600080611fda8c8c8a908692610d6293929190613581565b91509150829750801561202e57881561201f576040517feb62520400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080830151908b0152600198505b602082015173ffffffffffffffffffffffffffffffffffffffff16156120c15760208a015173ffffffffffffffffffffffffffffffffffffffff16156120a0576040517f9e5c658b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208083015173ffffffffffffffffffffffffffffffffffffffff16908b01525b60005b82606001515181101561212457826060015181815181106120e7576120e76132b9565b60200260200101518b6060015189806120ff90613370565b9a5081518110612111576121116132b9565b60209081029190910101526001016120c4565b508951612132578151612143565b895182516000918252602052604090205b8a5250611e29945050505050565b6003810361229a578415612191576040517feb62520400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60019450600f808316908190036121af5750600284019388013560f01c5b848167ffffffffffffffff8111156121c9576121c9612dc9565b6040519080825280602002602001820160405280156121f2578160200160208202803683370190505b50604089015260005b8281101561225657868b013560601c601488018a604001518381518110612224576122246132b9565b73ffffffffffffffffffffffffffffffffffffffff9093166020938402919091019092019190915296506001016121fb565b50600061226d61226888848d8f613581565b6127e4565b895190915061227c578061228d565b885160009081526020829052604090205b895250611e299350505050565b6004810361232357602086015173ffffffffffffffffffffffffffffffffffffffff16156122f4576040517f9e5c658b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8784013560601c60208701819052601490940193600090612314906127fc565b8751909150611f4c5780611f5d565b6040517f0ad99790000000000000000000000000000000000000000000000000000000008152600481018290526024016112d6565b60608401805191825252505b9250929050565b6123ae6040805160c0810182526000808252602080830182905282840182905260608084019290925260808301829052835190810190935282529060a082015290565b8382018035606090811c83527fffffffff00000000000000000000000000000000000000000000000000000000601483013516602084015260188201356040840152603882013590830152605b8301906058013560e81c85828661241284836133d6565b9261241f93929190613581565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050608084015261246281836133d6565b915061246f868684612875565b60a0850191909152915050935093915050565b828101803590602001357f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811690600090604085019060ff81901c6124c881601b613930565b9350505093509350935093565b60006124e0826128f5565b805190602001209050919050565b60006125006040830160208401613326565b61250a574661250d565b60005b60608301356080840135612528612523876139d7565b61294f565b6040805160208101959095528401929092526060830152608082015260a0015b60405160208183030381529060405280519060200120905092915050565b6000806000905060006001845161257d9190613a6f565b90505b80821361266457600060026125958484613a6f565b61259f9190613a8f565b6125a99084613af7565b905060008582815181106125bf576125bf6132b9565b602002602001015190508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126095760019450505050506101cd565b8673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16101561264f57612648826001613af7565b935061265d565b61265a600183613a6f565b92505b5050612580565b506000949350505050565b6040517f616363657074496d706c696369745265717565737400000000000000000000006020820152600090603501604051602081830303815290604052805190602001208284606001518560400151604051602001612548949392919093845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208401526034830152605482015260740190565b600181019060609060009085013560f81c8067ffffffffffffffff81111561273757612737612dc9565b60405190808252806020026020018201604052801561277d57816020015b6040805180820190915260008152606060208201528152602001906001900390816127555790505b50925060005b818110156127c0576127968787876129fe565b8583815181106127a8576127a86132b9565b60209081029190910101919091529450600101612783565b5083915050935093915050565b600080838360405160200161254893929190613b1f565b60006003838360405160200161254893929190613b1f565b6040517f040000000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b1660218201526000906035015b604051602081830303815290604052805190602001209050919050565b604080516020810190915260608152600382018483013560e81c85828661289c84836133d6565b926128a993929190613581565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908452506128ea81836133d6565b915050935093915050565b6060816000015182602001518360400151846060015185608001515186608001516129238860a00151612c07565b6040516020016129399796959493929190613b5e565b6040516020818303038152906040529050919050565b60007f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef43782600001518360200151846040015180519060200120856060015186608001518760a001518860c0015160405160200161285898979695949392919097885273ffffffffffffffffffffffffffffffffffffffff969096166020880152604087019490945260608601929092526080850152151560a0840152151560c083015260e08201526101000190565b60408051808201909152606060208201819052848301803590911c82526015909201916000906014013560f81c8067ffffffffffffffff811115612a4457612a44612dc9565b604051908082528060200260200182016040528015612abb57816020015b6040805160a0810182526000808252602080830182905292820181905260608201819052608082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181612a625790505b50602084015260005b818110156127c057602084015180516001808801978a013560f81c9290831615159184908110612af657612af66132b9565b60209081029190910101519015159052607f600182901c166003811115612b1f57612b1f61344e565b85602001518381518110612b3557612b356132b9565b6020026020010151602001906003811115612b5257612b5261344e565b90816003811115612b6557612b6561344e565b905250858801356020870186602001518481518110612b8657612b866132b9565b6020908102919091018101516040019290925296508887013590870186602001518481518110612bb857612bb86132b9565b6020908102919091018101516060019290925296508887013590870186602001518481518110612bea57612bea6132b9565b602090810291909101015160800191909152955050600101612ac4565b805180516040516060926129399291602001613c22565b905290565b604080516080810182526000808252602082018190529181019190915260608101612c1e6040805160c0810182526000808252602080830182905282840182905260608084019290925260808301829052835190810190935282529060a082015290565b600060208284031215612c9957600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612cc957600080fd5b9392505050565b600080600060408486031215612ce557600080fd5b833567ffffffffffffffff811115612cfc57600080fd5b84016101208187031215612d0f57600080fd5b9250602084013567ffffffffffffffff811115612d2b57600080fd5b8401601f81018613612d3c57600080fd5b803567ffffffffffffffff811115612d5357600080fd5b866020828401011115612d6557600080fd5b939660209190910195509293505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612d9a57600080fd5b919050565b60008060408385031215612db257600080fd5b612dbb83612d76565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612dc9565b60405290565b60405160a0810167ffffffffffffffff81118282101715612e1b57612e1b612dc9565b60405160e0810167ffffffffffffffff81118282101715612e1b57612e1b612dc9565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612eae57612eae612dc9565b604052919050565b600067ffffffffffffffff821115612ed057612ed0612dc9565b5060051b60200190565b80358015158114612d9a57600080fd5b600060e08284031215612efc57600080fd5b50919050565b600082601f830112612f1357600080fd5b8135612f26612f2182612eb6565b612e67565b8082825260208201915060208360061b860101925085831115612f4857600080fd5b602085015b83811015612f8b5760408188031215612f6557600080fd5b612f6d612df8565b81358152602080830135818301529084529290920191604001612f4d565b5095945050505050565b600080600080600060a08688031215612fad57600080fd5b853567ffffffffffffffff811115612fc457600080fd5b860160408189031215612fd657600080fd5b612fde612df8565b612fe782612d76565b8152602082013567ffffffffffffffff81111561300357600080fd5b80830192505088601f83011261301857600080fd5b8135613026612f2182612eb6565b80828252602082019150602060a0840286010192508b83111561304857600080fd5b6020850194505b828510156130c65760a0858d03121561306757600080fd5b61306f612e21565b61307886612eda565b815260208601356004811061308c57600080fd5b60208281019190915260408781013590830152606080880135908301526080808801359083015290835260a090950194919091019061304f565b8060208501525050508096505050602086013567ffffffffffffffff8111156130ee57600080fd5b6130fa88828901612eea565b94505061310960408701612d76565b925061311760608701612d76565b9150608086013567ffffffffffffffff81111561313357600080fd5b61313f88828901612f02565b9150509295509295909350565b600081518084526020840193506020830160005b8281101561318a578151805187526020908101518188015260409096019590910190600101613160565b5093949350505050565b82151581526040602082015260006131af604083018461314c565b949350505050565b600080602083850312156131ca57600080fd5b823567ffffffffffffffff8111156131e157600080fd5b8301601f810185136131f257600080fd5b803567ffffffffffffffff81111561320957600080fd5b8560208260061b840101111561321e57600080fd5b6020919091019590945092505050565b60006020828403121561324057600080fd5b813560ff81168114612cc957600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261328657600080fd5b83018035915067ffffffffffffffff8211156132a157600080fd5b6020019150600581901b360382131561236457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2183360301811261331c57600080fd5b9190910192915050565b60006020828403121561333857600080fd5b612cc982612eda565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133a1576133a1613341565b5060010190565b818103818111156101cd576101cd613341565b6000602082840312156133cd57600080fd5b612cc982612d76565b808201808211156101cd576101cd613341565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261341e57600080fd5b83018035915067ffffffffffffffff82111561343957600080fd5b60200191503681900382131561236457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8416815260606020820152600060a0820173ffffffffffffffffffffffffffffffffffffffff855116606084015260208501516040608085015281815180845260c086019150602083019350600092505b8083101561356c57835180511515835260208101516004811061352f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b806020850152506040810151604084015260608101516060840152608081015160808401525060a0820191506020840193506001830192506134e3565b50809350505050826040830152949350505050565b6000808585111561359157600080fd5b8386111561359e57600080fd5b5050820193919092039150565b60005b838110156135c65781810151838201526020016135ae565b50506000910152565b600081518084526135e78160208601602086016135ab565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff61368082612d76565b1682526020818101359083015260006040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126136c557600080fd5b820160208101903567ffffffffffffffff8111156136e257600080fd5b8036038213156136f157600080fd5b60e0604086015261370660e086018284613619565b606085810135908701529150613720905060808401612eda565b1515608085015261373360a08401612eda565b151560a085015260c09283013592909301919091525090565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015273ffffffffffffffffffffffffffffffffffffffff83511660608201527fffffffff000000000000000000000000000000000000000000000000000000006020840151166080820152604083015160a0820152606083015160c08201526000608084015160c060e08401526137e56101208401826135cf565b905060a08501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa084830301610100850152805190506020825261382c60208301826135cf565b91505082810360408401526138418185613662565b9695505050505050565b60006020828403121561385d57600080fd5b5051919050565b80357fffffffff0000000000000000000000000000000000000000000000000000000081169060048410156138c3577fffffffff00000000000000000000000000000000000000000000000000000000808560040360031b1b82161691505b5092915050565b602081526000612cc9602083018461314c565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261392b5761392b6138ed565b500490565b60ff81811683821601908111156101cd576101cd613341565b600082601f83011261395a57600080fd5b813567ffffffffffffffff81111561397457613974612dc9565b6139a560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612e67565b8181528460208386010111156139ba57600080fd5b816020850160208301376000918101602001919091529392505050565b600060e082360312156139e957600080fd5b6139f1612e44565b6139fa83612d76565b815260208381013590820152604083013567ffffffffffffffff811115613a2057600080fd5b613a2c36828601613949565b60408301525060608381013590820152613a4860808401612eda565b6080820152613a5960a08401612eda565b60a082015260c092830135928101929092525090565b81810360008312801583831316838312821617156138c3576138c3613341565b600082613a9e57613a9e6138ed565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615613af257613af2613341565b500590565b8082018281126000831280158216821582161715613b1757613b17613341565b505092915050565b7fff000000000000000000000000000000000000000000000000000000000000008460f81b168152818360018301376000910160010190815292915050565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1681527fffffffff00000000000000000000000000000000000000000000000000000000871660148201528560188201528460388201527fffffff00000000000000000000000000000000000000000000000000000000008460e81b16605882015260008351613bfa81605b8501602088016135ab565b835190830190613c1181605b8401602088016135ab565b01605b019998505050505050505050565b7fffffff00000000000000000000000000000000000000000000000000000000008360e81b16815260008251613c5f8160038501602087016135ab565b91909101600301939250505056fea26469706673582212204f84e231d3bc870fa7a57b5f2c198a25ba59284a3e4e0e6f58415837bd2db27764736f6c634300081b0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100725760003560e01c8063313dade711610050578063313dade71461010157806342de141814610122578063f916f3b21461013757600080fd5b806301ffc9a71461007757806313792a4a1461009f57806323b3713e146100c0575b600080fd5b61008a610085366004612c87565b610177565b60405190151581526020015b60405180910390f35b6100b26100ad366004612cd0565b6101d3565b604051908152602001610096565b6100b26100ce366004612d9f565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260208181526040808320938352929052205490565b61011461010f366004612f95565b61074d565b604051610096929190613194565b6101356101303660046131b7565b610b4b565b005b61015273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610096565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f13792a4a0000000000000000000000000000000000000000000000000000000014806101cd57506101cd82610c78565b92915050565b6000806101e3602086018661322e565b60ff161461021d576040517f7205212000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61022a6040850185613251565b9050600003610265576040517f542f0af500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610272858585610d10565b90503360006102846040880188613251565b905067ffffffffffffffff81111561029e5761029e612dc9565b60405190808252806020026020018201604052801561030957816020015b6102f66040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001600081525090565b8152602001906001900390816102bc5790505b50905060005b61031c6040890189613251565b90508110156105b0573661033360408a018a613251565b83818110610343576103436132b9565b905060200281019061035591906132e8565b905061036760a0820160808301613326565b1561039e576040517faa25f2ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000856080015183815181106103b6576103b66132b9565b602002602001015190508060000151156103e8576103e38286836020015184606001518a6040015161126f565b6105a6565b6104226040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001600081525090565b60005b855181101561056857600073ffffffffffffffffffffffffffffffffffffffff16868281518110610458576104586132b9565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff16036104eb5760208381015173ffffffffffffffffffffffffffffffffffffffff168352604080516000808252928101909152906104d9565b60408051808201909152600080825260208201528152602001906001900390816104b25790505b50602083015260006040830152610568565b826020015173ffffffffffffffffffffffffffffffffffffffff16868281518110610518576105186132b9565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff160361056057858181518110610551576105516132b9565b60200260200101519150610568565b600101610425565b6105838c868986602001518c6060015188604001518861150c565b915081868281518110610598576105986132b9565b602002602001018190525050505b505060010161030f565b506000815167ffffffffffffffff8111156105cd576105cd612dc9565b60405190808252806020026020018201604052801561063857816020015b6106256040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001600081525090565b8152602001906001900390816105eb5790505b5090506000805b83518110156106e557600084828151811061065c5761065c6132b9565b60200260200101516020015151118061069257506000848281518110610684576106846132b9565b602002602001015160400151115b156106dd578381815181106106a9576106a96132b9565b60200260200101518383815181106106c3576106c36132b9565b602002602001018190525081806106d990613370565b9250505b60010161063f565b50808252366106f760408b018b613251565b600161070660408e018e613251565b6107119291506133a8565b818110610720576107206132b9565b905060200281019061073291906132e8565b905061073e818461195f565b50509251979650505050505050565b6000606061075e60208701876133bb565b73ffffffffffffffffffffffffffffffffffffffff16876000015173ffffffffffffffffffffffffffffffffffffffff161461079f57506000905081610b41565b86602001515183516107b191906133d6565b67ffffffffffffffff8111156107c9576107c9612dc9565b60405190808252806020026020018201604052801561080e57816020015b60408051808201909152600080825260208201528152602001906001900390816107e75790505b50905060005b835181101561085c5783818151811061082f5761082f6132b9565b6020026020010151828281518110610849576108496132b9565b6020908102919091010152600101610814565b50825160005b886020015151811015610b3957600089602001518281518110610887576108876132b9565b6020026020010151905060006108b182606001518b80604001906108ab91906133e9565b50013590565b608083015183519116915015610a485760405181906000906108db908b908f90889060200161347d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012083830190925260008084529083018190529092509060005b89518110156109f5576000801b8a8281518110610948576109486132b9565b602002602001015160000151036109a157604051806040016040528085815260200160008152509150818a8281518110610984576109846132b9565b602090810291909101015261099a8160016133d6565b98506109f5565b838a82815181106109b4576109b46132b9565b602002602001015160000151036109ed578981815181106109d7576109d76132b9565b60200260200101519150816020015192506109f5565b600101610929565b5081600003610a305773ffffffffffffffffffffffffffffffffffffffff8d1660009081526020818152604080832086845290915290205491505b610a3a82856133d6565b602090910181905293505050505b600082602001516003811115610a6057610a6061344e565b03610a855781604001518114610a80576000879550955050505050610b41565b610b2f565b600382602001516003811115610a9d57610a9d61344e565b03610abe576040820151811115610a80576000879550955050505050610b41565b600182602001516003811115610ad657610ad661344e565b03610af65781604001518103610a80576000879550955050505050610b41565b600282602001516003811115610b0e57610b0e61344e565b03610b2f576040820151811015610b2f576000879550955050505050610b41565b5050600101610862565b508152600191505b9550959350505050565b3360005b82811015610c7257610baa82858584818110610b6d57610b6d6132b9565b9050604002016000013573ffffffffffffffffffffffffffffffffffffffff91909116600090815260208181526040808320938352929052205490565b848483818110610bbc57610bbc6132b9565b905060400201602001351015610bfd576040517e2a700a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6a82858584818110610c1357610c136132b9565b90506040020160000135868685818110610c2f57610c2f6132b9565b9050604002016020013573ffffffffffffffffffffffffffffffffffffffff9092166000908152602081815260408083209383529290522055565b600101610b4f565b50505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f13792a4a0000000000000000000000000000000000000000000000000000000014806101cd57507fffffffff0000000000000000000000000000000000000000000000000000000082167f42de1418000000000000000000000000000000000000000000000000000000001492915050565b6040805160a0810182526000808252602082018190526060928201839052828201839052608082019290925290600390843560e81c610d67868487610d5585836133d6565b92610d6293929190613581565b611d5a565b9094509150610d7681846133d6565b602085015190935073ffffffffffffffffffffffffffffffffffffffff16610dca576040517f9e5c658b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600182019160609086013560f81c8067ffffffffffffffff811115610df257610df2612dc9565b604051908082528060200260200182016040528015610e6657816020015b610e536040805160c0810182526000808252602080830182905282840182905260608084019290925260808301829052835190810190935282529060a082015290565b815260200190600190039081610e105790505b50915060005b8160ff16811015610fe557610eba6040805160c0810182526000808252602080830182905282840182905260608084019290925260808301829052835190810190935282529060a082015290565b610ec589898861236b565b9650905060008080610ed88c8c8b612482565b9b50919450925090506000610eec856124d5565b6040805160008082526020820180845284905260ff86169282019290925260608101879052608081018690529192509060019060a0016020604051602081039080840390855afa158015610f44573d6000803e3d6000fd5b5050506020604051035190508b6020015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fb9576040517f9e5c658b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505080848381518110610fd157610fd16132b9565b602090810291909101015250600101610e6c565b5060008160ff16118015610ff7575082155b1561102e576040517feb62520400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600061103e6040890189613251565b905090508067ffffffffffffffff81111561105b5761105b612dc9565b60405190808252806020026020018201604052801561109457816020015b611081612c23565b8152602001906001900390816110795790505b50608086015260005b81811015611263576110ad612c23565b8589013560f81c608081161580158352600190970196611131578451607f8216908110611106576040517fbd8ba84d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b858160ff168151811061111b5761111b6132b9565b602002602001015183606001819052505061113b565b60ff811660408301525b506000808061114b8c8c8b612482565b809c508194508295508396505050505060006111988e80604001906111709190613251565b88818110611180576111806132b9565b905060200281019061119291906132e8565b8f6124ee565b60408051600081526020810180835283905260ff851691810191909152606081018690526080810185905290915060019060a0016020604051602081039080840390855afa1580156111ee573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff16602087015250505050608088015180518392508490811061124f5761124f6132b9565b60209081029190910101525060010161109d565b50505050509392505050565b815173ffffffffffffffffffffffffffffffffffffffff8481169116146112df576040517fc1e84ed600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b6112ef60a0860160808701613326565b15611326576040517faa25f2ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113308382612566565b1561137f576040517fd33f19e700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016112d6565b61139561138f60208701876133bb565b82612566565b156113f2576113a760208601866133bb565b6040517fd33f19e700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016112d6565b60208501351561142e576040517faa7feadc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061143d60208701876133bb565b73ffffffffffffffffffffffffffffffffffffffff1663c58ab92d8685896040518463ffffffff1660e01b81526004016114799392919061374c565b602060405180830381865afa158015611496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ba919061384b565b905060006114c8848761266f565b9050808214611503576040517f0881ad5d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050505050565b6115466040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001600081525090565b6115876040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081525090565b60005b855181101561160c578673ffffffffffffffffffffffffffffffffffffffff168682815181106115bc576115bc6132b9565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1603611604578581815181106115f5576115f56132b9565b6020026020010151915061160c565b60010161158a565b50805173ffffffffffffffffffffffffffffffffffffffff16611673576040517fc1e84ed600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024016112d6565b6040810151158015906116895750806040015142115b156116c85780604001516040517fb1bbfdd50000000000000000000000000000000000000000000000000000000081526004016112d691815260200190565b366116d660408b018b613251565b8a8181106116e6576116e66132b9565b90506020028101906116f891906132e8565b905061170a60a0820160808301613326565b15611741576040517faa25f2ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3061174f60208301836133bb565b73ffffffffffffffffffffffffffffffffffffffff160361182a57600061177960408301836133e9565b61178891600491600091613581565b61179191613864565b90506000826020013511806117e857507fffffffff0000000000000000000000000000000000000000000000000000000081167f42de14180000000000000000000000000000000000000000000000000000000014155b1561181f576040517f540733ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b849350505050611954565b8160600151518560ff161061186b576040517f3f904dc000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082606001518660ff1681518110611886576118866132b9565b602002602001015190506000806118a483858d8d8b6020015161074d565b91509150816118df576040517f868a64de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020808801829052840135156119095783602001358760400181815161190591906133d6565b9052505b84602001518760400151111561194b576040517faa7feadc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b86955050505050505b979650505050505050565b805115611d56573061197460208401846133bb565b73ffffffffffffffffffffffffffffffffffffffff1614158061199c575060c0820135600114155b156119d2576040517e2a700a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8251811015611a47578281815181106119f1576119f16132b9565b6020026020010151602001515182611a0991906133d6565b91506000838281518110611a1f57611a1f6132b9565b6020026020010151604001511115611a3f5781611a3b81613370565b9250505b6001016119d6565b5060008167ffffffffffffffff811115611a6357611a63612dc9565b604051908082528060200260200182016040528015611aa857816020015b6040805180820190915260008082526020820152815260200190600190039081611a815790505b5090506000805b8451811015611c4f5760005b858281518110611acd57611acd6132b9565b60200260200101516020015151811015611b4957858281518110611af357611af36132b9565b6020026020010151602001518181518110611b1057611b106132b9565b6020026020010151848480611b2490613370565b955081518110611b3657611b366132b9565b6020908102919091010152600101611abb565b506000858281518110611b5e57611b5e6132b9565b6020026020010151604001511115611c47576040518060400160405280868381518110611b8d57611b8d6132b9565b60200260200101516000015173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee604051602001611be192919073ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b604051602081830303815290604052805190602001208152602001868381518110611c0e57611c0e6132b9565b602002602001015160400151815250838380611c2990613370565b945081518110611c3b57611c3b6132b9565b60200260200101819052505b600101611aaf565b5060006342de141860e01b83604051602401611c6b91906138ca565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093178352815190922090925090600090611cff908901896133e9565b604051611d0d9291906138dd565b60405180910390209050818114611d4f576040517e2a700a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505b5050565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526000808080611d9460568761391c565b90508067ffffffffffffffff811115611daf57611daf612dc9565b604051908082528060200260200182016040528015611e2157816020015b611e0e6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081525090565b815260200190600190039081611dcd5790505b506060860152505b8482101561235857600182019186013560f881901c9060fc1c80611f2f57611e886040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081525090565b888501803560601c8252601481013560208301526034013560408201526054850194611eb58a8a8861270d565b606084019190915295506000611ed5611ed088848d8f613581565b6127cd565b8951909150611ee45780611ef5565b885160009081526020829052604090205b8952506060880151829086611f0981613370565b975081518110611f1b57611f1b6132b9565b602002602001018190525050505050611e29565b60018103611f68578551602085019489013590611f4c5780611f5d565b865160009081526020829052604090205b875250611e29915050565b6002810361215157600f8216848101946001600890920291821b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01908a0135610100929092039190911c166000611fc082876133d6565b9050600080611fda8c8c8a908692610d6293929190613581565b91509150829750801561202e57881561201f576040517feb62520400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080830151908b0152600198505b602082015173ffffffffffffffffffffffffffffffffffffffff16156120c15760208a015173ffffffffffffffffffffffffffffffffffffffff16156120a0576040517f9e5c658b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208083015173ffffffffffffffffffffffffffffffffffffffff16908b01525b60005b82606001515181101561212457826060015181815181106120e7576120e76132b9565b60200260200101518b6060015189806120ff90613370565b9a5081518110612111576121116132b9565b60209081029190910101526001016120c4565b508951612132578151612143565b895182516000918252602052604090205b8a5250611e29945050505050565b6003810361229a578415612191576040517feb62520400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60019450600f808316908190036121af5750600284019388013560f01c5b848167ffffffffffffffff8111156121c9576121c9612dc9565b6040519080825280602002602001820160405280156121f2578160200160208202803683370190505b50604089015260005b8281101561225657868b013560601c601488018a604001518381518110612224576122246132b9565b73ffffffffffffffffffffffffffffffffffffffff9093166020938402919091019092019190915296506001016121fb565b50600061226d61226888848d8f613581565b6127e4565b895190915061227c578061228d565b885160009081526020829052604090205b895250611e299350505050565b6004810361232357602086015173ffffffffffffffffffffffffffffffffffffffff16156122f4576040517f9e5c658b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8784013560601c60208701819052601490940193600090612314906127fc565b8751909150611f4c5780611f5d565b6040517f0ad99790000000000000000000000000000000000000000000000000000000008152600481018290526024016112d6565b60608401805191825252505b9250929050565b6123ae6040805160c0810182526000808252602080830182905282840182905260608084019290925260808301829052835190810190935282529060a082015290565b8382018035606090811c83527fffffffff00000000000000000000000000000000000000000000000000000000601483013516602084015260188201356040840152603882013590830152605b8301906058013560e81c85828661241284836133d6565b9261241f93929190613581565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050608084015261246281836133d6565b915061246f868684612875565b60a0850191909152915050935093915050565b828101803590602001357f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811690600090604085019060ff81901c6124c881601b613930565b9350505093509350935093565b60006124e0826128f5565b805190602001209050919050565b60006125006040830160208401613326565b61250a574661250d565b60005b60608301356080840135612528612523876139d7565b61294f565b6040805160208101959095528401929092526060830152608082015260a0015b60405160208183030381529060405280519060200120905092915050565b6000806000905060006001845161257d9190613a6f565b90505b80821361266457600060026125958484613a6f565b61259f9190613a8f565b6125a99084613af7565b905060008582815181106125bf576125bf6132b9565b602002602001015190508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126095760019450505050506101cd565b8673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16101561264f57612648826001613af7565b935061265d565b61265a600183613a6f565b92505b5050612580565b506000949350505050565b6040517f616363657074496d706c696369745265717565737400000000000000000000006020820152600090603501604051602081830303815290604052805190602001208284606001518560400151604051602001612548949392919093845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208401526034830152605482015260740190565b600181019060609060009085013560f81c8067ffffffffffffffff81111561273757612737612dc9565b60405190808252806020026020018201604052801561277d57816020015b6040805180820190915260008152606060208201528152602001906001900390816127555790505b50925060005b818110156127c0576127968787876129fe565b8583815181106127a8576127a86132b9565b60209081029190910101919091529450600101612783565b5083915050935093915050565b600080838360405160200161254893929190613b1f565b60006003838360405160200161254893929190613b1f565b6040517f040000000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b1660218201526000906035015b604051602081830303815290604052805190602001209050919050565b604080516020810190915260608152600382018483013560e81c85828661289c84836133d6565b926128a993929190613581565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908452506128ea81836133d6565b915050935093915050565b6060816000015182602001518360400151846060015185608001515186608001516129238860a00151612c07565b6040516020016129399796959493929190613b5e565b6040516020818303038152906040529050919050565b60007f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef43782600001518360200151846040015180519060200120856060015186608001518760a001518860c0015160405160200161285898979695949392919097885273ffffffffffffffffffffffffffffffffffffffff969096166020880152604087019490945260608601929092526080850152151560a0840152151560c083015260e08201526101000190565b60408051808201909152606060208201819052848301803590911c82526015909201916000906014013560f81c8067ffffffffffffffff811115612a4457612a44612dc9565b604051908082528060200260200182016040528015612abb57816020015b6040805160a0810182526000808252602080830182905292820181905260608201819052608082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181612a625790505b50602084015260005b818110156127c057602084015180516001808801978a013560f81c9290831615159184908110612af657612af66132b9565b60209081029190910101519015159052607f600182901c166003811115612b1f57612b1f61344e565b85602001518381518110612b3557612b356132b9565b6020026020010151602001906003811115612b5257612b5261344e565b90816003811115612b6557612b6561344e565b905250858801356020870186602001518481518110612b8657612b866132b9565b6020908102919091018101516040019290925296508887013590870186602001518481518110612bb857612bb86132b9565b6020908102919091018101516060019290925296508887013590870186602001518481518110612bea57612bea6132b9565b602090810291909101015160800191909152955050600101612ac4565b805180516040516060926129399291602001613c22565b905290565b604080516080810182526000808252602082018190529181019190915260608101612c1e6040805160c0810182526000808252602080830182905282840182905260608084019290925260808301829052835190810190935282529060a082015290565b600060208284031215612c9957600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612cc957600080fd5b9392505050565b600080600060408486031215612ce557600080fd5b833567ffffffffffffffff811115612cfc57600080fd5b84016101208187031215612d0f57600080fd5b9250602084013567ffffffffffffffff811115612d2b57600080fd5b8401601f81018613612d3c57600080fd5b803567ffffffffffffffff811115612d5357600080fd5b866020828401011115612d6557600080fd5b939660209190910195509293505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612d9a57600080fd5b919050565b60008060408385031215612db257600080fd5b612dbb83612d76565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612e1b57612e1b612dc9565b60405290565b60405160a0810167ffffffffffffffff81118282101715612e1b57612e1b612dc9565b60405160e0810167ffffffffffffffff81118282101715612e1b57612e1b612dc9565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612eae57612eae612dc9565b604052919050565b600067ffffffffffffffff821115612ed057612ed0612dc9565b5060051b60200190565b80358015158114612d9a57600080fd5b600060e08284031215612efc57600080fd5b50919050565b600082601f830112612f1357600080fd5b8135612f26612f2182612eb6565b612e67565b8082825260208201915060208360061b860101925085831115612f4857600080fd5b602085015b83811015612f8b5760408188031215612f6557600080fd5b612f6d612df8565b81358152602080830135818301529084529290920191604001612f4d565b5095945050505050565b600080600080600060a08688031215612fad57600080fd5b853567ffffffffffffffff811115612fc457600080fd5b860160408189031215612fd657600080fd5b612fde612df8565b612fe782612d76565b8152602082013567ffffffffffffffff81111561300357600080fd5b80830192505088601f83011261301857600080fd5b8135613026612f2182612eb6565b80828252602082019150602060a0840286010192508b83111561304857600080fd5b6020850194505b828510156130c65760a0858d03121561306757600080fd5b61306f612e21565b61307886612eda565b815260208601356004811061308c57600080fd5b60208281019190915260408781013590830152606080880135908301526080808801359083015290835260a090950194919091019061304f565b8060208501525050508096505050602086013567ffffffffffffffff8111156130ee57600080fd5b6130fa88828901612eea565b94505061310960408701612d76565b925061311760608701612d76565b9150608086013567ffffffffffffffff81111561313357600080fd5b61313f88828901612f02565b9150509295509295909350565b600081518084526020840193506020830160005b8281101561318a578151805187526020908101518188015260409096019590910190600101613160565b5093949350505050565b82151581526040602082015260006131af604083018461314c565b949350505050565b600080602083850312156131ca57600080fd5b823567ffffffffffffffff8111156131e157600080fd5b8301601f810185136131f257600080fd5b803567ffffffffffffffff81111561320957600080fd5b8560208260061b840101111561321e57600080fd5b6020919091019590945092505050565b60006020828403121561324057600080fd5b813560ff81168114612cc957600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261328657600080fd5b83018035915067ffffffffffffffff8211156132a157600080fd5b6020019150600581901b360382131561236457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2183360301811261331c57600080fd5b9190910192915050565b60006020828403121561333857600080fd5b612cc982612eda565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133a1576133a1613341565b5060010190565b818103818111156101cd576101cd613341565b6000602082840312156133cd57600080fd5b612cc982612d76565b808201808211156101cd576101cd613341565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261341e57600080fd5b83018035915067ffffffffffffffff82111561343957600080fd5b60200191503681900382131561236457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8416815260606020820152600060a0820173ffffffffffffffffffffffffffffffffffffffff855116606084015260208501516040608085015281815180845260c086019150602083019350600092505b8083101561356c57835180511515835260208101516004811061352f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b806020850152506040810151604084015260608101516060840152608081015160808401525060a0820191506020840193506001830192506134e3565b50809350505050826040830152949350505050565b6000808585111561359157600080fd5b8386111561359e57600080fd5b5050820193919092039150565b60005b838110156135c65781810151838201526020016135ae565b50506000910152565b600081518084526135e78160208601602086016135ab565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff61368082612d76565b1682526020818101359083015260006040820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126136c557600080fd5b820160208101903567ffffffffffffffff8111156136e257600080fd5b8036038213156136f157600080fd5b60e0604086015261370660e086018284613619565b606085810135908701529150613720905060808401612eda565b1515608085015261373360a08401612eda565b151560a085015260c09283013592909301919091525090565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015273ffffffffffffffffffffffffffffffffffffffff83511660608201527fffffffff000000000000000000000000000000000000000000000000000000006020840151166080820152604083015160a0820152606083015160c08201526000608084015160c060e08401526137e56101208401826135cf565b905060a08501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa084830301610100850152805190506020825261382c60208301826135cf565b91505082810360408401526138418185613662565b9695505050505050565b60006020828403121561385d57600080fd5b5051919050565b80357fffffffff0000000000000000000000000000000000000000000000000000000081169060048410156138c3577fffffffff00000000000000000000000000000000000000000000000000000000808560040360031b1b82161691505b5092915050565b602081526000612cc9602083018461314c565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261392b5761392b6138ed565b500490565b60ff81811683821601908111156101cd576101cd613341565b600082601f83011261395a57600080fd5b813567ffffffffffffffff81111561397457613974612dc9565b6139a560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612e67565b8181528460208386010111156139ba57600080fd5b816020850160208301376000918101602001919091529392505050565b600060e082360312156139e957600080fd5b6139f1612e44565b6139fa83612d76565b815260208381013590820152604083013567ffffffffffffffff811115613a2057600080fd5b613a2c36828601613949565b60408301525060608381013590820152613a4860808401612eda565b6080820152613a5960a08401612eda565b60a082015260c092830135928101929092525090565b81810360008312801583831316838312821617156138c3576138c3613341565b600082613a9e57613a9e6138ed565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615613af257613af2613341565b500590565b8082018281126000831280158216821582161715613b1757613b17613341565b505092915050565b7fff000000000000000000000000000000000000000000000000000000000000008460f81b168152818360018301376000910160010190815292915050565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1681527fffffffff00000000000000000000000000000000000000000000000000000000871660148201528560188201528460388201527fffffff00000000000000000000000000000000000000000000000000000000008460e81b16605882015260008351613bfa81605b8501602088016135ab565b835190830190613c1181605b8401602088016135ab565b01605b019998505050505050505050565b7fffffff00000000000000000000000000000000000000000000000000000000008360e81b16815260008251613c5f8160038501602087016135ab565b91909101600301939250505056fea26469706673582212204f84e231d3bc870fa7a57b5f2c198a25ba59284a3e4e0e6f58415837bd2db27764736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/extensions/sessions/SessionSig.sol/SessionSig.json b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/SessionSig.sol/SessionSig.json new file mode 100644 index 00000000..4f7b2025 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/SessionSig.sol/SessionSig.json @@ -0,0 +1,156 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SessionSig", + "sourceName": "src/extensions/sessions/SessionSig.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call", + "name": "call", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "payload", + "type": "tuple" + } + ], + "name": "hashCallWithReplayProtection", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x610446610039600b82828239805160001a607314602c57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c806391195a2a1461003a575b600080fd5b61004d6100483660046101a2565b61005f565b60405190815260200160405180910390f35b6000610071604083016020840161022d565b61007b574661007e565b60005b6060830135608084013561009961009487610378565b6100d6565b6040805160208101959095528401929092526060830152608082015260a00160405160208183030381529060405280519060200120905092915050565b60007f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef43782600001518360200151846040015180519060200120856060015186608001518760a001518860c0015160405160200161018598979695949392919097885273ffffffffffffffffffffffffffffffffffffffff969096166020880152604087019490945260608601929092526080850152151560a0840152151560c083015260e08201526101000190565b604051602081830303815290604052805190602001209050919050565b600080604083850312156101b557600080fd5b823567ffffffffffffffff8111156101cc57600080fd5b830160e081860312156101de57600080fd5b9150602083013567ffffffffffffffff8111156101fa57600080fd5b8301610120818603121561020d57600080fd5b809150509250929050565b8035801515811461022857600080fd5b919050565b60006020828403121561023f57600080fd5b61024882610218565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff811182821017156102a1576102a161024f565b60405290565b803573ffffffffffffffffffffffffffffffffffffffff8116811461022857600080fd5b600082601f8301126102dc57600080fd5b813567ffffffffffffffff8111156102f6576102f661024f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810167ffffffffffffffff811182821017156103435761034361024f565b60405281815283820160200185101561035b57600080fd5b816020850160208301376000918101602001919091529392505050565b600060e0823603121561038a57600080fd5b61039261027e565b61039b836102a7565b815260208381013590820152604083013567ffffffffffffffff8111156103c157600080fd5b6103cd368286016102cb565b604083015250606083810135908201526103e960808401610218565b60808201526103fa60a08401610218565b60a082015260c09283013592810192909252509056fea2646970667358221220d5c29436ab283c755ff5d9e8be0c8b9230ecbbf964e7292bcfba984662fa878b64736f6c634300081b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c806391195a2a1461003a575b600080fd5b61004d6100483660046101a2565b61005f565b60405190815260200160405180910390f35b6000610071604083016020840161022d565b61007b574661007e565b60005b6060830135608084013561009961009487610378565b6100d6565b6040805160208101959095528401929092526060830152608082015260a00160405160208183030381529060405280519060200120905092915050565b60007f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef43782600001518360200151846040015180519060200120856060015186608001518760a001518860c0015160405160200161018598979695949392919097885273ffffffffffffffffffffffffffffffffffffffff969096166020880152604087019490945260608601929092526080850152151560a0840152151560c083015260e08201526101000190565b604051602081830303815290604052805190602001209050919050565b600080604083850312156101b557600080fd5b823567ffffffffffffffff8111156101cc57600080fd5b830160e081860312156101de57600080fd5b9150602083013567ffffffffffffffff8111156101fa57600080fd5b8301610120818603121561020d57600080fd5b809150509250929050565b8035801515811461022857600080fd5b919050565b60006020828403121561023f57600080fd5b61024882610218565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff811182821017156102a1576102a161024f565b60405290565b803573ffffffffffffffffffffffffffffffffffffffff8116811461022857600080fd5b600082601f8301126102dc57600080fd5b813567ffffffffffffffff8111156102f6576102f661024f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810167ffffffffffffffff811182821017156103435761034361024f565b60405281815283820160200185101561035b57600080fd5b816020850160208301376000918101602001919091529392505050565b600060e0823603121561038a57600080fd5b61039261027e565b61039b836102a7565b815260208381013590820152604083013567ffffffffffffffff8111156103c157600080fd5b6103cd368286016102cb565b604083015250606083810135908201526103e960808401610218565b60808201526103fa60a08401610218565b60a082015260c09283013592810192909252509056fea2646970667358221220d5c29436ab283c755ff5d9e8be0c8b9230ecbbf964e7292bcfba984662fa878b64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/ExplicitSessionManager.sol/ExplicitSessionManager.json b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/ExplicitSessionManager.sol/ExplicitSessionManager.json new file mode 100644 index 00000000..494d29ae --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/ExplicitSessionManager.sol/ExplicitSessionManager.json @@ -0,0 +1,241 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ExplicitSessionManager", + "sourceName": "src/extensions/sessions/explicit/ExplicitSessionManager.sol", + "abi": [ + { + "inputs": [], + "name": "InvalidLimitUsageIncrement", + "type": "error" + }, + { + "inputs": [], + "name": "VALUE_TRACKING_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "usageHash", + "type": "bytes32" + } + ], + "name": "getLimitUsage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "usageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "usageAmount", + "type": "uint256" + } + ], + "internalType": "struct UsageLimit[]", + "name": "limits", + "type": "tuple[]" + } + ], + "name": "incrementUsageLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "components": [ + { + "internalType": "bool", + "name": "cumulative", + "type": "bool" + }, + { + "internalType": "enum ParameterOperation", + "name": "operation", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "value", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "offset", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "mask", + "type": "bytes32" + } + ], + "internalType": "struct ParameterRule[]", + "name": "rules", + "type": "tuple[]" + } + ], + "internalType": "struct Permission", + "name": "permission", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call", + "name": "call", + "type": "tuple" + }, + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "signer", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "usageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "usageAmount", + "type": "uint256" + } + ], + "internalType": "struct UsageLimit[]", + "name": "usageLimits", + "type": "tuple[]" + } + ], + "name": "validatePermission", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "usageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "usageAmount", + "type": "uint256" + } + ], + "internalType": "struct UsageLimit[]", + "name": "newUsageLimits", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/IExplicitSessionManager.sol/IExplicitSessionManager.json b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/IExplicitSessionManager.sol/IExplicitSessionManager.json new file mode 100644 index 00000000..0b2e94b7 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/IExplicitSessionManager.sol/IExplicitSessionManager.json @@ -0,0 +1,36 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IExplicitSessionManager", + "sourceName": "src/extensions/sessions/explicit/IExplicitSessionManager.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "usageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "usageAmount", + "type": "uint256" + } + ], + "internalType": "struct UsageLimit[]", + "name": "limits", + "type": "tuple[]" + } + ], + "name": "incrementUsageLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/Permission.sol/LibPermission.json b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/Permission.sol/LibPermission.json new file mode 100644 index 00000000..98cefb3e --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/Permission.sol/LibPermission.json @@ -0,0 +1,16 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LibPermission", + "sourceName": "src/extensions/sessions/explicit/Permission.sol", + "abi": [ + { + "inputs": [], + "name": "RulesLengthExceedsMax", + "type": "error" + } + ], + "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122075c72ea1bc320353b145bf9080f259ae67bb565e1b4a2162c95df7e4e3271f5364736f6c634300081b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122075c72ea1bc320353b145bf9080f259ae67bb565e1b4a2162c95df7e4e3271f5364736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/PermissionValidator.sol/PermissionValidator.json b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/PermissionValidator.sol/PermissionValidator.json new file mode 100644 index 00000000..bd60f26a --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/explicit/PermissionValidator.sol/PermissionValidator.json @@ -0,0 +1,179 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "PermissionValidator", + "sourceName": "src/extensions/sessions/explicit/PermissionValidator.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "usageHash", + "type": "bytes32" + } + ], + "name": "getLimitUsage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "components": [ + { + "internalType": "bool", + "name": "cumulative", + "type": "bool" + }, + { + "internalType": "enum ParameterOperation", + "name": "operation", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "value", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "offset", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "mask", + "type": "bytes32" + } + ], + "internalType": "struct ParameterRule[]", + "name": "rules", + "type": "tuple[]" + } + ], + "internalType": "struct Permission", + "name": "permission", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call", + "name": "call", + "type": "tuple" + }, + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "internalType": "address", + "name": "signer", + "type": "address" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "usageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "usageAmount", + "type": "uint256" + } + ], + "internalType": "struct UsageLimit[]", + "name": "usageLimits", + "type": "tuple[]" + } + ], + "name": "validatePermission", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "usageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "usageAmount", + "type": "uint256" + } + ], + "internalType": "struct UsageLimit[]", + "name": "newUsageLimits", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/extensions/sessions/implicit/Attestation.sol/LibAttestation.json b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/implicit/Attestation.sol/LibAttestation.json new file mode 100644 index 00000000..52c5d42f --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/implicit/Attestation.sol/LibAttestation.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LibAttestation", + "sourceName": "src/extensions/sessions/implicit/Attestation.sol", + "abi": [], + "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220b4d1399f29f56130d4c7296b9a377d8493b344959a2f8a5a3463059f2020fd2b64736f6c634300081b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220b4d1399f29f56130d4c7296b9a377d8493b344959a2f8a5a3463059f2020fd2b64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/extensions/sessions/implicit/ISignalsImplicitMode.sol/ISignalsImplicitMode.json b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/implicit/ISignalsImplicitMode.sol/ISignalsImplicitMode.json new file mode 100644 index 00000000..a70a7ec5 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/implicit/ISignalsImplicitMode.sol/ISignalsImplicitMode.json @@ -0,0 +1,116 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ISignalsImplicitMode", + "sourceName": "src/extensions/sessions/implicit/ISignalsImplicitMode.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "components": [ + { + "internalType": "address", + "name": "approvedSigner", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "identityType", + "type": "bytes4" + }, + { + "internalType": "bytes32", + "name": "issuerHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "audienceHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "applicationData", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "string", + "name": "redirectUrl", + "type": "string" + } + ], + "internalType": "struct AuthData", + "name": "authData", + "type": "tuple" + } + ], + "internalType": "struct Attestation", + "name": "attestation", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call", + "name": "call", + "type": "tuple" + } + ], + "name": "acceptImplicitRequest", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/extensions/sessions/implicit/ImplicitSessionManager.sol/ImplicitSessionManager.json b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/implicit/ImplicitSessionManager.sol/ImplicitSessionManager.json new file mode 100644 index 00000000..21f29083 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/extensions/sessions/implicit/ImplicitSessionManager.sol/ImplicitSessionManager.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ImplicitSessionManager", + "sourceName": "src/extensions/sessions/implicit/ImplicitSessionManager.sol", + "abi": [], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/Calls.sol/Calls.json b/testchain/artifacts/wallet-contracts-v3/modules/Calls.sol/Calls.json new file mode 100644 index 00000000..74458299 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/Calls.sol/Calls.json @@ -0,0 +1,1116 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Calls", + "sourceName": "src/modules/Calls.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + } + ], + "name": "BadNonce", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_signer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidERC1271Signature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + } + ], + "name": "InvalidKind", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSapientSignature", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_flag", + "type": "uint256" + } + ], + "name": "InvalidSignatureFlag", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "InvalidSignatureWeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_expires", + "type": "uint256" + } + ], + "name": "InvalidStaticSignatureExpired", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_caller", + "type": "address" + }, + { + "internalType": "address", + "name": "_expectedCaller", + "type": "address" + } + ], + "name": "InvalidStaticSignatureWrongCaller", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "LowWeightChainedSignature", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_gasLeft", + "type": "uint256" + } + ], + "name": "NotEnoughGas", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + } + ], + "name": "OnlySelf", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "Reverted", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "internalType": "struct Snapshot", + "name": "_snapshot", + "type": "tuple" + } + ], + "name": "UnusedSnapshot", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_nextCheckpoint", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_checkpoint", + "type": "uint256" + } + ], + "name": "WrongChainedCheckpointOrder", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "CallAborted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_returnData", + "type": "bytes" + } + ], + "name": "CallFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "CallSkipped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "CallSucceeded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_newNonce", + "type": "uint256" + } + ], + "name": "NonceChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint96", + "name": "_timestamp", + "type": "uint96" + } + ], + "name": "StaticSignatureSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_payload", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + } + ], + "name": "getStaticSignature", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + } + ], + "name": "readNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverPartialSignature", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isValidImage", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "opHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverSapientSignature", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_payload", + "type": "bytes" + } + ], + "name": "selfExecute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "internalType": "uint96", + "name": "_timestamp", + "type": "uint96" + } + ], + "name": "setStaticSignature", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_imageHash", + "type": "bytes32" + } + ], + "name": "updateImageHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/Hooks.json b/testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/Hooks.json new file mode 100644 index 00000000..244d5ed1 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/Hooks.json @@ -0,0 +1,256 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Hooks", + "sourceName": "src/modules/Hooks.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "HookAlreadyExists", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "HookDoesNotExist", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + } + ], + "name": "OnlySelf", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + }, + { + "indexed": false, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "DefinedHook", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + }, + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "addHook", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "readHook", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "signature", + "type": "bytes4" + } + ], + "name": "removeHook", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "tokenReceived", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x6080604052348015600f57600080fd5b506109cf8061001f6000396000f3fe6080604052600436106100745760003560e01c80638943ec021161004e5780638943ec0214610211578063b93ea7ad14610232578063bc197c8114610245578063f23a6e611461028d5761007b565b8063150b7a021461013e5780631a9b2337146101b95780634fcf3eca146101fe5761007b565b3661007b57005b6004361061013c57600061009761009236836105df565b6102d3565b905073ffffffffffffffffffffffffffffffffffffffff81161561013a576000808273ffffffffffffffffffffffffffffffffffffffff166000366040516100e0929190610645565b600060405180830381855af49150503d806000811461011b576040519150601f19603f3d011682016040523d82523d6000602084013e610120565b606091505b50915091508161013257805160208201fd5b805160208201f35b505b005b34801561014a57600080fd5b506101836101593660046106c7565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b3480156101c557600080fd5b506101d96101d4366004610766565b610327565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b0565b61013c61020c366004610766565b610332565b34801561021d57600080fd5b5061013c61022c366004610788565b50505050565b61013c6102403660046107e2565b6103fc565b34801561025157600080fd5b5061018361026036600461085a565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561029957600080fd5b506101836102a8366004610921565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60006103217fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff0000000000000000000000000000000000000000000000000000000084166104c1565b92915050565b6000610321826102d3565b333014610372576040517fa19dbf000000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b600061037d826102d3565b73ffffffffffffffffffffffffffffffffffffffff16036103ee576040517f1c3812cc0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000082166004820152602401610369565b6103f981600061051f565b50565b333014610437576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610369565b6000610442836102d3565b73ffffffffffffffffffffffffffffffffffffffff16146104b3576040517f5b4d6d6a0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000083166004820152602401610369565b6104bd828261051f565b5050565b60008083836040516020016104e0929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008516828401819052835180840385018152606084018086528151919093012073ffffffffffffffffffffffffffffffffffffffff8616908190559152608082015290517f0d7fc113eaf016db4681a1ba86d083ce3e0961f321062a75ac2b0aeb33deeed19181900360a00190a15050565b80357fffffffff00000000000000000000000000000000000000000000000000000000811690600484101561063e577fffffffff00000000000000000000000000000000000000000000000000000000808560040360031b1b82161691505b5092915050565b8183823760009101908152919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461067957600080fd5b919050565b60008083601f84011261069057600080fd5b50813567ffffffffffffffff8111156106a857600080fd5b6020830191508360208285010111156106c057600080fd5b9250929050565b6000806000806000608086880312156106df57600080fd5b6106e886610655565b94506106f660208701610655565b935060408601359250606086013567ffffffffffffffff81111561071957600080fd5b6107258882890161067e565b969995985093965092949392505050565b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461067957600080fd5b60006020828403121561077857600080fd5b61078182610736565b9392505050565b6000806000806060858703121561079e57600080fd5b6107a785610655565b935060208501359250604085013567ffffffffffffffff8111156107ca57600080fd5b6107d68782880161067e565b95989497509550505050565b600080604083850312156107f557600080fd5b6107fe83610736565b915061080c60208401610655565b90509250929050565b60008083601f84011261082757600080fd5b50813567ffffffffffffffff81111561083f57600080fd5b6020830191508360208260051b85010111156106c057600080fd5b60008060008060008060008060a0898b03121561087657600080fd5b61087f89610655565b975061088d60208a01610655565b9650604089013567ffffffffffffffff8111156108a957600080fd5b6108b58b828c01610815565b909750955050606089013567ffffffffffffffff8111156108d557600080fd5b6108e18b828c01610815565b909550935050608089013567ffffffffffffffff81111561090157600080fd5b61090d8b828c0161067e565b999c989b5096995094979396929594505050565b60008060008060008060a0878903121561093a57600080fd5b61094387610655565b955061095160208801610655565b94506040870135935060608701359250608087013567ffffffffffffffff81111561097b57600080fd5b61098789828a0161067e565b979a969950949750929593949250505056fea26469706673582212207401ad4ec542e2cf3e76158237f91d283186cc551ec49e40776d68dc127e999464736f6c634300081b0033", + "deployedBytecode": "0x6080604052600436106100745760003560e01c80638943ec021161004e5780638943ec0214610211578063b93ea7ad14610232578063bc197c8114610245578063f23a6e611461028d5761007b565b8063150b7a021461013e5780631a9b2337146101b95780634fcf3eca146101fe5761007b565b3661007b57005b6004361061013c57600061009761009236836105df565b6102d3565b905073ffffffffffffffffffffffffffffffffffffffff81161561013a576000808273ffffffffffffffffffffffffffffffffffffffff166000366040516100e0929190610645565b600060405180830381855af49150503d806000811461011b576040519150601f19603f3d011682016040523d82523d6000602084013e610120565b606091505b50915091508161013257805160208201fd5b805160208201f35b505b005b34801561014a57600080fd5b506101836101593660046106c7565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b3480156101c557600080fd5b506101d96101d4366004610766565b610327565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b0565b61013c61020c366004610766565b610332565b34801561021d57600080fd5b5061013c61022c366004610788565b50505050565b61013c6102403660046107e2565b6103fc565b34801561025157600080fd5b5061018361026036600461085a565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561029957600080fd5b506101836102a8366004610921565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60006103217fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff0000000000000000000000000000000000000000000000000000000084166104c1565b92915050565b6000610321826102d3565b333014610372576040517fa19dbf000000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b600061037d826102d3565b73ffffffffffffffffffffffffffffffffffffffff16036103ee576040517f1c3812cc0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000082166004820152602401610369565b6103f981600061051f565b50565b333014610437576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610369565b6000610442836102d3565b73ffffffffffffffffffffffffffffffffffffffff16146104b3576040517f5b4d6d6a0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000083166004820152602401610369565b6104bd828261051f565b5050565b60008083836040516020016104e0929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008516828401819052835180840385018152606084018086528151919093012073ffffffffffffffffffffffffffffffffffffffff8616908190559152608082015290517f0d7fc113eaf016db4681a1ba86d083ce3e0961f321062a75ac2b0aeb33deeed19181900360a00190a15050565b80357fffffffff00000000000000000000000000000000000000000000000000000000811690600484101561063e577fffffffff00000000000000000000000000000000000000000000000000000000808560040360031b1b82161691505b5092915050565b8183823760009101908152919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461067957600080fd5b919050565b60008083601f84011261069057600080fd5b50813567ffffffffffffffff8111156106a857600080fd5b6020830191508360208285010111156106c057600080fd5b9250929050565b6000806000806000608086880312156106df57600080fd5b6106e886610655565b94506106f660208701610655565b935060408601359250606086013567ffffffffffffffff81111561071957600080fd5b6107258882890161067e565b969995985093965092949392505050565b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461067957600080fd5b60006020828403121561077857600080fd5b61078182610736565b9392505050565b6000806000806060858703121561079e57600080fd5b6107a785610655565b935060208501359250604085013567ffffffffffffffff8111156107ca57600080fd5b6107d68782880161067e565b95989497509550505050565b600080604083850312156107f557600080fd5b6107fe83610736565b915061080c60208401610655565b90509250929050565b60008083601f84011261082757600080fd5b50813567ffffffffffffffff81111561083f57600080fd5b6020830191508360208260051b85010111156106c057600080fd5b60008060008060008060008060a0898b03121561087657600080fd5b61087f89610655565b975061088d60208a01610655565b9650604089013567ffffffffffffffff8111156108a957600080fd5b6108b58b828c01610815565b909750955050606089013567ffffffffffffffff8111156108d557600080fd5b6108e18b828c01610815565b909550935050608089013567ffffffffffffffff81111561090157600080fd5b61090d8b828c0161067e565b999c989b5096995094979396929594505050565b60008060008060008060a0878903121561093a57600080fd5b61094387610655565b955061095160208801610655565b94506040870135935060608701359250608087013567ffffffffffffffff81111561097b57600080fd5b61098789828a0161067e565b979a969950949750929593949250505056fea26469706673582212207401ad4ec542e2cf3e76158237f91d283186cc551ec49e40776d68dc127e999464736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/IERC1155Receiver.json b/testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/IERC1155Receiver.json new file mode 100644 index 00000000..cbcdb348 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/IERC1155Receiver.json @@ -0,0 +1,89 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IERC1155Receiver", + "sourceName": "src/modules/Hooks.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/IERC223Receiver.json b/testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/IERC223Receiver.json new file mode 100644 index 00000000..7c0dd6fb --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/IERC223Receiver.json @@ -0,0 +1,34 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IERC223Receiver", + "sourceName": "src/modules/Hooks.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "tokenReceived", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/IERC721Receiver.json b/testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/IERC721Receiver.json new file mode 100644 index 00000000..7a10bb21 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/Hooks.sol/IERC721Receiver.json @@ -0,0 +1,45 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IERC721Receiver", + "sourceName": "src/modules/Hooks.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/Implementation.sol/Implementation.json b/testchain/artifacts/wallet-contracts-v3/modules/Implementation.sol/Implementation.json new file mode 100644 index 00000000..47444ac1 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/Implementation.sol/Implementation.json @@ -0,0 +1,61 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Implementation", + "sourceName": "src/modules/Implementation.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + } + ], + "name": "OnlySelf", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ImplementationUpdated", + "type": "event" + }, + { + "inputs": [], + "name": "getImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_implementation", + "type": "address" + } + ], + "name": "updateImplementation", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x6080604052348015600f57600080fd5b506101a28061001f6000396000f3fe6080604052600436106100295760003560e01c8063025b22bc1461002e578063aaf10f4214610043575b600080fd5b61004161003c36600461012f565b610081565b005b34801561004f57600080fd5b506100586100cc565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3330146100c0576040517fa19dbf0000000000000000000000000000000000000000000000000000000000815233600482015260240160405180910390fd5b6100c9816100db565b50565b60006100d6305490565b905090565b6100e3813055565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca039060200160405180910390a150565b60006020828403121561014157600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461016557600080fd5b939250505056fea2646970667358221220005823243d8e8c607d6060c61090a2e432eb1bd21affd4071a30c7f60e2b02c064736f6c634300081b0033", + "deployedBytecode": "0x6080604052600436106100295760003560e01c8063025b22bc1461002e578063aaf10f4214610043575b600080fd5b61004161003c36600461012f565b610081565b005b34801561004f57600080fd5b506100586100cc565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3330146100c0576040517fa19dbf0000000000000000000000000000000000000000000000000000000000815233600482015260240160405180910390fd5b6100c9816100db565b50565b60006100d6305490565b905090565b6100e3813055565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca039060200160405180910390a150565b60006020828403121561014157600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461016557600080fd5b939250505056fea2646970667358221220005823243d8e8c607d6060c61090a2e432eb1bd21affd4071a30c7f60e2b02c064736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/Nonce.sol/Nonce.json b/testchain/artifacts/wallet-contracts-v3/modules/Nonce.sol/Nonce.json new file mode 100644 index 00000000..67c6ae2a --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/Nonce.sol/Nonce.json @@ -0,0 +1,70 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Nonce", + "sourceName": "src/modules/Nonce.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + } + ], + "name": "BadNonce", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_newNonce", + "type": "uint256" + } + ], + "name": "NonceChange", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + } + ], + "name": "readNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x6080604052348015600f57600080fd5b506101298061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80638c3f556314602d575b600080fd5b603c603836600460db565b604e565b60405190815260200160405180910390f35b600060787f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83607e565b92915050565b6000808383604051602001609c929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60006020828403121560ec57600080fd5b503591905056fea2646970667358221220860e9a09ba5fd84e76ae122b612b61370ba556f8d39966c4c2da5f4380d22a7264736f6c634300081b0033", + "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c80638c3f556314602d575b600080fd5b603c603836600460db565b604e565b60405190815260200160405180910390f35b600060787f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83607e565b92915050565b6000808383604051602001609c929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60006020828403121560ec57600080fd5b503591905056fea2646970667358221220860e9a09ba5fd84e76ae122b612b61370ba556f8d39966c4c2da5f4380d22a7264736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/Payload.sol/Payload.json b/testchain/artifacts/wallet-contracts-v3/modules/Payload.sol/Payload.json new file mode 100644 index 00000000..84e5efaf --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/Payload.sol/Payload.json @@ -0,0 +1,113 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Payload", + "sourceName": "src/modules/Payload.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + } + ], + "name": "InvalidKind", + "type": "error" + }, + { + "inputs": [], + "name": "BEHAVIOR_ABORT_ON_ERROR", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "BEHAVIOR_IGNORE_ERROR", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "BEHAVIOR_REVERT_ON_ERROR", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KIND_CONFIG_UPDATE", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KIND_DIGEST", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KIND_MESSAGE", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KIND_TRANSACTIONS", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60eb610038600b82828239805160001a607314602b57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610607e5760003560e01c8063420b0c2511605f578063420b0c251460835780634a7d2aa01460a05780634e5f57151460a7578063b570180a1460ae57600080fd5b80630739d59a146083578063075a3d2d1460a05780633d5c1f9b1460a7575b600080fd5b608a600281565b60405160ff909116815260200160405180910390f35b608a600081565b608a600181565b608a60038156fea2646970667358221220f3fce63aa6991f22d43e5e0808a092b0d29d70a05abc865453439bfc9b8ed95864736f6c634300081b0033", + "deployedBytecode": "0x7300000000000000000000000000000000000000003014608060405260043610607e5760003560e01c8063420b0c2511605f578063420b0c251460835780634a7d2aa01460a05780634e5f57151460a7578063b570180a1460ae57600080fd5b80630739d59a146083578063075a3d2d1460a05780633d5c1f9b1460a7575b600080fd5b608a600281565b60405160ff909116815260200160405180910390f35b608a600081565b608a600181565b608a60038156fea2646970667358221220f3fce63aa6991f22d43e5e0808a092b0d29d70a05abc865453439bfc9b8ed95864736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/Storage.sol/Storage.json b/testchain/artifacts/wallet-contracts-v3/modules/Storage.sol/Storage.json new file mode 100644 index 00000000..b09eb6a6 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/Storage.sol/Storage.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Storage", + "sourceName": "src/modules/Storage.sol", + "abi": [], + "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212201f4d29faace7c5917dc9eba9634961e06a727964fafce214043fef8b39ba3cb964736f6c634300081b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212201f4d29faace7c5917dc9eba9634961e06a727964fafce214043fef8b39ba3cb964736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/auth/BaseAuth.sol/BaseAuth.json b/testchain/artifacts/wallet-contracts-v3/modules/auth/BaseAuth.sol/BaseAuth.json new file mode 100644 index 00000000..42081ac1 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/auth/BaseAuth.sol/BaseAuth.json @@ -0,0 +1,628 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BaseAuth", + "sourceName": "src/modules/auth/BaseAuth.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_signer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidERC1271Signature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + } + ], + "name": "InvalidKind", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSapientSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_flag", + "type": "uint256" + } + ], + "name": "InvalidSignatureFlag", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "InvalidSignatureWeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_expires", + "type": "uint256" + } + ], + "name": "InvalidStaticSignatureExpired", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_caller", + "type": "address" + }, + { + "internalType": "address", + "name": "_expectedCaller", + "type": "address" + } + ], + "name": "InvalidStaticSignatureWrongCaller", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "LowWeightChainedSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + } + ], + "name": "OnlySelf", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "internalType": "struct Snapshot", + "name": "_snapshot", + "type": "tuple" + } + ], + "name": "UnusedSnapshot", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_nextCheckpoint", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_checkpoint", + "type": "uint256" + } + ], + "name": "WrongChainedCheckpointOrder", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint96", + "name": "_timestamp", + "type": "uint96" + } + ], + "name": "StaticSignatureSet", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + } + ], + "name": "getStaticSignature", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverPartialSignature", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isValidImage", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "opHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverSapientSignature", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "internalType": "uint96", + "name": "_timestamp", + "type": "uint96" + } + ], + "name": "setStaticSignature", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_imageHash", + "type": "bytes32" + } + ], + "name": "updateImageHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/auth/BaseSig.sol/BaseSig.json b/testchain/artifacts/wallet-contracts-v3/modules/auth/BaseSig.sol/BaseSig.json new file mode 100644 index 00000000..74a3ef14 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/auth/BaseSig.sol/BaseSig.json @@ -0,0 +1,103 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BaseSig", + "sourceName": "src/modules/auth/BaseSig.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_signer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidERC1271Signature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_flag", + "type": "uint256" + } + ], + "name": "InvalidSignatureFlag", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "LowWeightChainedSignature", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "internalType": "struct Snapshot", + "name": "_snapshot", + "type": "tuple" + } + ], + "name": "UnusedSnapshot", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_nextCheckpoint", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_checkpoint", + "type": "uint256" + } + ], + "name": "WrongChainedCheckpointOrder", + "type": "error" + } + ], + "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212206b13ed3431d39321c0cfb308a4ada0663b68746a040b1c24cf1730ea61c6983864736f6c634300081b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212206b13ed3431d39321c0cfb308a4ada0663b68746a040b1c24cf1730ea61c6983864736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/auth/SelfAuth.sol/SelfAuth.json b/testchain/artifacts/wallet-contracts-v3/modules/auth/SelfAuth.sol/SelfAuth.json new file mode 100644 index 00000000..7a12c183 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/auth/SelfAuth.sol/SelfAuth.json @@ -0,0 +1,22 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "SelfAuth", + "sourceName": "src/modules/auth/SelfAuth.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + } + ], + "name": "OnlySelf", + "type": "error" + } + ], + "bytecode": "0x6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea264697066735822122025a1b61388a0387df434129bcca8531d7e46b38791d4ab8bf7409e3304fa83b764736f6c634300081b0033", + "deployedBytecode": "0x6080604052600080fdfea264697066735822122025a1b61388a0387df434129bcca8531d7e46b38791d4ab8bf7409e3304fa83b764736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/auth/Stage1Auth.sol/Stage1Auth.json b/testchain/artifacts/wallet-contracts-v3/modules/auth/Stage1Auth.sol/Stage1Auth.json new file mode 100644 index 00000000..e33742ae --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/auth/Stage1Auth.sol/Stage1Auth.json @@ -0,0 +1,751 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Stage1Auth", + "sourceName": "src/modules/auth/Stage1Auth.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_factory", + "type": "address" + }, + { + "internalType": "address", + "name": "_stage2", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ImageHashIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_signer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidERC1271Signature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + } + ], + "name": "InvalidKind", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSapientSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_flag", + "type": "uint256" + } + ], + "name": "InvalidSignatureFlag", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes1", + "name": "_type", + "type": "bytes1" + } + ], + "name": "InvalidSignatureType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "InvalidSignatureWeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_expires", + "type": "uint256" + } + ], + "name": "InvalidStaticSignatureExpired", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_caller", + "type": "address" + }, + { + "internalType": "address", + "name": "_expectedCaller", + "type": "address" + } + ], + "name": "InvalidStaticSignatureWrongCaller", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "LowWeightChainedSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + } + ], + "name": "OnlySelf", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "internalType": "struct Snapshot", + "name": "_snapshot", + "type": "tuple" + } + ], + "name": "UnusedSnapshot", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_nextCheckpoint", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_checkpoint", + "type": "uint256" + } + ], + "name": "WrongChainedCheckpointOrder", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "newImageHash", + "type": "bytes32" + } + ], + "name": "ImageHashUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint96", + "name": "_timestamp", + "type": "uint96" + } + ], + "name": "StaticSignatureSet", + "type": "event" + }, + { + "inputs": [], + "name": "FACTORY", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "INIT_CODE_HASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAGE_2_IMPLEMENTATION", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + } + ], + "name": "getStaticSignature", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverPartialSignature", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isValidImage", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "opHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverSapientSignature", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "internalType": "uint96", + "name": "_timestamp", + "type": "uint96" + } + ], + "name": "setStaticSignature", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_imageHash", + "type": "bytes32" + } + ], + "name": "updateImageHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_implementation", + "type": "address" + } + ], + "name": "updateImplementation", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x60e060405234801561001057600080fd5b50604051612f8e380380612f8e83398101604081905261002f916100ab565b60006040518060600160405280602c8152602001612f62602c913960405161005c919030906020016100de565b60408051601f198184030181529190528051602090910120608052506001600160a01b0391821660a0521660c052610110565b80516001600160a01b03811681146100a657600080fd5b919050565b600080604083850312156100be57600080fd5b6100c78361008f565b91506100d56020840161008f565b90509250929050565b6000835160005b818110156100ff57602081870181015185830152016100e5565b509190910191825250602001919050565b60805160a05160c051612e00610162600039600081816102650152610b7b0152600081816101c0015281816106380152610a2401526000818161016c015281816106690152610a550152612e006000f3fe6080604052600436106100bc5760003560e01c80632dd3100011610074578063aaf10f421161004e578063aaf10f4214610287578063ad55366b1461029c578063f727ef1c146102ef57600080fd5b80632dd31000146101ae57806392dcb3fc146102075780639f69ef541461025357600080fd5b80631626ba7e116100a55780631626ba7e14610109578063257671f51461015a578063295614261461018e57600080fd5b8063025b22bc146100c157806313792a4a146100d6575b600080fd5b6100d46100cf366004612334565b61030f565b005b3480156100e257600080fd5b506100f66100f13660046126d8565b61035b565b6040519081526020015b60405180910390f35b34801561011557600080fd5b5061012961012436600461281f565b6104c6565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610100565b34801561016657600080fd5b506100f67f000000000000000000000000000000000000000000000000000000000000000081565b34801561019a57600080fd5b506100d46101a9366004612852565b61055d565b3480156101ba57600080fd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561021357600080fd5b50610227610222366004612852565b6105a1565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610100565b34801561025f57600080fd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b34801561029357600080fd5b506101e26105b6565b3480156102a857600080fd5b506102bc6102b73660046126d8565b6105c5565b604080519687526020870195909552921515938501939093526060840152608083019190915260a082015260c001610100565b3480156102fb57600080fd5b506100d461030a36600461286b565b6106f6565b33301461034f576040517fa19dbf000000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b610358816107b1565b50565b60008084610100015151600161037191906128bc565b67ffffffffffffffff8111156103895761038961234f565b6040519080825280602002602001820160405280156103b2578160200160208202803683370190505b50905060005b856101000151518110156104245785610100015181815181106103dd576103dd6128f6565b60200260200101518282815181106103f7576103f76128f6565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526001016103b8565b503381866101000151518151811061043e5761043e6128f6565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261010085018190526000610478868686610805565b509050806104b8578585856040517ff58cc8b500000000000000000000000000000000000000000000000000000000815260040161034693929190612ba8565b5060019150505b9392505050565b604080516101208101825260006020820181905260609282018390528282018190526080820181905260a0820183905260c082018190526101008201929092526003815260e08101859052600061051e828686610805565b509050806105325750600091506104bf9050565b507f20c13b0b0000000000000000000000000000000000000000000000000000000095945050505050565b333014610598576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610346565b61035881610ae3565b6000806105ad83610b9f565b91509150915091565b60006105c0305490565b905090565b6000806000806000806105dc898989600080610beb565b9399509197509450925090506106e8836040517fff0000000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060601b166021820152603581018290527f000000000000000000000000000000000000000000000000000000000000000060558201526000903090607501604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012073ffffffffffffffffffffffffffffffffffffffff161492915050565b935093975093979195509350565b333014610731576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610346565b61074a8383836bffffffffffffffffffffffff16610f10565b6040805184815273ffffffffffffffffffffffffffffffffffffffff841660208201526bffffffffffffffffffffffff83168183015290517febf265acfac1c01de588ed7ef49743b9c3ce8d6d1edeaf510a1f5453228515b19181900360600190a1505050565b6107b9813055565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca039060200160405180910390a150565b60008060008484600081811061081d5761081d6128f6565b7fff000000000000000000000000000000000000000000000000000000000000009201359182169250507f800000000000000000000000000000000000000000000000000000000000000090811690036109725761087a86610f9f565b915060008061088884610b9f565b915091504281116108cf576040517ff95b6ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101829052604401610346565b73ffffffffffffffffffffffffffffffffffffffff82161580159061090a575073ffffffffffffffffffffffffffffffffffffffff82163314155b15610966576040517f8945c3130000000000000000000000000000000000000000000000000000000081526004810185905233602482015273ffffffffffffffffffffffffffffffffffffffff83166044820152606401610346565b60019450505050610adb565b6000806000610985898989600080610beb565b9850929550909350915050828210156109d4576040517ffd41fcba0000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610346565b610ad4816040517fff0000000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060601b166021820152603581018290527f000000000000000000000000000000000000000000000000000000000000000060558201526000903090607501604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012073ffffffffffffffffffffffffffffffffffffffff161492915050565b9550505050505b935093915050565b80610b1a576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b437fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8829055565b6040518181527f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa9060200160405180910390a16103587f00000000000000000000000000000000000000000000000000000000000000006107b1565b60008080610bcd7fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e868561101a565b606081901c956bffffffffffffffffffffffff909116945092505050565b6040805180820182526000808252602082018190529182918291829182918a3560f81c91600191808416148015610c36575073ffffffffffffffffffffffffffffffffffffffff8916155b15610d52578b82013560601c985060149091019089610d525760038201918c013560e81c60008d848e610c6985836128bc565b92610c7693929190612bd8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040517fccce3bc80000000000000000000000000000000000000000000000000000000081529293505073ffffffffffffffffffffffffffffffffffffffff8d169163ccce3bc89150610d019030908590600401612c02565b6040805180830381865afa158015610d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d419190612c39565b9250610d4d82856128bc565b935050505b82600116600103610d8c57610d7a8d8a838f8f87908092610d7593929190612bd8565b611078565b97509750975097509750505050610f03565b6002838116811460208f015283901c60071660016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018e850135610100929092039190911c16838201909650925060009050610df76001600586901c8116906128bc565b60016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018f860135610100929092039190911c1699509092019150610e428d610f9f565b9350610e608d858e8e86908092610e5b93929190612bd8565b6112bc565b600090815260208a815260408083208352888252808320835273ffffffffffffffffffffffffffffffffffffffff8d1690915290208251919850965015801590610eab575080518614155b8015610ebb575080602001518511155b15610eff576040517fccbb534f0000000000000000000000000000000000000000000000000000000081528151600482015260208201516024820152604401610346565b5050505b9550955095509550959050565b610f9a7fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e86847fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b166bffffffffffffffffffffffff8516176040805160208082019590955280820193909352805180840382018152606090930190528151919092012055565b505050565b600080610fb0836020015130611c4e565b90506000610fbd84611d1c565b6040517f1901000000000000000000000000000000000000000000000000000000000000602082015260228101849052604281018290529091506062015b6040516020818303038152906040528051906020012092505050919050565b6000808383604051602001611039929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60008060008060006110da604051806101200160405280600060ff168152602001600015158152602001606081526020016000815260200160008152602001606081526020016000801916815260200160008019168152602001606081525090565b6002815260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b888210156112645760038201916000908b013560e81c61112284826128bc565b9150600090508a8214611136576000611138565b8d5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036111905761117f8f8d8d8790869261117793929190612bd8565b600185610beb565b939d50919b509950975095506111b2565b6111a6858d8d8790869261117793929190612bd8565b50929c50909a50985096505b898910156111fe576111c682858d8f612bd8565b8b8b6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016103469493929190612c8a565b819350878d60000151036112115760008d525b828710611254576040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004810188905260248101849052604401610346565b50505060c0820185905283611102565b8a511580159061127857508a602001518511155b15610eff576040517fccbb534f0000000000000000000000000000000000000000000000000000000081528b51600482015260208c01516024820152604401610346565b60008060005b83811015611c4457600181019085013560f881901c9060fc1c806113df57600f821660008190036112fa5750600183019287013560f81c5b60408051600080825260208281018085528d9052601b8c89019182013560ff81811c928301908116868801529235606086018190527f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82166080870181905296909a0199959094919390929160019060a0015b6020604051602081039080840390855afa15801561138f573d6000803e3d6000fd5b5050506020604051035190508660ff168c019b5060006113b2828960ff16611f88565b90508b6113bf57806113ce565b60008c81526020829052604090205b9b50505050505050505050506112c2565b6001810361144357600f821660008190036114015750600183019287013560f81c5b601484019388013560601c600061141b8260ff8516611f88565b9050866114285780611437565b60008781526020829052604090205b965050505050506112c2565b60028103611638576003821660008190036114655750600183019287013560f81c5b60008489013560601c60148601955090506003600285901c16600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c168288018098508192505050600081880190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff16631626ba7e8f8f8f8d90879261152393929190612bd8565b6040518463ffffffff1660e01b815260040161154193929190612cb1565b602060405180830381865afa15801561155e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115829190612ccb565b7fffffffff0000000000000000000000000000000000000000000000000000000016146115f3578c848d8d8b9085926115bd93929190612bd8565b6040517fb2fed7ae0000000000000000000000000000000000000000000000000000000081526004016103469493929190612d0d565b8097508460ff168a019950600061160d858760ff16611f88565b90508961161a5780611629565b60008a81526020829052604090205b995050505050505050506112c2565b6003810361166c576020830192870135846116535780611662565b60008581526020829052604090205b94505050506112c2565b6004810361170f57600f8216600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018a870135610100929092039190911c168583018096508192505050600081860190506000806116e18e8e8e8e8c908892610e5b93929190612bd8565b91509150829750818a019950611701898260009182526020526040902090565b9850505050505050506112c2565b600681036117d9576003600283901c1660008190036117355750600183019287013560f81c5b60038316600081900361174f5750600284019388013560f01c5b6000858a013560e81c600387018162ffffff16915080975081925050506000818701905060008061178d8f8f8f8f8d908892610e5b93929190612bd8565b915091508298508482106117a057998501995b60006117ad828789611fef565b90508a6117ba57806117c9565b60008b81526020829052604090205b9a505050505050505050506112c2565b60058103611846576020830192870135888103611814577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505b600061181f82612053565b90508561182c578061183b565b60008681526020829052604090205b9550505050506112c2565b6007810361194c57600f821660008190036118685750600183019287013560f81c5b600080858a0135602087019650915089860135602087016040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018e905290975090915060ff82901c907f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690601b830190600090600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff851690820152606081018890526080810185905260a00161136d565b600881036119a057602083019287013560006119688b826120a7565b9050808203611995577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505b600061141b82612122565b60098103611ad8576003821660008190036119c25750600183019287013560f81c5b60008489013560601c601486019550905060006003600286901c1660016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c168188018098508193505050506000818701905060008373ffffffffffffffffffffffffffffffffffffffff166313792a4a8f8e8e8c908792611a5c93929190612bd8565b6040518463ffffffff1660e01b8152600401611a7a93929190612ba8565b602060405180830381865afa158015611a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abb9190612d43565b90508197508460ff168a019950600061160d858760ff168461215d565b600a8103611c0f57600382166000819003611afa5750600183019287013560f81c5b60008489013560601c60148601955090506003600285901c16600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c1682880180985081925050506000818801905060008473ffffffffffffffffffffffffffffffffffffffff1663898bd9218f8f8f8d908792611b9393929190612bd8565b6040518463ffffffff1660e01b8152600401611bb193929190612cb1565b602060405180830381865afa158015611bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf29190612d43565b90508198508560ff168b019a5060006117ad868860ff168461215d565b6040517fb2505f7c00000000000000000000000000000000000000000000000000000000815260048101829052602401610346565b5094509492505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de85611cbe5746611cc1565b60005b6040805160208101959095528401929092526060830152608082015273ffffffffffffffffffffffffffffffffffffffff831660a082015260c0015b6040516020818303038152906040528051906020012090505b92915050565b600080826101000151604051602001611d359190612d5c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120835190915060ff16611dde576000611d8684604001516121cb565b606080860151608080880151604080517f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a260208201529081018690529384019290925282015260a0810184905290915060c001610ffb565b825160ff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01611e6e5760a08301518051602091820120604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46693810193909352820152606081018290526080015b60405160208183030381529060405280519060200120915050919050565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611ede5760c0830151604080517f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e460208201529081019190915260608101829052608001611e50565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd01611f4e5760e0830151604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46660208201529081019190915260608101829052608001611e50565b82516040517f0481832000000000000000000000000000000000000000000000000000000000815260ff9091166004820152602401610346565b6040517f53657175656e6365207369676e65723a0a00000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b16603182015260458101829052600090606501611cfd565b6040517f53657175656e6365206e657374656420636f6e6669673a0a000000000000000060208201526038810184905260588101839052607881018290526000906098015b6040516020818303038152906040528051906020012090509392505050565b6040517f53657175656e636520737461746963206469676573743a0a00000000000000006020820152603881018290526000906058015b604051602081830303815290604052805190602001209050919050565b6000806120b8846020015184611c4e565b905060006120c585611d1c565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526022810184905260428101829052909150606201604051602081830303815290604052805190602001209250505092915050565b604080517f53657175656e636520616e792061646472657373207375626469676573743a0a602082015290810182905260009060600161208a565b6040517f53657175656e63652073617069656e7420636f6e6669673a0a0000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166039820152604d8101839052606d8101829052600090608d01612034565b6000606060005b835181101561224d5760006121ff8583815181106121f2576121f26128f6565b602002602001015161225c565b90508281604051602001612214929190612da8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529250506001016121d2565b50805160209091012092915050565b60007f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef43782600001518360200151846040015180519060200120856060015186608001518760a001518860c0015160405160200161208a98979695949392919097885273ffffffffffffffffffffffffffffffffffffffff969096166020880152604087019490945260608601929092526080850152151560a0840152151560c083015260e08201526101000190565b803573ffffffffffffffffffffffffffffffffffffffff8116811461232f57600080fd5b919050565b60006020828403121561234657600080fd5b6104bf8261230b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff811182821017156123a1576123a161234f565b60405290565b604051610120810167ffffffffffffffff811182821017156123a1576123a161234f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156124125761241261234f565b604052919050565b803560ff8116811461232f57600080fd5b8035801515811461232f57600080fd5b600067ffffffffffffffff8211156124555761245561234f565b5060051b60200190565b600082601f83011261247057600080fd5b813567ffffffffffffffff81111561248a5761248a61234f565b6124bb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016123cb565b8181528460208386010111156124d057600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126124fe57600080fd5b813561251161250c8261243b565b6123cb565b8082825260208201915060208360051b86010192508583111561253357600080fd5b602085015b8381101561262057803567ffffffffffffffff81111561255757600080fd5b860160e08189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001121561258b57600080fd5b61259361237e565b61259f6020830161230b565b815260408201356020820152606082013567ffffffffffffffff8111156125c557600080fd5b6125d48a60208386010161245f565b604083015250608082013560608201526125f060a0830161242b565b608082015261260160c0830161242b565b60a082015260e0919091013560c0820152835260209283019201612538565b5095945050505050565b600082601f83011261263b57600080fd5b813561264961250c8261243b565b8082825260208201915060208360051b86010192508583111561266b57600080fd5b602085015b83811015612620576126818161230b565b835260209283019201612670565b60008083601f8401126126a157600080fd5b50813567ffffffffffffffff8111156126b957600080fd5b6020830191508360208285010111156126d157600080fd5b9250929050565b6000806000604084860312156126ed57600080fd5b833567ffffffffffffffff81111561270457600080fd5b8401610120818703121561271757600080fd5b61271f6123a7565b6127288261241a565b81526127366020830161242b565b6020820152604082013567ffffffffffffffff81111561275557600080fd5b612761888285016124ed565b604083015250606082810135908201526080808301359082015260a082013567ffffffffffffffff81111561279557600080fd5b6127a18882850161245f565b60a08301525060c0828101359082015260e0808301359082015261010082013567ffffffffffffffff8111156127d657600080fd5b6127e28882850161262a565b61010083015250935050602084013567ffffffffffffffff81111561280657600080fd5b6128128682870161268f565b9497909650939450505050565b60008060006040848603121561283457600080fd5b83359250602084013567ffffffffffffffff81111561280657600080fd5b60006020828403121561286457600080fd5b5035919050565b60008060006060848603121561288057600080fd5b833592506128906020850161230b565b915060408401356bffffffffffffffffffffffff811681146128b157600080fd5b809150509250925092565b80820180821115611d16577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60005b83811015612940578181015183820152602001612928565b50506000910152565b60008151808452612961816020860160208601612925565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208501945060208160051b8301016020850160005b83811015612a63577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0858403018852815173ffffffffffffffffffffffffffffffffffffffff815116845260208101516020850152604081015160e06040860152612a1f60e0860182612949565b6060838101519087015260808084015115159087015260a08084015115159087015260c09283015192909501919091525060209788019791909101906001016129b1565b50909695505050505050565b600081518084526020840193506020830160005b82811015612ab757815173ffffffffffffffffffffffffffffffffffffffff16865260209586019590910190600101612a83565b5093949350505050565b805160ff16825260006020820151612add602085018215159052565b5060408201516101206040850152612af9610120850182612993565b9050606083015160608501526080830151608085015260a083015184820360a0860152612b268282612949565b91505060c083015160c085015260e083015160e0850152610100830151848203610100860152612b568282612a6f565b95945050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081526000612bbb6040830186612ac1565b8281036020840152612bce818587612b5f565b9695505050505050565b60008085851115612be857600080fd5b83861115612bf557600080fd5b5050820193919092039150565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000612c316040830184612949565b949350505050565b60006040828403128015612c4c57600080fd5b506040805190810167ffffffffffffffff81118282101715612c7057612c7061234f565b604052825181526020928301519281019290925250919050565b606081526000612c9e606083018688612b5f565b6020830194909452506040015292915050565b838152604060208201526000612b56604083018486612b5f565b600060208284031215612cdd57600080fd5b81517fffffffff00000000000000000000000000000000000000000000000000000000811681146104bf57600080fd5b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000612bce606083018486612b5f565b600060208284031215612d5557600080fd5b5051919050565b8151600090829060208501835b82811015612d9d57815173ffffffffffffffffffffffffffffffffffffffff16845260209384019390910190600101612d69565b509195945050505050565b60008351612dba818460208801612925565b919091019182525060200191905056fea2646970667358221220495637c0653d9c6ae874bc236c551853ce5caad8e10d3446078722fe1280a1ef64736f6c634300081b0033603e600e3d39601e805130553df33d3d34601c57363d3d373d363d30545af43d82803e903d91601c57fd5bf3", + "deployedBytecode": "0x6080604052600436106100bc5760003560e01c80632dd3100011610074578063aaf10f421161004e578063aaf10f4214610287578063ad55366b1461029c578063f727ef1c146102ef57600080fd5b80632dd31000146101ae57806392dcb3fc146102075780639f69ef541461025357600080fd5b80631626ba7e116100a55780631626ba7e14610109578063257671f51461015a578063295614261461018e57600080fd5b8063025b22bc146100c157806313792a4a146100d6575b600080fd5b6100d46100cf366004612334565b61030f565b005b3480156100e257600080fd5b506100f66100f13660046126d8565b61035b565b6040519081526020015b60405180910390f35b34801561011557600080fd5b5061012961012436600461281f565b6104c6565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610100565b34801561016657600080fd5b506100f67f000000000000000000000000000000000000000000000000000000000000000081565b34801561019a57600080fd5b506100d46101a9366004612852565b61055d565b3480156101ba57600080fd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561021357600080fd5b50610227610222366004612852565b6105a1565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610100565b34801561025f57600080fd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b34801561029357600080fd5b506101e26105b6565b3480156102a857600080fd5b506102bc6102b73660046126d8565b6105c5565b604080519687526020870195909552921515938501939093526060840152608083019190915260a082015260c001610100565b3480156102fb57600080fd5b506100d461030a36600461286b565b6106f6565b33301461034f576040517fa19dbf000000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b610358816107b1565b50565b60008084610100015151600161037191906128bc565b67ffffffffffffffff8111156103895761038961234f565b6040519080825280602002602001820160405280156103b2578160200160208202803683370190505b50905060005b856101000151518110156104245785610100015181815181106103dd576103dd6128f6565b60200260200101518282815181106103f7576103f76128f6565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526001016103b8565b503381866101000151518151811061043e5761043e6128f6565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015261010085018190526000610478868686610805565b509050806104b8578585856040517ff58cc8b500000000000000000000000000000000000000000000000000000000815260040161034693929190612ba8565b5060019150505b9392505050565b604080516101208101825260006020820181905260609282018390528282018190526080820181905260a0820183905260c082018190526101008201929092526003815260e08101859052600061051e828686610805565b509050806105325750600091506104bf9050565b507f20c13b0b0000000000000000000000000000000000000000000000000000000095945050505050565b333014610598576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610346565b61035881610ae3565b6000806105ad83610b9f565b91509150915091565b60006105c0305490565b905090565b6000806000806000806105dc898989600080610beb565b9399509197509450925090506106e8836040517fff0000000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060601b166021820152603581018290527f000000000000000000000000000000000000000000000000000000000000000060558201526000903090607501604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012073ffffffffffffffffffffffffffffffffffffffff161492915050565b935093975093979195509350565b333014610731576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610346565b61074a8383836bffffffffffffffffffffffff16610f10565b6040805184815273ffffffffffffffffffffffffffffffffffffffff841660208201526bffffffffffffffffffffffff83168183015290517febf265acfac1c01de588ed7ef49743b9c3ce8d6d1edeaf510a1f5453228515b19181900360600190a1505050565b6107b9813055565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca039060200160405180910390a150565b60008060008484600081811061081d5761081d6128f6565b7fff000000000000000000000000000000000000000000000000000000000000009201359182169250507f800000000000000000000000000000000000000000000000000000000000000090811690036109725761087a86610f9f565b915060008061088884610b9f565b915091504281116108cf576040517ff95b6ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101829052604401610346565b73ffffffffffffffffffffffffffffffffffffffff82161580159061090a575073ffffffffffffffffffffffffffffffffffffffff82163314155b15610966576040517f8945c3130000000000000000000000000000000000000000000000000000000081526004810185905233602482015273ffffffffffffffffffffffffffffffffffffffff83166044820152606401610346565b60019450505050610adb565b6000806000610985898989600080610beb565b9850929550909350915050828210156109d4576040517ffd41fcba0000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610346565b610ad4816040517fff0000000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060601b166021820152603581018290527f000000000000000000000000000000000000000000000000000000000000000060558201526000903090607501604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012073ffffffffffffffffffffffffffffffffffffffff161492915050565b9550505050505b935093915050565b80610b1a576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b437fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8829055565b6040518181527f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa9060200160405180910390a16103587f00000000000000000000000000000000000000000000000000000000000000006107b1565b60008080610bcd7fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e868561101a565b606081901c956bffffffffffffffffffffffff909116945092505050565b6040805180820182526000808252602082018190529182918291829182918a3560f81c91600191808416148015610c36575073ffffffffffffffffffffffffffffffffffffffff8916155b15610d52578b82013560601c985060149091019089610d525760038201918c013560e81c60008d848e610c6985836128bc565b92610c7693929190612bd8565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040517fccce3bc80000000000000000000000000000000000000000000000000000000081529293505073ffffffffffffffffffffffffffffffffffffffff8d169163ccce3bc89150610d019030908590600401612c02565b6040805180830381865afa158015610d1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d419190612c39565b9250610d4d82856128bc565b935050505b82600116600103610d8c57610d7a8d8a838f8f87908092610d7593929190612bd8565b611078565b97509750975097509750505050610f03565b6002838116811460208f015283901c60071660016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018e850135610100929092039190911c16838201909650925060009050610df76001600586901c8116906128bc565b60016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018f860135610100929092039190911c1699509092019150610e428d610f9f565b9350610e608d858e8e86908092610e5b93929190612bd8565b6112bc565b600090815260208a815260408083208352888252808320835273ffffffffffffffffffffffffffffffffffffffff8d1690915290208251919850965015801590610eab575080518614155b8015610ebb575080602001518511155b15610eff576040517fccbb534f0000000000000000000000000000000000000000000000000000000081528151600482015260208201516024820152604401610346565b5050505b9550955095509550959050565b610f9a7fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e86847fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b166bffffffffffffffffffffffff8516176040805160208082019590955280820193909352805180840382018152606090930190528151919092012055565b505050565b600080610fb0836020015130611c4e565b90506000610fbd84611d1c565b6040517f1901000000000000000000000000000000000000000000000000000000000000602082015260228101849052604281018290529091506062015b6040516020818303038152906040528051906020012092505050919050565b6000808383604051602001611039929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60008060008060006110da604051806101200160405280600060ff168152602001600015158152602001606081526020016000815260200160008152602001606081526020016000801916815260200160008019168152602001606081525090565b6002815260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b888210156112645760038201916000908b013560e81c61112284826128bc565b9150600090508a8214611136576000611138565b8d5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036111905761117f8f8d8d8790869261117793929190612bd8565b600185610beb565b939d50919b509950975095506111b2565b6111a6858d8d8790869261117793929190612bd8565b50929c50909a50985096505b898910156111fe576111c682858d8f612bd8565b8b8b6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016103469493929190612c8a565b819350878d60000151036112115760008d525b828710611254576040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004810188905260248101849052604401610346565b50505060c0820185905283611102565b8a511580159061127857508a602001518511155b15610eff576040517fccbb534f0000000000000000000000000000000000000000000000000000000081528b51600482015260208c01516024820152604401610346565b60008060005b83811015611c4457600181019085013560f881901c9060fc1c806113df57600f821660008190036112fa5750600183019287013560f81c5b60408051600080825260208281018085528d9052601b8c89019182013560ff81811c928301908116868801529235606086018190527f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82166080870181905296909a0199959094919390929160019060a0015b6020604051602081039080840390855afa15801561138f573d6000803e3d6000fd5b5050506020604051035190508660ff168c019b5060006113b2828960ff16611f88565b90508b6113bf57806113ce565b60008c81526020829052604090205b9b50505050505050505050506112c2565b6001810361144357600f821660008190036114015750600183019287013560f81c5b601484019388013560601c600061141b8260ff8516611f88565b9050866114285780611437565b60008781526020829052604090205b965050505050506112c2565b60028103611638576003821660008190036114655750600183019287013560f81c5b60008489013560601c60148601955090506003600285901c16600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c168288018098508192505050600081880190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff16631626ba7e8f8f8f8d90879261152393929190612bd8565b6040518463ffffffff1660e01b815260040161154193929190612cb1565b602060405180830381865afa15801561155e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115829190612ccb565b7fffffffff0000000000000000000000000000000000000000000000000000000016146115f3578c848d8d8b9085926115bd93929190612bd8565b6040517fb2fed7ae0000000000000000000000000000000000000000000000000000000081526004016103469493929190612d0d565b8097508460ff168a019950600061160d858760ff16611f88565b90508961161a5780611629565b60008a81526020829052604090205b995050505050505050506112c2565b6003810361166c576020830192870135846116535780611662565b60008581526020829052604090205b94505050506112c2565b6004810361170f57600f8216600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018a870135610100929092039190911c168583018096508192505050600081860190506000806116e18e8e8e8e8c908892610e5b93929190612bd8565b91509150829750818a019950611701898260009182526020526040902090565b9850505050505050506112c2565b600681036117d9576003600283901c1660008190036117355750600183019287013560f81c5b60038316600081900361174f5750600284019388013560f01c5b6000858a013560e81c600387018162ffffff16915080975081925050506000818701905060008061178d8f8f8f8f8d908892610e5b93929190612bd8565b915091508298508482106117a057998501995b60006117ad828789611fef565b90508a6117ba57806117c9565b60008b81526020829052604090205b9a505050505050505050506112c2565b60058103611846576020830192870135888103611814577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505b600061181f82612053565b90508561182c578061183b565b60008681526020829052604090205b9550505050506112c2565b6007810361194c57600f821660008190036118685750600183019287013560f81c5b600080858a0135602087019650915089860135602087016040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018e905290975090915060ff82901c907f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690601b830190600090600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff851690820152606081018890526080810185905260a00161136d565b600881036119a057602083019287013560006119688b826120a7565b9050808203611995577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505b600061141b82612122565b60098103611ad8576003821660008190036119c25750600183019287013560f81c5b60008489013560601c601486019550905060006003600286901c1660016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c168188018098508193505050506000818701905060008373ffffffffffffffffffffffffffffffffffffffff166313792a4a8f8e8e8c908792611a5c93929190612bd8565b6040518463ffffffff1660e01b8152600401611a7a93929190612ba8565b602060405180830381865afa158015611a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abb9190612d43565b90508197508460ff168a019950600061160d858760ff168461215d565b600a8103611c0f57600382166000819003611afa5750600183019287013560f81c5b60008489013560601c60148601955090506003600285901c16600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c1682880180985081925050506000818801905060008473ffffffffffffffffffffffffffffffffffffffff1663898bd9218f8f8f8d908792611b9393929190612bd8565b6040518463ffffffff1660e01b8152600401611bb193929190612cb1565b602060405180830381865afa158015611bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf29190612d43565b90508198508560ff168b019a5060006117ad868860ff168461215d565b6040517fb2505f7c00000000000000000000000000000000000000000000000000000000815260048101829052602401610346565b5094509492505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de85611cbe5746611cc1565b60005b6040805160208101959095528401929092526060830152608082015273ffffffffffffffffffffffffffffffffffffffff831660a082015260c0015b6040516020818303038152906040528051906020012090505b92915050565b600080826101000151604051602001611d359190612d5c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120835190915060ff16611dde576000611d8684604001516121cb565b606080860151608080880151604080517f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a260208201529081018690529384019290925282015260a0810184905290915060c001610ffb565b825160ff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01611e6e5760a08301518051602091820120604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46693810193909352820152606081018290526080015b60405160208183030381529060405280519060200120915050919050565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611ede5760c0830151604080517f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e460208201529081019190915260608101829052608001611e50565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd01611f4e5760e0830151604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46660208201529081019190915260608101829052608001611e50565b82516040517f0481832000000000000000000000000000000000000000000000000000000000815260ff9091166004820152602401610346565b6040517f53657175656e6365207369676e65723a0a00000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b16603182015260458101829052600090606501611cfd565b6040517f53657175656e6365206e657374656420636f6e6669673a0a000000000000000060208201526038810184905260588101839052607881018290526000906098015b6040516020818303038152906040528051906020012090509392505050565b6040517f53657175656e636520737461746963206469676573743a0a00000000000000006020820152603881018290526000906058015b604051602081830303815290604052805190602001209050919050565b6000806120b8846020015184611c4e565b905060006120c585611d1c565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526022810184905260428101829052909150606201604051602081830303815290604052805190602001209250505092915050565b604080517f53657175656e636520616e792061646472657373207375626469676573743a0a602082015290810182905260009060600161208a565b6040517f53657175656e63652073617069656e7420636f6e6669673a0a0000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166039820152604d8101839052606d8101829052600090608d01612034565b6000606060005b835181101561224d5760006121ff8583815181106121f2576121f26128f6565b602002602001015161225c565b90508281604051602001612214929190612da8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529250506001016121d2565b50805160209091012092915050565b60007f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef43782600001518360200151846040015180519060200120856060015186608001518760a001518860c0015160405160200161208a98979695949392919097885273ffffffffffffffffffffffffffffffffffffffff969096166020880152604087019490945260608601929092526080850152151560a0840152151560c083015260e08201526101000190565b803573ffffffffffffffffffffffffffffffffffffffff8116811461232f57600080fd5b919050565b60006020828403121561234657600080fd5b6104bf8261230b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff811182821017156123a1576123a161234f565b60405290565b604051610120810167ffffffffffffffff811182821017156123a1576123a161234f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156124125761241261234f565b604052919050565b803560ff8116811461232f57600080fd5b8035801515811461232f57600080fd5b600067ffffffffffffffff8211156124555761245561234f565b5060051b60200190565b600082601f83011261247057600080fd5b813567ffffffffffffffff81111561248a5761248a61234f565b6124bb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016123cb565b8181528460208386010111156124d057600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126124fe57600080fd5b813561251161250c8261243b565b6123cb565b8082825260208201915060208360051b86010192508583111561253357600080fd5b602085015b8381101561262057803567ffffffffffffffff81111561255757600080fd5b860160e08189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001121561258b57600080fd5b61259361237e565b61259f6020830161230b565b815260408201356020820152606082013567ffffffffffffffff8111156125c557600080fd5b6125d48a60208386010161245f565b604083015250608082013560608201526125f060a0830161242b565b608082015261260160c0830161242b565b60a082015260e0919091013560c0820152835260209283019201612538565b5095945050505050565b600082601f83011261263b57600080fd5b813561264961250c8261243b565b8082825260208201915060208360051b86010192508583111561266b57600080fd5b602085015b83811015612620576126818161230b565b835260209283019201612670565b60008083601f8401126126a157600080fd5b50813567ffffffffffffffff8111156126b957600080fd5b6020830191508360208285010111156126d157600080fd5b9250929050565b6000806000604084860312156126ed57600080fd5b833567ffffffffffffffff81111561270457600080fd5b8401610120818703121561271757600080fd5b61271f6123a7565b6127288261241a565b81526127366020830161242b565b6020820152604082013567ffffffffffffffff81111561275557600080fd5b612761888285016124ed565b604083015250606082810135908201526080808301359082015260a082013567ffffffffffffffff81111561279557600080fd5b6127a18882850161245f565b60a08301525060c0828101359082015260e0808301359082015261010082013567ffffffffffffffff8111156127d657600080fd5b6127e28882850161262a565b61010083015250935050602084013567ffffffffffffffff81111561280657600080fd5b6128128682870161268f565b9497909650939450505050565b60008060006040848603121561283457600080fd5b83359250602084013567ffffffffffffffff81111561280657600080fd5b60006020828403121561286457600080fd5b5035919050565b60008060006060848603121561288057600080fd5b833592506128906020850161230b565b915060408401356bffffffffffffffffffffffff811681146128b157600080fd5b809150509250925092565b80820180821115611d16577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60005b83811015612940578181015183820152602001612928565b50506000910152565b60008151808452612961816020860160208601612925565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208501945060208160051b8301016020850160005b83811015612a63577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0858403018852815173ffffffffffffffffffffffffffffffffffffffff815116845260208101516020850152604081015160e06040860152612a1f60e0860182612949565b6060838101519087015260808084015115159087015260a08084015115159087015260c09283015192909501919091525060209788019791909101906001016129b1565b50909695505050505050565b600081518084526020840193506020830160005b82811015612ab757815173ffffffffffffffffffffffffffffffffffffffff16865260209586019590910190600101612a83565b5093949350505050565b805160ff16825260006020820151612add602085018215159052565b5060408201516101206040850152612af9610120850182612993565b9050606083015160608501526080830151608085015260a083015184820360a0860152612b268282612949565b91505060c083015160c085015260e083015160e0850152610100830151848203610100860152612b568282612a6f565b95945050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081526000612bbb6040830186612ac1565b8281036020840152612bce818587612b5f565b9695505050505050565b60008085851115612be857600080fd5b83861115612bf557600080fd5b5050820193919092039150565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000612c316040830184612949565b949350505050565b60006040828403128015612c4c57600080fd5b506040805190810167ffffffffffffffff81118282101715612c7057612c7061234f565b604052825181526020928301519281019290925250919050565b606081526000612c9e606083018688612b5f565b6020830194909452506040015292915050565b838152604060208201526000612b56604083018486612b5f565b600060208284031215612cdd57600080fd5b81517fffffffff00000000000000000000000000000000000000000000000000000000811681146104bf57600080fd5b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000612bce606083018486612b5f565b600060208284031215612d5557600080fd5b5051919050565b8151600090829060208501835b82811015612d9d57815173ffffffffffffffffffffffffffffffffffffffff16845260209384019390910190600101612d69565b509195945050505050565b60008351612dba818460208801612925565b919091019182525060200191905056fea2646970667358221220495637c0653d9c6ae874bc236c551853ce5caad8e10d3446078722fe1280a1ef64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/auth/Stage2Auth.sol/Stage2Auth.json b/testchain/artifacts/wallet-contracts-v3/modules/auth/Stage2Auth.sol/Stage2Auth.json new file mode 100644 index 00000000..90b8b5b7 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/auth/Stage2Auth.sol/Stage2Auth.json @@ -0,0 +1,698 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Stage2Auth", + "sourceName": "src/modules/auth/Stage2Auth.sol", + "abi": [ + { + "inputs": [], + "name": "ImageHashIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_signer", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidERC1271Signature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + } + ], + "name": "InvalidKind", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSapientSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_flag", + "type": "uint256" + } + ], + "name": "InvalidSignatureFlag", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "InvalidSignatureWeight", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_expires", + "type": "uint256" + } + ], + "name": "InvalidStaticSignatureExpired", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_caller", + "type": "address" + }, + { + "internalType": "address", + "name": "_expectedCaller", + "type": "address" + } + ], + "name": "InvalidStaticSignatureWrongCaller", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "LowWeightChainedSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + } + ], + "name": "OnlySelf", + "type": "error" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "internalType": "struct Snapshot", + "name": "_snapshot", + "type": "tuple" + } + ], + "name": "UnusedSnapshot", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_nextCheckpoint", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_checkpoint", + "type": "uint256" + } + ], + "name": "WrongChainedCheckpointOrder", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "newImageHash", + "type": "bytes32" + } + ], + "name": "ImageHashUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint96", + "name": "_timestamp", + "type": "uint96" + } + ], + "name": "StaticSignatureSet", + "type": "event" + }, + { + "inputs": [], + "name": "getImplementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + } + ], + "name": "getStaticSignature", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "imageHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverPartialSignature", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isValidImage", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "opHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverSapientSignature", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_address", + "type": "address" + }, + { + "internalType": "uint96", + "name": "_timestamp", + "type": "uint96" + } + ], + "name": "setStaticSignature", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_imageHash", + "type": "bytes32" + } + ], + "name": "updateImageHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_implementation", + "type": "address" + } + ], + "name": "updateImplementation", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x6080604052348015600f57600080fd5b50612b9a8061001f6000396000f3fe6080604052600436106100965760003560e01c806351605d8011610069578063aaf10f421161004e578063aaf10f42146101b5578063ad55366b146101ef578063f727ef1c1461024257600080fd5b806351605d801461015457806392dcb3fc1461016957600080fd5b8063025b22bc1461009b57806313792a4a146100b05780631626ba7e146100e35780632956142614610134575b600080fd5b6100ae6100a93660046120ce565b610262565b005b3480156100bc57600080fd5b506100d06100cb366004612472565b6102ae565b6040519081526020015b60405180910390f35b3480156100ef57600080fd5b506101036100fe3660046125b9565b610419565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016100da565b34801561014057600080fd5b506100ae61014f3660046125ec565b6104b0565b34801561016057600080fd5b506100d06104f4565b34801561017557600080fd5b506101896101843660046125ec565b610523565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016100da565b3480156101c157600080fd5b506101ca610538565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100da565b3480156101fb57600080fd5b5061020f61020a366004612472565b610542565b604080519687526020870195909552921515938501939093526060840152608083019190915260a082015260c0016100da565b34801561024e57600080fd5b506100ae61025d366004612605565b61057c565b3330146102a2576040517fa19dbf000000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b6102ab81610637565b50565b6000808461010001515160016102c49190612656565b67ffffffffffffffff8111156102dc576102dc6120e9565b604051908082528060200260200182016040528015610305578160200160208202803683370190505b50905060005b8561010001515181101561037757856101000151818151811061033057610330612690565b602002602001015182828151811061034a5761034a612690565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161030b565b503381866101000151518151811061039157610391612690565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152610100850181905260006103cb86868661068c565b5090508061040b578585856040517ff58cc8b500000000000000000000000000000000000000000000000000000000815260040161029993929190612942565b5060019150505b9392505050565b604080516101208101825260006020820181905260609282018390528282018190526080820181905260a0820183905260c082018190526101008201929092526003815260e08101859052600061047182868661068c565b509050806104855750600091506104129050565b507f20c13b0b0000000000000000000000000000000000000000000000000000000095945050505050565b3330146104eb576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610299565b6102ab81610873565b600061051e7fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85490565b905090565b60008061052f83610903565b91509150915091565b600061051e305490565b60008060008060008061055989898960008061094f565b93995091975094509250905061056e83610c74565b935093975093979195509350565b3330146105b7576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610299565b6105d08383836bffffffffffffffffffffffff16610cab565b6040805184815273ffffffffffffffffffffffffffffffffffffffff841660208201526bffffffffffffffffffffffff83168183015290517febf265acfac1c01de588ed7ef49743b9c3ce8d6d1edeaf510a1f5453228515b19181900360600190a1505050565b61063f813055565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03906020015b60405180910390a150565b6000806000848460008181106106a4576106a4612690565b7fff000000000000000000000000000000000000000000000000000000000000009201359182169250507f800000000000000000000000000000000000000000000000000000000000000090811690036107f95761070186610d3a565b915060008061070f84610903565b91509150428111610756576040517ff95b6ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101829052604401610299565b73ffffffffffffffffffffffffffffffffffffffff821615801590610791575073ffffffffffffffffffffffffffffffffffffffff82163314155b156107ed576040517f8945c3130000000000000000000000000000000000000000000000000000000081526004810185905233602482015273ffffffffffffffffffffffffffffffffffffffff83166044820152606401610299565b6001945050505061086b565b600080600061080c89898960008061094f565b98509295509093509150508282101561085b576040517ffd41fcba0000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610299565b61086481610c74565b9550505050505b935093915050565b806108aa576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108d37fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8829055565b6040518181527f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa90602001610681565b600080806109317fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e8685610db5565b606081901c956bffffffffffffffffffffffff909116945092505050565b6040805180820182526000808252602082018190529182918291829182918a3560f81c9160019180841614801561099a575073ffffffffffffffffffffffffffffffffffffffff8916155b15610ab6578b82013560601c985060149091019089610ab65760038201918c013560e81c60008d848e6109cd8583612656565b926109da93929190612972565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040517fccce3bc80000000000000000000000000000000000000000000000000000000081529293505073ffffffffffffffffffffffffffffffffffffffff8d169163ccce3bc89150610a65903090859060040161299c565b6040805180830381865afa158015610a81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa591906129d3565b9250610ab18285612656565b935050505b82600116600103610af057610ade8d8a838f8f87908092610ad993929190612972565b610e13565b97509750975097509750505050610c67565b6002838116811460208f015283901c60071660016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018e850135610100929092039190911c16838201909650925060009050610b5b6001600586901c811690612656565b60016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018f860135610100929092039190911c1699509092019150610ba68d610d3a565b9350610bc48d858e8e86908092610bbf93929190612972565b611057565b600090815260208a815260408083208352888252808320835273ffffffffffffffffffffffffffffffffffffffff8d1690915290208251919850965015801590610c0f575080518614155b8015610c1f575080602001518511155b15610c63576040517fccbb534f0000000000000000000000000000000000000000000000000000000081528151600482015260208201516024820152604401610299565b5050505b9550955095509550959050565b60008115801590610ca557507fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85482145b92915050565b610d357fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e86847fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b166bffffffffffffffffffffffff8516176040805160208082019590955280820193909352805180840382018152606090930190528151919092012055565b505050565b600080610d4b8360200151306119e9565b90506000610d5884611ab6565b6040517f1901000000000000000000000000000000000000000000000000000000000000602082015260228101849052604281018290529091506062015b6040516020818303038152906040528051906020012092505050919050565b6000808383604051602001610dd4929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b6000806000806000610e75604051806101200160405280600060ff168152602001600015158152602001606081526020016000815260200160008152602001606081526020016000801916815260200160008019168152602001606081525090565b6002815260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b88821015610fff5760038201916000908b013560e81c610ebd8482612656565b9150600090508a8214610ed1576000610ed3565b8d5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303610f2b57610f1a8f8d8d87908692610f1293929190612972565b60018561094f565b939d50919b50995097509550610f4d565b610f41858d8d87908692610f1293929190612972565b50929c50909a50985096505b89891015610f9957610f6182858d8f612972565b8b8b6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016102999493929190612a24565b819350878d6000015103610fac5760008d525b828710610fef576040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004810188905260248101849052604401610299565b50505060c0820185905283610e9d565b8a511580159061101357508a602001518511155b15610c63576040517fccbb534f0000000000000000000000000000000000000000000000000000000081528b51600482015260208c01516024820152604401610299565b60008060005b838110156119df57600181019085013560f881901c9060fc1c8061117a57600f821660008190036110955750600183019287013560f81c5b60408051600080825260208281018085528d9052601b8c89019182013560ff81811c928301908116868801529235606086018190527f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82166080870181905296909a0199959094919390929160019060a0015b6020604051602081039080840390855afa15801561112a573d6000803e3d6000fd5b5050506020604051035190508660ff168c019b50600061114d828960ff16611d22565b90508b61115a5780611169565b60008c81526020829052604090205b9b505050505050505050505061105d565b600181036111de57600f8216600081900361119c5750600183019287013560f81c5b601484019388013560601c60006111b68260ff8516611d22565b9050866111c357806111d2565b60008781526020829052604090205b9650505050505061105d565b600281036113d3576003821660008190036112005750600183019287013560f81c5b60008489013560601c60148601955090506003600285901c16600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c168288018098508192505050600081880190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff16631626ba7e8f8f8f8d9087926112be93929190612972565b6040518463ffffffff1660e01b81526004016112dc93929190612a4b565b602060405180830381865afa1580156112f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131d9190612a65565b7fffffffff00000000000000000000000000000000000000000000000000000000161461138e578c848d8d8b90859261135893929190612972565b6040517fb2fed7ae0000000000000000000000000000000000000000000000000000000081526004016102999493929190612aa7565b8097508460ff168a01995060006113a8858760ff16611d22565b9050896113b557806113c4565b60008a81526020829052604090205b9950505050505050505061105d565b60038103611407576020830192870135846113ee57806113fd565b60008581526020829052604090205b945050505061105d565b600481036114aa57600f8216600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018a870135610100929092039190911c1685830180965081925050506000818601905060008061147c8e8e8e8e8c908892610bbf93929190612972565b91509150829750818a01995061149c898260009182526020526040902090565b98505050505050505061105d565b60068103611574576003600283901c1660008190036114d05750600183019287013560f81c5b6003831660008190036114ea5750600284019388013560f01c5b6000858a013560e81c600387018162ffffff1691508097508192505050600081870190506000806115288f8f8f8f8d908892610bbf93929190612972565b9150915082985084821061153b57998501995b6000611548828789611d89565b90508a6115555780611564565b60008b81526020829052604090205b9a5050505050505050505061105d565b600581036115e15760208301928701358881036115af577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505b60006115ba82611ded565b9050856115c757806115d6565b60008681526020829052604090205b95505050505061105d565b600781036116e757600f821660008190036116035750600183019287013560f81c5b600080858a0135602087019650915089860135602087016040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018e905290975090915060ff82901c907f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690601b830190600090600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff851690820152606081018890526080810185905260a001611108565b6008810361173b57602083019287013560006117038b82611e41565b9050808203611730577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505b60006111b682611ebc565b600981036118735760038216600081900361175d5750600183019287013560f81c5b60008489013560601c601486019550905060006003600286901c1660016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c168188018098508193505050506000818701905060008373ffffffffffffffffffffffffffffffffffffffff166313792a4a8f8e8e8c9087926117f793929190612972565b6040518463ffffffff1660e01b815260040161181593929190612942565b602060405180830381865afa158015611832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118569190612add565b90508197508460ff168a01995060006113a8858760ff1684611ef7565b600a81036119aa576003821660008190036118955750600183019287013560f81c5b60008489013560601c60148601955090506003600285901c16600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c1682880180985081925050506000818801905060008473ffffffffffffffffffffffffffffffffffffffff1663898bd9218f8f8f8d90879261192e93929190612972565b6040518463ffffffff1660e01b815260040161194c93929190612a4b565b602060405180830381865afa158015611969573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198d9190612add565b90508198508560ff168b019a506000611548868860ff1684611ef7565b6040517fb2505f7c00000000000000000000000000000000000000000000000000000000815260048101829052602401610299565b5094509492505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de85611a595746611a5c565b60005b6040805160208101959095528401929092526060830152608082015273ffffffffffffffffffffffffffffffffffffffff831660a082015260c0015b60405160208183030381529060405280519060200120905092915050565b600080826101000151604051602001611acf9190612af6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120835190915060ff16611b78576000611b208460400151611f65565b606080860151608080880151604080517f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a260208201529081018690529384019290925282015260a0810184905290915060c001610d96565b825160ff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01611c085760a08301518051602091820120604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46693810193909352820152606081018290526080015b60405160208183030381529060405280519060200120915050919050565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611c785760c0830151604080517f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e460208201529081019190915260608101829052608001611bea565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd01611ce85760e0830151604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46660208201529081019190915260608101829052608001611bea565b82516040517f0481832000000000000000000000000000000000000000000000000000000000815260ff9091166004820152602401610299565b6040517f53657175656e6365207369676e65723a0a00000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b16603182015260458101829052600090606501611a98565b6040517f53657175656e6365206e657374656420636f6e6669673a0a000000000000000060208201526038810184905260588101839052607881018290526000906098015b6040516020818303038152906040528051906020012090509392505050565b6040517f53657175656e636520737461746963206469676573743a0a00000000000000006020820152603881018290526000906058015b604051602081830303815290604052805190602001209050919050565b600080611e528460200151846119e9565b90506000611e5f85611ab6565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526022810184905260428101829052909150606201604051602081830303815290604052805190602001209250505092915050565b604080517f53657175656e636520616e792061646472657373207375626469676573743a0a6020820152908101829052600090606001611e24565b6040517f53657175656e63652073617069656e7420636f6e6669673a0a0000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166039820152604d8101839052606d8101829052600090608d01611dce565b6000606060005b8351811015611fe7576000611f99858381518110611f8c57611f8c612690565b6020026020010151611ff6565b90508281604051602001611fae929190612b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052925050600101611f6c565b50805160209091012092915050565b60007f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef43782600001518360200151846040015180519060200120856060015186608001518760a001518860c00151604051602001611e2498979695949392919097885273ffffffffffffffffffffffffffffffffffffffff969096166020880152604087019490945260608601929092526080850152151560a0840152151560c083015260e08201526101000190565b803573ffffffffffffffffffffffffffffffffffffffff811681146120c957600080fd5b919050565b6000602082840312156120e057600080fd5b610412826120a5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561213b5761213b6120e9565b60405290565b604051610120810167ffffffffffffffff8111828210171561213b5761213b6120e9565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156121ac576121ac6120e9565b604052919050565b803560ff811681146120c957600080fd5b803580151581146120c957600080fd5b600067ffffffffffffffff8211156121ef576121ef6120e9565b5060051b60200190565b600082601f83011261220a57600080fd5b813567ffffffffffffffff811115612224576122246120e9565b61225560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612165565b81815284602083860101111561226a57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261229857600080fd5b81356122ab6122a6826121d5565b612165565b8082825260208201915060208360051b8601019250858311156122cd57600080fd5b602085015b838110156123ba57803567ffffffffffffffff8111156122f157600080fd5b860160e08189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001121561232557600080fd5b61232d612118565b612339602083016120a5565b815260408201356020820152606082013567ffffffffffffffff81111561235f57600080fd5b61236e8a6020838601016121f9565b6040830152506080820135606082015261238a60a083016121c5565b608082015261239b60c083016121c5565b60a082015260e0919091013560c08201528352602092830192016122d2565b5095945050505050565b600082601f8301126123d557600080fd5b81356123e36122a6826121d5565b8082825260208201915060208360051b86010192508583111561240557600080fd5b602085015b838110156123ba5761241b816120a5565b83526020928301920161240a565b60008083601f84011261243b57600080fd5b50813567ffffffffffffffff81111561245357600080fd5b60208301915083602082850101111561246b57600080fd5b9250929050565b60008060006040848603121561248757600080fd5b833567ffffffffffffffff81111561249e57600080fd5b840161012081870312156124b157600080fd5b6124b9612141565b6124c2826121b4565b81526124d0602083016121c5565b6020820152604082013567ffffffffffffffff8111156124ef57600080fd5b6124fb88828501612287565b604083015250606082810135908201526080808301359082015260a082013567ffffffffffffffff81111561252f57600080fd5b61253b888285016121f9565b60a08301525060c0828101359082015260e0808301359082015261010082013567ffffffffffffffff81111561257057600080fd5b61257c888285016123c4565b61010083015250935050602084013567ffffffffffffffff8111156125a057600080fd5b6125ac86828701612429565b9497909650939450505050565b6000806000604084860312156125ce57600080fd5b83359250602084013567ffffffffffffffff8111156125a057600080fd5b6000602082840312156125fe57600080fd5b5035919050565b60008060006060848603121561261a57600080fd5b8335925061262a602085016120a5565b915060408401356bffffffffffffffffffffffff8116811461264b57600080fd5b809150509250925092565b80820180821115610ca5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60005b838110156126da5781810151838201526020016126c2565b50506000910152565b600081518084526126fb8160208601602086016126bf565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208501945060208160051b8301016020850160005b838110156127fd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0858403018852815173ffffffffffffffffffffffffffffffffffffffff815116845260208101516020850152604081015160e060408601526127b960e08601826126e3565b6060838101519087015260808084015115159087015260a08084015115159087015260c092830151929095019190915250602097880197919091019060010161274b565b50909695505050505050565b600081518084526020840193506020830160005b8281101561285157815173ffffffffffffffffffffffffffffffffffffffff1686526020958601959091019060010161281d565b5093949350505050565b805160ff16825260006020820151612877602085018215159052565b506040820151610120604085015261289361012085018261272d565b9050606083015160608501526080830151608085015260a083015184820360a08601526128c082826126e3565b91505060c083015160c085015260e083015160e08501526101008301518482036101008601526128f08282612809565b95945050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081526000612955604083018661285b565b82810360208401526129688185876128f9565b9695505050505050565b6000808585111561298257600080fd5b8386111561298f57600080fd5b5050820193919092039150565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260006129cb60408301846126e3565b949350505050565b600060408284031280156129e657600080fd5b506040805190810167ffffffffffffffff81118282101715612a0a57612a0a6120e9565b604052825181526020928301519281019290925250919050565b606081526000612a386060830186886128f9565b6020830194909452506040015292915050565b8381526040602082015260006128f06040830184866128f9565b600060208284031215612a7757600080fd5b81517fffffffff000000000000000000000000000000000000000000000000000000008116811461041257600080fd5b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006129686060830184866128f9565b600060208284031215612aef57600080fd5b5051919050565b8151600090829060208501835b82811015612b3757815173ffffffffffffffffffffffffffffffffffffffff16845260209384019390910190600101612b03565b509195945050505050565b60008351612b548184602088016126bf565b919091019182525060200191905056fea26469706673582212200740f74ffe3bb3a2baa83f05055f31efc15f84a392b895de79af282daafa822264736f6c634300081b0033", + "deployedBytecode": "0x6080604052600436106100965760003560e01c806351605d8011610069578063aaf10f421161004e578063aaf10f42146101b5578063ad55366b146101ef578063f727ef1c1461024257600080fd5b806351605d801461015457806392dcb3fc1461016957600080fd5b8063025b22bc1461009b57806313792a4a146100b05780631626ba7e146100e35780632956142614610134575b600080fd5b6100ae6100a93660046120ce565b610262565b005b3480156100bc57600080fd5b506100d06100cb366004612472565b6102ae565b6040519081526020015b60405180910390f35b3480156100ef57600080fd5b506101036100fe3660046125b9565b610419565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016100da565b34801561014057600080fd5b506100ae61014f3660046125ec565b6104b0565b34801561016057600080fd5b506100d06104f4565b34801561017557600080fd5b506101896101843660046125ec565b610523565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016100da565b3480156101c157600080fd5b506101ca610538565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100da565b3480156101fb57600080fd5b5061020f61020a366004612472565b610542565b604080519687526020870195909552921515938501939093526060840152608083019190915260a082015260c0016100da565b34801561024e57600080fd5b506100ae61025d366004612605565b61057c565b3330146102a2576040517fa19dbf000000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b6102ab81610637565b50565b6000808461010001515160016102c49190612656565b67ffffffffffffffff8111156102dc576102dc6120e9565b604051908082528060200260200182016040528015610305578160200160208202803683370190505b50905060005b8561010001515181101561037757856101000151818151811061033057610330612690565b602002602001015182828151811061034a5761034a612690565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161030b565b503381866101000151518151811061039157610391612690565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152610100850181905260006103cb86868661068c565b5090508061040b578585856040517ff58cc8b500000000000000000000000000000000000000000000000000000000815260040161029993929190612942565b5060019150505b9392505050565b604080516101208101825260006020820181905260609282018390528282018190526080820181905260a0820183905260c082018190526101008201929092526003815260e08101859052600061047182868661068c565b509050806104855750600091506104129050565b507f20c13b0b0000000000000000000000000000000000000000000000000000000095945050505050565b3330146104eb576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610299565b6102ab81610873565b600061051e7fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85490565b905090565b60008061052f83610903565b91509150915091565b600061051e305490565b60008060008060008061055989898960008061094f565b93995091975094509250905061056e83610c74565b935093975093979195509350565b3330146105b7576040517fa19dbf00000000000000000000000000000000000000000000000000000000008152336004820152602401610299565b6105d08383836bffffffffffffffffffffffff16610cab565b6040805184815273ffffffffffffffffffffffffffffffffffffffff841660208201526bffffffffffffffffffffffff83168183015290517febf265acfac1c01de588ed7ef49743b9c3ce8d6d1edeaf510a1f5453228515b19181900360600190a1505050565b61063f813055565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03906020015b60405180910390a150565b6000806000848460008181106106a4576106a4612690565b7fff000000000000000000000000000000000000000000000000000000000000009201359182169250507f800000000000000000000000000000000000000000000000000000000000000090811690036107f95761070186610d3a565b915060008061070f84610903565b91509150428111610756576040517ff95b6ab70000000000000000000000000000000000000000000000000000000081526004810185905260248101829052604401610299565b73ffffffffffffffffffffffffffffffffffffffff821615801590610791575073ffffffffffffffffffffffffffffffffffffffff82163314155b156107ed576040517f8945c3130000000000000000000000000000000000000000000000000000000081526004810185905233602482015273ffffffffffffffffffffffffffffffffffffffff83166044820152606401610299565b6001945050505061086b565b600080600061080c89898960008061094f565b98509295509093509150508282101561085b576040517ffd41fcba0000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610299565b61086481610c74565b9550505050505b935093915050565b806108aa576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108d37fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8829055565b6040518181527f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa90602001610681565b600080806109317fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e8685610db5565b606081901c956bffffffffffffffffffffffff909116945092505050565b6040805180820182526000808252602082018190529182918291829182918a3560f81c9160019180841614801561099a575073ffffffffffffffffffffffffffffffffffffffff8916155b15610ab6578b82013560601c985060149091019089610ab65760038201918c013560e81c60008d848e6109cd8583612656565b926109da93929190612972565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040517fccce3bc80000000000000000000000000000000000000000000000000000000081529293505073ffffffffffffffffffffffffffffffffffffffff8d169163ccce3bc89150610a65903090859060040161299c565b6040805180830381865afa158015610a81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa591906129d3565b9250610ab18285612656565b935050505b82600116600103610af057610ade8d8a838f8f87908092610ad993929190612972565b610e13565b97509750975097509750505050610c67565b6002838116811460208f015283901c60071660016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018e850135610100929092039190911c16838201909650925060009050610b5b6001600586901c811690612656565b60016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018f860135610100929092039190911c1699509092019150610ba68d610d3a565b9350610bc48d858e8e86908092610bbf93929190612972565b611057565b600090815260208a815260408083208352888252808320835273ffffffffffffffffffffffffffffffffffffffff8d1690915290208251919850965015801590610c0f575080518614155b8015610c1f575080602001518511155b15610c63576040517fccbb534f0000000000000000000000000000000000000000000000000000000081528151600482015260208201516024820152604401610299565b5050505b9550955095509550959050565b60008115801590610ca557507fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85482145b92915050565b610d357fc852adf5e97c2fc3b38f405671e91b7af1697ef0287577f227ef10494c2a8e86847fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b166bffffffffffffffffffffffff8516176040805160208082019590955280820193909352805180840382018152606090930190528151919092012055565b505050565b600080610d4b8360200151306119e9565b90506000610d5884611ab6565b6040517f1901000000000000000000000000000000000000000000000000000000000000602082015260228101849052604281018290529091506062015b6040516020818303038152906040528051906020012092505050919050565b6000808383604051602001610dd4929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b6000806000806000610e75604051806101200160405280600060ff168152602001600015158152602001606081526020016000815260200160008152602001606081526020016000801916815260200160008019168152602001606081525090565b6002815260007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b88821015610fff5760038201916000908b013560e81c610ebd8482612656565b9150600090508a8214610ed1576000610ed3565b8d5b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303610f2b57610f1a8f8d8d87908692610f1293929190612972565b60018561094f565b939d50919b50995097509550610f4d565b610f41858d8d87908692610f1293929190612972565b50929c50909a50985096505b89891015610f9957610f6182858d8f612972565b8b8b6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016102999493929190612a24565b819350878d6000015103610fac5760008d525b828710610fef576040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004810188905260248101849052604401610299565b50505060c0820185905283610e9d565b8a511580159061101357508a602001518511155b15610c63576040517fccbb534f0000000000000000000000000000000000000000000000000000000081528b51600482015260208c01516024820152604401610299565b60008060005b838110156119df57600181019085013560f881901c9060fc1c8061117a57600f821660008190036110955750600183019287013560f81c5b60408051600080825260208281018085528d9052601b8c89019182013560ff81811c928301908116868801529235606086018190527f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82166080870181905296909a0199959094919390929160019060a0015b6020604051602081039080840390855afa15801561112a573d6000803e3d6000fd5b5050506020604051035190508660ff168c019b50600061114d828960ff16611d22565b90508b61115a5780611169565b60008c81526020829052604090205b9b505050505050505050505061105d565b600181036111de57600f8216600081900361119c5750600183019287013560f81c5b601484019388013560601c60006111b68260ff8516611d22565b9050866111c357806111d2565b60008781526020829052604090205b9650505050505061105d565b600281036113d3576003821660008190036112005750600183019287013560f81c5b60008489013560601c60148601955090506003600285901c16600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c168288018098508192505050600081880190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff16631626ba7e8f8f8f8d9087926112be93929190612972565b6040518463ffffffff1660e01b81526004016112dc93929190612a4b565b602060405180830381865afa1580156112f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131d9190612a65565b7fffffffff00000000000000000000000000000000000000000000000000000000161461138e578c848d8d8b90859261135893929190612972565b6040517fb2fed7ae0000000000000000000000000000000000000000000000000000000081526004016102999493929190612aa7565b8097508460ff168a01995060006113a8858760ff16611d22565b9050896113b557806113c4565b60008a81526020829052604090205b9950505050505050505061105d565b60038103611407576020830192870135846113ee57806113fd565b60008581526020829052604090205b945050505061105d565b600481036114aa57600f8216600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018a870135610100929092039190911c1685830180965081925050506000818601905060008061147c8e8e8e8e8c908892610bbf93929190612972565b91509150829750818a01995061149c898260009182526020526040902090565b98505050505050505061105d565b60068103611574576003600283901c1660008190036114d05750600183019287013560f81c5b6003831660008190036114ea5750600284019388013560f01c5b6000858a013560e81c600387018162ffffff1691508097508192505050600081870190506000806115288f8f8f8f8d908892610bbf93929190612972565b9150915082985084821061153b57998501995b6000611548828789611d89565b90508a6115555780611564565b60008b81526020829052604090205b9a5050505050505050505061105d565b600581036115e15760208301928701358881036115af577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95505b60006115ba82611ded565b9050856115c757806115d6565b60008681526020829052604090205b95505050505061105d565b600781036116e757600f821660008190036116035750600183019287013560f81c5b600080858a0135602087019650915089860135602087016040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018e905290975090915060ff82901c907f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690601b830190600090600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff851690820152606081018890526080810185905260a001611108565b6008810361173b57602083019287013560006117038b82611e41565b9050808203611730577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505b60006111b682611ebc565b600981036118735760038216600081900361175d5750600183019287013560f81c5b60008489013560601c601486019550905060006003600286901c1660016008820290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c168188018098508193505050506000818701905060008373ffffffffffffffffffffffffffffffffffffffff166313792a4a8f8e8e8c9087926117f793929190612972565b6040518463ffffffff1660e01b815260040161181593929190612942565b602060405180830381865afa158015611832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118569190612add565b90508197508460ff168a01995060006113a8858760ff1684611ef7565b600a81036119aa576003821660008190036118955750600183019287013560f81c5b60008489013560601c60148601955090506003600285901c16600060016008830290811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018c890135610100929092039190911c1682880180985081925050506000818801905060008473ffffffffffffffffffffffffffffffffffffffff1663898bd9218f8f8f8d90879261192e93929190612972565b6040518463ffffffff1660e01b815260040161194c93929190612a4b565b602060405180830381865afa158015611969573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198d9190612add565b90508198508560ff168b019a506000611548868860ff1684611ef7565b6040517fb2505f7c00000000000000000000000000000000000000000000000000000000815260048101829052602401610299565b5094509492505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c563187f2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de85611a595746611a5c565b60005b6040805160208101959095528401929092526060830152608082015273ffffffffffffffffffffffffffffffffffffffff831660a082015260c0015b60405160208183030381529060405280519060200120905092915050565b600080826101000151604051602001611acf9190612af6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120835190915060ff16611b78576000611b208460400151611f65565b606080860151608080880151604080517f11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a260208201529081018690529384019290925282015260a0810184905290915060c001610d96565b825160ff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01611c085760a08301518051602091820120604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46693810193909352820152606081018290526080015b60405160208183030381529060405280519060200120915050919050565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611c785760c0830151604080517f11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e460208201529081019190915260608101829052608001611bea565b825160ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd01611ce85760e0830151604080517fe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d46660208201529081019190915260608101829052608001611bea565b82516040517f0481832000000000000000000000000000000000000000000000000000000000815260ff9091166004820152602401610299565b6040517f53657175656e6365207369676e65723a0a00000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b16603182015260458101829052600090606501611a98565b6040517f53657175656e6365206e657374656420636f6e6669673a0a000000000000000060208201526038810184905260588101839052607881018290526000906098015b6040516020818303038152906040528051906020012090509392505050565b6040517f53657175656e636520737461746963206469676573743a0a00000000000000006020820152603881018290526000906058015b604051602081830303815290604052805190602001209050919050565b600080611e528460200151846119e9565b90506000611e5f85611ab6565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526022810184905260428101829052909150606201604051602081830303815290604052805190602001209250505092915050565b604080517f53657175656e636520616e792061646472657373207375626469676573743a0a6020820152908101829052600090606001611e24565b6040517f53657175656e63652073617069656e7420636f6e6669673a0a0000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166039820152604d8101839052606d8101829052600090608d01611dce565b6000606060005b8351811015611fe7576000611f99858381518110611f8c57611f8c612690565b6020026020010151611ff6565b90508281604051602001611fae929190612b42565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052925050600101611f6c565b50805160209091012092915050565b60007f0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef43782600001518360200151846040015180519060200120856060015186608001518760a001518860c00151604051602001611e2498979695949392919097885273ffffffffffffffffffffffffffffffffffffffff969096166020880152604087019490945260608601929092526080850152151560a0840152151560c083015260e08201526101000190565b803573ffffffffffffffffffffffffffffffffffffffff811681146120c957600080fd5b919050565b6000602082840312156120e057600080fd5b610412826120a5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561213b5761213b6120e9565b60405290565b604051610120810167ffffffffffffffff8111828210171561213b5761213b6120e9565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156121ac576121ac6120e9565b604052919050565b803560ff811681146120c957600080fd5b803580151581146120c957600080fd5b600067ffffffffffffffff8211156121ef576121ef6120e9565b5060051b60200190565b600082601f83011261220a57600080fd5b813567ffffffffffffffff811115612224576122246120e9565b61225560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612165565b81815284602083860101111561226a57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261229857600080fd5b81356122ab6122a6826121d5565b612165565b8082825260208201915060208360051b8601019250858311156122cd57600080fd5b602085015b838110156123ba57803567ffffffffffffffff8111156122f157600080fd5b860160e08189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001121561232557600080fd5b61232d612118565b612339602083016120a5565b815260408201356020820152606082013567ffffffffffffffff81111561235f57600080fd5b61236e8a6020838601016121f9565b6040830152506080820135606082015261238a60a083016121c5565b608082015261239b60c083016121c5565b60a082015260e0919091013560c08201528352602092830192016122d2565b5095945050505050565b600082601f8301126123d557600080fd5b81356123e36122a6826121d5565b8082825260208201915060208360051b86010192508583111561240557600080fd5b602085015b838110156123ba5761241b816120a5565b83526020928301920161240a565b60008083601f84011261243b57600080fd5b50813567ffffffffffffffff81111561245357600080fd5b60208301915083602082850101111561246b57600080fd5b9250929050565b60008060006040848603121561248757600080fd5b833567ffffffffffffffff81111561249e57600080fd5b840161012081870312156124b157600080fd5b6124b9612141565b6124c2826121b4565b81526124d0602083016121c5565b6020820152604082013567ffffffffffffffff8111156124ef57600080fd5b6124fb88828501612287565b604083015250606082810135908201526080808301359082015260a082013567ffffffffffffffff81111561252f57600080fd5b61253b888285016121f9565b60a08301525060c0828101359082015260e0808301359082015261010082013567ffffffffffffffff81111561257057600080fd5b61257c888285016123c4565b61010083015250935050602084013567ffffffffffffffff8111156125a057600080fd5b6125ac86828701612429565b9497909650939450505050565b6000806000604084860312156125ce57600080fd5b83359250602084013567ffffffffffffffff8111156125a057600080fd5b6000602082840312156125fe57600080fd5b5035919050565b60008060006060848603121561261a57600080fd5b8335925061262a602085016120a5565b915060408401356bffffffffffffffffffffffff8116811461264b57600080fd5b809150509250925092565b80820180821115610ca5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60005b838110156126da5781810151838201526020016126c2565b50506000910152565b600081518084526126fb8160208601602086016126bf565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208501945060208160051b8301016020850160005b838110156127fd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0858403018852815173ffffffffffffffffffffffffffffffffffffffff815116845260208101516020850152604081015160e060408601526127b960e08601826126e3565b6060838101519087015260808084015115159087015260a08084015115159087015260c092830151929095019190915250602097880197919091019060010161274b565b50909695505050505050565b600081518084526020840193506020830160005b8281101561285157815173ffffffffffffffffffffffffffffffffffffffff1686526020958601959091019060010161281d565b5093949350505050565b805160ff16825260006020820151612877602085018215159052565b506040820151610120604085015261289361012085018261272d565b9050606083015160608501526080830151608085015260a083015184820360a08601526128c082826126e3565b91505060c083015160c085015260e083015160e08501526101008301518482036101008601526128f08282612809565b95945050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b604081526000612955604083018661285b565b82810360208401526129688185876128f9565b9695505050505050565b6000808585111561298257600080fd5b8386111561298f57600080fd5b5050820193919092039150565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260006129cb60408301846126e3565b949350505050565b600060408284031280156129e657600080fd5b506040805190810167ffffffffffffffff81118282101715612a0a57612a0a6120e9565b604052825181526020928301519281019290925250919050565b606081526000612a386060830186886128f9565b6020830194909452506040015292915050565b8381526040602082015260006128f06040830184866128f9565b600060208284031215612a7757600080fd5b81517fffffffff000000000000000000000000000000000000000000000000000000008116811461041257600080fd5b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006129686060830184866128f9565b600060208284031215612aef57600080fd5b5051919050565b8151600090829060208501835b82811015612b3757815173ffffffffffffffffffffffffffffffffffffffff16845260209384019390910190600101612b03565b509195945050505050565b60008351612b548184602088016126bf565b919091019182525060200191905056fea26469706673582212200740f74ffe3bb3a2baa83f05055f31efc15f84a392b895de79af282daafa822264736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/interfaces/IAuth.sol/IAuth.json b/testchain/artifacts/wallet-contracts-v3/modules/interfaces/IAuth.sol/IAuth.json new file mode 100644 index 00000000..155c61e9 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/interfaces/IAuth.sol/IAuth.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IAuth", + "sourceName": "src/modules/interfaces/IAuth.sol", + "abi": [], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/interfaces/ICheckpointer.sol/ICheckpointer.json b/testchain/artifacts/wallet-contracts-v3/modules/interfaces/ICheckpointer.sol/ICheckpointer.json new file mode 100644 index 00000000..ba3eab8b --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/interfaces/ICheckpointer.sol/ICheckpointer.json @@ -0,0 +1,47 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ICheckpointer", + "sourceName": "src/modules/interfaces/ICheckpointer.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_wallet", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_proof", + "type": "bytes" + } + ], + "name": "snapshotFor", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "internalType": "struct Snapshot", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/interfaces/IDelegatedExtension.sol/IDelegatedExtension.json b/testchain/artifacts/wallet-contracts-v3/modules/interfaces/IDelegatedExtension.sol/IDelegatedExtension.json new file mode 100644 index 00000000..f30ebdd8 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/interfaces/IDelegatedExtension.sol/IDelegatedExtension.json @@ -0,0 +1,49 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IDelegatedExtension", + "sourceName": "src/modules/interfaces/IDelegatedExtension.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_opHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_startingGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_numCalls", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "handleSequenceDelegateCall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/interfaces/IERC1271.sol/IERC1271.json b/testchain/artifacts/wallet-contracts-v3/modules/interfaces/IERC1271.sol/IERC1271.json new file mode 100644 index 00000000..9de8dfa9 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/interfaces/IERC1271.sol/IERC1271.json @@ -0,0 +1,35 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IERC1271", + "sourceName": "src/modules/interfaces/IERC1271.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "magicValue", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/interfaces/IPartialAuth.sol/IPartialAuth.json b/testchain/artifacts/wallet-contracts-v3/modules/interfaces/IPartialAuth.sol/IPartialAuth.json new file mode 100644 index 00000000..fbcb55e5 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/interfaces/IPartialAuth.sol/IPartialAuth.json @@ -0,0 +1,144 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IPartialAuth", + "sourceName": "src/modules/interfaces/IPartialAuth.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverPartialSignature", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isValidImage", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "opHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/interfaces/ISapient.sol/ISapient.json b/testchain/artifacts/wallet-contracts-v3/modules/interfaces/ISapient.sol/ISapient.json new file mode 100644 index 00000000..31c4e1ed --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/interfaces/ISapient.sol/ISapient.json @@ -0,0 +1,119 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ISapient", + "sourceName": "src/modules/interfaces/ISapient.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "noChainId", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call[]", + "name": "calls", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "message", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "digest", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "parentWallets", + "type": "address[]" + } + ], + "internalType": "struct Payload.Decoded", + "name": "_payload", + "type": "tuple" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverSapientSignature", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/modules/interfaces/ISapient.sol/ISapientCompact.json b/testchain/artifacts/wallet-contracts-v3/modules/interfaces/ISapient.sol/ISapientCompact.json new file mode 100644 index 00000000..ed7ebb3b --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/modules/interfaces/ISapient.sol/ISapientCompact.json @@ -0,0 +1,35 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ISapientCompact", + "sourceName": "src/modules/interfaces/ISapient.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_digest", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "recoverSapientSignatureCompact", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/utils/Base64.sol/Base64.json b/testchain/artifacts/wallet-contracts-v3/utils/Base64.sol/Base64.json new file mode 100644 index 00000000..3c901874 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/utils/Base64.sol/Base64.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Base64", + "sourceName": "src/utils/Base64.sol", + "abi": [], + "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220d7ec529b2f2f0e2393ae8baae4a44ccdf658337d47622a322a709183eeb5b5d264736f6c634300081b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220d7ec529b2f2f0e2393ae8baae4a44ccdf658337d47622a322a709183eeb5b5d264736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/utils/LibBytes.sol/LibBytes.json b/testchain/artifacts/wallet-contracts-v3/utils/LibBytes.sol/LibBytes.json new file mode 100644 index 00000000..3a72a8ef --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/utils/LibBytes.sol/LibBytes.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LibBytes", + "sourceName": "src/utils/LibBytes.sol", + "abi": [], + "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122098c0ae915ada559387bd5cb3d91109fea23751fe5e8821d6dd5625896820c44664736f6c634300081b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122098c0ae915ada559387bd5cb3d91109fea23751fe5e8821d6dd5625896820c44664736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/utils/LibBytesPointer.sol/LibBytesPointer.json b/testchain/artifacts/wallet-contracts-v3/utils/LibBytesPointer.sol/LibBytesPointer.json new file mode 100644 index 00000000..c194495c --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/utils/LibBytesPointer.sol/LibBytesPointer.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LibBytesPointer", + "sourceName": "src/utils/LibBytesPointer.sol", + "abi": [], + "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122028d9a4df33bbc23d43998c03578a9fd64462c8bbfc40568e5c8c4d80b522d84264736f6c634300081b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122028d9a4df33bbc23d43998c03578a9fd64462c8bbfc40568e5c8c4d80b522d84264736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/utils/LibOptim.sol/LibOptim.json b/testchain/artifacts/wallet-contracts-v3/utils/LibOptim.sol/LibOptim.json new file mode 100644 index 00000000..64b0e5dc --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/utils/LibOptim.sol/LibOptim.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "LibOptim", + "sourceName": "src/utils/LibOptim.sol", + "abi": [], + "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122021276e91029dcb0d5798f662865c094a573f0515da3f012be161a38682bbb0a764736f6c634300081b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122021276e91029dcb0d5798f662865c094a573f0515da3f012be161a38682bbb0a764736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/utils/P256.sol/P256.json b/testchain/artifacts/wallet-contracts-v3/utils/P256.sol/P256.json new file mode 100644 index 00000000..238bd393 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/utils/P256.sol/P256.json @@ -0,0 +1,16 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "P256", + "sourceName": "src/utils/P256.sol", + "abi": [ + { + "inputs": [], + "name": "P256VerificationFailed", + "type": "error" + } + ], + "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ef32a8f6b0fad2e9a5a572f36791dcf0a8761e2cfc7d01aa6c7bee63738c28e664736f6c634300081b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ef32a8f6b0fad2e9a5a572f36791dcf0a8761e2cfc7d01aa6c7bee63738c28e664736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/artifacts/wallet-contracts-v3/utils/WebAuthn.sol/WebAuthn.json b/testchain/artifacts/wallet-contracts-v3/utils/WebAuthn.sol/WebAuthn.json new file mode 100644 index 00000000..5d634112 --- /dev/null +++ b/testchain/artifacts/wallet-contracts-v3/utils/WebAuthn.sol/WebAuthn.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "WebAuthn", + "sourceName": "src/utils/WebAuthn.sol", + "abi": [], + "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122028675157bc20595ec091afcd3375bbd8e92f27ebdba2bedaa69cc392aba957ea64736f6c634300081b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122028675157bc20595ec091afcd3375bbd8e92f27ebdba2bedaa69cc392aba957ea64736f6c634300081b0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/testchain/hardhat.config.js b/testchain/hardhat.config.js index 34e50c9a..4d8eb545 100644 --- a/testchain/hardhat.config.js +++ b/testchain/hardhat.config.js @@ -1,6 +1,6 @@ // see https://hardhat.org/hardhat-network/docs/reference#config module.exports = { - solidity: "0.8.17", + solidity: "0.8.28", networks: { hardhat: { diff --git a/testchain/package.json b/testchain/package.json index d1d06427..65aea428 100644 --- a/testchain/package.json +++ b/testchain/package.json @@ -6,24 +6,24 @@ "scripts": { "start:hardhat": "hardhat node --hostname 0.0.0.0", "start:hardhat:verbose": "hardhat --verbose node --hostname 0.0.0.0", - "start:geth": "docker run -p 8545:8545 --log-driver none --rm ethereum/client-go:v1.10.16 --dev --dev.period 2 --networkid ${npm_package_config_ganacheChainID} --miner.gaslimit 15000000 --miner.gasprice 1 --http --http.addr 0.0.0.0 --rpc.allow-unprotected-txs --verbosity 1", - "start:geth:verbose": "docker run -p 8545:8545 --rm ethereum/client-go:v1.10.16 --dev --dev.period 2 --networkid ${npm_package_config_ganacheChainID} --miner.gaslimit 15000000 --miner.gasprice 1 --http --http.addr 0.0.0.0 --rpc.allow-unprotected-txs", - "wait:server": "wait-on -t 120000 http-get://127.0.0.1:8545/", - "test": "ts-node ./tests/index.ts" + "start:geth": "docker run -p 8545:8545 --rm ethereum/client-go:v1.15.11 --networkid ${npm_package_config_testchainChainID} --dev --dev.period 1 --dev.gaslimit ${npm_package_config_testchainGasLimit} --miner.gaslimit ${npm_package_config_testchainGasLimit} --miner.gasprice 1 --http --http.addr 0.0.0.0 --rpc.allow-unprotected-txs --verbosity 1", + "start:geth:verbose": "docker run -p 8545:8545 --rm ethereum/client-go:v1.15.11 --networkid ${npm_package_config_testchainChainID} --dev --dev.period 1 --dev.gaslimit ${npm_package_config_testchainGasLimit} --miner.gaslimit ${npm_package_config_testchainGasLimit} --miner.gasprice 1 --http --http.addr 0.0.0.0 --rpc.allow-unprotected-txs", + "start:anvil": "anvil --mnemonic \"${npm_package_config_mnemonic}\" --block-time 1 --balance ${npm_package_config_etherBalance} --host 0.0.0.0 --chain-id ${npm_package_config_testchainChainID} --gas-limit ${npm_package_config_testchainGasLimit} --gas-price ${npm_package_config_testchainGasPrice}", + "start:anvil:verbose": "anvil --mnemonic \"${npm_package_config_mnemonic}\" --block-time 1 --balance ${npm_package_config_etherBalance} --host 0.0.0.0 --chain-id ${npm_package_config_testchainChainID} --gas-limit ${npm_package_config_testchainGasLimit} --gas-price ${npm_package_config_testchainGasPrice} -vvv", + "install:anvil": "curl -L https://foundry.paradigm.xyz | bash; foundryup", + "wait:server": "wait-on -t 120000 tcp:127.0.0.1:8545" }, "devDependencies": { - "concurrently": "^8.0.1", - "ethers": "^6.6.0", - "hardhat": "^2.13.0", - "ts-node": "^10.9.1", - "typescript": "^5.1.3", - "wait-on": "^7.0.1" + "concurrently": "^9.1.2", + "hardhat": "^2.24.1", + "wait-on": "^8.0.3" }, "config": { - "ganacheChainID": 1337, - "ganachePort": 8545, - "ganacheGasLimit": "0xfffffffffff", - "ganacheGasPrice": "20000000000", + "mnemonic": "major danger this key only test please avoid main net use okay", + "testchainChainID": 31337, + "testchainPort": 8545, + "testchainGasLimit": "15000000", + "testchainGasPrice": "20000000000", "etherBalance": "100000", "extra": "" }, diff --git a/testchain/pnpm-lock.yaml b/testchain/pnpm-lock.yaml new file mode 100644 index 00000000..e5699ebd --- /dev/null +++ b/testchain/pnpm-lock.yaml @@ -0,0 +1,2071 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + elliptic: ^6.6.0 + +importers: + + .: + dependencies: + '@openzeppelin/contracts': + specifier: ^4.9.2 + version: 4.9.6 + devDependencies: + concurrently: + specifier: ^9.1.2 + version: 9.1.2 + hardhat: + specifier: ^2.24.1 + version: 2.24.3 + wait-on: + specifier: ^8.0.3 + version: 8.0.3 + +packages: + + '@ethereumjs/rlp@5.0.2': + resolution: {integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==} + engines: {node: '>=18'} + hasBin: true + + '@ethereumjs/util@9.1.0': + resolution: {integrity: sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==} + engines: {node: '>=18'} + + '@ethersproject/abi@5.8.0': + resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} + + '@ethersproject/abstract-provider@5.8.0': + resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} + + '@ethersproject/abstract-signer@5.8.0': + resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} + + '@ethersproject/address@5.8.0': + resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} + + '@ethersproject/base64@5.8.0': + resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} + + '@ethersproject/bignumber@5.8.0': + resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} + + '@ethersproject/bytes@5.8.0': + resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} + + '@ethersproject/constants@5.8.0': + resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} + + '@ethersproject/hash@5.8.0': + resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} + + '@ethersproject/keccak256@5.8.0': + resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} + + '@ethersproject/logger@5.8.0': + resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} + + '@ethersproject/networks@5.8.0': + resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} + + '@ethersproject/properties@5.8.0': + resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} + + '@ethersproject/rlp@5.8.0': + resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} + + '@ethersproject/signing-key@5.8.0': + resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} + + '@ethersproject/strings@5.8.0': + resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} + + '@ethersproject/transactions@5.8.0': + resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} + + '@ethersproject/web@5.8.0': + resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + + '@noble/curves@1.8.2': + resolution: {integrity: sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.2.0': + resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@1.7.2': + resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/secp256k1@1.7.1': + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + + '@nomicfoundation/edr-darwin-arm64@0.11.1': + resolution: {integrity: sha512-vjca7gkl1o0yYqMjwxQpMEtdsb20nWHBnnxDO8ZBCTD5IwfYT5LiMxFaJo8NUJ7ODIRkF/zuEtAF3W7+ZlC5RA==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-darwin-x64@0.11.1': + resolution: {integrity: sha512-0aGStHq9XePXX9UqdU1w60HGO9AfYCgkNEir5sBpntU5E0TvZEK6jwyYr667+s90n2mihdeP97QSA0O/6PT6PA==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-arm64-gnu@0.11.1': + resolution: {integrity: sha512-OWhCETc03PVdtzatW/c2tpOPx+GxlBfBaLmMuGRD1soAr1nMOmg2WZAlo4i6Up9fkQYl+paiYMMFVat1meaMvQ==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-arm64-musl@0.11.1': + resolution: {integrity: sha512-p0qvtIvDA2eZ8pQ5XUKnWdW1IrwFzSrjyrO88oYx6Lkw8nYwf2JEeETo5o5W84DDfimfoBGP7RWPTPcTBKCaLQ==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-x64-gnu@0.11.1': + resolution: {integrity: sha512-V4Us7Q0E8kng3O/czd5GRcxmZxWX+USgqz9yQ3o7DVq7FP96idaKvtcbMQp64tjHf2zNtX2y77sGzgbVau7Bww==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-linux-x64-musl@0.11.1': + resolution: {integrity: sha512-lCSXsF10Kjjvs5duGbM6pi1WciWHXFNWkMgDAY4pg6ZRIy4gh+uGC6CONMfP4BDZwfrALo2p6+LwyotrJEqpyg==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr-win32-x64-msvc@0.11.1': + resolution: {integrity: sha512-sNSmmRTURAd1sdKuyO5tqrFiJvHHVPZLM4HB53F21makGoyInFGhejdo3qZrkoinM8k0ewEJDbUp0YuMEgMOhQ==} + engines: {node: '>= 18'} + + '@nomicfoundation/edr@0.11.1': + resolution: {integrity: sha512-P97XwcD9DdMMZm9aqw89+mzqzlKmqzSPM3feBES2WVRm5/LOiBYorhpeAX+ANj0X8532SKgxoZK/CN5OWv9vZA==} + engines: {node: '>= 18'} + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} + engines: {node: '>= 12'} + + '@nomicfoundation/solidity-analyzer@0.1.2': + resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} + engines: {node: '>= 12'} + + '@openzeppelin/contracts@4.9.6': + resolution: {integrity: sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==} + + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + + '@scure/bip32@1.1.5': + resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + + '@scure/bip39@1.1.1': + resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + + '@sentry/core@5.30.0': + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + + '@sentry/hub@5.30.0': + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: '>=6'} + + '@sentry/minimal@5.30.0': + resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} + engines: {node: '>=6'} + + '@sentry/node@5.30.0': + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: '>=6'} + + '@sentry/tracing@5.30.0': + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: '>=6'} + + '@sentry/types@5.30.0': + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + engines: {node: '>=6'} + + '@sentry/utils@5.30.0': + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: '>=6'} + + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + '@types/bn.js@5.2.0': + resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} + + '@types/lru-cache@5.1.1': + resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + + '@types/node@24.0.3': + resolution: {integrity: sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==} + + adm-zip@0.4.16: + resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} + engines: {node: '>=0.3.0'} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.10.0: + resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} + + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + concurrently@9.1.2: + resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} + engines: {node: '>=18'} + hasBin: true + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} + engines: {node: '>= 6'} + + fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hardhat@2.24.3: + resolution: {integrity: sha512-2dhniQ1wW8/Wh3mP91kKcEnVva93mWYRaYLkV+a0ATkUEKrByGF2P5hCrlNHbqYP//D7L0CGYLtDjPQY6ILaVA==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-stream-stringify@3.1.6: + resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} + engines: {node: '>=7.10.1'} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + micro-eth-signer@0.14.0: + resolution: {integrity: sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==} + + micro-packed@0.7.3: + resolution: {integrity: sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} + engines: {node: '>= 14.0.0'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + obliterator@2.0.5: + resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + solc@0.8.26: + resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} + engines: {node: '>=10.0.0'} + hasBin: true + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + wait-on@8.0.3: + resolution: {integrity: sha512-nQFqAFzZDeRxsu7S3C7LbuxslHhk+gnJZHyethuGKAn2IVleIbTB9I3vJSQiSR+DifUqmdzfPMoMPJfLqMF2vw==} + engines: {node: '>=12.0.0'} + hasBin: true + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@ethereumjs/rlp@5.0.2': {} + + '@ethereumjs/util@9.1.0': + dependencies: + '@ethereumjs/rlp': 5.0.2 + ethereum-cryptography: 2.2.1 + + '@ethersproject/abi@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/abstract-provider@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + + '@ethersproject/abstract-signer@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + + '@ethersproject/address@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 + + '@ethersproject/base64@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + + '@ethersproject/bignumber@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + bn.js: 5.2.2 + + '@ethersproject/bytes@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/constants@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + + '@ethersproject/hash@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/keccak256@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.8.0': {} + + '@ethersproject/networks@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/properties@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/rlp@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/signing-key@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + bn.js: 5.2.2 + elliptic: 6.6.1 + hash.js: 1.1.7 + + '@ethersproject/strings@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/transactions@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + + '@ethersproject/web@5.8.0': + dependencies: + '@ethersproject/base64': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@fastify/busboy@2.1.1': {} + + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/curves@1.8.2': + dependencies: + '@noble/hashes': 1.7.2 + + '@noble/hashes@1.2.0': {} + + '@noble/hashes@1.4.0': {} + + '@noble/hashes@1.7.2': {} + + '@noble/secp256k1@1.7.1': {} + + '@nomicfoundation/edr-darwin-arm64@0.11.1': {} + + '@nomicfoundation/edr-darwin-x64@0.11.1': {} + + '@nomicfoundation/edr-linux-arm64-gnu@0.11.1': {} + + '@nomicfoundation/edr-linux-arm64-musl@0.11.1': {} + + '@nomicfoundation/edr-linux-x64-gnu@0.11.1': {} + + '@nomicfoundation/edr-linux-x64-musl@0.11.1': {} + + '@nomicfoundation/edr-win32-x64-msvc@0.11.1': {} + + '@nomicfoundation/edr@0.11.1': + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.11.1 + '@nomicfoundation/edr-darwin-x64': 0.11.1 + '@nomicfoundation/edr-linux-arm64-gnu': 0.11.1 + '@nomicfoundation/edr-linux-arm64-musl': 0.11.1 + '@nomicfoundation/edr-linux-x64-gnu': 0.11.1 + '@nomicfoundation/edr-linux-x64-musl': 0.11.1 + '@nomicfoundation/edr-win32-x64-msvc': 0.11.1 + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer@0.1.2': + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 + + '@openzeppelin/contracts@4.9.6': {} + + '@scure/base@1.1.9': {} + + '@scure/base@1.2.6': {} + + '@scure/bip32@1.1.5': + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.9 + + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.1.1': + dependencies: + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.3.0': + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@sentry/core@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/hub@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/minimal@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sentry/node@5.30.0': + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + + '@sentry/tracing@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/types@5.30.0': {} + + '@sentry/utils@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + + '@types/bn.js@5.2.0': + dependencies: + '@types/node': 24.0.3 + + '@types/lru-cache@5.1.1': {} + + '@types/node@24.0.3': + dependencies: + undici-types: 7.8.0 + + adm-zip@0.4.16: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@2.0.1: {} + + asynckit@0.4.0: {} + + axios@1.10.0: + dependencies: + follow-redirects: 1.15.9(debug@4.4.1) + form-data: 4.0.3 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + bn.js@4.12.2: {} + + bn.js@5.2.2: {} + + boxen@5.1.2: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brorand@1.1.0: {} + + browser-stdout@1.3.1: {} + + buffer-from@1.1.2: {} + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + camelcase@6.3.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + ci-info@2.0.0: {} + + clean-stack@2.2.0: {} + + cli-boxes@2.2.1: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + command-exists@1.2.9: {} + + commander@8.3.0: {} + + concurrently@9.1.2: + dependencies: + chalk: 4.1.2 + lodash: 4.17.21 + rxjs: 7.8.2 + shell-quote: 1.8.3 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + cookie@0.4.2: {} + + debug@4.4.1(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@4.0.0: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + diff@5.2.0: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + elliptic@6.6.1: + dependencies: + bn.js: 4.12.2 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emoji-regex@8.0.0: {} + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + env-paths@2.2.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + ethereum-cryptography@1.2.0: + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/bip32': 1.1.5 + '@scure/bip39': 1.1.1 + + ethereum-cryptography@2.2.1: + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + + fdir@6.4.6(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat@5.0.2: {} + + follow-redirects@1.15.9(debug@4.4.1): + optionalDependencies: + debug: 4.4.1(supports-color@8.1.1) + + form-data@4.0.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fp-ts@1.19.3: {} + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + hardhat@2.24.3: + dependencies: + '@ethereumjs/util': 9.1.0 + '@ethersproject/abi': 5.8.0 + '@nomicfoundation/edr': 0.11.1 + '@nomicfoundation/solidity-analyzer': 0.1.2 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.2.0 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chokidar: 4.0.3 + ci-info: 2.0.0 + debug: 4.4.1(supports-color@8.1.1) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + find-up: 5.0.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + immutable: 4.3.7 + io-ts: 1.10.4 + json-stream-stringify: 3.1.6 + keccak: 3.0.4 + lodash: 4.17.21 + micro-eth-signer: 0.14.0 + mnemonist: 0.38.5 + mocha: 10.8.2 + p-map: 4.0.0 + picocolors: 1.1.1 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.8.26(debug@4.4.1) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.14 + tsort: 0.0.1 + undici: 5.29.0 + uuid: 8.3.2 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + immutable@4.3.7: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + io-ts@1.10.4: + dependencies: + fp-ts: 1.19.3 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-obj@2.1.0: {} + + is-unicode-supported@0.1.0: {} + + joi@17.13.3: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + + js-sha3@0.8.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-stream-stringify@3.1.6: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + keccak@3.0.4: + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + lru_map@0.3.3: {} + + math-intrinsics@1.1.0: {} + + memorystream@0.3.1: {} + + micro-eth-signer@0.14.0: + dependencies: + '@noble/curves': 1.8.2 + '@noble/hashes': 1.7.2 + micro-packed: 0.7.3 + + micro-packed@0.7.3: + dependencies: + '@scure/base': 1.2.6 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + mnemonist@0.38.5: + dependencies: + obliterator: 2.0.5 + + mocha@10.8.2: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.4.1(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + + ms@2.1.3: {} + + node-addon-api@2.0.2: {} + + node-gyp-build@4.8.4: {} + + normalize-path@3.0.0: {} + + obliterator@2.0.5: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + os-tmpdir@1.0.2: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + path-exists@4.0.0: {} + + path-parse@1.0.7: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + proxy-from-env@1.1.0: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + require-directory@2.1.1: {} + + resolve@1.17.0: + dependencies: + path-parse: 1.0.7 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + semver@5.7.2: {} + + semver@6.3.1: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + setprototypeof@1.2.0: {} + + shell-quote@1.8.3: {} + + solc@0.8.26(debug@4.4.1): + dependencies: + command-exists: 1.2.9 + commander: 8.3.0 + follow-redirects: 1.15.9(debug@4.4.1) + js-sha3: 0.8.0 + memorystream: 0.3.1 + semver: 5.7.2 + tmp: 0.0.33 + transitivePeerDependencies: + - debug + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + + statuses@2.0.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tree-kill@1.2.2: {} + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + tsort@0.0.1: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.7.1: {} + + undici-types@7.8.0: {} + + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + + universalify@0.1.2: {} + + unpipe@1.0.0: {} + + util-deprecate@1.0.2: {} + + uuid@8.3.2: {} + + wait-on@8.0.3: + dependencies: + axios: 1.10.0 + joi: 17.13.3 + lodash: 4.17.21 + minimist: 1.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - debug + + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + + workerpool@6.5.1: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + ws@7.5.10: {} + + y18n@5.0.8: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} diff --git a/testchain/yarn.lock b/testchain/yarn.lock deleted file mode 100644 index 44f34ea1..00000000 --- a/testchain/yarn.lock +++ /dev/null @@ -1,2508 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@adraffy/ens-normalize@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz" - integrity sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@ethersproject/abi@^5.1.2": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" - integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/abstract-provider@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" - integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - -"@ethersproject/abstract-signer@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" - integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/address@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" - integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - -"@ethersproject/base64@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" - integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - -"@ethersproject/bignumber@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" - integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" - integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/constants@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" - integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - -"@ethersproject/hash@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" - integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/keccak256@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" - integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" - integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== - -"@ethersproject/networks@^5.7.0": - version "5.7.1" - resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" - integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/properties@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" - integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/rlp@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" - integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/signing-key@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" - integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - bn.js "^5.2.1" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/strings@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" - integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/transactions@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" - integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - -"@ethersproject/web@^5.7.0": - version "5.7.1" - resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" - integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== - dependencies: - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@hapi/hoek@^9.0.0": - version "9.3.0" - resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@metamask/eth-sig-util@^4.0.0": - version "4.0.1" - resolved "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz" - integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== - dependencies: - ethereumjs-abi "^0.6.8" - ethereumjs-util "^6.2.1" - ethjs-util "^0.1.6" - tweetnacl "^1.0.3" - tweetnacl-util "^0.15.1" - -"@noble/hashes@1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz" - integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== - -"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" - integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== - -"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": - version "1.7.1" - resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" - integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== - -"@nomicfoundation/ethereumjs-block@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz" - integrity sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA== - dependencies: - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-tx" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-blockchain@^6.0.0": - version "6.0.0" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz" - integrity sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw== - dependencies: - "@nomicfoundation/ethereumjs-block" "^4.0.0" - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-ethash" "^2.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - abstract-level "^1.0.3" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - level "^8.0.0" - lru-cache "^5.1.1" - memory-level "^1.0.0" - -"@nomicfoundation/ethereumjs-common@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz" - integrity sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA== - dependencies: - "@nomicfoundation/ethereumjs-util" "^8.0.0" - crc-32 "^1.2.0" - -"@nomicfoundation/ethereumjs-ethash@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz" - integrity sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew== - dependencies: - "@nomicfoundation/ethereumjs-block" "^4.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - abstract-level "^1.0.3" - bigint-crypto-utils "^3.0.23" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-evm@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz" - integrity sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q== - dependencies: - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - "@types/async-eventemitter" "^0.2.1" - async-eventemitter "^0.2.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - -"@nomicfoundation/ethereumjs-rlp@^4.0.0", "@nomicfoundation/ethereumjs-rlp@^4.0.0-beta.2": - version "4.0.0" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz" - integrity sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw== - -"@nomicfoundation/ethereumjs-statemanager@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz" - integrity sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ== - dependencies: - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - functional-red-black-tree "^1.0.1" - -"@nomicfoundation/ethereumjs-trie@^5.0.0": - version "5.0.0" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz" - integrity sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - ethereum-cryptography "0.1.3" - readable-stream "^3.6.0" - -"@nomicfoundation/ethereumjs-tx@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz" - integrity sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w== - dependencies: - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-util@^8.0.0": - version "8.0.0" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz" - integrity sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "^4.0.0-beta.2" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-vm@^6.0.0": - version "6.0.0" - resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz" - integrity sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w== - dependencies: - "@nomicfoundation/ethereumjs-block" "^4.0.0" - "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-evm" "^1.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-tx" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - "@types/async-eventemitter" "^0.2.1" - async-eventemitter "^0.2.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - functional-red-black-tree "^1.0.1" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz" - integrity sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw== - -"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz#1225f7da647ae1ad25a87125664704ecc0af6ccc" - integrity sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA== - -"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz#dbc052dcdfd50ae50fd5ae1788b69b4e0fa40040" - integrity sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg== - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz#e6b2eea633995b557e74e881d2a43eab4760903d" - integrity sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ== - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz#af81107f5afa794f19988a368647727806e18dc4" - integrity sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w== - -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz#6877e1da1a06a9f08446070ab6e0a5347109f868" - integrity sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw== - -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz#bb6cd83a0c259eccef4183796b6329a66cf7ebd9" - integrity sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg== - -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz#9d4bca1cc9a1333fde985675083b0b7d165f6076" - integrity sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw== - -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz#0db5bfc6aa952bea4098d8d2c8947b4e5c4337ee" - integrity sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw== - -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz#2e0f39a2924dcd77db6b419828595e984fabcb33" - integrity sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA== - -"@nomicfoundation/solidity-analyzer@^0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz" - integrity sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg== - optionalDependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.0" - "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.0" - "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.0" - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.0" - "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.0" - "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.0" - "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.0" - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.0" - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.0" - "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.0" - -"@openzeppelin/contracts@^4.9.2": - version "4.9.2" - resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.2.tgz" - integrity sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg== - -"@scure/base@~1.1.0": - version "1.1.1" - resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz" - integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== - -"@scure/bip32@1.1.5": - version "1.1.5" - resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz" - integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== - dependencies: - "@noble/hashes" "~1.2.0" - "@noble/secp256k1" "~1.7.0" - "@scure/base" "~1.1.0" - -"@scure/bip39@1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz" - integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== - dependencies: - "@noble/hashes" "~1.2.0" - "@scure/base" "~1.1.0" - -"@sentry/core@5.30.0": - version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz" - integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/hub@5.30.0": - version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz" - integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== - dependencies: - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/minimal@5.30.0": - version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz" - integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@sentry/node@^5.18.1": - version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz" - integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== - dependencies: - "@sentry/core" "5.30.0" - "@sentry/hub" "5.30.0" - "@sentry/tracing" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - cookie "^0.4.1" - https-proxy-agent "^5.0.0" - lru_map "^0.3.3" - tslib "^1.9.3" - -"@sentry/tracing@5.30.0": - version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz" - integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/types@5.30.0": - version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz" - integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== - -"@sentry/utils@5.30.0": - version "5.30.0" - resolved "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz" - integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== - dependencies: - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/async-eventemitter@^0.2.1": - version "0.2.1" - resolved "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz" - integrity sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg== - -"@types/bn.js@^4.11.3": - version "4.11.6" - resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== - dependencies: - "@types/node" "*" - -"@types/bn.js@^5.1.0": - version "5.1.1" - resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz" - integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== - dependencies: - "@types/node" "*" - -"@types/lru-cache@^5.1.0": - version "5.1.1" - resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" - integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== - -"@types/node@*": - version "18.11.10" - resolved "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz" - integrity sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ== - -"@types/node@18.15.13": - version "18.15.13" - resolved "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz" - integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== - -"@types/pbkdf2@^3.0.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz" - integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== - dependencies: - "@types/node" "*" - -"@types/secp256k1@^4.0.1": - version "4.0.3" - resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz" - integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== - dependencies: - "@types/node" "*" - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz" - integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== - dependencies: - buffer "^6.0.3" - catering "^2.1.0" - is-buffer "^2.0.5" - level-supports "^4.0.0" - level-transcoder "^1.0.1" - module-error "^1.0.1" - queue-microtask "^1.2.3" - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1: - version "8.9.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== - -adm-zip@^0.4.16: - version "0.4.16" - resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" - integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== - -aes-js@4.0.0-beta.5: - version "4.0.0-beta.5" - resolved "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz" - integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== - -agent-base@6: - version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -async-eventemitter@^0.2.4: - version "0.2.4" - resolved "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz" - integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== - dependencies: - async "^2.4.0" - -async@^2.4.0: - version "2.6.4" - resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -axios@^0.27.2: - version "0.27.2" - resolved "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" - integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== - dependencies: - follow-redirects "^1.14.9" - form-data "^4.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^3.0.2: - version "3.0.9" - resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bigint-crypto-utils@^3.0.23: - version "3.1.8" - resolved "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz" - integrity sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw== - dependencies: - bigint-mod-arith "^3.1.0" - -bigint-mod-arith@^3.1.0: - version "3.1.2" - resolved "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz" - integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - -bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.2.0, bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-level@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz" - integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.1" - module-error "^1.0.2" - run-parallel-limit "^1.1.0" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserify-aes@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -bs58@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" - integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== - dependencies: - base-x "^3.0.2" - -bs58check@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" - integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== - dependencies: - bs58 "^4.0.0" - create-hash "^1.1.0" - safe-buffer "^5.1.2" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -busboy@^1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -catering@^2.1.0, catering@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz" - integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@3.5.3, chokidar@^3.4.0: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -classic-level@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz" - integrity sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.0" - module-error "^1.0.1" - napi-macros "~2.0.0" - node-gyp-build "^4.3.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -command-exists@^1.2.8: - version "1.2.9" - resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" - integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== - -commander@3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concurrently@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/concurrently/-/concurrently-8.0.1.tgz" - integrity sha512-Sh8bGQMEL0TAmAm2meAXMjcASHZa7V0xXQVDBLknCPa9TPtkY9yYs+0cnGGgfdkW0SV1Mlg+hVGfXcoI8d3MJA== - dependencies: - chalk "^4.1.2" - date-fns "^2.29.3" - lodash "^4.17.21" - rxjs "^7.8.0" - shell-quote "^1.8.0" - spawn-command "0.0.2-1" - supports-color "^8.1.1" - tree-kill "^1.2.2" - yargs "^17.7.1" - -cookie@^0.4.1: - version "0.4.2" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -crc-32@^1.2.0: - version "1.2.2" - resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" - integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -date-fns@^2.29.3: - version "2.29.3" - resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz" - integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== - -debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.3: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4, elliptic@^6.6.0: - version "6.6.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" - integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -enquirer@^2.3.0: - version "2.3.6" - resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" - integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== - dependencies: - "@types/pbkdf2" "^3.0.0" - "@types/secp256k1" "^4.0.1" - blakejs "^1.1.0" - browserify-aes "^1.2.0" - bs58check "^2.1.2" - create-hash "^1.2.0" - create-hmac "^1.1.7" - hash.js "^1.1.7" - keccak "^3.0.0" - pbkdf2 "^3.0.17" - randombytes "^2.1.0" - safe-buffer "^5.1.2" - scrypt-js "^3.0.0" - secp256k1 "^4.0.1" - setimmediate "^1.0.5" - -ethereum-cryptography@^1.0.3: - version "1.2.0" - resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz" - integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== - dependencies: - "@noble/hashes" "1.2.0" - "@noble/secp256k1" "1.7.1" - "@scure/bip32" "1.1.5" - "@scure/bip39" "1.1.1" - -ethereumjs-abi@^0.6.8: - version "0.6.8" - resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" - integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== - dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" - -ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: - version "6.2.1" - resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" - integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== - dependencies: - "@types/bn.js" "^4.11.3" - bn.js "^4.11.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - ethjs-util "0.1.6" - rlp "^2.2.3" - -ethers@^6.6.0: - version "6.6.0" - resolved "https://registry.npmjs.org/ethers/-/ethers-6.6.0.tgz" - integrity sha512-7D2U+n8eZYmh592VZqap9vBu50jN7YUDHqAmwBYTMntmUKC9RVgcqcFbd+3DTCOQ1jMyK6QHv1usbcfgiGaHOA== - dependencies: - "@adraffy/ens-normalize" "1.9.2" - "@noble/hashes" "1.1.2" - "@noble/secp256k1" "1.7.1" - "@types/node" "18.15.13" - aes-js "4.0.0-beta.5" - tslib "2.4.0" - ws "8.5.0" - -ethjs-util@0.1.6, ethjs-util@^0.1.6: - version "0.1.6" - resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" - integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== - dependencies: - is-hex-prefixed "1.0.0" - strip-hex-prefix "1.0.0" - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -follow-redirects@^1.12.1, follow-redirects@^1.14.9: - version "1.15.2" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fp-ts@1.19.3: - version "1.19.3" - resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" - integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== - -fp-ts@^1.0.0: - version "1.19.5" - resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.5.tgz" - integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== - -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz" - integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2: - version "1.2.0" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.2.10" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -hardhat@^2.13.0: - version "2.13.0" - resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz" - integrity sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ== - dependencies: - "@ethersproject/abi" "^5.1.2" - "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/ethereumjs-block" "^4.0.0" - "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-evm" "^1.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-tx" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - "@nomicfoundation/ethereumjs-vm" "^6.0.0" - "@nomicfoundation/solidity-analyzer" "^0.1.0" - "@sentry/node" "^5.18.1" - "@types/bn.js" "^5.1.0" - "@types/lru-cache" "^5.1.0" - abort-controller "^3.0.0" - adm-zip "^0.4.16" - aggregate-error "^3.0.0" - ansi-escapes "^4.3.0" - chalk "^2.4.2" - chokidar "^3.4.0" - ci-info "^2.0.0" - debug "^4.1.1" - enquirer "^2.3.0" - env-paths "^2.2.0" - ethereum-cryptography "^1.0.3" - ethereumjs-abi "^0.6.8" - find-up "^2.1.0" - fp-ts "1.19.3" - fs-extra "^7.0.1" - glob "7.2.0" - immutable "^4.0.0-rc.12" - io-ts "1.10.4" - keccak "^3.0.2" - lodash "^4.17.11" - mnemonist "^0.38.0" - mocha "^10.0.0" - p-map "^4.0.0" - qs "^6.7.0" - raw-body "^2.4.1" - resolve "1.17.0" - semver "^6.3.0" - solc "0.7.3" - source-map-support "^0.5.13" - stacktrace-parser "^0.1.10" - tsort "0.0.1" - undici "^5.14.0" - uuid "^8.3.2" - ws "^7.4.6" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -immutable@^4.0.0-rc.12: - version "4.2.4" - resolved "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz" - integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -io-ts@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" - integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== - dependencies: - fp-ts "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hex-prefixed@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" - integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -joi@^17.7.0: - version "17.7.1" - resolved "https://registry.npmjs.org/joi/-/joi-17.7.1.tgz" - integrity sha512-teoLhIvWE298R6AeJywcjR4sX2hHjB3/xJX4qPjg+gTg+c0mzUDsziYlqPmLomq9gVsfaMcgPaGc7VxtD/9StA== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" - -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" - integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -keccak@^3.0.0, keccak@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz" - integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - readable-stream "^3.6.0" - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" - integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== - optionalDependencies: - graceful-fs "^4.1.9" - -level-supports@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz" - integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== - -level-transcoder@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz" - integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== - dependencies: - buffer "^6.0.3" - module-error "^1.0.1" - -level@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/level/-/level-8.0.0.tgz" - integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== - dependencies: - browser-level "^1.0.1" - classic-level "^1.2.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru_map@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" - integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -mcl-wasm@^0.7.1: - version "0.7.9" - resolved "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz" - integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -memory-level@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz" - integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== - dependencies: - abstract-level "^1.0.0" - functional-red-black-tree "^1.0.1" - module-error "^1.0.1" - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.7: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mnemonist@^0.38.0: - version "0.38.5" - resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" - integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== - dependencies: - obliterator "^2.0.0" - -mocha@^10.0.0: - version "10.2.0" - resolved "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz" - integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== - dependencies: - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - nanoid "3.3.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -module-error@^1.0.1, module-error@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz" - integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== - -napi-macros@~2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz" - integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== - -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== - -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.5.0" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz" - integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -obliterator@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" - integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -pbkdf2@^3.0.17: - version "3.1.2" - resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -qs@^6.7.0: - version "6.11.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -queue-microtask@^1.2.2, queue-microtask@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -raw-body@^2.4.1: - version "2.5.1" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -resolve@1.17.0: - version "1.17.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -rimraf@^2.2.8: - version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rlp@^2.2.3: - version "2.2.7" - resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz" - integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== - dependencies: - bn.js "^5.2.0" - -run-parallel-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz" - integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== - dependencies: - queue-microtask "^1.2.2" - -rustbn.js@~0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz" - integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== - -rxjs@^7.8.0: - version "7.8.0" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== - dependencies: - tslib "^2.1.0" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -scrypt-js@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -secp256k1@^4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== - dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -semver@^5.5.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shell-quote@^1.8.0: - version "1.8.0" - resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz" - integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -solc@0.7.3: - version "0.7.3" - resolved "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== - dependencies: - command-exists "^1.2.8" - commander "3.0.2" - follow-redirects "^1.12.1" - fs-extra "^0.30.0" - js-sha3 "0.8.0" - memorystream "^0.3.1" - require-from-string "^2.0.0" - semver "^5.5.0" - tmp "0.0.33" - -source-map-support@^0.5.13: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spawn-command@0.0.2-1: - version "0.0.2-1" - resolved "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz" - integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== - -stacktrace-parser@^0.1.10: - version "0.1.10" - resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== - dependencies: - type-fest "^0.7.1" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-hex-prefix@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" - integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== - dependencies: - is-hex-prefixed "1.0.0" - -strip-json-comments@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@8.1.1, supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -tmp@0.0.33: - version "0.0.33" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tslib@2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.1.0: - version "2.4.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== - -tsort@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz" - integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== - -tweetnacl-util@^0.15.1: - version "0.15.1" - resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" - integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== - -tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -typescript@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz" - integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== - -undici@^5.14.0: - version "5.20.0" - resolved "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz" - integrity sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g== - dependencies: - busboy "^1.6.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -wait-on@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz" - integrity sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog== - dependencies: - axios "^0.27.2" - joi "^17.7.0" - lodash "^4.17.21" - minimist "^1.2.7" - rxjs "^7.8.0" - -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@8.5.0: - version "8.5.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== - -ws@^7.4.6: - version "7.5.9" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.7.1: - version "17.7.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From db0ec66495089cf39c9e90e37eb780e391cf9142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 24 Jun 2025 11:41:53 +0200 Subject: [PATCH 059/165] removed un-implemented code --- .../IntegrationTests/Utils/SignatureUtils.cs | 29 ++++++++++++------- .../Primitives/Signature/RawSignature.cs | 11 +++++-- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs index a1ad111d..14e2d59a 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs @@ -47,14 +47,14 @@ public static async Task DoEncode(string input, List signatures, { r = new BigInteger(candidate.Values[0].HexStringToByteArray(32)), s = new BigInteger(candidate.Values[1].HexStringToByteArray(32)), - yParity = OxSignature.VToYParity(int.Parse(candidate.Values[2])), + // TODO: yParity = OxSignature.VToYParity(int.Parse(candidate.Values[2])), }; case "hash": return new SignatureOfSignerLeafHash { r = new BigInteger(candidate.Values[0].HexStringToByteArray(32)), s = new BigInteger(candidate.Values[1].HexStringToByteArray(32)), - yParity = OxSignature.VToYParity(int.Parse(candidate.Values[2])), + // TODO: yParity = OxSignature.VToYParity(int.Parse(candidate.Values[2])), }; case "sapient": case "sapient_compact": @@ -92,7 +92,10 @@ public static async Task DoEncode(string input, List signatures, return null; }); - var encoded = Signature.EncodeSignature(new SignatureEncodingInput + var encoded = new byte[] {}; + + // TODO: + /*var encoded = Signature.EncodeSignature(new SignatureEncodingInput { NoChainId = noChainId, Configuration = new Configuration @@ -102,7 +105,8 @@ public static async Task DoEncode(string input, List signatures, CheckpointerData = checkpointerData != null ? checkpointerData.ToByteArray() : null }); - return Hex.FromBytes(encoded); + return Hex.FromBytes(encoded);*/ + return encoded.ByteArrayToHexStringWithPrefix(); } public static async Task DoConcat(List signatures) @@ -111,26 +115,31 @@ public static async Task DoConcat(List signatures) throw new Exception("No signatures provided"); var decoded = signatures - .Select(s => Signature.DecodeSignature(Bytes.FromHex(s))) + // TODO: .Select(s => Signature.DecodeSignature(Bytes.FromHex(s))) .ToList(); - var reEncoded = Signature.EncodeSignature(new SignatureEncodingInput + var encoded = new byte[] {}; + + // TODO: + /*encoded = Signature.EncodeSignature(new SignatureEncodingInput { // Copy the base structure NoChainId = decoded[0].NoChainId, Configuration = decoded[0].Configuration, CheckpointerData = decoded[0].CheckpointerData, Suffix = decoded.Skip(1).ToList() - }); + });*/ - return Hex.FromBytes(reEncoded); + return encoded.ByteArrayToHexStringWithPrefix(); } public static async Task DoDecode(string signature) { - var bytes = Bytes.FromHex(signature); + // TODO: + /*var bytes = Bytes.FromHex(signature); var decoded = Signature.DecodeSignature(bytes); - return Signature.RawSignatureToJson(decoded); + return Signature.RawSignatureToJson(decoded);*/ + return string.Empty; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs index 3b14ddfb..7097d6b0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -80,16 +80,21 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd var thresholdBytes = configuration.threshold.ToByteArray().PadLeft(bytesForThreshold); output = output.Concat(thresholdBytes).ToArray(); - + + // TODO: + /* var topologyBytes = EncodeTopology(configuration.topology, signature); output = Bytes.Concat(output, topologyBytes); - return erc6492 != null ? Wrap(output, erc6492) : output; + return erc6492 != null ? Wrap(output, erc6492) : output;*/ + + return output; } public static RawSignature Decode(byte[] erc6492Signature) { - + // TODO: + return new RawSignature(); } } } \ No newline at end of file From 498f570dcad4c09b3bd2da1fe9b27f89b19a1052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 27 Jun 2025 20:42:28 +0200 Subject: [PATCH 060/165] encoding topology, leafs and signatures --- .../IntegrationTests/SignatureTests.cs | 19 +- .../IntegrationTests/Utils/SignatureUtils.cs | 54 +++-- .../Plugins/Nethereum/Nethereum.Web3.dll | Bin 0 -> 33936 bytes .../Plugins/Nethereum/Nethereum.Web3.dll.meta | 33 +++ .../SequenceSDK/EcosystemWallet/Envelope.meta | 3 + .../EcosystemWallet/Envelope/Envelope.cs | 13 ++ .../EcosystemWallet/Envelope/Envelope.cs.meta | 3 + .../Envelope/EnvelopeSignature.cs | 6 + .../Envelope/EnvelopeSignature.cs.meta | 3 + .../Envelope/SapientSignature.cs | 15 ++ .../Envelope/SapientSignature.cs.meta | 3 + .../EcosystemWallet/Envelope/Signature.cs | 15 ++ .../Envelope/Signature.cs.meta | 3 + .../EcosystemWallet/Envelope/Signed.cs | 9 + .../EcosystemWallet/Envelope/Signed.cs.meta | 3 + .../Config/AnyAddressSubdigestLeaf.cs | 24 +++ .../Primitives/Config/Config.cs | 2 +- .../EcosystemWallet/Primitives/Config/Leaf.cs | 11 +- .../Primitives/Config/NestedLeaf.cs | 59 ++++++ .../Primitives/Config/NodeLeaf.cs | 20 ++ .../Primitives/Config/SapientSignerLeaf.cs | 29 +++ .../Primitives/Config/Signer.cs | 15 +- .../Primitives/Config/SignerLeaf.cs | 49 +++++ .../Primitives/Config/SubdigestLeaf.cs | 24 +++ .../Primitives/Config/Topology.cs | 193 +++++++++--------- .../Primitives/Config/WeightCalculator.cs | 6 +- .../Primitives/Config/Weigth.cs | 6 +- .../Primitives/Signature/RSY.cs | 18 +- .../Primitives/Signature/RawConfig.cs | 12 -- .../Primitives/Signature/RawConfig.cs.meta | 3 - .../Primitives/Signature/RawLeaf.cs | 7 - .../Primitives/Signature/RawLeaf.cs.meta | 3 - .../Primitives/Signature/RawNestedLeaf.cs | 19 +- .../Primitives/Signature/RawNode.cs | 8 - .../Primitives/Signature/RawNode.cs.meta | 3 - .../Primitives/Signature/RawSignature.cs | 13 +- .../Primitives/Signature/RawSignerLeaf.cs | 42 +++- .../Primitives/Signature/RawTopology.cs | 28 --- .../Primitives/Signature/RawTopology.cs.meta | 3 - .../Primitives/Signature/Signature.cs | 71 ------- .../Primitives/Signature/SignatureHandler.cs | 108 ++++++++++ ...ature.cs.meta => SignatureHandler.cs.meta} | 0 .../Signature/SignatureOfSapientSignerLeaf.cs | 45 +++- .../Signature/SignatureOfSignerLeafErc1271.cs | 37 +++- .../Signature/SignatureOfSignerLeafEthSign.cs | 22 ++ .../Signature/SignatureOfSignerLeafHash.cs | 22 ++ .../SequenceSDK/EcosystemWallet/Utils.meta | 3 + .../EcosystemWallet/Utils/Erc6492Helper.cs | 108 ++++++++++ .../Utils/Erc6492Helper.cs.meta | 3 + .../SequenceSDK/Utils/ByteArrayExtensions.cs | 12 ++ 50 files changed, 902 insertions(+), 308 deletions(-) create mode 100644 Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Web3.dll create mode 100644 Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Web3.dll.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Envelope.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Envelope.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signed.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signed.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/{Signature.cs.meta => SignatureHandler.cs.meta} (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs index 6d492adf..3106f5b2 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs @@ -1,26 +1,17 @@ using System.Collections.Generic; using System.Threading.Tasks; -using Newtonsoft.Json; -using UnityEngine; namespace Sequence.EcosystemWallet.IntegrationTests { public class SignatureTests { - public Task SignatureEncode(Dictionary parameters) + public async Task SignatureEncode(Dictionary parameters) { - var signatures = (string)parameters["signatures"]; - var chainId = (bool)parameters["chainId"]; + var input = parameters["input"].ToString(); + var signatures = parameters["signatures"].ToString().Split(' '); + var chainId = !parameters.TryGetValue("chainId", out var chainIdValue) || (bool)chainIdValue; - var input = parameters.GetNestedObjects("input"); - Debug.Log($"## Parameters {JsonConvert.SerializeObject(parameters)}"); - Debug.Log($"## Input {JsonConvert.SerializeObject(input)}"); - - var threshold = (string)input["threshold"]; - var checkpoint = (string)input["checkpoint"]; - var checkpointer = input.GetAddress("checkpointer"); - - return Task.FromResult(""); + return await SignatureUtils.DoEncode(input, signatures, !chainId); } public Task SignatureDecode(Dictionary parameters) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs index 14e2d59a..76851c68 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs @@ -3,15 +3,17 @@ using System.Linq; using System.Numerics; using System.Threading.Tasks; +using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.IntegrationTests { public static class SignatureUtils { - public static async Task DoEncode(string input, List signatures, bool noChainId, - string? checkpointerData = null) + public static async Task DoEncode(string input, string[] signatures, bool noChainId, + byte[] checkpointerData = null) { var config = ConfigUtils.FromJson(input); var allSignatures = signatures.Select(s => @@ -25,14 +27,15 @@ public static async Task DoEncode(string input, List signatures, }; }).ToList(); - var fullTopology = Signature.FillLeaves(config.topology, leaf => + var fullTopology = SignatureHandler.FillLeaves(config.topology, leaf => { - if (leaf.isSignerLeaf) + if (leaf is SignerLeaf signerLeaf) { - var signerLeaf = leaf as SignerLeaf; - var candidate = allSignatures.FirstOrDefault(s => s.Address == signerLeaf.address); + var candidate = allSignatures.FirstOrDefault(s => s.Address.Equals(signerLeaf.address)); if (candidate == null) return null; + + Debug.Log($"Candidate = {candidate.Address}:{candidate.Type}:{candidate.Values}"); switch (candidate.Type) { @@ -57,17 +60,27 @@ public static async Task DoEncode(string input, List signatures, // TODO: yParity = OxSignature.VToYParity(int.Parse(candidate.Values[2])), }; case "sapient": + return new SignatureOfSapientSignerLeaf + { + curType = SignatureOfSapientSignerLeaf.Type.sapient, + address = candidate.Address, + data = candidate.Values[0].HexStringToByteArray() + }; case "sapient_compact": - throw new Exception($"Incorrect type for leaf"); + return new SignatureOfSapientSignerLeaf + { + curType = SignatureOfSapientSignerLeaf.Type.sapient_compact, + address = candidate.Address, + data = candidate.Values[0].HexStringToByteArray() + }; default: throw new Exception($"Unsupported signature type: {candidate.Type}"); } } - if (leaf.isSapientSignerLeaf) + if (leaf is SapientSignerLeaf sapientSignerLeaf) { - var signerLeaf = leaf as SapientSignerLeaf; - var candidate = allSignatures.FirstOrDefault(s => s.Address == signerLeaf.address); + var candidate = allSignatures.FirstOrDefault(s => s.Address.Equals(sapientSignerLeaf.address)); if (candidate == null) return null; @@ -92,21 +105,20 @@ public static async Task DoEncode(string input, List signatures, return null; }); - var encoded = new byte[] {}; - - // TODO: - /*var encoded = Signature.EncodeSignature(new SignatureEncodingInput + var rawSignature = new RawSignature { - NoChainId = noChainId, - Configuration = new Configuration + noChainId = noChainId, + configuration = { - topology = fullTopology, + threshold = config.threshold, + checkpoint = config.checkpoint, + checkpointer = config.checkpointer, + topology = fullTopology }, - CheckpointerData = checkpointerData != null ? checkpointerData.ToByteArray() : null - }); + checkpointerData = checkpointerData + }; - return Hex.FromBytes(encoded);*/ - return encoded.ByteArrayToHexStringWithPrefix(); + return rawSignature.Encode().ByteArrayToHexString(); } public static async Task DoConcat(List signatures) diff --git a/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Web3.dll b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Web3.dll new file mode 100644 index 0000000000000000000000000000000000000000..bfcca1c8af494327af6b72389ebdfd08df355635 GIT binary patch literal 33936 zcmeIb2V9fO(m1@&lSU1YP(%TPf`*>Z!3F{fN|RzmAwYyE5KMxKhyp4WY^d0s{2I5KnOA6`{M^f zn<2%YAOin6D1vNmn@UjMlLW-9WyeL|*8DacjGGZd0+L7F5dN3Ig2N(G9%9DyuH z5E>IN$d;!|-HnY695kw9!w`z37$`I%lAu$U+n^O>q!AKE8Z?Pk^pAHC33(K5h=|C0GrojLpkF*u+*8K<&N^w^x6=}dEwiN+_8yX5< zolg*Sm%BomB?m!lE4CT?;HL_K3{uwuSpDZ|iWav16^ z&USPGc#i2@LJRFd8_g)hB+VdxWXhWWPuLWj1A^dHrgIYzAqX(QLuv*=fC1i8GYDcw z3mr5?!9FHd0d+E+Z>#wX1yq$QcLWhPTZYxRNQ5Xy%f=qF<;{SlFo8^AbHJci8HGea zcbXyOL;un=lO?nOq>zL4!NA~)m`DgIXfzW7V!%)|hVo3I6X0@?FfdR+GjiEN7r>P; z>I|IuBAU!aXpI>U3EhBKXb$>#h%U4uDWec70h(E8Nm5o}1Cm-4f)&6YtQHr76)qY| z=z&#(Jv3?q_JCusZdhCl3c(jdH#8VhMj^BkQj0>c3+qy63-#2xFeUV?)72hyF?H;O zDPw@`^d>2z(1)bVLSK?v6#9{Luv$zAvkTjYDYborXzT~J+#fh@rfNbN0E8UYAOk!Y zpnez(Sei}Cp>{Sc3?>k)W;?H=>;w=rfr1 ze^R#<`V&Sr^wqzl(UZmwWy@P(TYc38L*5!w4Tl(jqwq*G#3>%E1ObMTmO&6;7;6~> z0R~sgAP6vE2u1Q@Wgs~H3VhMAT@5Mc1M41#pfItAOSgaKjTtYJC2F`Ah>%Y!sc zz^-G+!NUg5rRp+6+5#aD0idBnF&%~_U|zMuspk+FEKJfpn1Ege0$g056QN5$h=Gxb z=L(GmLW)1My1$eiAx|jA{#UzG8HpJ%A}|B@s4@yOU%;T^%C^GhpD=F=8Pq8tEN zA9F}PM<2$;Tn2tc)*Wgq!aAUJADUPLmA z0a^)R?6NK8C4lo;JeF`6MwmRNa5x}tt;u-87SU$R!Vx$fTndoKq=itCOKlcifVq4a zXE^4 zwqDe_nTu|{K-L<+V&ioD%0LUiuQ1D5$9jmJ1mCq8 z!nbL>N+HY1fCT`KAJEQgkTy+>M-HG5&;6$D6C*+)^#=N(9?)&Gcbb*k^Nx|q)hmNnWRl2kaFP5f-kIz2vn0}BRH6phuKBWxL5~t z1(5}74b?4UBbNRM6E-R(@Fs_AVuJnxF*efEn{31eD=|DwV75NS9SLkrU?AbY<@5#( zX9!Hxt2O{_gkMeIY|dmO1JskV#EgwLaYmRJpebyO%aFj7i&pb5aoLE$ZV09LMi>U8 z!4wbKnY$PmpfH{@&uVC$b@y)tQk6IxZkiDDkZRm(SAcNn#132=8V1=cK|=^=Hgb5MsZN@E_OR( z1LSAA#LNI4X8H0BP(v;Qe0ahD+Z<<%VXy(V?HJ$4$Q`+xZ!q*krpDd4Tyz~QaYqG4 z8w}a#rSW&JCwj&2#x+1)iRJT%u z#hzb4{J);yqlhQhg0C!5KJn*KHnysai~Y73pe344JbBLCk_W>OnUMjAXIL@JjWEtV z6ahH?XNnlc_fS5}2m?a3XJLwk%+Nf@dyDQtX+4;?Sn@ki`9L*849XNZ5LXc&bs!Wh zXF%DYNJ8QHP>!0SXk?Eb(+8O#%jiN;$dW)6Kznq8z`2a0kh?|yBvTB1bPiyt;bnjx z%v#`EG4B8z!*~cVnehxD&3p}TJ>vsFSH@R>;S7pJp*svVi;X66x`PMi8Mg!Y)Wi@t zkJw!Rw=|6b=x1aCl7|ovpgpnzcp2IMQmP*(zD^#OrO-}f!@%+hjC%bpP)e;c*AUD6 ztkZ`TD*y+esmPLU1GOmYs2CO#O|7GnSsZkzj>=;hqR$%Y0#(K`K`!6M}gX^$-Bs&#b}K7XsDZPQ`8t8)ljeXXE6lm ztcLockFU9|X{bQMSqyu0S3`vunnLTJsVS&|jhdi$n!Gn4*#v#lP(uvQu$mzF4?d+J zX$q39>!^#Yrl_l$LPzv#Sri`)l~ldX%f>}IRE9x0C911$guyf& z%F!gjVmDTJD;cZe@#w?rA5JnW^GNKU9?z1zHeswEnz$-_Qt zg^DzJnTG4BR%o;)5BsGxD%a$B8ukThrX~;jvkjWB$#dcoj>w4D*57 zuF1o_5{&j~^6nZG0d-uHhdtO9o!8_E3`YW0tI5Ou3_?jmOs9V%Ih!Ig} z7hW3SB*Eo02kMlD!gi2*h zB83(Mq>%^T)D+i(J;npbKwV&ShI26o^BIKC)bMrn{JS_GcB2%k(rK?6S3`A6d0@ZR z20Lg4g|v{3%weBc0dchg_MZ5AluIEqfNY4nM`8Ei1ke;#5DWtd3??vwz)l2qBTxd+ z0(N^?vLAu@1QruG8el^-10WmSBG8OF$`v3dGE$w$2rUK<8#&Q$Sz@$?YRPR0*0rEx z2uwl&^dr6u1=F=A1;80ij{uqdtO+QBo=H~#>`5u|1cmeDf^In#QZ>WeTr}qX|Bm#w+P3 zsBt9lN3+TSE@n-m%IQAT9Kc_2s{t1hd@Qq?nnw#^HK6Dmvx7*Vjx<~ic%m7G0RWdm zUHQ}+fa|F(1m8{IVFF)4E&0@Gf`0;^n4-&oZ-cVfLVW_w2o#fE2*8kjMOT;_(G&yA zf1-UjJX%ccq^;?EB9l)YG;KobGh{|W;B25hXm2Fuh0!fh5w{y1imuREv<=!z=K`L~ z8%1}byx8LaCh;eO<|=9i9ZBR9hrb10`N3#%_!qs0?0L}rJWeVIBe*h zwMI`t^B~?EfOu_7Cq7RneNj$qODB6LYp@*RAHXB@XyDs3(n(KQGnfW0j9^B0*ehF8 z3yr)O<KOSd~upVCkgChZ75DkXmL?vCIla1S5^TjCzHR8O&lh zkoHDG*_Dj3r0iHC??7yJAT~P?n|UzXCc_Q9F@Y8YS`%nbpd*1!1d0jtAuxczU;@Jk zOe9c7U^apM0MckFnhtOaKrT9sWg=K9t5VLPQdAl3IHn6UVsJY1i)d4)(a-J zNC+$@a2|oX3A{rfqOc_l0-F*TL|`z1DFjLgEF!R&z$yag5x9%M-2~nw@D_m-jWr7h zv?nl#z+eJ*(UmAzZy!AwWNreUr-vAoXsKQm3zynO;7tM%o9H1hh`O0~QQUfEsM3$5L>X-24FJYW{?jN6LM&XJ|+Mg0*{7K$OmYHECAXfD}Z*8Ps53#5tJ1Gq+x#A0^S55 zjmIlM2jI~#YMTPz6(9{asg3~MQFGvU0Hl!!;u{6g%?WT%kfmUJy8!MDvJ~QX;binn{Ou+Tg zEWq{A9KhXCd-MefsWwzAI+jkOtLf$RdfI{^WVB+0G9nq97|bH|oey+2=tbxi;~qd7 zlbX+QMiH2zshYSr}>}ty)pP* z?(84x-A~lR5UTq;WW?i(vR`c3K;(X|qZ_`&`$g^4h3&@Y|9j!s}vC$OUv%+gLU0y^O)vTsxclVRb|T4+vdr#(xnQl2a2i`k~CGQG&f70pDoQ%B`730O5n)k zIpLC=^eiG*r_!U~IbZ;-skt$?q@c2gEDJV`V z0Sqp7rIKvoJEZL&q;^yYc+Pc&-nkX*%iA2xUFp5_fj%zRAgLC24)(n!KG%nw5@PMoY4#zjNbdgZ{vcRmjt%N+lHj zy+o)qHSZ7X_{_}TWy2-PKXAiTe_$pmWWSe>l`3EgO0s^>NmTrS*-k2r&&$Yweu6Rf zdl{G=zcV#c={I-5IO{J}{9YhIABGymj=^393lToe+&Vw~dAyZ1QWYWXp17(AjDAODXtnV7|60 zwP-{R?ji7E2!>f%q>%~ozS5j{d7c9J@DAZ0`C&OqSm5LH((qh}S4mWPFw4@VItw2x znC_%&qA?%FWLQob#;}Ltq)O~uX%rNeWJpm$y^&g$)@#4#q}Rm;t!#btfzcoX)k++1 z$mGW}n~W)f^p<5w36iIjDhLummJr+kX_O=_QdkNW1_W)9bU^=gD*^(hV8dC-o9gxU)A?8eO7`*0YkDKyof4=iLaBPwnnN5m!+pmbLtCdb+v;wb%w)W=RGTO!<3Zm__M%umh^= z2Cdy8^4xrdEF)7VD^>!{4^}87`F|46&XwfoWW?p=sASnvYzNexD$A0obaJDl=`sl( zXyLFKkSfSHM9C6ZoOBuOr79S7vNXJC!N8QIkyhwR^v463Obr~~$kZT+W+(y+yrUkL zfNOR%37Ie~(;?*P%x~E6xVOv8A$t}wwQ+WoEKMO-%6qHa!v@04z5`;h$Jg557tpBq1t8TK_-@hSU`ku3jLdjAW$m1$N<5) z5aG!#wWBmG4R$7khc~$d(MBv%zK*DG0c=*KSvozFsFG#j&7%TVSAy4z;>F25Ju6F7 zX%@;;WT7Z&wp@{~-d<{Y{P%e9dn7=)vK*8M;T&cgYzJ^(qxMqOKZ%~C0h)L^h>T1W zFU!c0rbkLMBx(6Nu}wSh;-tMb+hTR&4)2vOja8r2|wr zoWsb(Cl~A<-IEN8h;0{-7aqL6ARR+spvih`rV(sYAYRL%t@#nzxmpv!x$ZcoY3WE= zPCpcqDN!IiIe(pmNbTl0GKmp3MF&lQSJE}4dJt<)Mi35E$;qkeV-kwcF)vDz1MyR# z9xwGLB`y1xIi+Q{m1RUg;KBtX@Z^LPOKKyS=A4B)^H&ybsCrlU2ch~xgM>`Sa(V)Apfe zG!u`-=A~vqcvUa1csRpqph}QKIF_Y*im*R_%L~brru9|kWot9wJo*bqy`z;Xv=V9B zGqNNGZtz9&8bG?jY(H108q6z8_9}c;sm?7;GBsUn@?oCp0DMy+M}I+%$Lf$^^Ga z}qQF-z z*`ctP#|2^fkTa1MCu0b28MTZEO%Ec8x^s2Ilcwun*#xcHy6})hQ4pu1VZqdPBVIgV zb3`_y2$sUIkdD%Pvhu12S389~8&2D>ib`=tZas<(s$Ws^e~Lf z-mb)y1gRjEqZ}wL2U>-s@O1-O6;c2$LD`7X?+r3pKq1>UAR~jPer`~g6eO@tT)Gv4 z`+1Kx#12g1(s>}!?4QZ&V@uQFA2MtM7{qxfiGZuN3t!!~ZOXhc(yV*?ZP)tVGOk)Q z6)^=ArNak*?jc|{}CNd;|(SnxuC9lT9U*&zcFg)Df*)_`&} zsgZ!T;3ZPLZhXY+sY94aj7%xY)(+&QAP&WOGJW`665zIg2`F5O%SS8$;uSlZiYO*g zlWm8%ToB-iC>CMlX&7b_u!vXeq_(fv2`r|$&;qV41D?xpxm+fPvSq>bJFnOWUe*K# z&b4K6SqNlUkZWecu`nyzLh+2?-3o&75l2K(lqoUK%tlWD#wJpHgoPdS)WSvMz;vKE zl!ci9jAyG8JxGZz2AgNfV8cTmHkW4W=^1FmNV8fIClLTs9N1C|)72sF+vWk5`<>D>n1zaP@emJR@Gw3|`S} zE*Fei2x^x?I!}{gdYpzH$17UND_X-V+JO5W+=ZQANUAO_))O$m!TH#4z|{W@0)TIyZ!`1Td>2R0_B~)) z_H*6oUQQ*DW&(zn(?EEL=>rcqeIOU+ojH69ahDYXD5fxAVW5wB=P|g9 z!6OWAVQ>$F>lnPl;1h#w%c9vd#{bgC6PgU#I&2)lV8JL-W5nksrWAt=f^Ix>7-&6z zrp+W4rka(EZ zczl|}5`lOyi5aj^aAC-TKe${Yf!azVSOIA~Th%j*Yb?^3Zv^WqtoX1nohR@zf!7JV zMc_RG9})PDz)u8zBTHAYF_bjGmBKOvRT>MJFjtH<6br!|)K^cxN9yF3I=QD#uB(%G z>f{qFbu^a&gMcZ7b}@tqe%lC*g4bKIeHdOQ@H&CF2)sw&BLbfh_=>=H1b$-aVH5Ny zc+84Fc6gvC(3V{klH6!{PTl1IoLS@ploZI}i2*@D&O@K5XQ6Cf3d)4ja?1N_tdMBd&A1;7go zaZaTWx}al8R+4W0oP4=sqSg=Y>zr0)MK!SU`OC8>vGAnQukjTY`FaT zxcFZxqkUva9vX|`nKQh(@GsP(drMRIycx`FcXOGq|B=kA1$x_<@2590hnN2S&bPH) zubTFt*VVxR=UlprJ0_}@-W=w6d*6t$lh0OW?R-AdK{0mnoxs;mM>KY*cIxfPteSH6 zu0^jiM?5R-=k`&VI8W{LEO+a`)v0C+>yXlwj()svFN{Y|Rl`2A|{gXoFX>eTu2fZZH(@AxX zOoG2wP*0KWOM<5jAeJSCYtp2g`e$-5(teS2&rMH7@!`RqKE6m}$N2UdJD{x=4kxE> zU~fF2+S1wm!_Aa>+dpGmP*3Y(Pg8U$xMNa;W@SaelRT8IOp`05QgR)MWqvq=_A{LUO9AQ(Z@(o23`22%MZo*h z(LhH4Y)5{{h2S?qFTUe#Lj8LzWN4G$>SJ9@_^OvqOsPMikWio%pGewiPCgNE#_0`# z9Df{0sRYQC09OeizWx+N1W*n0BPgZ7CVUQ(fmFsHG@TcG8)ZP)fZrqtg3SKH8<_&*l($)RO=;Cq#h zC;r~=C9pxH(9h+6^?tqYU7*G3&~jhsHGG=JDZC8~E%gDI2E8c;S_E%W1;7S04MwpK zU{d0#bRz3da?(LU1d@1OA&}Gq8-l@0O5(Fr@JK#*_#fMW$HE^zDeB*L8bL_>&*y)i z2gu(zqTzkdlE7hXedp5f(htTIhps9KQ~@iOrYNzA$e694QW{Q48BCgDAyE?Bz=cgQ zsS-b$Vpc_qB1Kj@921c~gM#0K&ZmozNc>A#reNAZyPn;@Cs;8#d1q3FtfJrdpSk&z z^=`S-n&gkdHsg}3N}B8wm9UP9N*L>_7&JxGrU}!}oIcmXx+0vPf5>dt$Qf9t#!|`% z>=__76zQ`WiA*-1PK+1ZiEJ=oz_+M-94vsipDS08XMW;vQ9GQ^;J2yIkAPPJRB%}* z(7h@Y#L40BSB1cJrurG2RG@iy2y&hxPm##Z${3)x*jMcDZe{H4qb9w*y+z&s z=L{>Mo9H?TI*n06n?NVi26PEcp>^fXoMG&YZ*ykfJh*Gqg8OZmLroT4P5yGe`^B)T zF9Qr;7QI=N-90Kl{!&%x@GfD3gYy%<9Gt&%%)uO=H}fs_c|_moFk)(i@sAxdE}6gI z-kkHiZKcaQ!%6JB-(-C0l5)lC>BFB4YsI~Lu^%to{;2V@_w6G#Rem~r&}!rGm>-*0 z%)F?~h!}CF^e?}lQ;wzQYB%i3PVIAk>A>x7@`z9OvdqoDnIAkWwe+h!nzOx^)3|S` zl@_iSSogP#_VlVwJ$Ug#T!!90_qUy0<`|AV_H^<3Ma!PBj$3zG7--0BZd0By$1T;( z!*0iwU4o-b>my!YM(>z@TT!L(*^z&1)-d_qY%BT1H?2@^Js6)~wQ>FJq)spXO7`E)zdz8ZqPzS4pl-rrCJwuvZq*;qbcX+; zjW$;fZWV02=yz$T-)g-(E&5%}Q8p@^p{TiA>eWrP!4eh3W*;c!U-`B#prn-pnwfHC z>y%xrPOjc7VrTG2Zd=DHS{o&zlQuUS)^mND^2MsA6)`Eo9e(F~ETmzEQq>8fI1v}7 zf~^Tf{a`X-vXzQVFwMs_OT>UgWQ!SGrX|z-(2z5IMmRS*Vm+P7X?`-+G$wP&e3294W3n`oK6-(f;h?@?)QV~!QR=0ygXmQi!BEIqX9bw#6-vsq6fTC1uu zd)({nDzzyY5`U%h<#ty2lfw3y`s&3wSsnFQ^m@oSnZp>n2{lUNV>TU@uU+Vlw}?W*Q+BQNY2b=_~w=$wpE zw(k!2topujd0^4ShSOSF`8El*TM>1B*!`CNf5nI%B`iI=k-68izhqlYgZ(ZI*6k`f zzp0|8SEr~ZU!Qhe_VCh_^$XpfO{#s+V6c6c>xpR}c4i-Md}h%AVeY}(Jpy~^o#_#M z2u)pgYnboqQUhs{>iy%VgZikdUUq!`VoLRj*w-VUT?`ZrJN%`v%Z__@J_aATm%eIU z_0z6TN6b9-V$0(DVyCu<(TAXO6*LiT$N>HupFOd}q9!dg_41_vqsnSC!4aYWacubpIB~$Ba(->`+-V7VTdaIbY&i(%SZo%l2tKuXY^R!tGs)7b#62 zzI$re)VE^w^xiw;&lYT!b#R{ATefe?fw##yE2a+|Rm4u3zxLUDQ3?CKsDxRoUeEbn zh;cnR_+Uui8Nq9NK*$B^mr*0?{_id6E+QxOlHNpTNe|U5=F)UQNW368CPWYtEP!Pj zui8E$A5T9q052a{wK3@hv5Jr)l}_F5+lsA37Ff3)pBpV#s4@i!`8iUhEL|$L6q(}; z4&PXv5ub_Q=2eQVAsmwUW2(M9h|iV4!+AkuLZ~*2!T&8wR6@|A4_urici*@Yk0#&g2viiN|>{>v-|kD z&RsZLK3+&Izw6Us(-(tIV@&L$7Vq8QwBF9XLz~kbAKdoolyqWy*uWpPcD`-}8$0&U zJKZ*IW4|E^8~&vJ??O;zU+y5cZ?g{@_F#TK&K@Efeez&9Z~VN=6OS$HxS2EIjyRpu z?x~}<)%36PmsYkYp3_pWVT57IovOkmb2>HUb(r7YC9spz$8e7cpPI~hwdg!E$o-XN zpNjY=3!j?4PRa{jkt96bzeePo|K^%9eobee1sg+cAH8lcB+A@@LT`jKT7 z2EsQ_Yz~-zUZ0+_mZ$h?&KfU1efie)-IHe|^cdv!{mz3T@wkNGwfh&PwHi0A!Ls&;wuT^T zAu@sR@_2qkfGb9XP1m)=F~yc0aU4BG5upIoJ0WR0pds-9U;<$@7=Xyr9g2vG7iybCQOx4$qT&isx|SoN zOS}GUwXm~N{`(cHL~eDpP^I>oTI4xWd73i!mj+^%s5f?qfSD}nDeA;F(zrfySRqA; zf<+dXvdoQI&{pF^6rYc*c$7W{~8^Ly1clv50-@*~>UAO1=-8E%b>gs0G zns=+Iz9(!mF~~T_G4ZK)_}a9|3@duP!$tY)S*7%_QP)=-UB!u+I%V*r{o&0$Ys<%6 z`RjG<=0i;+U;fYn-6}m`z_Nh@XD5;;yc` zvY}$}++7__jmpEvcHY3XzUQ0gcObMR*>+-!thMjItRHuF~ zw)8Oe4%$^2S+%m+3ZLz3rYWeE< z**x<(Zw9ydPvrYg&|@eEN5zL$1_)- zA00)mS((4=mqckg=dOR@8qZtg3Hv&@#&fCLx(Xt6&wTI}vH-vL4Q~?*V&UiqS9W4@ z_!Gk&otN0pOYGx`4}ZQo9py=dmXg9`M_Xx`<0J=Qia zG+7=UxqvTz6;?BD*!*E@0xl`v+j^|k8#N>Kb#&g=sUux?>`9e(^*PS7D7%;0^?i%r zJ1ws5^s%1R_0p9YlNYvY+4=JRs<{2OeZ5B(o6ebh;{4@xZ7y#7UcG->CwX3z>4LE3 z%|_4J(lxk!(xTU;*=0GV9UfIIYFpfke{1TBg(VGEKmIX1HLBWpc;1D-`hNfMI^b2u z=>1(c8PDHP$er%dM6bc%y*Hg!D%Q;3*=XtV4=yVT7B@Im@Z)W>tvzS7Iejg#cbh(y zDRG1OU$O;XjlYcYd%h(p@UUB1b%lLMTr#R=Uy8zGf^Wn3i$&a>O+9%GX5rfKk-Jw?kS-i-8l_MyMwjivi~O3hfTo)a#uZ}Q!@Z>xS% z?GclU?`eNNRKm^N?>BArS95nghJJpz&q-DL3U3_=kY0iT1KBD`gTwJIzQzps~ zNvqPTB&ErJcL@92(<)4SIHYQ(K438U0pjVeKDMsX?nm&kb)KkrjwoBpfn%%WZ|nd2 z;Qdc6__xomKR@muH>w$K{yi(!88;bi>wN7@-$P42mvcW%oOL~ZZQ94!ni3n;u?1In z(Z{w8^-7#pXf%9EK%2JL%8n1&6m_=p?%c&Kj;a>7d|9@!>-IzAmMq^D^juZ5cl2D< zhv7{hE#^m+7LVv+^FCfU@z!6f12?(4u8#K)?$T|8k;DDdZ{K+Du0+gHIk%%L61ImL zKVwJSwfa`xqUC_I!^RtK`7%(jZ2HWCcLtAL7Y}r_D6<$uKM?m$$k^}J;`HDkVbT2C zU5D?8p5o+M05xbo6^?(4T9^%KXwmD#JOz@N5K7(2f_!8y6&cH_y# zLTRU!MF!7CbRTl~M8cVz8Qy{zGv57Xlb#O$YJPX}^$SMF3fj;Q=9Ub(_sJv2|J2#N zb9R4@EN#r&{2|tP>5MyV{d-6~9jc9@Hm$rkKWt3;G9zKiEWw~@`m%!X#yJxT;4{bDvF^Jg(2FlpEvo_MSM5Z1+hfaOk+q@=f!t(xYQJjnrcSXVk9PPr zbVATcI@&wuhI2?^dT8UT#*>=jeI;s5OKXA;$jlwFFYjsZwdQ<7kbye+_lG|tuRko?m|9UX+IPh>#@UIoBkvdn#<~5E zFgHF8(hHtdG~iClja!{I(eLkhbZ^A@Pb(%~>U?)V zj&Jp4&YSdZHH8QH&eh1S`ZM|F=nE%PInd8vNun+I= zBsTPK2_iE z=m|sTm-USAcyfQkfy~TPmMgc<^{v_ZzGP__>(aY5BOeER^KL8uz!`DC{N<6ah5nN+ z&M>Q_!j7Mh$rw7iOF@9=qwt{$y}OCECDuWWPpuxk_tx+q6*BwI*L-*O^^R6WY+3tb zc)VWl>cEu;NBvg22>Z)Dh}EF03l;rscV)=N%|xhV*L@bP0pQpqi_8nyTdPMt=i`o|rH*1O-9g3Uy-nIHx_0)kzFDF0v#-Fm%cTW7vPTRh9 zG7lZmncleT*q6d+i>MpM$z>QL@| zPO30@deq1~W}o}sa@VL(`P`T^nrH6#-gy4yFM$cSHoR@xYw`MJn->+2w^%f0qbIuX zHgrl^cmKtr4afcU8eWX}T6XF2pqX#N_Xqd~EEhEiy_gmE_57q#lV_VZ@2aW(+|k$i zOM>FYT zy+xJK#9-O?mR`GWSXQSFuHA8>cJ!$%ufJjhXEw5neLKAo?GsF^&9JdF8WgwBF06TC zVtm{o`cy&n*^BVbLc``)1PA!XqZ>HadWf!x*cmH>#J5z2@vUb>_u6vkU6VlDyU)go zK8y|-`a;;KkM(r_{1ypzH+Hx7D!ApMzs~+Kb^d(EX|0=F8`Ir*-;go4svDq@~F>ZikmP6Q7x_Ke`utCIjGOU!1)W8 zx4rQ`Z2uceW1)O?!HI0ELuR_04R~_NETM|rf~G7S+#Cipn#Z7<;|C8t@3J;IDKICkNnlW zmiG93l=H!FSvZF7#Y@IKXJU7hDD90>>hq->bDa25XRC8ujBhxY^bGHEs}(14(Mw= z&aX@^aBJ}Lh2?^f?B;ErSIBOfcnwk9S>X6(`}Wnr1BbAy?*Eu--lyT|b{iWPRl4rv z${%=Sn&cI$7;W38*frQS_kG2VinU&&c)NRC{NTH{$MhP9t?Pyl+i>KQ&6~4hGLs(r z+PZ#EuHE>&Pv-d$#{IzYDSemp`qJ!)OVd+V3ZmQP1)Y=LF5Lf6+~3HmiFebs?NSze zDO&n*SL;{DUwu68=U{QhW=7MK^GeLuib~8^)%7cbL5WMuVb^Frv#xjXi(cksz#0jE z%Jlaay-KJ)Y(woBfnT0fl~CQFZxi96bSD_s8r8$Q88E0nyy>-}%|{P!!Sda`-p2B;1y8HS1b{8>=XzFcM z@uLOB_eI5be!d#wi_9Q+!6SKtF7U@M;C=`Gwu0D{gl%{n&xwNH<1fg zW5{>Vxj|CEA79By7sSAu?&NhbcyKSvhCc_8E^aPzREyi?s2}wU65`_pVe!#{-T~rZ zH<3@6$SpL$+fR(2`;wa}*LuC`A8rfacTs`__$w>;2N&?ybKqvGE-F@)m^i_wT#@l)yHR+8>k>uwt`@5I&;BcV! znbSY?nNsUA^J3DNy zc{=#$DBkh|DR<6=Qr{(828Ne2I~1tI>-JSGjv8ZQ^uTQOnKerW&+Zd2e6r8MfV=H> z$81}6!)U;af!Uq=Ch2wfl)m7uaGsB$rQG}7Z0pp7mhN+I-%akSu$La9Yv!(~_WNXZ z>yz`Au(=J>gbS|h<0K z)wYi}iR$vD;tbWwuxuD?P zzA~Q|rN7VZCrY=sI>;TZpEk~CtM#4Q`@2VM zF?*xxG5F~H<5vcZcviW6gx7|qFjf1k*tBoQ-n$9?n{O}7-7t3frphy=P38^k)1_~U z<)S0DH*YIqCcHjqogCRe68&H zn6f=xhgE(YvbWvnZ_!DL{`Qg`FIrYd`rVyjoHZ+c@-Ta=*HyCow~egYzj_qfH?`UF z@hP&^jL+%!Uv8*4e0AWFYhByCe>}FfmC4y|Z@LKiizarLw~V11-?D2UUAI(Jtukz0 zo%tr}PTYZ{0VS~qnsIDTPW*w4a^E#iS^i^r+U7eYCoVqvJRwSXKU1LZ)M;0nDt zI0wD+u)mraPVI|bQapV8=(aAW2hCdD?eGxC(o0zl3KnIeo;@H6&xI&FQYQ*WS0CWE z7VlNzpVGk(M1GCJ{|&)T{nnx#~$f#Lw@OvDP>!;^s_5! zAA}Y1A2r*5YmL$P;%4!iIzB7kU31rM*!0wfC)sVgUrvZpP+14)P4ni@X|XDM;_1xU z8=h?U3jU$o)NtOzM3WxEm%Y6^kLzFlx>?)VeKt+>Dc^TZlDFtEyVj#|?#p?*XB9sh zwD8!Y z_thb?UOu0%+=BoA!pE?EqU)9Ez1(kn9@F}E!iiH4+wE<;**$chrz)AlZ*ua(p;BQ# z&W)wBPCgj@E`Mmw`yH)gzNNP6KKl4rc1;V3@1^fnxz|)HCO0}4#|Y1z7u)&RhldGc zdotD~=55GLJbEjW$h4}}L+bwGh07*Xir=n#pAg?7qlK%@^g_eH*xMa1O;1@llmD4}!N=a( zN!7Z#>f+YG)S(q;#b>>`HXT1|#<6}+9!XEVmz9n;m2`>A$qR}a?Yi{#kH32Ln||n_ z-$%pcyL(y`bZh;YHA0ZvZvE?aje5*5KI8v@`Dz5^{4K)ivbUr|NXcL?hkmB~%aPYV zh=<0Ue0I68eBcZZ;bA46`)K%`=&|q2C$_n8Hc^@rU~6PIeh{w$xpYl*UHm+}l`Wrr zVAO#cyG;xItAjNmpE?Rhl!H2NQocO6b(m^dhcjXZ7@v#CEu{45-s z8#AS%G?An#xvFPrkH5W*`sIpDz3s<0V)6JH6yEx4x3NHKpG&E)!t!X+A9Ey|ViKAt_`)zgLRGsks3nX)xxr{Mff zZz=|bUR%<{dh%t*aZL}mFyGo@>AgwEY8xrg%_#Gk!nE7ndLLdNe${||XyTaxQm=2L zcx~5N=I&gy`QFlRbomCK4(>e>FYl zM9cA&MpMf+pA8O*ZZ&Q3;blFVnOgUXUE^;#?rgiK=abjP87~@jwb$Dix@-Tc<#)5! zeM{}obkAuHU zwpX+14-nnGePv36k0}nH#t$4&b%{|OY}%$IJUFgTm_@tl9usSu`6Y~>)ZMmsqtlD5 zN4$Na;yyjP?RD|t)W)_Or~hC+U%SSl!4S*ah2JbQjGDab;W=%*>4p3cPuq=3a=Y*P zT(&XQ=Egn?JI8!+3F936LhKa2T^sn{aMr|^Y!LT<-v#JivXxM7qK0*MD{!f1{L}5p zZ?|fnM0zw)uLZL4z+ij}sMN*HJ)wh>MSlijRnj z4~mMbm;(9Q#b;j#S++H`-~2xWIlaGIzIRJ_%8|1%VLP_{nA*WgG*~2E01MZD`8oX0 zzJXiAs>GSAocH?Q`0+B$ec+KPRh{0i_%Zr+>dk3`9S>|tdDByOV#8lFV3xrD{(Zo# zJ9qds`^&!tq?uRV810(qP<&}_^Ce&6-EKy7HQ}yX*t}$q_(k~S_9X+3ly`BNmio3N zxKYRVlV0XSHQ{mjTK&PZ6m#Ac)ZWIyAi&uvs?0yi?bq@yuBXfvN2&6<8dpeqfh(1 zIGTQVqVs3g<(y|cdF=Eh4X4hWpz7@!^uoBc&wW*1=Yq1;K1Yt++GLTtukzu+9{bu< z%__Mb630Jwo1W#ldCrZ where T : Payload + { + public Address wallet; + public BigInteger chainId; + public Primitives.Config configuration; + public T payload; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Envelope.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Envelope.cs.meta new file mode 100644 index 00000000..78ec1822 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Envelope.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8202126a7b284cfcb863147f89d81a2e +timeCreated: 1750957989 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs new file mode 100644 index 00000000..3f9e9543 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs @@ -0,0 +1,6 @@ +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.Envelope +{ + public abstract class EnvelopeSignature : SignatureType { } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs.meta new file mode 100644 index 00000000..866d7aae --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b355f43ce38e4301be7998ccca7f18b6 +timeCreated: 1750961131 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs new file mode 100644 index 00000000..492ccb40 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs @@ -0,0 +1,15 @@ +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.Envelope +{ + public class SapientSignature : EnvelopeSignature + { + public string imageHash; + public SignatureOfSapientSignerLeaf signature; + public override string type { get; } + public override byte[] Encode(Leaf leaf) + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs.meta new file mode 100644 index 00000000..bee377e4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 05dda43067604df1ad96e14a05860507 +timeCreated: 1750961050 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs new file mode 100644 index 00000000..e78a84fc --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs @@ -0,0 +1,15 @@ +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.Envelope +{ + public class Signature : EnvelopeSignature + { + public Address address; + public SignatureOfSignerLeaf signature; + public override string type { get; } + public override byte[] Encode(Leaf leaf) + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs.meta new file mode 100644 index 00000000..0abf4ef5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f591c3de715a4011a9db1ddbbfb2acc5 +timeCreated: 1750961021 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signed.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signed.cs new file mode 100644 index 00000000..858da00e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signed.cs @@ -0,0 +1,9 @@ +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.Envelope +{ + public class Signed : Envelope where T : Payload + { + public EnvelopeSignature[] signatures; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signed.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signed.cs.meta new file mode 100644 index 00000000..75f2ca7d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signed.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1cc78c760cfa4b91bf73e70ef10c6e48 +timeCreated: 1750958436 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs index 4a92a2c7..69a62f87 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs @@ -1,8 +1,32 @@ +using System.Text; +using Sequence.ABI; +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { public class AnyAddressSubdigestLeaf : Leaf { public const string type = "any-address-subdigest"; public byte[] digest; + + public override object Parse() + { + return new + { + type = "any-address-subdigest", + digest = digest.ByteArrayToHexString() + }; + } + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + return digest; + } + + public override byte[] HashConfiguration() + { + byte[] prefix = Encoding.UTF8.GetBytes("Sequence any address subdigest:\n"); + return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, digest)); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs index de4bf123..471b53d2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs @@ -52,7 +52,7 @@ public string ToJson() { threshold = threshold.ToString(), checkpoint = checkpoint.ToString(), - topology = topology?.Encode(), + topology = topology?.Parse(), checkpointer = checkpointer?.Value }; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs index 2f6077af..34094a5a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs @@ -1,12 +1,9 @@ namespace Sequence.EcosystemWallet.Primitives { - public abstract class Leaf : RawLeaf + public abstract class Leaf { - public bool isSignerLeaf => this is SignerLeaf; - public bool isSapientSignerLeaf => this is SapientSignerLeaf; - public bool isSubdigestLeaf => this is SubdigestLeaf; - public bool isAnyAddressSubdigestLeaf => this is AnyAddressSubdigestLeaf; - public bool isNodeLeaf => this is NodeLeaf; - public bool isNestedLeaf => this is NestedLeaf; + public abstract object Parse(); + public abstract byte[] Encode(bool noChainId, byte[] checkpointerData); + public abstract byte[] HashConfiguration(); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs index 9f14a0b2..baed5571 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs @@ -1,12 +1,71 @@ +using System; +using System.Linq; using System.Numerics; +using System.Text; +using Sequence.ABI; +using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives { public class NestedLeaf : Leaf { public const string type = "nested"; + public Topology tree; public BigInteger weight; public BigInteger threshold; + + public override object Parse() + { + return new + { + type = "nested", + tree = tree.Parse(), + weight = weight.ToString(), + threshold = threshold.ToString() + }; + } + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + var nested = tree.Encode(noChainId, checkpointerData); + int flag = Topology.FlagNested << 4; + + var weightBytes = new byte[0]; + if (weight <= 3 && weight > 0) + flag |= (int)weight << 2; + else if (weight <= 255) + weightBytes = weight.ByteArrayFromNumber(); + else + throw new Exception("Weight too large"); + + var thresholdBytes = new byte[0]; + if (threshold <= 3 && threshold > 0) + flag |= (int)threshold; + else if (threshold <= 65535) + thresholdBytes = threshold.ByteArrayFromNumber().PadLeft(2); + else + throw new Exception("Threshold too large"); + + if (nested.Length > 0xFFFFFF) + throw new Exception("Nested tree too large"); + + return flag.ByteArrayFromNumber() + .Concat(weightBytes) + .Concat(thresholdBytes) + .Concat(nested.Length.ByteArrayFromNumber().PadLeft(3)) + .Concat(nested) + .ToArray(); + } + + public override byte[] HashConfiguration() + { + byte[] prefix = Encoding.UTF8.GetBytes("Sequence nested config:\n"); + byte[] treeHash = tree.HashConfiguration(); + byte[] threshold = this.threshold.ByteArrayFromNumber().PadLeft(32); + byte[] weight = this.weight.ByteArrayFromNumber().PadLeft(32); + + return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, treeHash, threshold, weight)); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs index d88dd6b6..11357fab 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs @@ -1,3 +1,6 @@ +using System.Linq; +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { public class NodeLeaf : Leaf @@ -8,5 +11,22 @@ public static implicit operator byte[](NodeLeaf leaf) { return leaf.Value; } + + public override object Parse() + { + return Value.ByteArrayToHexString(); + } + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + return (Topology.FlagNode << 4).ByteArrayFromNumber().Concat(Value).ToArray(); + } + + // In the JS code, this just returns the topology itself, but in C# we need to return bytes + // Since NodeLeaf doesn't have any properties to hash, we'll return a byte array + public override byte[] HashConfiguration() + { + return new byte[]{}; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs index 35ae1bd3..8f72e979 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs @@ -1,4 +1,7 @@ using System.Numerics; +using System.Text; +using Sequence.ABI; +using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives { @@ -10,5 +13,31 @@ public class SapientSignerLeaf : Leaf public string imageHash; public bool signed; public SignatureType signature; + + public override object Parse() + { + return new + { + type = type, + address = address, + weight = weight.ToString(), + imageHash = imageHash + }; + } + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + throw new System.NotImplementedException(); + } + + public override byte[] HashConfiguration() + { + byte[] prefix = Encoding.UTF8.GetBytes("Sequence sapient config:\n"); + byte[] address = this.address.Value.HexStringToByteArray(); + byte[] weight = this.weight.ByteArrayFromNumber().PadLeft(32); + byte[] imageHash = this.imageHash.HexStringToByteArray().PadLeft(32); + + return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, address, weight, imageHash)); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs index 266545b1..4620c4b4 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs @@ -40,30 +40,27 @@ void Scan(Topology top) } else if (top.IsLeaf()) { - if (top.Leaf.isSignerLeaf) + if (top.Leaf is SignerLeaf signerLeaf) { - SignerLeaf signerLeaf = (SignerLeaf)top.Leaf; if (signerLeaf.weight > 0) { signers.Add(signerLeaf.address); } } - else if (top.Leaf.isSapientSignerLeaf) + else if (top.Leaf is SapientSignerLeaf sapientSignerLeaf) { - SapientSignerLeaf sapientLeaf = (SapientSignerLeaf)top.Leaf; sapientSigners.Add(new SapientSigner { - address = sapientLeaf.address, - imageHash = sapientLeaf.imageHash + address = sapientSignerLeaf.address, + imageHash = sapientSignerLeaf.imageHash }); } - else if (top.Leaf.isNodeLeaf) + else if (top.Leaf is NodeLeaf) { isComplete = false; } - else if (top.Leaf.isNestedLeaf) + else if (top.Leaf is NestedLeaf nestedLeaf) { - NestedLeaf nestedLeaf = (NestedLeaf)top.Leaf; if (nestedLeaf.weight > 0) { Scan(nestedLeaf.tree); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs index 73a5c3bf..b608bbc3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs @@ -1,13 +1,62 @@ +using System; using System.Numerics; +using System.Text; +using Sequence.ABI; +using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives { public class SignerLeaf : Leaf { public const string type = "signer"; + public Address address; public BigInteger weight; public bool signed; public SignatureType signature; + + public override object Parse() + { + return new + { + type = type, + address = address, + weight = weight.ToString() + }; + } + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + if (signature is SignatureOfSignerLeafHash hash) + { + return hash.Encode(this); + } + + if (signature is SignatureOfSignerLeafEthSign ethSign) + { + return ethSign.Encode(this); + } + + if (signature is SignatureOfSignerLeafErc1271 erc1271) + { + return erc1271.Encode(this); + } + + if (signature is SignatureOfSapientSignerLeaf sapientSigner) + { + return sapientSigner.Encode(this); + } + + throw new Exception($"Invalid signature type: {signature.type}"); + } + + public override byte[] HashConfiguration() + { + byte[] prefix = Encoding.UTF8.GetBytes("Sequence signer:\n"); + byte[] address = this.address.Value.HexStringToByteArray(); + byte[] weight = this.weight.ByteArrayFromNumber().PadLeft(32); + + return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, address, weight)); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs index ac147427..4ce9ab38 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs @@ -1,8 +1,32 @@ +using System.Text; +using Sequence.ABI; +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { public class SubdigestLeaf : Leaf { public const string type = "subdigest"; public byte[] digest; + + public override object Parse() + { + return new + { + type = "subdigest", + digest = digest.ByteArrayToHexString() + }; + } + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + throw new System.NotImplementedException(); + } + + public override byte[] HashConfiguration() + { + byte[] prefix = Encoding.UTF8.GetBytes("Sequence static digest:\n"); + return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, digest)); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index ba74c906..119b4fa4 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -1,7 +1,7 @@ using System; using System.Numerics; -using System.Text; using System.Collections.Generic; +using System.Linq; using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; @@ -10,6 +10,18 @@ namespace Sequence.EcosystemWallet.Primitives { public class Topology { + public const int FlagSignatureHash = 0; + public const int FlagAddress = 1; + public const int FlagSignatureErc1271 = 2; + public const int FlagNode = 3; + public const int FlagBranch = 4; + public const int FlagSubdigest = 5; + public const int FlagNested = 6; + public const int FlagSignatureEthSign = 7; + public const int FlagSignatureAnyAddressSubdigest = 8; + public const int FlagSignatureSapient = 9; + public const int FlagSignatureSapientCompact = 10; + public Node Node; public Leaf Leaf; @@ -71,93 +83,67 @@ public Leaf FindSignerLeaf(Address address) } return Node.right.FindSignerLeaf(address); } - else if (IsLeaf()) + + if (IsLeaf()) { - if (Leaf.isSignerLeaf) + if (Leaf is SignerLeaf signerLeaf) { - SignerLeaf signerLeaf = (SignerLeaf)Leaf; if (signerLeaf.address.Equals(address)) { return signerLeaf; } } - else if (Leaf.isSapientSignerLeaf) + else if (Leaf is SapientSignerLeaf sapientSignerLeaf) { - SapientSignerLeaf sapientLeaf = (SapientSignerLeaf)Leaf; - if (sapientLeaf.address.Equals(address)) + if (sapientSignerLeaf.address.Equals(address)) { - return sapientLeaf; + return sapientSignerLeaf; } } } + return null; } - // Todo refactor - public object Encode() + public object Parse() { if (IsNode()) { return new object[] { - Node.left.Encode(), - Node.right.Encode() + Node.left.Parse(), + Node.right.Parse() }; } - else if (Leaf.isSignerLeaf) + + if (Leaf is SignerLeaf signerLeaf) { - SignerLeaf signerLeaf = (SignerLeaf)Leaf; - return new - { - type = "signer", - address = signerLeaf.address, - weight = signerLeaf.weight.ToString() - }; + return signerLeaf.Parse(); } - else if (Leaf.isSapientSignerLeaf) + + if (Leaf is SapientSignerLeaf sapientSignerLeaf) { - SapientSignerLeaf sapientLeaf = (SapientSignerLeaf)Leaf; - return new - { - type = "sapient-signer", - address = sapientLeaf.address, - weight = sapientLeaf.weight.ToString(), - imageHash = sapientLeaf.imageHash - }; + return sapientSignerLeaf.Parse(); } - else if (Leaf.isSubdigestLeaf) + + if (Leaf is SubdigestLeaf subdigestLeaf) { - SubdigestLeaf subdigestLeaf = (SubdigestLeaf)Leaf; - return new - { - type = "subdigest", - digest = subdigestLeaf.digest.ByteArrayToHexString() - }; + return subdigestLeaf.Parse(); } - else if (Leaf.isAnyAddressSubdigestLeaf) + + if (Leaf is AnyAddressSubdigestLeaf anyAddressSubdigestLeaf) { - AnyAddressSubdigestLeaf anyAddressSubdigestLeaf = (AnyAddressSubdigestLeaf)Leaf; - return new - { - type = "any-address-subdigest", - digest = anyAddressSubdigestLeaf.digest.ByteArrayToHexString() - }; + return anyAddressSubdigestLeaf.Parse(); } - else if (Leaf.isNodeLeaf) + + if (Leaf is NodeLeaf nodeLeaf) { - NodeLeaf nodeLeaf = (NodeLeaf)Leaf; return nodeLeaf.Value.ByteArrayToHexString(); } - else if (Leaf.isNestedLeaf) + + if (Leaf is NestedLeaf nestedLeaf) { - NestedLeaf nestedLeaf = (NestedLeaf)Leaf; - return new - { - type = "nested", - tree = nestedLeaf.tree.Encode(), - weight = nestedLeaf.weight.ToString(), - threshold = nestedLeaf.threshold.ToString() - }; + return nestedLeaf.Parse(); } throw new InvalidOperationException("Invalid topology"); @@ -236,7 +222,6 @@ public static Topology Decode(string input) return new Topology(leaf); } - // Todo once tests are passing refactor to use a HashConfiguration method on the leafs specifically, we can add an abstract method to be overwritten public byte[] HashConfiguration() { if (IsNode()) @@ -246,64 +231,84 @@ public byte[] HashConfiguration() return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(leftHash, rightHash)); } - if (Leaf.isSignerLeaf) + if (Leaf is SignerLeaf signerLeaf) { - SignerLeaf signerLeaf = (SignerLeaf)Leaf; - byte[] prefix = Encoding.UTF8.GetBytes("Sequence signer:\n"); - byte[] address = signerLeaf.address.Value.HexStringToByteArray(); - byte[] weight = signerLeaf.weight.ByteArrayFromNumber().PadLeft(32); - - return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, address, weight)); + return signerLeaf.HashConfiguration(); } - if (Leaf.isSapientSignerLeaf) + if (Leaf is SapientSignerLeaf sapientSignerLeaf) { - SapientSignerLeaf sapientLeaf = (SapientSignerLeaf)Leaf; - byte[] prefix = Encoding.UTF8.GetBytes("Sequence sapient config:\n"); - byte[] address = sapientLeaf.address.Value.HexStringToByteArray(); - byte[] weight = sapientLeaf.weight.ByteArrayFromNumber().PadLeft(32); - byte[] imageHash = sapientLeaf.imageHash.HexStringToByteArray().PadLeft(32); - - return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, address, weight, imageHash)); + return sapientSignerLeaf.HashConfiguration(); } - if (Leaf.isSubdigestLeaf) + if (Leaf is SubdigestLeaf subdigestLeaf) { - SubdigestLeaf subdigestLeaf = (SubdigestLeaf)Leaf; - byte[] prefix = Encoding.UTF8.GetBytes("Sequence static digest:\n"); - byte[] digest = subdigestLeaf.digest; - - return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, digest)); + return subdigestLeaf.HashConfiguration(); } - if (Leaf.isAnyAddressSubdigestLeaf) + if (Leaf is AnyAddressSubdigestLeaf anyAddressSubdigestLeaf) { - AnyAddressSubdigestLeaf anyAddressSubdigestLeaf = (AnyAddressSubdigestLeaf)Leaf; - byte[] prefix = Encoding.UTF8.GetBytes("Sequence any address subdigest:\n"); - byte[] digest = anyAddressSubdigestLeaf.digest; - - return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, digest)); + return anyAddressSubdigestLeaf.HashConfiguration(); } - if (Leaf.isNodeLeaf) + if (Leaf is NodeLeaf nodeLeaf) { - // In the JS code, this just returns the topology itself, but in C# we need to return bytes - // Since NodeLeaf doesn't have any properties to hash, we'll return a byte array - return new byte[]{}; + return nodeLeaf.HashConfiguration(); } - if (Leaf.isNestedLeaf) + if (Leaf is NestedLeaf nestedLeaf) { - NestedLeaf nestedLeaf = (NestedLeaf)Leaf; - byte[] prefix = Encoding.UTF8.GetBytes("Sequence nested config:\n"); - byte[] treeHash = nestedLeaf.tree.HashConfiguration(); - byte[] threshold = nestedLeaf.threshold.ByteArrayFromNumber().PadLeft(32); - byte[] weight = nestedLeaf.weight.ByteArrayFromNumber().PadLeft(32); - - return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, treeHash, threshold, weight)); + return nestedLeaf.HashConfiguration(); } throw new InvalidOperationException($"Invalid topology, given {GetType()}"); } + + public byte[] Encode(bool noChainId, byte[] checkpointerData) + { + if (IsNode()) + { + var encoded0 = Node.left.Encode(noChainId, checkpointerData); + var encoded1 = Node.right.Encode(noChainId, checkpointerData); + + var isBranching = Node.right.IsNode(); + if (!isBranching) + return encoded0.Concat(encoded1).ToArray(); + + var encoded1Size = encoded1.Length.MinBytesFor(); + if (encoded1Size > 15) + throw new Exception("Branch too large"); + + int flag = (FlagBranch << 4) | encoded1Size; + return encoded0 + .Concat(flag.ByteArrayFromNumber()) + .Concat(encoded1.Length.ByteArrayFromNumber() + .PadLeft(encoded1Size)) + .Concat(encoded1) + .ToArray(); + } + + if (Leaf is NestedLeaf nestedLeaf) + { + nestedLeaf.Encode(noChainId, checkpointerData); + } + + if (Leaf is NodeLeaf nodeLeaf) + { + return nodeLeaf.Encode(noChainId, checkpointerData); + } + + if (Leaf is SignedSignerLeaf signedSignerLeaf) + { + signedSignerLeaf.Encode(noChainId, checkpointerData); + } + + if (Leaf is RawSignerLeaf rawSignerLeaf) + { + rawSignerLeaf.Encode(noChainId, checkpointerData); + } + + throw new Exception("Unrecognized topology structure."); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs index eb50b760..a65324de 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs @@ -11,7 +11,7 @@ public struct WeightResult public BigInteger maxWeight; } - public static WeightResult GetWeight(RawTopology topology, Func canSign) + public static WeightResult GetWeight(Topology topology, Func canSign) { if (topology == null) { @@ -36,7 +36,7 @@ public static WeightResult GetWeight(RawTopology topology, Func canS return new WeightResult { weight = 0, maxWeight = 0 }; } - public static WeightResult GetWeight(RawConfig configuration, Func canSign) + public static WeightResult GetWeight(Config configuration, Func canSign) { if (configuration?.topology == null) { @@ -46,7 +46,7 @@ public static WeightResult GetWeight(RawConfig configuration, Func c return GetWeight(configuration.topology, canSign); } - private static WeightResult GetWeightForLeaf(RawLeaf leaf, Func canSign) + private static WeightResult GetWeightForLeaf(Leaf leaf, Func canSign) { // Handle signed leaves (they have weight) if (leaf is SignedSignerLeaf signedSigner) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs index bb7e3504..2dc19d47 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs @@ -8,7 +8,7 @@ public class Weigth public BigInteger weight; public BigInteger maxWeight; - public static Weigth GetWeight(RawTopology topology, Func canSign) + public static Weigth GetWeight(Topology topology, Func canSign) { if (topology == null) { @@ -33,7 +33,7 @@ public static Weigth GetWeight(RawTopology topology, Func canSign) return new Weigth { weight = 0, maxWeight = 0 }; } - public static Weigth GetWeight(RawConfig configuration, Func canSign) + public static Weigth GetWeight(Config configuration, Func canSign) { if (configuration?.topology == null) { @@ -44,7 +44,7 @@ public static Weigth GetWeight(RawConfig configuration, Func canSign } // Todo once tests are passing refactor to get the weight on the leafs directly, we can create an abstract method and overwrite it - private static Weigth GetWeightForLeaf(RawLeaf leaf, Func canSign) + private static Weigth GetWeightForLeaf(Leaf leaf, Func canSign) { if (leaf is SignedSignerLeaf signedSigner) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs index 9c293c27..83b3f72f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs @@ -1,12 +1,28 @@ +using System; +using System.Linq; using System.Numerics; +using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives { public abstract class RSY : SignatureOfSignerLeaf { - public abstract string type { get; } public BigInteger r; public BigInteger s; public BigInteger yParity; + + public byte[] Pack() + { + if (yParity != 0 && yParity != 1 && yParity != 27 && yParity != 28) + { + throw new ArgumentException("yParity must be 0, 1, 27, or 28."); + } + + byte[] rBytes = r.ByteArrayFromNumber().PadLeft(32); + byte[] sBytes = s.ByteArrayFromNumber().PadLeft(32); + byte[] yByte = new byte[] { (byte)(yParity % 2) }; + + return rBytes.Concat(sBytes).Concat(yByte).ToArray(); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs deleted file mode 100644 index a2483296..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Numerics; - -namespace Sequence.EcosystemWallet.Primitives -{ - public class RawConfig - { - public BigInteger threshold; - public BigInteger checkpoint; - public RawTopology topology; - public Address checkpointer; - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs.meta deleted file mode 100644 index e236aba6..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawConfig.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 7fc6fd4fab4649659daedc97e68fab69 -timeCreated: 1747256590 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs deleted file mode 100644 index f1c07f4c..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Sequence.EcosystemWallet.Primitives -{ - public abstract class RawLeaf - { - - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs.meta deleted file mode 100644 index ddf6db8c..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawLeaf.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 786152a073eb441f8d96336a9ad00476 -timeCreated: 1747256354 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs index 49194551..76ffa111 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs @@ -2,11 +2,26 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class RawNestedLeaf : RawLeaf + internal class RawNestedLeaf : Leaf { public const string type = "nested"; - public RawTopology tree; + public Topology tree; public BigInteger weight; public BigInteger threshold; + + public override object Parse() + { + throw new System.NotImplementedException(); + } + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + throw new System.NotImplementedException(); + } + + public override byte[] HashConfiguration() + { + throw new System.NotImplementedException(); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs deleted file mode 100644 index 0c01fc86..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Sequence.EcosystemWallet.Primitives -{ - public class RawNode - { - public RawTopology left; - public RawTopology right; - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs.meta deleted file mode 100644 index 24a5a1b0..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNode.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 76795715dcab466ebac2248e22b70772 -timeCreated: 1747256161 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs index 7097d6b0..8219c024 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Sequence.EcosystemWallet.Utils; using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives @@ -9,7 +10,7 @@ public class RawSignature { public bool noChainId; public byte[] checkpointerData; - public RawConfig configuration; + public Config configuration; public RawSignature[] suffix; public Erc6492 erc6492; @@ -81,14 +82,10 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd var thresholdBytes = configuration.threshold.ToByteArray().PadLeft(bytesForThreshold); output = output.Concat(thresholdBytes).ToArray(); - // TODO: - /* - var topologyBytes = EncodeTopology(configuration.topology, signature); - output = Bytes.Concat(output, topologyBytes); + var topologyBytes = configuration.topology.Encode(noChainId, checkpointerData); + output = output.Concat(topologyBytes).ToArray(); - return erc6492 != null ? Wrap(output, erc6492) : output;*/ - - return output; + return erc6492 != null ? Erc6492Helper.Wrap(output.ByteArrayToHexStringWithPrefix(), erc6492.to, erc6492.data.ByteArrayToHexStringWithPrefix()) : output; } public static RawSignature Decode(byte[] erc6492Signature) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs index d988f4ae..227e9a9b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs @@ -1,16 +1,54 @@ +using System; using System.Numerics; namespace Sequence.EcosystemWallet.Primitives { - public class RawSignerLeaf : RawLeaf + public class RawSignerLeaf : Leaf { public const string type = "unrecovered-signer"; public BigInteger weight; public SignatureType signature; + + public override object Parse() + { + throw new System.NotImplementedException(); + } + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + if (signature is SignatureOfSignerLeafHash hash) + { + return hash.Encode(this); + } + + if (signature is SignatureOfSignerLeafEthSign ethSign) + { + return ethSign.Encode(this); + } + + if (signature is SignatureOfSignerLeafErc1271 erc1271) + { + return erc1271.Encode(this); + } + + if (signature is SignatureOfSapientSignerLeaf sapientSigner) + { + return sapientSigner.Encode(this); + } + + throw new Exception($"Invalid signature type: {signature.type}"); + } + + public override byte[] HashConfiguration() + { + throw new System.NotImplementedException(); + } } public abstract class SignatureType { - + public abstract string type { get; } + + public abstract byte[] Encode(Leaf leaf); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs deleted file mode 100644 index 53d1954d..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace Sequence.EcosystemWallet.Primitives -{ - public class RawTopology - { - public RawLeaf Leaf { get; private set; } - public RawNode Node { get; private set; } - - public RawTopology(RawLeaf leaf) - { - this.Leaf = leaf; - } - - public RawTopology(RawNode node) - { - this.Node = node; - } - - public bool IsLeaf() - { - return this.Leaf != null; - } - - public bool IsNode() - { - return this.Node != null; - } - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs.meta deleted file mode 100644 index 01cc943f..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawTopology.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 377a53364b3142c5a8a450c27848ca06 -timeCreated: 1747256210 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs deleted file mode 100644 index dd9d1184..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; - -namespace Sequence.EcosystemWallet.Primitives -{ - public class Signature - { - public static Topology FillLeaves(Topology topology, Func signatureFor) - { - if (topology.IsNode()) - { - return new Topology(new Node( - FillLeaves(topology.Node.left, signatureFor), - FillLeaves(topology.Node.right, signatureFor))); - } - - if (!topology.IsLeaf()) - throw new ArgumentException("Cannot create topology from empty leaves"); - - if (topology.Leaf.isSignerLeaf) - { - var leaf = topology.Leaf as SignerLeaf; - var signature = signatureFor(leaf); - var newLeaf = signature != null ? new SignedSignerLeaf - { - address = leaf.address, - weight = leaf.weight, - signed = true, - signature = signature - } : leaf; - - return new Topology(newLeaf); - } - - if (topology.Leaf.isSapientSignerLeaf) - { - var leaf = topology.Leaf as SapientSignerLeaf; - var signature = signatureFor(leaf); - var newLeaf = signature != null ? new SignedSapientSignerLeaf - { - address = leaf.address, - imageHash = leaf.imageHash, - weight = leaf.weight, - signed = true, - signature = signature - } : leaf; - - return new Topology(newLeaf); - } - - if (topology.Leaf.isNestedLeaf) - { - var nested = topology.Leaf as NestedLeaf; - return new Topology(new NestedLeaf - { - weight = nested.weight, - threshold = nested.threshold, - tree = FillLeaves(nested.tree, signatureFor) - }); - } - - if (topology.Leaf.isSubdigestLeaf || - topology.Leaf.isAnyAddressSubdigestLeaf || - topology.Leaf.isNodeLeaf) - { - return topology; - } - - throw new Exception("Invalid topology"); - } - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs new file mode 100644 index 00000000..28862e92 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs @@ -0,0 +1,108 @@ +using System; +using Sequence.EcosystemWallet.Envelope; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class SignatureHandler + { + public static Topology FillLeaves(Topology topology, Func signatureFor) + { + if (topology.IsNode()) + { + return new Topology(new Node( + FillLeaves(topology.Node.left, signatureFor), + FillLeaves(topology.Node.right, signatureFor))); + } + + if (!topology.IsLeaf()) + throw new ArgumentException("Cannot create topology from empty leaves"); + + var leaf = topology.Leaf; + if (leaf is SignerLeaf signerLeaf) + { + var signature = signatureFor(signerLeaf); + var newLeaf = signature != null ? new SignedSignerLeaf + { + address = signerLeaf.address, + weight = signerLeaf.weight, + signed = true, + signature = signature + } : signerLeaf; + + return new Topology(newLeaf); + } + + if (leaf is SapientSignerLeaf sapientSignerLeaf) + { + var signature = signatureFor(sapientSignerLeaf); + var newLeaf = signature != null ? new SignedSapientSignerLeaf + { + address = sapientSignerLeaf.address, + imageHash = sapientSignerLeaf.imageHash, + weight = sapientSignerLeaf.weight, + signed = true, + signature = signature + } : sapientSignerLeaf; + + return new Topology(newLeaf); + } + + if (leaf is NestedLeaf nestedLeaf) + { + return new Topology(new NestedLeaf + { + weight = nestedLeaf.weight, + threshold = nestedLeaf.threshold, + tree = FillLeaves(nestedLeaf.tree, signatureFor) + }); + } + + if (leaf is SubdigestLeaf || + leaf is AnyAddressSubdigestLeaf || + leaf is NodeLeaf) + { + return topology; + } + + throw new Exception("Invalid topology"); + } + + public static RawSignature EncodeSignature(Signed envelope) + { + var topology = FillLeaves(envelope.configuration.topology, + leaf => SignatureForLeaf(envelope, leaf)); + + return new RawSignature + { + noChainId = envelope.chainId == 0, + configuration = new Config + { + threshold = envelope.configuration.threshold, + checkpoint = envelope.configuration.checkpoint, + checkpointer = envelope.configuration.checkpointer, + topology = null, + } + }; + } + + public static EnvelopeSignature SignatureForLeaf(Signed envelope, Leaf leaf) + { + if (leaf is SignerLeaf signerLeaf) + { + return Array.Find(envelope.signatures, sig => + sig is Signature signature && + signature.address.Equals(signerLeaf.address)); + } + + if (leaf is SapientSignerLeaf sapientSignerLeaf) + { + return Array.Find(envelope.signatures, sig => + sig is SapientSignature sapient && + sapient.imageHash == sapientSignerLeaf.imageHash && + sapient.signature.address.Equals(sapientSignerLeaf.address)); + } + + return null; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Signature.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs index 8f887aed..813fdb09 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs @@ -1,15 +1,52 @@ +using System; +using System.Linq; +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { public class SignatureOfSapientSignerLeaf : SignatureType { - public Address address; - public byte[] data; - public Type type; - public enum Type { sapient, sapient_compact } + + public override string type => curType.ToString(); + + public Address address; + public byte[] data; + public Type curType; + + public override byte[] Encode(Leaf leaf) + { + if (leaf is not SignerLeaf signerLeaf) + throw new Exception(); + + var weightBytes = Array.Empty(); + var flag = (type == "sapient" ? Topology.FlagSignatureSapient : Topology.FlagSignatureSapientCompact) << 4; + + var sizeLen = data.Length.MinBytesFor(); + if (sizeLen > 3) + throw new Exception("Signature too large"); + + flag |= sizeLen << 2; + + if (signerLeaf.weight <= 3 && signerLeaf.weight > 0) + flag |= (int)signerLeaf.weight; + else if (signerLeaf.weight <= 255) + weightBytes = signerLeaf.weight.ByteArrayFromNumber(); + else + throw new Exception("Weight too large"); + + return flag.ByteArrayFromNumber() + .Concat(weightBytes) + .Concat(address.Value.HexStringToByteArray() + .PadLeft(20)) + .Concat(data.Length.ByteArrayFromNumber() + .PadLeft(sizeLen)) + .Concat(data) + .ToArray(); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs index 79c987a7..b4b5933c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs @@ -1,9 +1,44 @@ +using System; +using System.Linq; +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { public class SignatureOfSignerLeafErc1271 : SignatureOfSignerLeaf { - public const string type = "erc1271"; + public override string type => "erc1271"; + public Address address; public byte[] data; + + public override byte[] Encode(Leaf leaf) + { + if (leaf is not SignerLeaf signerLeaf) + throw new Exception(); + + var weightBytes = Array.Empty(); + var flag = Topology.FlagSignatureErc1271 << 4; + var sizeLen = data.Length.MinBytesFor(); + if (sizeLen > 3) + throw new Exception("Signature too large"); + + flag |= sizeLen << 2; + + if (signerLeaf.weight <= 3 && signerLeaf.weight > 0) + flag |= (int)signerLeaf.weight; + else if (signerLeaf.weight <= 255) + weightBytes = signerLeaf.weight.ByteArrayFromNumber(); + else + throw new Exception("Weight too large"); + + return flag.ByteArrayFromNumber() + .Concat(weightBytes) + .Concat(address.Value.HexStringToByteArray() + .PadLeft(20)) + .Concat(data.Length.ByteArrayFromNumber() + .PadLeft(sizeLen)) + .Concat(data) + .ToArray(); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs index df6b0be7..a3af9b1c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs @@ -1,7 +1,29 @@ +using System; +using System.Linq; +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { public class SignatureOfSignerLeafEthSign : RSY { public override string type => "eth_sign"; + + public override byte[] Encode(Leaf leaf) + { + if (leaf is not SignerLeaf signerLeaf) + throw new Exception(); + + var weightBytes = new byte[0]; + var flag = Topology.FlagSignatureEthSign << 4; + + if (signerLeaf.weight <= 15 && signerLeaf.weight > 0) + flag |= (int)signerLeaf.weight; + else if (signerLeaf.weight <= 255) + weightBytes = signerLeaf.weight.ByteArrayFromNumber(); + else + throw new Exception("Weight too large"); + + return flag.ByteArrayFromNumber().Concat(weightBytes).Concat(Pack()).ToArray(); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs index 223bc0f3..3e7553f6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs @@ -1,7 +1,29 @@ +using System; +using System.Linq; +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { public class SignatureOfSignerLeafHash : RSY { public override string type => "hash"; + + public override byte[] Encode(Leaf leaf) + { + if (leaf is not SignerLeaf signerLeaf) + throw new Exception(); + + var weightBytes = Array.Empty(); + var flag = Topology.FlagSignatureHash << 4; + + if (signerLeaf.weight <= 15 && signerLeaf.weight > 0) + flag |= (int)signerLeaf.weight; + else if (signerLeaf.weight <= 255) + weightBytes = signerLeaf.weight.ByteArrayFromNumber(); + else + throw new Exception("Weight too large"); + + return flag.ByteArrayFromNumber().Concat(weightBytes).Concat(Pack()).ToArray(); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils.meta new file mode 100644 index 00000000..77eac38f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9ef0ab399b77410f949da7f1914a810b +timeCreated: 1750962415 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs new file mode 100644 index 00000000..4acefd0b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs @@ -0,0 +1,108 @@ +using System; +using System.Threading.Tasks; +using Nethereum.ABI; +using Nethereum.ABI.FunctionEncoding; +using Nethereum.ABI.Model; +using Nethereum.Hex.HexConvertors.Extensions; +using Nethereum.Web3; + +namespace Sequence.EcosystemWallet.Utils +{ + public static class Erc6492Helper + { + private const string DeployCode = "0x60806040523480..."; + private static readonly string MagicBytes = "0x6492649264926492649264926492649264926492649264926492649264926492"; + + public class Context + { + public Address factory; + public Address stage1; + public Address stage2; + public string creationCode; + } + + public static (string To, string Data) Deploy(string deployHash, Context context) + { + var encoded = EncodeDeploy(context.stage1, deployHash); + return (context.factory, encoded); + } + + private static string EncodeDeploy(string stage1, string deployHash) + { + var function = new FunctionABI("deploy", false); + function.InputParameters = new[] + { + new Parameter("address", "stage1"), + new Parameter("bytes", "hash") + }; + + var encoder = new FunctionCallEncoder(); + return encoder.EncodeRequest(function.Sha3Signature, Array.Empty(), stage1, deployHash.HexToByteArray()); + } + + public static string Wrap(string signature, string to, string data) + { + var encoder = new ABIEncode(); + var encoded = encoder.GetABIEncodedPacked( + new ABIValue("address", to), + new ABIValue("bytes", data.HexToByteArray()), + new ABIValue("bytes", signature.HexToByteArray()) + ).ToHex(); + + return encoded + MagicBytes[2..]; + } + + public static (string Signature, (string To, string Data)? Erc6492) Decode(string signature) + { + if (signature.EndsWith(MagicBytes[2..])) + { + try + { + var trimmed = signature[..^MagicBytes[2..].Length]; + var decoder = new ParameterDecoder(); + var parameters = new[] { + new Parameter("address", "to"), + new Parameter("bytes", "data"), + new Parameter("bytes", "signature") + }; + + var decoded = decoder.DecodeDefaultData(trimmed, parameters); + var to = (string)decoded[0].Result; + var data = ((byte[])decoded[1].Result).ToHex(); + var innerSig = ((byte[])decoded[2].Result).ToHex(); + + return (innerSig, (to, data)); + } + catch + { + // fallback to raw signature + } + } + return (signature, null); + } + + public static async Task IsValidAsync( + string address, + string messageHash, + string encodedSignature, + Web3 web3) + { + /*var encoder = new ABIEncode(); + var calldata = encoder.GetABIEncoded( + new ABIValue("address", address), + new ABIValue("bytes32", messageHash.HexToByteArray()), + new ABIValue("bytes", encodedSignature.HexToByteArray()) + ).ToHex(); + + var fullData = DeployCode + calldata[2..]; + + var result = await .Transactions.Call.SendRequestAsync(new Nethereum.RPC.Eth.DTOs.CallInput + { + Data = fullData, + To = null // To is null for `eth_call` with deploy bytecode + }, Nethereum.RPC.Eth.DTOs.BlockParameter.CreateLatest());*/ + + return Convert.ToInt32("result", 16) == 1; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs.meta new file mode 100644 index 00000000..d6a3a8a1 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fd27d3906bbf44eb83fb2b5c33d8d364 +timeCreated: 1750962426 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs index 93513e53..3ae69c7c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs @@ -118,6 +118,18 @@ public static byte[] ByteArrayFromNumber(this BigInteger value, int? size = null return rawBytes; } + public static int MinBytesFor(this int value) + { + if (value < 0) + throw new ArgumentOutOfRangeException(nameof(value), "Value must be non-negative."); + + if (value == 0) + return 1; + + int bits = (int)Math.Ceiling(BigInteger.Log(value + 1, 2)); + return (bits + 7) / 8; + } + public static byte[] ByteArrayFromNumber(this int value, int size) { if (size < 1 || size > 4) From ea86ac2e005660231b31d1e47d73aa1fbd0dd485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 27 Jun 2025 23:08:07 +0200 Subject: [PATCH 061/165] byte array encoding changes, padLeft does not throw exceptions when the array is too large --- .../IntegrationTests/DevToolsTest.cs | 2 +- .../IntegrationTests/Utils/ConfigUtils.cs | 4 +- .../IntegrationTests/Utils/SignatureUtils.cs | 21 ++-- .../Primitives/Config/Config.cs | 9 +- .../Primitives/Config/NestedLeaf.cs | 12 +- .../Primitives/Config/NodeLeaf.cs | 2 +- .../Primitives/Config/SapientSignerLeaf.cs | 6 +- .../Primitives/Config/SignerLeaf.cs | 31 ++--- .../Primitives/Config/Topology.cs | 106 +++--------------- .../Primitives/Signature/ChainedSignature.cs | 8 +- .../Primitives/Signature/RSY.cs | 10 +- .../Primitives/Signature/RawSignature.cs | 37 +++--- .../Primitives/Signature/RawSignerLeaf.cs | 24 +--- .../Primitives/Signature/SignatureHandler.cs | 2 - .../Signature/SignatureOfSapientSignerLeaf.cs | 18 +-- .../Signature/SignatureOfSignerLeafErc1271.cs | 16 +-- .../Signature/SignatureOfSignerLeafEthSign.cs | 2 +- .../Signature/SignatureOfSignerLeafHash.cs | 2 +- .../Signature/SignedSapientSignerLeaf.cs | 7 +- .../Primitives/Signature/SignedSignerLeaf.cs | 7 +- .../EcosystemWallet/Utils/Erc6492Helper.cs | 11 +- .../SequenceSDK/Utils/ByteArrayExtensions.cs | 18 +-- 22 files changed, 133 insertions(+), 222 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs index e1014f91..49f2c1d7 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs @@ -11,7 +11,7 @@ public Task DevToolsRandomConfig(Dictionary parameters) var maxDepth = parameters["maxDepth"].ToString(); var seed = (string)parameters["seed"]; var minThresholdOnNested = parameters["minThresholdOnNested"].ToString(); - var checkpointer = (string)parameters["checkpointer"]; + var checkpointer = parameters.TryGetValue("checkpointer", out var checkpointerObj) ? checkpointerObj.ToString() : null; return Task.FromResult(""); } diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs index ed28e755..7662efa4 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs @@ -11,8 +11,8 @@ public static Primitives.Config FromJson(string json) { var input = JsonConvert.DeserializeObject>(json); - var threshold = (string)input["threshold"]; - var checkpoint = (string)input["checkpoint"]; + var threshold = input["threshold"].ToString(); + var checkpoint = input["checkpoint"].ToString(); var checkpointer = input.GetAddress("checkpointer"); var topology = input["topology"].ToString(); diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs index 76851c68..dcad16f8 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Numerics; using System.Threading.Tasks; +using Newtonsoft.Json; using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; @@ -26,6 +27,8 @@ public static async Task DoEncode(string input, string[] signatures, boo Values = values.Skip(2).ToArray() }; }).ToList(); + + Debug.Log($"All Signatures: {JsonConvert.SerializeObject(allSignatures)}"); var fullTopology = SignatureHandler.FillLeaves(config.topology, leaf => { @@ -48,16 +51,16 @@ public static async Task DoEncode(string input, string[] signatures, boo case "eth_sign": return new SignatureOfSignerLeafEthSign { - r = new BigInteger(candidate.Values[0].HexStringToByteArray(32)), - s = new BigInteger(candidate.Values[1].HexStringToByteArray(32)), - // TODO: yParity = OxSignature.VToYParity(int.Parse(candidate.Values[2])), + r = candidate.Values[0].HexStringToBigInteger(), + s = candidate.Values[1].HexStringToBigInteger(), + yParity = int.Parse(candidate.Values[2]) % 2 }; case "hash": return new SignatureOfSignerLeafHash { - r = new BigInteger(candidate.Values[0].HexStringToByteArray(32)), - s = new BigInteger(candidate.Values[1].HexStringToByteArray(32)), - // TODO: yParity = OxSignature.VToYParity(int.Parse(candidate.Values[2])), + r = candidate.Values[0].HexStringToBigInteger(), + s = candidate.Values[1].HexStringToBigInteger(), + yParity = int.Parse(candidate.Values[2]) % 2 }; case "sapient": return new SignatureOfSapientSignerLeaf @@ -105,10 +108,12 @@ public static async Task DoEncode(string input, string[] signatures, boo return null; }); + Debug.Log(JsonConvert.SerializeObject(fullTopology)); + var rawSignature = new RawSignature { noChainId = noChainId, - configuration = + configuration = new Primitives.Config { threshold = config.threshold, checkpoint = config.checkpoint, @@ -118,7 +123,7 @@ public static async Task DoEncode(string input, string[] signatures, boo checkpointerData = checkpointerData }; - return rawSignature.Encode().ByteArrayToHexString(); + return rawSignature.Encode().ByteArrayToHexStringWithPrefix(); } public static async Task DoConcat(List signatures) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs index 471b53d2..2c6b6642 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs @@ -1,9 +1,7 @@ -using System.Collections.Generic; using System.Numerics; using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -16,12 +14,7 @@ public class Config public Leaf FindSignerLeaf(Address address) { - if (topology == null) - { - return null; - } - - return topology.FindSignerLeaf(address); + return topology?.FindSignerLeaf(address); } public byte[] HashConfiguration() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs index baed5571..6dae4a77 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs @@ -50,12 +50,12 @@ public override byte[] Encode(bool noChainId, byte[] checkpointerData) if (nested.Length > 0xFFFFFF) throw new Exception("Nested tree too large"); - return flag.ByteArrayFromNumber() - .Concat(weightBytes) - .Concat(thresholdBytes) - .Concat(nested.Length.ByteArrayFromNumber().PadLeft(3)) - .Concat(nested) - .ToArray(); + return ByteArrayExtensions.ConcatenateByteArrays( + flag.ByteArrayFromNumber(), + weightBytes, + thresholdBytes, + nested.Length.ByteArrayFromNumber().PadLeft(3), + nested); } public override byte[] HashConfiguration() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs index 11357fab..1cee04a6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs @@ -19,7 +19,7 @@ public override object Parse() public override byte[] Encode(bool noChainId, byte[] checkpointerData) { - return (Topology.FlagNode << 4).ByteArrayFromNumber().Concat(Value).ToArray(); + return ByteArrayExtensions.ConcatenateByteArrays((Topology.FlagNode << 4).ByteArrayFromNumber(), Value); } // In the JS code, this just returns the topology itself, but in C# we need to return bytes diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs index 8f72e979..50b7604f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs @@ -8,11 +8,10 @@ namespace Sequence.EcosystemWallet.Primitives public class SapientSignerLeaf : Leaf { public const string type = "sapient-signer"; + public Address address; public BigInteger weight; public string imageHash; - public bool signed; - public SignatureType signature; public override object Parse() { @@ -27,7 +26,8 @@ public override object Parse() public override byte[] Encode(bool noChainId, byte[] checkpointerData) { - throw new System.NotImplementedException(); + var flag = Topology.FlagNode << 4; + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(), HashConfiguration()); } public override byte[] HashConfiguration() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs index b608bbc3..97e74e42 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs @@ -12,8 +12,6 @@ public class SignerLeaf : Leaf public Address address; public BigInteger weight; - public bool signed; - public SignatureType signature; public override object Parse() { @@ -27,27 +25,18 @@ public override object Parse() public override byte[] Encode(bool noChainId, byte[] checkpointerData) { - if (signature is SignatureOfSignerLeafHash hash) - { - return hash.Encode(this); - } - - if (signature is SignatureOfSignerLeafEthSign ethSign) - { - return ethSign.Encode(this); - } + var flag = Topology.FlagAddress << 4; + var weightBytes = Array.Empty(); - if (signature is SignatureOfSignerLeafErc1271 erc1271) - { - return erc1271.Encode(this); - } + if (weight > 0 && weight <= 15) + flag |= (int)weight; + else if (weight <= 255) + weightBytes = weight.ByteArrayFromNumber(); + else + throw new ArgumentException("Weight too large"); - if (signature is SignatureOfSapientSignerLeaf sapientSigner) - { - return sapientSigner.Encode(this); - } - - throw new Exception($"Invalid signature type: {signature.type}"); + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(), weightBytes, + address.Value.HexStringToByteArray().PadLeft(20)); } public override byte[] HashConfiguration() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index 119b4fa4..146750d0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -1,10 +1,10 @@ using System; using System.Numerics; using System.Collections.Generic; -using System.Linq; using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -116,37 +116,7 @@ public object Parse() }; } - if (Leaf is SignerLeaf signerLeaf) - { - return signerLeaf.Parse(); - } - - if (Leaf is SapientSignerLeaf sapientSignerLeaf) - { - return sapientSignerLeaf.Parse(); - } - - if (Leaf is SubdigestLeaf subdigestLeaf) - { - return subdigestLeaf.Parse(); - } - - if (Leaf is AnyAddressSubdigestLeaf anyAddressSubdigestLeaf) - { - return anyAddressSubdigestLeaf.Parse(); - } - - if (Leaf is NodeLeaf nodeLeaf) - { - return nodeLeaf.Value.ByteArrayToHexString(); - } - - if (Leaf is NestedLeaf nestedLeaf) - { - return nestedLeaf.Parse(); - } - - throw new InvalidOperationException("Invalid topology"); + return Leaf.Parse(); } public static Topology Decode(string input) @@ -231,37 +201,7 @@ public byte[] HashConfiguration() return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(leftHash, rightHash)); } - if (Leaf is SignerLeaf signerLeaf) - { - return signerLeaf.HashConfiguration(); - } - - if (Leaf is SapientSignerLeaf sapientSignerLeaf) - { - return sapientSignerLeaf.HashConfiguration(); - } - - if (Leaf is SubdigestLeaf subdigestLeaf) - { - return subdigestLeaf.HashConfiguration(); - } - - if (Leaf is AnyAddressSubdigestLeaf anyAddressSubdigestLeaf) - { - return anyAddressSubdigestLeaf.HashConfiguration(); - } - - if (Leaf is NodeLeaf nodeLeaf) - { - return nodeLeaf.HashConfiguration(); - } - - if (Leaf is NestedLeaf nestedLeaf) - { - return nestedLeaf.HashConfiguration(); - } - - throw new InvalidOperationException($"Invalid topology, given {GetType()}"); + return Leaf.HashConfiguration(); } public byte[] Encode(bool noChainId, byte[] checkpointerData) @@ -273,42 +213,22 @@ public byte[] Encode(bool noChainId, byte[] checkpointerData) var isBranching = Node.right.IsNode(); if (!isBranching) - return encoded0.Concat(encoded1).ToArray(); + return ByteArrayExtensions.ConcatenateByteArrays(encoded0, encoded1); var encoded1Size = encoded1.Length.MinBytesFor(); if (encoded1Size > 15) throw new Exception("Branch too large"); - - int flag = (FlagBranch << 4) | encoded1Size; - return encoded0 - .Concat(flag.ByteArrayFromNumber()) - .Concat(encoded1.Length.ByteArrayFromNumber() - .PadLeft(encoded1Size)) - .Concat(encoded1) - .ToArray(); - } - - if (Leaf is NestedLeaf nestedLeaf) - { - nestedLeaf.Encode(noChainId, checkpointerData); - } - - if (Leaf is NodeLeaf nodeLeaf) - { - return nodeLeaf.Encode(noChainId, checkpointerData); - } - - if (Leaf is SignedSignerLeaf signedSignerLeaf) - { - signedSignerLeaf.Encode(noChainId, checkpointerData); - } - - if (Leaf is RawSignerLeaf rawSignerLeaf) - { - rawSignerLeaf.Encode(noChainId, checkpointerData); + + var flag = (FlagBranch << 4) | encoded1Size; + + return ByteArrayExtensions.ConcatenateByteArrays(encoded0, + flag.ByteArrayFromNumber(), + encoded1.Length.ByteArrayFromNumber() + .PadLeft(encoded1Size), + encoded1); } - throw new Exception("Unrecognized topology structure."); + return Leaf.Encode(noChainId, checkpointerData); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs index e9c3acf9..5a975553 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs @@ -31,12 +31,16 @@ public byte[] Encode() if (sigForCheckpointer.configuration.checkpointer != null) { output = sigForCheckpointer.configuration.checkpointer.Value.HexStringToByteArray().PadLeft(20).Concat(output).ToArray(); + output = ByteArrayExtensions.ConcatenateByteArrays( + sigForCheckpointer.configuration.checkpointer.Value.HexStringToByteArray().PadLeft(20), + output); var checkpointerDataSize = sigForCheckpointer.checkpointerData?.Length ?? 0; if (checkpointerDataSize > 16777215) throw new Exception("Checkpointer data too large"); - output = output.Concat(sigForCheckpointer.checkpointerData ?? new byte[0]).ToArray(); + output = ByteArrayExtensions.ConcatenateByteArrays(output, + sigForCheckpointer.checkpointerData ?? new byte[0]); } for (int i = 0; i < signatures.Length; i++) @@ -48,7 +52,7 @@ public byte[] Encode() if (encoded.Length > 16777215) throw new Exception("Chained signature too large"); - output = output.Concat(encoded).ToArray(); + output = ByteArrayExtensions.ConcatenateByteArrays(output, encoded); } return output; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs index 83b3f72f..1c2f1af0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs @@ -20,9 +20,13 @@ public byte[] Pack() byte[] rBytes = r.ByteArrayFromNumber().PadLeft(32); byte[] sBytes = s.ByteArrayFromNumber().PadLeft(32); - byte[] yByte = new byte[] { (byte)(yParity % 2) }; - - return rBytes.Concat(sBytes).Concat(yByte).ToArray(); + + if (yParity % 2 == 1) + { + sBytes[0] |= 0x80; + } + + return ByteArrayExtensions.ConcatenateByteArrays(rBytes, sBytes); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs index 8219c024..18a60206 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -1,24 +1,24 @@ using System; using System.Collections.Generic; -using System.Linq; using Sequence.EcosystemWallet.Utils; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { public class RawSignature { - public bool noChainId; - public byte[] checkpointerData; - public Config configuration; - public RawSignature[] suffix; - public Erc6492 erc6492; - public class Erc6492 { public Address to; public byte[] data; } + + public bool noChainId; + public byte[] checkpointerData; + public Config configuration; + public RawSignature[] suffix; + public Erc6492 erc6492; public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAddress = false) { @@ -43,49 +43,52 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd if (noChainId) flag |= 0x02; - int bytesForCheckpoint = configuration.checkpoint.MinimumBytesNeeded(); + int bytesForCheckpoint = configuration.checkpoint.MinBytesFor(); + Debug.Log($"{configuration.checkpoint} - {bytesForCheckpoint}"); + if (bytesForCheckpoint > 7) throw new Exception("Checkpoint too large"); flag |= (byte)(bytesForCheckpoint << 2); - int bytesForThreshold = configuration.threshold.MinimumBytesNeeded(); + int bytesForThreshold = configuration.threshold.MinBytesFor(); bytesForThreshold = bytesForThreshold == 0 ? 1 : bytesForThreshold; if (bytesForThreshold > 2) throw new Exception("Threshold too large"); flag |= bytesForThreshold == 2 ? (byte)0x20 : (byte)0x00; - if (!string.IsNullOrEmpty(configuration.checkpointer) && !skipCheckpointerAddress) + if (configuration.checkpointer != null && !skipCheckpointerAddress) { flag |= 0x40; } byte[] output = new byte[] { flag }; - if (!string.IsNullOrEmpty(configuration.checkpointer) && !skipCheckpointerAddress) + if (configuration.checkpointer != null && !skipCheckpointerAddress) { - output = output.Concat(configuration.checkpointer.Value.ToByteArray().PadLeft(20)).ToArray(); + output = ByteArrayExtensions.ConcatenateByteArrays(output, configuration.checkpointer.Value.ToByteArray().PadLeft(20)); + if (!skipCheckpointerData) { int checkpointerDataSize = checkpointerData?.Length ?? 0; if (checkpointerDataSize > 16777215) throw new Exception("Checkpointer data too large"); - output = output.Concat(checkpointerData ?? new byte[0]).ToArray(); + output = ByteArrayExtensions.ConcatenateByteArrays(output, checkpointerData ?? new byte[0]); } } var checkpointBytes = configuration.checkpoint.ToByteArray().PadLeft(bytesForCheckpoint); - output = output.Concat(checkpointBytes).ToArray(); + output = ByteArrayExtensions.ConcatenateByteArrays(output, checkpointBytes); var thresholdBytes = configuration.threshold.ToByteArray().PadLeft(bytesForThreshold); - output = output.Concat(thresholdBytes).ToArray(); + output = ByteArrayExtensions.ConcatenateByteArrays(output, thresholdBytes); var topologyBytes = configuration.topology.Encode(noChainId, checkpointerData); - output = output.Concat(topologyBytes).ToArray(); + output = ByteArrayExtensions.ConcatenateByteArrays(output, topologyBytes); - return erc6492 != null ? Erc6492Helper.Wrap(output.ByteArrayToHexStringWithPrefix(), erc6492.to, erc6492.data.ByteArrayToHexStringWithPrefix()) : output; + return erc6492 != null ? Erc6492Helper.Wrap(output, erc6492.to, erc6492.data) : output; } public static RawSignature Decode(byte[] erc6492Signature) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs index 227e9a9b..806952eb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs @@ -1,4 +1,3 @@ -using System; using System.Numerics; namespace Sequence.EcosystemWallet.Primitives @@ -6,6 +5,7 @@ namespace Sequence.EcosystemWallet.Primitives public class RawSignerLeaf : Leaf { public const string type = "unrecovered-signer"; + public BigInteger weight; public SignatureType signature; @@ -16,27 +16,7 @@ public override object Parse() public override byte[] Encode(bool noChainId, byte[] checkpointerData) { - if (signature is SignatureOfSignerLeafHash hash) - { - return hash.Encode(this); - } - - if (signature is SignatureOfSignerLeafEthSign ethSign) - { - return ethSign.Encode(this); - } - - if (signature is SignatureOfSignerLeafErc1271 erc1271) - { - return erc1271.Encode(this); - } - - if (signature is SignatureOfSapientSignerLeaf sapientSigner) - { - return sapientSigner.Encode(this); - } - - throw new Exception($"Invalid signature type: {signature.type}"); + return signature.Encode(this); } public override byte[] HashConfiguration() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs index 28862e92..36551fd7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs @@ -25,7 +25,6 @@ public static Topology FillLeaves(Topology topology, Func s { address = signerLeaf.address, weight = signerLeaf.weight, - signed = true, signature = signature } : signerLeaf; @@ -40,7 +39,6 @@ public static Topology FillLeaves(Topology topology, Func s address = sapientSignerLeaf.address, imageHash = sapientSignerLeaf.imageHash, weight = sapientSignerLeaf.weight, - signed = true, signature = signature } : sapientSignerLeaf; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs index 813fdb09..bf6a8c72 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs @@ -20,7 +20,7 @@ public enum Type public override byte[] Encode(Leaf leaf) { - if (leaf is not SignerLeaf signerLeaf) + if (leaf is not SapientSignerLeaf signerLeaf) throw new Exception(); var weightBytes = Array.Empty(); @@ -39,14 +39,14 @@ public override byte[] Encode(Leaf leaf) else throw new Exception("Weight too large"); - return flag.ByteArrayFromNumber() - .Concat(weightBytes) - .Concat(address.Value.HexStringToByteArray() - .PadLeft(20)) - .Concat(data.Length.ByteArrayFromNumber() - .PadLeft(sizeLen)) - .Concat(data) - .ToArray(); + return ByteArrayExtensions.ConcatenateByteArrays( + flag.ByteArrayFromNumber(), + weightBytes, + address.Value.HexStringToByteArray() + .PadLeft(20), + data.Length.ByteArrayFromNumber() + .PadLeft(sizeLen), + data); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs index b4b5933c..036d163b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs @@ -31,14 +31,14 @@ public override byte[] Encode(Leaf leaf) else throw new Exception("Weight too large"); - return flag.ByteArrayFromNumber() - .Concat(weightBytes) - .Concat(address.Value.HexStringToByteArray() - .PadLeft(20)) - .Concat(data.Length.ByteArrayFromNumber() - .PadLeft(sizeLen)) - .Concat(data) - .ToArray(); + return ByteArrayExtensions.ConcatenateByteArrays( + flag.ByteArrayFromNumber(), + weightBytes, + address.Value.HexStringToByteArray() + .PadLeft(20), + data.Length.ByteArrayFromNumber() + .PadLeft(sizeLen), + data); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs index a3af9b1c..5a54eb41 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs @@ -23,7 +23,7 @@ public override byte[] Encode(Leaf leaf) else throw new Exception("Weight too large"); - return flag.ByteArrayFromNumber().Concat(weightBytes).Concat(Pack()).ToArray(); + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(), weightBytes, Pack()); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs index 3e7553f6..d431a9cd 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs @@ -23,7 +23,7 @@ public override byte[] Encode(Leaf leaf) else throw new Exception("Weight too large"); - return flag.ByteArrayFromNumber().Concat(weightBytes).Concat(Pack()).ToArray(); + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(), weightBytes, Pack()); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs index 3ad952c3..9ad96936 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs @@ -2,6 +2,11 @@ namespace Sequence.EcosystemWallet.Primitives { public class SignedSapientSignerLeaf : SapientSignerLeaf { - public bool signed = true; + public SignatureType signature; + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + return signature.Encode(this); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs index 01023394..b40aa390 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs @@ -2,6 +2,11 @@ namespace Sequence.EcosystemWallet.Primitives { public class SignedSignerLeaf : SignerLeaf { - public bool signed = true; + public SignatureType signature; + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + return signature.Encode(this); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs index 4acefd0b..7fd12d28 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Threading.Tasks; using Nethereum.ABI; using Nethereum.ABI.FunctionEncoding; @@ -40,16 +41,16 @@ private static string EncodeDeploy(string stage1, string deployHash) return encoder.EncodeRequest(function.Sha3Signature, Array.Empty(), stage1, deployHash.HexToByteArray()); } - public static string Wrap(string signature, string to, string data) + public static byte[] Wrap(byte[] signature, Address to, byte[] data) { var encoder = new ABIEncode(); var encoded = encoder.GetABIEncodedPacked( new ABIValue("address", to), - new ABIValue("bytes", data.HexToByteArray()), - new ABIValue("bytes", signature.HexToByteArray()) - ).ToHex(); + new ABIValue("bytes", data), + new ABIValue("bytes", signature) + ); - return encoded + MagicBytes[2..]; + return encoded.Concat(MagicBytes.HexToByteArray()).ToArray(); } public static (string Signature, (string To, string Data)? Erc6492) Decode(string signature) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs index 3ae69c7c..6be94538 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs @@ -83,7 +83,9 @@ public static byte[] BuildArrayWithRepeatedValue(byte[] value, int repetitions) public static byte[] PadLeft(this byte[] input, int totalSize) { if (input.Length > totalSize) - throw new ArgumentException("Input is larger than total size"); + { + return input; + } byte[] result = new byte[totalSize]; Buffer.BlockCopy(input, 0, result, totalSize - input.Length, input.Length); @@ -117,17 +119,19 @@ public static byte[] ByteArrayFromNumber(this BigInteger value, int? size = null return rawBytes; } - + public static int MinBytesFor(this int value) + { + return MinBytesFor(new BigInteger(value)); + } + + public static int MinBytesFor(this BigInteger value) { if (value < 0) throw new ArgumentOutOfRangeException(nameof(value), "Value must be non-negative."); - if (value == 0) - return 1; - - int bits = (int)Math.Ceiling(BigInteger.Log(value + 1, 2)); - return (bits + 7) / 8; + var hex = value.ToString("X"); + return (int)Math.Ceiling(hex.Length / 2.0); } public static byte[] ByteArrayFromNumber(this int value, int size) From 6f5b540ddc99beb77d5505080a294612c73fcaad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Sun, 29 Jun 2025 12:35:19 +0200 Subject: [PATCH 062/165] concat and decode signatures --- .../IntegrationTests/ConfigTests.cs | 127 +-------- .../IntegrationTests/DevToolsTest.cs | 163 ++++++++++- .../IntegrationTests/Server/Server.cs | 1 + .../IntegrationTests/SignatureTests.cs | 140 +++++++++- .../IntegrationTests/Utils/ConfigUtils.cs | 28 -- .../Utils/ConfigUtils.cs.meta | 3 - .../Utils/IntegrationTestParamsUtils.cs | 9 + .../IntegrationTests/Utils/SignatureUtils.cs | 162 ----------- .../Utils/SignatureUtils.cs.meta | 3 - .../UnityServicesProjectConfiguration.json | 1 + ...ityServicesProjectConfiguration.json.meta} | 2 +- .../Android/AndroidKeyBridge.java.meta | 2 +- .../Envelope/SapientSignature.cs | 3 +- .../EcosystemWallet/Envelope/Signature.cs | 3 +- .../Config/AnyAddressSubdigestLeaf.cs | 3 +- .../Primitives/Config/Config.cs | 32 ++- .../Primitives/Config/NestedLeaf.cs | 8 +- .../Primitives/Config/NodeLeaf.cs | 6 +- .../Primitives/Config/SapientSignerLeaf.cs | 4 +- .../Primitives/Config/SignerLeaf.cs | 8 +- .../Primitives/Config/SubdigestLeaf.cs | 3 +- .../Primitives/Config/Topology.cs | 129 ++++++++- .../Primitives/Config/WeightCalculator.cs | 2 +- .../Primitives/Config/Weigth.cs | 2 +- .../Primitives/Signature/RSY.cs | 37 ++- .../Primitives/Signature/RawNestedLeaf.cs | 27 -- .../Signature/RawNestedLeaf.cs.meta | 3 - .../Primitives/Signature/RawSignature.cs | 125 ++++++++- .../Primitives/Signature/RawSignerLeaf.cs | 4 +- .../Signature/SignatureOfSignerLeafEthSign.cs | 4 +- .../Signature/SignatureOfSignerLeafHash.cs | 4 +- .../EcosystemWallet/Utils/Erc6492Helper.cs | 37 ++- .../EcosystemWallet/Utils/SignatureUtils.cs | 260 ++++++++++++++++++ .../Utils/SignatureUtils.cs.meta | 3 + .../Sequence/SequenceSDK/Utils/ArrayUtils.cs | 11 + .../SequenceSDK/Utils/ByteArrayExtensions.cs | 25 +- ProjectSettings/ProjectSettings.asset | 2 +- 37 files changed, 967 insertions(+), 419 deletions(-) delete mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs delete mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs.meta delete mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs delete mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs.meta create mode 100644 Assets/StreamingAssets/UnityServicesProjectConfiguration.json rename Assets/{PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta => StreamingAssets/UnityServicesProjectConfiguration.json.meta} (74%) delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs index 60891e8a..e6f33aa8 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Numerics; using System.Threading.Tasks; @@ -21,8 +20,8 @@ public Task ConfigNew(Dictionary parameters) var config = new Primitives.Config { threshold = BigInteger.Parse(threshold), - checkpoint = checkpoint.HexStringToBigInteger(), - topology = Topology.FromLeaves(ParseContentToLeafs(content)), + checkpoint = BigInteger.Parse(checkpoint), + topology = Topology.FromLeaves(Topology.ParseContentToLeafs(content)), checkpointer = checkpointer }; @@ -31,124 +30,24 @@ public Task ConfigNew(Dictionary parameters) public Task ConfigEncode(Dictionary parameters) { - throw new System.NotImplementedException(); + var input = parameters["input"].ToString(); + var config = Primitives.Config.FromJson(input); + var signature = new RawSignature + { + checkpointerData = null, + configuration = config, + }; + + var encoded = signature.Encode().ByteArrayToHexStringWithPrefix(); + return Task.FromResult(encoded); } public Task ConfigImageHash(Dictionary parameters) { var input = parameters["input"].ToString(); - var config = ConfigUtils.FromJson(input); + var config = Primitives.Config.FromJson(input); var imageHash = config.HashConfiguration().ByteArrayToHexStringWithPrefix(); return Task.FromResult(imageHash); } - - private List ParseContentToLeafs(string elements) - { - var leaves = new List(); - - while (!string.IsNullOrWhiteSpace(elements)) - { - string firstElement = elements.Split(' ')[0]; - string firstElementType = firstElement.Split(':')[0]; - - if (firstElementType == "signer") - { - var parts = firstElement.Split(':'); - string address = parts[1]; - BigInteger weight = BigInteger.Parse(parts[2]); - - leaves.Add(new SignerLeaf - { - address = new Address(address), - weight = weight - }); - - elements = elements.Substring(firstElement.Length).TrimStart(); - } - else if (firstElementType == "subdigest") - { - var parts = firstElement.Split(':'); - string digest = parts[1]; - - leaves.Add(new SubdigestLeaf - { - digest = digest.HexStringToByteArray() - }); - - elements = elements.Substring(firstElement.Length).TrimStart(); - } - else if (firstElementType == "any-address-subdigest") - { - var parts = firstElement.Split(':'); - string digest = parts[1]; - - leaves.Add(new AnyAddressSubdigestLeaf - { - digest = digest.HexStringToByteArray() - }); - - elements = elements.Substring(firstElement.Length).TrimStart(); - } - else if (firstElementType == "sapient") - { - var parts = firstElement.Split(':'); - string imageHash = parts[1]; - string address = parts[2]; - BigInteger weight = BigInteger.Parse(parts[3]); - - if (!imageHash.StartsWith("0x") || imageHash.Length != 66) - throw new Exception($"Invalid image hash: {imageHash}"); - - leaves.Add(new SapientSignerLeaf - { - imageHash = imageHash, - address = new Address(address), - weight = weight - }); - - elements = elements.Substring(firstElement.Length).TrimStart(); - } - else if (firstElementType == "nested") - { - var parts = firstElement.Split(':'); - BigInteger threshold = BigInteger.Parse(parts[1]); - BigInteger weight = BigInteger.Parse(parts[2]); - - int start = elements.IndexOf('('); - int end = elements.IndexOf(')'); - if (start == -1 || end == -1) - throw new Exception($"Missing ( ) for nested element: {elements}"); - - string inner = elements.Substring(start + 1, end - start - 1); - - leaves.Add(new NestedLeaf - { - threshold = threshold, - weight = weight, - tree = Topology.FromLeaves(ParseContentToLeafs(inner)) - }); - - elements = elements.Substring(end + 1).TrimStart(); - } - else if (firstElementType == "node") - { - var parts = firstElement.Split(':'); - string hash = parts[1]; - - leaves.Add(new NodeLeaf - { - Value = hash.HexStringToByteArray() - }); - - elements = elements.Substring(firstElement.Length).TrimStart(); - } - else - { - throw new Exception($"Invalid element: {firstElement}"); - } - } - - return leaves; - } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs index 49f2c1d7..5bb793dd 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs @@ -1,24 +1,177 @@ using System; using System.Collections.Generic; +using System.Numerics; +using System.Security.Cryptography; +using System.Text; using System.Threading.Tasks; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; namespace Sequence.EcosystemWallet.IntegrationTests { public class DevToolsTest { + private class RandomOptions + { + public Random random = new (); + public Func seededRandom; + public string checkpointer; + public BigInteger minThresholdOnNested; + public BigInteger maxPermissions; + public string skewed; + } + public Task DevToolsRandomConfig(Dictionary parameters) { - var maxDepth = parameters["maxDepth"].ToString(); + var maxDepth = int.Parse(parameters["maxDepth"].ToString()); var seed = (string)parameters["seed"]; - var minThresholdOnNested = parameters["minThresholdOnNested"].ToString(); - var checkpointer = parameters.TryGetValue("checkpointer", out var checkpointerObj) ? checkpointerObj.ToString() : null; + var minThresholdOnNested = int.Parse(parameters["minThresholdOnNested"].ToString()); + var checkpointer = parameters.TryGetValue("checkpointer", out var checkpointerObj) ? checkpointerObj.ToString() : "no"; + var skewed = parameters.TryGetValue("skewed", out var skewedObj) ? skewedObj.ToString() : "none"; + + var options = new RandomOptions + { + seededRandom = string.IsNullOrEmpty(seed) ? null : CreateSeededRandom(seed), + checkpointer = checkpointer, + minThresholdOnNested = minThresholdOnNested, + skewed = skewed + }; - return Task.FromResult(""); + return Task.FromResult(CreateRandomConfig(maxDepth, options)); } public Task DevToolsRandomSessionTopology(Dictionary parameters) { - return Task.FromResult(""); + throw new System.NotImplementedException("DevToolsTest.DevToolsRandomSessionTopology"); + } + + private string CreateRandomConfig(int maxDepth, RandomOptions options) + { + return new Primitives.Config + { + threshold = RandomBigInt(100, options), + checkpoint = RandomBigInt(1000, options), + topology = GenerateRandomTopology(maxDepth, options), + checkpointer = options?.checkpointer switch + { + "yes" => RandomAddress(options), + "random" => (options?.seededRandom?.Invoke() ?? options.random.NextDouble()) > 0.5 + ? RandomAddress(options) + : null, + "no" or null => null, + _ => null + } + }.ToJson(); + } + + private static BigInteger RandomBigInt(int max, RandomOptions options) + { + var rnd = options.seededRandom?.Invoke() ?? options.random.NextDouble(); + return new BigInteger((long)(rnd * max)); + } + + private static Address RandomAddress(RandomOptions options) + { + return new Address(RandomHex(20, options)); + } + + private static string RandomHex(int byteLength, RandomOptions options) + { + var bytes = new byte[byteLength]; + options.random.NextBytes(bytes); + return "0x" + BitConverter.ToString(bytes).Replace("-", "").ToLower(); + } + + public static Func CreateSeededRandom(string seed) + { + string currentSeed = seed; + byte[] hash = ComputeSha256(currentSeed); + int index = 0; + + return () => + { + if (index >= hash.Length - 4) + { + currentSeed += "1"; + hash = ComputeSha256(currentSeed); + index = 0; + } + + uint value = BitConverter.ToUInt32(hash, index); + index += 4; + + return value / (double)uint.MaxValue; + }; + } + + private static byte[] ComputeSha256(string input) + { + using var sha = SHA256.Create(); + return sha.ComputeHash(Encoding.UTF8.GetBytes(input)); + } + + private static Topology GenerateRandomTopology(int depth, RandomOptions options) + { + if (depth <= 0) + { + var leafType = (int)Math.Floor((options.seededRandom?.Invoke() ?? options.random.NextDouble()) * 5); + switch (leafType) + { + case 0: + return new Topology(new SignerLeaf + { + address = RandomAddress(options), + weight = RandomBigInt(256, options) + }); + + case 1: + return new Topology(new SapientSignerLeaf + { + address = RandomAddress(options), + weight = RandomBigInt(256, options), + imageHash = RandomHex(32, options) + }); + + case 2: + return new Topology(new SubdigestLeaf + { + digest = RandomHex(32, options).HexStringToByteArray() + }); + + case 3: + return new Topology(new NodeLeaf + { + Value = RandomHex(32, options).HexStringToByteArray() + }); + + case 4: + BigInteger minThreshold = (BigInteger)options?.minThresholdOnNested; + return new Topology(new NestedLeaf + { + tree = GenerateRandomTopology(0, options), + weight = RandomBigInt(256, options), + threshold = minThreshold + RandomBigInt(65535 - (int)minThreshold, options) + }); + } + } + + if (options?.skewed == "left") + { + return new Topology(new Node( + GenerateRandomTopology(0, options), + GenerateRandomTopology(depth - 1, options))); + } + + if (options?.skewed == "right") + { + return new Topology(new Node( + GenerateRandomTopology(depth - 1, options), + GenerateRandomTopology(0, options))); + } + + return new Topology(new Node( + GenerateRandomTopology(depth - 1, options), + GenerateRandomTopology(depth - 1, options))); } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs index c0554282..a8a7107c 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs @@ -26,6 +26,7 @@ internal class Server ["devTools_randomSessionTopology"] = async (parameters) => await new DevToolsTest().DevToolsRandomSessionTopology(parameters), ["signature_encode"] = async (parameters) => await new SignatureTests().SignatureEncode(parameters), ["signature_concat"] = async (parameters) => await new SignatureTests().SignatureConcat(parameters), + ["signature_decode"] = async (parameters) => await new SignatureTests().SignatureDecode(parameters), }; public async Task HandleSingleRequest( diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs index 3106f5b2..c1d92c9c 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs @@ -1,27 +1,155 @@ +using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; +using Newtonsoft.Json; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; namespace Sequence.EcosystemWallet.IntegrationTests { public class SignatureTests { - public async Task SignatureEncode(Dictionary parameters) + public Task SignatureEncode(Dictionary parameters) { var input = parameters["input"].ToString(); - var signatures = parameters["signatures"].ToString().Split(' '); + var signatures = parameters["signatures"].ToString(); var chainId = !parameters.TryGetValue("chainId", out var chainIdValue) || (bool)chainIdValue; - - return await SignatureUtils.DoEncode(input, signatures, !chainId); + + return Task.FromResult(EncodeSignatureFromInput(input, signatures, !chainId)); } public Task SignatureDecode(Dictionary parameters) { - throw new System.NotImplementedException(); + var encodedSignature = parameters["signature"].ToString().HexStringToByteArray(); + var signature = RawSignature.Decode(encodedSignature); + + return Task.FromResult(JsonConvert.SerializeObject(signature)); } public Task SignatureConcat(Dictionary parameters) { - return Task.FromResult(""); + var signatures = parameters.GetArray("signatures"); + var decoded = signatures.Select(signature => + RawSignature.Decode(signature.HexStringToByteArray())).ToArray(); + + var parentSignature = decoded[0]; + parentSignature.suffix = decoded.Slice(1); + var encoded = parentSignature.Encode(); + + return Task.FromResult(encoded.ByteArrayToHexStringWithPrefix()); + } + + private static string EncodeSignatureFromInput(string input, string signatures, bool noChainId, byte[] checkpointerData = null) + { + var parts = string.IsNullOrEmpty(signatures) ? + Array.Empty() : + signatures.Split(' '); + + var config = Primitives.Config.FromJson(input); + + var allSignatures = parts.Select(s => + { + var values = s.Split(':'); + + return new + { + Address = new Address(values[0]), + Type = values[1], + Values = values.Skip(2).ToArray() + }; + }).ToList(); + + var fullTopology = SignatureHandler.FillLeaves(config.topology, leaf => + { + if (leaf is SignerLeaf signerLeaf) + { + var candidate = allSignatures.FirstOrDefault(s => s.Address.Equals(signerLeaf.address)); + if (candidate == null) + return null; + + switch (candidate.Type) + { + case "erc1271": + return new SignatureOfSignerLeafErc1271 + { + address = candidate.Address, + data = candidate.Values[0].HexStringToByteArray() + }; + case "eth_sign": + return new SignatureOfSignerLeafEthSign + { + r = candidate.Values[0].HexStringToBigInteger(), + s = candidate.Values[1].HexStringToBigInteger(), + yParity = RSY.VToYParity(int.Parse(candidate.Values[2])) + }; + case "hash": + return new SignatureOfSignerLeafHash + { + r = candidate.Values[0].HexStringToBigInteger(), + s = candidate.Values[1].HexStringToBigInteger(), + yParity = RSY.VToYParity(int.Parse(candidate.Values[2])) + }; + case "sapient": + return new SignatureOfSapientSignerLeaf + { + curType = SignatureOfSapientSignerLeaf.Type.sapient, + address = candidate.Address, + data = candidate.Values[0].HexStringToByteArray() + }; + case "sapient_compact": + return new SignatureOfSapientSignerLeaf + { + curType = SignatureOfSapientSignerLeaf.Type.sapient_compact, + address = candidate.Address, + data = candidate.Values[0].HexStringToByteArray() + }; + default: + throw new Exception($"Unsupported signature type: {candidate.Type}"); + } + } + + if (leaf is SapientSignerLeaf sapientSignerLeaf) + { + var candidate = allSignatures.FirstOrDefault(s => s.Address.Equals(sapientSignerLeaf.address)); + if (candidate == null) + return null; + + switch (candidate.Type) + { + case "sapient": + case "sapient_compact": + return new SignatureOfSapientSignerLeaf + { + address = candidate.Address, + data = candidate.Values[0].HexStringToByteArray(), + }; + case "eth_sign": + case "hash": + case "erc1271": + throw new Exception($"Incorrect type for leaf"); + default: + throw new Exception($"Unsupported signature type: {candidate.Type}"); + } + } + + return null; + }); + + var rawSignature = new RawSignature + { + noChainId = noChainId, + configuration = new Primitives.Config + { + threshold = config.threshold, + checkpoint = config.checkpoint, + checkpointer = config.checkpointer, + topology = fullTopology + }, + checkpointerData = checkpointerData + }; + + return rawSignature.Encode().ByteArrayToHexStringWithPrefix(); } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs deleted file mode 100644 index 7662efa4..00000000 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Collections.Generic; -using System.Numerics; -using Newtonsoft.Json; -using Sequence.EcosystemWallet.Primitives; - -namespace Sequence.EcosystemWallet.IntegrationTests -{ - public static class ConfigUtils - { - public static Primitives.Config FromJson(string json) - { - var input = JsonConvert.DeserializeObject>(json); - - var threshold = input["threshold"].ToString(); - var checkpoint = input["checkpoint"].ToString(); - var checkpointer = input.GetAddress("checkpointer"); - var topology = input["topology"].ToString(); - - return new Primitives.Config - { - threshold = BigInteger.Parse(threshold), - checkpoint = BigInteger.Parse(checkpoint), - checkpointer = checkpointer, - topology = Topology.Decode(topology) - }; - } - } -} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs.meta deleted file mode 100644 index cf60d559..00000000 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/ConfigUtils.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: aacb7d23ba7c4954b30a4ee98a7dbd31 -timeCreated: 1750156470 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs index 1373421f..54aff99e 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs @@ -5,6 +5,15 @@ namespace Sequence.EcosystemWallet.IntegrationTests { public static class IntegrationTestParamsUtils { + public static T[] GetArray(this Dictionary @params, string key) + { + if (!@params.TryGetValue(key, out var inputObj)) + return null; + + var inputJson = inputObj.ToString(); + return JsonConvert.DeserializeObject(inputJson); + } + public static Address GetAddress(this Dictionary @params, string key) { return @params.TryGetValue(key, out var value) && diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs deleted file mode 100644 index dcad16f8..00000000 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs +++ /dev/null @@ -1,162 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Numerics; -using System.Threading.Tasks; -using Newtonsoft.Json; -using Sequence.EcosystemWallet.Envelope; -using Sequence.EcosystemWallet.Primitives; -using Sequence.Utils; -using UnityEngine; - -namespace Sequence.EcosystemWallet.IntegrationTests -{ - public static class SignatureUtils - { - public static async Task DoEncode(string input, string[] signatures, bool noChainId, - byte[] checkpointerData = null) - { - var config = ConfigUtils.FromJson(input); - var allSignatures = signatures.Select(s => - { - var values = s.Split(':'); - return new - { - Address = new Address(values[0]), - Type = values[1], - Values = values.Skip(2).ToArray() - }; - }).ToList(); - - Debug.Log($"All Signatures: {JsonConvert.SerializeObject(allSignatures)}"); - - var fullTopology = SignatureHandler.FillLeaves(config.topology, leaf => - { - if (leaf is SignerLeaf signerLeaf) - { - var candidate = allSignatures.FirstOrDefault(s => s.Address.Equals(signerLeaf.address)); - if (candidate == null) - return null; - - Debug.Log($"Candidate = {candidate.Address}:{candidate.Type}:{candidate.Values}"); - - switch (candidate.Type) - { - case "erc1271": - return new SignatureOfSignerLeafErc1271 - { - address = candidate.Address, - data = candidate.Values[0].HexStringToByteArray() - }; - case "eth_sign": - return new SignatureOfSignerLeafEthSign - { - r = candidate.Values[0].HexStringToBigInteger(), - s = candidate.Values[1].HexStringToBigInteger(), - yParity = int.Parse(candidate.Values[2]) % 2 - }; - case "hash": - return new SignatureOfSignerLeafHash - { - r = candidate.Values[0].HexStringToBigInteger(), - s = candidate.Values[1].HexStringToBigInteger(), - yParity = int.Parse(candidate.Values[2]) % 2 - }; - case "sapient": - return new SignatureOfSapientSignerLeaf - { - curType = SignatureOfSapientSignerLeaf.Type.sapient, - address = candidate.Address, - data = candidate.Values[0].HexStringToByteArray() - }; - case "sapient_compact": - return new SignatureOfSapientSignerLeaf - { - curType = SignatureOfSapientSignerLeaf.Type.sapient_compact, - address = candidate.Address, - data = candidate.Values[0].HexStringToByteArray() - }; - default: - throw new Exception($"Unsupported signature type: {candidate.Type}"); - } - } - - if (leaf is SapientSignerLeaf sapientSignerLeaf) - { - var candidate = allSignatures.FirstOrDefault(s => s.Address.Equals(sapientSignerLeaf.address)); - if (candidate == null) - return null; - - switch (candidate.Type) - { - case "sapient": - case "sapient_compact": - return new SignatureOfSapientSignerLeaf - { - address = candidate.Address, - data = candidate.Values[0].HexStringToByteArray(), - }; - case "eth_sign": - case "hash": - case "erc1271": - throw new Exception($"Incorrect type for leaf"); - default: - throw new Exception($"Unsupported signature type: {candidate.Type}"); - } - } - - return null; - }); - - Debug.Log(JsonConvert.SerializeObject(fullTopology)); - - var rawSignature = new RawSignature - { - noChainId = noChainId, - configuration = new Primitives.Config - { - threshold = config.threshold, - checkpoint = config.checkpoint, - checkpointer = config.checkpointer, - topology = fullTopology - }, - checkpointerData = checkpointerData - }; - - return rawSignature.Encode().ByteArrayToHexStringWithPrefix(); - } - - public static async Task DoConcat(List signatures) - { - if (signatures.Count == 0) - throw new Exception("No signatures provided"); - - var decoded = signatures - // TODO: .Select(s => Signature.DecodeSignature(Bytes.FromHex(s))) - .ToList(); - - var encoded = new byte[] {}; - - // TODO: - /*encoded = Signature.EncodeSignature(new SignatureEncodingInput - { - // Copy the base structure - NoChainId = decoded[0].NoChainId, - Configuration = decoded[0].Configuration, - CheckpointerData = decoded[0].CheckpointerData, - Suffix = decoded.Skip(1).ToList() - });*/ - - return encoded.ByteArrayToHexStringWithPrefix(); - } - - public static async Task DoDecode(string signature) - { - // TODO: - /*var bytes = Bytes.FromHex(signature); - var decoded = Signature.DecodeSignature(bytes); - return Signature.RawSignatureToJson(decoded);*/ - return string.Empty; - } - } -} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs.meta deleted file mode 100644 index 4e11d2b6..00000000 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/SignatureUtils.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 1af89f654c804ffcbe9f059a8b9a3fbc -timeCreated: 1750156421 \ No newline at end of file diff --git a/Assets/StreamingAssets/UnityServicesProjectConfiguration.json b/Assets/StreamingAssets/UnityServicesProjectConfiguration.json new file mode 100644 index 00000000..34b3a441 --- /dev/null +++ b/Assets/StreamingAssets/UnityServicesProjectConfiguration.json @@ -0,0 +1 @@ +{"Keys":["com.unity.services.core.version"],"Values":[{"m_Value":"1.4.0","m_IsReadOnly":true}]} \ No newline at end of file diff --git a/Assets/PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta b/Assets/StreamingAssets/UnityServicesProjectConfiguration.json.meta similarity index 74% rename from Assets/PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta rename to Assets/StreamingAssets/UnityServicesProjectConfiguration.json.meta index c0cdc525..0a939a75 100644 --- a/Assets/PlayFab/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta +++ b/Assets/StreamingAssets/UnityServicesProjectConfiguration.json.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: aa66cce13570c4036afe2e85742962d9 +guid: 0c03aa341727243a1b8ec5e362407c52 DefaultImporter: externalObjects: {} userData: diff --git a/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta b/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta index 2b981aa8..fc8abc26 100644 --- a/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta +++ b/Packages/Sequence-Unity/Plugins/Android/AndroidKeyBridge.java.meta @@ -28,7 +28,7 @@ PluginImporter: - first: Android: Android second: - enabled: 0 + enabled: 1 settings: CPU: ARMv7 - first: diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs index 492ccb40..f8b7aa96 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs @@ -7,9 +7,10 @@ public class SapientSignature : EnvelopeSignature public string imageHash; public SignatureOfSapientSignerLeaf signature; public override string type { get; } + public override byte[] Encode(Leaf leaf) { - throw new System.NotImplementedException(); + throw new System.NotImplementedException("SapientSignature.Encode"); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs index e78a84fc..bd262a0e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs @@ -7,9 +7,10 @@ public class Signature : EnvelopeSignature public Address address; public SignatureOfSignerLeaf signature; public override string type { get; } + public override byte[] Encode(Leaf leaf) { - throw new System.NotImplementedException(); + throw new System.NotImplementedException("Signature.Encode"); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs index 69a62f87..6b3a02f6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs @@ -20,7 +20,8 @@ public override object Parse() public override byte[] Encode(bool noChainId, byte[] checkpointerData) { - return digest; + var flag = Topology.FlagSignatureAnyAddressSubdigest << 4; + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), digest); } public override byte[] HashConfiguration() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs index 2c6b6642..006b0c8d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs @@ -1,7 +1,9 @@ +using System.Collections.Generic; using System.Numerics; using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -20,22 +22,26 @@ public Leaf FindSignerLeaf(Address address) public byte[] HashConfiguration() { if (topology == null) - { return null; - } byte[] root = topology.HashConfiguration(); - byte[] thresholdBytes = threshold.ByteArrayFromNumber().PadLeft(32); + byte[] thresholdBytes = threshold.ByteArrayFromNumber(threshold.MinBytesFor()).PadLeft(32); root = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(root, thresholdBytes)); - byte[] checkpointBytes = checkpoint.ByteArrayFromNumber().PadLeft(32); + Debug.Log($"1 SequenceCoder.KeccakHash: {root.ByteArrayToHexStringWithPrefix()}"); + + byte[] checkpointBytes = checkpoint.ByteArrayFromNumber(checkpoint.MinBytesFor()).PadLeft(32); root = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(root, checkpointBytes)); string checkpointerAddress = checkpointer?.Value ?? "0x0000000000000000000000000000000000000000"; byte[] checkpointerBytes = checkpointerAddress.HexStringToByteArray().PadLeft(32); root = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(root, checkpointerBytes)); + Debug.Log($"thresholdBytes: {thresholdBytes.ByteArrayToHexStringWithPrefix()}"); + Debug.Log($"checkpointBytes: {checkpointBytes.ByteArrayToHexStringWithPrefix()}"); + Debug.Log($"checkpointerBytes: {checkpointerBytes.ByteArrayToHexStringWithPrefix()}"); + return root; } @@ -51,5 +57,23 @@ public string ToJson() return JsonConvert.SerializeObject(jsonObject); } + + public static Config FromJson(string json) + { + var input = JsonConvert.DeserializeObject>(json); + + var threshold = input["threshold"].ToString(); + var checkpoint = input["checkpoint"].ToString(); + var checkpointer = new Address(input["checkpointer"].ToString()); + var topology = input["topology"].ToString(); + + return new Config + { + threshold = BigInteger.Parse(threshold), + checkpoint = BigInteger.Parse(checkpoint), + checkpointer = checkpointer, + topology = Topology.Decode(topology) + }; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs index 6dae4a77..8e54a951 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs @@ -35,7 +35,7 @@ public override byte[] Encode(bool noChainId, byte[] checkpointerData) if (weight <= 3 && weight > 0) flag |= (int)weight << 2; else if (weight <= 255) - weightBytes = weight.ByteArrayFromNumber(); + weightBytes = weight.ByteArrayFromNumber(weight.MinBytesFor()); else throw new Exception("Weight too large"); @@ -43,7 +43,7 @@ public override byte[] Encode(bool noChainId, byte[] checkpointerData) if (threshold <= 3 && threshold > 0) flag |= (int)threshold; else if (threshold <= 65535) - thresholdBytes = threshold.ByteArrayFromNumber().PadLeft(2); + thresholdBytes = threshold.ByteArrayFromNumber(threshold.MinBytesFor()).PadLeft(2); else throw new Exception("Threshold too large"); @@ -51,10 +51,10 @@ public override byte[] Encode(bool noChainId, byte[] checkpointerData) throw new Exception("Nested tree too large"); return ByteArrayExtensions.ConcatenateByteArrays( - flag.ByteArrayFromNumber(), + flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, thresholdBytes, - nested.Length.ByteArrayFromNumber().PadLeft(3), + nested.Length.ByteArrayFromNumber(nested.Length.MinBytesFor()).PadLeft(3), nested); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs index 1cee04a6..c4b9f1a0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs @@ -1,4 +1,3 @@ -using System.Linq; using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives @@ -19,14 +18,15 @@ public override object Parse() public override byte[] Encode(bool noChainId, byte[] checkpointerData) { - return ByteArrayExtensions.ConcatenateByteArrays((Topology.FlagNode << 4).ByteArrayFromNumber(), Value); + var flag = Topology.FlagNode << 4; + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), Value); } // In the JS code, this just returns the topology itself, but in C# we need to return bytes // Since NodeLeaf doesn't have any properties to hash, we'll return a byte array public override byte[] HashConfiguration() { - return new byte[]{}; + return new byte[] { }; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs index 50b7604f..9a3baea5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs @@ -27,14 +27,14 @@ public override object Parse() public override byte[] Encode(bool noChainId, byte[] checkpointerData) { var flag = Topology.FlagNode << 4; - return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(), HashConfiguration()); + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), HashConfiguration()); } public override byte[] HashConfiguration() { byte[] prefix = Encoding.UTF8.GetBytes("Sequence sapient config:\n"); byte[] address = this.address.Value.HexStringToByteArray(); - byte[] weight = this.weight.ByteArrayFromNumber().PadLeft(32); + byte[] weight = this.weight.ByteArrayFromNumber(this.weight.MinBytesFor()).PadLeft(32); byte[] imageHash = this.imageHash.HexStringToByteArray().PadLeft(32); return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, address, weight, imageHash)); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs index 97e74e42..bb9c8bea 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs @@ -31,11 +31,11 @@ public override byte[] Encode(bool noChainId, byte[] checkpointerData) if (weight > 0 && weight <= 15) flag |= (int)weight; else if (weight <= 255) - weightBytes = weight.ByteArrayFromNumber(); + weightBytes = weight.ByteArrayFromNumber(flag.MinBytesFor()); else throw new ArgumentException("Weight too large"); - - return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(), weightBytes, + + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, address.Value.HexStringToByteArray().PadLeft(20)); } @@ -43,7 +43,7 @@ public override byte[] HashConfiguration() { byte[] prefix = Encoding.UTF8.GetBytes("Sequence signer:\n"); byte[] address = this.address.Value.HexStringToByteArray(); - byte[] weight = this.weight.ByteArrayFromNumber().PadLeft(32); + byte[] weight = this.weight.ByteArrayFromNumber(this.weight.MinBytesFor()).PadLeft(32); return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, address, weight)); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs index 4ce9ab38..4ad6a5fa 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs @@ -20,7 +20,8 @@ public override object Parse() public override byte[] Encode(bool noChainId, byte[] checkpointerData) { - throw new System.NotImplementedException(); + var flag = Topology.FlagSubdigest << 4; + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), digest); } public override byte[] HashConfiguration() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index 146750d0..8e1975f9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -132,12 +132,13 @@ public static Topology Decode(string input) return new Topology(new Node(Decode(list[0].ToString()), Decode(list[1].ToString()))); } - // Case: string → leaf node (digest hash or node ID) - /*if (input.IsHexFormat()) + if (!input.StartsWith("{")) { - Leaf - return hex; - }*/ + return new Topology(new NodeLeaf + { + Value = (input).HexStringToByteArray() + }); + } var data = JsonConvert.DeserializeObject>(input); string type = (string)data["type"]; @@ -179,7 +180,7 @@ public static Topology Decode(string input) case "nested": leaf = new NestedLeaf { - tree = FromLeaves(null), + tree = Decode(data["tree"].ToString()), weight = BigInteger.Parse((string)data["weight"]), threshold = BigInteger.Parse((string)data["threshold"]) }; @@ -222,13 +223,125 @@ public byte[] Encode(bool noChainId, byte[] checkpointerData) var flag = (FlagBranch << 4) | encoded1Size; return ByteArrayExtensions.ConcatenateByteArrays(encoded0, - flag.ByteArrayFromNumber(), - encoded1.Length.ByteArrayFromNumber() + flag.ByteArrayFromNumber(flag.MinBytesFor()), + encoded1.Length.ByteArrayFromNumber(encoded1Size) .PadLeft(encoded1Size), encoded1); } return Leaf.Encode(noChainId, checkpointerData); } + + public static List ParseContentToLeafs(string elements) + { + var leaves = new List(); + + while (!string.IsNullOrWhiteSpace(elements)) + { + string firstElement = elements.Split(' ')[0]; + string firstElementType = firstElement.Split(':')[0]; + + if (firstElementType == "signer") + { + var parts = firstElement.Split(':'); + string address = parts[1]; + BigInteger weight = BigInteger.Parse(parts[2]); + + leaves.Add(new SignerLeaf + { + address = new Address(address), + weight = weight + }); + + elements = elements.Substring(firstElement.Length).TrimStart(); + } + else if (firstElementType == "subdigest") + { + var parts = firstElement.Split(':'); + string digest = parts[1]; + + leaves.Add(new SubdigestLeaf + { + digest = digest.HexStringToByteArray() + }); + + elements = elements.Substring(firstElement.Length).TrimStart(); + } + else if (firstElementType == "any-address-subdigest") + { + var parts = firstElement.Split(':'); + string digest = parts[1]; + + leaves.Add(new AnyAddressSubdigestLeaf + { + digest = digest.HexStringToByteArray() + }); + + elements = elements.Substring(firstElement.Length).TrimStart(); + } + else if (firstElementType == "sapient") + { + var parts = firstElement.Split(':'); + string imageHash = parts[1]; + string address = parts[2]; + BigInteger weight = BigInteger.Parse(parts[3]); + + if (!imageHash.StartsWith("0x") || imageHash.Length != 66) + throw new Exception($"Invalid image hash: {imageHash}"); + + leaves.Add(new SapientSignerLeaf + { + imageHash = imageHash, + address = new Address(address), + weight = weight + }); + + elements = elements.Substring(firstElement.Length).TrimStart(); + } + else if (firstElementType == "nested") + { + var parts = firstElement.Split(':'); + BigInteger threshold = BigInteger.Parse(parts[1]); + BigInteger weight = BigInteger.Parse(parts[2]); + + int start = elements.IndexOf('('); + int end = elements.IndexOf(')'); + if (start == -1 || end == -1) + throw new Exception($"Missing ( ) for nested element: {elements}"); + + string inner = elements.Substring(start + 1, end - start - 1); + + leaves.Add(new NestedLeaf + { + threshold = threshold, + weight = weight, + tree = Topology.FromLeaves(ParseContentToLeafs(inner)) + }); + + elements = elements.Substring(end + 1).TrimStart(); + } + else if (firstElementType == "node") + { + var parts = firstElement.Split(':'); + string hash = parts[1]; + + leaves.Add(new NodeLeaf + { + Value = hash.HexStringToByteArray() + }); + + elements = elements.Substring(firstElement.Length).TrimStart(); + } + else + { + throw new Exception($"Invalid element: {firstElement}"); + } + } + + if (leaves.Count == 0) + Debug.LogError($"Topology.FromLeaves resulted in an empty list of leafs: {elements}"); + + return leaves; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs index a65324de..1cc6b484 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs @@ -77,7 +77,7 @@ private static WeightResult GetWeightForLeaf(Leaf leaf, Func canSign { return new WeightResult { weight = 0, maxWeight = 0 }; } - else if (leaf is RawNestedLeaf rawNested) + else if (leaf is NestedLeaf rawNested) { var result = GetWeight(rawNested.tree, canSign); BigInteger weight = result.weight >= rawNested.threshold ? rawNested.weight : 0; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs index 2dc19d47..2467dc32 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs @@ -72,7 +72,7 @@ private static Weigth GetWeightForLeaf(Leaf leaf, Func canSign) { return new Weigth { weight = 0, maxWeight = 0 }; } - if (leaf is RawNestedLeaf rawNested) + if (leaf is NestedLeaf rawNested) { var result = GetWeight(rawNested.tree, canSign); BigInteger weight = result.weight >= rawNested.threshold ? rawNested.weight : 0; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs index 1c2f1af0..d84600c0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs @@ -14,19 +14,44 @@ public abstract class RSY : SignatureOfSignerLeaf public byte[] Pack() { if (yParity != 0 && yParity != 1 && yParity != 27 && yParity != 28) - { throw new ArgumentException("yParity must be 0, 1, 27, or 28."); - } - byte[] rBytes = r.ByteArrayFromNumber().PadLeft(32); - byte[] sBytes = s.ByteArrayFromNumber().PadLeft(32); + var rBytes = r.ByteArrayFromNumber(r.MinBytesFor()).PadLeft(32); + var sBytes = s.ByteArrayFromNumber(s.MinBytesFor()).PadLeft(32); if (yParity % 2 == 1) - { sBytes[0] |= 0x80; - } return ByteArrayExtensions.ConcatenateByteArrays(rBytes, sBytes); } + + public static (BigInteger R, BigInteger S, int YParity) Unpack(byte[] rsy) + { + if (rsy.Length != 64) + throw new ArgumentException("RSY must be exactly 64 bytes"); + + var r = rsy[..32].ToBigInteger(); + + var yParityAndS = rsy[32..64]; + int yParity = (yParityAndS[0] & 0x80) != 0 ? 1 : 0; + + var sBytes = (byte[])yParityAndS.Clone(); + sBytes[0] &= 0x7F; + + var s = sBytes.ToBigInteger(); + + return (r, s, yParity); + } + + public static int VToYParity(BigInteger v) + { + if (v == 27) + return 0; + + if (v == 28) + return 1; + + return (int)(v % 2); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs deleted file mode 100644 index 76ffa111..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Numerics; - -namespace Sequence.EcosystemWallet.Primitives -{ - internal class RawNestedLeaf : Leaf - { - public const string type = "nested"; - public Topology tree; - public BigInteger weight; - public BigInteger threshold; - - public override object Parse() - { - throw new System.NotImplementedException(); - } - - public override byte[] Encode(bool noChainId, byte[] checkpointerData) - { - throw new System.NotImplementedException(); - } - - public override byte[] HashConfiguration() - { - throw new System.NotImplementedException(); - } - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs.meta deleted file mode 100644 index cf61ff74..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawNestedLeaf.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 1cb8fd6f984741aeba6930072b2b1424 -timeCreated: 1747256077 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs index 18a60206..36ebaaf4 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -44,8 +44,6 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd flag |= 0x02; int bytesForCheckpoint = configuration.checkpoint.MinBytesFor(); - Debug.Log($"{configuration.checkpoint} - {bytesForCheckpoint}"); - if (bytesForCheckpoint > 7) throw new Exception("Checkpoint too large"); @@ -67,7 +65,9 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd if (configuration.checkpointer != null && !skipCheckpointerAddress) { - output = ByteArrayExtensions.ConcatenateByteArrays(output, configuration.checkpointer.Value.ToByteArray().PadLeft(20)); + var checkpointerBytes = configuration.checkpointer.Value.HexStringToByteArray(); + output = ByteArrayExtensions.ConcatenateByteArrays(output, checkpointerBytes.PadLeft(20)); + Debug.Log(checkpointerBytes.ByteArrayToHexStringWithPrefix()); if (!skipCheckpointerData) { @@ -79,10 +79,10 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd } } - var checkpointBytes = configuration.checkpoint.ToByteArray().PadLeft(bytesForCheckpoint); + var checkpointBytes = configuration.checkpoint.ByteArrayFromNumber(bytesForCheckpoint); output = ByteArrayExtensions.ConcatenateByteArrays(output, checkpointBytes); - var thresholdBytes = configuration.threshold.ToByteArray().PadLeft(bytesForThreshold); + var thresholdBytes = configuration.threshold.ByteArrayFromNumber(bytesForThreshold); output = ByteArrayExtensions.ConcatenateByteArrays(output, thresholdBytes); var topologyBytes = configuration.topology.Encode(noChainId, checkpointerData); @@ -93,8 +93,119 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd public static RawSignature Decode(byte[] erc6492Signature) { - // TODO: - return new RawSignature(); + var (signature, erc6492) = Erc6492Helper.Decode(erc6492Signature); + + if (signature.Length < 1) + throw new Exception("Signature is empty"); + + int index = 1; + byte flag = signature[0]; + bool noChainId = (flag & 0x02) == 0x02; + + Address checkpointerAddress = null; + byte[]? checkpointerData = null; + + if ((flag & 0x40) == 0x40) + { + if (index + 20 > signature.Length) + throw new Exception("Not enough bytes for checkpointer address"); + + var checkpointer = signature[index..(index + 20)].ByteArrayToHexStringWithPrefix(); + checkpointerAddress = new Address(checkpointer); + index += 20; + + if (index + 3 > signature.Length) + throw new Exception("Not enough bytes for checkpointer data size"); + + var dataSize = signature[index..(index + 3)].ToInteger(); + index += 3; + + if (index + dataSize > signature.Length) + throw new Exception("Not enough bytes for checkpointer data"); + + checkpointerData = signature[index..(index + dataSize)]; + index += dataSize; + } + + int checkpointSize = (flag & 0x1C) >> 2; + if (index + checkpointSize > signature.Length) + throw new Exception("Not enough bytes for checkpoint"); + + var checkpoint = signature[index..(index + checkpointSize)].ToBigInteger(); + index += checkpointSize; + + int thresholdSize = ((flag & 0x20) >> 5) + 1; + if (index + thresholdSize > signature.Length) + throw new Exception("Not enough bytes for threshold"); + + var threshold = signature[index..(index + thresholdSize)].ToBigInteger(); + index += thresholdSize; + + if ((flag & 0x01) == 0x01) + { + var subsignatures = new List(); + + while (index < signature.Length) + { + if (index + 3 > signature.Length) + throw new Exception("Not enough bytes for chained subsignature size"); + + int subSize = signature[index..(index + 3)].ToInteger(); + index += 3; + + if (index + subSize > signature.Length) + throw new Exception("Not enough bytes for chained subsignature"); + + var subSignature = Decode(signature[index..(index + subSize)]); + index += subSize; + + if (subSignature.checkpointerData != null) + throw new Exception("Chained subsignature has checkpointer data"); + + subSignature.checkpointerData = null; + subsignatures.Add(subSignature); + } + + if (subsignatures.Count == 0) + throw new Exception("Chained signature has no subsignatures"); + + return new RawSignature + { + noChainId = subsignatures[0].noChainId, + checkpointerData = null, + configuration = subsignatures[0].configuration, + suffix = subsignatures.GetRange(1, subsignatures.Count - 1).ToArray(), + erc6492 = erc6492.HasValue ? new Erc6492 + { + to = erc6492.Value.To, + data = erc6492.Value.Data + } : null + }; + } + + var (nodes, leftover) = SignatureUtils.ParseBranch(signature[index..]); + if (leftover.Length != 0) + throw new Exception("Leftover bytes in signature"); + + var topology = SignatureUtils.FoldNodes(nodes); + + return new RawSignature + { + noChainId = noChainId, + checkpointerData = checkpointerData, + configuration = new Config + { + threshold = threshold, + checkpoint = checkpoint, + topology = topology, + checkpointer = checkpointerAddress + }, + erc6492 = erc6492.HasValue ? new Erc6492 + { + to = erc6492.Value.To, + data = erc6492.Value.Data + } : null + }; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs index 806952eb..376635b5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs @@ -11,7 +11,7 @@ public class RawSignerLeaf : Leaf public override object Parse() { - throw new System.NotImplementedException(); + throw new System.NotImplementedException("RawSignerLeaf.Parse"); } public override byte[] Encode(bool noChainId, byte[] checkpointerData) @@ -21,7 +21,7 @@ public override byte[] Encode(bool noChainId, byte[] checkpointerData) public override byte[] HashConfiguration() { - throw new System.NotImplementedException(); + throw new System.NotImplementedException("RawSignerLeaf.HashConfiguration"); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs index 5a54eb41..88f66592 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs @@ -19,11 +19,11 @@ public override byte[] Encode(Leaf leaf) if (signerLeaf.weight <= 15 && signerLeaf.weight > 0) flag |= (int)signerLeaf.weight; else if (signerLeaf.weight <= 255) - weightBytes = signerLeaf.weight.ByteArrayFromNumber(); + weightBytes = signerLeaf.weight.ByteArrayFromNumber(flag.MinBytesFor()); else throw new Exception("Weight too large"); - return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(), weightBytes, Pack()); + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, Pack()); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs index d431a9cd..81136abd 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs @@ -19,11 +19,11 @@ public override byte[] Encode(Leaf leaf) if (signerLeaf.weight <= 15 && signerLeaf.weight > 0) flag |= (int)signerLeaf.weight; else if (signerLeaf.weight <= 255) - weightBytes = signerLeaf.weight.ByteArrayFromNumber(); + weightBytes = signerLeaf.weight.ByteArrayFromNumber(signerLeaf.weight.MinBytesFor()); else throw new Exception("Weight too large"); - return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(), weightBytes, Pack()); + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, Pack()); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs index 7fd12d28..0f36a6d3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs @@ -6,6 +6,7 @@ using Nethereum.ABI.Model; using Nethereum.Hex.HexConvertors.Extensions; using Nethereum.Web3; +using Sequence.Utils; namespace Sequence.EcosystemWallet.Utils { @@ -50,35 +51,43 @@ public static byte[] Wrap(byte[] signature, Address to, byte[] data) new ABIValue("bytes", signature) ); - return encoded.Concat(MagicBytes.HexToByteArray()).ToArray(); + return ByteArrayExtensions.ConcatenateByteArrays(encoded, MagicBytes.HexToByteArray()); } - public static (string Signature, (string To, string Data)? Erc6492) Decode(string signature) + public static (byte[] Signature, (Address To, byte[] Data)? Erc6492) Decode(byte[] signature) { - if (signature.EndsWith(MagicBytes[2..])) + var magicBytes = MagicBytes.HexStringToByteArray(); + int magicLength = magicBytes.Length; + + if (signature.Length >= magicLength && + signature[^magicLength..].ByteArrayToHexStringWithPrefix() == MagicBytes) { + var raw = signature[..^magicLength]; + try { - var trimmed = signature[..^MagicBytes[2..].Length]; var decoder = new ParameterDecoder(); - var parameters = new[] { - new Parameter("address", "to"), - new Parameter("bytes", "data"), - new Parameter("bytes", "signature") + var parameters = new Parameter[] + { + new ("address", 1), + new ("bytes", 2), + new ("bytes", 3), }; - var decoded = decoder.DecodeDefaultData(trimmed, parameters); - var to = (string)decoded[0].Result; - var data = ((byte[])decoded[1].Result).ToHex(); - var innerSig = ((byte[])decoded[2].Result).ToHex(); + var decoded = decoder.DecodeDefaultData(raw, parameters); - return (innerSig, (to, data)); + string to = decoded[0].Result?.ToString() ?? throw new Exception("Missing 'to' address"); + byte[] data = (byte[])(decoded[1].Result ?? throw new Exception("Missing 'data'")); + byte[] unwrappedSignature = (byte[])(decoded[2].Result ?? throw new Exception("Missing 'signature'")); + + return (unwrappedSignature, (new Address(to), data)); } catch { - // fallback to raw signature + return (signature, null); } } + return (signature, null); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs new file mode 100644 index 00000000..5f464494 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs @@ -0,0 +1,260 @@ +using System; +using System.Collections.Generic; +using System.Numerics; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Utils +{ + public static class SignatureUtils + { + public static (Topology[] nodes, byte[] Leftover) ParseBranch(byte[] signature) + { + var leafs = new List(); + int index = 0; + + while (index < signature.Length) + { + byte firstByte = signature[index++]; + int flag = (firstByte & 0xf0) >> 4; + + switch (flag) + { + case Topology.FlagSignatureHash: + { + int weight = firstByte & 0x0f; + if (weight == 0) + weight = signature[index++]; + + if (index + 64 > signature.Length) + throw new Exception("Not enough bytes for hash signature"); + + var unpacked = RSY.Unpack(signature[index..(index + 64)]); + index += 64; + + leafs.Add(new Topology(new RawSignerLeaf + { + weight = new BigInteger(weight), + signature = new SignatureOfSignerLeafHash + { + r = unpacked.R, + s = unpacked.S, + yParity = unpacked.YParity + } + })); + + break; + } + + case Topology.FlagAddress: + { + int weight = firstByte & 0x0f; + if (weight == 0) + weight = signature[index++]; + + string address = signature[index..(index + 20)].ByteArrayToHexStringWithPrefix(); + index += 20; + + leafs.Add(new Topology(new SignerLeaf + { + address = new Address(address), + weight = new BigInteger(weight) + })); + + break; + } + + case Topology.FlagSignatureErc1271: + { + int weight = firstByte & 0x03; + if (weight == 0) + weight = signature[index++]; + + string signer = signature[index..(index + 20)].ByteArrayToHexStringWithPrefix(); + index += 20; + + int sizeSize = (firstByte & 0x0c) >> 2; + int dataSize = signature[index..(index + sizeSize)].ToInteger(); + index += sizeSize; + + byte[] data = signature[index..(index + dataSize)]; + index += dataSize; + + leafs.Add(new Topology(new RawSignerLeaf + { + weight = new BigInteger(weight), + signature = new SignatureOfSignerLeafErc1271 + { + address = new Address(signer), + data = data + } + })); + + break; + } + + case Topology.FlagNode: + { + byte[] nodeHash = signature[index..(index + 32)]; + index += 32; + leafs.Add(new Topology(new NodeLeaf + { + Value = nodeHash + })); + break; + } + + case Topology.FlagBranch: + { + int sizeSize = firstByte & 0x0f; + int size = signature[index..(index + sizeSize)].ToInteger(); + index += sizeSize; + + var branchBytes = signature[index..(index + size)]; + index += size; + + var (subNodes, leftover) = ParseBranch(branchBytes); + if (leftover.Length > 0) + throw new Exception("Leftover bytes in sub-branch"); + + leafs.Add(FoldNodes(subNodes)); + break; + } + + case Topology.FlagSubdigest: + { + byte[] digest = signature[index..(index + 32)]; + index += 32; + leafs.Add(new Topology(new SubdigestLeaf + { + digest = digest + })); + break; + } + + case Topology.FlagNested: + { + int externalWeight = (firstByte & 0x0c) >> 2; + if (externalWeight == 0) + externalWeight = signature[index++]; + + int internalThreshold = firstByte & 0x03; + if (internalThreshold == 0) + { + internalThreshold = signature[index..(index + 2)].ToInteger(); + index += 2; + } + + int size = signature[index..(index + 3)].ToInteger(); + index += 3; + + var nestedBytes = signature[index..(index + size)]; + index += size; + + var (subNodes, leftover) = ParseBranch(nestedBytes); + if (leftover.Length > 0) + throw new Exception("Leftover bytes in nested tree"); + + leafs.Add(new Topology(new NestedLeaf + { + tree = FoldNodes(subNodes), + weight = new BigInteger(externalWeight), + threshold = new BigInteger(internalThreshold) + })); + + break; + } + + case Topology.FlagSignatureEthSign: + { + int weight = firstByte & 0x0f; + if (weight == 0) + weight = signature[index++]; + + var unpacked = RSY.Unpack(signature[index..(index + 64)]); + index += 64; + + leafs.Add(new Topology(new RawSignerLeaf + { + weight = new BigInteger(weight), + signature = new SignatureOfSignerLeafEthSign + { + r = unpacked.R, + s = unpacked.S, + yParity = unpacked.YParity + } + })); + + break; + } + + case Topology.FlagSignatureAnyAddressSubdigest: + { + byte[] digest = signature[index..(index + 32)]; + index += 32; + + leafs.Add(new Topology(new AnyAddressSubdigestLeaf + { + digest = digest, + })); + break; + } + + case Topology.FlagSignatureSapient: + case Topology.FlagSignatureSapientCompact: + { + int weight = firstByte & 0x03; + if (weight == 0) + weight = signature[index++]; + + string address = signature[index..(index + 20)].ByteArrayToHexStringWithPrefix(); + index += 20; + + int sizeSize = (firstByte & 0x0c) >> 2; + int dataSize = signature[index..(index + sizeSize)].ToInteger(); + index += sizeSize; + + byte[] data = signature[index..(index + dataSize)]; + index += dataSize; + + leafs.Add(new Topology(new RawSignerLeaf + { + weight = new BigInteger(weight), + signature = new SignatureOfSapientSignerLeaf + { + curType = flag == Topology.FlagSignatureSapient ? SignatureOfSapientSignerLeaf.Type.sapient : SignatureOfSapientSignerLeaf.Type.sapient_compact, + address = new Address(address), + data = data + } + })); + + break; + } + + default: + throw new Exception($"Invalid signature flag: 0x{flag:X}"); + } + } + + return (leafs.ToArray(), signature[index..]); + } + + public static Topology FoldNodes(Topology[] nodes) + { + if (nodes == null || nodes.Length == 0) + throw new Exception("Empty signature tree"); + + if (nodes.Length == 1) + return nodes[0]; + + var tree = nodes[0]; + for (var i = 1; i < nodes.Length; i++) + { + var node = new Node(tree, nodes[i]); + tree = new Topology(node); + } + + return tree; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs.meta new file mode 100644 index 00000000..2eac6657 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cb2ddb04028e4ed099e23518f606d037 +timeCreated: 1751190815 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs index 19f43068..27d2d3be 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs @@ -114,5 +114,16 @@ public static T[] AppendObject(this T[] arr, T obj) newArr[length] = obj; return newArr; } + + public static T[] Slice(this T[] input, int start) + { + if (input == null || start >= input.Length) + return Array.Empty(); + + int length = input.Length - start; + T[] result = new T[length]; + Array.Copy(input, start, result, 0, length); + return result; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs index 6be94538..e2fae620 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Numerics; using System.Text; using UnityEngine; @@ -32,6 +33,28 @@ public static string ByteArrayToHexString(this byte[] byteArray) return string.Empty; } } + + public static BigInteger ToBigInteger(this byte[] data) + { + if (data == null || data.Length == 0) + return BigInteger.Zero; + + var unsignedLittleEndian = ConcatenateByteArrays(data.Reverse().ToArray(), new byte[] { 0x00 }); + return new BigInteger(unsignedLittleEndian); + } + + public static int ToInteger(this byte[] data) + { + if (data == null || data.Length == 0) + return 0; + + if (data.Length > 4) + throw new ArgumentOutOfRangeException(nameof(data), "Too many bytes to fit into an int (max 4)."); + + byte[] padded = new byte[4]; + Array.Copy(data.Reverse().ToArray(), 0, padded, 0, data.Length); + return BitConverter.ToInt32(padded, 0); + } public static bool HasPrefix(this byte[] b, byte[] prefix) { return b.AsSpan().StartsWith(prefix); @@ -130,7 +153,7 @@ public static int MinBytesFor(this BigInteger value) if (value < 0) throw new ArgumentOutOfRangeException(nameof(value), "Value must be non-negative."); - var hex = value.ToString("X"); + var hex = value.BigIntegerToHexString().WithoutHexPrefix(); return (int)Math.Ceiling(hex.Length / 2.0); } diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 475561ff..94a3a262 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -813,7 +813,7 @@ PlayerSettings: webGLThreadsSupport: 0 webGLDecompressionFallback: 1 scriptingDefineSymbols: - Android: + Android: ENABLE_SEQUENCE_ANDROID_SECURE_STORAGE Server: Standalone: UNITY_ASTOOLS_EXPERIMENTAL WebGL: VUPLEX_CCU;VUPLEX_STANDALONE From ad52d2c4952cf36a5f74b86d8caf16f0315e41d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Sun, 29 Jun 2025 17:02:57 +0200 Subject: [PATCH 063/165] latest changes --- .../IntegrationTests/Server/Server.cs | 2 +- .../IntegrationTests/SignatureTests.cs | 18 +++-- .../Utils/IntegrationTestParamsUtils.cs | 6 -- .../Envelope/EnvelopeSignature.cs | 2 +- .../Primitives/Config/Config.cs | 8 +-- .../EcosystemWallet/Primitives/Config/Leaf.cs | 13 ++++ .../Primitives/Config/NestedLeaf.cs | 4 +- .../Primitives/Config/SapientSignerLeaf.cs | 4 +- .../Primitives/Config/SignerLeaf.cs | 5 +- .../Primitives/Config/SubdigestLeaf.cs | 3 +- .../Primitives/Config/Topology.cs | 69 +++++++------------ .../Primitives/Config/WeightCalculator.cs | 4 -- .../Primitives/Config/Weigth.cs | 4 -- .../Primitives/Signature/Erc6492.cs | 14 ++++ .../Primitives/Signature/Erc6492.cs.meta | 3 + .../Primitives/Signature/FLAG.cs | 17 ----- .../Primitives/Signature/FLAG.cs.meta | 3 - .../Primitives/Signature/RSY.cs | 11 ++- .../Primitives/Signature/RawSignature.cs | 62 ++++++++--------- .../Primitives/Signature/RawSignerLeaf.cs | 34 --------- .../Signature/RawSignerLeaf.cs.meta | 3 - .../Primitives/Signature/SignatureHandler.cs | 2 +- .../Primitives/Signature/SignatureOfLeaf.cs | 9 +++ .../Signature/SignatureOfLeaf.cs.meta | 3 + .../Signature/SignatureOfSapientSignerLeaf.cs | 2 +- .../Signature/SignatureOfSignerLeaf.cs | 2 +- .../Signature/SignatureOfSignerLeafEthSign.cs | 6 +- .../Signature/SignatureOfSignerLeafHash.cs | 25 ++++--- .../Signature/SignedSapientSignerLeaf.cs | 2 +- .../Primitives/Signature/SignedSignerLeaf.cs | 2 +- .../EcosystemWallet/Utils/Erc6492Helper.cs | 13 ++-- .../EcosystemWallet/Utils/SignatureUtils.cs | 27 ++++---- .../Sequence/SequenceSDK/Utils/HexUtils.cs | 12 ++++ .../SequenceSDK/Utils/HexUtils.cs.meta | 3 + 34 files changed, 188 insertions(+), 209 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Erc6492.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Erc6492.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/HexUtils.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/HexUtils.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs index a8a7107c..21465382 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs @@ -110,7 +110,7 @@ public async Task HandleSingleRequest( Debug.Log($"[{DateTime.UtcNow:O}] Success Response for Method={method} id={id}"); if (debug) { - Debug.Log("Response details: " + JsonConvert.SerializeObject(response, Formatting.Indented)); + Debug.Log($"Response details for Method={method}: " + JsonConvert.SerializeObject(response, Formatting.Indented) + $", Params used = {JsonConvert.SerializeObject(methodParams)}"); } } return response; diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs index c1d92c9c..202416a5 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs @@ -79,16 +79,22 @@ private static string EncodeSignatureFromInput(string input, string signatures, case "eth_sign": return new SignatureOfSignerLeafEthSign { - r = candidate.Values[0].HexStringToBigInteger(), - s = candidate.Values[1].HexStringToBigInteger(), - yParity = RSY.VToYParity(int.Parse(candidate.Values[2])) + rsy = new RSY + { + r = candidate.Values[0].HexStringToBigInteger(), + s = candidate.Values[1].HexStringToBigInteger(), + yParity = RSY.VToYParity(int.Parse(candidate.Values[2])) + } }; case "hash": return new SignatureOfSignerLeafHash { - r = candidate.Values[0].HexStringToBigInteger(), - s = candidate.Values[1].HexStringToBigInteger(), - yParity = RSY.VToYParity(int.Parse(candidate.Values[2])) + rsy = new RSY + { + r = candidate.Values[0].HexStringToBigInteger(), + s = candidate.Values[1].HexStringToBigInteger(), + yParity = RSY.VToYParity(int.Parse(candidate.Values[2])) + } }; case "sapient": return new SignatureOfSapientSignerLeaf diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs index 54aff99e..95cf2c75 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs @@ -14,12 +14,6 @@ public static T[] GetArray(this Dictionary @params, string ke return JsonConvert.DeserializeObject(inputJson); } - public static Address GetAddress(this Dictionary @params, string key) - { - return @params.TryGetValue(key, out var value) && - value is string valueStr ? new Address(valueStr) : null; - } - public static Dictionary GetNestedObjects(this Dictionary dict, string key) { if (!dict.TryGetValue(key, out var inputObj)) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs index 3f9e9543..4f9a4991 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs @@ -2,5 +2,5 @@ namespace Sequence.EcosystemWallet.Envelope { - public abstract class EnvelopeSignature : SignatureType { } + public abstract class EnvelopeSignature : SignatureOfLeaf { } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs index 006b0c8d..caa552c1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs @@ -38,10 +38,6 @@ public byte[] HashConfiguration() byte[] checkpointerBytes = checkpointerAddress.HexStringToByteArray().PadLeft(32); root = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(root, checkpointerBytes)); - Debug.Log($"thresholdBytes: {thresholdBytes.ByteArrayToHexStringWithPrefix()}"); - Debug.Log($"checkpointBytes: {checkpointBytes.ByteArrayToHexStringWithPrefix()}"); - Debug.Log($"checkpointerBytes: {checkpointerBytes.ByteArrayToHexStringWithPrefix()}"); - return root; } @@ -64,9 +60,11 @@ public static Config FromJson(string json) var threshold = input["threshold"].ToString(); var checkpoint = input["checkpoint"].ToString(); - var checkpointer = new Address(input["checkpointer"].ToString()); var topology = input["topology"].ToString(); + var checkpointer = input.TryGetValue("checkpointer", out var value) && + value is string valueStr ? new Address(valueStr) : null; + return new Config { threshold = BigInteger.Parse(threshold), diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs index 34094a5a..e21982da 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs @@ -2,8 +2,21 @@ namespace Sequence.EcosystemWallet.Primitives { public abstract class Leaf { + public const string Signer = "signer"; + public const string Subdigest = "subdigest"; + public const string AnyAddressSubdigest = "any-address-subdigest"; + public const string Sapient = "sapient"; + public const string SapientSigner = "sapient-signer"; + public const string Nested = "nested"; + public const string Node = "node"; + public abstract object Parse(); public abstract byte[] Encode(bool noChainId, byte[] checkpointerData); public abstract byte[] HashConfiguration(); + + public Topology ToTopology() + { + return new Topology(this); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs index 8e54a951..4f05fb99 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs @@ -9,8 +9,6 @@ namespace Sequence.EcosystemWallet.Primitives { public class NestedLeaf : Leaf { - public const string type = "nested"; - public Topology tree; public BigInteger weight; public BigInteger threshold; @@ -19,7 +17,7 @@ public override object Parse() { return new { - type = "nested", + type = Nested, tree = tree.Parse(), weight = weight.ToString(), threshold = threshold.ToString() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs index 9a3baea5..4c3aec84 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs @@ -7,8 +7,6 @@ namespace Sequence.EcosystemWallet.Primitives { public class SapientSignerLeaf : Leaf { - public const string type = "sapient-signer"; - public Address address; public BigInteger weight; public string imageHash; @@ -17,7 +15,7 @@ public override object Parse() { return new { - type = type, + type = SapientSigner, address = address, weight = weight.ToString(), imageHash = imageHash diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs index bb9c8bea..f9a8b0f2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs @@ -3,13 +3,12 @@ using System.Text; using Sequence.ABI; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { public class SignerLeaf : Leaf { - public const string type = "signer"; - public Address address; public BigInteger weight; @@ -17,7 +16,7 @@ public override object Parse() { return new { - type = type, + type = Signer, address = address, weight = weight.ToString() }; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs index 4ad6a5fa..44d7578a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs @@ -6,14 +6,13 @@ namespace Sequence.EcosystemWallet.Primitives { public class SubdigestLeaf : Leaf { - public const string type = "subdigest"; public byte[] digest; public override object Parse() { return new { - type = "subdigest", + type = Subdigest, digest = digest.ByteArrayToHexString() }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index 8e1975f9..76a65589 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -38,20 +38,16 @@ public Topology(Node node) public static Topology FromLeaves(List leaves) { if (leaves == null || leaves.Count == 0) - { throw new ArgumentException("Cannot create topology from empty leaves"); - } if (leaves.Count == 1) - { - return new Topology(leaves[0]); - } + return leaves[0].ToTopology(); if (leaves.Count == 2) { return new Topology(new Node( - new Topology(leaves[0]), - new Topology(leaves[1]) + leaves[0].ToTopology(), + leaves[1].ToTopology() )); } @@ -134,63 +130,50 @@ public static Topology Decode(string input) if (!input.StartsWith("{")) { - return new Topology(new NodeLeaf + return new NodeLeaf { Value = (input).HexStringToByteArray() - }); + }.ToTopology(); } var data = JsonConvert.DeserializeObject>(input); string type = (string)data["type"]; - Leaf leaf; switch (type) { - case "signer": - leaf = new SignerLeaf + case Leaf.Signer: + return new SignerLeaf { address = new Address((string)data["address"]), weight = BigInteger.Parse((string)data["weight"]) - }; - - break; - case "sapient-signer": - leaf = new SapientSignerLeaf + }.ToTopology(); + case Leaf.SapientSigner: + return new SapientSignerLeaf { address = new Address((string)data["address"]), weight = BigInteger.Parse((string)data["weight"]), imageHash = (string)data["imageHash"] - }; - - break; - case "subdigest": - leaf = new SubdigestLeaf + }.ToTopology(); + case Leaf.Subdigest: + return new SubdigestLeaf { digest = ((string)data["digest"]).HexStringToByteArray() - }; - - break; - case "any-address-subdigest": - leaf = new AnyAddressSubdigestLeaf + }.ToTopology(); + case Leaf.AnyAddressSubdigest: + return new AnyAddressSubdigestLeaf { digest = ((string)data["digest"]).HexStringToByteArray() - }; - - break; - case "nested": - leaf = new NestedLeaf + }.ToTopology(); + case Leaf.Nested: + return new NestedLeaf { tree = Decode(data["tree"].ToString()), weight = BigInteger.Parse((string)data["weight"]), threshold = BigInteger.Parse((string)data["threshold"]) - }; - - break; + }.ToTopology(); default: throw new Exception("Invalid type in topology JSON"); } - - return new Topology(leaf); } public byte[] HashConfiguration() @@ -241,7 +224,7 @@ public static List ParseContentToLeafs(string elements) string firstElement = elements.Split(' ')[0]; string firstElementType = firstElement.Split(':')[0]; - if (firstElementType == "signer") + if (firstElementType == Leaf.Signer) { var parts = firstElement.Split(':'); string address = parts[1]; @@ -255,7 +238,7 @@ public static List ParseContentToLeafs(string elements) elements = elements.Substring(firstElement.Length).TrimStart(); } - else if (firstElementType == "subdigest") + else if (firstElementType == Leaf.Subdigest) { var parts = firstElement.Split(':'); string digest = parts[1]; @@ -267,7 +250,7 @@ public static List ParseContentToLeafs(string elements) elements = elements.Substring(firstElement.Length).TrimStart(); } - else if (firstElementType == "any-address-subdigest") + else if (firstElementType == Leaf.AnyAddressSubdigest) { var parts = firstElement.Split(':'); string digest = parts[1]; @@ -279,7 +262,7 @@ public static List ParseContentToLeafs(string elements) elements = elements.Substring(firstElement.Length).TrimStart(); } - else if (firstElementType == "sapient") + else if (firstElementType == Leaf.Sapient) { var parts = firstElement.Split(':'); string imageHash = parts[1]; @@ -298,7 +281,7 @@ public static List ParseContentToLeafs(string elements) elements = elements.Substring(firstElement.Length).TrimStart(); } - else if (firstElementType == "nested") + else if (firstElementType == Leaf.Nested) { var parts = firstElement.Split(':'); BigInteger threshold = BigInteger.Parse(parts[1]); @@ -320,7 +303,7 @@ public static List ParseContentToLeafs(string elements) elements = elements.Substring(end + 1).TrimStart(); } - else if (firstElementType == "node") + else if (firstElementType == Leaf.Node) { var parts = firstElement.Split(':'); string hash = parts[1]; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs index 1cc6b484..655efe16 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs @@ -57,10 +57,6 @@ private static WeightResult GetWeightForLeaf(Leaf leaf, Func canSign { return new WeightResult { weight = signedSapient.weight, maxWeight = signedSapient.weight }; } - else if (leaf is RawSignerLeaf rawSigner) - { - return new WeightResult { weight = rawSigner.weight, maxWeight = rawSigner.weight }; - } // Handle unsigned leaves that can potentially be signed else if (leaf is SignerLeaf signer) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs index 2467dc32..a203fd60 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs @@ -54,10 +54,6 @@ private static Weigth GetWeightForLeaf(Leaf leaf, Func canSign) { return new Weigth { weight = signedSapient.weight, maxWeight = signedSapient.weight }; } - if (leaf is RawSignerLeaf rawSigner) - { - return new Weigth { weight = rawSigner.weight, maxWeight = rawSigner.weight }; - } if (leaf is SignerLeaf signer) { BigInteger maxWeight = canSign(signer) ? signer.weight : 0; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Erc6492.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Erc6492.cs new file mode 100644 index 00000000..a9577806 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Erc6492.cs @@ -0,0 +1,14 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public class Erc6492 + { + public Address to; + public byte[] data; + + public Erc6492(Address to, byte[] data) + { + this.to = to; + this.data = data; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Erc6492.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Erc6492.cs.meta new file mode 100644 index 00000000..426074a6 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Erc6492.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b951c13874834f1bb6bf07c888c9f58e +timeCreated: 1751198455 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs deleted file mode 100644 index ccaf97d5..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace Sequence.EcosystemWallet.Primitives -{ - internal enum FLAG - { - SIGNATURE_HASH = 0, - ADDRESS = 1, - SIGNATURE_ERC1271 = 2, - NODE = 3, - BRANCH = 4, - SUBDIGEST = 5, - NESTED = 6, - SIGNATURE_ETH_SIGN = 7, - SIGNATURE_ANY_ADDRESS_SUBDIGEST = 8, - SIGNATURE_SAPIENT = 9, - SIGNATURE_SAPIENT_COMPACT = 10, - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs.meta deleted file mode 100644 index d37a0a35..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/FLAG.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 1e2a94e26e344dfbb5f82a75e4742313 -timeCreated: 1747224577 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs index d84600c0..62360369 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs @@ -5,7 +5,7 @@ namespace Sequence.EcosystemWallet.Primitives { - public abstract class RSY : SignatureOfSignerLeaf + public class RSY { public BigInteger r; public BigInteger s; @@ -25,7 +25,7 @@ public byte[] Pack() return ByteArrayExtensions.ConcatenateByteArrays(rBytes, sBytes); } - public static (BigInteger R, BigInteger S, int YParity) Unpack(byte[] rsy) + public static RSY Unpack(byte[] rsy) { if (rsy.Length != 64) throw new ArgumentException("RSY must be exactly 64 bytes"); @@ -40,7 +40,12 @@ public static (BigInteger R, BigInteger S, int YParity) Unpack(byte[] rsy) var s = sBytes.ToBigInteger(); - return (r, s, yParity); + return new RSY + { + r = r, + s = s, + yParity = yParity, + }; } public static int VToYParity(BigInteger v) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs index 36ebaaf4..22311c68 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -8,12 +8,6 @@ namespace Sequence.EcosystemWallet.Primitives { public class RawSignature { - public class Erc6492 - { - public Address to; - public byte[] data; - } - public bool noChainId; public byte[] checkpointerData; public Config configuration; @@ -36,7 +30,9 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd chained.AddRange(suffix); var chainedSignature = new ChainedSignature(chained.ToArray()); - return chainedSignature.Encode(); + var chainedEncoded = chainedSignature.Encode(); + + return erc6492 != null ? Erc6492Helper.Wrap(chainedEncoded, erc6492.to, erc6492.data) : chainedEncoded; } byte flag = 0; @@ -75,7 +71,7 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd if (checkpointerDataSize > 16777215) throw new Exception("Checkpointer data too large"); - output = ByteArrayExtensions.ConcatenateByteArrays(output, checkpointerData ?? new byte[0]); + output = ByteArrayExtensions.ConcatenateByteArrays(output, checkpointerDataSize.ByteArrayFromNumber(), checkpointerData ?? Array.Empty()); } } @@ -107,39 +103,40 @@ public static RawSignature Decode(byte[] erc6492Signature) if ((flag & 0x40) == 0x40) { - if (index + 20 > signature.Length) - throw new Exception("Not enough bytes for checkpointer address"); - + AssertBytes("checkpointer address", index, 20, signature.Length); + var checkpointer = signature[index..(index + 20)].ByteArrayToHexStringWithPrefix(); checkpointerAddress = new Address(checkpointer); index += 20; - if (index + 3 > signature.Length) - throw new Exception("Not enough bytes for checkpointer data size"); + AssertBytes("checkpointerData size", index, 3, signature.Length); var dataSize = signature[index..(index + 3)].ToInteger(); index += 3; - if (index + dataSize > signature.Length) - throw new Exception("Not enough bytes for checkpointer data"); + AssertBytes("checkpointerData", index, dataSize, signature.Length); checkpointerData = signature[index..(index + dataSize)]; index += dataSize; } int checkpointSize = (flag & 0x1C) >> 2; - if (index + checkpointSize > signature.Length) - throw new Exception("Not enough bytes for checkpoint"); + checkpointSize++; + + AssertBytes("checkpoint", index, checkpointSize, signature.Length); var checkpoint = signature[index..(index + checkpointSize)].ToBigInteger(); index += checkpointSize; int thresholdSize = ((flag & 0x20) >> 5) + 1; - if (index + thresholdSize > signature.Length) - throw new Exception("Not enough bytes for threshold"); + + AssertBytes("threshold", index, thresholdSize, signature.Length); var threshold = signature[index..(index + thresholdSize)].ToBigInteger(); index += thresholdSize; + + if (signature.ByteArrayToHexStringWithPrefix() == "0x480000000000000000000000000000000000001be9000000005942020213a31d1a2ec622361e3285cc7377bb05ad8a7ee7db48551f9d94e5036a1306de1d615daff8918cd9180a9ac57c6dd590beb8d567b4ad8ecc4ca7b05296895916") + Debug.Log($"##4 {checkpoint}, {threshold}"); if ((flag & 0x01) == 0x01) { @@ -147,15 +144,13 @@ public static RawSignature Decode(byte[] erc6492Signature) while (index < signature.Length) { - if (index + 3 > signature.Length) - throw new Exception("Not enough bytes for chained subsignature size"); + AssertBytes("chained subsignature size", index, 3, signature.Length); int subSize = signature[index..(index + 3)].ToInteger(); index += 3; - if (index + subSize > signature.Length) - throw new Exception("Not enough bytes for chained subsignature"); - + AssertBytes("chained subsignature", index, subSize, signature.Length); + var subSignature = Decode(signature[index..(index + subSize)]); index += subSize; @@ -175,14 +170,11 @@ public static RawSignature Decode(byte[] erc6492Signature) checkpointerData = null, configuration = subsignatures[0].configuration, suffix = subsignatures.GetRange(1, subsignatures.Count - 1).ToArray(), - erc6492 = erc6492.HasValue ? new Erc6492 - { - to = erc6492.Value.To, - data = erc6492.Value.Data - } : null + erc6492 = erc6492 }; } + // In case of a SignatureOfSignerLeafHash, the 'index' here is one byte behind var (nodes, leftover) = SignatureUtils.ParseBranch(signature[index..]); if (leftover.Length != 0) throw new Exception("Leftover bytes in signature"); @@ -200,12 +192,14 @@ public static RawSignature Decode(byte[] erc6492Signature) topology = topology, checkpointer = checkpointerAddress }, - erc6492 = erc6492.HasValue ? new Erc6492 - { - to = erc6492.Value.To, - data = erc6492.Value.Data - } : null + erc6492 = erc6492 }; } + + private static void AssertBytes(string key, int current, int dataSize, int total) + { + if (current + dataSize > total) + throw new Exception($"Not enough bytes for '{key}'. Current: {current}, DataSize: {dataSize}, Total: {total}"); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs deleted file mode 100644 index 376635b5..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Numerics; - -namespace Sequence.EcosystemWallet.Primitives -{ - public class RawSignerLeaf : Leaf - { - public const string type = "unrecovered-signer"; - - public BigInteger weight; - public SignatureType signature; - - public override object Parse() - { - throw new System.NotImplementedException("RawSignerLeaf.Parse"); - } - - public override byte[] Encode(bool noChainId, byte[] checkpointerData) - { - return signature.Encode(this); - } - - public override byte[] HashConfiguration() - { - throw new System.NotImplementedException("RawSignerLeaf.HashConfiguration"); - } - } - - public abstract class SignatureType - { - public abstract string type { get; } - - public abstract byte[] Encode(Leaf leaf); - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs.meta deleted file mode 100644 index 09a2bf01..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignerLeaf.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 9702ffb82ba4491abb965b99775440eb -timeCreated: 1747225789 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs index 36551fd7..bf5f0400 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs @@ -5,7 +5,7 @@ namespace Sequence.EcosystemWallet.Primitives { public class SignatureHandler { - public static Topology FillLeaves(Topology topology, Func signatureFor) + public static Topology FillLeaves(Topology topology, Func signatureFor) { if (topology.IsNode()) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfLeaf.cs new file mode 100644 index 00000000..cfbedeb1 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfLeaf.cs @@ -0,0 +1,9 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public abstract class SignatureOfLeaf + { + public abstract string type { get; } + + public abstract byte[] Encode(Leaf leaf); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfLeaf.cs.meta new file mode 100644 index 00000000..cebb8b59 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b709cd9ee2144ca2864cf7af5b46ee28 +timeCreated: 1751198284 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs index bf6a8c72..a53272f7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs @@ -4,7 +4,7 @@ namespace Sequence.EcosystemWallet.Primitives { - public class SignatureOfSapientSignerLeaf : SignatureType + public class SignatureOfSapientSignerLeaf : SignatureOfLeaf { public enum Type { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs index 94583104..bb2274f9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - public abstract class SignatureOfSignerLeaf : SignatureType + public abstract class SignatureOfSignerLeaf : SignatureOfLeaf { } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs index 88f66592..6fe42349 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs @@ -4,10 +4,12 @@ namespace Sequence.EcosystemWallet.Primitives { - public class SignatureOfSignerLeafEthSign : RSY + public class SignatureOfSignerLeafEthSign : SignatureOfSignerLeaf { public override string type => "eth_sign"; + public RSY rsy; + public override byte[] Encode(Leaf leaf) { if (leaf is not SignerLeaf signerLeaf) @@ -23,7 +25,7 @@ public override byte[] Encode(Leaf leaf) else throw new Exception("Weight too large"); - return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, Pack()); + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, rsy.Pack()); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs index 81136abd..1f7dabb6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs @@ -1,29 +1,36 @@ using System; -using System.Linq; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { - public class SignatureOfSignerLeafHash : RSY + public class SignatureOfSignerLeafHash : SignatureOfSignerLeaf { public override string type => "hash"; + + public RSY rsy; public override byte[] Encode(Leaf leaf) { if (leaf is not SignerLeaf signerLeaf) - throw new Exception(); - + throw new Exception($"Leaf type is not supported: {leaf.GetType()}"); + + var weight = signerLeaf.weight; var weightBytes = Array.Empty(); + var flag = Topology.FlagSignatureHash << 4; - if (signerLeaf.weight <= 15 && signerLeaf.weight > 0) - flag |= (int)signerLeaf.weight; - else if (signerLeaf.weight <= 255) - weightBytes = signerLeaf.weight.ByteArrayFromNumber(signerLeaf.weight.MinBytesFor()); + if (weight <= 15 && weight > 0) + flag |= (int)weight; + else if (weight <= 255) + weightBytes = weight.ByteArrayFromNumber(weight.MinBytesFor()); else throw new Exception("Weight too large"); + + if ("0x020213a31d1a2ec622361e3285cc7377bb05ad8a7ee7db48551f9d94e5036a1306de1d615daff8918cd9180a9ac57c6dd590beb8d567b4ad8ecc4ca7b05296895916".Contains(ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, rsy.Pack()).ByteArrayToHexString())) + Debug.Log($"##1 {ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, rsy.Pack()).ByteArrayToHexString()}: {weight}, {rsy.r}, {rsy.s}, {rsy.yParity}"); - return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, Pack()); + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, rsy.Pack()); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs index 9ad96936..ecc905a6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs @@ -2,7 +2,7 @@ namespace Sequence.EcosystemWallet.Primitives { public class SignedSapientSignerLeaf : SapientSignerLeaf { - public SignatureType signature; + public SignatureOfLeaf signature; public override byte[] Encode(bool noChainId, byte[] checkpointerData) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs index b40aa390..792f5a27 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs @@ -2,7 +2,7 @@ namespace Sequence.EcosystemWallet.Primitives { public class SignedSignerLeaf : SignerLeaf { - public SignatureType signature; + public SignatureOfLeaf signature; public override byte[] Encode(bool noChainId, byte[] checkpointerData) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs index 0f36a6d3..e05537ce 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs @@ -6,7 +6,9 @@ using Nethereum.ABI.Model; using Nethereum.Hex.HexConvertors.Extensions; using Nethereum.Web3; +using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Utils { @@ -51,16 +53,15 @@ public static byte[] Wrap(byte[] signature, Address to, byte[] data) new ABIValue("bytes", signature) ); - return ByteArrayExtensions.ConcatenateByteArrays(encoded, MagicBytes.HexToByteArray()); + return HexUtils.Concat(encoded.ByteArrayToHexString(), MagicBytes).HexStringToByteArray(); } - public static (byte[] Signature, (Address To, byte[] Data)? Erc6492) Decode(byte[] signature) + public static (byte[] Signature, Erc6492 Erc6492) Decode(byte[] signature) { var magicBytes = MagicBytes.HexStringToByteArray(); int magicLength = magicBytes.Length; - - if (signature.Length >= magicLength && - signature[^magicLength..].ByteArrayToHexStringWithPrefix() == MagicBytes) + + if (signature.Length >= magicLength && signature[^magicLength..].ByteArrayToHexStringWithPrefix() == MagicBytes) { var raw = signature[..^magicLength]; @@ -80,7 +81,7 @@ public static (byte[] Signature, (Address To, byte[] Data)? Erc6492) Decode(byte byte[] data = (byte[])(decoded[1].Result ?? throw new Exception("Missing 'data'")); byte[] unwrappedSignature = (byte[])(decoded[2].Result ?? throw new Exception("Missing 'signature'")); - return (unwrappedSignature, (new Address(to), data)); + return (unwrappedSignature, new Erc6492(new Address(to), data)); } catch { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs index 5f464494..b3352e2a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs @@ -3,6 +3,7 @@ using System.Numerics; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Utils { @@ -17,6 +18,8 @@ public static (Topology[] nodes, byte[] Leftover) ParseBranch(byte[] signature) { byte firstByte = signature[index++]; int flag = (firstByte & 0xf0) >> 4; + + Debug.LogError($"{signature.ByteArrayToHexStringWithPrefix()} {index} {flag}"); switch (flag) { @@ -29,19 +32,19 @@ public static (Topology[] nodes, byte[] Leftover) ParseBranch(byte[] signature) if (index + 64 > signature.Length) throw new Exception("Not enough bytes for hash signature"); - var unpacked = RSY.Unpack(signature[index..(index + 64)]); + var rsy = RSY.Unpack(signature[index..(index + 64)]); index += 64; - leafs.Add(new Topology(new RawSignerLeaf + leafs.Add(new Topology(new SignedSignerLeaf { weight = new BigInteger(weight), signature = new SignatureOfSignerLeafHash { - r = unpacked.R, - s = unpacked.S, - yParity = unpacked.YParity + rsy = rsy } })); + + Debug.Log($"##2 {signature.ByteArrayToHexStringWithPrefix()}: {new BigInteger(weight)}, {rsy.r}, {rsy.s}, {rsy.yParity}"); break; } @@ -51,6 +54,8 @@ public static (Topology[] nodes, byte[] Leftover) ParseBranch(byte[] signature) int weight = firstByte & 0x0f; if (weight == 0) weight = signature[index++]; + + Debug.LogError($"{signature.ByteArrayToHexStringWithPrefix()} {index} {signature.Length}"); string address = signature[index..(index + 20)].ByteArrayToHexStringWithPrefix(); index += 20; @@ -80,7 +85,7 @@ public static (Topology[] nodes, byte[] Leftover) ParseBranch(byte[] signature) byte[] data = signature[index..(index + dataSize)]; index += dataSize; - leafs.Add(new Topology(new RawSignerLeaf + leafs.Add(new Topology(new SignedSignerLeaf { weight = new BigInteger(weight), signature = new SignatureOfSignerLeafErc1271 @@ -171,17 +176,15 @@ public static (Topology[] nodes, byte[] Leftover) ParseBranch(byte[] signature) if (weight == 0) weight = signature[index++]; - var unpacked = RSY.Unpack(signature[index..(index + 64)]); + var rsy = RSY.Unpack(signature[index..(index + 64)]); index += 64; - leafs.Add(new Topology(new RawSignerLeaf + leafs.Add(new Topology(new SignedSignerLeaf { weight = new BigInteger(weight), signature = new SignatureOfSignerLeafEthSign { - r = unpacked.R, - s = unpacked.S, - yParity = unpacked.YParity + rsy = rsy } })); @@ -217,7 +220,7 @@ public static (Topology[] nodes, byte[] Leftover) ParseBranch(byte[] signature) byte[] data = signature[index..(index + dataSize)]; index += dataSize; - leafs.Add(new Topology(new RawSignerLeaf + leafs.Add(new Topology(new SignedSignerLeaf { weight = new BigInteger(weight), signature = new SignatureOfSapientSignerLeaf diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/HexUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/HexUtils.cs new file mode 100644 index 00000000..4bdbe241 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/HexUtils.cs @@ -0,0 +1,12 @@ +using System.Linq; + +namespace Sequence.Utils +{ + public static class HexUtils + { + public static string Concat(params string[] values) + { + return "0x" + string.Concat(values.Select(v => v.StartsWith("0x") ? v.Substring(2) : v)); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/HexUtils.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/HexUtils.cs.meta new file mode 100644 index 00000000..569e2511 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/HexUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: df040c3dbaf4497aa9dd9c86dd9876f6 +timeCreated: 1751200497 \ No newline at end of file From c2e59c4396deccb161faca4b3c589858110e268c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Sun, 29 Jun 2025 20:47:55 +0200 Subject: [PATCH 064/165] unit test fr encoding and decoding config --- .../IntegrationTests/SignatureTests.cs | 122 +---------------- .../UnitTests/ConfigSignatureTests.cs | 38 ++++++ .../UnitTests/ConfigSignatureTests.cs.meta | 3 + .../Primitives/Config/NestedLeaf.cs | 4 +- .../Primitives/Signature/RawSignature.cs | 19 +-- .../Signature/SignatureOfSapientSignerLeaf.cs | 10 +- .../Signature/SignatureOfSignerLeafErc1271.cs | 10 +- .../Signature/SignatureOfSignerLeafHash.cs | 3 - .../EcosystemWallet/Utils/SignatureUtils.cs | 125 +++++++++++++++++- 9 files changed, 179 insertions(+), 155 deletions(-) create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs index 202416a5..064972e3 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs @@ -1,9 +1,9 @@ -using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Newtonsoft.Json; using Sequence.EcosystemWallet.Primitives; +using Sequence.EcosystemWallet.Utils; using Sequence.Utils; namespace Sequence.EcosystemWallet.IntegrationTests @@ -16,7 +16,7 @@ public Task SignatureEncode(Dictionary parameters) var signatures = parameters["signatures"].ToString(); var chainId = !parameters.TryGetValue("chainId", out var chainIdValue) || (bool)chainIdValue; - return Task.FromResult(EncodeSignatureFromInput(input, signatures, !chainId)); + return Task.FromResult(SignatureUtils.EncodeSignatureFromInput(input, signatures, !chainId)); } public Task SignatureDecode(Dictionary parameters) @@ -39,123 +39,5 @@ public Task SignatureConcat(Dictionary parameters) return Task.FromResult(encoded.ByteArrayToHexStringWithPrefix()); } - - private static string EncodeSignatureFromInput(string input, string signatures, bool noChainId, byte[] checkpointerData = null) - { - var parts = string.IsNullOrEmpty(signatures) ? - Array.Empty() : - signatures.Split(' '); - - var config = Primitives.Config.FromJson(input); - - var allSignatures = parts.Select(s => - { - var values = s.Split(':'); - - return new - { - Address = new Address(values[0]), - Type = values[1], - Values = values.Skip(2).ToArray() - }; - }).ToList(); - - var fullTopology = SignatureHandler.FillLeaves(config.topology, leaf => - { - if (leaf is SignerLeaf signerLeaf) - { - var candidate = allSignatures.FirstOrDefault(s => s.Address.Equals(signerLeaf.address)); - if (candidate == null) - return null; - - switch (candidate.Type) - { - case "erc1271": - return new SignatureOfSignerLeafErc1271 - { - address = candidate.Address, - data = candidate.Values[0].HexStringToByteArray() - }; - case "eth_sign": - return new SignatureOfSignerLeafEthSign - { - rsy = new RSY - { - r = candidate.Values[0].HexStringToBigInteger(), - s = candidate.Values[1].HexStringToBigInteger(), - yParity = RSY.VToYParity(int.Parse(candidate.Values[2])) - } - }; - case "hash": - return new SignatureOfSignerLeafHash - { - rsy = new RSY - { - r = candidate.Values[0].HexStringToBigInteger(), - s = candidate.Values[1].HexStringToBigInteger(), - yParity = RSY.VToYParity(int.Parse(candidate.Values[2])) - } - }; - case "sapient": - return new SignatureOfSapientSignerLeaf - { - curType = SignatureOfSapientSignerLeaf.Type.sapient, - address = candidate.Address, - data = candidate.Values[0].HexStringToByteArray() - }; - case "sapient_compact": - return new SignatureOfSapientSignerLeaf - { - curType = SignatureOfSapientSignerLeaf.Type.sapient_compact, - address = candidate.Address, - data = candidate.Values[0].HexStringToByteArray() - }; - default: - throw new Exception($"Unsupported signature type: {candidate.Type}"); - } - } - - if (leaf is SapientSignerLeaf sapientSignerLeaf) - { - var candidate = allSignatures.FirstOrDefault(s => s.Address.Equals(sapientSignerLeaf.address)); - if (candidate == null) - return null; - - switch (candidate.Type) - { - case "sapient": - case "sapient_compact": - return new SignatureOfSapientSignerLeaf - { - address = candidate.Address, - data = candidate.Values[0].HexStringToByteArray(), - }; - case "eth_sign": - case "hash": - case "erc1271": - throw new Exception($"Incorrect type for leaf"); - default: - throw new Exception($"Unsupported signature type: {candidate.Type}"); - } - } - - return null; - }); - - var rawSignature = new RawSignature - { - noChainId = noChainId, - configuration = new Primitives.Config - { - threshold = config.threshold, - checkpoint = config.checkpoint, - checkpointer = config.checkpointer, - topology = fullTopology - }, - checkpointerData = checkpointerData - }; - - return rawSignature.Encode().ByteArrayToHexStringWithPrefix(); - } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs new file mode 100644 index 00000000..afc52144 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using NUnit.Framework; +using Sequence.EcosystemWallet.Primitives; +using Sequence.EcosystemWallet.Utils; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet.UnitTests +{ + public class ConfigSignatureTests + { + private const string ConfigInput = "{\"input\":{\"threshold\":\"2\",\"checkpoint\":\"22850\",\"topology\":{\"type\":\"signer\",\"address\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D\",\"weight\":\"2\"},\"checkpointer\":\"0x0000000000000000000000000000000000001bE9\"},\"signatures\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D:hash:0x13a31d1a2ec622361e3285cc7377bb05ad8a7ee7db48551f9d94e5036a1306de:0x1d615daff8918cd9180a9ac57c6dd590beb8d567b4ad8ecc4ca7b05296895916:27\",\"chainId\":true,\"checkpointerData\":\"0x000000000000000000000000000000000000000000000000000000000001a12a\"}"; + + [Test] + public void TestConfigSignature() + { + var parameters = JsonConvert.DeserializeObject>(ConfigInput); + var input = parameters["input"].ToString(); + var config = Primitives.Config.FromJson(input); + + var signatures = parameters["signatures"].ToString(); + var chainId = !parameters.TryGetValue("chainId", out var chainIdValue) || (bool)chainIdValue; + + var encoded = SignatureUtils.EncodeSignatureFromInput(input, signatures, !chainId); + Debug.Log($"Encoded Signature {encoded}"); + + var encodedSignature = encoded.HexStringToByteArray(); + var decoded = RawSignature.Decode(encodedSignature); + + Debug.Log($"Decoded Signature {JsonConvert.SerializeObject(decoded)}"); + + Assert.AreEqual(config.checkpoint, decoded.configuration.checkpoint); + Assert.AreEqual(config.threshold, decoded.configuration.threshold); + Assert.AreEqual(config.checkpointer, decoded.configuration.checkpointer); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs.meta new file mode 100644 index 00000000..35e92387 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 57253615ecff4d18a7f326e035357da0 +timeCreated: 1751219840 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs index 4f05fb99..a177d9b3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs @@ -60,8 +60,8 @@ public override byte[] HashConfiguration() { byte[] prefix = Encoding.UTF8.GetBytes("Sequence nested config:\n"); byte[] treeHash = tree.HashConfiguration(); - byte[] threshold = this.threshold.ByteArrayFromNumber().PadLeft(32); - byte[] weight = this.weight.ByteArrayFromNumber().PadLeft(32); + byte[] threshold = this.threshold.ByteArrayFromNumber(32); + byte[] weight = this.weight.ByteArrayFromNumber(32); return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, treeHash, threshold, weight)); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs index 22311c68..51929d82 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -42,7 +42,7 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd int bytesForCheckpoint = configuration.checkpoint.MinBytesFor(); if (bytesForCheckpoint > 7) throw new Exception("Checkpoint too large"); - + flag |= (byte)(bytesForCheckpoint << 2); int bytesForThreshold = configuration.threshold.MinBytesFor(); @@ -63,15 +63,14 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd { var checkpointerBytes = configuration.checkpointer.Value.HexStringToByteArray(); output = ByteArrayExtensions.ConcatenateByteArrays(output, checkpointerBytes.PadLeft(20)); - Debug.Log(checkpointerBytes.ByteArrayToHexStringWithPrefix()); if (!skipCheckpointerData) { int checkpointerDataSize = checkpointerData?.Length ?? 0; if (checkpointerDataSize > 16777215) throw new Exception("Checkpointer data too large"); - - output = ByteArrayExtensions.ConcatenateByteArrays(output, checkpointerDataSize.ByteArrayFromNumber(), checkpointerData ?? Array.Empty()); + + output = ByteArrayExtensions.ConcatenateByteArrays(output, checkpointerDataSize.ByteArrayFromNumber(3), checkpointerData ?? Array.Empty()); } } @@ -108,12 +107,12 @@ public static RawSignature Decode(byte[] erc6492Signature) var checkpointer = signature[index..(index + 20)].ByteArrayToHexStringWithPrefix(); checkpointerAddress = new Address(checkpointer); index += 20; - + AssertBytes("checkpointerData size", index, 3, signature.Length); var dataSize = signature[index..(index + 3)].ToInteger(); index += 3; - + AssertBytes("checkpointerData", index, dataSize, signature.Length); checkpointerData = signature[index..(index + dataSize)]; @@ -121,22 +120,18 @@ public static RawSignature Decode(byte[] erc6492Signature) } int checkpointSize = (flag & 0x1C) >> 2; - checkpointSize++; AssertBytes("checkpoint", index, checkpointSize, signature.Length); - + var checkpoint = signature[index..(index + checkpointSize)].ToBigInteger(); index += checkpointSize; - + int thresholdSize = ((flag & 0x20) >> 5) + 1; AssertBytes("threshold", index, thresholdSize, signature.Length); var threshold = signature[index..(index + thresholdSize)].ToBigInteger(); index += thresholdSize; - - if (signature.ByteArrayToHexStringWithPrefix() == "0x480000000000000000000000000000000000001be9000000005942020213a31d1a2ec622361e3285cc7377bb05ad8a7ee7db48551f9d94e5036a1306de1d615daff8918cd9180a9ac57c6dd590beb8d567b4ad8ecc4ca7b05296895916") - Debug.Log($"##4 {checkpoint}, {threshold}"); if ((flag & 0x01) == 0x01) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs index a53272f7..5e6d7712 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs @@ -35,17 +35,15 @@ public override byte[] Encode(Leaf leaf) if (signerLeaf.weight <= 3 && signerLeaf.weight > 0) flag |= (int)signerLeaf.weight; else if (signerLeaf.weight <= 255) - weightBytes = signerLeaf.weight.ByteArrayFromNumber(); + weightBytes = signerLeaf.weight.ByteArrayFromNumber(signerLeaf.weight.MinBytesFor()); else throw new Exception("Weight too large"); return ByteArrayExtensions.ConcatenateByteArrays( - flag.ByteArrayFromNumber(), + flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, - address.Value.HexStringToByteArray() - .PadLeft(20), - data.Length.ByteArrayFromNumber() - .PadLeft(sizeLen), + address.Value.HexStringToByteArray(20), + data.Length.ByteArrayFromNumber(sizeLen), data); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs index 036d163b..70f7bbd3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs @@ -27,17 +27,15 @@ public override byte[] Encode(Leaf leaf) if (signerLeaf.weight <= 3 && signerLeaf.weight > 0) flag |= (int)signerLeaf.weight; else if (signerLeaf.weight <= 255) - weightBytes = signerLeaf.weight.ByteArrayFromNumber(); + weightBytes = signerLeaf.weight.ByteArrayFromNumber(signerLeaf.weight.MinBytesFor()); else throw new Exception("Weight too large"); return ByteArrayExtensions.ConcatenateByteArrays( - flag.ByteArrayFromNumber(), + flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, - address.Value.HexStringToByteArray() - .PadLeft(20), - data.Length.ByteArrayFromNumber() - .PadLeft(sizeLen), + address.Value.HexStringToByteArray(20), + data.Length.ByteArrayFromNumber(sizeLen), data); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs index 1f7dabb6..d290c8ce 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs @@ -27,9 +27,6 @@ public override byte[] Encode(Leaf leaf) else throw new Exception("Weight too large"); - if ("0x020213a31d1a2ec622361e3285cc7377bb05ad8a7ee7db48551f9d94e5036a1306de1d615daff8918cd9180a9ac57c6dd590beb8d567b4ad8ecc4ca7b05296895916".Contains(ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, rsy.Pack()).ByteArrayToHexString())) - Debug.Log($"##1 {ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, rsy.Pack()).ByteArrayToHexString()}: {weight}, {rsy.r}, {rsy.s}, {rsy.yParity}"); - return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, rsy.Pack()); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs index b3352e2a..bdb71e7b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Numerics; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; @@ -9,6 +10,124 @@ namespace Sequence.EcosystemWallet.Utils { public static class SignatureUtils { + public static string EncodeSignatureFromInput(string input, string signatures, bool noChainId, byte[] checkpointerData = null) + { + var parts = string.IsNullOrEmpty(signatures) ? + Array.Empty() : + signatures.Split(' '); + + var config = Primitives.Config.FromJson(input); + + var allSignatures = parts.Select(s => + { + var values = s.Split(':'); + + return new + { + Address = new Address(values[0]), + Type = values[1], + Values = values.Skip(2).ToArray() + }; + }).ToList(); + + var fullTopology = SignatureHandler.FillLeaves(config.topology, leaf => + { + if (leaf is SignerLeaf signerLeaf) + { + var candidate = allSignatures.FirstOrDefault(s => s.Address.Equals(signerLeaf.address)); + if (candidate == null) + return null; + + switch (candidate.Type) + { + case "erc1271": + return new SignatureOfSignerLeafErc1271 + { + address = candidate.Address, + data = candidate.Values[0].HexStringToByteArray() + }; + case "eth_sign": + return new SignatureOfSignerLeafEthSign + { + rsy = new RSY + { + r = candidate.Values[0].HexStringToBigInteger(), + s = candidate.Values[1].HexStringToBigInteger(), + yParity = RSY.VToYParity(int.Parse(candidate.Values[2])) + } + }; + case "hash": + return new SignatureOfSignerLeafHash + { + rsy = new RSY + { + r = candidate.Values[0].HexStringToBigInteger(), + s = candidate.Values[1].HexStringToBigInteger(), + yParity = RSY.VToYParity(int.Parse(candidate.Values[2])) + } + }; + case "sapient": + return new SignatureOfSapientSignerLeaf + { + curType = SignatureOfSapientSignerLeaf.Type.sapient, + address = candidate.Address, + data = candidate.Values[0].HexStringToByteArray() + }; + case "sapient_compact": + return new SignatureOfSapientSignerLeaf + { + curType = SignatureOfSapientSignerLeaf.Type.sapient_compact, + address = candidate.Address, + data = candidate.Values[0].HexStringToByteArray() + }; + default: + throw new Exception($"Unsupported signature type: {candidate.Type}"); + } + } + + if (leaf is SapientSignerLeaf sapientSignerLeaf) + { + var candidate = allSignatures.FirstOrDefault(s => s.Address.Equals(sapientSignerLeaf.address)); + if (candidate == null) + return null; + + switch (candidate.Type) + { + case "sapient": + case "sapient_compact": + return new SignatureOfSapientSignerLeaf + { + address = candidate.Address, + data = candidate.Values[0].HexStringToByteArray(), + }; + case "eth_sign": + case "hash": + case "erc1271": + throw new Exception($"Incorrect type for leaf"); + default: + throw new Exception($"Unsupported signature type: {candidate.Type}"); + } + } + + return null; + }); + + var rawSignature = new RawSignature + { + noChainId = noChainId, + configuration = new Primitives.Config + { + threshold = config.threshold, + checkpoint = config.checkpoint, + checkpointer = config.checkpointer, + topology = fullTopology + }, + checkpointerData = checkpointerData + }; + + return rawSignature.Encode().ByteArrayToHexStringWithPrefix(); + } + public static (Topology[] nodes, byte[] Leftover) ParseBranch(byte[] signature) { var leafs = new List(); @@ -19,8 +138,6 @@ public static (Topology[] nodes, byte[] Leftover) ParseBranch(byte[] signature) byte firstByte = signature[index++]; int flag = (firstByte & 0xf0) >> 4; - Debug.LogError($"{signature.ByteArrayToHexStringWithPrefix()} {index} {flag}"); - switch (flag) { case Topology.FlagSignatureHash: @@ -44,8 +161,6 @@ public static (Topology[] nodes, byte[] Leftover) ParseBranch(byte[] signature) } })); - Debug.Log($"##2 {signature.ByteArrayToHexStringWithPrefix()}: {new BigInteger(weight)}, {rsy.r}, {rsy.s}, {rsy.yParity}"); - break; } @@ -55,8 +170,6 @@ public static (Topology[] nodes, byte[] Leftover) ParseBranch(byte[] signature) if (weight == 0) weight = signature[index++]; - Debug.LogError($"{signature.ByteArrayToHexStringWithPrefix()} {index} {signature.Length}"); - string address = signature[index..(index + 20)].ByteArrayToHexStringWithPrefix(); index += 20; From 0c52d6b4e91027b210e3936a6470fa240a6a56f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Sun, 29 Jun 2025 21:14:18 +0200 Subject: [PATCH 065/165] unit test for recovering random config --- .../IntegrationTests/DevToolsTest.cs | 151 +----------------- .../IntegrationTests/SignatureTests.cs | 2 +- .../UnitTests/ConfigSignatureTests.cs | 49 +++++- .../{IntegrationTests => }/Utils.meta | 0 .../EcosystemWallet/Utils/DevTools.cs | 151 ++++++++++++++++++ .../EcosystemWallet/Utils/DevTools.cs.meta | 3 + .../Utils/IntegrationTestParamsUtils.cs | 0 .../Utils/IntegrationTestParamsUtils.cs.meta | 0 .../Primitives/Signature/RawSignature.cs | 21 +++ 9 files changed, 223 insertions(+), 154 deletions(-) rename Assets/SequenceSDK/EcosystemWallet/{IntegrationTests => }/Utils.meta (100%) create mode 100644 Assets/SequenceSDK/EcosystemWallet/Utils/DevTools.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/Utils/DevTools.cs.meta rename Assets/SequenceSDK/EcosystemWallet/{IntegrationTests => }/Utils/IntegrationTestParamsUtils.cs (100%) rename Assets/SequenceSDK/EcosystemWallet/{IntegrationTests => }/Utils/IntegrationTestParamsUtils.cs.meta (100%) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs index 5bb793dd..fb89ce63 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs @@ -1,26 +1,10 @@ -using System; using System.Collections.Generic; -using System.Numerics; -using System.Security.Cryptography; -using System.Text; using System.Threading.Tasks; -using Sequence.EcosystemWallet.Primitives; -using Sequence.Utils; namespace Sequence.EcosystemWallet.IntegrationTests { public class DevToolsTest { - private class RandomOptions - { - public Random random = new (); - public Func seededRandom; - public string checkpointer; - public BigInteger minThresholdOnNested; - public BigInteger maxPermissions; - public string skewed; - } - public Task DevToolsRandomConfig(Dictionary parameters) { var maxDepth = int.Parse(parameters["maxDepth"].ToString()); @@ -29,149 +13,20 @@ public Task DevToolsRandomConfig(Dictionary parameters) var checkpointer = parameters.TryGetValue("checkpointer", out var checkpointerObj) ? checkpointerObj.ToString() : "no"; var skewed = parameters.TryGetValue("skewed", out var skewedObj) ? skewedObj.ToString() : "none"; - var options = new RandomOptions + var options = new DevTools.RandomOptions { - seededRandom = string.IsNullOrEmpty(seed) ? null : CreateSeededRandom(seed), + seededRandom = string.IsNullOrEmpty(seed) ? null : DevTools.CreateSeededRandom(seed), checkpointer = checkpointer, minThresholdOnNested = minThresholdOnNested, skewed = skewed }; - return Task.FromResult(CreateRandomConfig(maxDepth, options)); + return Task.FromResult(DevTools.CreateRandomConfig(maxDepth, options).ToJson()); } public Task DevToolsRandomSessionTopology(Dictionary parameters) { throw new System.NotImplementedException("DevToolsTest.DevToolsRandomSessionTopology"); } - - private string CreateRandomConfig(int maxDepth, RandomOptions options) - { - return new Primitives.Config - { - threshold = RandomBigInt(100, options), - checkpoint = RandomBigInt(1000, options), - topology = GenerateRandomTopology(maxDepth, options), - checkpointer = options?.checkpointer switch - { - "yes" => RandomAddress(options), - "random" => (options?.seededRandom?.Invoke() ?? options.random.NextDouble()) > 0.5 - ? RandomAddress(options) - : null, - "no" or null => null, - _ => null - } - }.ToJson(); - } - - private static BigInteger RandomBigInt(int max, RandomOptions options) - { - var rnd = options.seededRandom?.Invoke() ?? options.random.NextDouble(); - return new BigInteger((long)(rnd * max)); - } - - private static Address RandomAddress(RandomOptions options) - { - return new Address(RandomHex(20, options)); - } - - private static string RandomHex(int byteLength, RandomOptions options) - { - var bytes = new byte[byteLength]; - options.random.NextBytes(bytes); - return "0x" + BitConverter.ToString(bytes).Replace("-", "").ToLower(); - } - - public static Func CreateSeededRandom(string seed) - { - string currentSeed = seed; - byte[] hash = ComputeSha256(currentSeed); - int index = 0; - - return () => - { - if (index >= hash.Length - 4) - { - currentSeed += "1"; - hash = ComputeSha256(currentSeed); - index = 0; - } - - uint value = BitConverter.ToUInt32(hash, index); - index += 4; - - return value / (double)uint.MaxValue; - }; - } - - private static byte[] ComputeSha256(string input) - { - using var sha = SHA256.Create(); - return sha.ComputeHash(Encoding.UTF8.GetBytes(input)); - } - - private static Topology GenerateRandomTopology(int depth, RandomOptions options) - { - if (depth <= 0) - { - var leafType = (int)Math.Floor((options.seededRandom?.Invoke() ?? options.random.NextDouble()) * 5); - switch (leafType) - { - case 0: - return new Topology(new SignerLeaf - { - address = RandomAddress(options), - weight = RandomBigInt(256, options) - }); - - case 1: - return new Topology(new SapientSignerLeaf - { - address = RandomAddress(options), - weight = RandomBigInt(256, options), - imageHash = RandomHex(32, options) - }); - - case 2: - return new Topology(new SubdigestLeaf - { - digest = RandomHex(32, options).HexStringToByteArray() - }); - - case 3: - return new Topology(new NodeLeaf - { - Value = RandomHex(32, options).HexStringToByteArray() - }); - - case 4: - BigInteger minThreshold = (BigInteger)options?.minThresholdOnNested; - return new Topology(new NestedLeaf - { - tree = GenerateRandomTopology(0, options), - weight = RandomBigInt(256, options), - threshold = minThreshold + RandomBigInt(65535 - (int)minThreshold, options) - }); - } - } - - if (options?.skewed == "left") - { - return new Topology(new Node( - GenerateRandomTopology(0, options), - GenerateRandomTopology(depth - 1, options))); - } - - if (options?.skewed == "right") - { - return new Topology(new Node( - GenerateRandomTopology(depth - 1, options), - GenerateRandomTopology(0, options))); - } - - return new Topology(new Node( - GenerateRandomTopology(depth - 1, options), - GenerateRandomTopology(depth - 1, options))); - } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs index 064972e3..2579f482 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs @@ -24,7 +24,7 @@ public Task SignatureDecode(Dictionary parameters) var encodedSignature = parameters["signature"].ToString().HexStringToByteArray(); var signature = RawSignature.Decode(encodedSignature); - return Task.FromResult(JsonConvert.SerializeObject(signature)); + return Task.FromResult(signature.ToJson()); } public Task SignatureConcat(Dictionary parameters) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs index afc52144..88437947 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using Newtonsoft.Json; using NUnit.Framework; +using Sequence.EcosystemWallet.IntegrationTests; using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Utils; using Sequence.Utils; @@ -10,7 +11,11 @@ namespace Sequence.EcosystemWallet.UnitTests { public class ConfigSignatureTests { - private const string ConfigInput = "{\"input\":{\"threshold\":\"2\",\"checkpoint\":\"22850\",\"topology\":{\"type\":\"signer\",\"address\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D\",\"weight\":\"2\"},\"checkpointer\":\"0x0000000000000000000000000000000000001bE9\"},\"signatures\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D:hash:0x13a31d1a2ec622361e3285cc7377bb05ad8a7ee7db48551f9d94e5036a1306de:0x1d615daff8918cd9180a9ac57c6dd590beb8d567b4ad8ecc4ca7b05296895916:27\",\"chainId\":true,\"checkpointerData\":\"0x000000000000000000000000000000000000000000000000000000000001a12a\"}"; + private const string ConfigInput = + "{\"input\":{\"threshold\":\"2\",\"checkpoint\":\"22850\",\"topology\":{\"type\":\"signer\",\"address\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D\",\"weight\":\"2\"},\"checkpointer\":\"0x0000000000000000000000000000000000001bE9\"},\"signatures\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D:hash:0x13a31d1a2ec622361e3285cc7377bb05ad8a7ee7db48551f9d94e5036a1306de:0x1d615daff8918cd9180a9ac57c6dd590beb8d567b4ad8ecc4ca7b05296895916:27\",\"chainId\":true,\"checkpointerData\":\"0x000000000000000000000000000000000000000000000000000000000001a12a\"}"; + + private const string RandomConfigParams = + "{\"maxDepth\":54,\"seed\":\"3313\",\"minThresholdOnNested\":1,\"skewed\":\"right\"}"; [Test] public void TestConfigSignature() @@ -18,21 +23,55 @@ public void TestConfigSignature() var parameters = JsonConvert.DeserializeObject>(ConfigInput); var input = parameters["input"].ToString(); var config = Primitives.Config.FromJson(input); - + var signatures = parameters["signatures"].ToString(); var chainId = !parameters.TryGetValue("chainId", out var chainIdValue) || (bool)chainIdValue; var encoded = SignatureUtils.EncodeSignatureFromInput(input, signatures, !chainId); Debug.Log($"Encoded Signature {encoded}"); - + var encodedSignature = encoded.HexStringToByteArray(); var decoded = RawSignature.Decode(encodedSignature); - + Debug.Log($"Decoded Signature {JsonConvert.SerializeObject(decoded)}"); - + Assert.AreEqual(config.checkpoint, decoded.configuration.checkpoint); Assert.AreEqual(config.threshold, decoded.configuration.threshold); Assert.AreEqual(config.checkpointer, decoded.configuration.checkpointer); } + + [Test] + public void TestRecoverRandomConfig() + { + var parameters = JsonConvert.DeserializeObject>(RandomConfigParams); + + var maxDepth = int.Parse(parameters["maxDepth"].ToString()); + var seed = (string)parameters["seed"]; + var minThresholdOnNested = int.Parse(parameters["minThresholdOnNested"].ToString()); + var checkpointer = parameters.TryGetValue("checkpointer", out var checkpointerObj) ? checkpointerObj.ToString() : "no"; + var skewed = parameters.TryGetValue("skewed", out var skewedObj) ? skewedObj.ToString() : "none"; + + var options = new DevTools.RandomOptions + { + seededRandom = string.IsNullOrEmpty(seed) ? null : DevTools.CreateSeededRandom(seed), + checkpointer = checkpointer, + minThresholdOnNested = minThresholdOnNested, + skewed = skewed + }; + + var config = DevTools.CreateRandomConfig(maxDepth, options); + var signature = new RawSignature + { + checkpointerData = null, + configuration = config, + }; + + var encodedSignature = signature.Encode(); + Debug.Log($"Encoded Signature {encodedSignature.ByteArrayToHexStringWithPrefix()}"); + + var decodedSignature = RawSignature.Decode(encodedSignature); + + Debug.Log($"Decoded Signature: {decodedSignature.ToJson()}"); + } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils.meta b/Assets/SequenceSDK/EcosystemWallet/Utils.meta similarity index 100% rename from Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils.meta rename to Assets/SequenceSDK/EcosystemWallet/Utils.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/Utils/DevTools.cs b/Assets/SequenceSDK/EcosystemWallet/Utils/DevTools.cs new file mode 100644 index 00000000..ae4ee88f --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/Utils/DevTools.cs @@ -0,0 +1,151 @@ +using System; +using System.Numerics; +using System.Security.Cryptography; +using System.Text; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public static class DevTools + { + public class RandomOptions + { + public Random random = new (); + public Func seededRandom; + public string checkpointer; + public BigInteger minThresholdOnNested; + public BigInteger maxPermissions; + public string skewed; + } + + public static Primitives.Config CreateRandomConfig(int maxDepth, RandomOptions options) + { + return new Primitives.Config + { + threshold = RandomBigInt(100, options), + checkpoint = RandomBigInt(1000, options), + topology = GenerateRandomTopology(maxDepth, options), + checkpointer = options?.checkpointer switch + { + "yes" => RandomAddress(options), + "random" => (options?.seededRandom?.Invoke() ?? options.random.NextDouble()) > 0.5 + ? RandomAddress(options) + : null, + "no" or null => null, + _ => null + } + }; + } + + public static BigInteger RandomBigInt(int max, RandomOptions options) + { + var rnd = options.seededRandom?.Invoke() ?? options.random.NextDouble(); + return new BigInteger((long)(rnd * max)); + } + + public static Address RandomAddress(RandomOptions options) + { + return new Address(RandomHex(20, options)); + } + + public static string RandomHex(int byteLength, RandomOptions options) + { + var bytes = new byte[byteLength]; + options.random.NextBytes(bytes); + return "0x" + BitConverter.ToString(bytes).Replace("-", "").ToLower(); + } + + public static Func CreateSeededRandom(string seed) + { + string currentSeed = seed; + byte[] hash = ComputeSha256(currentSeed); + int index = 0; + + return () => + { + if (index >= hash.Length - 4) + { + currentSeed += "1"; + hash = ComputeSha256(currentSeed); + index = 0; + } + + uint value = BitConverter.ToUInt32(hash, index); + index += 4; + + return value / (double)uint.MaxValue; + }; + } + + public static byte[] ComputeSha256(string input) + { + using var sha = SHA256.Create(); + return sha.ComputeHash(Encoding.UTF8.GetBytes(input)); + } + + public static Topology GenerateRandomTopology(int depth, RandomOptions options) + { + if (depth <= 0) + { + var leafType = (int)Math.Floor((options.seededRandom?.Invoke() ?? options.random.NextDouble()) * 5); + switch (leafType) + { + case 0: + return new Topology(new SignerLeaf + { + address = RandomAddress(options), + weight = RandomBigInt(256, options) + }); + + case 1: + return new Topology(new SapientSignerLeaf + { + address = RandomAddress(options), + weight = RandomBigInt(256, options), + imageHash = RandomHex(32, options) + }); + + case 2: + return new Topology(new SubdigestLeaf + { + digest = RandomHex(32, options).HexStringToByteArray() + }); + + case 3: + return new Topology(new NodeLeaf + { + Value = RandomHex(32, options).HexStringToByteArray() + }); + + case 4: + BigInteger minThreshold = (BigInteger)options?.minThresholdOnNested; + return new Topology(new NestedLeaf + { + tree = GenerateRandomTopology(0, options), + weight = RandomBigInt(256, options), + threshold = minThreshold + RandomBigInt(65535 - (int)minThreshold, options) + }); + } + } + + if (options?.skewed == "left") + { + return new Topology(new Node( + GenerateRandomTopology(0, options), + GenerateRandomTopology(depth - 1, options))); + } + + if (options?.skewed == "right") + { + return new Topology(new Node( + GenerateRandomTopology(depth - 1, options), + GenerateRandomTopology(0, options))); + } + + return new Topology(new Node( + GenerateRandomTopology(depth - 1, options), + GenerateRandomTopology(depth - 1, options))); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/Utils/DevTools.cs.meta b/Assets/SequenceSDK/EcosystemWallet/Utils/DevTools.cs.meta new file mode 100644 index 00000000..5fc6eedf --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/Utils/DevTools.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 66bb4c6f8a504aa5aaa62b1b3b995d18 +timeCreated: 1751223526 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs b/Assets/SequenceSDK/EcosystemWallet/Utils/IntegrationTestParamsUtils.cs similarity index 100% rename from Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs rename to Assets/SequenceSDK/EcosystemWallet/Utils/IntegrationTestParamsUtils.cs diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs.meta b/Assets/SequenceSDK/EcosystemWallet/Utils/IntegrationTestParamsUtils.cs.meta similarity index 100% rename from Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Utils/IntegrationTestParamsUtils.cs.meta rename to Assets/SequenceSDK/EcosystemWallet/Utils/IntegrationTestParamsUtils.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs index 51929d82..eb4a155d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; using Sequence.EcosystemWallet.Utils; using Sequence.Utils; using UnityEngine; @@ -14,6 +16,25 @@ public class RawSignature public RawSignature[] suffix; public Erc6492 erc6492; + public string ToJson() + { + var jsonObject = new + { + noChainId = noChainId, + checkpointerData = checkpointerData == null ? null : checkpointerData.ByteArrayToHexStringWithPrefix(), + configuration = new + { + threshold = configuration.threshold.ToString(), + checkpoint = configuration.checkpoint.ToString(), + topology = configuration.topology.Parse(), + checkpointer = configuration.checkpointer + }, + suffix = suffix == null ? null : suffix.Select(s => s.ToJson()), + }; + + return JsonConvert.SerializeObject(jsonObject); + } + public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAddress = false) { if (suffix is { Length: > 0 }) From 476ccecb4739c438215788dfff673d685cc7c4dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Sun, 29 Jun 2025 22:38:37 +0200 Subject: [PATCH 066/165] parsing config adjustments --- .../UnitTests/ConfigSignatureTests.cs | 11 +++++++- .../EcosystemWallet/Utils/DevTools.cs | 2 +- .../Config/AnyAddressSubdigestLeaf.cs | 5 ++-- .../Primitives/Config/Config.cs | 2 -- .../EcosystemWallet/Primitives/Config/Leaf.cs | 1 - .../Primitives/Config/NodeLeaf.cs | 4 +-- .../Primitives/Config/SubdigestLeaf.cs | 2 +- .../Primitives/Config/Topology.cs | 8 +++--- .../Primitives/Signature/RawSignature.cs | 28 +++++++++++-------- .../EcosystemWallet/Utils/SignatureUtils.cs | 3 +- 10 files changed, 38 insertions(+), 28 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs index 88437947..32c39787 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs @@ -9,7 +9,7 @@ namespace Sequence.EcosystemWallet.UnitTests { - public class ConfigSignatureTests + public class TConfigSignatureTests { private const string ConfigInput = "{\"input\":{\"threshold\":\"2\",\"checkpoint\":\"22850\",\"topology\":{\"type\":\"signer\",\"address\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D\",\"weight\":\"2\"},\"checkpointer\":\"0x0000000000000000000000000000000000001bE9\"},\"signatures\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D:hash:0x13a31d1a2ec622361e3285cc7377bb05ad8a7ee7db48551f9d94e5036a1306de:0x1d615daff8918cd9180a9ac57c6dd590beb8d567b4ad8ecc4ca7b05296895916:27\",\"chainId\":true,\"checkpointerData\":\"0x000000000000000000000000000000000000000000000000000000000001a12a\"}"; @@ -67,11 +67,20 @@ public void TestRecoverRandomConfig() }; var encodedSignature = signature.Encode(); + Debug.Log($"Encoded Signature {encodedSignature.ByteArrayToHexStringWithPrefix()}"); var decodedSignature = RawSignature.Decode(encodedSignature); Debug.Log($"Decoded Signature: {decodedSignature.ToJson()}"); + + Assert.AreEqual( + encodedSignature.ByteArrayToHexStringWithPrefix(), + decodedSignature.Encode().ByteArrayToHexStringWithPrefix()); + + Assert.AreEqual( + config.HashConfiguration().ByteArrayToHexStringWithPrefix(), + decodedSignature.configuration.HashConfiguration().ByteArrayToHexStringWithPrefix()); } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/Utils/DevTools.cs b/Assets/SequenceSDK/EcosystemWallet/Utils/DevTools.cs index ae4ee88f..90bc6f32 100644 --- a/Assets/SequenceSDK/EcosystemWallet/Utils/DevTools.cs +++ b/Assets/SequenceSDK/EcosystemWallet/Utils/DevTools.cs @@ -11,7 +11,7 @@ public static class DevTools { public class RandomOptions { - public Random random = new (); + public Random random = new(); public Func seededRandom; public string checkpointer; public BigInteger minThresholdOnNested; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs index 6b3a02f6..fd88c326 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs @@ -6,15 +6,14 @@ namespace Sequence.EcosystemWallet.Primitives { public class AnyAddressSubdigestLeaf : Leaf { - public const string type = "any-address-subdigest"; public byte[] digest; public override object Parse() { return new { - type = "any-address-subdigest", - digest = digest.ByteArrayToHexString() + type = AnyAddressSubdigest, + digest = digest.ByteArrayToHexStringWithPrefix() }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs index caa552c1..fdc0d1c6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs @@ -29,8 +29,6 @@ public byte[] HashConfiguration() byte[] thresholdBytes = threshold.ByteArrayFromNumber(threshold.MinBytesFor()).PadLeft(32); root = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(root, thresholdBytes)); - Debug.Log($"1 SequenceCoder.KeccakHash: {root.ByteArrayToHexStringWithPrefix()}"); - byte[] checkpointBytes = checkpoint.ByteArrayFromNumber(checkpoint.MinBytesFor()).PadLeft(32); root = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(root, checkpointBytes)); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs index e21982da..0102cfcb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs @@ -5,7 +5,6 @@ public abstract class Leaf public const string Signer = "signer"; public const string Subdigest = "subdigest"; public const string AnyAddressSubdigest = "any-address-subdigest"; - public const string Sapient = "sapient"; public const string SapientSigner = "sapient-signer"; public const string Nested = "nested"; public const string Node = "node"; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs index c4b9f1a0..5bd62574 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs @@ -13,7 +13,7 @@ public static implicit operator byte[](NodeLeaf leaf) public override object Parse() { - return Value.ByteArrayToHexString(); + return Value.ByteArrayToHexStringWithPrefix(); } public override byte[] Encode(bool noChainId, byte[] checkpointerData) @@ -26,7 +26,7 @@ public override byte[] Encode(bool noChainId, byte[] checkpointerData) // Since NodeLeaf doesn't have any properties to hash, we'll return a byte array public override byte[] HashConfiguration() { - return new byte[] { }; + return Value; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs index 44d7578a..b28096a9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs @@ -13,7 +13,7 @@ public override object Parse() return new { type = Subdigest, - digest = digest.ByteArrayToHexString() + digest = digest.ByteArrayToHexStringWithPrefix() }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index 76a65589..ba4dea56 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -128,11 +128,11 @@ public static Topology Decode(string input) return new Topology(new Node(Decode(list[0].ToString()), Decode(list[1].ToString()))); } - if (!input.StartsWith("{")) + if (input.StartsWith("0x")) { return new NodeLeaf { - Value = (input).HexStringToByteArray() + Value = input.HexStringToByteArray() }.ToTopology(); } @@ -172,7 +172,7 @@ public static Topology Decode(string input) threshold = BigInteger.Parse((string)data["threshold"]) }.ToTopology(); default: - throw new Exception("Invalid type in topology JSON"); + throw new Exception($"Invalid type {type} in topology JSON"); } } @@ -262,7 +262,7 @@ public static List ParseContentToLeafs(string elements) elements = elements.Substring(firstElement.Length).TrimStart(); } - else if (firstElementType == Leaf.Sapient) + else if (firstElementType == Leaf.SapientSigner) { var parts = firstElement.Split(':'); string imageHash = parts[1]; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs index eb4a155d..9e37d9a8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -18,19 +18,23 @@ public class RawSignature public string ToJson() { - var jsonObject = new + var jsonObject = new Dictionary(); + + jsonObject.Add("noChainId", noChainId); + + if (checkpointerData != null) + jsonObject.Add("checkpointerData", checkpointerData.ByteArrayToHexStringWithPrefix()); + + jsonObject.Add("configuration", new { - noChainId = noChainId, - checkpointerData = checkpointerData == null ? null : checkpointerData.ByteArrayToHexStringWithPrefix(), - configuration = new - { - threshold = configuration.threshold.ToString(), - checkpoint = configuration.checkpoint.ToString(), - topology = configuration.topology.Parse(), - checkpointer = configuration.checkpointer - }, - suffix = suffix == null ? null : suffix.Select(s => s.ToJson()), - }; + threshold = configuration.threshold.ToString(), + checkpoint = configuration.checkpoint.ToString(), + topology = configuration.topology.Parse(), + checkpointer = configuration.checkpointer + }); + + if (suffix is { Length: > 0 }) + jsonObject.Add("suffix", suffix.Select(s => s.ToJson())); return JsonConvert.SerializeObject(jsonObject); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs index bdb71e7b..974120f8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs @@ -215,6 +215,7 @@ public static (Topology[] nodes, byte[] Leftover) ParseBranch(byte[] signature) { byte[] nodeHash = signature[index..(index + 32)]; index += 32; + leafs.Add(new Topology(new NodeLeaf { Value = nodeHash @@ -333,7 +334,7 @@ public static (Topology[] nodes, byte[] Leftover) ParseBranch(byte[] signature) byte[] data = signature[index..(index + dataSize)]; index += dataSize; - leafs.Add(new Topology(new SignedSignerLeaf + leafs.Add(new Topology(new SignedSapientSignerLeaf { weight = new BigInteger(weight), signature = new SignatureOfSapientSignerLeaf From a57eaff49a10cccb48040656376c4cd6285ec4da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Sun, 29 Jun 2025 23:40:27 +0200 Subject: [PATCH 067/165] fix for sapient type --- .../SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs | 2 ++ .../SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs | 2 +- .../EcosystemWallet/Primitives/Signature/RawSignature.cs | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs index 0102cfcb..ba75baf1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs @@ -5,8 +5,10 @@ public abstract class Leaf public const string Signer = "signer"; public const string Subdigest = "subdigest"; public const string AnyAddressSubdigest = "any-address-subdigest"; + public const string Sapient = "sapient"; public const string SapientSigner = "sapient-signer"; public const string Nested = "nested"; + public const string UnrecoveredSigner = "unrecovered-signer"; public const string Node = "node"; public abstract object Parse(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index ba4dea56..e2875261 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -262,7 +262,7 @@ public static List ParseContentToLeafs(string elements) elements = elements.Substring(firstElement.Length).TrimStart(); } - else if (firstElementType == Leaf.SapientSigner) + else if (firstElementType == Leaf.Sapient) { var parts = firstElement.Split(':'); string imageHash = parts[1]; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs index 9e37d9a8..0ec83113 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -10,7 +10,7 @@ namespace Sequence.EcosystemWallet.Primitives { public class RawSignature { - public bool noChainId; + public bool noChainId = true; public byte[] checkpointerData; public Config configuration; public RawSignature[] suffix; From e9da413ea98e3b0b0adf94bd0568fa71353b45f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 30 Jun 2025 08:34:58 +0200 Subject: [PATCH 068/165] fixed encoding of chained signatures --- .../IntegrationTests/SignatureTests.cs | 7 +++++-- .../UnitTests/ConfigSignatureTests.cs | 6 ++++-- .../EcosystemWallet/Primitives/Config/Topology.cs | 2 +- .../Primitives/Signature/ChainedSignature.cs | 12 ++++++------ .../Primitives/Signature/RawSignature.cs | 2 +- .../EcosystemWallet/Utils/SignatureUtils.cs | 3 +-- 6 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs index 2579f482..c3e1690a 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs @@ -5,6 +5,7 @@ using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Utils; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.IntegrationTests { @@ -14,9 +15,11 @@ public Task SignatureEncode(Dictionary parameters) { var input = parameters["input"].ToString(); var signatures = parameters["signatures"].ToString(); - var chainId = !parameters.TryGetValue("chainId", out var chainIdValue) || (bool)chainIdValue; + var noChainId = !parameters.TryGetValue("chainId", out var chainIdValue) || !(bool)chainIdValue; + var checkpointerData = parameters.TryGetValue("checkpointerData", out var checkpointerDataValue) ? + checkpointerDataValue.ToString().HexStringToByteArray() : null; - return Task.FromResult(SignatureUtils.EncodeSignatureFromInput(input, signatures, !chainId)); + return Task.FromResult(SignatureUtils.EncodeSignatureFromInput(input, signatures, noChainId, checkpointerData)); } public Task SignatureDecode(Dictionary parameters) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs index 32c39787..e21b42ae 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs @@ -25,9 +25,11 @@ public void TestConfigSignature() var config = Primitives.Config.FromJson(input); var signatures = parameters["signatures"].ToString(); - var chainId = !parameters.TryGetValue("chainId", out var chainIdValue) || (bool)chainIdValue; + var noChainId = !parameters.TryGetValue("chainId", out var chainIdValue) || !(bool)chainIdValue; + var checkpointerData = parameters.TryGetValue("checkpointerData", out var checkpointerDataValue) ? + checkpointerDataValue.ToString().HexStringToByteArray() : null; - var encoded = SignatureUtils.EncodeSignatureFromInput(input, signatures, !chainId); + var encoded = SignatureUtils.EncodeSignatureFromInput(input, signatures, noChainId, checkpointerData); Debug.Log($"Encoded Signature {encoded}"); var encodedSignature = encoded.HexStringToByteArray(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index e2875261..cfc0287f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -188,7 +188,7 @@ public byte[] HashConfiguration() return Leaf.HashConfiguration(); } - public byte[] Encode(bool noChainId, byte[] checkpointerData) + public byte[] Encode(bool noChainId = true, byte[] checkpointerData = null) { if (IsNode()) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs index 5a975553..3e6acde0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs @@ -30,16 +30,15 @@ public byte[] Encode() if (sigForCheckpointer.configuration.checkpointer != null) { - output = sigForCheckpointer.configuration.checkpointer.Value.HexStringToByteArray().PadLeft(20).Concat(output).ToArray(); - output = ByteArrayExtensions.ConcatenateByteArrays( - sigForCheckpointer.configuration.checkpointer.Value.HexStringToByteArray().PadLeft(20), - output); + var checkpointer = sigForCheckpointer.configuration.checkpointer.Value.HexStringToByteArray().PadLeft(20); + output = ByteArrayExtensions.ConcatenateByteArrays(output, checkpointer); var checkpointerDataSize = sigForCheckpointer.checkpointerData?.Length ?? 0; if (checkpointerDataSize > 16777215) throw new Exception("Checkpointer data too large"); - output = ByteArrayExtensions.ConcatenateByteArrays(output, + output = ByteArrayExtensions.ConcatenateByteArrays(output, + checkpointerDataSize.ByteArrayFromNumber(3), sigForCheckpointer.checkpointerData ?? new byte[0]); } @@ -52,7 +51,8 @@ public byte[] Encode() if (encoded.Length > 16777215) throw new Exception("Chained signature too large"); - output = ByteArrayExtensions.ConcatenateByteArrays(output, encoded); + var encodedSize = encoded.Length.ByteArrayFromNumber(3); + output = ByteArrayExtensions.ConcatenateByteArrays(output, encodedSize, encoded); } return output; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs index 0ec83113..33b85092 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -48,7 +48,7 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd noChainId = this.noChainId, checkpointerData = this.checkpointerData, configuration = this.configuration, - erc6492 = this.erc6492 + erc6492 = null }; var chained = new List { head }; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs index 974120f8..e078f7a7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs @@ -4,13 +4,12 @@ using System.Numerics; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Utils { public static class SignatureUtils { - public static string EncodeSignatureFromInput(string input, string signatures, bool noChainId, byte[] checkpointerData = null) + public static string EncodeSignatureFromInput(string input, string signatures, bool noChainId, byte[] checkpointerData) { var parts = string.IsNullOrEmpty(signatures) ? Array.Empty() : From b464b0efb1ddd05ad67634e21a7e2feb462e8ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 30 Jun 2025 09:09:56 +0200 Subject: [PATCH 069/165] fixed sapient signatures --- .../Signature/SignatureOfSapientSignerLeaf.cs | 24 +++++++++++-------- .../EcosystemWallet/Utils/SignatureUtils.cs | 24 ++++++++----------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs index 5e6d7712..07639373 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives @@ -23,19 +22,24 @@ public override byte[] Encode(Leaf leaf) if (leaf is not SapientSignerLeaf signerLeaf) throw new Exception(); + var weight = signerLeaf.weight; var weightBytes = Array.Empty(); - var flag = (type == "sapient" ? Topology.FlagSignatureSapient : Topology.FlagSignatureSapientCompact) << 4; + + var flag = (type == "sapient" ? + Topology.FlagSignatureSapient : + Topology.FlagSignatureSapientCompact) + << 4; - var sizeLen = data.Length.MinBytesFor(); - if (sizeLen > 3) + var bytesForSignatureSize = data.Length.MinBytesFor(); + if (bytesForSignatureSize > 3) throw new Exception("Signature too large"); - flag |= sizeLen << 2; + flag |= bytesForSignatureSize << 2; - if (signerLeaf.weight <= 3 && signerLeaf.weight > 0) - flag |= (int)signerLeaf.weight; - else if (signerLeaf.weight <= 255) - weightBytes = signerLeaf.weight.ByteArrayFromNumber(signerLeaf.weight.MinBytesFor()); + if (weight <= 3 && weight > 0) + flag |= (int)weight; + else if (weight <= 255) + weightBytes = weight.ByteArrayFromNumber(weight.MinBytesFor()); else throw new Exception("Weight too large"); @@ -43,7 +47,7 @@ public override byte[] Encode(Leaf leaf) flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, address.Value.HexStringToByteArray(20), - data.Length.ByteArrayFromNumber(sizeLen), + data.Length.ByteArrayFromNumber(bytesForSignatureSize), data); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs index e078f7a7..31b921a3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs @@ -66,19 +66,8 @@ public static string EncodeSignatureFromInput(string input, string signatures, b } }; case "sapient": - return new SignatureOfSapientSignerLeaf - { - curType = SignatureOfSapientSignerLeaf.Type.sapient, - address = candidate.Address, - data = candidate.Values[0].HexStringToByteArray() - }; case "sapient_compact": - return new SignatureOfSapientSignerLeaf - { - curType = SignatureOfSapientSignerLeaf.Type.sapient_compact, - address = candidate.Address, - data = candidate.Values[0].HexStringToByteArray() - }; + throw new Exception($"Incorrect type {candidate.Type} for leaf {leaf.GetType()}"); default: throw new Exception($"Unsupported signature type: {candidate.Type}"); } @@ -93,16 +82,23 @@ public static string EncodeSignatureFromInput(string input, string signatures, b switch (candidate.Type) { case "sapient": + return new SignatureOfSapientSignerLeaf + { + curType = SignatureOfSapientSignerLeaf.Type.sapient, + address = candidate.Address, + data = candidate.Values[0].HexStringToByteArray() + }; case "sapient_compact": return new SignatureOfSapientSignerLeaf { + curType = SignatureOfSapientSignerLeaf.Type.sapient_compact, address = candidate.Address, - data = candidate.Values[0].HexStringToByteArray(), + data = candidate.Values[0].HexStringToByteArray() }; case "eth_sign": case "hash": case "erc1271": - throw new Exception($"Incorrect type for leaf"); + throw new Exception($"Incorrect type {candidate.Type} for leaf {leaf.GetType()}"); default: throw new Exception($"Unsupported signature type: {candidate.Type}"); } From 939488f21623c3a90e68f2d7a4f5af3a56b6a1d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 30 Jun 2025 14:54:13 +0200 Subject: [PATCH 070/165] started adding sessions topology and leafs --- .../EcosystemWallet/Primitives/Sessions.meta | 3 ++ .../Primitives/Sessions/IdentitySignerLeaf.cs | 12 +++++ .../Sessions/IdentitySignerLeaf.cs.meta | 3 ++ .../Sessions/ImplicitBlacklistLeaf.cs | 12 +++++ .../Sessions/ImplicitBlacklistLeaf.cs.meta | 3 ++ .../Primitives/Sessions/PermissionLeaf.cs | 10 ++++ .../Sessions/PermissionLeaf.cs.meta | 3 ++ .../Primitives/Sessions/SessionBranch.cs | 26 ++++++++++ .../Primitives/Sessions/SessionBranch.cs.meta | 3 ++ .../Primitives/Sessions/SessionLeaf.cs | 11 +++++ .../Primitives/Sessions/SessionLeaf.cs.meta | 3 ++ .../Primitives/Sessions/SessionNodeLeaf.cs | 12 +++++ .../Sessions/SessionNodeLeaf.cs.meta | 3 ++ .../Primitives/Sessions/SessionsTopology.cs | 47 +++++++++++++++++++ .../Sessions/SessionsTopology.cs.meta | 3 ++ 15 files changed, 154 insertions(+) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions.meta new file mode 100644 index 00000000..342b6895 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 72f8734ad7464142b27eb1d7aeab7763 +timeCreated: 1751286941 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs new file mode 100644 index 00000000..11af0449 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs @@ -0,0 +1,12 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public class IdentitySignerLeaf : SessionLeaf + { + public Address IdentitySigner; + + public override byte[] Encode() + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs.meta new file mode 100644 index 00000000..88fa29ed --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5eee5342bd534baf980785969a5c3817 +timeCreated: 1751287601 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs new file mode 100644 index 00000000..a118d153 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs @@ -0,0 +1,12 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public class ImplicitBlacklistLeaf : SessionLeaf + { + public Address[] Blacklist; + + public override byte[] Encode() + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs.meta new file mode 100644 index 00000000..874f123c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: dcc0ed43608a43e78e094ffef93276fc +timeCreated: 1751287568 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs new file mode 100644 index 00000000..1e09ee2d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs @@ -0,0 +1,10 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public class PermissionLeaf : SessionLeaf + { + public override byte[] Encode() + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs.meta new file mode 100644 index 00000000..c2a49c10 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8c8d92e38fa049069a75780e90042b12 +timeCreated: 1751287550 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs new file mode 100644 index 00000000..5a60ab0c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs @@ -0,0 +1,26 @@ +using System.Linq; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class SessionBranch + { + public SessionsTopology[] Children; + + public SessionBranch(SessionsTopology left, SessionsTopology right) + { + Children = new[] { left, right }; + } + + public SessionBranch(SessionsTopology[] children) + { + Children = children; + } + + public byte[] Encode() + { + var encodings = Children.Select(child => child.Encode()).ToArray(); + return ByteArrayExtensions.ConcatenateByteArrays(encodings); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs.meta new file mode 100644 index 00000000..20221a04 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ae7cd21e7d6042eab9a39444c67d6004 +timeCreated: 1751287124 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs new file mode 100644 index 00000000..cea49106 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs @@ -0,0 +1,11 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public abstract class SessionLeaf + { + public const string ImplicitBlacklistType = "implicit-blacklist"; + public const string IdentitySignerType = "identity-signer"; + public const string SessionPermissionsType = "session-permissions"; + + public abstract byte[] Encode(); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs.meta new file mode 100644 index 00000000..7b721da3 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5dda202330ab407f95316fa253a185d1 +timeCreated: 1751287064 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs new file mode 100644 index 00000000..3a58c96d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs @@ -0,0 +1,12 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public class SessionNodeLeaf : SessionLeaf + { + public byte[] Value; + + public override byte[] Encode() + { + return Value; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs.meta new file mode 100644 index 00000000..0b30b2a1 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9502deecea324e95aa0784587edebeca +timeCreated: 1751287728 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs new file mode 100644 index 00000000..abe8370c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -0,0 +1,47 @@ +using System; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class SessionsTopology + { + public const int FlagPermissions = 0; + public const int FlagNode = 1; + public const int FlagBranch = 2; + public const int FlagBlacklist = 3; + public const int FlagIdentitySigner = 4; + + public readonly SessionBranch Branch; + public readonly SessionLeaf Leaf; + + public bool IsBranch => Branch != null; + public bool IsLeaf => Leaf != null; + + public SessionsTopology(SessionBranch branch) + { + this.Branch = branch; + this.Leaf = null; + } + + public SessionsTopology(SessionLeaf leaf) + { + this.Branch = null; + this.Leaf = leaf; + } + + public byte[] Encode() + { + if (IsBranch) + return Branch.Encode(); + + if (IsLeaf) + return Leaf.Encode(); + + throw new Exception("Invalid topology."); + } + + public static SessionsTopology Decode(string input) + { + return new SessionsTopology(new IdentitySignerLeaf()); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs.meta new file mode 100644 index 00000000..bc5022d3 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 690b46a16a3b4e378e527a067dcf86c8 +timeCreated: 1751286953 \ No newline at end of file From 4b16a497078f96572e8bfc9af104ce2c276c78fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 30 Jun 2025 15:02:35 +0200 Subject: [PATCH 071/165] started adding session tests --- .../IntegrationTests/Server/Server.cs | 13 +++++ .../IntegrationTests/SessionsTest.cs | 51 +++++++++++++++++++ .../IntegrationTests/SessionsTest.cs.meta | 3 ++ 3 files changed, 67 insertions(+) create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs index 21465382..2e256b94 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs @@ -15,18 +15,31 @@ internal class Server public static readonly Dictionary, Task>> Methods = new Dictionary, Task>> { + // PAYLOAD ["payload_toAbi"] = async (parameters) => await new PayloadTests().PayloadToAbi(parameters), ["payload_toPacked"] = async (parameters) => await new PayloadTests().PayloadToPacked(parameters), ["payload_toJson"] = async (parameters) => await new PayloadTests().PayloadToJson(parameters), ["payload_hashFor"] = async (parameters) => await new PayloadTests().PayloadHashFor(parameters), + // CONFIG ["config_new"] = async (parameters) => await new ConfigTests().ConfigNew(parameters), ["config_encode"] = async (parameters) => await new ConfigTests().ConfigEncode(parameters), ["config_imageHash"] = async (parameters) => await new ConfigTests().ConfigImageHash(parameters), + // DEV TOOLS ["devTools_randomConfig"] = async (parameters) => await new DevToolsTest().DevToolsRandomConfig(parameters), ["devTools_randomSessionTopology"] = async (parameters) => await new DevToolsTest().DevToolsRandomSessionTopology(parameters), + // SIGNATURE ["signature_encode"] = async (parameters) => await new SignatureTests().SignatureEncode(parameters), ["signature_concat"] = async (parameters) => await new SignatureTests().SignatureConcat(parameters), ["signature_decode"] = async (parameters) => await new SignatureTests().SignatureDecode(parameters), + // SESSIONS + ["session_empty"] = async (parameters) => await new SessionsTest().SessionEmpty(parameters), + ["session_encodeTopology"] = async (parameters) => await new SessionsTest().SessionEncodeTopology(parameters), + ["session_encodeCallSignatures"] = async (parameters) => await new SessionsTest().SessionEncodeCallSignatures(parameters), + ["session_imageHash"] = async (parameters) => await new SessionsTest().SessionImageHash(parameters), + ["session_explicit_add"] = async (parameters) => await new SessionsTest().SessionExplicitAdd(parameters), + ["session_explicit_remove"] = async (parameters) => await new SessionsTest().SessionExplicitRemove(parameters), + ["session_implicit_addBlacklistAddress"] = async (parameters) => await new SessionsTest().SessionImplicitAddBlacklistAddress(parameters), + ["session_implicit_removeBlacklistAddress"] = async (parameters) => await new SessionsTest().SessionImplicitRemoveBlacklistAddress(parameters), }; public async Task HandleSingleRequest( diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs new file mode 100644 index 00000000..9b52ed24 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public class SessionsTest + { + public Task SessionEmpty(Dictionary parameters) + { + var identitySigner = parameters["identitySigner"].ToString(); + + return Task.FromResult(identitySigner); + } + + public Task SessionEncodeTopology(Dictionary parameters) + { + throw new NotImplementedException(); + } + + public Task SessionEncodeCallSignatures(Dictionary parameters) + { + throw new NotImplementedException(); + } + + public Task SessionImageHash(Dictionary parameters) + { + throw new NotImplementedException(); + } + + public Task SessionExplicitAdd(Dictionary parameters) + { + throw new NotImplementedException(); + } + + public Task SessionExplicitRemove(Dictionary parameters) + { + throw new NotImplementedException(); + } + + public Task SessionImplicitAddBlacklistAddress(Dictionary parameters) + { + throw new NotImplementedException(); + } + + public Task SessionImplicitRemoveBlacklistAddress(Dictionary parameters) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs.meta new file mode 100644 index 00000000..bae40abc --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 805675a795e945c3b1312d9c8911b573 +timeCreated: 1751288157 \ No newline at end of file From 0fe11a1286de149d5e76d407b4292a613d389d08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 30 Jun 2025 17:11:15 +0200 Subject: [PATCH 072/165] parsing sessions topology to json --- .../IntegrationTests/SessionsTest.cs | 8 ++- .../Primitives/Sessions/IdentitySignerLeaf.cs | 11 +++- .../Sessions/ImplicitBlacklistLeaf.cs | 11 +++- .../Primitives/Sessions/PermissionLeaf.cs | 8 +++ .../Primitives/Sessions/SessionBranch.cs | 11 ++++ .../Primitives/Sessions/SessionLeaf.cs | 6 ++ .../Primitives/Sessions/SessionNodeLeaf.cs | 9 ++- .../Primitives/Sessions/SessionsTopology.cs | 59 ++++++++++++++++++- 8 files changed, 117 insertions(+), 6 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs index 9b52ed24..147236d7 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; namespace Sequence.EcosystemWallet.IntegrationTests { @@ -15,7 +17,11 @@ public Task SessionEmpty(Dictionary parameters) public Task SessionEncodeTopology(Dictionary parameters) { - throw new NotImplementedException(); + var topologyJson = parameters["sessionTopology"].ToString(); + var topology = SessionsTopology.FromJson(topologyJson); + var encoded = topology.Encode().ByteArrayToHexStringWithPrefix(); + + return Task.FromResult(encoded); } public Task SessionEncodeCallSignatures(Dictionary parameters) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs index 11af0449..1673e854 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs @@ -3,7 +3,16 @@ namespace Sequence.EcosystemWallet.Primitives public class IdentitySignerLeaf : SessionLeaf { public Address IdentitySigner; - + + public override object ToJson() + { + return new + { + type = IdentitySignerType, + identitySigner = IdentitySigner, + }; + } + public override byte[] Encode() { throw new System.NotImplementedException(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs index a118d153..abfc3b0e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs @@ -3,7 +3,16 @@ namespace Sequence.EcosystemWallet.Primitives public class ImplicitBlacklistLeaf : SessionLeaf { public Address[] Blacklist; - + + public override object ToJson() + { + return new + { + type = ImplicitBlacklistType, + blacklist = Blacklist, + }; + } + public override byte[] Encode() { throw new System.NotImplementedException(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs index 1e09ee2d..4349c5ed 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs @@ -2,6 +2,14 @@ namespace Sequence.EcosystemWallet.Primitives { public class PermissionLeaf : SessionLeaf { + public override object ToJson() + { + return new + { + type = SessionPermissionsType + }; + } + public override byte[] Encode() { throw new System.NotImplementedException(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs index 5a60ab0c..ba160f7d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs @@ -1,4 +1,5 @@ using System.Linq; +using Newtonsoft.Json; using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives @@ -17,10 +18,20 @@ public SessionBranch(SessionsTopology[] children) Children = children; } + public object ToJson() + { + return Children.Select(child => child.ToJson()).ToArray(); + } + public byte[] Encode() { var encodings = Children.Select(child => child.Encode()).ToArray(); return ByteArrayExtensions.ConcatenateByteArrays(encodings); } + + public SessionsTopology ToTopology() + { + return new SessionsTopology(this); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs index cea49106..887fe2f8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs @@ -6,6 +6,12 @@ public abstract class SessionLeaf public const string IdentitySignerType = "identity-signer"; public const string SessionPermissionsType = "session-permissions"; + public abstract object ToJson(); public abstract byte[] Encode(); + + public SessionsTopology ToTopology() + { + return new SessionsTopology(this); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs index 3a58c96d..cef1b13c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs @@ -1,9 +1,16 @@ +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { public class SessionNodeLeaf : SessionLeaf { public byte[] Value; - + + public override object ToJson() + { + return Value.ByteArrayToHexStringWithPrefix(); + } + public override byte[] Encode() { return Value; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index abe8370c..7b05db5e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -1,4 +1,8 @@ using System; +using System.Collections.Generic; +using System.Linq; +using Sequence.Utils; +using Unity.Plastic.Newtonsoft.Json; namespace Sequence.EcosystemWallet.Primitives { @@ -28,6 +32,17 @@ public SessionsTopology(SessionLeaf leaf) this.Leaf = leaf; } + public object ToJson() + { + if (IsBranch) + return Branch.ToJson(); + + if (IsLeaf) + return Leaf.ToJson(); + + throw new Exception("Invalid topology."); + } + public byte[] Encode() { if (IsBranch) @@ -39,9 +54,49 @@ public byte[] Encode() throw new Exception("Invalid topology."); } - public static SessionsTopology Decode(string input) + public static SessionsTopology FromJson(string json) { - return new SessionsTopology(new IdentitySignerLeaf()); + if (json.StartsWith("[")) + { + var list = JsonConvert.DeserializeObject>(json); + if (list.Count < 2) + throw new Exception("Invalid node structure in JSON"); + + var children = list.Select(i => FromJson(i.ToString())).ToArray(); + return new SessionBranch(children).ToTopology(); + } + + if (json.StartsWith("0x")) + { + return new SessionNodeLeaf + { + Value = json.HexStringToByteArray() + }.ToTopology(); + } + + var data = JsonConvert.DeserializeObject>(json); + var type = (string)data["type"]; + + switch (type) + { + case SessionLeaf.SessionPermissionsType: + return new PermissionLeaf + { + + }.ToTopology(); + case SessionLeaf.IdentitySignerType: + return new IdentitySignerLeaf + { + IdentitySigner = new Address("") + }.ToTopology(); + case SessionLeaf.ImplicitBlacklistType: + return new ImplicitBlacklistLeaf + { + Blacklist = new[] { new Address("") } + }.ToTopology(); + default: + throw new Exception("Invalid topology."); + } } } } \ No newline at end of file From dfb7bec08ceaca1da6731d9e0a1945075e0a8f68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 30 Jun 2025 19:52:54 +0200 Subject: [PATCH 073/165] parsing session permissions --- .../IntegrationTests/SessionsTest.cs | 4 ++- .../UnitTests/ConfigSignatureTests.cs | 2 +- .../UnitTests/SessionsUnitTests.cs | 24 +++++++++++++++ .../UnitTests/SessionsUnitTests.cs.meta | 3 ++ .../EcosystemWallet/Utils/SessionsUtils.cs | 22 ++++++++++++++ .../Utils/SessionsUtils.cs.meta | 3 ++ .../Primitives/Sessions/IdentitySignerLeaf.cs | 10 +++++-- .../Sessions/ImplicitBlacklistLeaf.cs | 29 +++++++++++++++++-- .../Primitives/Sessions/PermissionLeaf.cs | 13 +++++++-- .../Primitives/Sessions/SessionBranch.cs | 12 +++++++- .../Primitives/Sessions/SessionNodeLeaf.cs | 3 +- .../Primitives/Sessions/SessionsTopology.cs | 21 ++++++++++++-- 12 files changed, 131 insertions(+), 15 deletions(-) create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/Utils/SessionsUtils.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/Utils/SessionsUtils.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs index 147236d7..a75f577f 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using Sequence.EcosystemWallet.Primitives; +using Sequence.EcosystemWallet.UnitTests; using Sequence.Utils; namespace Sequence.EcosystemWallet.IntegrationTests @@ -11,8 +12,9 @@ public class SessionsTest public Task SessionEmpty(Dictionary parameters) { var identitySigner = parameters["identitySigner"].ToString(); + var topology = SessionsUtils.CreateSessionsTopologyWithSingleIdentity(identitySigner); - return Task.FromResult(identitySigner); + return Task.FromResult(topology.JsonSerialize()); } public Task SessionEncodeTopology(Dictionary parameters) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs index e21b42ae..2d60ae8e 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs @@ -9,7 +9,7 @@ namespace Sequence.EcosystemWallet.UnitTests { - public class TConfigSignatureTests + public class ConfigSignatureTests { private const string ConfigInput = "{\"input\":{\"threshold\":\"2\",\"checkpoint\":\"22850\",\"topology\":{\"type\":\"signer\",\"address\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D\",\"weight\":\"2\"},\"checkpointer\":\"0x0000000000000000000000000000000000001bE9\"},\"signatures\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D:hash:0x13a31d1a2ec622361e3285cc7377bb05ad8a7ee7db48551f9d94e5036a1306de:0x1d615daff8918cd9180a9ac57c6dd590beb8d567b4ad8ecc4ca7b05296895916:27\",\"chainId\":true,\"checkpointerData\":\"0x000000000000000000000000000000000000000000000000000000000001a12a\"}"; diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs new file mode 100644 index 00000000..347ffa7e --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs @@ -0,0 +1,24 @@ +using NUnit.Framework; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet.UnitTests +{ + public class SessionsUnitTests + { + [TestCase("0x8312fc6754389018bdD3BDfEFf226DD8eD9EcdB1")] + public void TestSessionEncoding(string identitySigner) + { + var topology = SessionsUtils.CreateSessionsTopologyWithSingleIdentity(identitySigner); + var encoded = topology.Encode().ByteArrayToHexStringWithPrefix(); + Debug.Log($"Encoded Sessions Topology: {encoded}"); + + Debug.Log($"Sessions Topology: {topology.JsonSerialize()}"); + + var newTopology = SessionsTopology.FromJson(topology.JsonSerialize()); + + Assert.AreEqual(topology.JsonSerialize(), newTopology.JsonSerialize()); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs.meta new file mode 100644 index 00000000..dd24de75 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 21e26cef4dc442d1ba7d10cdb4cb4e90 +timeCreated: 1751302112 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/Utils/SessionsUtils.cs b/Assets/SequenceSDK/EcosystemWallet/Utils/SessionsUtils.cs new file mode 100644 index 00000000..c5b80f5d --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/Utils/SessionsUtils.cs @@ -0,0 +1,22 @@ +using System; +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.UnitTests +{ + public static class SessionsUtils + { + public static SessionsTopology CreateSessionsTopologyWithSingleIdentity(string identitySigner) + { + return new SessionsTopology(new SessionBranch( + new ImplicitBlacklistLeaf + { + blacklist = Array.Empty
() + }.ToTopology(), + new IdentitySignerLeaf + { + identitySigner = new Address(identitySigner) + }.ToTopology()) + ); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/Utils/SessionsUtils.cs.meta b/Assets/SequenceSDK/EcosystemWallet/Utils/SessionsUtils.cs.meta new file mode 100644 index 00000000..a32b9673 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/Utils/SessionsUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2a84bde3e0574ac8b3577e2d7806baf3 +timeCreated: 1751302493 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs index 1673e854..1b654d3b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs @@ -1,21 +1,25 @@ +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { public class IdentitySignerLeaf : SessionLeaf { - public Address IdentitySigner; + public Address identitySigner; public override object ToJson() { return new { type = IdentitySignerType, - identitySigner = IdentitySigner, + identitySigner = identitySigner.Value, }; } public override byte[] Encode() { - throw new System.NotImplementedException(); + var flag = SessionsTopology.FlagIdentitySigner << 4; + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), + identitySigner.Value.HexStringToByteArray()); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs index abfc3b0e..e24c28ca 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs @@ -1,21 +1,44 @@ +using System; +using System.Linq; +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { public class ImplicitBlacklistLeaf : SessionLeaf { - public Address[] Blacklist; + public Address[] blacklist; public override object ToJson() { return new { type = ImplicitBlacklistType, - blacklist = Blacklist, + blacklist = blacklist, }; } public override byte[] Encode() { - throw new System.NotImplementedException(); + var encoded = ByteArrayExtensions.ConcatenateByteArrays(blacklist + .Select(hex => hex.Value.HexStringToByteArray()) + .ToArray()); + + var count = blacklist.Length; + if (count >= 0x0f) + { + if (count > 0xffff) + throw new Exception("Blacklist too large"); + + var flag = (SessionsTopology.FlagBlacklist << 4) | 0x0f; + return ByteArrayExtensions.ConcatenateByteArrays( + flag.ByteArrayFromNumber(flag.MinBytesFor()), + count.ByteArrayFromNumber(2), + encoded + ); + } + + var flagByte = (SessionsTopology.FlagBlacklist << 4) | count; + return ByteArrayExtensions.ConcatenateByteArrays(flagByte.ByteArrayFromNumber(flagByte.MinBytesFor()), encoded); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs index 4349c5ed..b75c106f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs @@ -1,18 +1,27 @@ +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { public class PermissionLeaf : SessionLeaf { + public SessionPermissions permissions; + public override object ToJson() { return new { - type = SessionPermissionsType + type = SessionPermissionsType, + signer = permissions.signer, + valueLimit = permissions.valueLimit, + deadline = permissions.deadline, + permissions = permissions.permissions, }; } public override byte[] Encode() { - throw new System.NotImplementedException(); + var flag = SessionsTopology.FlagPermissions << 4; + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), permissions.Encode()); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs index ba160f7d..bd9ece0d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs @@ -1,3 +1,4 @@ +using System; using System.Linq; using Newtonsoft.Json; using Sequence.Utils; @@ -26,7 +27,16 @@ public object ToJson() public byte[] Encode() { var encodings = Children.Select(child => child.Encode()).ToArray(); - return ByteArrayExtensions.ConcatenateByteArrays(encodings); + var encoded = ByteArrayExtensions.ConcatenateByteArrays(encodings); + var encodedSize = encoded.Length.MinBytesFor(); + if (encodedSize > 15) + throw new Exception("Session Branch is too large."); + + var flag = (SessionsTopology.FlagBranch << 4) | encodedSize; + return ByteArrayExtensions.ConcatenateByteArrays( + flag.ByteArrayFromNumber(flag.MinBytesFor()), + encodedSize.ByteArrayFromNumber(encodedSize), + encoded); } public SessionsTopology ToTopology() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs index cef1b13c..11b7bdb5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs @@ -13,7 +13,8 @@ public override object ToJson() public override byte[] Encode() { - return Value; + var flag = SessionsTopology.FlagNode << 4; + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), Value); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index 7b05db5e..36e648df 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Numerics; using Sequence.Utils; using Unity.Plastic.Newtonsoft.Json; @@ -32,6 +33,11 @@ public SessionsTopology(SessionLeaf leaf) this.Leaf = leaf; } + public string JsonSerialize() + { + return JsonConvert.SerializeObject(ToJson()); + } + public object ToJson() { if (IsBranch) @@ -82,17 +88,26 @@ public static SessionsTopology FromJson(string json) case SessionLeaf.SessionPermissionsType: return new PermissionLeaf { - + permissions = + { + signer = new Address((string)data["signer"]), + valueLimit = (BigInteger)data["valueLimit"], + deadline = (BigInteger)data["deadline"], + permissions = JsonConvert.DeserializeObject(data["permissions"].ToString()) + } }.ToTopology(); case SessionLeaf.IdentitySignerType: + var identitySigner = data["identitySigner"].ToString(); return new IdentitySignerLeaf { - IdentitySigner = new Address("") + identitySigner = new Address(identitySigner) }.ToTopology(); case SessionLeaf.ImplicitBlacklistType: + var blacklistJson = data["blacklist"].ToString(); + var blacklist = JsonConvert.DeserializeObject(blacklistJson); return new ImplicitBlacklistLeaf { - Blacklist = new[] { new Address("") } + blacklist = blacklist }.ToTopology(); default: throw new Exception("Invalid topology."); From 95f506b4785e80e1c0753f65bab1dc4a16b88253 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 30 Jun 2025 20:35:41 +0200 Subject: [PATCH 074/165] parsing permissions from json, test to add explicit session --- .../IntegrationTests/SessionsTest.cs | 13 +++++- .../UnitTests/SessionsUnitTests.cs | 21 ++++++++++ .../Primitives/Permission/ParameterRule.cs | 26 ++++++++++++ .../Primitives/Permission/Permission.cs | 23 +++++++++++ .../Permission/SessionPermissions.cs | 19 +++++++++ .../Primitives/Sessions/PermissionLeaf.cs | 10 +---- .../Primitives/Sessions/SessionsTopology.cs | 40 +++++++++++++++++-- 7 files changed, 139 insertions(+), 13 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs index a75f577f..098518db 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs @@ -38,7 +38,18 @@ public Task SessionImageHash(Dictionary parameters) public Task SessionExplicitAdd(Dictionary parameters) { - throw new NotImplementedException(); + var explicitSessionJson = parameters["explicitSession"].ToString(); + var sessionTopologyJson = parameters["sessionTopology"].ToString(); + + var explicitSession = SessionPermissions.FromJson(explicitSessionJson); + var sessionTopology = SessionsTopology.FromJson(sessionTopologyJson); + + var existingPermission = sessionTopology.FindPermissions(explicitSession.signer); + if (existingPermission != null) + throw new Exception("Session already exists."); + + var newTopology = sessionTopology.AddExplicitSession(explicitSession); + return Task.FromResult(newTopology.JsonSerialize()); } public Task SessionExplicitRemove(Dictionary parameters) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs index 347ffa7e..212fe503 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs @@ -1,3 +1,6 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; using NUnit.Framework; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; @@ -20,5 +23,23 @@ public void TestSessionEncoding(string identitySigner) Assert.AreEqual(topology.JsonSerialize(), newTopology.JsonSerialize()); } + + [TestCase("{\"explicitSession\":{\"signer\":\"0x00000000000000000000000000000000000025a8\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},\"sessionTopology\":[{\"type\":\"implicit-blacklist\",\"blacklist\":[]},{\"type\":\"identity-signer\",\"identitySigner\":\"0x8312fc6754389018bdD3BDfEFf226DD8eD9EcdB1\"}]}")] + public void TestAddExplicitSession(string inputJson) + { + var input = JsonConvert.DeserializeObject>(inputJson); + var explicitSessionJson = input["explicitSession"].ToString(); + var sessionTopologyJson = input["sessionTopology"].ToString(); + + var explicitSession = SessionPermissions.FromJson(explicitSessionJson); + var sessionTopology = SessionsTopology.FromJson(sessionTopologyJson); + + var existingPermission = sessionTopology.FindPermissions(explicitSession.signer); + if (existingPermission != null) + throw new Exception("Session already exists."); + + var newTopology = sessionTopology.AddExplicitSession(explicitSession); + Debug.Log($"{newTopology.JsonSerialize()}"); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs index 02700d6a..f0ba6ebd 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Numerics; using Sequence.Utils; +using Unity.Plastic.Newtonsoft.Json; namespace Sequence.EcosystemWallet.Primitives { @@ -14,6 +15,18 @@ public class ParameterRule public BigInteger offset; public byte[] mask; + public object ToJson() + { + return new + { + cumulative = cumulative, + operation = operation, + value = value.ByteArrayToHexStringWithPrefix(), + offset = offset.ToString(), + mask = mask.ByteArrayToHexStringWithPrefix() + }; + } + public byte[] Encode() { byte operationCumulative = (byte)(((byte)operation << 1) | (cumulative ? 1 : 0)); @@ -23,6 +36,19 @@ public byte[] Encode() result.AddRange(mask.PadLeft(32)); return result.ToArray(); } + + public static ParameterRule FromJson(string json) + { + var data = JsonConvert.DeserializeObject>(json); + return new() + { + cumulative = (bool)data["cumulative"], + operation = (ParameterOperation)data["operation"], + value = data["value"].ToString().HexStringToByteArray(), + offset = BigInteger.Parse(data["offset"].ToString()), + mask = data["mask"].ToString().HexStringToByteArray() + }; + } public static ParameterRule Decode(byte[] data) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs index 153bfec9..970a7ad9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives @@ -13,6 +15,15 @@ public class Permission public Address target; public ParameterRule[] rules; + public object ToJson() + { + return new + { + target = target.Value, + rules = rules.Select(rule => rule.ToJson()).ToArray(), + }; + } + public byte[] Encode() { if (rules.Length > MAX_RULES_COUNT) { @@ -30,6 +41,18 @@ public byte[] Encode() return result.ToArray(); } + public static Permission FromJson(string json) + { + var data = JsonConvert.DeserializeObject>(json); + return new() + { + target = new Address((string)data["target"]), + rules = JsonConvert.DeserializeObject>((string)data["rules"]) + .Select(r => ParameterRule.FromJson(r.ToString())) + .ToArray(), + }; + } + public static (Permission Permission, int Consumed) Decode(byte[] data, int offset) { if (data.Length < offset + 21) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs index 1cecd13c..6b8fc985 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Numerics; +using Newtonsoft.Json; using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives @@ -13,6 +15,18 @@ public class SessionPermissions public BigInteger deadline; public Permission[] permissions; + public object ToJson() + { + return new + { + type = SessionLeaf.SessionPermissionsType, + signer = signer.Value, + valueLimit = valueLimit.ToString(), + deadline = deadline.ToString(), + permissions = permissions.Select(permission => permission.ToJson()).ToArray() + }; + } + public byte[] Encode() { if (permissions.Length > Permission.MAX_PERMISSIONS_COUNT) { @@ -68,5 +82,10 @@ public static SessionPermissions Decode(byte[] data) permissions = permissions }; } + + public static SessionPermissions FromJson(string json) + { + return JsonConvert.DeserializeObject(json); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs index b75c106f..6b34a11a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs @@ -1,3 +1,4 @@ +using System.Linq; using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives @@ -8,14 +9,7 @@ public class PermissionLeaf : SessionLeaf public override object ToJson() { - return new - { - type = SessionPermissionsType, - signer = permissions.signer, - valueLimit = permissions.valueLimit, - deadline = permissions.deadline, - permissions = permissions.permissions, - }; + return permissions.ToJson(); } public override byte[] Encode() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index 36e648df..3cbbf30d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; +using NUnit.Framework; using Sequence.Utils; using Unity.Plastic.Newtonsoft.Json; @@ -60,6 +61,35 @@ public byte[] Encode() throw new Exception("Invalid topology."); } + public SessionPermissions FindPermissions(Address signer) + { + if (Leaf is PermissionLeaf permissionLeaf && permissionLeaf.permissions.signer.Equals(signer)) + return permissionLeaf.permissions; + + if (!IsBranch) + return null; + + return Branch.Children.Select(child => + child.FindPermissions(signer)).FirstOrDefault(permissions => permissions != null); + } + + public SessionsTopology AddExplicitSession(SessionPermissions session) + { + var existingPermission = FindPermissions(session.signer); + if (existingPermission != null) + throw new Exception("Session already exists."); + + return MergeSessionsTopologies(this, new PermissionLeaf + { + permissions = session + }.ToTopology()); + } + + public static SessionsTopology MergeSessionsTopologies(SessionsTopology a, SessionsTopology b) + { + return new SessionsTopology(new SessionBranch(a, b)); + } + public static SessionsTopology FromJson(string json) { if (json.StartsWith("[")) @@ -88,12 +118,14 @@ public static SessionsTopology FromJson(string json) case SessionLeaf.SessionPermissionsType: return new PermissionLeaf { - permissions = + permissions = new() { signer = new Address((string)data["signer"]), - valueLimit = (BigInteger)data["valueLimit"], - deadline = (BigInteger)data["deadline"], - permissions = JsonConvert.DeserializeObject(data["permissions"].ToString()) + valueLimit = BigInteger.Parse((string)data["valueLimit"]), + deadline = BigInteger.Parse((string)data["deadline"]), + permissions = JsonConvert.DeserializeObject>(data["permissions"].ToString()) + .Select(i => Permission.FromJson(i.ToString())) + .ToArray() } }.ToTopology(); case SessionLeaf.IdentitySignerType: From cce53b7755fe66311e086af624ef7352fc1a418b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 30 Jun 2025 22:32:41 +0200 Subject: [PATCH 075/165] adding blacklist address --- .../IntegrationTests/Server/Server.cs | 31 ++----------- .../IntegrationTests/SessionsTest.cs | 12 ++++- .../UnitTests/SessionsUnitTests.cs | 30 +++++++++++- .../Sessions/ImplicitBlacklistLeaf.cs | 2 +- .../Primitives/Sessions/SessionsTopology.cs | 46 +++++++++++++++---- 5 files changed, 83 insertions(+), 38 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs index 2e256b94..f99b0b25 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs @@ -54,12 +54,7 @@ public async Task HandleSingleRequest( if (!silent) { - Debug.Log($"[{DateTime.UtcNow:O}] Processing request: method={method} id={id}"); - } - - if (debug && !silent) - { - Debug.Log("Request details: " + JsonConvert.SerializeObject(rpcRequest, Formatting.Indented)); + Debug.Log($"Processing request: method={method} id={id} payload={JsonConvert.SerializeObject(rpcRequest, Formatting.Indented)}"); } if (jsonrpc != "2.0") @@ -68,7 +63,7 @@ public async Task HandleSingleRequest( new JsonRpcErrorResponse(new JsonRpcErrorResponse.Error(-32600, "Invalid JSON-RPC version"), id); if (!silent) { - Debug.LogError($"[{DateTime.UtcNow:O}] Error response: {(debug ? JsonConvert.SerializeObject(error) : error.error.message)}"); + Debug.LogError($"Error response: {(debug ? JsonConvert.SerializeObject(error) : error.error.message)}"); } return error; @@ -79,7 +74,7 @@ public async Task HandleSingleRequest( JsonRpcErrorResponse error = new JsonRpcErrorResponse(new JsonRpcErrorResponse.Error(-32601, $"Method not found: {method}"), id); if (!silent) { - Debug.LogError($"[{DateTime.UtcNow:O}] Error response: {(debug ? JsonConvert.SerializeObject(error) : error.error.message)}"); + Debug.LogError($"Error response: {(debug ? JsonConvert.SerializeObject(error) : error.error.message)}"); } return error; } @@ -87,13 +82,6 @@ public async Task HandleSingleRequest( try { Dictionary methodParams; - - if (debug && !silent) - { - Debug.Log($"[{DateTime.UtcNow:O}] Raw params: {JsonConvert.SerializeObject(@params)}"); - } - - // Convert params to JObject for more flexible parsing if needed Newtonsoft.Json.Linq.JObject paramsJObject = null; if (@params is Dictionary paramsDict) { @@ -111,20 +99,11 @@ public async Task HandleSingleRequest( Debug.LogWarning("No method params"); } - if (debug && !silent) - { - Debug.Log($"[{DateTime.UtcNow:O}] Final methodParams: {JsonConvert.SerializeObject(methodParams)}"); - } - var result = await Methods[method](methodParams); JsonRpcSuccessResponse response = new JsonRpcSuccessResponse(result, id); if (!silent) { - Debug.Log($"[{DateTime.UtcNow:O}] Success Response for Method={method} id={id}"); - if (debug) - { - Debug.Log($"Response details for Method={method}: " + JsonConvert.SerializeObject(response, Formatting.Indented) + $", Params used = {JsonConvert.SerializeObject(methodParams)}"); - } + Debug.Log($"Response details for Method={method}: " + JsonConvert.SerializeObject(response, Formatting.Indented) + $", Params used = {JsonConvert.SerializeObject(methodParams)}"); } return response; } @@ -133,7 +112,7 @@ public async Task HandleSingleRequest( JsonRpcErrorResponse error = new JsonRpcErrorResponse(new JsonRpcErrorResponse.Error(-32000, $"Unknown error: {ex.Message}"), id); if (!silent) { - Debug.LogError($"[{DateTime.UtcNow:O}] Error response: {(debug ? JsonConvert.SerializeObject(error) : error.error.message)} {ex.StackTrace}"); + Debug.LogError($"Error response: {(debug ? JsonConvert.SerializeObject(error) : error.error.message)} {ex.StackTrace}"); } return error; } diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs index 098518db..e9a94cd2 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs @@ -44,7 +44,9 @@ public Task SessionExplicitAdd(Dictionary parameters) var explicitSession = SessionPermissions.FromJson(explicitSessionJson); var sessionTopology = SessionsTopology.FromJson(sessionTopologyJson); - var existingPermission = sessionTopology.FindPermissions(explicitSession.signer); + var existingPermission = sessionTopology.FindLeaf(leaf => + leaf.permissions.signer.Equals(explicitSession.signer)); + if (existingPermission != null) throw new Exception("Session already exists."); @@ -59,7 +61,13 @@ public Task SessionExplicitRemove(Dictionary parameters) public Task SessionImplicitAddBlacklistAddress(Dictionary parameters) { - throw new NotImplementedException(); + var blacklistAddress = new Address((string)parameters["blacklistAddress"]); + var sessionTopologyJson = parameters["sessionTopology"].ToString(); + + var sessionsTopology = SessionsTopology.FromJson(sessionTopologyJson); + sessionsTopology.AddToImplicitBlacklist(blacklistAddress); + + return Task.FromResult(sessionsTopology.JsonSerialize()); } public Task SessionImplicitRemoveBlacklistAddress(Dictionary parameters) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs index 212fe503..336b1309 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs @@ -34,12 +34,40 @@ public void TestAddExplicitSession(string inputJson) var explicitSession = SessionPermissions.FromJson(explicitSessionJson); var sessionTopology = SessionsTopology.FromJson(sessionTopologyJson); - var existingPermission = sessionTopology.FindPermissions(explicitSession.signer); + var existingPermission = sessionTopology.FindLeaf(leaf => + leaf.permissions.signer.Equals(explicitSession.signer)); + if (existingPermission != null) throw new Exception("Session already exists."); var newTopology = sessionTopology.AddExplicitSession(explicitSession); Debug.Log($"{newTopology.JsonSerialize()}"); } + + [TestCase("{\"sessionTopology\":[[[[[[[[[[[[[[[[[[[[[{\"type\":\"implicit-blacklist\",\"blacklist\":[]},{\"type\":\"identity-signer\",\"identitySigner\":\"0x8312fc6754389018bdD3BDfEFf226DD8eD9EcdB1\"}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000025a8\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000009CD\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002AA7\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000026eB\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000001F8C\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000435E\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000026e\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000133b\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002B44\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000004C\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002015\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000000E9\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003Ec4\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000002eF\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003703\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003dEB\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000057Eb\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000000373\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000002be\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000001EA6\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],\"blacklistAddress\":\"0x0000000000000000000000000000000000000269\"}")] + public void AddBlacklistAddress(string inputJson) + { + var input = JsonConvert.DeserializeObject>(inputJson); + var blacklistAddress = new Address((string)input["blacklistAddress"]); + var sessionTopologyJson = input["sessionTopology"].ToString(); + + var sessionsTopology = SessionsTopology.FromJson(sessionTopologyJson); + sessionsTopology.AddToImplicitBlacklist(blacklistAddress); + + Debug.Log($"{sessionsTopology.JsonSerialize()}"); + } + + [TestCase("{\"sessionTopology\":[[[[[[[[[[[[[[[[[[[[[{\"type\":\"implicit-blacklist\",\"blacklist\":[\"0x0000000000000000000000000000000000000269\",\"0x000000000000000000000000000000000000289C\",\"0x00000000000000000000000000000000000019c7\",\"0x0000000000000000000000000000000000000120\",\"0x00000000000000000000000000000000000027D6\"]},{\"type\":\"identity-signer\",\"identitySigner\":\"0x8312fc6754389018bdD3BDfEFf226DD8eD9EcdB1\"}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000025a8\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000009CD\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002AA7\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000026eB\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000001F8C\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000435E\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000026e\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000133b\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002B44\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000004C\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002015\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000000E9\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003Ec4\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000002eF\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003703\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003dEB\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000057Eb\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000000373\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000002be\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000001EA6\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],\"callSignatures\":[],\"explicitSigners\":[\"0x00000000000000000000000000000000000025a8\"],\"implicitSigners\":[\"0x9ed233eCAE5E093CAff8Ff8E147DdAfc704EC619\"]}")] + public void EncodeCallSignatures(string inputJson) + { + var input = JsonConvert.DeserializeObject>(inputJson); + var blacklistAddress = new Address((string)input["blacklistAddress"]); + var sessionTopologyJson = input["sessionTopology"].ToString(); + + var sessionsTopology = SessionsTopology.FromJson(sessionTopologyJson); + sessionsTopology.AddToImplicitBlacklist(blacklistAddress); + + Debug.Log($"{sessionsTopology.JsonSerialize()}"); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs index e24c28ca..09cce12f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs @@ -13,7 +13,7 @@ public override object ToJson() return new { type = ImplicitBlacklistType, - blacklist = blacklist, + blacklist = blacklist.Select(a => a.Value).ToArray(), }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index 3cbbf30d..e0045f79 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -5,6 +5,7 @@ using NUnit.Framework; using Sequence.Utils; using Unity.Plastic.Newtonsoft.Json; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -61,21 +62,26 @@ public byte[] Encode() throw new Exception("Invalid topology."); } - public SessionPermissions FindPermissions(Address signer) + public T FindLeaf(Func check) where T : SessionLeaf { - if (Leaf is PermissionLeaf permissionLeaf && permissionLeaf.permissions.signer.Equals(signer)) - return permissionLeaf.permissions; + if (Leaf is T leaf && check(leaf)) + { + Debug.Log($"Got leaf {Leaf?.GetType()}"); + return leaf; + } if (!IsBranch) return null; - return Branch.Children.Select(child => - child.FindPermissions(signer)).FirstOrDefault(permissions => permissions != null); + return Branch.Children.Select(child => child.FindLeaf(check)) + .FirstOrDefault(childLeaf => childLeaf != null); } public SessionsTopology AddExplicitSession(SessionPermissions session) { - var existingPermission = FindPermissions(session.signer); + var existingPermission = FindLeaf(leaf => + leaf.permissions.signer.Equals(session.signer)); + if (existingPermission != null) throw new Exception("Session already exists."); @@ -85,6 +91,30 @@ public SessionsTopology AddExplicitSession(SessionPermissions session) }.ToTopology()); } + public SessionsTopology RemoveExplicitSession(SessionPermissions session) + { + throw new Exception("Not implemented."); + } + + public void AddToImplicitBlacklist(Address address) + { + var existingLeaf = FindLeaf(_ => true); + if (existingLeaf == null) + throw new Exception("No blacklist found."); + + if (existingLeaf.blacklist.Any(b => b.Equals(address))) + return; + + var blacklist = existingLeaf.blacklist.ToList(); + blacklist.Add(address); + existingLeaf.blacklist = blacklist.ToArray(); + } + + public SessionsTopology RemoveFromImplicitBlacklist(Address address) + { + throw new Exception("Not implemented."); + } + public static SessionsTopology MergeSessionsTopologies(SessionsTopology a, SessionsTopology b) { return new SessionsTopology(new SessionBranch(a, b)); @@ -136,10 +166,10 @@ public static SessionsTopology FromJson(string json) }.ToTopology(); case SessionLeaf.ImplicitBlacklistType: var blacklistJson = data["blacklist"].ToString(); - var blacklist = JsonConvert.DeserializeObject(blacklistJson); + var blacklist = JsonConvert.DeserializeObject(blacklistJson); return new ImplicitBlacklistLeaf { - blacklist = blacklist + blacklist = blacklist.Select(b => new Address(b)).ToArray() }.ToTopology(); default: throw new Exception("Invalid topology."); From bc6880066510ab9698ac33a7b88fa513ffe9424a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 1 Jul 2025 09:44:15 +0200 Subject: [PATCH 076/165] encoding session call signatures --- .../IntegrationTests/SessionsTest.cs | 18 +++- .../UnitTests/SessionsUnitTests.cs | 15 ++- .../Primitives/Attestation/Attestation.cs | 4 +- .../Primitives/Attestation/AuthData.cs | 2 +- .../Sessions/ExplicitSessionCallSignature.cs | 15 +++ .../ExplicitSessionCallSignature.cs.meta | 3 + .../Sessions/ImplicitSessionCallSignature.cs | 14 +++ .../ImplicitSessionCallSignature.cs.meta | 3 + .../Sessions/SessionCallSignature.cs | 92 ++++++++++++++++++ .../Sessions/SessionCallSignature.cs.meta | 3 + .../Primitives/Sessions/SessionsTopology.cs | 93 ++++++++++++++++++- 11 files changed, 252 insertions(+), 10 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ExplicitSessionCallSignature.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ExplicitSessionCallSignature.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitSessionCallSignature.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitSessionCallSignature.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs index e9a94cd2..8f1f48ff 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; +using Newtonsoft.Json; using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.UnitTests; using Sequence.Utils; @@ -28,7 +30,21 @@ public Task SessionEncodeTopology(Dictionary parameters) public Task SessionEncodeCallSignatures(Dictionary parameters) { - throw new NotImplementedException(); + var sessionTopologyJson = parameters["sessionTopology"].ToString(); + + var signatures = JsonConvert.DeserializeObject(parameters["callSignatures"] + .ToString()).Select(SessionCallSignature.FromJson).ToArray(); + + var explicitSigners = JsonConvert.DeserializeObject(parameters["explicitSigners"] + .ToString()).Select(v => new Address(v)).ToArray(); + + var implicitSigners = JsonConvert.DeserializeObject(parameters["implicitSigners"] + .ToString()).Select(v => new Address(v)).ToArray(); + + var sessionsTopology = SessionsTopology.FromJson(sessionTopologyJson); + var encodedSignatures = SessionCallSignature.EncodeSignatures(signatures, sessionsTopology, explicitSigners, implicitSigners); + + return Task.FromResult(encodedSignatures.ByteArrayToHexStringWithPrefix()); } public Task SessionImageHash(Dictionary parameters) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs index 336b1309..415b13b9 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Newtonsoft.Json; using NUnit.Framework; using Sequence.EcosystemWallet.Primitives; @@ -61,13 +62,21 @@ public void AddBlacklistAddress(string inputJson) public void EncodeCallSignatures(string inputJson) { var input = JsonConvert.DeserializeObject>(inputJson); - var blacklistAddress = new Address((string)input["blacklistAddress"]); var sessionTopologyJson = input["sessionTopology"].ToString(); + + var signatures = JsonConvert.DeserializeObject(input["callSignatures"] + .ToString()).Select(SessionCallSignature.FromJson).ToArray(); + + var explicitSigners = JsonConvert.DeserializeObject(input["explicitSigners"] + .ToString()).Select(v => new Address(v)).ToArray(); + + var implicitSigners = JsonConvert.DeserializeObject(input["implicitSigners"] + .ToString()).Select(v => new Address(v)).ToArray(); var sessionsTopology = SessionsTopology.FromJson(sessionTopologyJson); - sessionsTopology.AddToImplicitBlacklist(blacklistAddress); + var encodedSignatures = SessionCallSignature.EncodeSignatures(signatures, sessionsTopology, explicitSigners, implicitSigners); - Debug.Log($"{sessionsTopology.JsonSerialize()}"); + Debug.Log($"{encodedSignatures.ByteArrayToHexStringWithPrefix()}"); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs index 73c634b5..436643bd 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs @@ -6,7 +6,7 @@ namespace Sequence.EcosystemWallet.Primitives { - internal class Attestation + public class Attestation { public static readonly byte[] ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX = SequenceCoder.KeccakHash("acceptImplicitRequest".ToByteArray()); @@ -88,7 +88,7 @@ public byte[] GenerateImplicitRequestMagic(Address wallet) } [Serializable] - internal class JsonAttestation + public class JsonAttestation { public Address approvedSigner; public string identityType; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs index ca5e144d..86f4899a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs @@ -5,7 +5,7 @@ namespace Sequence.EcosystemWallet.Primitives { [Serializable] - internal class AuthData + public class AuthData { public string redirectUrl; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ExplicitSessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ExplicitSessionCallSignature.cs new file mode 100644 index 00000000..e7ab589d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ExplicitSessionCallSignature.cs @@ -0,0 +1,15 @@ +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class ExplicitSessionCallSignature : SessionCallSignature + { + public BigInteger permissionIndex; + public RSY sessionSignature; + + public override byte[] Encode() + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ExplicitSessionCallSignature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ExplicitSessionCallSignature.cs.meta new file mode 100644 index 00000000..43485f29 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ExplicitSessionCallSignature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4e4d387190ee456d84d8eaa213e9c52c +timeCreated: 1751352635 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitSessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitSessionCallSignature.cs new file mode 100644 index 00000000..2e5b0ba2 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitSessionCallSignature.cs @@ -0,0 +1,14 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public class ImplicitSessionCallSignature : SessionCallSignature + { + public Attestation attestation; + public RSY identitySignature; + public RSY sessionSignature; + + public override byte[] Encode() + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitSessionCallSignature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitSessionCallSignature.cs.meta new file mode 100644 index 00000000..f25c1190 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitSessionCallSignature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9fd706feb17d4e9c846647b4e9fd36e2 +timeCreated: 1751352624 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs new file mode 100644 index 00000000..b995ff50 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public abstract class SessionCallSignature + { + public abstract byte[] Encode(); + + public static SessionCallSignature FromJson(string json) + { + return null; + } + + public static byte[] EncodeSignatures(SessionCallSignature[] signatures, SessionsTopology sessionsTopology, + Address[] explicitSigners, Address[] implicitSigners) + { + var parts = new List(); + + if (!sessionsTopology.IsComplete()) + throw new Exception("Incomplete topology"); + + sessionsTopology.Minimise(explicitSigners, implicitSigners); + + var encodedTopology = sessionsTopology.Encode(); + if (encodedTopology.Length.MinBytesFor() > 3) + throw new Exception("Session topology is too large"); + + parts.Add(encodedTopology.Length.ByteArrayFromNumber(3)); + parts.Add(encodedTopology); + + var attestationMap = new Dictionary(); + var encodedAttestations = new List(); + + foreach (var signature in signatures.Where(s => s is ImplicitSessionCallSignature)) + { + if (signature is not ImplicitSessionCallSignature implicitSignature) + throw new Exception("Invalid implicit signature"); + + if (implicitSignature.attestation != null) + { + var attestationStr = implicitSignature.attestation.ToJson(); + if (!attestationMap.ContainsKey(attestationStr)) + { + attestationMap[attestationStr] = encodedAttestations.Count; + encodedAttestations.Add(ByteArrayExtensions.ConcatenateByteArrays( + implicitSignature.attestation.Encode(), + implicitSignature.identitySignature.Pack() + )); + } + } + } + + if (encodedAttestations.Count >= 128) + throw new Exception("Too many attestations"); + + parts.Add(encodedAttestations.Count.ByteArrayFromNumber(1)); + parts.Add(ByteArrayExtensions.ConcatenateByteArrays(encodedAttestations.ToArray())); + + foreach (var signature in signatures) + { + if (signature is ImplicitSessionCallSignature implicitCallSignature) + { + var attestationStr = implicitCallSignature.attestation.ToJson(); + if (!attestationMap.TryGetValue(attestationStr, out var index)) + throw new Exception("Failed to find attestation index"); + + var packedFlag = 0x80 | index; + parts.Add(packedFlag.ByteArrayFromNumber(1)); + parts.Add(implicitCallSignature.sessionSignature.Pack()); + } + else if (signature is ExplicitSessionCallSignature explicitCallSignature) + { + if (explicitCallSignature.permissionIndex > 127) + throw new Exception("Permission index is too large"); + + var packedFlag = explicitCallSignature.permissionIndex; + parts.Add(packedFlag.ByteArrayFromNumber(1)); + parts.Add(explicitCallSignature.sessionSignature.Pack()); + } + else + { + throw new Exception("Invalid call signature"); + } + } + + return ByteArrayExtensions.ConcatenateByteArrays(parts.ToArray()); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs.meta new file mode 100644 index 00000000..fb101ce9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2095aa9474bb40d396bbdc148354ef7e +timeCreated: 1751352126 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index e0045f79..867e334c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Numerics; using NUnit.Framework; +using Sequence.ABI; using Sequence.Utils; using Unity.Plastic.Newtonsoft.Json; using UnityEngine; @@ -62,13 +63,99 @@ public byte[] Encode() throw new Exception("Invalid topology."); } + public SessionsTopology Minimise(Address[] explicitSigners, Address[] implicitSigners) + { + if (IsBranch) + { + var branchList = Branch.Children + .Select(branch => branch.Minimise(explicitSigners, implicitSigners)) + .ToArray(); + + if (branchList.All(b => b.IsLeaf && b.Leaf is SessionNodeLeaf)) + { + var nodeBytes = branchList + .Select(node => node.Encode()) + .ToArray(); + + var concatenated = ByteArrayExtensions.ConcatenateByteArrays(nodeBytes); + return new SessionNodeLeaf + { + Value = SequenceCoder.KeccakHash(concatenated) + }.ToTopology(); + } + + return new SessionBranch(branchList).ToTopology(); + } + + if (Leaf is PermissionLeaf permissionLeaf) + { + if (explicitSigners.Contains(permissionLeaf.permissions.signer)) + return this; + + return new SessionNodeLeaf + { + Value = Hash().HexStringToByteArray() + }.ToTopology(); + } + + if (Leaf is ImplicitBlacklistLeaf) + { + if (implicitSigners.Length == 0) + { + return new SessionNodeLeaf + { + Value = Hash().HexStringToByteArray() + }.ToTopology(); + } + + return this; + } + + if (Leaf is IdentitySignerLeaf or SessionNodeLeaf) + return this; + + throw new Exception("Invalid topology"); + } + + public string Hash() + { + if (IsBranch) + { + var children = Branch.Children; + if (children.Length == 0) + throw new Exception("Empty branch"); + + var hashedChildren = children.Select(child => child.Hash()).ToArray(); + + var childBytes = hashedChildren[0].HexStringToByteArray(); + for (var i = 1; i < hashedChildren.Length; i++) + { + var nextBytes = hashedChildren[i].HexStringToByteArray(); + childBytes = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(childBytes, nextBytes)); + } + + return childBytes.ByteArrayToHexStringWithPrefix(); + } + + if (IsLeaf && Leaf is SessionNodeLeaf nodeLeaf) + return nodeLeaf.Value.ByteArrayToHexStringWithPrefix(); + + if (IsLeaf) + return SequenceCoder.KeccakHash(Leaf.Encode()).ByteArrayToHexStringWithPrefix(); + + throw new Exception("Invalid tree structure"); + } + + public bool IsComplete() + { + return FindLeaf(_ => true) != null && + FindLeaf(_ => true) != null; + } + public T FindLeaf(Func check) where T : SessionLeaf { if (Leaf is T leaf && check(leaf)) - { - Debug.Log($"Got leaf {Leaf?.GetType()}"); return leaf; - } if (!IsBranch) return null; From 8ead52d3817b3c88165a3a8241f215c7f0dbfaa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 1 Jul 2025 11:05:52 +0200 Subject: [PATCH 077/165] flatting and minimising sessions topology --- .../UnitTests/SessionsUnitTests.cs | 9 +-- .../Sessions/SessionCallSignature.cs | 6 +- .../Primitives/Sessions/SessionsTopology.cs | 13 +++- .../Sessions/SessionsTopologyUtils.cs | 63 +++++++++++++++++++ .../Sessions/SessionsTopologyUtils.cs.meta | 3 + .../SequenceSDK/Utils/ByteArrayComparer.cs | 22 +++++++ .../Utils/ByteArrayComparer.cs.meta | 3 + 7 files changed, 107 insertions(+), 12 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopologyUtils.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopologyUtils.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayComparer.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayComparer.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs index 415b13b9..631389ed 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; @@ -35,12 +34,6 @@ public void TestAddExplicitSession(string inputJson) var explicitSession = SessionPermissions.FromJson(explicitSessionJson); var sessionTopology = SessionsTopology.FromJson(sessionTopologyJson); - var existingPermission = sessionTopology.FindLeaf(leaf => - leaf.permissions.signer.Equals(explicitSession.signer)); - - if (existingPermission != null) - throw new Exception("Session already exists."); - var newTopology = sessionTopology.AddExplicitSession(explicitSession); Debug.Log($"{newTopology.JsonSerialize()}"); } @@ -58,7 +51,7 @@ public void AddBlacklistAddress(string inputJson) Debug.Log($"{sessionsTopology.JsonSerialize()}"); } - [TestCase("{\"sessionTopology\":[[[[[[[[[[[[[[[[[[[[[{\"type\":\"implicit-blacklist\",\"blacklist\":[\"0x0000000000000000000000000000000000000269\",\"0x000000000000000000000000000000000000289C\",\"0x00000000000000000000000000000000000019c7\",\"0x0000000000000000000000000000000000000120\",\"0x00000000000000000000000000000000000027D6\"]},{\"type\":\"identity-signer\",\"identitySigner\":\"0x8312fc6754389018bdD3BDfEFf226DD8eD9EcdB1\"}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000025a8\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000009CD\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002AA7\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000026eB\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000001F8C\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000435E\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000026e\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000133b\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002B44\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000004C\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002015\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000000E9\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003Ec4\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000002eF\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003703\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003dEB\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000057Eb\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000000373\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000002be\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000001EA6\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],\"callSignatures\":[],\"explicitSigners\":[\"0x00000000000000000000000000000000000025a8\"],\"implicitSigners\":[\"0x9ed233eCAE5E093CAff8Ff8E147DdAfc704EC619\"]}")] + [TestCase("{\"sessionTopology\":[[[[{\"type\":\"implicit-blacklist\",\"blacklist\":[\"0x0000000000000000000000000000000000000120\",\"0x0000000000000000000000000000000000000269\",\"0x00000000000000000000000000000000000019c7\",\"0x00000000000000000000000000000000000027D6\",\"0x000000000000000000000000000000000000289C\"]},{\"type\":\"identity-signer\",\"identitySigner\":\"0x8312fc6754389018bdD3BDfEFf226DD8eD9EcdB1\"}],[{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000025a8\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},[{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000009CD\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002AA7\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}]]],[[{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000026eB\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},[{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000001F8C\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000435E\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}]],[{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000026e\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},[{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000133b\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002B44\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}]]]],[[[{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000004C\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002015\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],[{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000000E9\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},[{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003Ec4\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000002eF\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}]]],[[{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003703\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},[{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003dEB\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000057Eb\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}]],[{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000000373\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},[{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000002be\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000001EA6\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}]]]]],\"callSignatures\":[],\"explicitSigners\":[\"0x00000000000000000000000000000000000025a8\"],\"implicitSigners\":[\"0x9ed233eCAE5E093CAff8Ff8E147DdAfc704EC619\"]}")] public void EncodeCallSignatures(string inputJson) { var input = JsonConvert.DeserializeObject>(inputJson); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs index b995ff50..4efe7940 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -22,7 +23,8 @@ public static byte[] EncodeSignatures(SessionCallSignature[] signatures, Session if (!sessionsTopology.IsComplete()) throw new Exception("Incomplete topology"); - sessionsTopology.Minimise(explicitSigners, implicitSigners); + sessionsTopology = sessionsTopology.Minimise(explicitSigners, implicitSigners); + Debug.Log(sessionsTopology.JsonSerialize()); var encodedTopology = sessionsTopology.Encode(); if (encodedTopology.Length.MinBytesFor() > 3) @@ -31,6 +33,8 @@ public static byte[] EncodeSignatures(SessionCallSignature[] signatures, Session parts.Add(encodedTopology.Length.ByteArrayFromNumber(3)); parts.Add(encodedTopology); + Debug.Log($"{encodedTopology.ByteArrayToHexStringWithPrefix()}"); + var attestationMap = new Dictionary(); var encodedAttestations = new List(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index 867e334c..236f3b9a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -63,6 +63,13 @@ public byte[] Encode() throw new Exception("Invalid topology."); } + /// + /// Optimise the configuration tree by rolling unused signers into nodes. + /// + /// The list of explicit signers to consider. + /// The list of implicit signers to consider. + /// New reference to the compromised topology. + /// public SessionsTopology Minimise(Address[] explicitSigners, Address[] implicitSigners) { if (IsBranch) @@ -172,10 +179,10 @@ public SessionsTopology AddExplicitSession(SessionPermissions session) if (existingPermission != null) throw new Exception("Session already exists."); - return MergeSessionsTopologies(this, new PermissionLeaf + return SessionsTopologyUtils.BalanceSessionsTopology(MergeSessionsTopologies(this, new PermissionLeaf { permissions = session - }.ToTopology()); + }.ToTopology())); } public SessionsTopology RemoveExplicitSession(SessionPermissions session) @@ -194,7 +201,7 @@ public void AddToImplicitBlacklist(Address address) var blacklist = existingLeaf.blacklist.ToList(); blacklist.Add(address); - existingLeaf.blacklist = blacklist.ToArray(); + existingLeaf.blacklist = blacklist.OrderBy(h => h.Value.HexStringToByteArray(), new ByteArrayComparer()).ToArray(); } public SessionsTopology RemoveFromImplicitBlacklist(Address address) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopologyUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopologyUtils.cs new file mode 100644 index 00000000..814fd335 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopologyUtils.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Sequence.EcosystemWallet.Primitives +{ + public static class SessionsTopologyUtils + { + public static SessionsTopology BalanceSessionsTopology(SessionsTopology topology) + { + var flattened = FlattenSessionsTopology(topology); + + var blacklist = flattened.FirstOrDefault(l => l.IsLeaf && l.Leaf is ImplicitBlacklistLeaf); + var identitySigner = flattened.FirstOrDefault(l => l.IsLeaf && l.Leaf is IdentitySignerLeaf); + var leaves = flattened.Where(l => l.IsLeaf && l.Leaf is PermissionLeaf).ToArray(); + + if (blacklist == null || identitySigner == null) + { + throw new Exception("No blacklist or identity signer"); + } + + var elements = new List { blacklist, identitySigner }; + elements.AddRange(leaves); + + return BuildBalancedSessionsTopology(elements.ToArray()); + } + + private static SessionsTopology[] FlattenSessionsTopology(SessionsTopology topology) + { + if (topology.IsLeaf) + return new [] { topology }; + + if (!topology.IsBranch) + throw new Exception("Invalid topology structure"); + + var result = new List(); + foreach (var child in topology.Branch.Children) + result.AddRange(FlattenSessionsTopology(child)); + + return result.ToArray(); + + } + + private static SessionsTopology BuildBalancedSessionsTopology(SessionsTopology[] topologies) + { + var len = topologies.Length; + if (len == 0) + throw new Exception("Cannot build a topology from an empty list"); + + if (len == 1) + return topologies[0]; + + var mid = len / 2; + var left = topologies.Take(mid).ToArray(); + var right = topologies.Skip(mid).ToArray(); + + var leftTopo = BuildBalancedSessionsTopology(left); + var rightTopo = BuildBalancedSessionsTopology(right); + + return new SessionBranch(leftTopo, rightTopo).ToTopology(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopologyUtils.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopologyUtils.cs.meta new file mode 100644 index 00000000..ff52edc8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopologyUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 802712a51e264d2e9d97b6c4a303bf74 +timeCreated: 1751359802 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayComparer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayComparer.cs new file mode 100644 index 00000000..004bcb0f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayComparer.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace Sequence.Utils +{ + public class ByteArrayComparer : IComparer + { + public int Compare(byte[]? x, byte[]? y) + { + if (x == null || y == null) + throw new ArgumentException("Cannot compare null byte arrays"); + + for (var i = 0; i < Math.Min(x.Length, y.Length); i++) + { + var cmp = x[i].CompareTo(y[i]); + if (cmp != 0) + return cmp; + } + return x.Length.CompareTo(y.Length); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayComparer.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayComparer.cs.meta new file mode 100644 index 00000000..28c8a25a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayComparer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ee1ab8a872cd4f91b3590fd752b0e006 +timeCreated: 1751358291 \ No newline at end of file From a5d2e00952321ec427b26921348fac9f2d253b6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 1 Jul 2025 12:49:35 +0200 Subject: [PATCH 078/165] fixed sessions branch encoding --- .../Primitives/Permission/SessionPermissions.cs | 7 ++++--- .../Primitives/Sessions/IdentitySignerLeaf.cs | 2 ++ .../Primitives/Sessions/ImplicitBlacklistLeaf.cs | 13 +++++++++---- .../Primitives/Sessions/PermissionLeaf.cs | 1 - .../Primitives/Sessions/SessionBranch.cs | 6 ++++-- .../Primitives/Sessions/SessionCallSignature.cs | 7 +++---- .../Primitives/Sessions/SessionsTopology.cs | 10 ++++------ 7 files changed, 26 insertions(+), 20 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs index 6b8fc985..7784757a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs @@ -4,6 +4,7 @@ using System.Numerics; using Newtonsoft.Json; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -35,10 +36,10 @@ public byte[] Encode() List result = new(); result.AddRange(signer.ToString().HexStringToByteArray().PadLeft(20)); - result.AddRange(valueLimit.ToByteArray().PadLeft(32)); - result.AddRange(deadline.ToByteArray().PadLeft(32)); + result.AddRange(valueLimit.ByteArrayFromNumber(32)); + result.AddRange(deadline.ByteArrayFromNumber(8)); result.Add((byte)permissions.Length); - + foreach (var permission in permissions) { result.AddRange(permission.Encode()); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs index 1b654d3b..2619b566 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs @@ -1,4 +1,5 @@ using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -18,6 +19,7 @@ public override object ToJson() public override byte[] Encode() { var flag = SessionsTopology.FlagIdentitySigner << 4; + Debug.Log($"IdentitySignerLeaf {ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), identitySigner.Value.HexStringToByteArray()).ByteArrayToHexStringWithPrefix()}"); return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), identitySigner.Value.HexStringToByteArray()); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs index 09cce12f..304a27ed 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs @@ -13,15 +13,13 @@ public override object ToJson() return new { type = ImplicitBlacklistType, - blacklist = blacklist.Select(a => a.Value).ToArray(), + blacklist = blacklist.Select(a => a.Value).ToArray() , }; } public override byte[] Encode() { - var encoded = ByteArrayExtensions.ConcatenateByteArrays(blacklist - .Select(hex => hex.Value.HexStringToByteArray()) - .ToArray()); + var encoded = EncodeBlacklist(); var count = blacklist.Length; if (count >= 0x0f) @@ -40,5 +38,12 @@ public override byte[] Encode() var flagByte = (SessionsTopology.FlagBlacklist << 4) | count; return ByteArrayExtensions.ConcatenateByteArrays(flagByte.ByteArrayFromNumber(flagByte.MinBytesFor()), encoded); } + + private byte[] EncodeBlacklist() + { + return ByteArrayExtensions.ConcatenateByteArrays(blacklist + .Select(hex => hex.Value.HexStringToByteArray()) + .ToArray()); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs index 6b34a11a..1b0ea6e8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs @@ -1,4 +1,3 @@ -using System.Linq; using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs index bd9ece0d..6a6769b1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs @@ -2,6 +2,7 @@ using System.Linq; using Newtonsoft.Json; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -31,11 +32,12 @@ public byte[] Encode() var encodedSize = encoded.Length.MinBytesFor(); if (encodedSize > 15) throw new Exception("Session Branch is too large."); - + var flag = (SessionsTopology.FlagBranch << 4) | encodedSize; + return ByteArrayExtensions.ConcatenateByteArrays( flag.ByteArrayFromNumber(flag.MinBytesFor()), - encodedSize.ByteArrayFromNumber(encodedSize), + encoded.Length.ByteArrayFromNumber(encodedSize), encoded); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs index 4efe7940..e23ddd0e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs @@ -24,17 +24,16 @@ public static byte[] EncodeSignatures(SessionCallSignature[] signatures, Session throw new Exception("Incomplete topology"); sessionsTopology = sessionsTopology.Minimise(explicitSigners, implicitSigners); - Debug.Log(sessionsTopology.JsonSerialize()); + + Debug.Log($"{sessionsTopology.JsonSerialize()}"); var encodedTopology = sessionsTopology.Encode(); if (encodedTopology.Length.MinBytesFor() > 3) throw new Exception("Session topology is too large"); - + parts.Add(encodedTopology.Length.ByteArrayFromNumber(3)); parts.Add(encodedTopology); - Debug.Log($"{encodedTopology.ByteArrayToHexStringWithPrefix()}"); - var attestationMap = new Dictionary(); var encodedAttestations = new List(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index 236f3b9a..b15e7b7c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -2,11 +2,9 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; -using NUnit.Framework; using Sequence.ABI; using Sequence.Utils; using Unity.Plastic.Newtonsoft.Json; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -77,13 +75,13 @@ public SessionsTopology Minimise(Address[] explicitSigners, Address[] implicitSi var branchList = Branch.Children .Select(branch => branch.Minimise(explicitSigners, implicitSigners)) .ToArray(); - + if (branchList.All(b => b.IsLeaf && b.Leaf is SessionNodeLeaf)) { var nodeBytes = branchList - .Select(node => node.Encode()) + .Select(node => (node.Leaf as SessionNodeLeaf)?.Value) .ToArray(); - + var concatenated = ByteArrayExtensions.ConcatenateByteArrays(nodeBytes); return new SessionNodeLeaf { @@ -98,7 +96,7 @@ public SessionsTopology Minimise(Address[] explicitSigners, Address[] implicitSi { if (explicitSigners.Contains(permissionLeaf.permissions.signer)) return this; - + return new SessionNodeLeaf { Value = Hash().HexStringToByteArray() From d6ed318637fcf9917c6b38e90d882190a07d228c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 1 Jul 2025 14:36:18 +0200 Subject: [PATCH 079/165] fixed permissions and attestation parsing --- .../IntegrationTests/SessionsTest.cs | 4 +- .../Primitives/Attestation/Attestation.cs | 54 +++++++++---------- .../Permission/ParameterOperation.cs | 10 ++-- .../Primitives/Permission/ParameterRule.cs | 3 +- .../Primitives/Permission/Permission.cs | 2 +- .../Permission/SessionPermissions.cs | 11 +++- .../Sessions/SessionCallSignature.cs | 28 ++++++++-- .../Primitives/Signature/RSY.cs | 11 ++++ 8 files changed, 81 insertions(+), 42 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs index 8f1f48ff..fee35b6f 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs @@ -32,8 +32,8 @@ public Task SessionEncodeCallSignatures(Dictionary param { var sessionTopologyJson = parameters["sessionTopology"].ToString(); - var signatures = JsonConvert.DeserializeObject(parameters["callSignatures"] - .ToString()).Select(SessionCallSignature.FromJson).ToArray(); + var signatures = JsonConvert.DeserializeObject(parameters["callSignatures"] + .ToString()).Select(s => SessionCallSignature.FromJson(s.ToString())).ToArray(); var explicitSigners = JsonConvert.DeserializeObject(parameters["explicitSigners"] .ToString()).Select(v => new Address(v)).ToArray(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs index 436643bd..f005131d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; @@ -18,19 +19,6 @@ public class Attestation public byte[] applicationData; public AuthData authData; - public Attestation(Address approvedSigner, FixedByte identityType, FixedByte issuerHash, FixedByte audienceHash, byte[] applicationData, AuthData authData) - { - this.approvedSigner = approvedSigner; - AssertHasSize(identityType, 4, nameof(identityType)); - this.identityType = identityType; - AssertHasSize(issuerHash, 32, nameof(issuerHash)); - this.issuerHash = issuerHash; - AssertHasSize(audienceHash, 32, nameof(audienceHash)); - this.audienceHash = audienceHash; - this.applicationData = applicationData; - this.authData = authData; - } - private void AssertHasSize(FixedByte obj, int size, string argumentName) { if (obj.Count != size) @@ -58,26 +46,34 @@ public byte[] Hash() return SequenceCoder.KeccakHash(encoded); } - public string ToJson() // Todo make this a JsonConverter - { - JsonAttestation jsonAble = new JsonAttestation(this); - return JsonConvert.ToString(jsonAble); - } - - public Attestation(JsonAttestation jsonAble) + public object ToJson() { - this.approvedSigner = jsonAble.approvedSigner; - this.identityType = new FixedByte(4, jsonAble.identityType.HexStringToByteArray()); - this.issuerHash = new FixedByte(32, jsonAble.issuerHash.HexStringToByteArray()); - this.audienceHash = new FixedByte(32, jsonAble.audienceHash.HexStringToByteArray()); - this.applicationData = jsonAble.applicationData.HexStringToByteArray(); - this.authData = jsonAble.authData; + return new + { + approvedSigner = approvedSigner.Value, + identityType = identityType.Data.ByteArrayToHexStringWithPrefix(), + issuerHash = issuerHash.Data.ByteArrayToHexStringWithPrefix(), + audienceHash = audienceHash.Data.ByteArrayToHexStringWithPrefix(), + applicationData = applicationData.ByteArrayToHexStringWithPrefix(), + authData = new + { + redirectUrl = authData.redirectUrl + } + }; } - public Attestation FromJson(string json) // Todo make this a JsonConverter + public static Attestation FromJson(string json) // Todo make this a JsonConverter { - JsonAttestation jsonAble = JsonConvert.DeserializeObject(json); - return new Attestation(jsonAble); + var jsonAble = JsonConvert.DeserializeObject(json); + return new Attestation + { + approvedSigner = jsonAble.approvedSigner, + identityType = new FixedByte(4, jsonAble.identityType.HexStringToByteArray()), + issuerHash = new FixedByte(32, jsonAble.issuerHash.HexStringToByteArray()), + audienceHash = new FixedByte(32, jsonAble.audienceHash.HexStringToByteArray()), + applicationData = jsonAble.applicationData.HexStringToByteArray(), + authData = jsonAble.authData + }; } public byte[] GenerateImplicitRequestMagic(Address wallet) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs index 5a926f5e..3302c9b5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs @@ -4,11 +4,11 @@ namespace Sequence.EcosystemWallet.Primitives { [JsonConverter(typeof(EnumConverter))] - public enum ParameterOperation : byte + public enum ParameterOperation { - equal = 0x00, - notEqual = 0x01, - greaterThanOrEqual = 0x02, - lessThanOrEqual = 0x03 + equal = 0, + notEqual = 1, + greaterThanOrEqual = 2, + lessThanOrEqual = 3 } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs index f0ba6ebd..8a17f62b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs @@ -3,6 +3,7 @@ using System.Numerics; using Sequence.Utils; using Unity.Plastic.Newtonsoft.Json; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -43,7 +44,7 @@ public static ParameterRule FromJson(string json) return new() { cumulative = (bool)data["cumulative"], - operation = (ParameterOperation)data["operation"], + operation = (ParameterOperation)Convert.ToInt32(data["operation"]), value = data["value"].ToString().HexStringToByteArray(), offset = BigInteger.Parse(data["offset"].ToString()), mask = data["mask"].ToString().HexStringToByteArray() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs index 970a7ad9..4729fb2c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs @@ -47,7 +47,7 @@ public static Permission FromJson(string json) return new() { target = new Address((string)data["target"]), - rules = JsonConvert.DeserializeObject>((string)data["rules"]) + rules = JsonConvert.DeserializeObject>(data["rules"].ToString()) .Select(r => ParameterRule.FromJson(r.ToString())) .ToArray(), }; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs index 7784757a..61cf1ca9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs @@ -86,7 +86,16 @@ public static SessionPermissions Decode(byte[] data) public static SessionPermissions FromJson(string json) { - return JsonConvert.DeserializeObject(json); + var data = JsonConvert.DeserializeObject>(json); + return new SessionPermissions + { + signer = new Address((string)data["signer"]), + valueLimit = BigInteger.Parse((string)data["valueLimit"]), + deadline = BigInteger.Parse((string)data["deadline"]), + permissions = JsonConvert.DeserializeObject(data["permissions"].ToString()) + .Select(p => Permission.FromJson(p.ToString())) + .ToArray() + }; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs index e23ddd0e..c708afae 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Numerics; using Sequence.Utils; +using Unity.Plastic.Newtonsoft.Json; using UnityEngine; namespace Sequence.EcosystemWallet.Primitives @@ -12,7 +14,27 @@ public abstract class SessionCallSignature public static SessionCallSignature FromJson(string json) { - return null; + var data = JsonConvert.DeserializeObject>(json); + if (data.TryGetValue("identitySignature", out var identitySignature)) + { + return new ImplicitSessionCallSignature + { + attestation = Attestation.FromJson(data["attestation"].ToString()), + sessionSignature = RSY.FromString((string)data["sessionSignature"]), + identitySignature = RSY.FromString((string)identitySignature) + }; + } + + if (data.TryGetValue("permissionIndex", out var permissionIndex)) + { + return new ExplicitSessionCallSignature + { + permissionIndex = BigInteger.Parse((string)permissionIndex), + sessionSignature = new RSY(), + }; + } + + throw new Exception("Invalid signature"); } public static byte[] EncodeSignatures(SessionCallSignature[] signatures, SessionsTopology sessionsTopology, @@ -44,7 +66,7 @@ public static byte[] EncodeSignatures(SessionCallSignature[] signatures, Session if (implicitSignature.attestation != null) { - var attestationStr = implicitSignature.attestation.ToJson(); + var attestationStr = JsonConvert.SerializeObject(implicitSignature.attestation.ToJson()); if (!attestationMap.ContainsKey(attestationStr)) { attestationMap[attestationStr] = encodedAttestations.Count; @@ -66,7 +88,7 @@ public static byte[] EncodeSignatures(SessionCallSignature[] signatures, Session { if (signature is ImplicitSessionCallSignature implicitCallSignature) { - var attestationStr = implicitCallSignature.attestation.ToJson(); + var attestationStr = JsonConvert.SerializeObject(implicitCallSignature.attestation.ToJson()); if (!attestationMap.TryGetValue(attestationStr, out var index)) throw new Exception("Failed to find attestation index"); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs index 62360369..5d5cf75e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs @@ -25,6 +25,17 @@ public byte[] Pack() return ByteArrayExtensions.ConcatenateByteArrays(rBytes, sBytes); } + public static RSY FromString(string input) + { + var parts = input.Split(':'); + return new RSY + { + r = parts[0].HexStringToBigInteger(), + s = parts[1].HexStringToBigInteger(), + yParity = VToYParity(BigInteger.Parse(parts[2])) + }; + } + public static RSY Unpack(byte[] rsy) { if (rsy.Length != 64) From 498782c612055ee78e0efd39f95a1e3943550452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 1 Jul 2025 16:19:28 +0200 Subject: [PATCH 080/165] fixed generic encoding --- .../IntegrationTests/SessionsTest.cs | 5 +++- .../UnitTests/SessionsUnitTests.cs | 12 +++++++++ .../Primitives/Attestation/Attestation.cs | 27 ++++++++++++++----- .../Primitives/Attestation/AuthData.cs | 7 +++-- .../Primitives/Sessions/IdentitySignerLeaf.cs | 9 ++++++- .../Sessions/ImplicitBlacklistLeaf.cs | 7 +++++ .../Primitives/Sessions/PermissionLeaf.cs | 5 ++++ .../Sessions/SessionCallSignature.cs | 2 +- .../Primitives/Sessions/SessionLeaf.cs | 1 + .../Primitives/Sessions/SessionNodeLeaf.cs | 5 ++++ .../Primitives/Sessions/SessionsTopology.cs | 24 ++++++++++++----- 11 files changed, 87 insertions(+), 17 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs index fee35b6f..94e8c115 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs @@ -49,7 +49,10 @@ public Task SessionEncodeCallSignatures(Dictionary param public Task SessionImageHash(Dictionary parameters) { - throw new NotImplementedException(); + var sessionTopologyJson = parameters["sessionTopology"].ToString(); + var topology = SessionsTopology.FromJson(sessionTopologyJson); + + return Task.FromResult(topology.ImageHash()); } public Task SessionExplicitAdd(Dictionary parameters) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs index 631389ed..1ec66d1f 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs @@ -71,5 +71,17 @@ public void EncodeCallSignatures(string inputJson) Debug.Log($"{encodedSignatures.ByteArrayToHexStringWithPrefix()}"); } + + [TestCase("{\"sessionTopology\":[[{\"type\":\"implicit-blacklist\",\"blacklist\":[]},{\"type\":\"identity-signer\",\"identitySigner\":\"0x8312fc6754389018bdD3BDfEFf226DD8eD9EcdB1\"}],[{\"type\":\"session-permissions\",\"signer\":\"0x9ed233eCAE5E093CAff8Ff8E147DdAfc704EC619\",\"valueLimit\":\"1000\",\"deadline\":\"2000\",\"permissions\":[{\"target\":\"0x000000000000000000000000000000000000bEEF\",\"rules\":[{\"cumulative\":false,\"operation\":0,\"value\":\"0x0000000000000000000000000000000000000000000000000000000000000000\",\"offset\":\"0\",\"mask\":\"0x0000000000000000000000000000000000000000000000000000000000000000\"}]}]},{\"type\":\"session-permissions\",\"signer\":\"0xe67ee7a9b12041BdE69ef786fa0431d0d4e59239\",\"valueLimit\":\"1000\",\"deadline\":\"2000\",\"permissions\":[{\"target\":\"0x000000000000000000000000000000000000cafE\",\"rules\":[{\"cumulative\":false,\"operation\":0,\"value\":\"0x0000000000000000000000000000000000000000000000000000000000000000\",\"offset\":\"0\",\"mask\":\"0x0000000000000000000000000000000000000000000000000000000000000000\"}]}]}]]}")] + public void CreateSessionImageHash(string inputJson) + { + var input = JsonConvert.DeserializeObject>(inputJson); + var sessionTopology = SessionsTopology.FromJson(input["sessionTopology"].ToString()); + var imageHash = sessionTopology.ImageHash(); + + Debug.Log($"{imageHash}"); + + Assert.AreEqual(imageHash, "0x0a987248daf9d7b5372a694abfa45390e69a102c1e587c0b6ed9670909213be2"); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs index f005131d..b792ade4 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Numerics; using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; @@ -36,6 +37,7 @@ public byte[] Encode() byte[] issuerHashBytes = issuerHash.Data.PadLeft(32); byte[] audienceHashBytes = audienceHash.Data.PadLeft(32); byte[] applicationDataLengthBytes = applicationData.Length.ByteArrayFromNumber(3); + return ByteArrayExtensions.ConcatenateByteArrays(approvedSignerBytes, identityTypeBytes, issuerHashBytes, audienceHashBytes, applicationDataLengthBytes, applicationData, authDataBytes); } @@ -57,12 +59,13 @@ public object ToJson() applicationData = applicationData.ByteArrayToHexStringWithPrefix(), authData = new { - redirectUrl = authData.redirectUrl + redirectUrl = authData.redirectUrl, + issuedAt = authData.issuedAt.ToString() } }; } - public static Attestation FromJson(string json) // Todo make this a JsonConverter + public static Attestation FromJson(string json) { var jsonAble = JsonConvert.DeserializeObject(json); return new Attestation @@ -72,7 +75,7 @@ public static Attestation FromJson(string json) // Todo make this a JsonConverte issuerHash = new FixedByte(32, jsonAble.issuerHash.HexStringToByteArray()), audienceHash = new FixedByte(32, jsonAble.audienceHash.HexStringToByteArray()), applicationData = jsonAble.applicationData.HexStringToByteArray(), - authData = jsonAble.authData + authData = new AuthData(jsonAble.authData.redirectUrl, BigInteger.Parse(jsonAble.authData.issuedAt)) }; } @@ -91,11 +94,11 @@ public class JsonAttestation public string issuerHash; public string audienceHash; public string applicationData; - public AuthData authData; + public JsonAuthData authData; [JsonConstructor] [Preserve] - public JsonAttestation(Address approvedSigner, string identityType, string issuerHash, string audienceHash, string applicationData, AuthData authData) + public JsonAttestation(Address approvedSigner, string identityType, string issuerHash, string audienceHash, string applicationData, JsonAuthData authData) { this.approvedSigner = approvedSigner; this.identityType = identityType; @@ -112,7 +115,19 @@ public JsonAttestation(Attestation attestation) this.issuerHash = attestation.issuerHash.Data.ByteArrayToHexStringWithPrefix(); this.audienceHash = attestation.audienceHash.Data.ByteArrayToHexStringWithPrefix(); this.applicationData = attestation.applicationData.ByteArrayToHexStringWithPrefix(); - this.authData = attestation.authData; + this.authData = new JsonAuthData(attestation.authData.redirectUrl, attestation.authData.issuedAt.ToString()); + } + } + + public class JsonAuthData + { + public string redirectUrl; + public string issuedAt; + + public JsonAuthData(string redirectUrl, string issuedAt) + { + this.redirectUrl = redirectUrl; + this.issuedAt = issuedAt; } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs index 86f4899a..0f3ba2d9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs @@ -1,4 +1,5 @@ using System; +using System.Numerics; using Sequence.Utils; using UnityEngine.Scripting; @@ -8,18 +9,20 @@ namespace Sequence.EcosystemWallet.Primitives public class AuthData { public string redirectUrl; + public BigInteger issuedAt; [Preserve] - public AuthData(string redirectUrl) + public AuthData(string redirectUrl, BigInteger issuedAt) { this.redirectUrl = redirectUrl; + this.issuedAt = issuedAt; } public byte[] Encode() { byte[] redirectUrlLength = ByteArrayExtensions.ByteArrayFromNumber(redirectUrl.Length, 3); byte[] redirectUrlBytes = redirectUrl.ToByteArray(); - return ByteArrayExtensions.ConcatenateByteArrays(redirectUrlLength, redirectUrlBytes); + return ByteArrayExtensions.ConcatenateByteArrays(redirectUrlLength, redirectUrlBytes, issuedAt.ByteArrayFromNumber(8)); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs index 2619b566..0bc8cef7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs @@ -19,9 +19,16 @@ public override object ToJson() public override byte[] Encode() { var flag = SessionsTopology.FlagIdentitySigner << 4; - Debug.Log($"IdentitySignerLeaf {ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), identitySigner.Value.HexStringToByteArray()).ByteArrayToHexStringWithPrefix()}"); + Debug.Log($"IdentitySigner {ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), identitySigner.Value.HexStringToByteArray()).ByteArrayToHexStringWithPrefix()}"); return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), identitySigner.Value.HexStringToByteArray()); } + + public override byte[] EncodeGeneric() + { + return ByteArrayExtensions.ConcatenateByteArrays( + SessionsTopology.FlagIdentitySigner.ByteArrayFromNumber(1), + identitySigner.Value.HexStringToByteArray(20)); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs index 304a27ed..3000eb01 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs @@ -38,6 +38,13 @@ public override byte[] Encode() var flagByte = (SessionsTopology.FlagBlacklist << 4) | count; return ByteArrayExtensions.ConcatenateByteArrays(flagByte.ByteArrayFromNumber(flagByte.MinBytesFor()), encoded); } + + public override byte[] EncodeGeneric() + { + return ByteArrayExtensions.ConcatenateByteArrays( + SessionsTopology.FlagBlacklist.ByteArrayFromNumber(1), + EncodeBlacklist()); + } private byte[] EncodeBlacklist() { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs index 1b0ea6e8..1dd13246 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs @@ -16,5 +16,10 @@ public override byte[] Encode() var flag = SessionsTopology.FlagPermissions << 4; return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), permissions.Encode()); } + + public override byte[] EncodeGeneric() + { + return ByteArrayExtensions.ConcatenateByteArrays(SessionsTopology.FlagPermissions.ByteArrayFromNumber(1), permissions.Encode()); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs index c708afae..d0ff61b0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs @@ -30,7 +30,7 @@ public static SessionCallSignature FromJson(string json) return new ExplicitSessionCallSignature { permissionIndex = BigInteger.Parse((string)permissionIndex), - sessionSignature = new RSY(), + sessionSignature = RSY.FromString((string)data["sessionSignature"]), }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs index 887fe2f8..3377b846 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs @@ -8,6 +8,7 @@ public abstract class SessionLeaf public abstract object ToJson(); public abstract byte[] Encode(); + public abstract byte[] EncodeGeneric(); public SessionsTopology ToTopology() { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs index 11b7bdb5..7b0edc2d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs @@ -16,5 +16,10 @@ public override byte[] Encode() var flag = SessionsTopology.FlagNode << 4; return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), Value); } + + public override byte[] EncodeGeneric() + { + return Value; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index b15e7b7c..db914eae 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -5,6 +5,7 @@ using Sequence.ABI; using Sequence.Utils; using Unity.Plastic.Newtonsoft.Json; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -49,6 +50,11 @@ public object ToJson() throw new Exception("Invalid topology."); } + + public string ImageHash() + { + return Hash(true); + } public byte[] Encode() { @@ -99,7 +105,7 @@ public SessionsTopology Minimise(Address[] explicitSigners, Address[] implicitSi return new SessionNodeLeaf { - Value = Hash().HexStringToByteArray() + Value = Hash(true).HexStringToByteArray() }.ToTopology(); } @@ -109,7 +115,7 @@ public SessionsTopology Minimise(Address[] explicitSigners, Address[] implicitSi { return new SessionNodeLeaf { - Value = Hash().HexStringToByteArray() + Value = Hash(true).HexStringToByteArray() }.ToTopology(); } @@ -122,7 +128,7 @@ public SessionsTopology Minimise(Address[] explicitSigners, Address[] implicitSi throw new Exception("Invalid topology"); } - public string Hash() + public string Hash(bool generic = false) { if (IsBranch) { @@ -130,11 +136,12 @@ public string Hash() if (children.Length == 0) throw new Exception("Empty branch"); - var hashedChildren = children.Select(child => child.Hash()).ToArray(); + var hashedChildren = children.Select(child => child.Hash(generic)).ToArray(); var childBytes = hashedChildren[0].HexStringToByteArray(); for (var i = 1; i < hashedChildren.Length; i++) { + Debug.Log($"BRANCH Combine {childBytes.ByteArrayToHexStringWithPrefix()}, {hashedChildren[i]}, {SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(childBytes, hashedChildren[i].HexStringToByteArray())).ByteArrayToHexStringWithPrefix()}"); var nextBytes = hashedChildren[i].HexStringToByteArray(); childBytes = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(childBytes, nextBytes)); } @@ -143,10 +150,15 @@ public string Hash() } if (IsLeaf && Leaf is SessionNodeLeaf nodeLeaf) + { + Debug.Log($"Node Leaf"); return nodeLeaf.Value.ByteArrayToHexStringWithPrefix(); - + } + + Debug.Log($"Encoded: {Leaf.EncodeGeneric().ByteArrayToHexStringWithPrefix()}, Hashed: {SequenceCoder.KeccakHash(generic ? Leaf.EncodeGeneric() : Leaf.Encode()).ByteArrayToHexStringWithPrefix()}"); + if (IsLeaf) - return SequenceCoder.KeccakHash(Leaf.Encode()).ByteArrayToHexStringWithPrefix(); + return SequenceCoder.KeccakHash(generic ? Leaf.EncodeGeneric() : Leaf.Encode()).ByteArrayToHexStringWithPrefix(); throw new Exception("Invalid tree structure"); } From 4ab48cef9537d0986c1e4d7f69d51714d1e049d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 1 Jul 2025 16:49:42 +0200 Subject: [PATCH 081/165] removing explicit session --- .../IntegrationTests/SessionsTest.cs | 6 ++- .../UnitTests/SessionsUnitTests.cs | 11 +++++- .../Primitives/Sessions/IdentitySignerLeaf.cs | 2 - .../Primitives/Sessions/SessionsTopology.cs | 37 ++++++++++++++----- 4 files changed, 41 insertions(+), 15 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs index 94e8c115..d0a7177f 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs @@ -75,7 +75,11 @@ public Task SessionExplicitAdd(Dictionary parameters) public Task SessionExplicitRemove(Dictionary parameters) { - throw new NotImplementedException(); + var explicitSessionAddress = new Address((string)parameters["explicitSession"]); + var sessionTopology = SessionsTopology.FromJson(parameters["sessionTopology"].ToString()); + var newTopology = sessionTopology.RemoveExplicitSession(explicitSessionAddress); + + return Task.FromResult(newTopology.JsonSerialize()); } public Task SessionImplicitAddBlacklistAddress(Dictionary parameters) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs index 1ec66d1f..a455ab58 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs @@ -37,6 +37,15 @@ public void TestAddExplicitSession(string inputJson) var newTopology = sessionTopology.AddExplicitSession(explicitSession); Debug.Log($"{newTopology.JsonSerialize()}"); } + + [TestCase("0x00000000000000000000000000000000000025a8", "[{\"type\":\"implicit-blacklist\",\"blacklist\":[]},[{\"type\":\"identity-signer\",\"identitySigner\":\"0x8312fc6754389018bdD3BDfEFf226DD8eD9EcdB1\"},{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000025a8\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}]]")] + public void RemoveExplicitSession(string address, string inputJson) + { + var sessionTopology = SessionsTopology.FromJson(inputJson); + var newTopology = sessionTopology.RemoveExplicitSession(new Address(address)); + + Debug.Log($"{newTopology.JsonSerialize()}"); + } [TestCase("{\"sessionTopology\":[[[[[[[[[[[[[[[[[[[[[{\"type\":\"implicit-blacklist\",\"blacklist\":[]},{\"type\":\"identity-signer\",\"identitySigner\":\"0x8312fc6754389018bdD3BDfEFf226DD8eD9EcdB1\"}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000025a8\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000009CD\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002AA7\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000026eB\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000001F8C\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000435E\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000026e\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000133b\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002B44\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000004C\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002015\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000000E9\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003Ec4\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000002eF\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003703\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003dEB\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000057Eb\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000000373\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000002be\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000001EA6\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],\"blacklistAddress\":\"0x0000000000000000000000000000000000000269\"}")] public void AddBlacklistAddress(string inputJson) @@ -80,8 +89,6 @@ public void CreateSessionImageHash(string inputJson) var imageHash = sessionTopology.ImageHash(); Debug.Log($"{imageHash}"); - - Assert.AreEqual(imageHash, "0x0a987248daf9d7b5372a694abfa45390e69a102c1e587c0b6ed9670909213be2"); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs index 0bc8cef7..96e670a1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs @@ -1,5 +1,4 @@ using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -19,7 +18,6 @@ public override object ToJson() public override byte[] Encode() { var flag = SessionsTopology.FlagIdentitySigner << 4; - Debug.Log($"IdentitySigner {ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), identitySigner.Value.HexStringToByteArray()).ByteArrayToHexStringWithPrefix()}"); return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), identitySigner.Value.HexStringToByteArray()); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index db914eae..b2462ff4 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -2,10 +2,10 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; +using JetBrains.Annotations; +using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; -using Unity.Plastic.Newtonsoft.Json; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -141,7 +141,6 @@ public string Hash(bool generic = false) var childBytes = hashedChildren[0].HexStringToByteArray(); for (var i = 1; i < hashedChildren.Length; i++) { - Debug.Log($"BRANCH Combine {childBytes.ByteArrayToHexStringWithPrefix()}, {hashedChildren[i]}, {SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(childBytes, hashedChildren[i].HexStringToByteArray())).ByteArrayToHexStringWithPrefix()}"); var nextBytes = hashedChildren[i].HexStringToByteArray(); childBytes = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(childBytes, nextBytes)); } @@ -150,12 +149,7 @@ public string Hash(bool generic = false) } if (IsLeaf && Leaf is SessionNodeLeaf nodeLeaf) - { - Debug.Log($"Node Leaf"); return nodeLeaf.Value.ByteArrayToHexStringWithPrefix(); - } - - Debug.Log($"Encoded: {Leaf.EncodeGeneric().ByteArrayToHexStringWithPrefix()}, Hashed: {SequenceCoder.KeccakHash(generic ? Leaf.EncodeGeneric() : Leaf.Encode()).ByteArrayToHexStringWithPrefix()}"); if (IsLeaf) return SequenceCoder.KeccakHash(generic ? Leaf.EncodeGeneric() : Leaf.Encode()).ByteArrayToHexStringWithPrefix(); @@ -195,9 +189,32 @@ public SessionsTopology AddExplicitSession(SessionPermissions session) }.ToTopology())); } - public SessionsTopology RemoveExplicitSession(SessionPermissions session) + [CanBeNull] + public SessionsTopology RemoveExplicitSession(Address address) { - throw new Exception("Not implemented."); + if (IsLeaf && Leaf is PermissionLeaf permissionLeaf) + return permissionLeaf.permissions.signer.Equals(address) ? null : this; + + if (IsBranch) + { + var newChildren = new List(); + foreach (var child in Branch.Children) + { + var updatedChild = child.RemoveExplicitSession(address); + if (updatedChild != null) + newChildren.Add(updatedChild); + } + + if (newChildren.Count == 0) + return null; + + if (newChildren.Count == 1) + return newChildren[0]; + + return new SessionBranch(newChildren.ToArray()).ToTopology(); + } + + return this; } public void AddToImplicitBlacklist(Address address) From cecf48a88bcd0afcf6c9b3cff940449f8f8482c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 1 Jul 2025 16:59:04 +0200 Subject: [PATCH 082/165] remove address from blacklist --- .../EcosystemWallet/UnitTests/SessionsUnitTests.cs | 12 ++++++++++++ .../Primitives/Sessions/SessionsTopology.cs | 9 +++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs index a455ab58..cf114de2 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs @@ -60,6 +60,18 @@ public void AddBlacklistAddress(string inputJson) Debug.Log($"{sessionsTopology.JsonSerialize()}"); } + [TestCase("0x0000000000000000000000000000000000000269", "[[[[[[[[[[[[[[[[[[[[[{\"type\":\"implicit-blacklist\",\"blacklist\":[\"0x0000000000000000000000000000000000000269\"]},{\"type\":\"identity-signer\",\"identitySigner\":\"0x8312fc6754389018bdD3BDfEFf226DD8eD9EcdB1\"}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000025a8\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000009CD\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002AA7\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000026eB\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000001F8C\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000435E\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000026e\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000133b\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002B44\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000004C\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002015\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000000E9\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003Ec4\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000002eF\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003703\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003dEB\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000057Eb\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000000373\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000002be\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000001EA6\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}]")] + public void RemoveBlacklistAddress(string address, string inputJson) + { + var sessionsTopology = SessionsTopology.FromJson(inputJson); + sessionsTopology.RemoveFromImplicitBlacklist(new Address(address)); + + Debug.Log($"{sessionsTopology.JsonSerialize()}"); + + var removed = sessionsTopology.FindLeaf(_ => true).blacklist.Length == 0; + Assert.True(removed); + } + [TestCase("{\"sessionTopology\":[[[[{\"type\":\"implicit-blacklist\",\"blacklist\":[\"0x0000000000000000000000000000000000000120\",\"0x0000000000000000000000000000000000000269\",\"0x00000000000000000000000000000000000019c7\",\"0x00000000000000000000000000000000000027D6\",\"0x000000000000000000000000000000000000289C\"]},{\"type\":\"identity-signer\",\"identitySigner\":\"0x8312fc6754389018bdD3BDfEFf226DD8eD9EcdB1\"}],[{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000025a8\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},[{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000009CD\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002AA7\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}]]],[[{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000026eB\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},[{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000001F8C\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000435E\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}]],[{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000026e\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},[{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000133b\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002B44\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}]]]],[[[{\"type\":\"session-permissions\",\"signer\":\"0x000000000000000000000000000000000000004C\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000002015\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}],[{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000000E9\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},[{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003Ec4\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000002eF\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}]]],[[{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003703\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},[{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000003dEB\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000057Eb\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}]],[{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000000373\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},[{\"type\":\"session-permissions\",\"signer\":\"0x00000000000000000000000000000000000002be\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]},{\"type\":\"session-permissions\",\"signer\":\"0x0000000000000000000000000000000000001EA6\",\"valueLimit\":\"0\",\"deadline\":\"0\",\"permissions\":[]}]]]]],\"callSignatures\":[],\"explicitSigners\":[\"0x00000000000000000000000000000000000025a8\"],\"implicitSigners\":[\"0x9ed233eCAE5E093CAff8Ff8E147DdAfc704EC619\"]}")] public void EncodeCallSignatures(string inputJson) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index b2462ff4..14959775 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -231,9 +231,14 @@ public void AddToImplicitBlacklist(Address address) existingLeaf.blacklist = blacklist.OrderBy(h => h.Value.HexStringToByteArray(), new ByteArrayComparer()).ToArray(); } - public SessionsTopology RemoveFromImplicitBlacklist(Address address) + public void RemoveFromImplicitBlacklist(Address address) { - throw new Exception("Not implemented."); + var leaf = FindLeaf(_ => true); + if (leaf == null) + throw new Exception("No blacklist found."); + + var newBlacklist = leaf.blacklist.Where(a => !a.Equals(address)).ToArray(); + leaf.blacklist = newBlacklist; } public static SessionsTopology MergeSessionsTopologies(SessionsTopology a, SessionsTopology b) From 0f85dbf60f2842a7021e152f970812a2377d8502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 1 Jul 2025 17:26:22 +0200 Subject: [PATCH 083/165] added AddressFactory --- .../IntegrationTests/SessionsTest.cs | 6 +++- .../EcosystemWallet/Primitives/Address.meta | 3 ++ .../Primitives/Address/AddressFactory.cs | 31 +++++++++++++++++++ .../Primitives/Address/AddressFactory.cs.meta | 3 ++ .../Sequence/SequenceSDK/Utils/ArrayUtils.cs | 17 ++++++++++ 5 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs index d0a7177f..82806afa 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs @@ -95,7 +95,11 @@ public Task SessionImplicitAddBlacklistAddress(Dictionary SessionImplicitRemoveBlacklistAddress(Dictionary parameters) { - throw new NotImplementedException(); + var address = new Address((string)parameters["address"]); + var sessionTopology = SessionsTopology.FromJson(parameters["sessionTopology"].ToString()); + sessionTopology.RemoveFromImplicitBlacklist(address); + + return Task.FromResult(sessionTopology.JsonSerialize()); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address.meta new file mode 100644 index 00000000..6380783f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1bf937add01542f88f4c9e54a59e3c6a +timeCreated: 1751382100 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs new file mode 100644 index 00000000..29803cd1 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs @@ -0,0 +1,31 @@ +using Sequence.ABI; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public static class AddressFactory + { + public static Address Create(Topology topology, string factory, string module, string creationCode = null) + { + return Create(topology.HashConfiguration(), factory, module, creationCode); + } + + public static Address Create(byte[] imageHash, string factory, string module, string creationCode = null) + { + return new Address( + SequenceCoder.KeccakHash( + ByteArrayExtensions.ConcatenateByteArrays("0xff".HexStringToByteArray(), + factory.HexStringToByteArray(), + imageHash, + SequenceCoder.KeccakHash( + ByteArrayExtensions.ConcatenateByteArrays( + creationCode.HexStringToByteArray(), + module.HexStringToByteArray(32)) + ) + ) + ) + .SubArray(12) + ); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs.meta new file mode 100644 index 00000000..1fa1ca6c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8139d1c21f4a4fefbaa8ebea081158fb +timeCreated: 1751382106 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs index 27d2d3be..a14d614b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs @@ -125,5 +125,22 @@ public static T[] Slice(this T[] input, int start) Array.Copy(input, start, result, 0, length); return result; } + + public static T[] SubArray(this T[] array, int startIndex, int? length = null) + { + if (array == null) + throw new ArgumentNullException(nameof(array)); + if (startIndex < 0 || startIndex > array.Length) + throw new ArgumentOutOfRangeException(nameof(startIndex)); + + int actualLength = length ?? (array.Length - startIndex); + + if (actualLength < 0 || startIndex + actualLength > array.Length) + throw new ArgumentOutOfRangeException(nameof(length)); + + T[] result = new T[actualLength]; + Array.Copy(array, startIndex, result, 0, actualLength); + return result; + } } } \ No newline at end of file From 401d243a7f17bb2d1ba36d5bd5cf1398e23a1ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 1 Jul 2025 17:32:58 +0200 Subject: [PATCH 084/165] test to create sequence address --- .../UnitTests/ConfigSignatureTests.cs | 26 ++++++++++--------- .../UnitTests/SessionsUnitTests.cs | 7 +++++ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs index 2d60ae8e..86530efc 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs @@ -11,16 +11,10 @@ namespace Sequence.EcosystemWallet.UnitTests { public class ConfigSignatureTests { - private const string ConfigInput = - "{\"input\":{\"threshold\":\"2\",\"checkpoint\":\"22850\",\"topology\":{\"type\":\"signer\",\"address\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D\",\"weight\":\"2\"},\"checkpointer\":\"0x0000000000000000000000000000000000001bE9\"},\"signatures\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D:hash:0x13a31d1a2ec622361e3285cc7377bb05ad8a7ee7db48551f9d94e5036a1306de:0x1d615daff8918cd9180a9ac57c6dd590beb8d567b4ad8ecc4ca7b05296895916:27\",\"chainId\":true,\"checkpointerData\":\"0x000000000000000000000000000000000000000000000000000000000001a12a\"}"; - - private const string RandomConfigParams = - "{\"maxDepth\":54,\"seed\":\"3313\",\"minThresholdOnNested\":1,\"skewed\":\"right\"}"; - - [Test] - public void TestConfigSignature() + [TestCase("{\"input\":{\"threshold\":\"2\",\"checkpoint\":\"22850\",\"topology\":{\"type\":\"signer\",\"address\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D\",\"weight\":\"2\"},\"checkpointer\":\"0x0000000000000000000000000000000000001bE9\"},\"signatures\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D:hash:0x13a31d1a2ec622361e3285cc7377bb05ad8a7ee7db48551f9d94e5036a1306de:0x1d615daff8918cd9180a9ac57c6dd590beb8d567b4ad8ecc4ca7b05296895916:27\",\"chainId\":true,\"checkpointerData\":\"0x000000000000000000000000000000000000000000000000000000000001a12a\"}")] + public void TestConfigSignature(string json) { - var parameters = JsonConvert.DeserializeObject>(ConfigInput); + var parameters = JsonConvert.DeserializeObject>(json); var input = parameters["input"].ToString(); var config = Primitives.Config.FromJson(input); @@ -42,10 +36,18 @@ public void TestConfigSignature() Assert.AreEqual(config.checkpointer, decoded.configuration.checkpointer); } - [Test] - public void TestRecoverRandomConfig() + [TestCase("{\"threshold\":\"2\",\"checkpoint\":\"22850\",\"topology\":{\"type\":\"signer\",\"address\":\"0xD461055c456f50E9A3B6A497C5AA8027c0e3884D\",\"weight\":\"2\"},\"checkpointer\":\"0x0000000000000000000000000000000000001bE9\"}")] + public void CreateConfigHashConfiguration(string json) + { + var config = Primitives.Config.FromJson(json); + var imageHash = config.HashConfiguration(); + Debug.Log($"Image Hash for config: {imageHash.ByteArrayToHexStringWithPrefix()}"); + } + + [TestCase("{\"maxDepth\":54,\"seed\":\"3313\",\"minThresholdOnNested\":1,\"skewed\":\"right\"}")] + public void TestRecoverRandomConfig(string json) { - var parameters = JsonConvert.DeserializeObject>(RandomConfigParams); + var parameters = JsonConvert.DeserializeObject>(json); var maxDepth = int.Parse(parameters["maxDepth"].ToString()); var seed = (string)parameters["seed"]; diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs index cf114de2..53e5444b 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs @@ -102,5 +102,12 @@ public void CreateSessionImageHash(string inputJson) Debug.Log($"{imageHash}"); } + + [TestCase("0x96ce1c47176b2034168210c9f807835d82e7bf8ca8fb08ce54e2cf81af7ad016", "0x0000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000")] + public void CreateAddress(string imageHash, string factory, string module, string creationCode) + { + var address = AddressFactory.Create(imageHash.HexStringToByteArray(), factory, module, creationCode); + Debug.Log($"Sequence Address: {address}"); + } } } \ No newline at end of file From 3a2d7173551a0ea20d95c90d44555b975530c359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 1 Jul 2025 17:42:59 +0200 Subject: [PATCH 085/165] added primitives readme --- .../EcosystemWallet/Primitives/README.md | 33 +++++++++++++++++++ .../EcosystemWallet/Primitives/README.md.meta | 3 ++ 2 files changed, 36 insertions(+) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md new file mode 100644 index 00000000..3b99615d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md @@ -0,0 +1,33 @@ +# Sequence Wallets v3 - Primitives + +The goal of this Technical Design Document (TDD) is to document the architecture for each primitive. +The integration of v3 primitives in C# is fully encapsulated from Unity and aims to be an object-oriented library for +Sequence's v3 wallets. + +## Primitives + +--- + +### Payload + +TBD + +### Config Topology + +TBD + +### Session Topology + +TBD + +## Testing Infrastructure + +--- + +### Integration Tests + +TBD + +### Unit Tests + +TBD \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md.meta new file mode 100644 index 00000000..14b162bc --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 632a7a4e646a4038952a74800254ef65 +timeCreated: 1751384228 \ No newline at end of file From bd5684498645accf72c82c1000b958537349afcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 1 Jul 2025 18:53:49 +0200 Subject: [PATCH 086/165] added base data type ITopology, started adding recovery tests --- .../IntegrationTests/DevToolsTest.cs | 2 +- .../IntegrationTests/PasskeysTests.cs | 28 +++++ .../IntegrationTests/PasskeysTests.cs.meta | 3 + .../IntegrationTests/RecoveryTests.cs | 33 ++++++ .../IntegrationTests/RecoveryTests.cs.meta | 3 + .../IntegrationTests/Server/Server.cs | 10 ++ .../IntegrationTests/SessionsTest.cs | 10 ++ .../Primitives/Permission/ParameterRule.cs | 2 +- .../EcosystemWallet/Primitives/Recovery.meta | 3 + .../Primitives/Recovery/RecoveryBranch.cs | 7 ++ .../Recovery/RecoveryBranch.cs.meta | 3 + .../Primitives/Recovery/RecoveryLeaf.cs | 33 ++++++ .../Primitives/Recovery/RecoveryLeaf.cs.meta | 3 + .../Primitives/Sessions/IdentitySignerLeaf.cs | 2 +- .../Sessions/ImplicitBlacklistLeaf.cs | 2 +- .../Primitives/Sessions/PermissionLeaf.cs | 2 +- .../Primitives/Sessions/SessionBranch.cs | 8 +- .../Primitives/Sessions/SessionLeaf.cs | 4 +- .../Primitives/Sessions/SessionNodeLeaf.cs | 15 ++- .../Primitives/Sessions/SessionsTopology.cs | 106 ++++++------------ .../Sessions/SessionsTopologyUtils.cs | 13 +-- .../EcosystemWallet/Primitives/Topology.meta | 3 + .../Primitives/Topology/IBranch.cs | 10 ++ .../Primitives/Topology/IBranch.cs.meta | 3 + .../Primitives/Topology/ILeaf.cs | 9 ++ .../Primitives/Topology/ILeaf.cs.meta | 3 + .../Primitives/Topology/INode.cs | 10 ++ .../Primitives/Topology/INode.cs.meta | 3 + .../Primitives/Topology/ITopology.cs | 12 ++ .../Primitives/Topology/ITopology.cs.meta | 3 + .../Primitives/Topology/TopologyExtensions.cs | 70 ++++++++++++ .../Topology/TopologyExtensions.cs.meta | 3 + 32 files changed, 328 insertions(+), 93 deletions(-) create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PasskeysTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PasskeysTests.cs.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ILeaf.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ILeaf.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/INode.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/INode.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ITopology.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ITopology.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs index fb89ce63..844de938 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs @@ -26,7 +26,7 @@ public Task DevToolsRandomConfig(Dictionary parameters) public Task DevToolsRandomSessionTopology(Dictionary parameters) { - throw new System.NotImplementedException("DevToolsTest.DevToolsRandomSessionTopology"); + throw new System.NotImplementedException("This test is not yet used during the tests with forge."); } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PasskeysTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PasskeysTests.cs new file mode 100644 index 00000000..77018fbd --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PasskeysTests.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public class PasskeysTests + { + public Task EncodeSignature(Dictionary parameters) + { + throw new System.NotImplementedException(); + } + + public Task DecodeSignature(Dictionary parameters) + { + throw new System.NotImplementedException(); + } + + public Task ComputeRoot(Dictionary parameters) + { + throw new System.NotImplementedException(); + } + + public Task ValidateSignature(Dictionary parameters) + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PasskeysTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PasskeysTests.cs.meta new file mode 100644 index 00000000..126bdc2a --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PasskeysTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4af4b3f4a53447c59245996cffa2000b +timeCreated: 1751385656 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs new file mode 100644 index 00000000..fb8d7637 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public class RecoveryTests + { + public Task HashFromLeaves(Dictionary parameters) + { + var leavesInput = (string)parameters["leaves"]; + var leaves = leavesInput.Split(' ').Select(RecoveryLeaf.FromInput).ToArray(); + + throw new System.NotImplementedException(); + } + + public Task Encode(Dictionary parameters) + { + throw new System.NotImplementedException(); + } + + public Task Trim(Dictionary parameters) + { + throw new System.NotImplementedException(); + } + + public Task HashEncoded(Dictionary parameters) + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs.meta new file mode 100644 index 00000000..dcccc8f2 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 90de75d14bba4f4ab547a251ed236096 +timeCreated: 1751385564 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs index f99b0b25..2814673d 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs @@ -40,6 +40,16 @@ internal class Server ["session_explicit_remove"] = async (parameters) => await new SessionsTest().SessionExplicitRemove(parameters), ["session_implicit_addBlacklistAddress"] = async (parameters) => await new SessionsTest().SessionImplicitAddBlacklistAddress(parameters), ["session_implicit_removeBlacklistAddress"] = async (parameters) => await new SessionsTest().SessionImplicitRemoveBlacklistAddress(parameters), + // RECOVERY + ["recovery_hashFromLeaves"] = async (parameters) => await new RecoveryTests().HashFromLeaves(parameters), + ["recovery_encode"] = async (parameters) => await new RecoveryTests().Encode(parameters), + ["recovery_trim"] = async (parameters) => await new RecoveryTests().Trim(parameters), + ["recovery_hashEncoded"] = async (parameters) => await new RecoveryTests().HashEncoded(parameters), + // PASSKEYS + ["passkeys_encodeSignature"] = async (parameters) => await new PasskeysTests().EncodeSignature(parameters), + ["passkeys_decodeSignature"] = async (parameters) => await new PasskeysTests().DecodeSignature(parameters), + ["passkeys_computeRoot"] = async (parameters) => await new PasskeysTests().ComputeRoot(parameters), + ["passkeys_validateSignature"] = async (parameters) => await new PasskeysTests().ValidateSignature(parameters), }; public async Task HandleSingleRequest( diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs index 82806afa..e875d92c 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs @@ -73,6 +73,11 @@ public Task SessionExplicitAdd(Dictionary parameters) return Task.FromResult(newTopology.JsonSerialize()); } + /// + /// This test is not yet used during the tests with forge. + /// + /// + /// public Task SessionExplicitRemove(Dictionary parameters) { var explicitSessionAddress = new Address((string)parameters["explicitSession"]); @@ -93,6 +98,11 @@ public Task SessionImplicitAddBlacklistAddress(Dictionary + /// This test is not yet used during the tests with forge. + /// + /// + /// public Task SessionImplicitRemoveBlacklistAddress(Dictionary parameters) { var address = new Address((string)parameters["address"]); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs index 8a17f62b..b38ae46e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs @@ -21,7 +21,7 @@ public object ToJson() return new { cumulative = cumulative, - operation = operation, + operation = (int)operation, value = value.ByteArrayToHexStringWithPrefix(), offset = offset.ToString(), mask = mask.ByteArrayToHexStringWithPrefix() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery.meta new file mode 100644 index 00000000..ffa98350 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 186d6c46a94b4ad688c8f015f914fd22 +timeCreated: 1751385867 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs new file mode 100644 index 00000000..eb6e734d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs @@ -0,0 +1,7 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public class RecoveryBranch + { + + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs.meta new file mode 100644 index 00000000..05b4e783 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8b93327837dc44b6b45c01e87213b023 +timeCreated: 1751386353 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs new file mode 100644 index 00000000..23106b6a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs @@ -0,0 +1,33 @@ +using System; +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class RecoveryLeaf + { + public Address signer; + public BigInteger requiredDeltaTime; + public BigInteger minTimestamp; + + public static RecoveryLeaf FromInput(string input) + { + var parts = input.Split(':'); + if (parts.Length != 4 || parts[0] != "signer") + throw new ArgumentException($"Invalid leaf format: {input}"); + + var address = parts[1]; + var requiredDeltaTimeStr = parts[2]; + var minTimestampStr = parts[3]; + + if (string.IsNullOrEmpty(requiredDeltaTimeStr) || string.IsNullOrEmpty(minTimestampStr)) + throw new ArgumentException($"Invalid leaf format: {input}"); + + return new RecoveryLeaf + { + signer = new Address(address), + requiredDeltaTime = BigInteger.Parse(requiredDeltaTimeStr), + minTimestamp = BigInteger.Parse(minTimestampStr) + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs.meta new file mode 100644 index 00000000..f26ff69a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1cf97e15b6964bfc9600952110281790 +timeCreated: 1751385875 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs index 96e670a1..b66ed7f6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs @@ -22,7 +22,7 @@ public override byte[] Encode() identitySigner.Value.HexStringToByteArray()); } - public override byte[] EncodeGeneric() + public override byte[] EncodeRaw() { return ByteArrayExtensions.ConcatenateByteArrays( SessionsTopology.FlagIdentitySigner.ByteArrayFromNumber(1), diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs index 3000eb01..66a0bb05 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs @@ -39,7 +39,7 @@ public override byte[] Encode() return ByteArrayExtensions.ConcatenateByteArrays(flagByte.ByteArrayFromNumber(flagByte.MinBytesFor()), encoded); } - public override byte[] EncodeGeneric() + public override byte[] EncodeRaw() { return ByteArrayExtensions.ConcatenateByteArrays( SessionsTopology.FlagBlacklist.ByteArrayFromNumber(1), diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs index 1dd13246..1bed2c82 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs @@ -17,7 +17,7 @@ public override byte[] Encode() return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), permissions.Encode()); } - public override byte[] EncodeGeneric() + public override byte[] EncodeRaw() { return ByteArrayExtensions.ConcatenateByteArrays(SessionsTopology.FlagPermissions.ByteArrayFromNumber(1), permissions.Encode()); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs index 6a6769b1..f5234767 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs @@ -6,16 +6,16 @@ namespace Sequence.EcosystemWallet.Primitives { - public class SessionBranch + public class SessionBranch : IBranch { - public SessionsTopology[] Children; + public ITopology[] Children { get; set; } public SessionBranch(SessionsTopology left, SessionsTopology right) { - Children = new[] { left, right }; + Children = new ITopology[] { left, right }; } - public SessionBranch(SessionsTopology[] children) + public SessionBranch(ITopology[] children) { Children = children; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs index 3377b846..f6dc9e8c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.Primitives { - public abstract class SessionLeaf + public abstract class SessionLeaf : ILeaf { public const string ImplicitBlacklistType = "implicit-blacklist"; public const string IdentitySignerType = "identity-signer"; @@ -8,7 +8,7 @@ public abstract class SessionLeaf public abstract object ToJson(); public abstract byte[] Encode(); - public abstract byte[] EncodeGeneric(); + public abstract byte[] EncodeRaw(); public SessionsTopology ToTopology() { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs index 7b0edc2d..3ccf1fd7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs @@ -2,24 +2,29 @@ namespace Sequence.EcosystemWallet.Primitives { - public class SessionNodeLeaf : SessionLeaf + public class SessionNodeLeaf : INode { - public byte[] Value; + public byte[] Value { get; set; } - public override object ToJson() + public object ToJson() { return Value.ByteArrayToHexStringWithPrefix(); } - public override byte[] Encode() + public byte[] Encode() { var flag = SessionsTopology.FlagNode << 4; return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), Value); } - public override byte[] EncodeGeneric() + public byte[] EncodeRaw() { return Value; } + + public SessionsTopology ToTopology() + { + return new SessionsTopology(this); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index 14959775..6be1f715 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -9,7 +9,7 @@ namespace Sequence.EcosystemWallet.Primitives { - public class SessionsTopology + public class SessionsTopology : ITopology { public const int FlagPermissions = 0; public const int FlagNode = 1; @@ -17,23 +17,24 @@ public class SessionsTopology public const int FlagBlacklist = 3; public const int FlagIdentitySigner = 4; - public readonly SessionBranch Branch; - public readonly SessionLeaf Leaf; - - public bool IsBranch => Branch != null; - public bool IsLeaf => Leaf != null; + public IBranch Branch { get; } + public ILeaf Leaf { get; } + public INode Node { get; } public SessionsTopology(SessionBranch branch) { this.Branch = branch; - this.Leaf = null; } public SessionsTopology(SessionLeaf leaf) { - this.Branch = null; this.Leaf = leaf; } + + public SessionsTopology(SessionNodeLeaf node) + { + this.Node = node; + } public string JsonSerialize() { @@ -42,27 +43,33 @@ public string JsonSerialize() public object ToJson() { - if (IsBranch) + if (this.IsBranch()) return Branch.ToJson(); - if (IsLeaf) + if (this.IsLeaf()) return Leaf.ToJson(); + + if (this.IsNode()) + return Node.ToJson(); throw new Exception("Invalid topology."); } public string ImageHash() { - return Hash(true); + return this.Hash(true); } public byte[] Encode() { - if (IsBranch) + if (this.IsBranch()) return Branch.Encode(); - if (IsLeaf) + if (this.IsLeaf()) return Leaf.Encode(); + + if (this.IsNode()) + return Node.Encode(); throw new Exception("Invalid topology."); } @@ -76,16 +83,16 @@ public byte[] Encode() /// public SessionsTopology Minimise(Address[] explicitSigners, Address[] implicitSigners) { - if (IsBranch) + if (this.IsBranch()) { - var branchList = Branch.Children - .Select(branch => branch.Minimise(explicitSigners, implicitSigners)) + var branchList = ((SessionsTopology[])Branch.Children) + .Select(branch => (ITopology)branch.Minimise(explicitSigners, implicitSigners)) .ToArray(); - if (branchList.All(b => b.IsLeaf && b.Leaf is SessionNodeLeaf)) + if (branchList.All(b => b.Node is SessionNodeLeaf)) { var nodeBytes = branchList - .Select(node => (node.Leaf as SessionNodeLeaf)?.Value) + .Select(node => (node.Node as SessionNodeLeaf)?.Value) .ToArray(); var concatenated = ByteArrayExtensions.ConcatenateByteArrays(nodeBytes); @@ -105,7 +112,7 @@ public SessionsTopology Minimise(Address[] explicitSigners, Address[] implicitSi return new SessionNodeLeaf { - Value = Hash(true).HexStringToByteArray() + Value = this.Hash(true).HexStringToByteArray() }.ToTopology(); } @@ -115,69 +122,28 @@ public SessionsTopology Minimise(Address[] explicitSigners, Address[] implicitSi { return new SessionNodeLeaf { - Value = Hash(true).HexStringToByteArray() + Value = this.Hash(true).HexStringToByteArray() }.ToTopology(); } return this; } - if (Leaf is IdentitySignerLeaf or SessionNodeLeaf) + if (Leaf is IdentitySignerLeaf || Node is SessionNodeLeaf) return this; throw new Exception("Invalid topology"); } - - public string Hash(bool generic = false) - { - if (IsBranch) - { - var children = Branch.Children; - if (children.Length == 0) - throw new Exception("Empty branch"); - - var hashedChildren = children.Select(child => child.Hash(generic)).ToArray(); - - var childBytes = hashedChildren[0].HexStringToByteArray(); - for (var i = 1; i < hashedChildren.Length; i++) - { - var nextBytes = hashedChildren[i].HexStringToByteArray(); - childBytes = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(childBytes, nextBytes)); - } - - return childBytes.ByteArrayToHexStringWithPrefix(); - } - - if (IsLeaf && Leaf is SessionNodeLeaf nodeLeaf) - return nodeLeaf.Value.ByteArrayToHexStringWithPrefix(); - - if (IsLeaf) - return SequenceCoder.KeccakHash(generic ? Leaf.EncodeGeneric() : Leaf.Encode()).ByteArrayToHexStringWithPrefix(); - - throw new Exception("Invalid tree structure"); - } public bool IsComplete() { - return FindLeaf(_ => true) != null && - FindLeaf(_ => true) != null; - } - - public T FindLeaf(Func check) where T : SessionLeaf - { - if (Leaf is T leaf && check(leaf)) - return leaf; - - if (!IsBranch) - return null; - - return Branch.Children.Select(child => child.FindLeaf(check)) - .FirstOrDefault(childLeaf => childLeaf != null); + return this.FindLeaf(_ => true) != null && + this.FindLeaf(_ => true) != null; } public SessionsTopology AddExplicitSession(SessionPermissions session) { - var existingPermission = FindLeaf(leaf => + var existingPermission = this.FindLeaf(leaf => leaf.permissions.signer.Equals(session.signer)); if (existingPermission != null) @@ -192,13 +158,13 @@ public SessionsTopology AddExplicitSession(SessionPermissions session) [CanBeNull] public SessionsTopology RemoveExplicitSession(Address address) { - if (IsLeaf && Leaf is PermissionLeaf permissionLeaf) + if (this.IsLeaf() && Leaf is PermissionLeaf permissionLeaf) return permissionLeaf.permissions.signer.Equals(address) ? null : this; - if (IsBranch) + if (this.IsBranch()) { var newChildren = new List(); - foreach (var child in Branch.Children) + foreach (var child in (SessionsTopology[])Branch.Children) { var updatedChild = child.RemoveExplicitSession(address); if (updatedChild != null) @@ -219,7 +185,7 @@ public SessionsTopology RemoveExplicitSession(Address address) public void AddToImplicitBlacklist(Address address) { - var existingLeaf = FindLeaf(_ => true); + var existingLeaf = this.FindLeaf(_ => true); if (existingLeaf == null) throw new Exception("No blacklist found."); @@ -233,7 +199,7 @@ public void AddToImplicitBlacklist(Address address) public void RemoveFromImplicitBlacklist(Address address) { - var leaf = FindLeaf(_ => true); + var leaf = this.FindLeaf(_ => true); if (leaf == null) throw new Exception("No blacklist found."); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopologyUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopologyUtils.cs index 814fd335..5bef4936 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopologyUtils.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopologyUtils.cs @@ -10,9 +10,9 @@ public static SessionsTopology BalanceSessionsTopology(SessionsTopology topology { var flattened = FlattenSessionsTopology(topology); - var blacklist = flattened.FirstOrDefault(l => l.IsLeaf && l.Leaf is ImplicitBlacklistLeaf); - var identitySigner = flattened.FirstOrDefault(l => l.IsLeaf && l.Leaf is IdentitySignerLeaf); - var leaves = flattened.Where(l => l.IsLeaf && l.Leaf is PermissionLeaf).ToArray(); + var blacklist = flattened.FirstOrDefault(l => l.IsLeaf() && l.Leaf is ImplicitBlacklistLeaf); + var identitySigner = flattened.FirstOrDefault(l => l.IsLeaf() && l.Leaf is IdentitySignerLeaf); + var leaves = flattened.Where(l => l.IsLeaf() && l.Leaf is PermissionLeaf).ToArray(); if (blacklist == null || identitySigner == null) { @@ -27,18 +27,17 @@ public static SessionsTopology BalanceSessionsTopology(SessionsTopology topology private static SessionsTopology[] FlattenSessionsTopology(SessionsTopology topology) { - if (topology.IsLeaf) + if (topology.Leaf != null) return new [] { topology }; - if (!topology.IsBranch) + if (topology.Branch == null) throw new Exception("Invalid topology structure"); var result = new List(); foreach (var child in topology.Branch.Children) - result.AddRange(FlattenSessionsTopology(child)); + result.AddRange(FlattenSessionsTopology(child as SessionsTopology)); return result.ToArray(); - } private static SessionsTopology BuildBalancedSessionsTopology(SessionsTopology[] topologies) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology.meta new file mode 100644 index 00000000..b96dcb6f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5e8ab89658154a458a57cdf4a723f2b6 +timeCreated: 1751386406 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs new file mode 100644 index 00000000..26914545 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs @@ -0,0 +1,10 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public interface IBranch + { + ITopology[] Children { get; } + + object ToJson(); + byte[] Encode(); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs.meta new file mode 100644 index 00000000..443aa888 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d4f5f1c398704a3f9be3dc4ada4f96a5 +timeCreated: 1751386437 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ILeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ILeaf.cs new file mode 100644 index 00000000..32b4412f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ILeaf.cs @@ -0,0 +1,9 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public interface ILeaf + { + object ToJson(); + byte[] Encode(); + byte[] EncodeRaw(); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ILeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ILeaf.cs.meta new file mode 100644 index 00000000..4ca9aea3 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ILeaf.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4922f11f27d84abe80bd070c763e4f6c +timeCreated: 1751386426 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/INode.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/INode.cs new file mode 100644 index 00000000..4a891d94 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/INode.cs @@ -0,0 +1,10 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public interface INode + { + byte[] Value { get; } + + object ToJson(); + byte[] Encode(); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/INode.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/INode.cs.meta new file mode 100644 index 00000000..406d1ba9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/INode.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5d0fdc6cca0e4a7a9a059c7a1edfecf7 +timeCreated: 1751386662 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ITopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ITopology.cs new file mode 100644 index 00000000..f3de56cf --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ITopology.cs @@ -0,0 +1,12 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public interface ITopology + { + IBranch Branch { get; } + ILeaf Leaf { get; } + INode Node { get; } + + object ToJson(); + byte[] Encode(); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ITopology.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ITopology.cs.meta new file mode 100644 index 00000000..3656c48b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ITopology.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d7ad757b743e42d48d688b9a512ce721 +timeCreated: 1751386414 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs new file mode 100644 index 00000000..ff60cefd --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs @@ -0,0 +1,70 @@ +using System; +using System.Linq; +using Sequence.ABI; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public static class TopologyExtensions + { + public static bool IsBranch(this ITopology topology) + { + return topology.Branch != null; + } + + public static bool IsLeaf(this ITopology topology) + { + return topology.Leaf != null; + } + + public static bool IsNode(this ITopology topology) + { + return topology.Node != null; + } + + public static string Hash(this ITopology topology, bool raw = false) + { + if (topology.IsBranch()) + { + var children = topology.Branch.Children; + if (children.Length == 0) + throw new Exception("Empty branch"); + + var hashedChildren = children.Select(child => child.Hash(raw)).ToArray(); + + var childBytes = hashedChildren[0].HexStringToByteArray(); + for (var i = 1; i < hashedChildren.Length; i++) + { + var nextBytes = hashedChildren[i].HexStringToByteArray(); + childBytes = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(childBytes, nextBytes)); + } + + return childBytes.ByteArrayToHexStringWithPrefix(); + } + + if (topology.IsNode()) + return topology.Node.Value.ByteArrayToHexStringWithPrefix(); + + if (topology.IsLeaf()) + { + var encodedLeaf = raw ? topology.Leaf.EncodeRaw() : topology.Leaf.Encode(); + return SequenceCoder.KeccakHash(encodedLeaf) + .ByteArrayToHexStringWithPrefix(); + } + + throw new Exception("Invalid tree structure"); + } + + public static T FindLeaf(this ITopology topology, Func check) where T : ILeaf + { + if (topology.Leaf is T leaf && check(leaf)) + return leaf; + + if (topology.Branch == null) + return default; + + return topology.Branch.Children.Select(child => child.FindLeaf(check)) + .FirstOrDefault(childLeaf => childLeaf != null); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs.meta new file mode 100644 index 00000000..30c91b3c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8910ac2f7bd04352817df74fd25617af +timeCreated: 1751386570 \ No newline at end of file From e5d47f9fc71a09190e3af677839808f781f45a8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 1 Jul 2025 19:05:04 +0200 Subject: [PATCH 087/165] started adding recovery topology --- .../Primitives/Recovery/RecoveryBranch.cs | 4 +- .../Primitives/Recovery/RecoveryLeaf.cs | 22 ++++++++++- .../Primitives/Recovery/RecoveryTopology.cs | 14 +++++++ .../Recovery/RecoveryTopology.cs.meta | 3 ++ .../Primitives/Sessions/IdentitySignerLeaf.cs | 2 +- .../Sessions/ImplicitBlacklistLeaf.cs | 2 +- .../Primitives/Sessions/PermissionLeaf.cs | 2 +- .../Primitives/Sessions/SessionBranch.cs | 38 +++++++------------ .../Primitives/Sessions/SessionLeaf.cs | 2 +- .../Primitives/Sessions/SessionNodeLeaf.cs | 2 +- .../Primitives/Sessions/SessionsTopology.cs | 30 +-------------- .../Primitives/Topology/BranchExtensions.cs | 30 +++++++++++++++ .../Topology/BranchExtensions.cs.meta | 3 ++ .../Primitives/Topology/IBranch.cs | 3 -- .../Primitives/Topology/ILeaf.cs | 2 +- .../Primitives/Topology/INode.cs | 2 +- .../Primitives/Topology/ITopology.cs | 3 -- .../Primitives/Topology/TopologyExtensions.cs | 28 ++++++++++++++ 18 files changed, 122 insertions(+), 70 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/BranchExtensions.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/BranchExtensions.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs index eb6e734d..dc77d59d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs @@ -1,7 +1,7 @@ namespace Sequence.EcosystemWallet.Primitives { - public class RecoveryBranch + public class RecoveryBranch : IBranch { - + public ITopology[] Children { get; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs index 23106b6a..52e65ec7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs @@ -3,12 +3,32 @@ namespace Sequence.EcosystemWallet.Primitives { - public class RecoveryLeaf + public class RecoveryLeaf : ILeaf { public Address signer; public BigInteger requiredDeltaTime; public BigInteger minTimestamp; + public object ToJsonObject() + { + return new + { + signer = signer.Value, + requiredDeltaTime = requiredDeltaTime.ToString(), + minTimestamp = minTimestamp.ToString() + }; + } + + public byte[] Encode() + { + throw new NotImplementedException(); + } + + public byte[] EncodeRaw() + { + return Encode(); + } + public static RecoveryLeaf FromInput(string input) { var parts = input.Split(':'); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs new file mode 100644 index 00000000..41d3ec23 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs @@ -0,0 +1,14 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public class RecoveryTopology : ITopology + { + public IBranch Branch { get; } + public ILeaf Leaf { get; } + public INode Node { get; } + + public RecoveryTopology(RecoveryLeaf leaf) + { + Leaf = leaf; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs.meta new file mode 100644 index 00000000..539a167b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1399994f57604000bc8d9e6cb56d690b +timeCreated: 1751388904 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs index b66ed7f6..e2b92cd6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs @@ -6,7 +6,7 @@ public class IdentitySignerLeaf : SessionLeaf { public Address identitySigner; - public override object ToJson() + public override object ToJsonObject() { return new { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs index 66a0bb05..57330e7a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs @@ -8,7 +8,7 @@ public class ImplicitBlacklistLeaf : SessionLeaf { public Address[] blacklist; - public override object ToJson() + public override object ToJsonObject() { return new { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs index 1bed2c82..4f23107b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs @@ -6,7 +6,7 @@ public class PermissionLeaf : SessionLeaf { public SessionPermissions permissions; - public override object ToJson() + public override object ToJsonObject() { return permissions.ToJson(); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs index f5234767..5c181f54 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs @@ -1,8 +1,4 @@ using System; -using System.Linq; -using Newtonsoft.Json; -using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -10,35 +6,27 @@ public class SessionBranch : IBranch { public ITopology[] Children { get; set; } + /// + /// Create a session branch of two children. + /// + /// + /// public SessionBranch(SessionsTopology left, SessionsTopology right) { Children = new ITopology[] { left, right }; } + /// + /// Create a session branch with more than two children. + /// + /// + /// public SessionBranch(ITopology[] children) { - Children = children; - } - - public object ToJson() - { - return Children.Select(child => child.ToJson()).ToArray(); - } - - public byte[] Encode() - { - var encodings = Children.Select(child => child.Encode()).ToArray(); - var encoded = ByteArrayExtensions.ConcatenateByteArrays(encodings); - var encodedSize = encoded.Length.MinBytesFor(); - if (encodedSize > 15) - throw new Exception("Session Branch is too large."); + if (children.Length < 2) + throw new Exception("Session Branch has less than 2 children."); - var flag = (SessionsTopology.FlagBranch << 4) | encodedSize; - - return ByteArrayExtensions.ConcatenateByteArrays( - flag.ByteArrayFromNumber(flag.MinBytesFor()), - encoded.Length.ByteArrayFromNumber(encodedSize), - encoded); + Children = children; } public SessionsTopology ToTopology() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs index f6dc9e8c..5ce1b72d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs @@ -6,7 +6,7 @@ public abstract class SessionLeaf : ILeaf public const string IdentitySignerType = "identity-signer"; public const string SessionPermissionsType = "session-permissions"; - public abstract object ToJson(); + public abstract object ToJsonObject(); public abstract byte[] Encode(); public abstract byte[] EncodeRaw(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs index 3ccf1fd7..d2fda51e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs @@ -6,7 +6,7 @@ public class SessionNodeLeaf : INode { public byte[] Value { get; set; } - public object ToJson() + public object ToJsonObject() { return Value.ByteArrayToHexStringWithPrefix(); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index 6be1f715..e867df9e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -38,21 +38,7 @@ public SessionsTopology(SessionNodeLeaf node) public string JsonSerialize() { - return JsonConvert.SerializeObject(ToJson()); - } - - public object ToJson() - { - if (this.IsBranch()) - return Branch.ToJson(); - - if (this.IsLeaf()) - return Leaf.ToJson(); - - if (this.IsNode()) - return Node.ToJson(); - - throw new Exception("Invalid topology."); + return JsonConvert.SerializeObject(this.ToJsonObject()); } public string ImageHash() @@ -60,20 +46,6 @@ public string ImageHash() return this.Hash(true); } - public byte[] Encode() - { - if (this.IsBranch()) - return Branch.Encode(); - - if (this.IsLeaf()) - return Leaf.Encode(); - - if (this.IsNode()) - return Node.Encode(); - - throw new Exception("Invalid topology."); - } - /// /// Optimise the configuration tree by rolling unused signers into nodes. /// diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/BranchExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/BranchExtensions.cs new file mode 100644 index 00000000..810bcd2c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/BranchExtensions.cs @@ -0,0 +1,30 @@ +using System; +using System.Linq; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public static class BranchExtensions + { + public static object ToJsonObject(this IBranch branch) + { + return branch.Children.Select(child => child.ToJsonObject()).ToArray(); + } + + public static byte[] Encode(this IBranch branch) + { + var encodings = branch.Children.Select(child => child.Encode()).ToArray(); + var encoded = ByteArrayExtensions.ConcatenateByteArrays(encodings); + var encodedSize = encoded.Length.MinBytesFor(); + if (encodedSize > 15) + throw new Exception("Session Branch is too large."); + + var flag = (SessionsTopology.FlagBranch << 4) | encodedSize; + + return ByteArrayExtensions.ConcatenateByteArrays( + flag.ByteArrayFromNumber(flag.MinBytesFor()), + encoded.Length.ByteArrayFromNumber(encodedSize), + encoded); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/BranchExtensions.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/BranchExtensions.cs.meta new file mode 100644 index 00000000..4e2d4dfc --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/BranchExtensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4f790d8d890a4bb29c2230a5ff160ca6 +timeCreated: 1751389272 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs index 26914545..df676686 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs @@ -3,8 +3,5 @@ namespace Sequence.EcosystemWallet.Primitives public interface IBranch { ITopology[] Children { get; } - - object ToJson(); - byte[] Encode(); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ILeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ILeaf.cs index 32b4412f..77df2648 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ILeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ILeaf.cs @@ -2,7 +2,7 @@ namespace Sequence.EcosystemWallet.Primitives { public interface ILeaf { - object ToJson(); + object ToJsonObject(); byte[] Encode(); byte[] EncodeRaw(); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/INode.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/INode.cs index 4a891d94..4dee0fe1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/INode.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/INode.cs @@ -4,7 +4,7 @@ public interface INode { byte[] Value { get; } - object ToJson(); + object ToJsonObject(); byte[] Encode(); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ITopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ITopology.cs index f3de56cf..d022a4e5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ITopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ITopology.cs @@ -5,8 +5,5 @@ public interface ITopology IBranch Branch { get; } ILeaf Leaf { get; } INode Node { get; } - - object ToJson(); - byte[] Encode(); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs index ff60cefd..c2ad08af 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs @@ -22,6 +22,34 @@ public static bool IsNode(this ITopology topology) return topology.Node != null; } + public static object ToJsonObject(this ITopology topology) + { + if (topology.IsBranch()) + return topology.Branch.ToJsonObject(); + + if (topology.IsLeaf()) + return topology.Leaf.ToJsonObject(); + + if (topology.IsNode()) + return topology.Node.ToJsonObject(); + + throw new Exception("Invalid topology."); + } + + public static byte[] Encode(this ITopology topology) + { + if (topology.IsBranch()) + return topology.Branch.Encode(); + + if (topology.IsLeaf()) + return topology.Leaf.Encode(); + + if (topology.IsNode()) + return topology.Node.Encode(); + + throw new Exception("Invalid topology."); + } + public static string Hash(this ITopology topology, bool raw = false) { if (topology.IsBranch()) From 6f3fcb387b604e6a722eb11d38ef4aae3a2debec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 1 Jul 2025 19:50:19 +0200 Subject: [PATCH 088/165] added recovery branch functions --- .../IntegrationTests/RecoveryTests.cs | 27 ++++- .../Primitives/Recovery/BranchParser.cs | 103 ++++++++++++++++++ .../Primitives/Recovery/BranchParser.cs.meta | 3 + .../Primitives/Recovery/RecoveryBranch.cs | 8 ++ .../Primitives/Recovery/RecoveryLeaf.cs | 7 +- .../Primitives/Recovery/RecoveryNode.cs | 19 ++++ .../Primitives/Recovery/RecoveryNode.cs.meta | 3 + .../Primitives/Recovery/RecoveryTopology.cs | 71 ++++++++++++ 8 files changed, 235 insertions(+), 6 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/BranchParser.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/BranchParser.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryNode.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryNode.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs index fb8d7637..7941b16a 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Threading.Tasks; using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; namespace Sequence.EcosystemWallet.IntegrationTests { @@ -11,23 +12,39 @@ public Task HashFromLeaves(Dictionary parameters) { var leavesInput = (string)parameters["leaves"]; var leaves = leavesInput.Split(' ').Select(RecoveryLeaf.FromInput).ToArray(); - - throw new System.NotImplementedException(); + var topology = RecoveryTopology.FromLeaves(leaves); + + return Task.FromResult(topology.Hash()); } public Task Encode(Dictionary parameters) { - throw new System.NotImplementedException(); + var leavesInput = (string)parameters["leaves"]; + var leaves = leavesInput.Split(' ').Select(RecoveryLeaf.FromInput).ToArray(); + var topology = RecoveryTopology.FromLeaves(leaves); + + return Task.FromResult(topology.Encode().ByteArrayToHexStringWithPrefix()); } public Task Trim(Dictionary parameters) { - throw new System.NotImplementedException(); + var leavesInput = (string)parameters["leaves"]; + var signer = new Address((string)parameters["signer"]); + + var leaves = leavesInput.Split(' ').Select(RecoveryLeaf.FromInput).ToArray(); + var topology = RecoveryTopology.FromLeaves(leaves); + var trimmed = topology.Trim(signer); + + return Task.FromResult(trimmed.Encode().ByteArrayToHexStringWithPrefix()); } public Task HashEncoded(Dictionary parameters) { - throw new System.NotImplementedException(); + var encodedStr = (string)parameters["encoded"]; + var encoded = encodedStr.HexStringToByteArray(); + var decoded = RecoveryTopology.Decode(encoded); + + return Task.FromResult(decoded.Hash()); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/BranchParser.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/BranchParser.cs new file mode 100644 index 00000000..0ef8b9d8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/BranchParser.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public static class BranchParser + { + public static (RecoveryTopology[] topologies, byte[] leftover) ParseBranch(byte[] encoded) + { + if (encoded.Length == 0) + throw new ArgumentException("Empty branch"); + + var nodes = new List(); + int index = 0; + + while (index < encoded.Length) + { + var flag = encoded[index]; + if (flag == RecoveryTopology.FlagLeaf) + { + if (encoded.Length < index + 32) + throw new ArgumentException("Invalid recovery leaf"); + + var signerBytes = encoded[(index + 1)..(index + 21)]; + var signer = new Address(signerBytes.ByteArrayToHexStringWithPrefix()); + + var requiredDeltaTimeBytes = encoded[(index + 21)..(index + 24)]; + var requiredDeltaTime = requiredDeltaTimeBytes.ToBigInteger(); + + var minTimestampBytes = encoded[(index + 24)..(index + 32)]; + var minTimestamp = minTimestampBytes.ToBigInteger(); + + nodes.Add(new RecoveryTopology(new RecoveryLeaf + { + signer = signer, + requiredDeltaTime = requiredDeltaTime, + minTimestamp = minTimestamp + })); + + index += 32; + continue; + } + + if (flag == RecoveryTopology.FlagNode) + { + if (encoded.Length < index + 33) + throw new ArgumentException("Invalid node"); + + var nodeBytes = encoded[(index + 1)..(index + 33)]; + nodes.Add(new RecoveryTopology(new RecoveryNode { Value = nodeBytes})); + + index += 33; + continue; + } + + if (flag == RecoveryTopology.FlagBranch) + { + if (encoded.Length < index + 4) + throw new ArgumentException("Invalid branch"); + + var sizeBytes = encoded[(index + 1)..(index + 4)]; + int size = sizeBytes.ToInteger(); + + if (encoded.Length < index + 4 + size) + throw new ArgumentException("Invalid branch"); + + var branch = encoded[(index + 4)..(index + 4 + size)]; + var (subNodes, leftover) = ParseBranch(branch); + + if (leftover.Length > 0) + throw new ArgumentException("Leftover bytes in sub-branch"); + + var subTree = FoldNodes(subNodes); + nodes.Add(subTree); + + index += 4 + size; + continue; + } + + throw new ArgumentException("Invalid flag"); + } + + var leftoverBytes = encoded[index..]; + return (nodes.ToArray(), leftoverBytes); + } + + public static RecoveryTopology FoldNodes(RecoveryTopology[] nodes) + { + if (nodes.Length == 0) + throw new ArgumentException("Empty signature tree"); + + if (nodes.Length == 1) + return nodes[0]; + + var tree = nodes[0]; + for (var i = 1; i < nodes.Length; i++) + tree = new RecoveryTopology(new RecoveryBranch(tree, nodes[i])); + + return tree; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/BranchParser.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/BranchParser.cs.meta new file mode 100644 index 00000000..dd7082d6 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/BranchParser.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 38c2e640f95b4683a3f0d36fc9c7fbad +timeCreated: 1751391086 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs index dc77d59d..340b716f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs @@ -3,5 +3,13 @@ namespace Sequence.EcosystemWallet.Primitives public class RecoveryBranch : IBranch { public ITopology[] Children { get; } + + public RecoveryTopology Left => Children[0] as RecoveryTopology; + public RecoveryTopology Right => Children[1] as RecoveryTopology; + + public RecoveryBranch(RecoveryTopology left, RecoveryTopology right) + { + Children = new ITopology[] { left, right }; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs index 52e65ec7..9308f2a2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs @@ -1,5 +1,6 @@ using System; using System.Numerics; +using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives { @@ -21,7 +22,11 @@ public object ToJsonObject() public byte[] Encode() { - throw new NotImplementedException(); + return ByteArrayExtensions.ConcatenateByteArrays( + RecoveryTopology.FlagLeaf.ByteArrayFromNumber(1), + signer.Value.HexStringToByteArray(), + requiredDeltaTime.ByteArrayFromNumber(32), + minTimestamp.ByteArrayFromNumber(32)); } public byte[] EncodeRaw() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryNode.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryNode.cs new file mode 100644 index 00000000..4660b535 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryNode.cs @@ -0,0 +1,19 @@ +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class RecoveryNode : INode + { + public byte[] Value { get; set; } + + public object ToJsonObject() + { + return Value.ByteArrayToHexStringWithPrefix(); + } + + public byte[] Encode() + { + return Value; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryNode.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryNode.cs.meta new file mode 100644 index 00000000..7fdb1e78 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryNode.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c858f9a5df7e43f98ceec35642e204d0 +timeCreated: 1751391215 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs index 41d3ec23..1eac13a0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs @@ -1,14 +1,85 @@ +using System; +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { public class RecoveryTopology : ITopology { + public const int FlagLeaf = 1; + public const int FlagNode = 3; + public const int FlagBranch = 4; + public IBranch Branch { get; } public ILeaf Leaf { get; } public INode Node { get; } + public RecoveryTopology(RecoveryBranch branch) + { + Branch = branch; + } + + public RecoveryTopology(RecoveryNode node) + { + Node = node; + } + public RecoveryTopology(RecoveryLeaf leaf) { Leaf = leaf; } + + public RecoveryTopology Trim(Address signer) + { + if (Leaf is RecoveryLeaf leaf) + { + if (leaf.signer.Equals(signer)) + return this; + + var node = new RecoveryNode { Value = this.Hash().HexStringToByteArray() }; + return new RecoveryTopology(node); + } + + if (this.IsNode()) + return this; + + if (Branch is RecoveryBranch branch) + { + var left = branch.Left.Trim(signer); + var right = branch.Right.Trim(signer); + + if (left.IsNode() && right.IsNode()) + { + var node = new RecoveryNode { Value = this.Hash().HexStringToByteArray() }; + return new RecoveryTopology(node); + } + + return new RecoveryTopology(new RecoveryBranch(left, right)); + } + + throw new ArgumentException("Invalid topology"); + } + + public static RecoveryTopology FromLeaves(RecoveryLeaf[] leaves) + { + if (leaves.Length == 0) + throw new Exception("Empty Leaves"); + + if (leaves.Length == 1) + return new RecoveryTopology(leaves[0]); + + var mid = (int)Math.Floor(leaves.Length / 2f); + var left = FromLeaves(leaves.SubArray(0, mid)); + var right = FromLeaves(leaves.SubArray(mid)); + return new RecoveryTopology(new RecoveryBranch(left, right)); + } + + public static RecoveryTopology Decode(byte[] encoded) + { + var (topologies, leftover) = BranchParser.ParseBranch(encoded); + if (leftover.Length > 0) + throw new Exception("There's still leftover"); + + return BranchParser.FoldNodes(topologies); + } } } \ No newline at end of file From 4d8c0a17a0ad6b9927843bd896c2752906e220c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 2 Jul 2025 00:14:41 +0200 Subject: [PATCH 089/165] started adding passkeys primitives and tests --- .../IntegrationTests/PasskeysTests.cs | 36 ++++- .../IntegrationTests/RecoveryTests.cs | 4 +- .../UnitTests/PasskeysUnitTests.cs | 75 +++++++++ .../UnitTests/PasskeysUnitTests.cs.meta | 3 + .../UnitTests/RecoveryUnitTests.cs | 53 ++++++ .../UnitTests/RecoveryUnitTests.cs.meta | 3 + .../EcosystemWallet/Primitives/Passkeys.meta | 3 + .../Primitives/Passkeys/DecodedSignature.cs | 151 ++++++++++++++++++ .../Passkeys/DecodedSignature.cs.meta | 3 + .../Primitives/Passkeys/PasskeyMetadata.cs | 40 +++++ .../Passkeys/PasskeyMetadata.cs.meta | 3 + .../Primitives/Passkeys/PasskeysArgs.cs | 17 ++ .../Primitives/Passkeys/PasskeysArgs.cs.meta | 3 + .../Primitives/Passkeys/PasskeysHelper.cs | 65 ++++++++ .../Passkeys/PasskeysHelper.cs.meta | 3 + .../Primitives/Passkeys/PublicKey.cs | 39 +++++ .../Primitives/Passkeys/PublicKey.cs.meta | 3 + .../Primitives/Recovery/RecoveryBranch.cs | 21 +++ .../Primitives/Recovery/RecoveryLeaf.cs | 17 +- .../Primitives/Recovery/RecoveryNode.cs | 4 +- .../Primitives/Recovery/RecoveryTopology.cs | 4 +- .../Primitives/Sessions/SessionBranch.cs | 18 +++ .../Primitives/Topology/BranchExtensions.cs | 18 --- .../Primitives/Topology/IBranch.cs | 2 + 24 files changed, 558 insertions(+), 30 deletions(-) create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/RecoveryUnitTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/RecoveryUnitTests.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/DecodedSignature.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/DecodedSignature.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeyMetadata.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeyMetadata.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysArgs.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysArgs.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysHelper.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysHelper.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PublicKey.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PublicKey.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PasskeysTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PasskeysTests.cs index 77018fbd..908a2912 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PasskeysTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PasskeysTests.cs @@ -1,5 +1,8 @@ using System.Collections.Generic; using System.Threading.Tasks; +using Newtonsoft.Json; +using Sequence.EcosystemWallet.Primitives.Passkeys; +using UnityEngine; namespace Sequence.EcosystemWallet.IntegrationTests { @@ -7,7 +10,21 @@ public class PasskeysTests { public Task EncodeSignature(Dictionary parameters) { - throw new System.NotImplementedException(); + var encoded = PasskeysHelper.EncodeSignature(new PasskeysArgs + { + x = (string)parameters["x"], + y = (string)parameters["y"], + r = (string)parameters["r"], + s = (string)parameters["s"], + requireUserVerification = (bool)parameters["requireUserVerification"], + embedMetadata = (bool)parameters["embedMetadata"], + credentialId = parameters.TryGetValue("credentialId", out var credentialIdValue) ? (string)credentialIdValue : null, + metadataHash = parameters.TryGetValue("metadataHash", out var metadataHashValue) ? (string)metadataHashValue : null, + authenticatorData = (string)parameters["authenticatorData"], + clientDataJson = parameters["clientDataJson"].ToString(), + }); + + return Task.FromResult(encoded); } public Task DecodeSignature(Dictionary parameters) @@ -17,7 +34,22 @@ public Task DecodeSignature(Dictionary parameters) public Task ComputeRoot(Dictionary parameters) { - throw new System.NotImplementedException(); + var x = (string)parameters["x"]; + var y = (string)parameters["y"]; + var requireUserVerification = (bool)parameters["requireUserVerification"]; + var credentialId = parameters.TryGetValue("credentialId", out var credentialIdValue) ? (string)credentialIdValue : null; + var metadataHash = parameters.TryGetValue("metadataHash", out var metadataHashValue) ? (string)metadataHashValue : null; + + var result = PasskeysHelper.ComputeRoot(new PasskeysArgs + { + x = x, + y = y, + requireUserVerification = requireUserVerification, + credentialId = credentialId, + metadataHash = metadataHash + }); + + return Task.FromResult(result); } public Task ValidateSignature(Dictionary parameters) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs index 7941b16a..d39c112d 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs @@ -14,7 +14,7 @@ public Task HashFromLeaves(Dictionary parameters) var leaves = leavesInput.Split(' ').Select(RecoveryLeaf.FromInput).ToArray(); var topology = RecoveryTopology.FromLeaves(leaves); - return Task.FromResult(topology.Hash()); + return Task.FromResult(topology.Hash(true)); } public Task Encode(Dictionary parameters) @@ -44,7 +44,7 @@ public Task HashEncoded(Dictionary parameters) var encoded = encodedStr.HexStringToByteArray(); var decoded = RecoveryTopology.Decode(encoded); - return Task.FromResult(decoded.Hash()); + return Task.FromResult(decoded.Hash(true)); } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs new file mode 100644 index 00000000..d2d31df4 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs @@ -0,0 +1,75 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using NUnit.Framework; +using Sequence.EcosystemWallet.Primitives.Passkeys; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet.UnitTests +{ + public class PasskeysUnitTests + { + [TestCase("{\"x\":\"0x27da369dc69d1fa5a7d815e10ec765ccb6d1d1a1ac383c0a43e2befe5f2b5e1b\",\"y\":\"0x78e9505cb8dcac86878065bcaf8f199ef77f0c3afd458c6c46448af9550ed818\",\"requireUserVerification\":false,\"metadataHash\":\"0x5c59a01b79c5d8c4364f17a42a4808e005a93526c5084f0e7529ce3e6bb7131a\",\"r\":\"0x339d9b9e8ffc8f23a2a8545a8877f96bb660ec76205476a56ea9ae7a63e505dc\",\"s\":\"0x4db2e79efd31a6d7fbb424f0ebefc73903a948856197bcbeacea5233fd7c2962\",\"authenticatorData\":\"0x220ee2806d87a214f76e76e790c1a3bb55e4d83b966f9b6c576c40a38aff383501000cdd31\",\"clientDataJson\":{\"type\":\"webauthn.get\",\"challenge\":\"Pqr3Arso8Ef_SX0fQwTCJUk6VhZddkpI7qmMeQGgXAY\",\"origin\":\"-e!0-?98oYa3t?-CsHcY-!-?5VSna4l_?-fE7g63eL-?P06?0-inM?9d5D--5??lv?OJVw!Fy598ZyVV_E_6ug5v60CBOT?7_fL?_r?2_HY7cp7z_B?C82jz?__!?qT2-_925_-T__C5_U_-?8L-6D7_!7dDb2!?9JC178V!u26_H9?N7Mo_6oz!7tqK-g_!8?iJ3_??A??P4K94-8L?!-?mF!10-R6B0?8D__0T!-R-uR_9MQCD82?7-4j1s2!_g85Y4Q??W68dl?A?xAnCA8d_wF2?__k\"},\"embedMetadata\":true}")] + public void EncodeSignature(string inputJson) + { + var data = JsonConvert.DeserializeObject>(inputJson); + var encoded = PasskeysHelper.EncodeSignature(new PasskeysArgs + { + x = (string)data["x"], + y = (string)data["y"], + r = (string)data["r"], + s = (string)data["s"], + requireUserVerification = (bool)data["requireUserVerification"], + embedMetadata = (bool)data["embedMetadata"], + credentialId = data.TryGetValue("credentialId", out var credentialIdValue) ? (string)credentialIdValue : null, + metadataHash = data.TryGetValue("metadataHash", out var metadataHashValue) ? (string)metadataHashValue : null, + authenticatorData = (string)data["authenticatorData"], + clientDataJson = data["clientDataJson"].ToString(), + }); + + Debug.Log($"Encoded Passkey: {encoded}"); + + var decoded = DecodedSignature.Decode(encoded.HexStringToByteArray()); + + Debug.Log($"Decoded Passkey: {JsonConvert.SerializeObject(decoded)}"); + + Assert.AreEqual(encoded, decoded.Encode().ByteArrayToHexStringWithPrefix()); + } + + [TestCase("0x405c59a01b79c5d8c4364f17a42a4808e005a93526c5084f0e7529ce3e6bb7131a25220ee2806d87a214f76e76e790c1a3bb55e4d83b966f9b6c576c40a38aff383501000cdd3100ffff339d9b9e8ffc8f23a2a8545a8877f96bb660ec76205476a56ea9ae7a63e505dc4db2e79efd31a6d7fbb424f0ebefc73903a948856197bcbeacea5233fd7c296227da369dc69d1fa5a7d815e10ec765ccb6d1d1a1ac383c0a43e2befe5f2b5e1b78e9505cb8dcac86878065bcaf8f199ef77f0c3afd458c6c46448af9550ed818")] + public void DecodeSignature(string encodedSignature) + { + var decoded = PasskeysHelper.DecodeSignature(encodedSignature); + + Debug.Log($"Decoded Signature: {decoded}"); + } + + [TestCase("{\"x\":\"0xe018db753bcfb28da9770e68723e0f1bff3eaaf702bb28f047ff497d1f4304c2\",\"y\":\"0x25493a56165d764a48eea98c7901a05c06545c59a01b79c5d8c4364f17a42a48\",\"requireUserVerification\":true,\"credentialId\":\"p-e2-GDn2?-0v!G2?v7!v43_hPDRDv_UkG?RE!rI6w_4j!_R26_7X4U!09?!r6d_ckZ-l_-!B0\"}")] + public void ComputeRoot(string inputJson) + { + var data = JsonConvert.DeserializeObject>(inputJson); + var x = (string)data["x"]; + var y = (string)data["y"]; + var requireUserVerification = (bool)data["requireUserVerification"]; + var credentialId = data.TryGetValue("credentialId", out var credentialIdValue) ? (string)credentialIdValue : null; + var metadataHash = data.TryGetValue("metadataHash", out var metadataHashValue) ? (string)metadataHashValue : null; + + var result = PasskeysHelper.ComputeRoot(new PasskeysArgs + { + x = x, + y = y, + requireUserVerification = requireUserVerification, + credentialId = credentialId, + metadataHash = metadataHash + }); + + Debug.Log($"Computed Root: {result}"); + } + + [TestCase("")] + public void ValidateSignature(string inputJson) + { + + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs.meta new file mode 100644 index 00000000..c77239a3 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e2ceb85bd7554a8f9f901ae7fe66ea2d +timeCreated: 1751401782 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/RecoveryUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RecoveryUnitTests.cs new file mode 100644 index 00000000..58c4bbbb --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RecoveryUnitTests.cs @@ -0,0 +1,53 @@ +using System.Linq; +using Newtonsoft.Json; +using NUnit.Framework; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet.UnitTests +{ + public class RecoveryUnitTests + { + [TestCase("signer:0x18Db753Bcfb28DA9770e68723E0f1BFF3EaaF702:81750:3 signer:0x1B79c5D8c4364F17a42a4808E005a93526C5084F:2:1334030 signer:0x87A214F76E76E790c1a3Bb55e4d83b966f9b6C57:117061:4 signer:0xa4698d8b96c425bA4F4DB22009efeEDad4F533b7:21614:3388985866667 signer:0x1f1567f8F883B9aFC5Fe2042d1cCbc0CD804E06e:14:129185 signer:0x80DFb85E00EeFa9E94F827c639e0F197b8a54484:2673:1987802219133 signer:0xb6F0BFcD66bA5f6d03cEF09c02C4cD9F4C2B4030:7622:154089013038758 signer:0x4990631CEC6C6a91223F13Baec7a8A15E4aB25b5:16777214:113046 signer:0xc1C3667D8433751af8c37Ec55EbbE3C66FFC9E9b:836577:10397822422092821802 signer:0xDC08F41986254CC1BEE39594c91DB28D58dc0976:17:49674592821651760 signer:0x8A8D83521dBdaAD5252866Be4085bacBF29FB7C1:43507:38 signer:0x74B25324694e153295d0020060B85Ea8a38aD47c:4105:169383570070322 signer:0x8bdEABad5C95901A737e34C8EA057dE8Ff90ff5A:204528:2 signer:0xc10cFb30B283B2C3D6FA1D766de8E3418892dd84:25688:4453062132022 signer:0xf4416720ADec991E761c768C3072ae82139B625B:16777213:512670769084247277 signer:0x5455b49CD4729A8d29aE6C35Cd11B7E82dc44088:57728:842752444 signer:0xc8a6928fb18BA18d761b00dBD5d99A596011d5c4:1728823:9416 signer:0xd2E138A1e3c523f749fb9708456931B72D286654:10:3 signer:0x23eAFCC058BAF31cAB5Fc1083D45327359208145:33:182109991148523181 signer:0x79A772a818146976bFCbA31bA29DCB9d3F0dF63d:16777212:7905209 signer:0xf61FEda3A01407B7ca136B86972a29355B67AF6f:10:1 signer:0xBF25c8B70921d4C187BA459F33A6e060A7D80398:110905:3 signer:0xBadCe3B51Bc3b7946d22756e6A38b592b57bf912:1:6843247845 signer:0x96457c5d60045aBEc807C18322eb61003de67d83:2288611:427539 signer:0x84F85450E95a28827db86C208Cc9A4aef335eb66:5410:88 signer:0x1e2E90Bf24B495a83F36e6e8dFE39f08D08bb172:3:18100202 signer:0xeeaBE54c8c29A818B8fdd392AD561A24568A8fe5:1240:154 signer:0xC2D3458F82CC2B49234550B11B1aDC87aFdEafFE:2:18446744073709551612 signer:0x9251CE3957e3E3C923D88ff7178F8cEb84931119:16777215:45501204049731617 signer:0xc5d1d771381A73Bca7A13d31E65E588bb6cC0F97:450:1 signer:0xFA0bDd2A362389F7d5b69c6B732e1C3de5E62cB4:107700:7040832 signer:0xFBd4c7C4F31f751b2a300A4F1F8a83b376CB7d99:166354:0 signer:0x1DFcC45DC944E5ad43797c2d5Ce8084B8bBBD6aA:1757:76058 signer:0x9aD430856B50b503C16480f65329B94A83153768:279924:179621497 signer:0xE3536a43EA631803314F7A28C3A26fB7E23261a7:4052:0 signer:0x60C1D455BB514197315693469245B67dC27A867f:161:1829432574588 signer:0xD4bF46aA669856967eb41536f275B9B0dC331418:2:1463661235138196 signer:0x90056857802ebd82D930a7450c9B692eC3C475FA:3:2596340947377366 signer:0xAb1dbEF1970D9A1fe4d60fa5e10aABB5d69336d7:52:70557674643757425 signer:0xAFbd354c8AC8f198206DDDfD50fD471cFac0d491:937:129 signer:0xA237cde90ECda6e8644B775233F3E7bc759A7468:1448817:26726596 signer:0x39357e3e59d82bBf65434Fa5Ae0151657AAdb7e4:46:814911260 signer:0x9692FED2A9bF984D27cEb06EC0F3e55389DC980C:16777212:492632 signer:0x9241ab95b687d1996116B796C3223D1c7d32d855:30:157422540196514442 signer:0xd29B7F741259534C7BE9958f6441733584ac9BE7:3:46289262816116 signer:0x19E98c0f2374f46Ed3F6967768901FE8AeC0e983:8:2000244 signer:0x118D8f53464f62C709088f1b6C8A749ddf241988:0:749406627977614 signer:0x9744b15199d2Bb6294dD11c522279e5b6Ffb33d0:232292:1481312270261602479 signer:0xb60780280aa553E1B4dBC118afA972Ad5195a433:540:10 signer:0x655E8bFB5ef8eb94D1A6d0a68a0220FD9570c61C:14101735:849720636395 signer:0xc3698555cD02a4617110b4549c8bca657c6d0863:40:0 signer:0xbFbE9EED1eF8114BBdb6927F0Ced12BAD7e58B67:38:2 signer:0xF77E643d52514a603231781E2fa7C4AC3644Fd7a:641498:291227291999617 signer:0x3Faf391e25B97d5Fe36a85f8cd506cfFe982CaA6:2:1072358430 signer:0x712Fa23F79B617CE03AbDEc0e95aC8bB1852b985:7742:139565423171129 signer:0xD472145D9930DD998Bc51B6C18a14D4104894a65:66:100952072590910 signer:0x070f146f10BF2d44741F774C985A4b8967966E7f:115249:1366024134 signer:0x9EfDc5839C45d206A2357C75881cF8d9a96FbE3A:16777212:566447963697181231 signer:0xD547D17efC3b839dFc2C088F8525DD8833694693:3464:3788 signer:0x2Cf11a23E095E62f5E72a3744a05C367001D1Ea3:0:272861000 signer:0x8908C5941854b73E76760A0C750fbA148C92d880:16777215:14989386126978202596 signer:0x6Dda1fD57aDdBFC24Ed03B8475725Dee0007c73a:198431:65196656271119 signer:0x515231A67D4A74901daE6e771EB05aa021c34187:2:68433571516 signer:0x98fD6109bB79540052BA94f458B980E31D18f254:32919:42919706854131982 signer:0xd80D5e167483d6269Fe9ca189cAD4C379aE7B357:1:18446744073709551615 signer:0x7fE7d2EF7EE9A406a22879A653472D546d8FB3f6:775123:24 signer:0x6cE256B4e3a74d6717B34E5409A28a44be9b7397:5827:82137947249681 signer:0xEEB5448b99BaB260cd7845AA6e59B324c2816EC3:1124:758 signer:0xFbb86880CB9a92b3E93252a9186c310d3199aD78:4613279:9156517298527857 signer:0x890EA791de88ab640Ec7d148CC7e6f6bEfdba379:97:34046035 signer:0xEB090c7f8d9D08Fd794A9d2f97d277F06316dc02:1:5352411170408 signer:0xEF4e6681142c4729667558965b16b1f881Ebd09c:135046:783951936287971054 signer:0xE534d5E23eF138559759Bb91D35E994D76780d7B:3779349:2698067 signer:0x58558bb6e8E96287B078b8670dc9AF17B31763c6:11887:3658 signer:0x0F89f2bb8d7074A71287b338544531f43f51df4a:1:105996 signer:0xEE85f14A358E30abaB14804c333FDDE192d9A966:3179:14443691753721874 signer:0x23fc72E9b890Eef939B9DF2582175D2ca9a869e1:5:3 signer:0x05506c913F065f07faE17c8CA2720b611AAC5f67:3:160 signer:0x87630Dd345582Efb5A515EbE85F52466Eecb3728:235:8032471772 signer:0x80F161276707D241Ff4b0061D080932c8d5a5b58:1:95457 signer:0xd46c6b789034b14051ff274E0dFE6c3092D83912:8:2093905966194704 signer:0xEeC807cC1a92f614fC74F6EcfE933763763E51C7:13611019:18446744073709551615 signer:0xf42e2Ca718575702354F7905C551dA173cE1fE91:0:11753894 signer:0x477886F20C046DFd09132EAF290B41bf49F3a0C3:1289285:12455815592786596 signer:0x83C632b57C8d995d2e990681d351bb7f6cC4bB5B:609722:51344815746578 signer:0x176161d07bF44cD03dBbF1519378B0F051562C6C:22:263560129332 signer:0xc71e10369845E70aCEED2B6D37f5834B43150CfA:271:505192857550346 signer:0x2116087B4BfC5239f1c333DCc01EFc7615945bC6:1623:117378044821983208 signer:0xe364bFA5eb497104be10f85887A84Ae8F78d431f:216422:120921248994526 signer:0xDDD051A78dCC8245462F39f99BdD097a60AD6277:1792602:43296 signer:0x77260f3C7dC89288029e48d4A31f7bF0180eDddf:3:1722029154 signer:0x6780559f62fF40908b9BC0C16A6fCb25d821F6D0:2116694:605555894600158906 signer:0x2DcBEBFE7a2f5eDDde44039F1A71215017AA006f:13317:9249477786342 signer:0x7CAEc46a36df8453dDF690237F850555c7Afd4b3:478:736106955670710477 signer:0x43Aa00fB8478c76e36a20d3d6d9b2E1e5a65A275:1460730:3388959012130318 signer:0xD09eF005684CD0C47be9b6cF4583439eA527ADeB:381442:3390 signer:0xBB0322a142a6514F43F3deC1600348739965979d:8389:153889248517 signer:0x0A63ae4b57723e65CD8C88D0aC9EE93Ef22c9E6D:14178:1564129427151885 signer:0x1734bB457f33966c418E8a9030fca185CF59c58a:4:7964132262140059 signer:0xaC4e961edC85dF7Ff09fD50903E7221960452750:271:207556 signer:0xD15Fe6B02dab204E381469522C7db05DeDDB43f2:23562:272222956364778943 signer:0x772d88d3314709e724a8029545D199b0A50DbC27:0:152094957588 signer:0x406a097f9a634F10643E3A1450C5CD49B329C66D:6372:0 signer:0xaB0AC254908f666D1D90f224e532a9EaF8f66870:163842:18446744073709551614 signer:0xe9559DD04794d13c7e07E43df69D4Db883B1C537:16777213:305 signer:0x5D13f418660b6B51B599ECBf2f7f8d8c3B787404:24:84540930603630661 signer:0x27D7D4640d96Ea3d5e723DEE6921726C0068973A:323465:18446744073709551615 signer:0x38d3053a5fC992D35b19A76ff0302c4A35737572:193:38821715946712251 signer:0x9DbdbAf1033C3b6747dF83e66f5e4190CceF2614:977067:98260 signer:0xB59d1A32C043F86b8E7dEC9f809dcdC524FA926A:8764:880918")] + public void EncodeLeaves(string input) + { + var leaves = input.Split(' ').Select(RecoveryLeaf.FromInput).ToArray(); + var topology = RecoveryTopology.FromLeaves(leaves); + + Debug.Log($"Parsed Recovery Topology: {JsonConvert.SerializeObject(topology.ToJsonObject())}"); + + var encoded = topology.Encode(); + var decoded = RecoveryTopology.Decode(encoded); + + Debug.Log($"Decoded Recovery Topology: {JsonConvert.SerializeObject(decoded.ToJsonObject())}"); + Debug.Log($"Decoded Hash {decoded.Hash(true)}"); + + Assert.AreEqual(topology.Hash(true), decoded.Hash(true)); + } + + [TestCase("0x9b7C28877079C25Da39861B2522D4B563DcE99c8", "signer:0x7BD10A32127B30C9C210624bCc51dA06154933C0:48:456176938984990 signer:0x6D3AFE787dbB560497AA2fb64c815053120F6592:1618:1 signer:0x8e2845c582C28019ee731AB3B64b926b5914B559:11557:43 signer:0x3C97CEBD4259b6b3F7a7f48CbA4424385A2db03e:1:3179150218827936 signer:0x435cc57f51F2E245613C9f67c369BF26169590F8:902515:11254 signer:0x0fBaa101eEbf22f21bcD574d647d3D3cA4CF891F:1547238:16545018 signer:0x4fFAc66d69aF850701Fa7064A088EEf72FbA3e9f:24:1163852442747889602 signer:0x125AE7200625e09fd88b3E0aF01af793E5471000:58382:797534266060 signer:0x4F83FDC640fABd78257572a793C52a94be041501:2752:329869238830 signer:0xc40790343A2C674642d4AeBC3E6e8F44e25b7013:0:914740589480730791 signer:0x06c43371D3b22Fd8229b10793F2EC22a3653cEA4:1682:8053220044614781 signer:0x8C8C476301a060D3784945E80cEBFC2043FA5073:463:6853723708471 signer:0xCCe11b69cA6187fc461e280119971aF5bb2Ea7C2:365573:0 signer:0x71f584869a7Cb50f2D1Fef611B489C512109073F:52:18446744073709551614 signer:0x58f515DCbf5a67b4fd64477a855ee7F14Ce1DeE2:3:135378691608704 signer:0xEE65f797dF79c629dB7842507a09EB568498C64C:367:12470581300064 signer:0x80FAf3Db483630796Cbf5C2461E982a215D1068d:63027:6 signer:0x3D5CAa1cA0f5AcD45bAF75cBe81fB5c4B5CB006D:0:7231 signer:0xC59C47dbE91E3127C3559e8696f8e12e2dC85892:2:28582 signer:0xf926E75cc78A74AC446433D5C79Ba716c603c341:16777215:0 signer:0x56Cb6CDE692cBA1c312398725AdB82d134b30583:1:271392378964406210 signer:0x2B898d323747a27d4B12Bb3081556E317f5Efb84:1:77443523 signer:0x99D13C8eD047eCFaBD8668dd9481EdBD0ADB8925:353581:2747 signer:0x3dF1fb6e3dbF1ed26681E058C993412CFa95a5b4:2:0 signer:0x74368ee0BA593bF69705F72F852c8e6e7A1F0Cbd:11184057:912 signer:0x85962BF2706B175febd28b1Ad1D288142c0cb646:3242:18446744073709551614 signer:0xDd48B4Db7cd5991032aD9CFCBff62Cf0058f868B:6372:8148764 signer:0x4C6B6D14306A0677e940eE95ABb546475997415c:4599:3 signer:0xdafC3Bc7b3274eD42D1D7d80728cE59DE8098247:3:27544 signer:0x8827EEdCc65888c42a38413E236D1518e323c46E:43546:2575791 signer:0x091dAfF8B797b3e43F5E7e86cC0f7efB49dF95eC:1234278:341389757821822 signer:0xF0238146DE4a17Dc2dFF7348F0F31B2693079951:66:1424 signer:0x5930c05F6CdBB5205116E444626F0FE2eEEfB905:17:33965652 signer:0x2DF27A5dDA32F2294e677DecB22641C485f627DC:2305:835214580758946 signer:0x41475c7b45424E235480Cadb2a743129910Ee741:512976:14451 signer:0x2E468Ea31ec92d28b87df506183A3aEf2E3E709a:48:26159711643975 signer:0xccEFb4d6f9cdaAd09233c93f0CC2Cb371c975976:3558529:869050901926035848 signer:0xf6Ada8248487dc2a6AEbec74cCcd039a1abF3cE1:1573307:1655456 signer:0x7ab25eBb6fcb97b34E930b55A5Dd78e587BF3B70:7154:17601 signer:0xFCEb3B1F526C4c1C7500e7381C9CB8DB70ED8917:0:13649 signer:0x797531d65784BEDE9fd9C04a613EDcE138834f23:6:2896568075565 signer:0x3Bd86875b140BfD357F1d741DFf9463a8cb35b18:16777215:3 signer:0xFb1C18b3248E329be7e179777BDa8d1fc3c9901D:47663:78 signer:0xdB401843857989fc3aA5d545D910Aa1AC194b5f9:7552:715868042 signer:0x9D2A78E1f440d5F987db7Db4de2574A051a9a644:14:8399332644078012 signer:0xEfdAca7D56981423C5C391C483A8F3F6FCea92e3:1730999:2697640428 signer:0xDcDF69216DF2e198B1f3E637449081ed26E42b6d:1:18110194118766 signer:0xa5882E764451f4273F30cd1Bf97fA7a93036752A:3:22349634430978259 signer:0xacf82b1763970B03C2034A70F1A4af5F65ab3C34:738949:3971392880166916889 signer:0xc7faBb0BB2f7e1413762c78AA4B57730c9d03c9d:3:18779264711584805 signer:0x08d34448fD4FDb559471dcaD6bb9828CA9FF1Ee8:16777214:1669 signer:0xaFa52E29DE9F2892304dc796a8436a7a5577d5F2:0:180912 signer:0xE71169eCCf170e43cdC3b7Bf13876062979301F9:37375:80270649923569 signer:0xe0400CDed288d7d313b3b00FBD14723BbFA5c051:0:2074330 signer:0x94b0c4AE6130755E64683BD10468bDBCeA9EdEE6:0:59486 signer:0xE9ca618174495039D6a36A3C4A3982A4001D69E6:12776031:415119 signer:0x8bED3699faafeE86CA559C2580F0025659aC29fD:2573:320599000794 signer:0x45010eEA7F0FaEFD2DBfc46be189d2947A93DD7A:1:1939653609210269 signer:0xB986f8dC39ddE81eeb6F13590D31f2A5Ded3cAf5:1899563:143221 signer:0x3de0A73DB4c1377Bdb0f12A80E48B81bF370eA1a:16777215:227454936348 signer:0x1D587576A70da715A3853B1e34338123543aa19d:27313:27975665 signer:0xAC3eA3BD25Df6E66842dbBa04B2E748E27087355:3:6190228209874 signer:0xfD7992d235DD3C96fEa130F978e1FdA4Fed9f2f7:6:17266164279883853 signer:0x108B5D6Eae0e0feA98703AB4a0039734D0E52557:16777212:8281 signer:0xD9C1b0e34acc2E6056eB08C3C790B835dE0E7c6C:114:0 signer:0x3AEBed7818C844A629FA50DAec3d9502Eb59adb5:1:2 signer:0xac162f233dAbEe166d629C84D89303A216232b22:202:308695370 signer:0x80EDf5651Bf1845aED2977Ba1bEa83382BDc9F27:0:3696 signer:0x04707E159C913DECb33fb38A9dC697f6CcAfd48d:16777212:2976426612126909775 signer:0xe903139889C7Bdc23823a33Fb9C9e31DF6443E58:1039579:11 signer:0xcd80b9Ec55477b9BF23B88ce17C4EDe45860d350:34:1162535825191908 signer:0xb1b36190b324a2482C663f10Dea21f1621250C15:292:254031 signer:0x0EB9D5a87692A40B2d787C60318700d1f167EC87:52:18446744073709551613 signer:0xad01A4A8Ba22d4bf4f3CFB2Df5bF80Af294e3F63:242148:93128 signer:0xeefC7e3c23f16dc46a39D961C49B96ffCE2D3c95:3898121:8379418 signer:0xF4903a87bcb2717F7338969959C4c40cccf0EA72:1089241:4731647769643279898 signer:0xf25483f192235a55F894C403C207Fbad4896B8a7:0:987173251605911958 signer:0x97C09b3011f4620e6A488529fFC1fbba478FbfE0:3:808296073 signer:0x9686486d5f817Ce47C959d018Ef3C21a8D6f9886:2698:3591582 signer:0x4929e364adBeE0Fcd86C7064195DFAC64B852B9c:6656345:249 signer:0x51feb77526f5B0fA0155Ac370cbBd93d7B98d86b:23121:197917 signer:0x0f3362Bec973A36b8ad23C208aA7f82b1d9975c8:2795:1439753454897447 signer:0xe296a3feaa66a350f5B42Eb7f968b863174af977:99:0 signer:0xb1A342F72a4181e2432DC5f2C1D6Ef4f747Db26f:232:747815 signer:0x6149EE967825766dbA4138AcB87B0196034d1197:14542:18446744073709551614 signer:0xf832A7b261Ff7D4b799118EDE2e45458746Fe7b5:637326:36898985787636988 signer:0x45471Ca280D26e423a0bc8293C10659236887F73:810:126322468 signer:0xa84DC826dbbecC4D6Bee574D788522cdE29528a3:4:3768268 signer:0xEAD633eb05BfD56D2cDc0cAd6E28A9f8511880E0:9584747:1015434355926752872 signer:0xca2Da1b4022017dFCd18e306B0E6f09f8e9AF46E:4483:781594 signer:0x5cC9F8da23abb82C60CF4b08b99A0AD48AD499FB:3:57142642 signer:0x6A5bd4A6E0ba8b1c0a6CCBf1774D382B37649A89:55085:1145 signer:0x3bDA9Fb5470F0c2bC4708bD2Cf01A02CaDA23665:221528:9243 signer:0xC5e2018b082b1C136535b529FC209d121AAE253c:450771:2561891276255 signer:0x09e7f56bB29bDCB403Ad82Ad431a4c06796AD637:991203:16683 signer:0x0359964382eaD031F90B61ab83E1815b8eEEf719:178:201 signer:0x660721293456C0d4B7a93a8F4Bac04141C8Da24B:16777212:127813613318768519 signer:0x4aa6B7E4D2B5996e8e8A1630D60fF839adBc4137:5853:1780153030 signer:0x1bAA5FBe550Bf83206528CB29f1C29B6DE5DCE1D:425486:33882343753423 signer:0x91798B32f5580EfB6b74782197e65240608Ab7F2:3978620:1050682510891 signer:0x39a0009EebeE9Fa182A6F9F4BBb31f4f5aC5C2D2:1293:41420179432 signer:0x44c5ce1622c7ecb8A6Ece946c76319c121F5b137:38746:1044548079703979060 signer:0x7E202d11dFbFd15B73D9e678beD10BC1AF60F6A4:16777212:3099452 signer:0x578943Aa4344395095B4c67D991D32831B915980:1433005:632293006183 signer:0xD1EE5bce6B5188471e180fB61E36AeAb6aEcf8f7:480646:18340493420256269 signer:0x36ef08F6728911D64a7683399747949300e9989b:5:58862779170344738 signer:0x6CEC75281Cee1A1150BC3C938ca376886Cf71Ce7:1178542:3 signer:0x722c340bC32bFff42492AFC77d68BA614F6dA881:158740:309567498 signer:0xaF9D69924A76b7750dc451FF0588771c730E17b0:0:8350304576 signer:0xfFe89d1a8889Ed95364C9FaEBCCE25C00b6BE231:7448216:1580672006 signer:0xD549FAC71947dd880fbf174C8ECaa999cFC59bfd:2071:300087703545735 signer:0x29875Bc901Fac236Fe39760324967dcF33Cd41f3:0:840277415794 signer:0xead9Ef2182fD4c14E0bE52c87dD47378A5b9DdA8:0:6701495309801 signer:0xD09aA4dd5f92dbF177d691Bd9520fE270589B8Cf:514:18446744073709551612 signer:0x98B8b3CC386eEcaeF62F54C8f05362A890238c4e:0:2102143450 signer:0x0684CCE5c50790B7e207786CbeDDbe7a0ebe9972:87125:3192540782695568 signer:0x93D69005cA68E4459eD1b3C752eBaFA3eEeaAA49:258266:10805392 signer:0x3677fE4056cBf541B87c4875bCc2590aA58E6288:11:88755129644340 signer:0xdcF5521C434D27c7Af056A03804ED450cFdd1d33:1924058:961988605085927878 signer:0x775acd6D965fEEebDa89682402fdbbD48C4f4238:271:18446744073709551612 signer:0x70c8096b04C5a2Dc1eBF74d39b27ac292a7CE29D:29186:0 signer:0x8D7F4E6AB13b06009D8b939000EefAeF5430C51c:37504:7643579 signer:0x66C5691aFCc4BF1ee4667D0F9Ee0bca52E925eF4:21453:137032 signer:0x33F7595b936733bC3D6eAB3C0A250ea38ad12f70:269:103571725 signer:0xb039FED5a40D2E2421d92B201c6cd794E2CA3610:31562:522849235 signer:0x751387BB2a9a3eF8BeA44BD0BCf5B46F861f9E07:214:41772708931071 signer:0xF795cb64EdD5d0eF498F00b8f8d4a479A47276c8:7:1 signer:0xfaec4D0b4B821B286E2Ed0BEb1660eDF8C358958:16480271:191955281236663 signer:0x9898E4373Edddbe42D49128D505165ea6D1a64fa:352934:2423189687 signer:0x8fA7570b334CABA287eb4d64Be338CB84c394EC2:1819712:36109358403 signer:0xe4df259d4F9971b2750479c2174B4aef4cE5D434:125:1350763526877317 signer:0xCA12fFd55eD4A18546Bb395Fa93a2c4f04A987cB:835374:1 signer:0xe4c7Caf9d420D6d33250B5A5B19789B0cC016DD8:45861:4174169581595778 signer:0x00010e342bb541E117D27C222BD7474A2fB29338:106240:0 signer:0x36eb446A08ef76aB70522aBD12C6F78602c7A560:15:3947523806 signer:0xE55be3C22E3981D30F56E4f282f18a1AEA08c858:73094:241132975 signer:0xB84e809698A2E775076F7e831772E1C37d0bf8d5:212244:6616685070453233972 signer:0x24B28bF225080823d2e1674A21Ff14C8efE7D11E:0:3235867992606932150 signer:0xD1539488EEB6F5006CC7141FCAdF0321d68a5e4b:1854924:2051 signer:0x3805ac21c2f0026CcD3B860A719bfCF30d9e503a:73689:40337002045 signer:0x129552848bfe0C47b2ec63A2839D8B33cA630a23:10059939:103509 signer:0x2c4B827CA1a4080b6aF4dB5Aa1A062184E706951:9:545810 signer:0xd006e5f2b2B9c4D2aD09c12EEE847b33d066b375:3:75797032514399 signer:0x34aCbecC6854652982d9a5f51600F140d343b63f:59:3379694 signer:0x2FD9D3e003778819bf3c7637321c7A33B65D307d:16777212:92781483526 signer:0xd442FABb4B29330EF530ad8176ADd1C5ecd634F6:10785:79919809 signer:0xa1750AE5a172269AF50fd5A6FFa1c1BB2eaB7aA7:338:23721596 signer:0xc22260341325a2A7dE422953e0ff43FE52E9e557:42158:48576 signer:0x7cf5C6321B33B0499939DB1c447B4763DBb8Fbc0:3411:3 signer:0x2fc35cFD0A95a3c5493758c019DcebB49D9EbE42:154:334574 signer:0x4A97d82aac7C00c46c31f5c8C3ddAb7Ba27B96aC:3208372:7505 signer:0x5aaA0C2dfFEeCc744DBE78B9Dd07303f7095Dcf8:3:3 signer:0x8211EB28ccE307E7B1623BddEE90993D5452aeFf:139014:0 signer:0xbA889b245ff5f177bBd4eFC245cDA435239110f8:68980:4 signer:0x67Af28d1965A277c890f88879C4a9f06731c7f2B:16777212:5152204257 signer:0x5AC08838A2339655fD4E36910ec9EDF12e0e6981:39868:13 signer:0x90dBC39468Ba117c1f7F34e3Ad9b08D4659CE30B:0:5746178440164 signer:0x12a0759606cDe77499CFf2f7584f4a2D7c47D0d6:692:42009287355070685 signer:0x5243A5193fb90AAF0582AA4CdA10cE0A8F718b80:153310:183244451604 signer:0x8E6F18f101988933dD0AFAE21C455361f1777616:118566:2523 signer:0xA136F7ecd94870345a06bC775E87309767654Dc8:13143010:18446744073709551612 signer:0xbEbF976AFcd9E2596cC68E3D3A77a57c8EB8F0EA:228:89699020305 signer:0x35903a5BFe35f1778068e025A7c15693218c3ffE:878:4 signer:0x8402B32335DDd218B81089F29c80e265ba9583DE:16171819:20100502 signer:0x43B18463Ba9Ac136Ea06192225932d5eB93d3853:326:373231665088639621 signer:0xD5739fC23f4cEc332C8EF839b40023e20c1C88eE:1731397:8390 signer:0x8Fa6C249c49ec2aAcFeAa1BF0aA6a56b2b97493b:3242679:11 signer:0xA8465430A8c51da25b7c9b5DA5811c5296850509:1:5751661 signer:0x60D20b1C704984177C1E08D61923a34Ae2a49Aa5:1:62492540990924 signer:0x7b126b214Ed0AF7244A94779B9bE42d59590e931:0:9365548801968 signer:0xB9054aA5FBcdBFb5d857faFeA70b18967189A13e:11:18446744073709551613 signer:0xefd81d98a2AA829e16d3c29E63CC6B55B47eC425:11:80263 signer:0x6fEB19f3f46634f65298E79A3d9f379d3ad6DB4b:0:2564 signer:0x8D47fC0362E8A28A8183D3417792814a2a86c1B2:219:855808125205 signer:0x6Cb688a0027Cc2fc7Ace8aB25Da9C434FcdC71EC:25:752753042554 signer:0xf8aD39b01820F97b8CA8c9F82D590372fa7484e6:4401:1884 signer:0xEbB9C64540f4873A3D516271659D6775B9bf5895:1:765 signer:0x964D2b70B82F5ECA4Dbaa5F59852A9716F64D25D:28205:118619533296006270 signer:0xB1c5cceEedA884288e8cc2ca8E40AC4DbE430fE0:38200:108874167870 signer:0x68Ac2fa950CD6974B278d6F91D8fe3AB9F838D04:16777215:49930576140819939 signer:0x6737f2063e6c179697633692cC1716eeEce52c96:0:10264340004122584 signer:0x42d6f37A8ABd61A405F3d8620B1c60f8D82f8dc6:93551:2739626214 signer:0xf35df3537310143775D0dfA2Aa330DFF7E4c8823:1099:5230576 signer:0x322b95b502376821f88ca1D8e6C838F5577329E1:3:1 signer:0x49a24Ad28ccCA4eD3731a99365A2A32754134A8A:2545:80 signer:0xCCDac4d441358387a4Dfef7d083c96E8578df05E:0:1025632611 signer:0x75D8387c5a4722e742e2827Cf756c02C92FEc4ae:0:18446744073709551614 signer:0x56bbd423Fc8619291222e4e9109F8fcF891431c8:0:2859794868629 signer:0x8e9eca841a2E94A9811B950ad727143D1941fBEB:2:104951584167541 signer:0xBBd5C31A8B543581842eA139eA7c28F1b13f91bf:1:132514412455805 signer:0x7e6857f122de40d6895C1d191011550c2Dd3E556:853408:8298609072202685282 signer:0x1F9406dD4662c173bF6A744Ff1EF2a6Ff73296d7:1023180:30064 signer:0x768b8252d9f60539B048D15065Ec1B9acbeFD5a1:13483:28501395961953413 signer:0x6FbE03ed32de6e9B695b5420A44dbC58cD9E94d4:7316:170419763722147332 signer:0x60B412F10271fc19e27A35B91650747CBc02617C:3079:187 signer:0x261827C0Dae3841BFA6b8Da79D8FFb3787C22f6A:476:67 signer:0xCE72023081f41E851C96DfAFb6711513f5eB0f8a:647:62814991 signer:0x2FaD88020523aDCd53989129055F5f4BA46fFf4C:0:50 signer:0x5937702316e23Ee8F518261de28a3638653a4624:9332:18446744073709551613 signer:0x8aC10E7e51bcE65626b471749A14819b4c5366ad:0:0 signer:0x78fe20896A1643152d25775867fD4CDE742f5E37:37:1860258 signer:0x00454B0d4Decc2736Cc243A10453eBC5F1c052fD:95:1180477694 signer:0xa437d936B7c6E0be0a8d33a72b6013178AdF3d4A:1:117603479434 signer:0x6Dd3340D1C17ddEE6ec81B9CD1Fe268005762728:4364639:35301027003745270 signer:0x716d196EDbF7dd5043A4f42e777eD0F5f3b40F7A:57:14265135750687746 signer:0x7312a20B6a1477D67B3295B9b6E82C295d3c2635:12:1314113256448586968 signer:0x23D57AC5e3b7080E7f7d4d7C7bcfb474EE6F4395:4:7549552 signer:0x25D0DEc666eBC6342651a07936a634B8570E31A5:10009:109148514826 signer:0x2f244bD701c5cB4DbBdB17567D473d80ae6c6F05:9:203338840106940 signer:0xF49478C11d071e5dfe91bbAC4523aA9552979f13:1:74 signer:0x58d91A8903735DE9DE38B06400474b7fbD0CD43D:1716:17808 signer:0xB26459053bd80D546CCf65e0DC1ff4dA604021b9:91:825653530669 signer:0x56606E845D09e1F49723aca1AA62786d6Fd0501F:132:3 signer:0x8080606C6Ea829F7f1FF667f12aD94823c218fe9:1:5223448602 signer:0x47ac2Dc22c305CB18122C01D14Ab1f1Cd4D0F2d6:245798:3898274548892075 signer:0xcAEc0ec73Ea6C3c701F9aE82578cc93D06C49DF1:47:16193838580 signer:0xeFE69a1950b34b4439A1f000a3119B64BA46140F:1342:482586647545331 signer:0x520736ACa3ef0dfF5B6AdCC05bc817788c433de9:3:503093 signer:0xc713c1e4a347eAAFf649C26A0dc2eaD45ec3DB4e:390:118519268609346 signer:0xed2113b8c45844aAa7e3f02Ec71C631ac187e637:1082:43279517889187 signer:0x6fe93109113Ef9B540850805bb2870f414446D46:10:3127797468402457 signer:0x27F4eB63c8ADA6eb25437a6b7DAe5a0AfA2F172c:12722:18446744073709551615 signer:0x7765670e2A53658D2dAa335af54A290265696E4f:174828:12419388940262 signer:0xD97E54844fBbA30eC8d5B242c11c04390cFCae46:29274:32 signer:0x1aCECD2BEfA7BaA5c895Ce260FdD28A443D8444f:5:13820612 signer:0x9010AA0bA954999Bd258956E50B3b0bF08CB4F36:46:459650 signer:0x4855562F41fDc050A075769d572df74dD993525e:28:692 signer:0xA4ba2705b8c42262a265C4E578DA9E882474E20b:33:474819 signer:0xE87c6AE9c64FA7B5A06ef052aD49fE6a5EC14104:522448:860004 signer:0x9b7C28877079C25Da39861B2522D4B563DcE99c8:7920953:25946 signer:0xd4956C0506A193149FE58715c80549E34fa97c01:7:0 signer:0x3eF288a2a04Ea44d3A82A9CAB92Ee24e8C059056:2464599:197073204 signer:0x600cB4BbF9B40cd24E07D2F6E975e994FAF9a3b7:19:3 signer:0x77d93eb350dae84DeF8b69B6Ba4a40b96b20116E:173026:18446744073709551612 signer:0xbac5DDF4ff20b974269aa39fE66C040F9a6dF74a:16777214:13159 signer:0xCCc578B87fa48b1462e0bb9c3A384c6b859a814c:6539780:2 signer:0x0135449B740d02110CE28D020589E5F1c4238213:545:9011552561677976 signer:0xe5710F26bB51D059eC63072f4F4dEef54c1E465C:7155880:10426565642571947 signer:0xEf63D07DAA8E6B3A28e17cF8d83620AF5eD68733:17:1867940 signer:0x76f5f461c44c36311E4946971f40600b4D7f3311:9:948 signer:0x212BE268040Dbb61D540dCAC6b55e9C9aBB9708c:229251:1642817 signer:0x794cB0C76C372aee39ba561f1FF98238540c2f93:14701:2 signer:0x14D30fe32a2DA4Bb5C697894570CA79e403654AC:2977:3 signer:0x3777D783a0AfAD08d974cA4BE474bCe2F3879e99:773548:1 signer:0x72F6BDd501740F5FEB1a4D22E5D0cEeE353b66b4:6900244:220931636811 signer:0xD63482C8970581b14Bbdf06B7F4B4341384CF99e:25:10372140457 signer:0x1260471Df7A364808B563A22606727E0D3Fd06e0:2264:70274078107896 signer:0xE7ca3e1402ccCa8cD183FFf035996695B903Bfc0:436:194 signer:0x9C75622d8764753234cb7b14d1dEd1159cB4B2ad:0:60060694 signer:0xe75853860406D5d849020033776e5222f6647b60:192:3600039820582 signer:0x15Bf0eae96e98a918f4D2BC0801feFB3B6560AC8:21711:18446744073709551613 signer:0x9e4CEA98cB9Ad775024a87282FEe86560F7f25b5:1842:43879463806383 signer:0x86d1fad0F10fA4374eD976ee94D1F31378E807bA:2848472:252893 signer:0x9A04096e3D9f06d4B8EA9029fC8d38755Cf8d13E:45:207118230169326164 signer:0x71A9D5cdB0942C1D083E71875cC9E91d4345716E:243:1076602400151600 signer:0x5e564419d0d68B99029eb6D3521e3E9fcBD69519:3:45146 signer:0xEecdee4Eba0c28BfC3F0920De70793B31e6C198F:18:93 signer:0x73fCC55EC7C3FF4A84cCFB2B033fCfdb32C8d604:482:18446744073709551613 signer:0x40dD8C424201e5DB762ae02D32F8091Cf7a3E605:20149:408764337389646 signer:0x1e2e0DF7f1089BFf97Ba17453dB637e1D261F74B:225:28 signer:0x0f253652948b43FBe1Db5C91d37BB7C06113B9af:32:345926836755 signer:0x018b603f80ba2E0B4B061FBF10c8f1f6344AE497:850615:521919877838634 signer:0x5666991C59Db0EaC0EC91c8D5bE5eC067a0fE76d:3588343:132972733816630 signer:0x268610449fD627E4F5838F315FE8aadc2a217088:16777212:1213785439 signer:0x2cBF10b58f7527017DdCF6Dff0a1108f51140147:178344:722387940915864 signer:0xb09e6FBdb9f26273BAaB3d9480F403Eb3227fA4A:0:1133991 signer:0xDa4Ef6ba6Db9fADE1981c0F82A1916F65EC2BA0d:626950:9810844668337467140 signer:0xCce00dE32530e944c52622445Dd070f0f070D1A8:7192:98006 signer:0x269716844331391001a0044377f3B5931362b70c:631:190199602843099 signer:0x46441De1bcE6e05455b408E8C1986ED2B818D906:93:19421898123540 signer:0x1bf84CF2354a2D7C01c96739Eb7B48a31B1DedF5:7:1 signer:0xB49cc49E8ceDFa6b580eebF934Fc457eC9bCb612:28:21610 signer:0x14Eae77a10cb34de3418bDCCf77330E968f98b50:4402:11609 signer:0xE0cfC419e32Fa579bd3606920ddF90B082501fa8:254274:18446744073709551615 signer:0x00C47B2957a721AcBAd66b39682F83735De3d2D2:27:48492258 signer:0xAc2D477d8c0667B65563CCC7a09a8Cec07321905:549808:512652865185661 signer:0xF7e417b9bE49e8f48Caf541ce4128991c113E883:460598:43 signer:0xCe0Ef79B18d443Ffc6C73858D7474Ae8D2aec496:4393:4579 signer:0xca4862F4b54252547c6B9935FD23e816ba03B719:27842:16364473 signer:0x879d503f0aB2669f7c4E0dc4858b3Be56fc74bdc:2:450055748558 signer:0xFcc92F6DE15928eaa6b6d109f5109548fa2F91dD:1:2 signer:0xb3AC1fc7325Ea569724B418f1C60d64883c526d4:0:7396883569314039 signer:0xBED5D9Ea5fb89af9D4B16a20BB01796Cd5eC34E4:0:51297105 signer:0x3FAF806F7eE4D43567D9C1893B4E6Aa1DAbE5e9D:0:15206858530 signer:0xb6a952d281E23a4C47F68e801c5cF7EEaF803C1A:9:18446744073709551614 signer:0xC5077f42ce8FDa1D1b2bcD58d7ea145022bc3bB5:856486:6614144307466203981 signer:0x429283c321B4FdF96A3B755Adac25AC22eE71eeA:15096250:17764 signer:0x07ed0A9DF528984f39973Fd7129E14C1951C0B0d:602825:348398781042535 signer:0xBA41d99DD808F6fF591e546Ae1B1b2258F5AF5ff:3103203:196605588989675 signer:0xf4aA3C2F951E56B82d6134F6c3aF909eF756901F:0:1085859630 signer:0xD9ea97499cC4cE346b649a6d0Fcf3AE9A21cc9e0:1:219397902844 signer:0x24D3E920bA1dC55bBcB4E7728e31eA67718768eD:9233:437 signer:0x26B924042dB2005EE9040814eE02c013A8aA0055:73:9494812543185 signer:0x297Da1A9E77430D4Ec03b972185873102daE8777:230:18446744073709551613 signer:0xF6B94491B15043C23386ec1C0BfBcbeD21bC8521:14582:18446744073709551615 signer:0x43E8126AD7D913483473188a24e256E2DDE6Feb2:1444:5163444478367 signer:0xbf9241960fD38d33b3f15b35a1c112b3e67741c6:0:1380184521430552064 signer:0x0a13702bFc4c3A2C8a1eD1862b46b42F05f8a3Da:11:4 signer:0xf1073d750E123353953F439f25bE1CE7342936A6:292167:51505240132 signer:0x2e6BF62e70b9b87836BaE5bEb8b899000629eD64:0:64601 signer:0x60EB355b0Ecf6a5c135A8410C1cAD7dA800E8405:225:10 signer:0xec6B066CCd130f4AafE39cFFada2487d5229674E:1022093:493 signer:0xD768987489A4Be65A11c47808548767c2ddA1638:1:118 signer:0xd16C95db0cc369981942F542262191EfD571E9bd:3:18446744073709551613 signer:0x440265a02484f1c8f3665fe9135bf1824E948b8c:59929:14131844138981197 signer:0xC096d66E138764a47b34302eA60bc3906149D365:15:82 signer:0x692caaeC8931bDEC324C861d0239D8F4750190fB:15595:159 signer:0xaF3328eB711b3d56c52D0eBE94eE35e85fF7a362:83175:78344987572538 signer:0x26DF8e32265800746D2609bCd304CbDdCC8f10De:91375:174888886070 signer:0x698225F02aE06930878eE7f6Be9ece88292B3a76:1267:1437108")] + public void TrimLeaves(string signer, string input) + { + var leaves = input.Split(' ').Select(RecoveryLeaf.FromInput).ToArray(); + var topology = RecoveryTopology.FromLeaves(leaves); + + var originalEncoded = topology.Encode().ByteArrayToHexStringWithPrefix(); + + var trimmed = topology.Trim(new Address(signer)); + + var trimmedEncoded = trimmed.Encode().ByteArrayToHexStringWithPrefix(); + + Debug.Log($"Trimmed Hash: {trimmed.Hash(true)}"); + + Assert.AreNotEqual(originalEncoded, trimmedEncoded); + } + + [TestCase("0x03b19740b91280bb5ad3103a9d3783ce780df0922564e9951d0f5daf5c815c89e30400011b03769df43a090943f0ab9b866176744f843696973fd08927fa785dae12691eb519040000d503e5e753ddc2b7c51d7f567d33de175c0d347f8c249dc680c01bf0825dda0c6428040000b0034a2670f9e7875d39c83b55883077f9ac367ec05e642c854326dbee0fc30ea4880400008b039cbc452569313e3b108a4166f624e8b83fe510059e21e9ecbd9b2aa188dbe3df0400006603e3267a69138af073182906aefb38937b91605c6a6006e386e84a7903176d8d2504000041019b7c28877079c25da39861b2522d4b563dce99c878dd39000000000000655a0365dae119bb399e601707aca8ff23f162ab3a49434347c5c274a640782b574ba6038a5c209aef60e572f937644965d9ca0a652279b64d6e82c0d46d307267244a32")] + public void HashEncoded(string encodedHex) + { + var topology = RecoveryTopology.Decode(encodedHex.HexStringToByteArray()); + Debug.Log($"Hash of encoded topology: {topology.Hash(true)}"); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/RecoveryUnitTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RecoveryUnitTests.cs.meta new file mode 100644 index 00000000..9d711ffb --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RecoveryUnitTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a37c582f76e54f199898c041aa8cd230 +timeCreated: 1751399038 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys.meta new file mode 100644 index 00000000..4d650864 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4a62644a59f74fd38f8bd54b7ba4d229 +timeCreated: 1751393679 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/DecodedSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/DecodedSignature.cs new file mode 100644 index 00000000..88a14f5e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/DecodedSignature.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives.Passkeys +{ + public class DecodedSignature + { + public PublicKey publicKey; + public byte[] r; + public byte[] s; + public byte[] authenticatorData; + public string clientDataJson; + public int challengeIndex; + public int typeIndex; + public bool embedMetadata; + + public byte[] Encode() + { + int challengeIndex = clientDataJson.IndexOf("\"challenge\""); + int typeIndex = clientDataJson.IndexOf("\"type\""); + + int authDataSize = authenticatorData.Length; + int clientDataJSONSize = clientDataJson.Length; + + if (authDataSize > 65535) + throw new Exception("Authenticator data size is too large"); + if (clientDataJSONSize > 65535) + throw new Exception("Client data JSON size is too large"); + + int bytesAuthDataSize = authDataSize <= 255 ? 1 : 2; + int bytesClientDataJSONSize = clientDataJSONSize <= 255 ? 1 : 2; + int bytesChallengeIndex = challengeIndex <= 255 ? 1 : 2; + int bytesTypeIndex = typeIndex <= 255 ? 1 : 2; + + byte flags = 0; + if (publicKey.requireUserVerification) + flags |= 0x01; + + flags |= (byte)((bytesAuthDataSize - 1) << 1); + flags |= (byte)((bytesClientDataJSONSize - 1) << 2); + flags |= (byte)((bytesChallengeIndex - 1) << 3); + flags |= (byte)((bytesTypeIndex - 1) << 4); + + if (embedMetadata) + flags |= (1 << 6); // 0x40 + + var result = new List { flags }; + + if (embedMetadata) + { + if (!publicKey.metadata.IsValid) + throw new Exception("Metadata is not present in the public key"); + + result.AddRange(publicKey.metadata.Encode()); + } + + result.AddRange(authDataSize.ByteArrayFromNumber(bytesAuthDataSize)); + result.AddRange(authenticatorData); + + var clientDataBytes = Encoding.UTF8.GetBytes(clientDataJson); + result.AddRange(clientDataBytes.Length.ByteArrayFromNumber(bytesClientDataJSONSize)); + result.AddRange(clientDataBytes); + + result.AddRange(challengeIndex.ByteArrayFromNumber(bytesChallengeIndex)); + result.AddRange(typeIndex.ByteArrayFromNumber(bytesTypeIndex)); + + result.AddRange(r.PadLeft(32)); + result.AddRange(s.PadLeft(32)); + + result.AddRange(publicKey.x.HexStringToByteArray()); + result.AddRange(publicKey.y.HexStringToByteArray()); + + return result.ToArray(); + } + + public static DecodedSignature Decode(byte[] data) + { + int offset = 0; + + if (data.Length < 1) + throw new Exception("Data too short"); + + byte flags = data[0]; + offset += 1; + + bool requireUserVerification = (flags & 0x01) != 0x00; + int bytesAuthDataSize = ((flags >> 1) & 0x01) + 1; + int bytesClientDataJSONSize = ((flags >> 2) & 0x01) + 1; + int bytesChallengeIndex = ((flags >> 3) & 0x01) + 1; + int bytesTypeIndex = ((flags >> 4) & 0x01) + 1; + bool hasMetadata = ((flags >> 6) & 0x01) == 0x01; + + if ((flags & 0x20) != 0) + throw new Exception("Fallback to abi decode is not supported in this implementation"); + + string? metadata = null; + + if (hasMetadata) + { + var metadataBytes = data.SubArray(offset, 32); + metadata = metadataBytes.ByteArrayToHexStringWithPrefix(); + offset += 32; + } + + int authDataSize = data.SubArray(offset, bytesAuthDataSize).ToInteger(); + offset += bytesAuthDataSize; + var authenticatorData = data.SubArray(offset, authDataSize); + offset += authDataSize; + + int clientDataJSONSize = data.SubArray(offset, bytesClientDataJSONSize).ToInteger(); + offset += bytesClientDataJSONSize; + var clientDataJSONBytes = data.SubArray(offset, clientDataJSONSize); + offset += clientDataJSONSize; + string clientDataJSON = Encoding.UTF8.GetString(clientDataJSONBytes); + + int challengeIndex = data.SubArray(offset, bytesChallengeIndex).ToInteger(); + offset += bytesChallengeIndex; + int typeIndex = data.SubArray(offset, bytesTypeIndex).ToInteger(); + offset += bytesTypeIndex; + + var r = data.SubArray(offset, 32); + offset += 32; + var s = data.SubArray(offset, 32); + offset += 32; + + var xBytes = data.SubArray(offset, 32); + offset += 32; + var yBytes = data.SubArray(offset, 32); + + return new DecodedSignature + { + publicKey = new PublicKey + { + requireUserVerification = requireUserVerification, + x = xBytes.ByteArrayToHexStringWithPrefix(), + y = yBytes.ByteArrayToHexStringWithPrefix(), + metadata = PasskeyMetadata.FromHash(metadata) + }, + r = r, + s = s, + authenticatorData = authenticatorData, + clientDataJson = clientDataJSON, + challengeIndex = challengeIndex, + typeIndex = typeIndex, + embedMetadata = hasMetadata + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/DecodedSignature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/DecodedSignature.cs.meta new file mode 100644 index 00000000..3507a2ba --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/DecodedSignature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 797fc7cc21534e5e9fbc9afee9ab5ecb +timeCreated: 1751404814 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeyMetadata.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeyMetadata.cs new file mode 100644 index 00000000..109caec8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeyMetadata.cs @@ -0,0 +1,40 @@ +using Sequence.ABI; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives.Passkeys +{ + public class PasskeyMetadata + { + public bool IsValid => !string.IsNullOrEmpty(credentialId) || !string.IsNullOrEmpty(hash); + + public string credentialId; + public string hash; + + public byte[] Encode() + { + if (!string.IsNullOrEmpty(credentialId)) + return SequenceCoder.KeccakHash(credentialId.ToByteArray()); + + if (!string.IsNullOrEmpty(hash)) + return hash.HexStringToByteArray(); + + return "0x00".HexStringToByteArray(32); + } + + public static PasskeyMetadata FromCredentialId(string credentialId) + { + return new PasskeyMetadata + { + credentialId = credentialId + }; + } + + public static PasskeyMetadata FromHash(string hash) + { + return new PasskeyMetadata + { + hash = hash + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeyMetadata.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeyMetadata.cs.meta new file mode 100644 index 00000000..26a72220 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeyMetadata.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9be3797b9b504c23ad5bd5b904bd674f +timeCreated: 1751402532 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysArgs.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysArgs.cs new file mode 100644 index 00000000..8758a988 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysArgs.cs @@ -0,0 +1,17 @@ +namespace Sequence.EcosystemWallet.Primitives.Passkeys +{ + public class PasskeysArgs + { + public string x; + public string y; + public string r; + public string s; + public string challenge; + public bool requireUserVerification; + public string credentialId; + public string metadataHash; + public string authenticatorData; + public string clientDataJson; + public bool embedMetadata; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysArgs.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysArgs.cs.meta new file mode 100644 index 00000000..626318fd --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysArgs.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e64f7cefb0984bab9ce63147f2794424 +timeCreated: 1751393938 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysHelper.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysHelper.cs new file mode 100644 index 00000000..f787604f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysHelper.cs @@ -0,0 +1,65 @@ +using System; +using Newtonsoft.Json; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives.Passkeys +{ + public static class PasskeysHelper + { + public static string EncodeSignature(PasskeysArgs args) + { + var publicKey = new PublicKey + { + x = args.x, + y = args.y, + requireUserVerification = args.requireUserVerification, + metadata = !string.IsNullOrEmpty(args.credentialId) + ? PasskeyMetadata.FromCredentialId(args.credentialId) + : PasskeyMetadata.FromHash(args.metadataHash) + }; + + var signature = new DecodedSignature + { + publicKey = publicKey, + r = args.r.HexStringToByteArray(), + s = args.s.HexStringToByteArray(), + authenticatorData = args.authenticatorData.HexStringToByteArray(), + clientDataJson = args.clientDataJson, + embedMetadata = args.embedMetadata + }; + + return signature.Encode().ByteArrayToHexStringWithPrefix(); + } + + public static string DecodeSignature(string encodedSignature) + { + var encoded = encodedSignature.HexStringToByteArray(); + var decoded = DecodedSignature.Decode(encoded); + + return JsonConvert.SerializeObject(decoded); + } + + public static string ComputeRoot(PasskeysArgs args) + { + if (!string.IsNullOrEmpty(args.credentialId) && !string.IsNullOrEmpty(args.metadataHash)) + throw new Exception("Cannot provide both credential-id and metadata-hash"); + + var publicKey = new PublicKey + { + x = args.x, + y = args.y, + requireUserVerification = args.requireUserVerification, + metadata = !string.IsNullOrEmpty(args.credentialId) + ? PasskeyMetadata.FromCredentialId(args.credentialId) + : PasskeyMetadata.FromHash(args.metadataHash) + }; + + return publicKey.Hash(); + } + + public static string ValidateSignature(PasskeysArgs args) + { + return string.Empty; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysHelper.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysHelper.cs.meta new file mode 100644 index 00000000..ea06874a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PasskeysHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 380eef031141476cbef0d3ef8b8bde93 +timeCreated: 1751393686 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PublicKey.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PublicKey.cs new file mode 100644 index 00000000..0d7c86e0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PublicKey.cs @@ -0,0 +1,39 @@ +using Sequence.ABI; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives.Passkeys +{ + public class PublicKey + { + public string x; + public string y; + public bool requireUserVerification; + public PasskeyMetadata metadata; + + public string Hash() + { + var a = x.HexStringToByteArray(32); + var b = y.HexStringToByteArray(32); + var c = (requireUserVerification ? "0x01" : "0x00").HexStringToByteArray(32); + var d = metadata.Encode(); + + return SequenceCoder.KeccakHash( + ByteArrayExtensions.ConcatenateByteArrays( + SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays( + a, b)), + SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays( + c, d)) + ) + ).ByteArrayToHexStringWithPrefix(); + } + + private byte[][][] CombineTree(byte[] a, byte[] b, byte[] c, byte[] d) + { + return new [] + { + new [] { a, b }, + new [] { c, d } + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PublicKey.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PublicKey.cs.meta new file mode 100644 index 00000000..a10a9d58 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PublicKey.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9ddd08b6b1914a859d2825901cb160cd +timeCreated: 1751402152 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs index 340b716f..49b6074e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs @@ -1,3 +1,6 @@ +using System; +using Sequence.Utils; + namespace Sequence.EcosystemWallet.Primitives { public class RecoveryBranch : IBranch @@ -11,5 +14,23 @@ public RecoveryBranch(RecoveryTopology left, RecoveryTopology right) { Children = new ITopology[] { left, right }; } + + public byte[] Encode() + { + var encodedLeft = Left.Encode(); + var encodedRight = Right.Encode(); + + if (!Right.IsBranch()) + return ByteArrayExtensions.ConcatenateByteArrays(encodedLeft, encodedRight); + + if (encodedRight.Length > 16777215) + throw new Exception("Branch too large"); + + return ByteArrayExtensions.ConcatenateByteArrays( + encodedLeft, + RecoveryTopology.FlagBranch.ByteArrayFromNumber(1), + encodedRight.Length.ByteArrayFromNumber(3), + encodedRight); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs index 9308f2a2..caa0ac75 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs @@ -1,11 +1,14 @@ using System; using System.Numerics; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { public class RecoveryLeaf : ILeaf { + private static byte[] HashPrefix = "Sequence recovery leaf:\n".ToByteArray(); + public Address signer; public BigInteger requiredDeltaTime; public BigInteger minTimestamp; @@ -24,14 +27,18 @@ public byte[] Encode() { return ByteArrayExtensions.ConcatenateByteArrays( RecoveryTopology.FlagLeaf.ByteArrayFromNumber(1), - signer.Value.HexStringToByteArray(), - requiredDeltaTime.ByteArrayFromNumber(32), - minTimestamp.ByteArrayFromNumber(32)); + signer.Value.HexStringToByteArray(20), + requiredDeltaTime.ByteArrayFromNumber(3), + minTimestamp.ByteArrayFromNumber(8)); } public byte[] EncodeRaw() { - return Encode(); + return ByteArrayExtensions.ConcatenateByteArrays( + HashPrefix, + signer.Value.HexStringToByteArray(20), + requiredDeltaTime.ByteArrayFromNumber(32), + minTimestamp.ByteArrayFromNumber(32)); } public static RecoveryLeaf FromInput(string input) @@ -49,7 +56,7 @@ public static RecoveryLeaf FromInput(string input) return new RecoveryLeaf { - signer = new Address(address), + signer = new Address(address.ToLower()), requiredDeltaTime = BigInteger.Parse(requiredDeltaTimeStr), minTimestamp = BigInteger.Parse(minTimestampStr) }; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryNode.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryNode.cs index 4660b535..9c2dadd5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryNode.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryNode.cs @@ -13,7 +13,9 @@ public object ToJsonObject() public byte[] Encode() { - return Value; + return ByteArrayExtensions.ConcatenateByteArrays( + RecoveryTopology.FlagNode.ByteArrayFromNumber(1), + Value); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs index 1eac13a0..0c22df9b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs @@ -35,7 +35,7 @@ public RecoveryTopology Trim(Address signer) if (leaf.signer.Equals(signer)) return this; - var node = new RecoveryNode { Value = this.Hash().HexStringToByteArray() }; + var node = new RecoveryNode { Value = this.Hash(true).HexStringToByteArray() }; return new RecoveryTopology(node); } @@ -49,7 +49,7 @@ public RecoveryTopology Trim(Address signer) if (left.IsNode() && right.IsNode()) { - var node = new RecoveryNode { Value = this.Hash().HexStringToByteArray() }; + var node = new RecoveryNode { Value = this.Hash(true).HexStringToByteArray() }; return new RecoveryTopology(node); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs index 5c181f54..acef8164 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs @@ -1,4 +1,6 @@ using System; +using System.Linq; +using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives { @@ -29,6 +31,22 @@ public SessionBranch(ITopology[] children) Children = children; } + public byte[] Encode() + { + var encodings = Children.Select(child => child.Encode()).ToArray(); + var encoded = ByteArrayExtensions.ConcatenateByteArrays(encodings); + var encodedSize = encoded.Length.MinBytesFor(); + if (encodedSize > 15) + throw new Exception("Session Branch is too large."); + + var flag = (SessionsTopology.FlagBranch << 4) | encodedSize; + + return ByteArrayExtensions.ConcatenateByteArrays( + flag.ByteArrayFromNumber(flag.MinBytesFor()), + encoded.Length.ByteArrayFromNumber(encodedSize), + encoded); + } + public SessionsTopology ToTopology() { return new SessionsTopology(this); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/BranchExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/BranchExtensions.cs index 810bcd2c..af41f3c2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/BranchExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/BranchExtensions.cs @@ -1,6 +1,4 @@ -using System; using System.Linq; -using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives { @@ -10,21 +8,5 @@ public static object ToJsonObject(this IBranch branch) { return branch.Children.Select(child => child.ToJsonObject()).ToArray(); } - - public static byte[] Encode(this IBranch branch) - { - var encodings = branch.Children.Select(child => child.Encode()).ToArray(); - var encoded = ByteArrayExtensions.ConcatenateByteArrays(encodings); - var encodedSize = encoded.Length.MinBytesFor(); - if (encodedSize > 15) - throw new Exception("Session Branch is too large."); - - var flag = (SessionsTopology.FlagBranch << 4) | encodedSize; - - return ByteArrayExtensions.ConcatenateByteArrays( - flag.ByteArrayFromNumber(flag.MinBytesFor()), - encoded.Length.ByteArrayFromNumber(encodedSize), - encoded); - } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs index df676686..2137c31d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs @@ -3,5 +3,7 @@ namespace Sequence.EcosystemWallet.Primitives public interface IBranch { ITopology[] Children { get; } + + byte[] Encode(); } } \ No newline at end of file From 8c105f29beadb4a213d8772f7dccfa550061e2e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 2 Jul 2025 01:13:35 +0200 Subject: [PATCH 090/165] fixed passkeys --- .../UnitTests/PasskeysUnitTests.cs | 9 ++--- .../Primitives/Passkeys/DecodedSignature.cs | 34 ++++++++++--------- .../Primitives/Passkeys/PublicKey.cs | 9 ----- 3 files changed, 21 insertions(+), 31 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs index d2d31df4..2dce7d81 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs @@ -9,6 +9,7 @@ namespace Sequence.EcosystemWallet.UnitTests { public class PasskeysUnitTests { + [TestCase("{\"x\":\"0xe4dcb71b15cfb8be619221a74bb2590c6090a63d267bbe973b84a0b65cf5f93e\",\"y\": \"0xe7c0b7bdb5e8bd0676decea02326a732ce434b10550e7109817b38f37bfa13a2\",\"requireUserVerification\":true,\"metadataHash\":\"0x00000000000000000000000000000000000000000000000000000000000057a4\",\"r\": \"0xfc5768348f7bb3939658d2fb14dfce15c58a770fbb752b27a41a9abd7448a09a\",\"s\":\"0x5099a7c5aed7c93e21c80135815a4fc475736f37ad08a89a8c6461ac973ea887\",\"authenticatorData\":\"0x00000000000000000000000000000000000000000000000000000000000015b9050000763c\",\"clientDataJson\":{\"type\":\"webauthn.get\",\"challenge\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUXI\",\"origin\":\"?Wbl5!!-_3!k0!?rMWUMKO!V!I70M-L_-?0-_LE!?!_G-J0!y-76ba_3!u0y60hO63K28?_l!!_N?QOj-0!_?2Cbb5w!!nh?7?Y1x-9m?96q?ho!M4NH3!?CmAa?z5!_-?!q-1C2?!0_O1_??cUI7?_-!!Ps?1?6FT04W_?xQ!Fd??-p?ZX4_6JG3n!?!-k-_6D-e!?l9o!tB62OK2z-_F4-!!X!J!a?!-c?wA_66lvA3-Q1_-97FBjhX3_Cu!e_\"},\"embedMetadata\":true}")] [TestCase("{\"x\":\"0x27da369dc69d1fa5a7d815e10ec765ccb6d1d1a1ac383c0a43e2befe5f2b5e1b\",\"y\":\"0x78e9505cb8dcac86878065bcaf8f199ef77f0c3afd458c6c46448af9550ed818\",\"requireUserVerification\":false,\"metadataHash\":\"0x5c59a01b79c5d8c4364f17a42a4808e005a93526c5084f0e7529ce3e6bb7131a\",\"r\":\"0x339d9b9e8ffc8f23a2a8545a8877f96bb660ec76205476a56ea9ae7a63e505dc\",\"s\":\"0x4db2e79efd31a6d7fbb424f0ebefc73903a948856197bcbeacea5233fd7c2962\",\"authenticatorData\":\"0x220ee2806d87a214f76e76e790c1a3bb55e4d83b966f9b6c576c40a38aff383501000cdd31\",\"clientDataJson\":{\"type\":\"webauthn.get\",\"challenge\":\"Pqr3Arso8Ef_SX0fQwTCJUk6VhZddkpI7qmMeQGgXAY\",\"origin\":\"-e!0-?98oYa3t?-CsHcY-!-?5VSna4l_?-fE7g63eL-?P06?0-inM?9d5D--5??lv?OJVw!Fy598ZyVV_E_6ug5v60CBOT?7_fL?_r?2_HY7cp7z_B?C82jz?__!?qT2-_925_-T__C5_U_-?8L-6D7_!7dDb2!?9JC178V!u26_H9?N7Mo_6oz!7tqK-g_!8?iJ3_??A??P4K94-8L?!-?mF!10-R6B0?8D__0T!-R-uR_9MQCD82?7-4j1s2!_g85Y4Q??W68dl?A?xAnCA8d_wF2?__k\"},\"embedMetadata\":true}")] public void EncodeSignature(string inputJson) { @@ -44,6 +45,8 @@ public void DecodeSignature(string encodedSignature) Debug.Log($"Decoded Signature: {decoded}"); } + [TestCase("{\"x\":\"0xe4dcb71b15cfb8be619221a74bb2590c6090a63d267bbe973b84a0b65cf5f93e\",\"y\":\"0xe7c0b7bdb5e8bd0676decea02326a732ce434b10550e7109817b38f37bfa13a2\",\"requireUserVerification\":true,\"metadataHash\":\"0x00000000000000000000000000000000000000000000000000000000000057a4\"}")] + [TestCase("{\"x\":\"0x27da369dc69d1fa5a7d815e10ec765ccb6d1d1a1ac383c0a43e2befe5f2b5e1b\",\"y\":\"0x78e9505cb8dcac86878065bcaf8f199ef77f0c3afd458c6c46448af9550ed818\",\"requireUserVerification\":false,\"metadataHash\":\"0x5c59a01b79c5d8c4364f17a42a4808e005a93526c5084f0e7529ce3e6bb7131a\"}")] [TestCase("{\"x\":\"0xe018db753bcfb28da9770e68723e0f1bff3eaaf702bb28f047ff497d1f4304c2\",\"y\":\"0x25493a56165d764a48eea98c7901a05c06545c59a01b79c5d8c4364f17a42a48\",\"requireUserVerification\":true,\"credentialId\":\"p-e2-GDn2?-0v!G2?v7!v43_hPDRDv_UkG?RE!rI6w_4j!_R26_7X4U!09?!r6d_ckZ-l_-!B0\"}")] public void ComputeRoot(string inputJson) { @@ -65,11 +68,5 @@ public void ComputeRoot(string inputJson) Debug.Log($"Computed Root: {result}"); } - - [TestCase("")] - public void ValidateSignature(string inputJson) - { - - } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/DecodedSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/DecodedSignature.cs index 88a14f5e..d54d4b55 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/DecodedSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/DecodedSignature.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives.Passkeys { @@ -18,9 +19,10 @@ public class DecodedSignature public byte[] Encode() { + clientDataJson = clientDataJson.Replace("\n", "").Replace(" ", ""); int challengeIndex = clientDataJson.IndexOf("\"challenge\""); int typeIndex = clientDataJson.IndexOf("\"type\""); - + int authDataSize = authenticatorData.Length; int clientDataJSONSize = clientDataJson.Length; @@ -46,33 +48,33 @@ public byte[] Encode() if (embedMetadata) flags |= (1 << 6); // 0x40 - var result = new List { flags }; + var result = new List { new [] { flags } }; if (embedMetadata) { if (!publicKey.metadata.IsValid) throw new Exception("Metadata is not present in the public key"); - result.AddRange(publicKey.metadata.Encode()); + result.Add(publicKey.metadata.Encode()); } - result.AddRange(authDataSize.ByteArrayFromNumber(bytesAuthDataSize)); - result.AddRange(authenticatorData); + result.Add(authDataSize.ByteArrayFromNumber(bytesAuthDataSize)); + result.Add(authenticatorData); var clientDataBytes = Encoding.UTF8.GetBytes(clientDataJson); - result.AddRange(clientDataBytes.Length.ByteArrayFromNumber(bytesClientDataJSONSize)); - result.AddRange(clientDataBytes); - - result.AddRange(challengeIndex.ByteArrayFromNumber(bytesChallengeIndex)); - result.AddRange(typeIndex.ByteArrayFromNumber(bytesTypeIndex)); + result.Add(clientDataBytes.Length.ByteArrayFromNumber(bytesClientDataJSONSize)); + result.Add(clientDataBytes); + + result.Add(challengeIndex.ByteArrayFromNumber(bytesChallengeIndex)); + result.Add(typeIndex.ByteArrayFromNumber(bytesTypeIndex)); - result.AddRange(r.PadLeft(32)); - result.AddRange(s.PadLeft(32)); + result.Add(r.PadLeft(32)); + result.Add(s.PadLeft(32)); - result.AddRange(publicKey.x.HexStringToByteArray()); - result.AddRange(publicKey.y.HexStringToByteArray()); + result.Add(publicKey.x.HexStringToByteArray()); + result.Add(publicKey.y.HexStringToByteArray()); - return result.ToArray(); + return ByteArrayExtensions.ConcatenateByteArrays(result.ToArray()); } public static DecodedSignature Decode(byte[] data) @@ -113,7 +115,7 @@ public static DecodedSignature Decode(byte[] data) offset += bytesClientDataJSONSize; var clientDataJSONBytes = data.SubArray(offset, clientDataJSONSize); offset += clientDataJSONSize; - string clientDataJSON = Encoding.UTF8.GetString(clientDataJSONBytes); + string clientDataJSON = Encoding.UTF8.GetString(clientDataJSONBytes).Replace("\\", ""); int challengeIndex = data.SubArray(offset, bytesChallengeIndex).ToInteger(); offset += bytesChallengeIndex; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PublicKey.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PublicKey.cs index 0d7c86e0..4452f965 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PublicKey.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PublicKey.cs @@ -26,14 +26,5 @@ public string Hash() ) ).ByteArrayToHexStringWithPrefix(); } - - private byte[][][] CombineTree(byte[] a, byte[] b, byte[] c, byte[] d) - { - return new [] - { - new [] { a, b }, - new [] { c, d } - }; - } } } \ No newline at end of file From 2fee636d6c49d932871e57c6657da958057b0ec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 2 Jul 2025 01:59:09 +0200 Subject: [PATCH 091/165] added address_calculate test --- .../IntegrationTests/AddressTests.cs | 23 +++++++++++++++++++ .../IntegrationTests/AddressTests.cs.meta | 3 +++ .../IntegrationTests/Server/Server.cs | 4 +++- .../IntegrationTests/SessionsTest.cs | 2 +- .../UnitTests/SessionsUnitTests.cs | 2 +- .../Primitives/Address/AddressFactory.cs | 7 +++++- 6 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/AddressTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/IntegrationTests/AddressTests.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/AddressTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/AddressTests.cs new file mode 100644 index 00000000..c95902f3 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/AddressTests.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public class AddressTests + { + public Task Calculate(Dictionary parameters) + { + var imageHash = (string)parameters["imageHash"]; + var factory = (string)parameters["factory"]; + var module = (string)parameters["module"]; + + var address = AddressFactory.Create(imageHash.HexStringToByteArray(), factory, module); + Debug.Log($"Sequence Address: {address}"); + + return Task.FromResult(address.Value); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/AddressTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/AddressTests.cs.meta new file mode 100644 index 00000000..132c902e --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/AddressTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fac86e419c7141ea9cffb4bc0c9d7cce +timeCreated: 1751413050 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs index 2814673d..621c8b83 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs @@ -31,7 +31,9 @@ internal class Server ["signature_encode"] = async (parameters) => await new SignatureTests().SignatureEncode(parameters), ["signature_concat"] = async (parameters) => await new SignatureTests().SignatureConcat(parameters), ["signature_decode"] = async (parameters) => await new SignatureTests().SignatureDecode(parameters), - // SESSIONS + // ADDRESS + ["address_calculate"] = async (parameters) => await new AddressTests().Calculate(parameters), + // SESSION ["session_empty"] = async (parameters) => await new SessionsTest().SessionEmpty(parameters), ["session_encodeTopology"] = async (parameters) => await new SessionsTest().SessionEncodeTopology(parameters), ["session_encodeCallSignatures"] = async (parameters) => await new SessionsTest().SessionEncodeCallSignatures(parameters), diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs index e875d92c..50ac9450 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs @@ -13,7 +13,7 @@ public class SessionsTest { public Task SessionEmpty(Dictionary parameters) { - var identitySigner = parameters["identitySigner"].ToString(); + var identitySigner = (string)parameters["identitySigner"]; var topology = SessionsUtils.CreateSessionsTopologyWithSingleIdentity(identitySigner); return Task.FromResult(topology.JsonSerialize()); diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs index 53e5444b..397a85fd 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs @@ -103,7 +103,7 @@ public void CreateSessionImageHash(string inputJson) Debug.Log($"{imageHash}"); } - [TestCase("0x96ce1c47176b2034168210c9f807835d82e7bf8ca8fb08ce54e2cf81af7ad016", "0x0000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000")] + [TestCase("0x8fee11e98795484615dcd9b86a9fbc2b62285931385baea72111101518d92dce", "0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f", "0x2e234DAe75C793f67A35089C9d99245E1C58470b", null)] public void CreateAddress(string imageHash, string factory, string module, string creationCode) { var address = AddressFactory.Create(imageHash.HexStringToByteArray(), factory, module, creationCode); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs index 29803cd1..d786f7fe 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs @@ -1,3 +1,4 @@ +using System; using Sequence.ABI; using Sequence.Utils; @@ -5,6 +6,10 @@ namespace Sequence.EcosystemWallet.Primitives { public static class AddressFactory { + private static byte[] DefaultCreationCode = + "0x6041600e3d396021805130553df33d3d36153402601f57363d3d373d363d30545af43d82803e903d91601f57fd5bf3" + .HexStringToByteArray(); + public static Address Create(Topology topology, string factory, string module, string creationCode = null) { return Create(topology.HashConfiguration(), factory, module, creationCode); @@ -19,7 +24,7 @@ public static Address Create(byte[] imageHash, string factory, string module, st imageHash, SequenceCoder.KeccakHash( ByteArrayExtensions.ConcatenateByteArrays( - creationCode.HexStringToByteArray(), + creationCode?.HexStringToByteArray() ?? DefaultCreationCode, module.HexStringToByteArray(32)) ) ) From 71978409c2fcbb856f7999a68f6a841d494fedee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 2 Jul 2025 09:54:44 +0200 Subject: [PATCH 092/165] appended primitives tdd, removed some unused namespace refs --- .../Primitives/Payload/NamedType.cs | 6 -- .../Primitives/Payload/TypedDataToSign.cs | 4 -- .../EcosystemWallet/Primitives/README.md | 70 ++++++++++++++++++- .../EcosystemWallet/Utils/Erc6492Helper.cs | 2 - 4 files changed, 67 insertions(+), 15 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs index 4a54365d..f17670d4 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs @@ -1,10 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Numerics; -using Nethereum.ABI.EIP712; -using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs index 0b37ad0b..a7054f29 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -1,16 +1,12 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Linq; -using System.Numerics; using System.Text; using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; -using UnityEngine; using UnityEngine.Scripting; using Nethereum.ABI.EIP712; -using Nethereum.Util; namespace Sequence.EcosystemWallet.Primitives { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md index 3b99615d..59c4f3a9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md @@ -2,7 +2,35 @@ The goal of this Technical Design Document (TDD) is to document the architecture for each primitive. The integration of v3 primitives in C# is fully encapsulated from Unity and aims to be an object-oriented library for -Sequence's v3 wallets. +Sequence's v3 wallets. + +## Models + +--- + +### Topology + +A tree like structure is shared between the Config, Session, and Recover primitives. We call this type a `ITopology` +which can either be represented as one of the following types: + +- `IBranch` references an array of `ITopology` as it's children. +- `INode` references a hashed or encoded leaf. Compared to a leaf, a node does not need to be hashed separately. +- `ILeaf` represents the end of a branch and the type in the topology holding state information - such as signer addresses, configuration values or signatures. + +Furthermore, the interface forces implementing classes to convert itself as one of the following types, defining +functions such as `ToJsonObject`, `Encode`, and `EncodeForHash` + +- **Bytes:** Encode each topology, node, branch and leaf to a byte array. +Each encoded leaf and branch starts with one byte in the beginning as a 'flag' defining the type of leaf. +This is required for when we want to decode the encoded data back into it's original topology. +Implementing topologies have their own decoding function to decode themself from a json string or byte array. +Bytes are represented as hexadecimal strings for API calls. +- **Hash:** Leafs and branches have a separate encoding function for hashing purposes called `EncodeForHash`. +Encoding a topology for hashing purposes does not require a decode-able flag at the beginning, resulting in a different hash. +- **Json:** A topology must parse itself to a json-readable string. This is used with the integration tests when decoding a encoded topology. +TODO: Refactor primitives to have their own JsonConvertors. + +We will cover the different integrations of `ITopology` in the the next section. ## Primitives @@ -20,14 +48,50 @@ TBD TBD +### Recovery + +TBD + +### Passkeys + +TBD + +### Address + ## Testing Infrastructure --- ### Integration Tests -TBD +v3 Primitives can be tested using `forge` and the smart contract tests from the `0xsequence/wallet-contracts-v3` repository. +A guide on how to run integrations tests and verify the primitives [can be found here in the sequence-unity repository.](https://github.com/0xsequence/sequence-unity/blob/Feature/primitives-config/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md) +Tests include the following, and several more: + +Integration tests are executed through API calls coming from the forge tests. +A test call is defined with a `method` key a json object called `parameters` + +- **payload_toPacked:** Decode a parented payload and encode its payload value. +- **config_imageHash:** Parse a config from a json object and return the image hash for it. +- **session_encodeTopology:** Parse a session topology from a json object and return its encoded hex string. +- ... ### Unit Tests -TBD \ No newline at end of file +Next to integration tests, we integrate a test for each primitive use case, such as encoding- or decoding configs, +using Unity's test framework. You run unit tests in the Unity project of the `0xsequence/sequence-unity` repository. +Then, open the `TestRunner` and search for `Ecosystem Wallet > UnitTests` Tests include the following, and several more: + +- **Session Encoding:** Create a new session topology with a single identity signer and compare the encoded result. +- **Add Explicit Session:** Parse a session topology from a json string and add one explicit session leaf. +- **Trim Recovery Leaves:** Removes a signer address from a given recovery topology. +- ... + +## Dependencies + +--- + +- Newtonsoft.Json +- Nethereum.ABI +- Nethereum.Hex +- Nethereum.Web3 diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs index e05537ce..c47f3001 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; using System.Threading.Tasks; using Nethereum.ABI; using Nethereum.ABI.FunctionEncoding; @@ -8,7 +7,6 @@ using Nethereum.Web3; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Utils { From 5a30b413bd4e4f520f74dac30a51e15f57b5ab33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 2 Jul 2025 12:52:27 +0200 Subject: [PATCH 093/165] remove comment --- .../EcosystemWallet/Primitives/Address/AddressFactory.cs | 1 - .../EcosystemWallet/Primitives/Payload/SolidityDecoded.cs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs index d786f7fe..ca9a6409 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs @@ -1,4 +1,3 @@ -using System; using Sequence.ABI; using Sequence.Utils; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs index 8f99af31..c4873b24 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs @@ -37,7 +37,7 @@ public SolidityDecoded(Kind kind, bool noChainId, Call[] calls, BigInteger space public static SolidityDecoded FromSolidityEncoding(string solidityEncodedPayload) { - solidityEncodedPayload = solidityEncodedPayload.Replace("0x", "").Substring(64); // Drop the first 32 bytes; for some reason we include an offset of 32 bytes in all of the encodings - todo ask Agustin why + solidityEncodedPayload = solidityEncodedPayload.Replace("0x", "").Substring(64); object[] decoded = ABI.ABI.Decode(solidityEncodedPayload, DecodedAbi); return new SolidityDecoded( kind : ToKind((BigInteger)decoded[0]), From bf5ebf458a3e776eaece9476be5e65347ae61020 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 8 Jul 2025 14:59:44 +0200 Subject: [PATCH 094/165] started adding auth flow and SequenceEcosystemWalletLogin.cs --- .../EcosystemWallet/Authentication.meta | 3 + .../SequenceEcosystemWalletLogin.cs | 97 +++++++++++++++++++ .../SequenceEcosystemWalletLogin.cs.meta | 3 + .../Primitives/Permission/ParameterRule.cs | 4 + 4 files changed, 107 insertions(+) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication.meta new file mode 100644 index 00000000..78d8bd32 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: eb5d45761c10474e8a67346ec9895024 +timeCreated: 1751977897 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs new file mode 100644 index 00000000..d9b45d87 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs @@ -0,0 +1,97 @@ +using System; +using System.Numerics; +using Nethereum.Util; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Authentication +{ + public class SequenceEcosystemWalletLogin + { + private Chain _chain; + private string _redirectUrl; + private string _emitterAddress; + + public SequenceEcosystemWalletLogin(Chain chain) + { + _chain = chain; + _redirectUrl = ""; + _emitterAddress = "0xb7bE532959236170064cf099e1a3395aEf228F44"; + } + + public void SignInWithEmail(string email) + { + CreateNewSession(GetOpenPermissions(),"email", email); + } + + /// + /// Create an implicit- or explicit session based on a given set of permissions. + /// + /// Leave it null to create an implicit session. Otherwise, we create an explicit session. + /// + /// + private void CreateNewSession(SessionPermissions permissions, string preferredLoginMethod, string email) + { + // Create new local signer and private key + } + + private SessionPermissions GetOpenPermissions() + { + return new SessionPermissions + { + valueLimit = new BigInteger(0), + deadline = new BigInteger(DateTime.UtcNow.Second + 1000 * 60 * 5000), + permissions = new [] + { + new Permission + { + target = new Address(_emitterAddress), + rules = Array.Empty() + } + } + }; + } + + private SessionPermissions GetRestrictivePermissions() + { + return new SessionPermissions + { + valueLimit = new BigInteger(0), + deadline = new BigInteger(DateTime.UtcNow.Second + 1000 * 60 * 5000), + permissions = new [] + { + new Permission + { + target = new Address(_emitterAddress), + rules = new [] + { + new ParameterRule + { + cumulative = false, + operation = ParameterOperation.equal, + value = HashFunctionSelector("explicitEmit()").HexStringToByteArray(32), + offset = new BigInteger(0), + mask = ParameterRule.SelectorMask + }, + new ParameterRule + { + cumulative = true, + operation = ParameterOperation.greaterThanOrEqual, + value = "0x1234567890123456789012345678901234567890".HexStringToByteArray(32), + offset = new BigInteger(4), + mask = ParameterRule.Uint256Mask + } + } + } + } + }; + } + + private string HashFunctionSelector(string function) + { + var sha3 = new Sha3Keccack(); + var hash = sha3.CalculateHash(function); + return "0x" + hash.Substring(0, 8); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs.meta new file mode 100644 index 00000000..a96430af --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 498ded28e21949bdba183645018dfd5a +timeCreated: 1751977945 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs index b38ae46e..6b6b1542 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Numerics; using Sequence.Utils; using Unity.Plastic.Newtonsoft.Json; @@ -10,6 +11,9 @@ namespace Sequence.EcosystemWallet.Primitives [Serializable] public class ParameterRule { + public static readonly byte[] SelectorMask = "0xffffffff".HexStringToByteArray(32); + public static readonly byte[] Uint256Mask = Enumerable.Repeat((byte)0xff, 32).ToArray().PadLeft(32); + public bool cumulative; public ParameterOperation operation; public byte[] value; From 4eb90fe668fe1d38557e947e6fad8e423805924b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 9 Jul 2025 23:10:40 +0200 Subject: [PATCH 095/165] added basic auth flow with redirectUrl from the editor --- .../UnitTests/AuthenticationTests.cs | 16 +++ .../UnitTests/AuthenticationTests.cs.meta | 3 + .../Boilerplates/Login/SequenceLoginWindow.cs | 10 ++ .../SequenceFrontend/SequenceExamples.asmdef | 3 +- .../Authentication/AuthPayload.cs | 14 +++ .../Authentication/AuthPayload.cs.meta | 3 + .../Authentication/AuthResponse.cs | 9 ++ .../Authentication/AuthResponse.cs.meta | 3 + .../Authentication/EditorServer.cs | 111 ++++++++++++++++++ .../Authentication/EditorServer.cs.meta | 3 + .../SequenceEcosystemWalletLogin.cs | 60 +++++++++- .../Permission/SessionPermissions.cs | 6 +- 12 files changed, 232 insertions(+), 9 deletions(-) create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs new file mode 100644 index 00000000..681fba79 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs @@ -0,0 +1,16 @@ +using NUnit.Framework; +using Sequence.EcosystemWallet.Authentication; + +namespace Sequence.EcosystemWallet.UnitTests +{ + public class AuthenticationTests + { + private readonly SequenceEcosystemWalletLogin _login = new(Chain.TestnetArbitrumSepolia); + + [TestCase("agru@horizon.io")] + public void SignInWithEmailTest(string email) + { + _login.SignInWithEmail(email); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs.meta new file mode 100644 index 00000000..ba5e8c2a --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4ca14ee5c535484890091874aa50ec66 +timeCreated: 1752092641 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Login/SequenceLoginWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Login/SequenceLoginWindow.cs index 040431a1..edd5ac0d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Login/SequenceLoginWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Login/SequenceLoginWindow.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using Sequence.Authentication; +using Sequence.EcosystemWallet.Authentication; using Sequence.EmbeddedWallet; using TMPro; using UnityEngine; @@ -99,7 +100,12 @@ public void Show(IWallet wallet = null, Action onClose = null) public void LoginWithEmail() { + var login = new SequenceEcosystemWalletLogin(Chain.TestnetArbitrumSepolia); + login.SignInWithEmail("agru@horizo.io"); SetLoading(true); + + return; + _loginHandler.Login(_curEmail); } @@ -123,6 +129,10 @@ public void LoginWithApple() public void LoginAsGuest() { + var login = new SequenceEcosystemWalletLogin(Chain.TestnetArbitrumSepolia); + login.SignInWithEmail("agru@horizo.io"); + SetLoading(true); + return; SetLoading(true); _loginHandler.GuestLogin(); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceExamples.asmdef b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceExamples.asmdef index 93b551c4..6d0b55ad 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceExamples.asmdef +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceExamples.asmdef @@ -10,7 +10,8 @@ "GUID:b4f9c0f8f363f439b9e337f79050f189", "GUID:403077141e1554429a890cbc129df651", "GUID:a67bc3d548bec4971b914c7b64c9e959", - "GUID:19b9eb7db56cc47349571a4fbb0dd677" + "GUID:19b9eb7db56cc47349571a4fbb0dd677", + "GUID:8cb4ab25ee18e4b4da9647cf481addbb" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs new file mode 100644 index 00000000..2cd31dae --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs @@ -0,0 +1,14 @@ +using Sequence.EcosystemWallet.Primitives; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Authentication +{ + [Preserve] + public class AuthPayload + { + public Address sessionAddress; + public object permissions; + public string preferredLoginMethod; + public string email; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs.meta new file mode 100644 index 00000000..3d094568 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 65148229043b47bbb057aa90359b6eeb +timeCreated: 1752089536 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs new file mode 100644 index 00000000..a06fcc55 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs @@ -0,0 +1,9 @@ +namespace Sequence.EcosystemWallet.Authentication +{ + public class AuthResponse + { + public Address walletAddress; + public string email; + public string loginMethod; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs.meta new file mode 100644 index 00000000..b23e8e40 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 027bd659e06e402c982faf5c21fd8226 +timeCreated: 1752095000 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs new file mode 100644 index 00000000..70c81021 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using UnityEngine; +using System.Net; +using System.Text; +using Newtonsoft.Json; + +namespace Sequence.EcosystemWallet.Authentication +{ + public class EditorServer + { + private HttpListener _listener; + + public async Task HandleHttpRequest(HttpListenerContext context) + { + Debug.Log($"{context.Request.HttpMethod} {context.Request.RawUrl}"); + + var urlParams = GetUrlParams(context.Request.RawUrl); + var id = urlParams["id"]; + var encodedPayload = urlParams["payload"]; + var payloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(encodedPayload)); + var payload = JsonConvert.DeserializeObject(payloadJson); + + Debug.Log($"Done: {payload.walletAddress}, {payload.email}, {payload.loginMethod}"); + } + + public void StopListening() + { + _listener.Stop(); + } + + public void StartServer(string host, int port) + { + try + { + _listener = new HttpListener(); + _listener.Prefixes.Add($"http://{host}:{port}/"); + _listener.Start(); + + Task.Run(async () => + { + try + { + while (_listener.IsListening) + { + var context = await _listener.GetContextAsync(); + + _ = Task.Run(async () => + { + try + { + await HandleHttpRequest(context); + } + catch (Exception ex) + { + Debug.LogError($"[{DateTime.UtcNow:O}] Error handling request: {ex.Message}"); + + try + { + HttpListenerResponse response = context.Response; + response.StatusCode = 500; + + string responseJson = "Internal server error"; + byte[] buffer = Encoding.UTF8.GetBytes(responseJson); + response.ContentLength64 = buffer.Length; + await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + response.Close(); + } + catch + { + // Ignore errors when trying to respond with an error + } + } + }); + } + } + catch (Exception ex) + { + Debug.LogError($"[{DateTime.UtcNow:O}] Server listener error: {ex.Message}"); + } + }); + } + catch (Exception ex) + { + Debug.LogError($"[{DateTime.UtcNow:O}] Failed to start server: {ex.Message}"); + } + } + + private Dictionary GetUrlParams(string url) + { + var uri = new Uri("http://localhost" + url); + var query = uri.Query.TrimStart('?'); + var pairs = query.Split('&', StringSplitOptions.RemoveEmptyEntries); + + var dict = new Dictionary(); + foreach (var pair in pairs) + { + var kv = pair.Split('=', 2); + if (kv.Length == 2) + { + var key = Uri.UnescapeDataString(kv[0]); + var value = Uri.UnescapeDataString(kv[1]); + dict[key] = value; + } + } + + return dict; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs.meta new file mode 100644 index 00000000..3161b197 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: becb32bc12144e14bbe66f24ec4fa142 +timeCreated: 1752091460 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs index d9b45d87..588512b5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs @@ -1,21 +1,31 @@ using System; +using System.Net.Http; using System.Numerics; +using System.Text; +using System.Web; using Nethereum.Util; +using Newtonsoft.Json; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; +using Sequence.Wallet; +using UnityEngine; namespace Sequence.EcosystemWallet.Authentication { public class SequenceEcosystemWalletLogin { private Chain _chain; + private string _walletUrl; private string _redirectUrl; + private string _redirectId; private string _emitterAddress; + private EOAWallet _sessionWallet; public SequenceEcosystemWalletLogin(Chain chain) { _chain = chain; - _redirectUrl = ""; + _walletUrl = "https://v3.sequence-dev.app"; + _redirectUrl = "http://localhost:8080"; _emitterAddress = "0xb7bE532959236170064cf099e1a3395aEf228F44"; } @@ -32,20 +42,56 @@ public void SignInWithEmail(string email) /// private void CreateNewSession(SessionPermissions permissions, string preferredLoginMethod, string email) { - // Create new local signer and private key + Debug.Log($"{JsonConvert.SerializeObject(new {test = BigInteger.Parse("123455551234555512345555123455551234555512345555")})}"); + + _sessionWallet = new EOAWallet(); + var payload = new AuthPayload + { + sessionAddress = _sessionWallet.GetAddress(), + permissions = permissions.ToJson(), + preferredLoginMethod = preferredLoginMethod, + email = email, + }; + + var url = ConstructWalletUrl("addExplicitSession", payload, "/request/connect"); + + var editorServer = new EditorServer(); + editorServer.StartServer("localhost", 8080); + + Application.OpenURL(url); + } + + private string ConstructWalletUrl(string action, AuthPayload payload, string path) + { + _redirectId = $"sequence:{Guid.NewGuid().ToString()}"; + var encodedPayload = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload))); + + var uriBuilder = new UriBuilder($"{_walletUrl}{path}"); + var query = HttpUtility.ParseQueryString(uriBuilder.Query); + + query["action"] = action; + query["payload"] = encodedPayload; + query["id"] = _redirectId; + query["redirectUrl"] = _redirectUrl; + query["mode"] = "redirect"; + + uriBuilder.Query = query.ToString(); + return uriBuilder.ToString(); } private SessionPermissions GetOpenPermissions() { return new SessionPermissions { + chainId = new BigInteger((int)_chain), + signer = new Address(_emitterAddress), valueLimit = new BigInteger(0), - deadline = new BigInteger(DateTime.UtcNow.Second + 1000 * 60 * 5000), + deadline = new BigInteger(DateTime.UtcNow.ToUnixTimestamp() * 1000 + 1000 * 60 * 5000), permissions = new [] { new Permission { - target = new Address(_emitterAddress), + target = new Address("0x8F6066bA491b019bAc33407255f3bc5cC684A5a4"), rules = Array.Empty() } } @@ -56,13 +102,15 @@ private SessionPermissions GetRestrictivePermissions() { return new SessionPermissions { + chainId = new BigInteger((int)_chain), + signer = new Address(_emitterAddress), valueLimit = new BigInteger(0), - deadline = new BigInteger(DateTime.UtcNow.Second + 1000 * 60 * 5000), + deadline = new BigInteger(DateTime.UtcNow.ToUnixTimestamp() * 1000 + 1000 * 60 * 5000), permissions = new [] { new Permission { - target = new Address(_emitterAddress), + target = new Address("0x8F6066bA491b019bAc33407255f3bc5cC684A5a4"), rules = new [] { new ParameterRule diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs index 61cf1ca9..aa3b09fe 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs @@ -11,6 +11,7 @@ namespace Sequence.EcosystemWallet.Primitives [Serializable] public class SessionPermissions { + public BigInteger chainId; public Address signer; public BigInteger valueLimit; public BigInteger deadline; @@ -21,9 +22,10 @@ public object ToJson() return new { type = SessionLeaf.SessionPermissionsType, + chainId = chainId, signer = signer.Value, - valueLimit = valueLimit.ToString(), - deadline = deadline.ToString(), + valueLimit = valueLimit, + deadline = deadline, permissions = permissions.Select(permission => permission.ToJson()).ToArray() }; } From 60aa5fe4815dabd89dd102db13b26e751dab7189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 10 Jul 2025 14:48:15 +0200 Subject: [PATCH 096/165] working v3 auth flow and recovering session from secure storage --- .../UnitTests/AuthenticationTests.cs | 46 +++++- .../Boilerplates/Login/SequenceLoginWindow.cs | 9 -- .../Authentication/AuthPayload.cs | 1 + .../Authentication/AuthResponse.cs | 4 + .../Authentication/EditorServer.cs | 93 ++----------- .../Authentication/SequenceEcosystemWallet.cs | 25 ++++ .../SequenceEcosystemWallet.cs.meta | 3 + .../SequenceEcosystemWalletLogin.cs | 131 +++++++++++++++--- .../Authentication/Storage.meta | 3 + .../Authentication/Storage/SessionData.cs | 90 ++++++++++++ .../Storage/SessionData.cs.meta | 3 + .../Authentication/Storage/SessionStorage.cs | 54 ++++++++ .../Storage/SessionStorage.cs.meta | 3 + .../Primitives/Attestation/Attestation.cs | 72 +--------- .../Primitives/Attestation/AuthData.cs | 7 +- .../EcosystemWallet/Primitives/Common.meta | 3 + .../Primitives/Common/BigInt.cs | 56 ++++++++ .../Primitives/Common/BigInt.cs.meta | 3 + .../Primitives/Common/Bytes.cs | 53 +++++++ .../Primitives/Common/Bytes.cs.meta | 3 + .../Primitives/Permission/ParameterRule.cs | 14 +- .../Permission/SessionPermissions.cs | 2 - .../Sessions/SessionCallSignature.cs | 2 +- .../Primitives/Signature/RSY.cs | 16 ++- .../SequenceSDK/Ethereum/Wallet/EOAWallet.cs | 7 + .../Sequence/SequenceSDK/Utils/ArrayUtils.cs | 11 ++ 26 files changed, 522 insertions(+), 192 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/BigInt.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/BigInt.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs index 681fba79..8e21d85a 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs @@ -1,3 +1,5 @@ +using System; +using System.Threading.Tasks; using NUnit.Framework; using Sequence.EcosystemWallet.Authentication; @@ -7,10 +9,48 @@ public class AuthenticationTests { private readonly SequenceEcosystemWalletLogin _login = new(Chain.TestnetArbitrumSepolia); - [TestCase("agru@horizon.io")] - public void SignInWithEmailTest(string email) + [TestCase("agru@horizon.io", "implicit")] + [TestCase("agru@horizon.io", "explicit_open")] + [TestCase("agru@horizon.io", "explicit_restrictive")] + public async Task SignInWithEmailTest(string email, string sessionType) { - _login.SignInWithEmail(email); + var wallet = await _login.SignInWithEmail(email, ConvertToSessionType(sessionType)); + CheckStoredWallet(wallet); + } + + [TestCase("implicit")] + [TestCase("explicit_open")] + [TestCase("explicit_restrictive")] + public async Task SignInWithGoogleTest(string sessionType) + { + var wallet = await _login.SignInWithGoogle(ConvertToSessionType(sessionType)); + CheckStoredWallet(wallet); + } + + [TestCase("implicit")] + [TestCase("explicit_open")] + [TestCase("explicit_restrictive")] + public async Task SignInWithAppleTest(string sessionType) + { + var wallet = await _login.SignInWithApple(ConvertToSessionType(sessionType)); + CheckStoredWallet(wallet); + } + + private void CheckStoredWallet(SequenceEcosystemWallet wallet) + { + var storedWallet = _login.RecoverSessionFromStorage(); + Assert.AreEqual(storedWallet.Address, wallet.Address); + } + + private SequenceEcosystemWalletLogin.SessionType ConvertToSessionType(string sessionType) + { + return sessionType switch + { + "implicit" => SequenceEcosystemWalletLogin.SessionType.Implicit, + "explicit_open" => SequenceEcosystemWalletLogin.SessionType.ExplicitOpen, + "explicit_restrictive" => SequenceEcosystemWalletLogin.SessionType.ExplicitRestrictive, + _ => throw new Exception("Invalid session type"), + }; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Login/SequenceLoginWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Login/SequenceLoginWindow.cs index edd5ac0d..428c422b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Login/SequenceLoginWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Login/SequenceLoginWindow.cs @@ -100,12 +100,7 @@ public void Show(IWallet wallet = null, Action onClose = null) public void LoginWithEmail() { - var login = new SequenceEcosystemWalletLogin(Chain.TestnetArbitrumSepolia); - login.SignInWithEmail("agru@horizo.io"); SetLoading(true); - - return; - _loginHandler.Login(_curEmail); } @@ -129,10 +124,6 @@ public void LoginWithApple() public void LoginAsGuest() { - var login = new SequenceEcosystemWalletLogin(Chain.TestnetArbitrumSepolia); - login.SignInWithEmail("agru@horizo.io"); - SetLoading(true); - return; SetLoading(true); _loginHandler.GuestLogin(); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs index 2cd31dae..4e86f9d7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs @@ -8,6 +8,7 @@ public class AuthPayload { public Address sessionAddress; public object permissions; + public string implicitSessionRedirectUrl; public string preferredLoginMethod; public string email; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs index a06fcc55..9ce058e7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs @@ -1,3 +1,5 @@ +using Sequence.EcosystemWallet.Primitives; + namespace Sequence.EcosystemWallet.Authentication { public class AuthResponse @@ -5,5 +7,7 @@ public class AuthResponse public Address walletAddress; public string email; public string loginMethod; + public Attestation attestation; + public RSY signature; } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs index 70c81021..6b4bd791 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs @@ -1,10 +1,8 @@ using System; -using System.Collections.Generic; +using System.Collections.Specialized; using System.Threading.Tasks; using UnityEngine; using System.Net; -using System.Text; -using Newtonsoft.Json; namespace Sequence.EcosystemWallet.Authentication { @@ -12,25 +10,13 @@ public class EditorServer { private HttpListener _listener; - public async Task HandleHttpRequest(HttpListenerContext context) - { - Debug.Log($"{context.Request.HttpMethod} {context.Request.RawUrl}"); - - var urlParams = GetUrlParams(context.Request.RawUrl); - var id = urlParams["id"]; - var encodedPayload = urlParams["payload"]; - var payloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(encodedPayload)); - var payload = JsonConvert.DeserializeObject(payloadJson); - - Debug.Log($"Done: {payload.walletAddress}, {payload.email}, {payload.loginMethod}"); - } - public void StopListening() { _listener.Stop(); + Debug.Log($"Stopped listening"); } - public void StartServer(string host, int port) + public async Task<(bool Result, NameValueCollection QueryString)> WaitForResponse(string host, int port) { try { @@ -38,74 +24,19 @@ public void StartServer(string host, int port) _listener.Prefixes.Add($"http://{host}:{port}/"); _listener.Start(); - Task.Run(async () => - { - try - { - while (_listener.IsListening) - { - var context = await _listener.GetContextAsync(); - - _ = Task.Run(async () => - { - try - { - await HandleHttpRequest(context); - } - catch (Exception ex) - { - Debug.LogError($"[{DateTime.UtcNow:O}] Error handling request: {ex.Message}"); - - try - { - HttpListenerResponse response = context.Response; - response.StatusCode = 500; - - string responseJson = "Internal server error"; - byte[] buffer = Encoding.UTF8.GetBytes(responseJson); - response.ContentLength64 = buffer.Length; - await response.OutputStream.WriteAsync(buffer, 0, buffer.Length); - response.Close(); - } - catch - { - // Ignore errors when trying to respond with an error - } - } - }); - } - } - catch (Exception ex) - { - Debug.LogError($"[{DateTime.UtcNow:O}] Server listener error: {ex.Message}"); - } - }); - } - catch (Exception ex) - { - Debug.LogError($"[{DateTime.UtcNow:O}] Failed to start server: {ex.Message}"); - } - } + var context = await _listener.GetContextAsync(); + StopListening(); - private Dictionary GetUrlParams(string url) - { - var uri = new Uri("http://localhost" + url); - var query = uri.Query.TrimStart('?'); - var pairs = query.Split('&', StringSplitOptions.RemoveEmptyEntries); + foreach (var key in context.Request.QueryString.AllKeys) + Debug.Log($"Key: {key}, Value: {context.Request.QueryString[key]}"); - var dict = new Dictionary(); - foreach (var pair in pairs) + return (true, context.Request.QueryString); + } + catch (Exception ex) { - var kv = pair.Split('=', 2); - if (kv.Length == 2) - { - var key = Uri.UnescapeDataString(kv[0]); - var value = Uri.UnescapeDataString(kv[1]); - dict[key] = value; - } + Debug.LogException(ex); + return (false, null); } - - return dict; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs new file mode 100644 index 00000000..1ab3df9a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs @@ -0,0 +1,25 @@ +using System; +using System.Threading.Tasks; + +namespace Sequence.EcosystemWallet.Authentication +{ + public class SequenceEcosystemWallet + { + public Address Address { get; } + + public SequenceEcosystemWallet(Address address) + { + Address = address; + } + + public async Task SignMessage(string message) + { + throw new NotImplementedException(); + } + + public async Task SendTransaction() + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs.meta new file mode 100644 index 00000000..74e8c4e1 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1e3ffd8b939b40a49783eed6e8c8c72a +timeCreated: 1752149840 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs index 588512b5..058f8c89 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs @@ -1,7 +1,9 @@ using System; -using System.Net.Http; +using System.Collections.Generic; +using System.Linq; using System.Numerics; using System.Text; +using System.Threading.Tasks; using System.Web; using Nethereum.Util; using Newtonsoft.Json; @@ -14,12 +16,20 @@ namespace Sequence.EcosystemWallet.Authentication { public class SequenceEcosystemWalletLogin { + public enum SessionType + { + Implicit, + ExplicitOpen, + ExplicitRestrictive + } + private Chain _chain; private string _walletUrl; private string _redirectUrl; private string _redirectId; private string _emitterAddress; private EOAWallet _sessionWallet; + private SessionStorage _sessionStorage; public SequenceEcosystemWalletLogin(Chain chain) { @@ -27,11 +37,33 @@ public SequenceEcosystemWalletLogin(Chain chain) _walletUrl = "https://v3.sequence-dev.app"; _redirectUrl = "http://localhost:8080"; _emitterAddress = "0xb7bE532959236170064cf099e1a3395aEf228F44"; + _sessionStorage = new SessionStorage(); + } + + public async Task SignInWithEmail(string email, SessionType sessionType) + { + return await CreateNewSession(GetPermissionsFromSessionType(sessionType),"email", email); } - public void SignInWithEmail(string email) + public async Task SignInWithGoogle(SessionType sessionType) { - CreateNewSession(GetOpenPermissions(),"email", email); + return await CreateNewSession(GetPermissionsFromSessionType(sessionType),"google"); + } + + public async Task SignInWithApple(SessionType sessionType) + { + return await CreateNewSession(GetPermissionsFromSessionType(sessionType),"apple"); + } + + public SequenceEcosystemWallet RecoverSessionFromStorage() + { + var walletAddress = _sessionStorage.GetWalletAddress(); + var sessions = _sessionStorage.GetSessions(); + + if (string.IsNullOrEmpty(walletAddress) || sessions.Length == 0) + throw new Exception("No session found in storage."); + + return new SequenceEcosystemWallet(new Address(walletAddress)); } /// @@ -40,28 +72,76 @@ public void SignInWithEmail(string email) /// Leave it null to create an implicit session. Otherwise, we create an explicit session. /// /// - private void CreateNewSession(SessionPermissions permissions, string preferredLoginMethod, string email) + private async Task CreateNewSession(SessionPermissions permissions, string preferredLoginMethod, string email = null) { - Debug.Log($"{JsonConvert.SerializeObject(new {test = BigInteger.Parse("123455551234555512345555123455551234555512345555")})}"); - _sessionWallet = new EOAWallet(); - var payload = new AuthPayload + + var isImplicitSession = permissions == null; + var payload = new Dictionary(); + payload.Add("sessionAddress", _sessionWallet.GetAddress()); + payload.Add("preferredLoginMethod", preferredLoginMethod); + payload.Add("email", email); + + if (isImplicitSession) + payload.Add("implicitSessionRedirectUrl", _redirectUrl); + + if (!isImplicitSession) + payload.Add("permissions", permissions.ToJson()); + + var action = isImplicitSession ? "addImplicitSession" : "addExplicitSession"; + var url = ConstructWalletUrl(action, payload, "/request/connect"); + + Application.OpenURL(url); + + var editorServer = new EditorServer(); + var response = await editorServer.WaitForResponse("localhost", 8080); + if (!response.Result) { - sessionAddress = _sessionWallet.GetAddress(), - permissions = permissions.ToJson(), - preferredLoginMethod = preferredLoginMethod, - email = email, - }; + throw new Exception("Error during request"); + } + + var id = response.QueryString["id"]; + if (id != _redirectId) + { + throw new Exception("Incorrect request id"); + } - var url = ConstructWalletUrl("addExplicitSession", payload, "/request/connect"); + if (!response.QueryString.AllKeys.Contains("payload")) + { + var errorJson = Encoding.UTF8.GetString(Convert.FromBase64String(response.QueryString["error"])); + var error = JsonConvert.DeserializeObject>(errorJson)["error"]; + + Debug.LogError($"Error from wallet app: {error}"); + throw new Exception(error); + } - var editorServer = new EditorServer(); - editorServer.StartServer("localhost", 8080); + var encodedResponsePayload = response.QueryString["payload"]; + var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(encodedResponsePayload)); + var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); - Application.OpenURL(url); - } + Debug.Log($"Done: {responsePayload.walletAddress}, {responsePayload.email}, {responsePayload.loginMethod}"); + + if (responsePayload.attestation != null) + Debug.Log($"Attestation approvedSigner: {responsePayload.attestation.approvedSigner}"); + + if (responsePayload.signature != null) + Debug.Log($"Signature: {responsePayload.signature}"); - private string ConstructWalletUrl(string action, AuthPayload payload, string path) + var walletAddress = responsePayload.walletAddress; + _sessionStorage.StoreWalletAddress(walletAddress); + _sessionStorage.AddSession(new SessionData( + _sessionWallet.GetPrivateKeyAsHex(), + walletAddress, + responsePayload.attestation, + responsePayload.signature, + ChainDictionaries.ChainIdOf[_chain], + responsePayload.loginMethod, + responsePayload.email)); + + return new SequenceEcosystemWallet(walletAddress); + } + + private string ConstructWalletUrl(string action, Dictionary payload, string path) { _redirectId = $"sequence:{Guid.NewGuid().ToString()}"; var encodedPayload = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload))); @@ -79,6 +159,17 @@ private string ConstructWalletUrl(string action, AuthPayload payload, string pat return uriBuilder.ToString(); } + private SessionPermissions GetPermissionsFromSessionType(SessionType sessionType) + { + return sessionType switch + { + SessionType.Implicit => null, + SessionType.ExplicitOpen => GetOpenPermissions(), + SessionType.ExplicitRestrictive => GetRestrictivePermissions(), + _ => throw new Exception("Unsupported session type") + }; + } + private SessionPermissions GetOpenPermissions() { return new SessionPermissions @@ -117,7 +208,7 @@ private SessionPermissions GetRestrictivePermissions() { cumulative = false, operation = ParameterOperation.equal, - value = HashFunctionSelector("explicitEmit()").HexStringToByteArray(32), + value = HashFunctionSelector("explicitEmit()").HexStringToByteArray().PadRight(32), offset = new BigInteger(0), mask = ParameterRule.SelectorMask }, @@ -125,7 +216,7 @@ private SessionPermissions GetRestrictivePermissions() { cumulative = true, operation = ParameterOperation.greaterThanOrEqual, - value = "0x1234567890123456789012345678901234567890".HexStringToByteArray(32), + value = "0x1234567890123456789012345678901234567890".HexStringToByteArray().PadRight(32), offset = new BigInteger(4), mask = ParameterRule.Uint256Mask } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage.meta new file mode 100644 index 00000000..5124fda4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a50c470a6e4e43f592db2abdf9776e4c +timeCreated: 1752150088 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs new file mode 100644 index 00000000..af32d7c1 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs @@ -0,0 +1,90 @@ +using System; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.Authentication +{ + [JsonConverter(typeof(SessionDataConverter))] + internal class SessionData + { + public string privateKey; + public Address address; + public Attestation attestation; + public RSY signature; + public string chainId; + public string loginMethod; + public string email; + + public SessionData(string privateKey, Address address, Attestation attestation, RSY signature, + string chainId, string loginMethod, string email) + { + this.privateKey = privateKey; + this.address = address; + this.attestation = attestation; + this.signature = signature; + this.chainId = chainId; + this.loginMethod = loginMethod; + this.email = email; + } + } + + internal class SessionDataConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, SessionData value, JsonSerializer serializer) + { + writer.WriteStartObject(); + + writer.WritePropertyName("privateKey"); + writer.WriteValue(value.privateKey); + + writer.WritePropertyName("address"); + serializer.Serialize(writer, value.address); + + writer.WritePropertyName("chainId"); + writer.WriteValue(value.chainId.ToString()); + + if (value.attestation != null) + { + writer.WritePropertyName("attestation"); + serializer.Serialize(writer, value.attestation); + } + + if (value.signature != null) + { + writer.WritePropertyName("signature"); + serializer.Serialize(writer, value.signature); + } + + if (value.loginMethod != null) + { + writer.WritePropertyName("loginMethod"); + serializer.Serialize(writer, value.loginMethod); + } + + if (value.email != null) + { + writer.WritePropertyName("email"); + serializer.Serialize(writer, value.email); + } + + writer.WriteEndObject(); + } + + public override SessionData ReadJson(JsonReader reader, Type objectType, SessionData existingValue, bool hasExistingValue, JsonSerializer serializer) + { + JObject obj = JObject.Load(reader); + + string privateKey = obj["privateKey"]?.ToString(); + var address = obj["address"]?.ToObject
(serializer); + var attestation = obj["attestation"]?.ToObject(serializer); + var signature = obj["signature"]?.ToObject(serializer); + + string chainId = obj["chainId"]?.ToString(); + string loginMethod = obj["loginMethod"]?.ToString(); + string email = obj["email"]?.ToString(); + + return new SessionData(privateKey, address, attestation, signature, chainId, loginMethod, email); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs.meta new file mode 100644 index 00000000..7b7f3ca6 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9a83642dac3a4c7c8086abcb12bc4b1f +timeCreated: 1752150113 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs new file mode 100644 index 00000000..7fb125c2 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs @@ -0,0 +1,54 @@ +using System; +using System.Linq; +using Newtonsoft.Json; +using Sequence.Utils; +using Sequence.Utils.SecureStorage; +using UnityEngine; + +namespace Sequence.EcosystemWallet.Authentication +{ + internal class SessionStorage + { + private static readonly string WalletAddressKey = $"sequence-wallet-address-{Application.companyName}-{Application.productName}"; + private static readonly string SessionsKey = $"sequence-sessions-{Application.companyName}-{Application.productName}"; + + private readonly ISecureStorage _storage = SecureStorageFactory.CreateSecureStorage(); + + public void Clear() + { + _storage.StoreString(WalletAddressKey, string.Empty); + _storage.StoreString(SessionsKey, string.Empty); + } + + public void StoreWalletAddress(string walletAddress) + { + _storage.StoreString(WalletAddressKey, walletAddress); + } + + public string GetWalletAddress() + { + return _storage.RetrieveString(WalletAddressKey); + } + + public void AddSession(SessionData session) + { + var sessions = GetSessions(); + var newSessions = sessions.AddToArray(session); + StoreSessions(newSessions); + } + + public void StoreSessions(SessionData[] sessions) + { + var json = JsonConvert.SerializeObject(sessions); + _storage.StoreString(SessionsKey, json); + } + + public SessionData[] GetSessions() + { + var json = _storage.RetrieveString(SessionsKey); + return string.IsNullOrEmpty(json) ? + Array.Empty() : + JsonConvert.DeserializeObject(json); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs.meta new file mode 100644 index 00000000..0de0de5e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 11ecb5f741394d8c96dcd6bae5576773 +timeCreated: 1752150006 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs index b792ade4..28d20a39 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs @@ -3,6 +3,7 @@ using System.Numerics; using Newtonsoft.Json; using Sequence.ABI; +using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Utils; using UnityEngine.Scripting; @@ -14,10 +15,10 @@ public class Attestation SequenceCoder.KeccakHash("acceptImplicitRequest".ToByteArray()); public Address approvedSigner; - public FixedByte identityType; - public FixedByte issuerHash; - public FixedByte audienceHash; - public byte[] applicationData; + public Bytes identityType; + public Bytes issuerHash; + public Bytes audienceHash; + public Bytes applicationData; public AuthData authData; private void AssertHasSize(FixedByte obj, int size, string argumentName) @@ -36,7 +37,7 @@ public byte[] Encode() byte[] identityTypeBytes = identityType.Data.Slice(0, 4).PadLeft(4); byte[] issuerHashBytes = issuerHash.Data.PadLeft(32); byte[] audienceHashBytes = audienceHash.Data.PadLeft(32); - byte[] applicationDataLengthBytes = applicationData.Length.ByteArrayFromNumber(3); + byte[] applicationDataLengthBytes = applicationData.Data.Length.ByteArrayFromNumber(3); return ByteArrayExtensions.ConcatenateByteArrays(approvedSignerBytes, identityTypeBytes, issuerHashBytes, audienceHashBytes, applicationDataLengthBytes, applicationData, authDataBytes); @@ -56,7 +57,7 @@ public object ToJson() identityType = identityType.Data.ByteArrayToHexStringWithPrefix(), issuerHash = issuerHash.Data.ByteArrayToHexStringWithPrefix(), audienceHash = audienceHash.Data.ByteArrayToHexStringWithPrefix(), - applicationData = applicationData.ByteArrayToHexStringWithPrefix(), + applicationData = applicationData.Data.ByteArrayToHexStringWithPrefix(), authData = new { redirectUrl = authData.redirectUrl, @@ -65,70 +66,11 @@ public object ToJson() }; } - public static Attestation FromJson(string json) - { - var jsonAble = JsonConvert.DeserializeObject(json); - return new Attestation - { - approvedSigner = jsonAble.approvedSigner, - identityType = new FixedByte(4, jsonAble.identityType.HexStringToByteArray()), - issuerHash = new FixedByte(32, jsonAble.issuerHash.HexStringToByteArray()), - audienceHash = new FixedByte(32, jsonAble.audienceHash.HexStringToByteArray()), - applicationData = jsonAble.applicationData.HexStringToByteArray(), - authData = new AuthData(jsonAble.authData.redirectUrl, BigInteger.Parse(jsonAble.authData.issuedAt)) - }; - } - public byte[] GenerateImplicitRequestMagic(Address wallet) { byte[] walletBytes = wallet.Value.HexStringToByteArray(20); return ByteArrayExtensions.ConcatenateByteArrays(ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX, walletBytes, audienceHash.Data, issuerHash.Data); } - - [Serializable] - public class JsonAttestation - { - public Address approvedSigner; - public string identityType; - public string issuerHash; - public string audienceHash; - public string applicationData; - public JsonAuthData authData; - - [JsonConstructor] - [Preserve] - public JsonAttestation(Address approvedSigner, string identityType, string issuerHash, string audienceHash, string applicationData, JsonAuthData authData) - { - this.approvedSigner = approvedSigner; - this.identityType = identityType; - this.issuerHash = issuerHash; - this.audienceHash = audienceHash; - this.applicationData = applicationData; - this.authData = authData; - } - - public JsonAttestation(Attestation attestation) - { - this.approvedSigner = attestation.approvedSigner; - this.identityType = attestation.identityType.Data.ByteArrayToHexStringWithPrefix(); - this.issuerHash = attestation.issuerHash.Data.ByteArrayToHexStringWithPrefix(); - this.audienceHash = attestation.audienceHash.Data.ByteArrayToHexStringWithPrefix(); - this.applicationData = attestation.applicationData.ByteArrayToHexStringWithPrefix(); - this.authData = new JsonAuthData(attestation.authData.redirectUrl, attestation.authData.issuedAt.ToString()); - } - } - - public class JsonAuthData - { - public string redirectUrl; - public string issuedAt; - - public JsonAuthData(string redirectUrl, string issuedAt) - { - this.redirectUrl = redirectUrl; - this.issuedAt = issuedAt; - } - } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs index 0f3ba2d9..a08fd9d7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs @@ -1,5 +1,6 @@ using System; using System.Numerics; +using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Utils; using UnityEngine.Scripting; @@ -9,10 +10,10 @@ namespace Sequence.EcosystemWallet.Primitives public class AuthData { public string redirectUrl; - public BigInteger issuedAt; + public BigInt issuedAt; [Preserve] - public AuthData(string redirectUrl, BigInteger issuedAt) + public AuthData(string redirectUrl, BigInt issuedAt) { this.redirectUrl = redirectUrl; this.issuedAt = issuedAt; @@ -22,7 +23,7 @@ public byte[] Encode() { byte[] redirectUrlLength = ByteArrayExtensions.ByteArrayFromNumber(redirectUrl.Length, 3); byte[] redirectUrlBytes = redirectUrl.ToByteArray(); - return ByteArrayExtensions.ConcatenateByteArrays(redirectUrlLength, redirectUrlBytes, issuedAt.ByteArrayFromNumber(8)); + return ByteArrayExtensions.ConcatenateByteArrays(redirectUrlLength, redirectUrlBytes, issuedAt.Value.ByteArrayFromNumber(8)); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common.meta new file mode 100644 index 00000000..e0acb672 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c7406ef73d174eb8b42d92a547e81eca +timeCreated: 1752147864 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/BigInt.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/BigInt.cs new file mode 100644 index 00000000..273b71f5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/BigInt.cs @@ -0,0 +1,56 @@ +using System; +using System.Numerics; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Sequence.EcosystemWallet.Primitives.Common +{ + [JsonConverter(typeof(BigIntConverter))] + public class BigInt + { + public BigInteger Value { get; set; } + + public BigInt(BigInteger value) + { + Value = value; + } + + public override string ToString() + { + return Value.ToString(); + } + + public static implicit operator BigInteger(BigInt b) => b.Value; + public static implicit operator BigInt(BigInteger value) => new BigInt(value); + } + + public class BigIntConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, BigInt value, JsonSerializer serializer) + { + writer.WriteStartObject(); + writer.WritePropertyName("_isBigInt"); + writer.WriteValue(true); + writer.WritePropertyName("data"); + writer.WriteValue(value.Value.ToString()); // decimal string + writer.WriteEndObject(); + } + + public override BigInt ReadJson(JsonReader reader, Type objectType, BigInt existingValue, bool hasExistingValue, JsonSerializer serializer) + { + var obj = JObject.Load(reader); + + if (obj["_isBigInt"]?.Value() != true) + throw new JsonSerializationException("Expected _isBigInt to be true."); + + var dataStr = obj["data"]?.Value(); + if (string.IsNullOrEmpty(dataStr)) + throw new JsonSerializationException("Missing or empty data field for BigInt."); + + if (!BigInteger.TryParse(dataStr, out var value)) + throw new JsonSerializationException("Invalid BigInt format."); + + return new BigInt(value); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/BigInt.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/BigInt.cs.meta new file mode 100644 index 00000000..13fdac34 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/BigInt.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 474241dc6b2c48d0a496e31a9833a942 +timeCreated: 1752148112 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs new file mode 100644 index 00000000..cff0936f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs @@ -0,0 +1,53 @@ +using System; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Sequence.EcosystemWallet.Primitives.Common +{ + [JsonConverter(typeof(BytesConverter))] + public class Bytes + { + public byte[] Data { get; set; } + + public Bytes(byte[] data) + { + Data = data; + } + + public static implicit operator byte[](Bytes b) => b.Data; + public static implicit operator Bytes(byte[] data) => new Bytes(data); + } + + public class BytesConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, Bytes value, JsonSerializer serializer) + { + var hex = "0x" + BitConverter.ToString(value.Data).Replace("-", "").ToLowerInvariant(); + writer.WriteStartObject(); + writer.WritePropertyName("_isUint8Array"); + writer.WriteValue(true); + writer.WritePropertyName("data"); + writer.WriteValue(hex); + writer.WriteEndObject(); + } + + public override Bytes ReadJson(JsonReader reader, Type objectType, Bytes existingValue, bool hasExistingValue, JsonSerializer serializer) + { + var obj = JObject.Load(reader); + var hexString = obj["data"]?.Value() ?? "0x"; + + if (!hexString.StartsWith("0x")) + throw new JsonSerializationException("Expected hex string to start with '0x'."); + + var hex = hexString.Substring(2); + if (hex.Length % 2 != 0) + throw new JsonSerializationException("Hex string must have an even length."); + + var byteArray = new byte[hex.Length / 2]; + for (int i = 0; i < byteArray.Length; i++) + byteArray[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16); + + return new Bytes(byteArray); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs.meta new file mode 100644 index 00000000..65619ad4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2aac788ab2db4f26a5f74971138884b6 +timeCreated: 1752147868 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs index 6b6b1542..ff92cab6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs @@ -11,7 +11,7 @@ namespace Sequence.EcosystemWallet.Primitives [Serializable] public class ParameterRule { - public static readonly byte[] SelectorMask = "0xffffffff".HexStringToByteArray(32); + public static readonly byte[] SelectorMask = "0xffffffff".HexStringToByteArray().PadRight(32); public static readonly byte[] Uint256Mask = Enumerable.Repeat((byte)0xff, 32).ToArray().PadLeft(32); public bool cumulative; @@ -26,9 +26,17 @@ public object ToJson() { cumulative = cumulative, operation = (int)operation, - value = value.ByteArrayToHexStringWithPrefix(), + value = new Dictionary + { + {"_isUint8Array", true}, + {"data", value.ByteArrayToHexStringWithPrefix()} + }, offset = offset.ToString(), - mask = mask.ByteArrayToHexStringWithPrefix() + mask = new Dictionary + { + {"_isUint8Array", true}, + {"data", mask.ByteArrayToHexStringWithPrefix()} + } }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs index aa3b09fe..ffb51086 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs @@ -21,9 +21,7 @@ public object ToJson() { return new { - type = SessionLeaf.SessionPermissionsType, chainId = chainId, - signer = signer.Value, valueLimit = valueLimit, deadline = deadline, permissions = permissions.Select(permission => permission.ToJson()).ToArray() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs index d0ff61b0..02d4d75f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs @@ -19,7 +19,7 @@ public static SessionCallSignature FromJson(string json) { return new ImplicitSessionCallSignature { - attestation = Attestation.FromJson(data["attestation"].ToString()), + attestation = JsonConvert.DeserializeObject(data["attestation"].ToString()), sessionSignature = RSY.FromString((string)data["sessionSignature"]), identitySignature = RSY.FromString((string)identitySignature) }; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs index 5d5cf75e..7fbbe0d3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs @@ -1,23 +1,24 @@ using System; using System.Linq; using System.Numerics; +using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives { public class RSY { - public BigInteger r; - public BigInteger s; - public BigInteger yParity; + public BigInt r; + public BigInt s; + public int yParity; public byte[] Pack() { if (yParity != 0 && yParity != 1 && yParity != 27 && yParity != 28) throw new ArgumentException("yParity must be 0, 1, 27, or 28."); - var rBytes = r.ByteArrayFromNumber(r.MinBytesFor()).PadLeft(32); - var sBytes = s.ByteArrayFromNumber(s.MinBytesFor()).PadLeft(32); + var rBytes = r.Value.ByteArrayFromNumber(r.Value.MinBytesFor()).PadLeft(32); + var sBytes = s.Value.ByteArrayFromNumber(s.Value.MinBytesFor()).PadLeft(32); if (yParity % 2 == 1) sBytes[0] |= 0x80; @@ -25,6 +26,11 @@ public byte[] Pack() return ByteArrayExtensions.ConcatenateByteArrays(rBytes, sBytes); } + public override string ToString() + { + return $"R: {r}, S: {s}, Y: {yParity}"; + } + public static RSY FromString(string input) { var parts = input.Split(':'); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Wallet/EOAWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Wallet/EOAWallet.cs index 179433c3..046323e1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Wallet/EOAWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Wallet/EOAWallet.cs @@ -64,6 +64,13 @@ public Address GetAddress() return address; } + public string GetPrivateKeyAsHex() + { + byte[] privateKeyBytes = new byte[32]; + privKey.WriteToSpan(privateKeyBytes); + return privateKeyBytes.ByteArrayToHexString(); + } + public async Task DeployContract(IEthClient client, string bytecode, ulong value = 0) { EthTransaction deployTransaction = await new GasLimitEstimator(client, GetAddress()).BuildTransaction(StringExtensions.ZeroAddress, bytecode, value); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs index a14d614b..110e7cb2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs @@ -85,6 +85,17 @@ public static List ConvertToList(this T[] arr) return newList; } + public static T[] AddToArray(this T[] array, T item) + { + if (array == null) + return new T[] { item }; + + T[] result = new T[array.Length + 1]; + Array.Copy(array, result, array.Length); + result[array.Length] = item; + return result; + } + public static T[] CombineArrays(T[] arr1, T[] arr2) { int length1 = arr1.Length; From b40f8dabc6272728380e108ca48895d887c1f21d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 10 Jul 2025 15:38:58 +0200 Subject: [PATCH 097/165] added v3 wallet demo scene and UI --- .../Sequence/Samples~/Demo V3.meta | 8 + .../Sequence/Samples~/Demo V3/DemoV3.unity | 5894 +++++++++++++++++ .../Samples~/Demo V3/DemoV3.unity.meta | 7 + .../SequenceEcosystemWalletWindow.cs | 114 + .../SequenceEcosystemWalletWindow.cs.meta | 11 + .../SequenceEcosystemWalletLogin.cs | 5 + ProjectSettings/EditorBuildSettings.asset | 5 +- 7 files changed, 6043 insertions(+), 1 deletion(-) create mode 100644 Packages/Sequence-Unity/Sequence/Samples~/Demo V3.meta create mode 100644 Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity create mode 100644 Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3.meta b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3.meta new file mode 100644 index 00000000..3c44fab5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8e3f1d0a720ef403faceb3ee5eb43949 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity new file mode 100644 index 00000000..e208b581 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -0,0 +1,5894 @@ +%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: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 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.44657844, g: 0.49641258, b: 0.57481694, 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: 1 + 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 &8597591 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8597592} + - component: {fileID: 8597594} + - component: {fileID: 8597593} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &8597592 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8597591} + 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: 946315311} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 7.5, y: -15} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &8597593 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8597591} + 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: 668a5199388a248cdbcfc5cb42946bde, 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 &8597594 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8597591} + m_CullTransparentMesh: 1 +--- !u!1 &17360256 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 17360257} + - component: {fileID: 17360260} + - component: {fileID: 17360259} + - component: {fileID: 17360258} + m_Layer: 5 + m_Name: Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &17360257 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 17360256} + 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: 2100922580} + - {fileID: 1979708985} + m_Father: {fileID: 722266041} + 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 &17360258 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 17360256} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 873417223} + 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: 2100922580} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1979708986} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &17360259 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 17360256} + 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.254717, g: 0.254717, b: 0.254717, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &17360260 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 17360256} + m_CullTransparentMesh: 1 +--- !u!1 &116513910 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 116513913} + - component: {fileID: 116513912} + - component: {fileID: 116513911} + 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 &116513911 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116513910} + m_Enabled: 1 +--- !u!20 &116513912 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116513910} + 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: 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 &116513913 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 116513910} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, 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 &148098786 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 148098787} + - component: {fileID: 148098789} + - component: {fileID: 148098788} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &148098787 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 148098786} + 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: 220577105} + 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: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &148098788 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 148098786} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Wallet + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 + 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: 1 + 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 &148098789 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 148098786} + m_CullTransparentMesh: 1 +--- !u!1 &161099257 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 161099258} + - component: {fileID: 161099260} + - component: {fileID: 161099259} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &161099258 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161099257} + 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: 1267233531} + 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 &161099259 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161099257} + 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 &161099260 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161099257} + m_CullTransparentMesh: 1 +--- !u!1 &220577104 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 220577105} + - component: {fileID: 220577107} + - component: {fileID: 220577106} + - component: {fileID: 220577109} + - component: {fileID: 220577108} + m_Layer: 5 + m_Name: WalletState + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &220577105 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 220577104} + 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: 148098787} + - {fileID: 906953579} + m_Father: {fileID: 2198483992803733903} + m_RootOrder: 3 + 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: -40} + m_SizeDelta: {x: -30, y: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &220577106 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 220577104} + 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!114 &220577107 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 220577104} + 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: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &220577108 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 220577104} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eb6fa7d82312143d9b451ac5e7465a38, type: 3} + m_Name: + m_EditorClassIdentifier: + _start: 0.7 + _duration: 0.3 + _animationCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 2 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.77346337 + value: 1.1153979 + inSlope: -0.25566182 + outSlope: -0.25566182 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.7318018 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: -0.17961398 + outSlope: -0.17961398 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.6227655 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!225 &220577109 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 220577104} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &390971674 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 390971675} + - component: {fileID: 390971677} + - component: {fileID: 390971676} + 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 &390971675 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390971674} + 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: 1303578556} + 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 &390971676 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390971674} + 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: 3b399a2d8fd4949958a248da594a7b27, 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: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 1 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &390971677 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390971674} + m_CullTransparentMesh: 1 +--- !u!1 &448961315 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 448961316} + - component: {fileID: 448961318} + - component: {fileID: 448961317} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &448961316 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 448961315} + 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: 722266041} + 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 &448961317 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 448961315} + 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: Implicit + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &448961318 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 448961315} + m_CullTransparentMesh: 1 +--- !u!1 &628532634 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 628532637} + - component: {fileID: 628532636} + - component: {fileID: 628532635} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &628532635 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 628532634} + 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 &628532636 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 628532634} + 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 &628532637 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 628532634} + 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} +--- !u!1 &722266040 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 722266041} + - component: {fileID: 722266044} + - component: {fileID: 722266043} + - component: {fileID: 722266042} + m_Layer: 5 + m_Name: SessionDropdown + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &722266041 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 722266040} + 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: 448961316} + - {fileID: 1423156422} + - {fileID: 17360257} + m_Father: {fileID: 4209220039127894524} + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &722266042 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 722266040} + 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: 722266043} + m_Template: {fileID: 17360257} + m_CaptionText: {fileID: 448961317} + m_CaptionImage: {fileID: 0} + m_Placeholder: {fileID: 0} + m_ItemText: {fileID: 390971676} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: + - m_Text: Implicit + m_Image: {fileID: 0} + - m_Text: Explicit (Open) + m_Image: {fileID: 0} + - m_Text: Explicit (Restrictive) + m_Image: {fileID: 0} + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: OnSessionTypeChanged + m_Mode: 0 + 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 + m_AlphaFadeSpeed: 0.15 +--- !u!114 &722266043 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 722266040} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &722266044 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 722266040} + m_CullTransparentMesh: 1 +--- !u!1 &796531349 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 796531350} + - component: {fileID: 796531352} + - component: {fileID: 796531351} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &796531350 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 796531349} + 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: 946315311} + 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: 90, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &796531351 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 796531349} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Sign Out + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + 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: 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 &796531352 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 796531349} + m_CullTransparentMesh: 1 +--- !u!1 &873417222 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 873417223} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &873417223 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 873417222} + 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: 1303578556} + m_Father: {fileID: 2100922580} + 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 &906953578 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 906953579} + - component: {fileID: 906953583} + - component: {fileID: 906953582} + - component: {fileID: 906953581} + - component: {fileID: 906953580} + m_Layer: 5 + m_Name: SignOutButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &906953579 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 906953578} + 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: 946315311} + m_Father: {fileID: 220577105} + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &906953580 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 906953578} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &906953581 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 906953578} + 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: 906953582} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignOut + 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 &906953582 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 906953578} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &906953583 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 906953578} + m_CullTransparentMesh: 1 +--- !u!1 &946315310 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 946315311} + - component: {fileID: 946315313} + - component: {fileID: 946315312} + m_Layer: 5 + m_Name: Layout + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &946315311 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 946315310} + 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: 8597592} + - {fileID: 796531350} + m_Father: {fileID: 906953579} + 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: 0, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &946315312 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 946315310} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 0 +--- !u!114 &946315313 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 946315310} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 4 + m_Spacing: 5 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &1050865737 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1050865742} + - component: {fileID: 1050865741} + - component: {fileID: 1050865740} + - component: {fileID: 1050865739} + m_Layer: 5 + m_Name: SequenceCanvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1050865739 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1050865737} + 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 &1050865740 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1050865737} + 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: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 200 + m_DefaultSpriteDPI: 200 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1050865741 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1050865737} + 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 &1050865742 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1050865737} + 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: 1788955835} + - {fileID: 2198483992803733903} + - {fileID: 2053860377} + 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 &1084335994 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 3094631411173026328, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + m_PrefabInstance: {fileID: 5107492344900098706} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1126746399 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1126746401} + - component: {fileID: 1126746400} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1126746400 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1126746399} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1126746401 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1126746399} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, 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: 50, y: -30, z: 0} +--- !u!1 &1199011675 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1199011676} + - component: {fileID: 1199011678} + - component: {fileID: 1199011677} + 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 &1199011676 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1199011675} + 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: 1303578556} + 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 &1199011677 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1199011675} + 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.25490198, g: 0.25490198, b: 0.25490198, 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 &1199011678 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1199011675} + m_CullTransparentMesh: 1 +--- !u!1 &1267233530 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1267233531} + 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 &1267233531 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1267233530} + 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: 161099258} + m_Father: {fileID: 1979708985} + 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 &1303578555 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1303578556} + - component: {fileID: 1303578557} + m_Layer: 5 + m_Name: Item + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1303578556 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1303578555} + 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: 1199011676} + - {fileID: 1331741680} + - {fileID: 390971675} + m_Father: {fileID: 873417223} + 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 &1303578557 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1303578555} + 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.8627451, g: 0.8627451, b: 0.8627451, a: 1} + m_PressedColor: {r: 0.7075472, g: 0.7075472, b: 0.7075472, 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: 1199011677} + toggleTransition: 1 + graphic: {fileID: 1331741681} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &1331741679 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1331741680} + - component: {fileID: 1331741682} + - component: {fileID: 1331741681} + 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 &1331741680 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1331741679} + 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: 1303578556} + 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 &1331741681 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1331741679} + 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 &1331741682 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1331741679} + m_CullTransparentMesh: 1 +--- !u!1 &1423156421 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1423156422} + - component: {fileID: 1423156424} + - component: {fileID: 1423156423} + m_Layer: 5 + m_Name: Arrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1423156422 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1423156421} + 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: 722266041} + 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 &1423156423 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1423156421} + 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 &1423156424 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1423156421} + m_CullTransparentMesh: 1 +--- !u!1 &1788955834 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1788955835} + - component: {fileID: 1788955837} + - component: {fileID: 1788955836} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1788955835 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788955834} + 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: 1050865742} + 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 &1788955836 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788955834} + 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: 76b048e2d7f8e459ca9b54c935448f66, type: 3} + 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 &1788955837 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788955834} + m_CullTransparentMesh: 1 +--- !u!1 &1979708984 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1979708985} + - component: {fileID: 1979708988} + - component: {fileID: 1979708987} + - component: {fileID: 1979708986} + m_Layer: 5 + m_Name: Scrollbar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1979708985 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1979708984} + 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: 1267233531} + m_Father: {fileID: 17360257} + 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 &1979708986 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1979708984} + 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: 161099259} + m_HandleRect: {fileID: 161099258} + m_Direction: 2 + m_Value: 0 + m_Size: 0.2 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1979708987 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1979708984} + 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 &1979708988 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1979708984} + m_CullTransparentMesh: 1 +--- !u!1 &2053860376 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2053860377} + - component: {fileID: 2053860380} + - component: {fileID: 2053860379} + - component: {fileID: 2053860378} + m_Layer: 5 + m_Name: VersionText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2053860377 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053860376} + 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: 1050865742} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -5, y: 5} + m_SizeDelta: {x: 300, y: 10} + m_Pivot: {x: 1, y: 0} +--- !u!114 &2053860378 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053860376} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66917f722796445f1a9d5d54218cd973, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &2053860379 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053860376} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Version + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2583691263 + m_fontColor: {r: 1, g: 1, b: 1, a: 0.6} + 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 4 + 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 &2053860380 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053860376} + m_CullTransparentMesh: 1 +--- !u!1 &2100922579 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2100922580} + - component: {fileID: 2100922583} + - component: {fileID: 2100922582} + - component: {fileID: 2100922581} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2100922580 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100922579} + 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: 873417223} + m_Father: {fileID: 17360257} + 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 &2100922581 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100922579} + 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 &2100922582 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100922579} + m_CullTransparentMesh: 1 +--- !u!114 &2100922583 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100922579} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &105214555915701266 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6668015762455010229} + - component: {fileID: 7468446259786097445} + - component: {fileID: 5160393790428650344} + m_Layer: 5 + m_Name: Layout + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &292080265208782336 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7453753217345858256} + 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: 5626829297434306198} + 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: 95, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &320339275645968252 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4209220039127894524} + - component: {fileID: 4993712313665796667} + - component: {fileID: 7675607662054216073} + m_Layer: 5 + m_Name: LoginState + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &364841223076288887 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1185936199800087165} + 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: 3251032449294067148} + 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: 10, y: 0} + m_SizeDelta: {x: -40, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &370308474855488987 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6736238217287931418} + 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: 1129766508066712729} + - {fileID: 3495957624811024636} + m_Father: {fileID: 4209220039127894524} + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &380487859157681410 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8750106440804939110} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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!114 &489461982354477915 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6736238217287931418} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, 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!222 &632956993693942245 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7235549539173168322} + m_CullTransparentMesh: 1 +--- !u!1 &769755465153914955 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5626829297434306198} + - component: {fileID: 7564344634148780842} + - component: {fileID: 1994501452718507400} + m_Layer: 5 + m_Name: Layout + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &777970533174975600 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2445699972653285594} + 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: d03d44fa67fc3480a9617f6df236254d, 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!114 &924609053866080383 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7426289429606426455} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Powered by Sequence + 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: 4288256409 + m_fontColor: {r: 0.6, g: 0.6, b: 0.6, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + 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: 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 &949280588057901389 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571441453081982020} + m_CullTransparentMesh: 1 +--- !u!1 &1039274815797997968 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4231729613209684367} + - component: {fileID: 7376973567988763871} + - component: {fileID: 8218687474100291355} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &1119861398305917097 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7426289429606426455} + m_CullTransparentMesh: 1 +--- !u!224 &1129766508066712729 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2433697561466855871} + 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: 5626829297434306198} + m_Father: {fileID: 370308474855488987} + 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 &1181566138228532167 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8496890551459878638} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, 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: 8046914839405764275} + m_TextViewport: {fileID: 2364319422627657610} + m_TextComponent: {fileID: 4346455832680865383} + m_Placeholder: {fileID: 2369011026816092588} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 0 + m_RegexValue: + m_GlobalPointSize: 14 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!224 &1184608820065580092 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2445699972653285594} + 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: 5626829297434306198} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 7.5, y: -15} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1185936199800087165 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 364841223076288887} + - component: {fileID: 7147867555355416424} + - component: {fileID: 4272771836669574709} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1202243266122474360 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7453753217345858256} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Continue with Google + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + 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: 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!114 &1222631999357543459 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571441453081982020} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Continue with Apple + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + 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: 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!114 &1365941811581567776 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2433697561466855871} + 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: 3025777727642342367} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignInWithGoogle + 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 &1392859846450567624 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7526353788427293348} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: -8, y: -5, z: -8, w: -5} + m_Softness: {x: 0, y: 0} +--- !u!114 &1459061464521247473 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8750106440804939110} + 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: 380487859157681410} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 8496890551459878638} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 8750106440804939110} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + 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 + - m_Target: {fileID: 1181566138228532167} + m_TargetAssemblyTypeName: UnityEngine.UI.Selectable, UnityEngine.UI + m_MethodName: Select + 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!1 &1571441453081982020 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6827772154608939493} + - component: {fileID: 949280588057901389} + - component: {fileID: 1222631999357543459} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1654620268838434455 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2673375261290894866} + 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: 7691379925437972861} + 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: 7, y: 7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1749343221507412373 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5776690245397318217} + m_Layer: 5 + m_Name: Break + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &1969879511555196001 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4154666571978088412} + m_CullTransparentMesh: 1 +--- !u!114 &1994501452718507400 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 769755465153914955} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 0 +--- !u!224 &2198483992803733903 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9144345594371459775} + 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: 5231001844959997297} + - {fileID: 5231001846775536177} + - {fileID: 4209220039127894524} + - {fileID: 220577105} + - {fileID: 8737090446545054563} + - {fileID: 5107492344900098707} + m_Father: {fileID: 1050865742} + 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: 0} + m_SizeDelta: {x: 240, y: 210} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2325936309338030303 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8297224220932671038} + 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: 2719765420686600780} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignInWithEmail + 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!224 &2360241989201869676 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7134328821713460319} + 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: 6668015762455010229} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 7.5, y: -15} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &2364319422627657610 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7526353788427293348} + 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: 3245547436246206480} + - {fileID: 8577953651209467930} + m_Father: {fileID: 7053000246198018492} + 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: -10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2369011026816092588 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6427513404366440442} + 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: Enter email... + 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: 4286611584 + m_fontColor: {r: 0.5, g: 0.5, b: 0.5, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 1 + 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!1 &2433697561466855871 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1129766508066712729} + - component: {fileID: 5022763554724267541} + - component: {fileID: 3025777727642342367} + - component: {fileID: 1365941811581567776} + - component: {fileID: 9122750164851673669} + m_Layer: 5 + m_Name: GoogleButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &2445699972653285594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1184608820065580092} + - component: {fileID: 4551461482545358887} + - component: {fileID: 777970533174975600} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!1 &2673375261290894866 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1654620268838434455} + - component: {fileID: 5736418155645019230} + - component: {fileID: 4821899330820860530} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2719765420686600780 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8297224220932671038} + 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.26666668, g: 0.06666667, b: 0.88235295, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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!1 &2830074820831578477 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2856355940061643817} + m_Layer: 5 + m_Name: EmailOption + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2856355940061643817 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2830074820831578477} + 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: 3251032449294067148} + - {fileID: 7053000246198018492} + m_Father: {fileID: 4209220039127894524} + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2905918359473744821 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7134328821713460319} + 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: 668a5199388a248cdbcfc5cb42946bde, 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!114 &3025777727642342367 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2433697561466855871} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &3191167764104979517 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5045421231128479223} + m_CullTransparentMesh: 1 +--- !u!224 &3245547436246206480 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6427513404366440442} + 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: 2364319422627657610} + 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!224 &3251032449294067148 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8750106440804939110} + 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: 364841223076288887} + - {fileID: 4231729613209684367} + m_Father: {fileID: 2856355940061643817} + 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!222 &3251968527161606064 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8750106440804939110} + m_CullTransparentMesh: 1 +--- !u!224 &3495957624811024636 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6879894437146287264} + 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: 6668015762455010229} + m_Father: {fileID: 370308474855488987} + 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!224 &3530038144121264930 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7235549539173168322} + 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: 5776690245397318217} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.6, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -0.0000038146973, y: 0} + m_SizeDelta: {x: 0, y: 1} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &3768554904066845669 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4154666571978088412} + 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: 5776690245397318217} + 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 &3833055132679331405 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6879894437146287264} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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!114 &4113369433531552208 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6879894437146287264} + 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: 3833055132679331405} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignInWithApple + 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!1 &4154666571978088412 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3768554904066845669} + - component: {fileID: 1969879511555196001} + - component: {fileID: 6701857477172623370} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4209220039127894524 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 320339275645968252} + 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: 722266041} + - {fileID: 5776690245397318217} + - {fileID: 370308474855488987} + - {fileID: 2856355940061643817} + - {fileID: 7902663795230052217} + m_Father: {fileID: 2198483992803733903} + m_RootOrder: 2 + 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: -40} + m_SizeDelta: {x: -30, y: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!224 &4231729613209684367 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1039274815797997968} + 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: 3251032449294067148} + 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: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4271752886393600173 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8496890551459878638} + m_CullTransparentMesh: 1 +--- !u!114 &4272771836669574709 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1185936199800087165} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Email address + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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!114 &4346455832680865383 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5045421231128479223} + 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: "\u200B" + 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: 8 + m_fontSizeBase: 8 + 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: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + 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 &4551461482545358887 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2445699972653285594} + m_CullTransparentMesh: 1 +--- !u!222 &4820383406529155423 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5252546436801395163} + m_CullTransparentMesh: 1 +--- !u!114 &4821899330820860530 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2673375261290894866} + 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: 7bff9d6884f5e4bee9b34e722bf48b70, 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 &4896115008353292649 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6427513404366440442} + m_CullTransparentMesh: 1 +--- !u!114 &4936300011644007728 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8297224220932671038} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &4993712313665796667 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 320339275645968252} + 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: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!222 &5022763554724267541 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2433697561466855871} + m_CullTransparentMesh: 1 +--- !u!1 &5045421231128479223 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8577953651209467930} + - component: {fileID: 3191167764104979517} + - component: {fileID: 4346455832680865383} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1001 &5107492344900098706 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 2198483992803733903} + m_Modifications: + - target: {fileID: 3094631411173026328, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_Name + value: LoadingScreen + objectReference: {fileID: 0} + - target: {fileID: 3094631411173026328, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_RootOrder + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_ConstrainProportionsScale + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8590561263955264044, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_ConstrainProportionsScale + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 21aa1af318f304faca1367525db9bc28, type: 3} +--- !u!224 &5107492344900098707 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + m_PrefabInstance: {fileID: 5107492344900098706} + m_PrefabAsset: {fileID: 0} +--- !u!114 &5160393790428650344 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 105214555915701266} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 0 +--- !u!222 &5231001844959997263 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5231001844959997298} + m_CullTransparentMesh: 1 +--- !u!114 &5231001844959997296 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5231001844959997298} + 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: 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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!224 &5231001844959997297 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5231001844959997298} + 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: 2198483992803733903} + 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 &5231001844959997298 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5231001844959997297} + - component: {fileID: 5231001844959997263} + - component: {fileID: 5231001844959997296} + - component: {fileID: 7801980605564957315} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &5231001846775536143 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5231001846775536178} + m_CullTransparentMesh: 1 +--- !u!114 &5231001846775536176 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5231001846775536178} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Sequence Ecosystem 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: 10 + m_fontSizeBase: 10 + m_fontWeight: 400 + m_enableAutoSizing: 0 + 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: 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!224 &5231001846775536177 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5231001846775536178} + 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: 2198483992803733903} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -20} + m_SizeDelta: {x: 200, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &5231001846775536178 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5231001846775536177} + - component: {fileID: 5231001846775536143} + - component: {fileID: 5231001846775536176} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &5252546436801395163 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7918050602330817002} + - component: {fileID: 4820383406529155423} + - component: {fileID: 6881998436349686276} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5626829297434306198 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 769755465153914955} + 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: 1184608820065580092} + - {fileID: 292080265208782336} + m_Father: {fileID: 1129766508066712729} + 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: 0, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5736418155645019230 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2673375261290894866} + m_CullTransparentMesh: 1 +--- !u!224 &5776690245397318217 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1749343221507412373} + 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: 7918050602330817002} + - {fileID: 3530038144121264930} + - {fileID: 3768554904066845669} + m_Father: {fileID: 4209220039127894524} + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &6427513404366440442 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3245547436246206480} + - component: {fileID: 4896115008353292649} + - component: {fileID: 2369011026816092588} + - component: {fileID: 8630391446351500689} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6668015762455010229 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 105214555915701266} + 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: 2360241989201869676} + - {fileID: 6827772154608939493} + m_Father: {fileID: 3495957624811024636} + 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: 0, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &6701857477172623370 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4154666571978088412} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: select + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281413937 + m_fontColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + 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: 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!1 &6736238217287931418 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 370308474855488987} + - component: {fileID: 489461982354477915} + m_Layer: 5 + m_Name: SocialLayout + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6827772154608939493 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571441453081982020} + 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: 6668015762455010229} + 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: 90, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6851259219541849663 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7453753217345858256} + m_CullTransparentMesh: 1 +--- !u!1 &6879894437146287264 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3495957624811024636} + - component: {fileID: 6976053017350654453} + - component: {fileID: 3833055132679331405} + - component: {fileID: 4113369433531552208} + - component: {fileID: 7396016542000365222} + m_Layer: 5 + m_Name: AppleButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &6881998436349686276 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5252546436801395163} + 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.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_RaycastTarget: 0 + 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 &6976053017350654453 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6879894437146287264} + m_CullTransparentMesh: 1 +--- !u!222 &7042892034569271523 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7134328821713460319} + m_CullTransparentMesh: 1 +--- !u!224 &7053000246198018492 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8496890551459878638} + 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: 2364319422627657610} + - {fileID: 7691379925437972861} + m_Father: {fileID: 2856355940061643817} + 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: -2, y: -2} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &7081700172232747878 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8496890551459878638} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!1 &7134328821713460319 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2360241989201869676} + - component: {fileID: 7042892034569271523} + - component: {fileID: 2905918359473744821} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!222 &7147867555355416424 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1185936199800087165} + m_CullTransparentMesh: 1 +--- !u!1 &7235549539173168322 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3530038144121264930} + - component: {fileID: 632956993693942245} + - component: {fileID: 8313833047788328780} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &7376973567988763871 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1039274815797997968} + m_CullTransparentMesh: 1 +--- !u!114 &7396016542000365222 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6879894437146287264} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!1 &7426289429606426455 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7902663795230052217} + - component: {fileID: 1119861398305917097} + - component: {fileID: 924609053866080383} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &7453753217345858256 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 292080265208782336} + - component: {fileID: 6851259219541849663} + - component: {fileID: 1202243266122474360} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &7468446259786097445 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 105214555915701266} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 4 + m_Spacing: 5 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &7526353788427293348 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2364319422627657610} + - component: {fileID: 1392859846450567624} + m_Layer: 5 + m_Name: Text Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &7564344634148780842 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 769755465153914955} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 4 + m_Spacing: 5 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &7675607662054216073 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 320339275645968252} + 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 &7691379925437972861 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8297224220932671038} + 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: 1654620268838434455} + m_Father: {fileID: 7053000246198018492} + 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!222 &7760919492097483076 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8297224220932671038} + m_CullTransparentMesh: 1 +--- !u!114 &7801980605564957315 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5231001844959997298} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0b148fe25e99eb48b9724523833bab1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Delegates: + - eventID: 4 + callback: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: SequenceSDK.Samples.SequenceLoginWindow, Sequence.Boilerplates + m_MethodName: EnableEmailButton + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 +--- !u!224 &7902663795230052217 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7426289429606426455} + 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: 4209220039127894524} + m_RootOrder: 4 + 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: 25} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &7918050602330817002 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5252546436801395163} + 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: 5776690245397318217} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0.4, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 1} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &8046914839405764275 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8496890551459878638} + 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: 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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!114 &8218687474100291355 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1039274815797997968} + 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: e98edba911d4c44a4a915456a9f57607, 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!1 &8297224220932671038 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7691379925437972861} + - component: {fileID: 7760919492097483076} + - component: {fileID: 2719765420686600780} + - component: {fileID: 2325936309338030303} + - component: {fileID: 4936300011644007728} + m_Layer: 5 + m_Name: ContinueButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &8313833047788328780 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7235549539173168322} + 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.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_RaycastTarget: 0 + 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!1 &8496890551459878638 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7053000246198018492} + - component: {fileID: 4271752886393600173} + - component: {fileID: 8046914839405764275} + - component: {fileID: 1181566138228532167} + - component: {fileID: 7081700172232747878} + m_Layer: 5 + m_Name: EmailInput + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8577953651209467930 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5045421231128479223} + 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: 2364319422627657610} + 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_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &8630391446351500689 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6427513404366440442} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1001 &8737090446545054562 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 2198483992803733903} + m_Modifications: + - target: {fileID: 607308253010258378, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_Name + value: MessagePopup + objectReference: {fileID: 0} + - target: {fileID: 607308253010258378, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_Pivot.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_RootOrder + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchorMax.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchorMin.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_SizeDelta.x + value: 200 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_SizeDelta.y + value: 30 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchoredPosition.y + value: -15 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7859111590571459659, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_text + value: + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} +--- !u!224 &8737090446545054563 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + m_PrefabInstance: {fileID: 8737090446545054562} + m_PrefabAsset: {fileID: 0} +--- !u!114 &8737090446545054564 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 3421921267587625916, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + m_PrefabInstance: {fileID: 8737090446545054562} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ca9893608c30f46418c1a2d78b609df9, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &8750106440804939110 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3251032449294067148} + - component: {fileID: 3251968527161606064} + - component: {fileID: 380487859157681410} + - component: {fileID: 1459061464521247473} + m_Layer: 5 + m_Name: EmailButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &9122750164851673669 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2433697561466855871} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!225 &9144345594371459761 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9144345594371459775} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &9144345594371459774 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9144345594371459775} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eb6fa7d82312143d9b451ac5e7465a38, type: 3} + m_Name: + m_EditorClassIdentifier: + _start: 0.7 + _duration: 0.3 + _animationCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 2 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.77346337 + value: 1.1153979 + inSlope: -0.25566182 + outSlope: -0.25566182 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.7318018 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: -0.17961398 + outSlope: -0.17961398 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.6227655 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!1 &9144345594371459775 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2198483992803733903} + - component: {fileID: 9144345594371459776} + - component: {fileID: 9144345594371459761} + - component: {fileID: 9144345594371459774} + m_Layer: 5 + m_Name: SequenceLoginWindow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &9144345594371459776 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9144345594371459775} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a76f3494846944de2a0d1694eeb60856, type: 3} + m_Name: + m_EditorClassIdentifier: + _emailLoginButton: {fileID: 1459061464521247473} + _emailContinueButton: {fileID: 2325936309338030303} + _emailInput: {fileID: 1181566138228532167} + _walletText: {fileID: 148098788} + _loginState: {fileID: 320339275645968252} + _walletState: {fileID: 220577104} + _loadingOverlay: {fileID: 1084335994} + _messagePopup: {fileID: 8737090446545054564} diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity.meta b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity.meta new file mode 100644 index 00000000..d1d46568 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f5b54afb1350744a98ab2261e01ebff6 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs new file mode 100644 index 00000000..7e622cc3 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs @@ -0,0 +1,114 @@ +using Sequence.EcosystemWallet.Authentication; +using TMPro; +using UnityEngine; +using UnityEngine.UI; + +namespace Sequence.Boilerplates +{ + public class SequenceEcosystemWalletWindow : MonoBehaviour + { + [SerializeField] private Button _emailLoginButton; + [SerializeField] private Button _emailContinueButton; + [SerializeField] private TMP_InputField _emailInput; + [SerializeField] private TMP_Text _walletText; + [SerializeField] private GameObject _loginState; + [SerializeField] private GameObject _walletState; + [SerializeField] private GameObject _loadingOverlay; + [SerializeField] private MessagePopup _messagePopup; + + private SequenceEcosystemWalletLogin _login; + private SequenceEcosystemWalletLogin.SessionType _sessionType; + private string _curEmail; + + private void Start() + { + _login = new(Chain.TestnetArbitrumSepolia); + _emailInput.onValueChanged.AddListener(VerifyEmailInput); + _messagePopup.gameObject.SetActive(false); + _loadingOverlay.SetActive(false); + + OnSessionTypeChanged(0); + EnableWalletState(false); + EnableEmailButton(true); + + RecoverWalletFromStorage(); + } + + public async void SignInWithEmail() + { + SetLoading(true); + var wallet = await _login.SignInWithEmail(_curEmail, _sessionType); + ShowWallet(wallet, false); + } + + public async void SignInWithGoogle() + { + SetLoading(true); + var wallet = await _login.SignInWithGoogle(_sessionType); + ShowWallet(wallet, false); + } + + public async void SignInWithApple() + { + SetLoading(true); + var wallet = await _login.SignInWithApple(_sessionType); + ShowWallet(wallet, false); + } + + public void SignOut() + { + _login.SignOut(); + EnableWalletState(false); + } + + public void OnSessionTypeChanged(int index) + { + _sessionType = (SequenceEcosystemWalletLogin.SessionType)index; + } + + private void RecoverWalletFromStorage() + { + var wallet = _login.RecoverSessionFromStorage(); + ShowWallet(wallet, true); + } + + private void ShowWallet(SequenceEcosystemWallet wallet, bool recovered) + { + _walletText.text = wallet.Address; + EnableWalletState(true); + SetLoading(false); + + if (!recovered) + _messagePopup.Show("Session Created."); + } + + public void EnableWalletState(bool enable) + { + _loginState.SetActive(!enable); + _walletState.SetActive(enable); + } + + public void EnableEmailButton(bool enable) + { + _emailLoginButton.gameObject.SetActive(enable); + _emailInput.gameObject.SetActive(!enable); + } + + private void SetLoading(bool value) + { + _loadingOverlay.SetActive(value); + } + + private void VerifyEmailInput(string input) + { + _curEmail = input; + var parts = _curEmail.Split("@"); + var validEmail = _curEmail.Contains(".") && + parts.Length == 2 && + parts[0].Length > 1 && + parts[1].Length > 1; + + _emailContinueButton.interactable = validEmail; + } + } +} diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs.meta new file mode 100644 index 00000000..ccef2fa0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a76f3494846944de2a0d1694eeb60856 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs index 058f8c89..744828c0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs @@ -65,6 +65,11 @@ public SequenceEcosystemWallet RecoverSessionFromStorage() return new SequenceEcosystemWallet(new Address(walletAddress)); } + + public void SignOut() + { + _sessionStorage.Clear(); + } /// /// Create an implicit- or explicit session based on a given set of permissions. diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index f947b0d9..16241f9d 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -5,10 +5,13 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: - - enabled: 1 + - enabled: 0 path: Packages/xyz.0xsequence.waas-unity/Sequence/Samples/DemoScene/Demo.unity guid: d87896574aa4f42aab6b98685b555474 - enabled: 0 path: Assets/SequenceFrontend/Scenes/Tests.unity guid: 4dfb06a7c845a4513907bd9b1a335575 + - enabled: 1 + path: Packages/xyz.0xsequence.waas-unity/Sequence/Samples/Demo V3/DemoV3.unity + guid: f5b54afb1350744a98ab2261e01ebff6 m_configObjects: {} From 29feb3b6f5058059fbcc54d06d0f0e68fc32947e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 10 Jul 2025 16:18:33 +0200 Subject: [PATCH 098/165] ios build fixes, removed Nethereum.Web3 dll --- .../UnityServicesProjectConfiguration.json | 1 - ...nityServicesProjectConfiguration.json.meta | 7 ---- .../Editor/SignInWithApplePostprocessor.cs | 1 + .../Plugins/Nethereum/Nethereum.Web3.dll | Bin 33936 -> 0 bytes .../Plugins/Nethereum/Nethereum.Web3.dll.meta | 33 ------------------ .../Primitives/Common/BigInt.cs | 2 ++ .../Primitives/Common/Bytes.cs | 2 ++ .../Primitives/Payload/CallsDecoder.cs | 1 - .../Primitives/Permission/ParameterRule.cs | 3 +- .../Sessions/SessionCallSignature.cs | 2 +- .../EcosystemWallet/Utils/Erc6492Helper.cs | 25 ------------- .../SequenceSDK/Ethereum/Address/Address.cs | 2 ++ .../SequenceSDK/Utils/DictionaryExtensions.cs | 1 - ProjectSettings/ProjectSettings.asset | 4 +-- 14 files changed, 11 insertions(+), 73 deletions(-) delete mode 100644 Assets/StreamingAssets/UnityServicesProjectConfiguration.json delete mode 100644 Assets/StreamingAssets/UnityServicesProjectConfiguration.json.meta delete mode 100644 Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Web3.dll delete mode 100644 Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Web3.dll.meta diff --git a/Assets/StreamingAssets/UnityServicesProjectConfiguration.json b/Assets/StreamingAssets/UnityServicesProjectConfiguration.json deleted file mode 100644 index 34b3a441..00000000 --- a/Assets/StreamingAssets/UnityServicesProjectConfiguration.json +++ /dev/null @@ -1 +0,0 @@ -{"Keys":["com.unity.services.core.version"],"Values":[{"m_Value":"1.4.0","m_IsReadOnly":true}]} \ No newline at end of file diff --git a/Assets/StreamingAssets/UnityServicesProjectConfiguration.json.meta b/Assets/StreamingAssets/UnityServicesProjectConfiguration.json.meta deleted file mode 100644 index 0a939a75..00000000 --- a/Assets/StreamingAssets/UnityServicesProjectConfiguration.json.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 0c03aa341727243a1b8ec5e362407c52 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/Sequence-Unity/Editor/Editor/SignInWithApplePostprocessor.cs b/Packages/Sequence-Unity/Editor/Editor/SignInWithApplePostprocessor.cs index 11e18e23..d9d8d184 100644 --- a/Packages/Sequence-Unity/Editor/Editor/SignInWithApplePostprocessor.cs +++ b/Packages/Sequence-Unity/Editor/Editor/SignInWithApplePostprocessor.cs @@ -20,6 +20,7 @@ public static void OnPostProcessBuild(BuildTarget target, string path) // Adds entitlement depending on the Unity version used #if UNITY_2019_3_OR_NEWER + return; var project = new PBXProject(); project.ReadFromString(System.IO.File.ReadAllText(projectPath)); var manager = new ProjectCapabilityManager(projectPath, "Entitlements.entitlements", null, project.GetUnityMainTargetGuid()); diff --git a/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Web3.dll b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Web3.dll deleted file mode 100644 index bfcca1c8af494327af6b72389ebdfd08df355635..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33936 zcmeIb2V9fO(m1@&lSU1YP(%TPf`*>Z!3F{fN|RzmAwYyE5KMxKhyp4WY^d0s{2I5KnOA6`{M^f zn<2%YAOin6D1vNmn@UjMlLW-9WyeL|*8DacjGGZd0+L7F5dN3Ig2N(G9%9DyuH z5E>IN$d;!|-HnY695kw9!w`z37$`I%lAu$U+n^O>q!AKE8Z?Pk^pAHC33(K5h=|C0GrojLpkF*u+*8K<&N^w^x6=}dEwiN+_8yX5< zolg*Sm%BomB?m!lE4CT?;HL_K3{uwuSpDZ|iWav16^ z&USPGc#i2@LJRFd8_g)hB+VdxWXhWWPuLWj1A^dHrgIYzAqX(QLuv*=fC1i8GYDcw z3mr5?!9FHd0d+E+Z>#wX1yq$QcLWhPTZYxRNQ5Xy%f=qF<;{SlFo8^AbHJci8HGea zcbXyOL;un=lO?nOq>zL4!NA~)m`DgIXfzW7V!%)|hVo3I6X0@?FfdR+GjiEN7r>P; z>I|IuBAU!aXpI>U3EhBKXb$>#h%U4uDWec70h(E8Nm5o}1Cm-4f)&6YtQHr76)qY| z=z&#(Jv3?q_JCusZdhCl3c(jdH#8VhMj^BkQj0>c3+qy63-#2xFeUV?)72hyF?H;O zDPw@`^d>2z(1)bVLSK?v6#9{Luv$zAvkTjYDYborXzT~J+#fh@rfNbN0E8UYAOk!Y zpnez(Sei}Cp>{Sc3?>k)W;?H=>;w=rfr1 ze^R#<`V&Sr^wqzl(UZmwWy@P(TYc38L*5!w4Tl(jqwq*G#3>%E1ObMTmO&6;7;6~> z0R~sgAP6vE2u1Q@Wgs~H3VhMAT@5Mc1M41#pfItAOSgaKjTtYJC2F`Ah>%Y!sc zz^-G+!NUg5rRp+6+5#aD0idBnF&%~_U|zMuspk+FEKJfpn1Ege0$g056QN5$h=Gxb z=L(GmLW)1My1$eiAx|jA{#UzG8HpJ%A}|B@s4@yOU%;T^%C^GhpD=F=8Pq8tEN zA9F}PM<2$;Tn2tc)*Wgq!aAUJADUPLmA z0a^)R?6NK8C4lo;JeF`6MwmRNa5x}tt;u-87SU$R!Vx$fTndoKq=itCOKlcifVq4a zXE^4 zwqDe_nTu|{K-L<+V&ioD%0LUiuQ1D5$9jmJ1mCq8 z!nbL>N+HY1fCT`KAJEQgkTy+>M-HG5&;6$D6C*+)^#=N(9?)&Gcbb*k^Nx|q)hmNnWRl2kaFP5f-kIz2vn0}BRH6phuKBWxL5~t z1(5}74b?4UBbNRM6E-R(@Fs_AVuJnxF*efEn{31eD=|DwV75NS9SLkrU?AbY<@5#( zX9!Hxt2O{_gkMeIY|dmO1JskV#EgwLaYmRJpebyO%aFj7i&pb5aoLE$ZV09LMi>U8 z!4wbKnY$PmpfH{@&uVC$b@y)tQk6IxZkiDDkZRm(SAcNn#132=8V1=cK|=^=Hgb5MsZN@E_OR( z1LSAA#LNI4X8H0BP(v;Qe0ahD+Z<<%VXy(V?HJ$4$Q`+xZ!q*krpDd4Tyz~QaYqG4 z8w}a#rSW&JCwj&2#x+1)iRJT%u z#hzb4{J);yqlhQhg0C!5KJn*KHnysai~Y73pe344JbBLCk_W>OnUMjAXIL@JjWEtV z6ahH?XNnlc_fS5}2m?a3XJLwk%+Nf@dyDQtX+4;?Sn@ki`9L*849XNZ5LXc&bs!Wh zXF%DYNJ8QHP>!0SXk?Eb(+8O#%jiN;$dW)6Kznq8z`2a0kh?|yBvTB1bPiyt;bnjx z%v#`EG4B8z!*~cVnehxD&3p}TJ>vsFSH@R>;S7pJp*svVi;X66x`PMi8Mg!Y)Wi@t zkJw!Rw=|6b=x1aCl7|ovpgpnzcp2IMQmP*(zD^#OrO-}f!@%+hjC%bpP)e;c*AUD6 ztkZ`TD*y+esmPLU1GOmYs2CO#O|7GnSsZkzj>=;hqR$%Y0#(K`K`!6M}gX^$-Bs&#b}K7XsDZPQ`8t8)ljeXXE6lm ztcLockFU9|X{bQMSqyu0S3`vunnLTJsVS&|jhdi$n!Gn4*#v#lP(uvQu$mzF4?d+J zX$q39>!^#Yrl_l$LPzv#Sri`)l~ldX%f>}IRE9x0C911$guyf& z%F!gjVmDTJD;cZe@#w?rA5JnW^GNKU9?z1zHeswEnz$-_Qt zg^DzJnTG4BR%o;)5BsGxD%a$B8ukThrX~;jvkjWB$#dcoj>w4D*57 zuF1o_5{&j~^6nZG0d-uHhdtO9o!8_E3`YW0tI5Ou3_?jmOs9V%Ih!Ig} z7hW3SB*Eo02kMlD!gi2*h zB83(Mq>%^T)D+i(J;npbKwV&ShI26o^BIKC)bMrn{JS_GcB2%k(rK?6S3`A6d0@ZR z20Lg4g|v{3%weBc0dchg_MZ5AluIEqfNY4nM`8Ei1ke;#5DWtd3??vwz)l2qBTxd+ z0(N^?vLAu@1QruG8el^-10WmSBG8OF$`v3dGE$w$2rUK<8#&Q$Sz@$?YRPR0*0rEx z2uwl&^dr6u1=F=A1;80ij{uqdtO+QBo=H~#>`5u|1cmeDf^In#QZ>WeTr}qX|Bm#w+P3 zsBt9lN3+TSE@n-m%IQAT9Kc_2s{t1hd@Qq?nnw#^HK6Dmvx7*Vjx<~ic%m7G0RWdm zUHQ}+fa|F(1m8{IVFF)4E&0@Gf`0;^n4-&oZ-cVfLVW_w2o#fE2*8kjMOT;_(G&yA zf1-UjJX%ccq^;?EB9l)YG;KobGh{|W;B25hXm2Fuh0!fh5w{y1imuREv<=!z=K`L~ z8%1}byx8LaCh;eO<|=9i9ZBR9hrb10`N3#%_!qs0?0L}rJWeVIBe*h zwMI`t^B~?EfOu_7Cq7RneNj$qODB6LYp@*RAHXB@XyDs3(n(KQGnfW0j9^B0*ehF8 z3yr)O<KOSd~upVCkgChZ75DkXmL?vCIla1S5^TjCzHR8O&lh zkoHDG*_Dj3r0iHC??7yJAT~P?n|UzXCc_Q9F@Y8YS`%nbpd*1!1d0jtAuxczU;@Jk zOe9c7U^apM0MckFnhtOaKrT9sWg=K9t5VLPQdAl3IHn6UVsJY1i)d4)(a-J zNC+$@a2|oX3A{rfqOc_l0-F*TL|`z1DFjLgEF!R&z$yag5x9%M-2~nw@D_m-jWr7h zv?nl#z+eJ*(UmAzZy!AwWNreUr-vAoXsKQm3zynO;7tM%o9H1hh`O0~QQUfEsM3$5L>X-24FJYW{?jN6LM&XJ|+Mg0*{7K$OmYHECAXfD}Z*8Ps53#5tJ1Gq+x#A0^S55 zjmIlM2jI~#YMTPz6(9{asg3~MQFGvU0Hl!!;u{6g%?WT%kfmUJy8!MDvJ~QX;binn{Ou+Tg zEWq{A9KhXCd-MefsWwzAI+jkOtLf$RdfI{^WVB+0G9nq97|bH|oey+2=tbxi;~qd7 zlbX+QMiH2zshYSr}>}ty)pP* z?(84x-A~lR5UTq;WW?i(vR`c3K;(X|qZ_`&`$g^4h3&@Y|9j!s}vC$OUv%+gLU0y^O)vTsxclVRb|T4+vdr#(xnQl2a2i`k~CGQG&f70pDoQ%B`730O5n)k zIpLC=^eiG*r_!U~IbZ;-skt$?q@c2gEDJV`V z0Sqp7rIKvoJEZL&q;^yYc+Pc&-nkX*%iA2xUFp5_fj%zRAgLC24)(n!KG%nw5@PMoY4#zjNbdgZ{vcRmjt%N+lHj zy+o)qHSZ7X_{_}TWy2-PKXAiTe_$pmWWSe>l`3EgO0s^>NmTrS*-k2r&&$Yweu6Rf zdl{G=zcV#c={I-5IO{J}{9YhIABGymj=^393lToe+&Vw~dAyZ1QWYWXp17(AjDAODXtnV7|60 zwP-{R?ji7E2!>f%q>%~ozS5j{d7c9J@DAZ0`C&OqSm5LH((qh}S4mWPFw4@VItw2x znC_%&qA?%FWLQob#;}Ltq)O~uX%rNeWJpm$y^&g$)@#4#q}Rm;t!#btfzcoX)k++1 z$mGW}n~W)f^p<5w36iIjDhLummJr+kX_O=_QdkNW1_W)9bU^=gD*^(hV8dC-o9gxU)A?8eO7`*0YkDKyof4=iLaBPwnnN5m!+pmbLtCdb+v;wb%w)W=RGTO!<3Zm__M%umh^= z2Cdy8^4xrdEF)7VD^>!{4^}87`F|46&XwfoWW?p=sASnvYzNexD$A0obaJDl=`sl( zXyLFKkSfSHM9C6ZoOBuOr79S7vNXJC!N8QIkyhwR^v463Obr~~$kZT+W+(y+yrUkL zfNOR%37Ie~(;?*P%x~E6xVOv8A$t}wwQ+WoEKMO-%6qHa!v@04z5`;h$Jg557tpBq1t8TK_-@hSU`ku3jLdjAW$m1$N<5) z5aG!#wWBmG4R$7khc~$d(MBv%zK*DG0c=*KSvozFsFG#j&7%TVSAy4z;>F25Ju6F7 zX%@;;WT7Z&wp@{~-d<{Y{P%e9dn7=)vK*8M;T&cgYzJ^(qxMqOKZ%~C0h)L^h>T1W zFU!c0rbkLMBx(6Nu}wSh;-tMb+hTR&4)2vOja8r2|wr zoWsb(Cl~A<-IEN8h;0{-7aqL6ARR+spvih`rV(sYAYRL%t@#nzxmpv!x$ZcoY3WE= zPCpcqDN!IiIe(pmNbTl0GKmp3MF&lQSJE}4dJt<)Mi35E$;qkeV-kwcF)vDz1MyR# z9xwGLB`y1xIi+Q{m1RUg;KBtX@Z^LPOKKyS=A4B)^H&ybsCrlU2ch~xgM>`Sa(V)Apfe zG!u`-=A~vqcvUa1csRpqph}QKIF_Y*im*R_%L~brru9|kWot9wJo*bqy`z;Xv=V9B zGqNNGZtz9&8bG?jY(H108q6z8_9}c;sm?7;GBsUn@?oCp0DMy+M}I+%$Lf$^^Ga z}qQF-z z*`ctP#|2^fkTa1MCu0b28MTZEO%Ec8x^s2Ilcwun*#xcHy6})hQ4pu1VZqdPBVIgV zb3`_y2$sUIkdD%Pvhu12S389~8&2D>ib`=tZas<(s$Ws^e~Lf z-mb)y1gRjEqZ}wL2U>-s@O1-O6;c2$LD`7X?+r3pKq1>UAR~jPer`~g6eO@tT)Gv4 z`+1Kx#12g1(s>}!?4QZ&V@uQFA2MtM7{qxfiGZuN3t!!~ZOXhc(yV*?ZP)tVGOk)Q z6)^=ArNak*?jc|{}CNd;|(SnxuC9lT9U*&zcFg)Df*)_`&} zsgZ!T;3ZPLZhXY+sY94aj7%xY)(+&QAP&WOGJW`665zIg2`F5O%SS8$;uSlZiYO*g zlWm8%ToB-iC>CMlX&7b_u!vXeq_(fv2`r|$&;qV41D?xpxm+fPvSq>bJFnOWUe*K# z&b4K6SqNlUkZWecu`nyzLh+2?-3o&75l2K(lqoUK%tlWD#wJpHgoPdS)WSvMz;vKE zl!ci9jAyG8JxGZz2AgNfV8cTmHkW4W=^1FmNV8fIClLTs9N1C|)72sF+vWk5`<>D>n1zaP@emJR@Gw3|`S} zE*Fei2x^x?I!}{gdYpzH$17UND_X-V+JO5W+=ZQANUAO_))O$m!TH#4z|{W@0)TIyZ!`1Td>2R0_B~)) z_H*6oUQQ*DW&(zn(?EEL=>rcqeIOU+ojH69ahDYXD5fxAVW5wB=P|g9 z!6OWAVQ>$F>lnPl;1h#w%c9vd#{bgC6PgU#I&2)lV8JL-W5nksrWAt=f^Ix>7-&6z zrp+W4rka(EZ zczl|}5`lOyi5aj^aAC-TKe${Yf!azVSOIA~Th%j*Yb?^3Zv^WqtoX1nohR@zf!7JV zMc_RG9})PDz)u8zBTHAYF_bjGmBKOvRT>MJFjtH<6br!|)K^cxN9yF3I=QD#uB(%G z>f{qFbu^a&gMcZ7b}@tqe%lC*g4bKIeHdOQ@H&CF2)sw&BLbfh_=>=H1b$-aVH5Ny zc+84Fc6gvC(3V{klH6!{PTl1IoLS@ploZI}i2*@D&O@K5XQ6Cf3d)4ja?1N_tdMBd&A1;7go zaZaTWx}al8R+4W0oP4=sqSg=Y>zr0)MK!SU`OC8>vGAnQukjTY`FaT zxcFZxqkUva9vX|`nKQh(@GsP(drMRIycx`FcXOGq|B=kA1$x_<@2590hnN2S&bPH) zubTFt*VVxR=UlprJ0_}@-W=w6d*6t$lh0OW?R-AdK{0mnoxs;mM>KY*cIxfPteSH6 zu0^jiM?5R-=k`&VI8W{LEO+a`)v0C+>yXlwj()svFN{Y|Rl`2A|{gXoFX>eTu2fZZH(@AxX zOoG2wP*0KWOM<5jAeJSCYtp2g`e$-5(teS2&rMH7@!`RqKE6m}$N2UdJD{x=4kxE> zU~fF2+S1wm!_Aa>+dpGmP*3Y(Pg8U$xMNa;W@SaelRT8IOp`05QgR)MWqvq=_A{LUO9AQ(Z@(o23`22%MZo*h z(LhH4Y)5{{h2S?qFTUe#Lj8LzWN4G$>SJ9@_^OvqOsPMikWio%pGewiPCgNE#_0`# z9Df{0sRYQC09OeizWx+N1W*n0BPgZ7CVUQ(fmFsHG@TcG8)ZP)fZrqtg3SKH8<_&*l($)RO=;Cq#h zC;r~=C9pxH(9h+6^?tqYU7*G3&~jhsHGG=JDZC8~E%gDI2E8c;S_E%W1;7S04MwpK zU{d0#bRz3da?(LU1d@1OA&}Gq8-l@0O5(Fr@JK#*_#fMW$HE^zDeB*L8bL_>&*y)i z2gu(zqTzkdlE7hXedp5f(htTIhps9KQ~@iOrYNzA$e694QW{Q48BCgDAyE?Bz=cgQ zsS-b$Vpc_qB1Kj@921c~gM#0K&ZmozNc>A#reNAZyPn;@Cs;8#d1q3FtfJrdpSk&z z^=`S-n&gkdHsg}3N}B8wm9UP9N*L>_7&JxGrU}!}oIcmXx+0vPf5>dt$Qf9t#!|`% z>=__76zQ`WiA*-1PK+1ZiEJ=oz_+M-94vsipDS08XMW;vQ9GQ^;J2yIkAPPJRB%}* z(7h@Y#L40BSB1cJrurG2RG@iy2y&hxPm##Z${3)x*jMcDZe{H4qb9w*y+z&s z=L{>Mo9H?TI*n06n?NVi26PEcp>^fXoMG&YZ*ykfJh*Gqg8OZmLroT4P5yGe`^B)T zF9Qr;7QI=N-90Kl{!&%x@GfD3gYy%<9Gt&%%)uO=H}fs_c|_moFk)(i@sAxdE}6gI z-kkHiZKcaQ!%6JB-(-C0l5)lC>BFB4YsI~Lu^%to{;2V@_w6G#Rem~r&}!rGm>-*0 z%)F?~h!}CF^e?}lQ;wzQYB%i3PVIAk>A>x7@`z9OvdqoDnIAkWwe+h!nzOx^)3|S` zl@_iSSogP#_VlVwJ$Ug#T!!90_qUy0<`|AV_H^<3Ma!PBj$3zG7--0BZd0By$1T;( z!*0iwU4o-b>my!YM(>z@TT!L(*^z&1)-d_qY%BT1H?2@^Js6)~wQ>FJq)spXO7`E)zdz8ZqPzS4pl-rrCJwuvZq*;qbcX+; zjW$;fZWV02=yz$T-)g-(E&5%}Q8p@^p{TiA>eWrP!4eh3W*;c!U-`B#prn-pnwfHC z>y%xrPOjc7VrTG2Zd=DHS{o&zlQuUS)^mND^2MsA6)`Eo9e(F~ETmzEQq>8fI1v}7 zf~^Tf{a`X-vXzQVFwMs_OT>UgWQ!SGrX|z-(2z5IMmRS*Vm+P7X?`-+G$wP&e3294W3n`oK6-(f;h?@?)QV~!QR=0ygXmQi!BEIqX9bw#6-vsq6fTC1uu zd)({nDzzyY5`U%h<#ty2lfw3y`s&3wSsnFQ^m@oSnZp>n2{lUNV>TU@uU+Vlw}?W*Q+BQNY2b=_~w=$wpE zw(k!2topujd0^4ShSOSF`8El*TM>1B*!`CNf5nI%B`iI=k-68izhqlYgZ(ZI*6k`f zzp0|8SEr~ZU!Qhe_VCh_^$XpfO{#s+V6c6c>xpR}c4i-Md}h%AVeY}(Jpy~^o#_#M z2u)pgYnboqQUhs{>iy%VgZikdUUq!`VoLRj*w-VUT?`ZrJN%`v%Z__@J_aATm%eIU z_0z6TN6b9-V$0(DVyCu<(TAXO6*LiT$N>HupFOd}q9!dg_41_vqsnSC!4aYWacubpIB~$Ba(->`+-V7VTdaIbY&i(%SZo%l2tKuXY^R!tGs)7b#62 zzI$re)VE^w^xiw;&lYT!b#R{ATefe?fw##yE2a+|Rm4u3zxLUDQ3?CKsDxRoUeEbn zh;cnR_+Uui8Nq9NK*$B^mr*0?{_id6E+QxOlHNpTNe|U5=F)UQNW368CPWYtEP!Pj zui8E$A5T9q052a{wK3@hv5Jr)l}_F5+lsA37Ff3)pBpV#s4@i!`8iUhEL|$L6q(}; z4&PXv5ub_Q=2eQVAsmwUW2(M9h|iV4!+AkuLZ~*2!T&8wR6@|A4_urici*@Yk0#&g2viiN|>{>v-|kD z&RsZLK3+&Izw6Us(-(tIV@&L$7Vq8QwBF9XLz~kbAKdoolyqWy*uWpPcD`-}8$0&U zJKZ*IW4|E^8~&vJ??O;zU+y5cZ?g{@_F#TK&K@Efeez&9Z~VN=6OS$HxS2EIjyRpu z?x~}<)%36PmsYkYp3_pWVT57IovOkmb2>HUb(r7YC9spz$8e7cpPI~hwdg!E$o-XN zpNjY=3!j?4PRa{jkt96bzeePo|K^%9eobee1sg+cAH8lcB+A@@LT`jKT7 z2EsQ_Yz~-zUZ0+_mZ$h?&KfU1efie)-IHe|^cdv!{mz3T@wkNGwfh&PwHi0A!Ls&;wuT^T zAu@sR@_2qkfGb9XP1m)=F~yc0aU4BG5upIoJ0WR0pds-9U;<$@7=Xyr9g2vG7iybCQOx4$qT&isx|SoN zOS}GUwXm~N{`(cHL~eDpP^I>oTI4xWd73i!mj+^%s5f?qfSD}nDeA;F(zrfySRqA; zf<+dXvdoQI&{pF^6rYc*c$7W{~8^Ly1clv50-@*~>UAO1=-8E%b>gs0G zns=+Iz9(!mF~~T_G4ZK)_}a9|3@duP!$tY)S*7%_QP)=-UB!u+I%V*r{o&0$Ys<%6 z`RjG<=0i;+U;fYn-6}m`z_Nh@XD5;;yc` zvY}$}++7__jmpEvcHY3XzUQ0gcObMR*>+-!thMjItRHuF~ zw)8Oe4%$^2S+%m+3ZLz3rYWeE< z**x<(Zw9ydPvrYg&|@eEN5zL$1_)- zA00)mS((4=mqckg=dOR@8qZtg3Hv&@#&fCLx(Xt6&wTI}vH-vL4Q~?*V&UiqS9W4@ z_!Gk&otN0pOYGx`4}ZQo9py=dmXg9`M_Xx`<0J=Qia zG+7=UxqvTz6;?BD*!*E@0xl`v+j^|k8#N>Kb#&g=sUux?>`9e(^*PS7D7%;0^?i%r zJ1ws5^s%1R_0p9YlNYvY+4=JRs<{2OeZ5B(o6ebh;{4@xZ7y#7UcG->CwX3z>4LE3 z%|_4J(lxk!(xTU;*=0GV9UfIIYFpfke{1TBg(VGEKmIX1HLBWpc;1D-`hNfMI^b2u z=>1(c8PDHP$er%dM6bc%y*Hg!D%Q;3*=XtV4=yVT7B@Im@Z)W>tvzS7Iejg#cbh(y zDRG1OU$O;XjlYcYd%h(p@UUB1b%lLMTr#R=Uy8zGf^Wn3i$&a>O+9%GX5rfKk-Jw?kS-i-8l_MyMwjivi~O3hfTo)a#uZ}Q!@Z>xS% z?GclU?`eNNRKm^N?>BArS95nghJJpz&q-DL3U3_=kY0iT1KBD`gTwJIzQzps~ zNvqPTB&ErJcL@92(<)4SIHYQ(K438U0pjVeKDMsX?nm&kb)KkrjwoBpfn%%WZ|nd2 z;Qdc6__xomKR@muH>w$K{yi(!88;bi>wN7@-$P42mvcW%oOL~ZZQ94!ni3n;u?1In z(Z{w8^-7#pXf%9EK%2JL%8n1&6m_=p?%c&Kj;a>7d|9@!>-IzAmMq^D^juZ5cl2D< zhv7{hE#^m+7LVv+^FCfU@z!6f12?(4u8#K)?$T|8k;DDdZ{K+Du0+gHIk%%L61ImL zKVwJSwfa`xqUC_I!^RtK`7%(jZ2HWCcLtAL7Y}r_D6<$uKM?m$$k^}J;`HDkVbT2C zU5D?8p5o+M05xbo6^?(4T9^%KXwmD#JOz@N5K7(2f_!8y6&cH_y# zLTRU!MF!7CbRTl~M8cVz8Qy{zGv57Xlb#O$YJPX}^$SMF3fj;Q=9Ub(_sJv2|J2#N zb9R4@EN#r&{2|tP>5MyV{d-6~9jc9@Hm$rkKWt3;G9zKiEWw~@`m%!X#yJxT;4{bDvF^Jg(2FlpEvo_MSM5Z1+hfaOk+q@=f!t(xYQJjnrcSXVk9PPr zbVATcI@&wuhI2?^dT8UT#*>=jeI;s5OKXA;$jlwFFYjsZwdQ<7kbye+_lG|tuRko?m|9UX+IPh>#@UIoBkvdn#<~5E zFgHF8(hHtdG~iClja!{I(eLkhbZ^A@Pb(%~>U?)V zj&Jp4&YSdZHH8QH&eh1S`ZM|F=nE%PInd8vNun+I= zBsTPK2_iE z=m|sTm-USAcyfQkfy~TPmMgc<^{v_ZzGP__>(aY5BOeER^KL8uz!`DC{N<6ah5nN+ z&M>Q_!j7Mh$rw7iOF@9=qwt{$y}OCECDuWWPpuxk_tx+q6*BwI*L-*O^^R6WY+3tb zc)VWl>cEu;NBvg22>Z)Dh}EF03l;rscV)=N%|xhV*L@bP0pQpqi_8nyTdPMt=i`o|rH*1O-9g3Uy-nIHx_0)kzFDF0v#-Fm%cTW7vPTRh9 zG7lZmncleT*q6d+i>MpM$z>QL@| zPO30@deq1~W}o}sa@VL(`P`T^nrH6#-gy4yFM$cSHoR@xYw`MJn->+2w^%f0qbIuX zHgrl^cmKtr4afcU8eWX}T6XF2pqX#N_Xqd~EEhEiy_gmE_57q#lV_VZ@2aW(+|k$i zOM>FYT zy+xJK#9-O?mR`GWSXQSFuHA8>cJ!$%ufJjhXEw5neLKAo?GsF^&9JdF8WgwBF06TC zVtm{o`cy&n*^BVbLc``)1PA!XqZ>HadWf!x*cmH>#J5z2@vUb>_u6vkU6VlDyU)go zK8y|-`a;;KkM(r_{1ypzH+Hx7D!ApMzs~+Kb^d(EX|0=F8`Ir*-;go4svDq@~F>ZikmP6Q7x_Ke`utCIjGOU!1)W8 zx4rQ`Z2uceW1)O?!HI0ELuR_04R~_NETM|rf~G7S+#Cipn#Z7<;|C8t@3J;IDKICkNnlW zmiG93l=H!FSvZF7#Y@IKXJU7hDD90>>hq->bDa25XRC8ujBhxY^bGHEs}(14(Mw= z&aX@^aBJ}Lh2?^f?B;ErSIBOfcnwk9S>X6(`}Wnr1BbAy?*Eu--lyT|b{iWPRl4rv z${%=Sn&cI$7;W38*frQS_kG2VinU&&c)NRC{NTH{$MhP9t?Pyl+i>KQ&6~4hGLs(r z+PZ#EuHE>&Pv-d$#{IzYDSemp`qJ!)OVd+V3ZmQP1)Y=LF5Lf6+~3HmiFebs?NSze zDO&n*SL;{DUwu68=U{QhW=7MK^GeLuib~8^)%7cbL5WMuVb^Frv#xjXi(cksz#0jE z%Jlaay-KJ)Y(woBfnT0fl~CQFZxi96bSD_s8r8$Q88E0nyy>-}%|{P!!Sda`-p2B;1y8HS1b{8>=XzFcM z@uLOB_eI5be!d#wi_9Q+!6SKtF7U@M;C=`Gwu0D{gl%{n&xwNH<1fg zW5{>Vxj|CEA79By7sSAu?&NhbcyKSvhCc_8E^aPzREyi?s2}wU65`_pVe!#{-T~rZ zH<3@6$SpL$+fR(2`;wa}*LuC`A8rfacTs`__$w>;2N&?ybKqvGE-F@)m^i_wT#@l)yHR+8>k>uwt`@5I&;BcV! znbSY?nNsUA^J3DNy zc{=#$DBkh|DR<6=Qr{(828Ne2I~1tI>-JSGjv8ZQ^uTQOnKerW&+Zd2e6r8MfV=H> z$81}6!)U;af!Uq=Ch2wfl)m7uaGsB$rQG}7Z0pp7mhN+I-%akSu$La9Yv!(~_WNXZ z>yz`Au(=J>gbS|h<0K z)wYi}iR$vD;tbWwuxuD?P zzA~Q|rN7VZCrY=sI>;TZpEk~CtM#4Q`@2VM zF?*xxG5F~H<5vcZcviW6gx7|qFjf1k*tBoQ-n$9?n{O}7-7t3frphy=P38^k)1_~U z<)S0DH*YIqCcHjqogCRe68&H zn6f=xhgE(YvbWvnZ_!DL{`Qg`FIrYd`rVyjoHZ+c@-Ta=*HyCow~egYzj_qfH?`UF z@hP&^jL+%!Uv8*4e0AWFYhByCe>}FfmC4y|Z@LKiizarLw~V11-?D2UUAI(Jtukz0 zo%tr}PTYZ{0VS~qnsIDTPW*w4a^E#iS^i^r+U7eYCoVqvJRwSXKU1LZ)M;0nDt zI0wD+u)mraPVI|bQapV8=(aAW2hCdD?eGxC(o0zl3KnIeo;@H6&xI&FQYQ*WS0CWE z7VlNzpVGk(M1GCJ{|&)T{nnx#~$f#Lw@OvDP>!;^s_5! zAA}Y1A2r*5YmL$P;%4!iIzB7kU31rM*!0wfC)sVgUrvZpP+14)P4ni@X|XDM;_1xU z8=h?U3jU$o)NtOzM3WxEm%Y6^kLzFlx>?)VeKt+>Dc^TZlDFtEyVj#|?#p?*XB9sh zwD8!Y z_thb?UOu0%+=BoA!pE?EqU)9Ez1(kn9@F}E!iiH4+wE<;**$chrz)AlZ*ua(p;BQ# z&W)wBPCgj@E`Mmw`yH)gzNNP6KKl4rc1;V3@1^fnxz|)HCO0}4#|Y1z7u)&RhldGc zdotD~=55GLJbEjW$h4}}L+bwGh07*Xir=n#pAg?7qlK%@^g_eH*xMa1O;1@llmD4}!N=a( zN!7Z#>f+YG)S(q;#b>>`HXT1|#<6}+9!XEVmz9n;m2`>A$qR}a?Yi{#kH32Ln||n_ z-$%pcyL(y`bZh;YHA0ZvZvE?aje5*5KI8v@`Dz5^{4K)ivbUr|NXcL?hkmB~%aPYV zh=<0Ue0I68eBcZZ;bA46`)K%`=&|q2C$_n8Hc^@rU~6PIeh{w$xpYl*UHm+}l`Wrr zVAO#cyG;xItAjNmpE?Rhl!H2NQocO6b(m^dhcjXZ7@v#CEu{45-s z8#AS%G?An#xvFPrkH5W*`sIpDz3s<0V)6JH6yEx4x3NHKpG&E)!t!X+A9Ey|ViKAt_`)zgLRGsks3nX)xxr{Mff zZz=|bUR%<{dh%t*aZL}mFyGo@>AgwEY8xrg%_#Gk!nE7ndLLdNe${||XyTaxQm=2L zcx~5N=I&gy`QFlRbomCK4(>e>FYl zM9cA&MpMf+pA8O*ZZ&Q3;blFVnOgUXUE^;#?rgiK=abjP87~@jwb$Dix@-Tc<#)5! zeM{}obkAuHU zwpX+14-nnGePv36k0}nH#t$4&b%{|OY}%$IJUFgTm_@tl9usSu`6Y~>)ZMmsqtlD5 zN4$Na;yyjP?RD|t)W)_Or~hC+U%SSl!4S*ah2JbQjGDab;W=%*>4p3cPuq=3a=Y*P zT(&XQ=Egn?JI8!+3F936LhKa2T^sn{aMr|^Y!LT<-v#JivXxM7qK0*MD{!f1{L}5p zZ?|fnM0zw)uLZL4z+ij}sMN*HJ)wh>MSlijRnj z4~mMbm;(9Q#b;j#S++H`-~2xWIlaGIzIRJ_%8|1%VLP_{nA*WgG*~2E01MZD`8oX0 zzJXiAs>GSAocH?Q`0+B$ec+KPRh{0i_%Zr+>dk3`9S>|tdDByOV#8lFV3xrD{(Zo# zJ9qds`^&!tq?uRV810(qP<&}_^Ce&6-EKy7HQ}yX*t}$q_(k~S_9X+3ly`BNmio3N zxKYRVlV0XSHQ{mjTK&PZ6m#Ac)ZWIyAi&uvs?0yi?bq@yuBXfvN2&6<8dpeqfh(1 zIGTQVqVs3g<(y|cdF=Eh4X4hWpz7@!^uoBc&wW*1=Yq1;K1Yt++GLTtukzu+9{bu< z%__Mb630Jwo1W#ldCrZ new BigInt(value); } + [Preserve] public class BigIntConverter : JsonConverter { public override void WriteJson(JsonWriter writer, BigInt value, JsonSerializer serializer) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs index cff0936f..7f66e994 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs @@ -1,6 +1,7 @@ using System; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives.Common { @@ -18,6 +19,7 @@ public Bytes(byte[] data) public static implicit operator Bytes(byte[] data) => new Bytes(data); } + [Preserve] public class BytesConverter : JsonConverter { public override void WriteJson(JsonWriter writer, Bytes value, JsonSerializer serializer) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsDecoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsDecoder.cs index a64ef429..970818c2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsDecoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsDecoder.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Numerics; using Sequence.Utils; -using UnityEditor.IMGUI.Controls; namespace Sequence.EcosystemWallet.Primitives { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs index ff92cab6..b9785702 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs @@ -2,9 +2,8 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; +using Newtonsoft.Json; using Sequence.Utils; -using Unity.Plastic.Newtonsoft.Json; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs index 02d4d75f..7f855c1f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs @@ -2,8 +2,8 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; +using Newtonsoft.Json; using Sequence.Utils; -using Unity.Plastic.Newtonsoft.Json; using UnityEngine; namespace Sequence.EcosystemWallet.Primitives diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs index c47f3001..7bafae3c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs @@ -4,7 +4,6 @@ using Nethereum.ABI.FunctionEncoding; using Nethereum.ABI.Model; using Nethereum.Hex.HexConvertors.Extensions; -using Nethereum.Web3; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; @@ -89,29 +88,5 @@ public static (byte[] Signature, Erc6492 Erc6492) Decode(byte[] signature) return (signature, null); } - - public static async Task IsValidAsync( - string address, - string messageHash, - string encodedSignature, - Web3 web3) - { - /*var encoder = new ABIEncode(); - var calldata = encoder.GetABIEncoded( - new ABIValue("address", address), - new ABIValue("bytes32", messageHash.HexToByteArray()), - new ABIValue("bytes", encodedSignature.HexToByteArray()) - ).ToHex(); - - var fullData = DeployCode + calldata[2..]; - - var result = await .Transactions.Call.SendRequestAsync(new Nethereum.RPC.Eth.DTOs.CallInput - { - Data = fullData, - To = null // To is null for `eth_call` with deploy bytecode - }, Nethereum.RPC.Eth.DTOs.BlockParameter.CreateLatest());*/ - - return Convert.ToInt32("result", 16) == 1; - } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs index e3f46d5f..2205b3b5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs @@ -1,6 +1,7 @@ using System; using Newtonsoft.Json; using Sequence.Utils; +using UnityEngine.Scripting; namespace Sequence { @@ -62,6 +63,7 @@ public override int GetHashCode() } } + [Preserve] public class AddressJsonConverter : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs index 93eea371..07e9c2ac 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using Unity.Plastic.Newtonsoft.Json; namespace Sequence.Utils { diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 94a3a262..176c18aa 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -159,12 +159,12 @@ PlayerSettings: applicationIdentifier: Android: com.HorizonGames.demounitygame Standalone: com.HorizonGames.demo-unity-game - iPhone: com.HorizonGames.demo-unity-game + iPhone: com.HorizonGames.demo-unity-game2 buildNumber: Standalone: 0 iPhone: 0 tvOS: 0 - overrideDefaultApplicationIdentifier: 0 + overrideDefaultApplicationIdentifier: 1 AndroidBundleVersionCode: 1 AndroidMinSdkVersion: 22 AndroidTargetSdkVersion: 34 From 9b51b938aa7d11839c926fbb18f32b7733d71a3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 10 Jul 2025 18:50:10 +0200 Subject: [PATCH 099/165] started adding browser interfaces --- .../Plugins/iOS/WebViewPlugin.mm | 39 +++++++++++++++++++ .../Plugins/iOS/WebViewPlugin.mm.meta | 3 ++ .../SequenceEcosystemWalletLogin.cs | 7 ++-- .../SequenceSDK/EcosystemWallet/Browser.meta | 3 ++ .../EcosystemWallet/Browser/BrowserFactory.cs | 14 +++++++ .../Browser/BrowserFactory.cs.meta | 3 ++ .../EcosystemWallet/Browser/IBrowser.cs | 7 ++++ .../EcosystemWallet/Browser/IBrowser.cs.meta | 3 ++ .../EcosystemWallet/Browser/IosBrowser.cs | 37 ++++++++++++++++++ .../Browser/IosBrowser.cs.meta | 3 ++ .../EcosystemWallet/Browser/WebBrowser.cs | 12 ++++++ .../Browser/WebBrowser.cs.meta | 3 ++ 12 files changed, 130 insertions(+), 4 deletions(-) create mode 100644 Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm create mode 100644 Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/BrowserFactory.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/BrowserFactory.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IBrowser.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IBrowser.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IosBrowser.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IosBrowser.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/WebBrowser.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/WebBrowser.cs.meta diff --git a/Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm b/Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm new file mode 100644 index 00000000..974b4a36 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm @@ -0,0 +1,39 @@ +#import +#import + +static WKWebView* webView = nil; + +extern "C" { + void _ShowWebView(const char* url, float x, float y, float width, float height) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (webView == nil) { + WKWebViewConfiguration* config = [[WKWebViewConfiguration alloc] init]; + webView = [[WKWebView alloc] initWithFrame:CGRectMake(x, y, width, height) configuration:config]; + + UIViewController* rootVC = [UIApplication sharedApplication].keyWindow.rootViewController; + [rootVC.view addSubview:webView]; + } + + NSString* nsUrl = [NSString stringWithUTF8String:url]; + [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:nsUrl]]]; + webView.hidden = NO; + }); + } + + void _HideWebView() { + dispatch_async(dispatch_get_main_queue(), ^{ + if (webView != nil) { + webView.hidden = YES; + } + }); + } + + void _RemoveWebView() { + dispatch_async(dispatch_get_main_queue(), ^{ + if (webView != nil) { + [webView removeFromSuperview]; + webView = nil; + } + }); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm.meta b/Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm.meta new file mode 100644 index 00000000..8fbda80d --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cfcb79edfd4845a2948a3fbe1b18b95c +timeCreated: 1752157684 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs index 744828c0..8be62fa9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs @@ -7,6 +7,7 @@ using System.Web; using Nethereum.Util; using Newtonsoft.Json; +using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; using Sequence.Wallet; @@ -95,8 +96,8 @@ private async Task CreateNewSession(SessionPermissions var action = isImplicitSession ? "addImplicitSession" : "addExplicitSession"; var url = ConstructWalletUrl(action, payload, "/request/connect"); - - Application.OpenURL(url); + + BrowserFactory.CreateBrowser().Show(url); var editorServer = new EditorServer(); var response = await editorServer.WaitForResponse("localhost", 8080); @@ -124,8 +125,6 @@ private async Task CreateNewSession(SessionPermissions var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(encodedResponsePayload)); var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); - Debug.Log($"Done: {responsePayload.walletAddress}, {responsePayload.email}, {responsePayload.loginMethod}"); - if (responsePayload.attestation != null) Debug.Log($"Attestation approvedSigner: {responsePayload.attestation.approvedSigner}"); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser.meta new file mode 100644 index 00000000..f1c55197 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0db2f410f0c142d19748e0300d350821 +timeCreated: 1752157730 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/BrowserFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/BrowserFactory.cs new file mode 100644 index 00000000..b5d58c8b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/BrowserFactory.cs @@ -0,0 +1,14 @@ +namespace Sequence.EcosystemWallet.Browser +{ + public static class BrowserFactory + { + public static IBrowser CreateBrowser() + { +#if UNITY_IOS && !UNITY_EDITOR + return new IosBrowser(); +#else + return new WebBrowser(); +#endif + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/BrowserFactory.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/BrowserFactory.cs.meta new file mode 100644 index 00000000..c4455a79 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/BrowserFactory.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1d11c766a0a24e5daddaeb40f267f683 +timeCreated: 1752157840 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IBrowser.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IBrowser.cs new file mode 100644 index 00000000..c1c22b52 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IBrowser.cs @@ -0,0 +1,7 @@ +namespace Sequence.EcosystemWallet.Browser +{ + public interface IBrowser + { + void Show(string url); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IBrowser.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IBrowser.cs.meta new file mode 100644 index 00000000..dd87d68d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IBrowser.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7d5c85d8eb234d71b36d9ad453a7e94f +timeCreated: 1752157760 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IosBrowser.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IosBrowser.cs new file mode 100644 index 00000000..6b5c0320 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IosBrowser.cs @@ -0,0 +1,37 @@ +using System.Runtime.InteropServices; + +namespace Sequence.EcosystemWallet.Browser +{ + internal class IosBrowser : IBrowser + { +#if UNITY_IOS && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void _ShowWebView(string url, float x, float y, float width, float height); + + [DllImport("__Internal")] + private static extern void _HideWebView(); + + [DllImport("__Internal")] + private static extern void _RemoveWebView(); +#else + private static void _ShowWebView(string url, float x, float y, float width, float height) { } + private static void _HideWebView() { } + private static void _RemoveWebView() { } +#endif + + public void Show(string url) + { + _ShowWebView(url, 0, 0, 375, 667); + } + + public void Hide() + { + _HideWebView(); + } + + public void Remove() + { + _RemoveWebView(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IosBrowser.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IosBrowser.cs.meta new file mode 100644 index 00000000..059b72af --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IosBrowser.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 02d16bae74704866a1645c63b3b32c26 +timeCreated: 1752157738 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/WebBrowser.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/WebBrowser.cs new file mode 100644 index 00000000..2d388257 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/WebBrowser.cs @@ -0,0 +1,12 @@ +using UnityEngine; + +namespace Sequence.EcosystemWallet.Browser +{ + public class WebBrowser : IBrowser + { + public void Show(string url) + { + Application.OpenURL(url); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/WebBrowser.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/WebBrowser.cs.meta new file mode 100644 index 00000000..d4bcbfc0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/WebBrowser.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 43a2986b9f524e6fb8c55a73b781ed0a +timeCreated: 1752157929 \ No newline at end of file From ffb4d77b2adf6fb5dc92d400a264f34f47f6f092 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 11 Jul 2025 08:47:02 +0200 Subject: [PATCH 100/165] added v3 react template --- Assets/WebGLTemplates/SequenceReactV3.meta | 8 + .../WebGLTemplates/SequenceReactV3/index.html | 13 + .../SequenceReactV3/index.html.meta | 7 + .../SequenceReactV3/node_modules.meta | 8 + .../SequenceReactV3/package-lock.json | 2061 +++++++++++++++++ .../SequenceReactV3/package-lock.json.meta | 7 + .../SequenceReactV3/package.json | 25 + .../SequenceReactV3/package.json.meta | 7 + .../WebGLTemplates/SequenceReactV3/src.meta | 8 + .../SequenceReactV3/src/App.css | 61 + .../SequenceReactV3/src/App.css.meta | 7 + .../SequenceReactV3/src/App.tsx | 106 + .../SequenceReactV3/src/App.tsx.meta | 7 + .../SequenceReactV3/src/index.css | 68 + .../SequenceReactV3/src/index.css.meta | 7 + .../SequenceReactV3/src/main.tsx | 10 + .../SequenceReactV3/src/main.tsx.meta | 7 + .../SequenceReactV3/src/vite-env.d.ts | 1 + .../SequenceReactV3/src/vite-env.d.ts.meta | 7 + .../SequenceReactV3/tsconfig.json | 25 + .../SequenceReactV3/tsconfig.json.meta | 7 + .../SequenceReactV3/tsconfig.node.json | 11 + .../SequenceReactV3/tsconfig.node.json.meta | 7 + .../SequenceReactV3/vite.config.ts | 24 + .../SequenceReactV3/vite.config.ts.meta | 7 + .../Plugins/Web/SocialSignIn.jslib | 4 + .../SequenceEcosystemWalletWindow.cs | 44 +- .../Authentication/EditorServer.cs | 42 - .../Authentication/EditorServer.cs.meta | 3 - .../SequenceEcosystemWalletLogin.cs | 40 +- .../EcosystemWallet/Browser/BrowserFactory.cs | 14 - .../EcosystemWallet/Browser/IBrowser.cs | 7 - .../EcosystemWallet/Browser/WebBrowser.cs | 12 - .../{Browser.meta => RedirectHandler.meta} | 0 .../RedirectHandler/BrowserRedirectHandler.cs | 51 + .../BrowserRedirectHandler.cs.meta | 3 + .../RedirectHandler/IRedirectHandler.cs | 11 + .../IRedirectHandler.cs.meta} | 0 .../IosRedirectHandler.cs} | 8 +- .../IosRedirectHandler.cs.meta} | 0 .../LocalhostRedirectHandler.cs | 50 + .../LocalhostRedirectHandler.cs.meta} | 0 .../RedirectHandler/NativeReceiver.cs | 33 + .../RedirectHandler/NativeReceiver.cs.meta | 3 + .../RedirectHandler/RedirectFactory.cs | 16 + .../RedirectFactory.cs.meta} | 0 .../WebGLTemplates/SequenceReactV3.meta | 8 + .../WebGLTemplates/SequenceReactV3/index.html | 13 + .../SequenceReactV3/index.html.meta | 7 + .../SequenceReactV3/node_modules.meta | 8 + .../SequenceReactV3/package-lock.json | 2061 +++++++++++++++++ .../SequenceReactV3/package-lock.json.meta | 7 + .../SequenceReactV3/package.json | 25 + .../SequenceReactV3/package.json.meta | 7 + .../WebGLTemplates/SequenceReactV3/src.meta | 8 + .../SequenceReactV3/src/App.css | 61 + .../SequenceReactV3/src/App.css.meta | 7 + .../SequenceReactV3/src/App.tsx | 106 + .../SequenceReactV3/src/App.tsx.meta | 7 + .../SequenceReactV3/src/index.css | 68 + .../SequenceReactV3/src/index.css.meta | 7 + .../SequenceReactV3/src/main.tsx | 10 + .../SequenceReactV3/src/main.tsx.meta | 7 + .../SequenceReactV3/src/vite-env.d.ts | 1 + .../SequenceReactV3/src/vite-env.d.ts.meta | 7 + .../SequenceReactV3/tsconfig.json | 25 + .../SequenceReactV3/tsconfig.json.meta | 7 + .../SequenceReactV3/tsconfig.node.json | 11 + .../SequenceReactV3/tsconfig.node.json.meta | 7 + .../SequenceReactV3/vite.config.ts | 24 + .../SequenceReactV3/vite.config.ts.meta | 7 + ProjectSettings/ProjectSettings.asset | 2 +- 72 files changed, 5234 insertions(+), 121 deletions(-) create mode 100644 Assets/WebGLTemplates/SequenceReactV3.meta create mode 100644 Assets/WebGLTemplates/SequenceReactV3/index.html create mode 100644 Assets/WebGLTemplates/SequenceReactV3/index.html.meta create mode 100644 Assets/WebGLTemplates/SequenceReactV3/node_modules.meta create mode 100644 Assets/WebGLTemplates/SequenceReactV3/package-lock.json create mode 100644 Assets/WebGLTemplates/SequenceReactV3/package-lock.json.meta create mode 100644 Assets/WebGLTemplates/SequenceReactV3/package.json create mode 100644 Assets/WebGLTemplates/SequenceReactV3/package.json.meta create mode 100644 Assets/WebGLTemplates/SequenceReactV3/src.meta create mode 100644 Assets/WebGLTemplates/SequenceReactV3/src/App.css create mode 100644 Assets/WebGLTemplates/SequenceReactV3/src/App.css.meta create mode 100644 Assets/WebGLTemplates/SequenceReactV3/src/App.tsx create mode 100644 Assets/WebGLTemplates/SequenceReactV3/src/App.tsx.meta create mode 100644 Assets/WebGLTemplates/SequenceReactV3/src/index.css create mode 100644 Assets/WebGLTemplates/SequenceReactV3/src/index.css.meta create mode 100644 Assets/WebGLTemplates/SequenceReactV3/src/main.tsx create mode 100644 Assets/WebGLTemplates/SequenceReactV3/src/main.tsx.meta create mode 100644 Assets/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts create mode 100644 Assets/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts.meta create mode 100644 Assets/WebGLTemplates/SequenceReactV3/tsconfig.json create mode 100644 Assets/WebGLTemplates/SequenceReactV3/tsconfig.json.meta create mode 100644 Assets/WebGLTemplates/SequenceReactV3/tsconfig.node.json create mode 100644 Assets/WebGLTemplates/SequenceReactV3/tsconfig.node.json.meta create mode 100644 Assets/WebGLTemplates/SequenceReactV3/vite.config.ts create mode 100644 Assets/WebGLTemplates/SequenceReactV3/vite.config.ts.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/BrowserFactory.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IBrowser.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/WebBrowser.cs rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Browser.meta => RedirectHandler.meta} (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Browser/IBrowser.cs.meta => RedirectHandler/IRedirectHandler.cs.meta} (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Browser/IosBrowser.cs => RedirectHandler/IosRedirectHandler.cs} (69%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Browser/IosBrowser.cs.meta => RedirectHandler/IosRedirectHandler.cs.meta} (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Browser/WebBrowser.cs.meta => RedirectHandler/LocalhostRedirectHandler.cs.meta} (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Browser/BrowserFactory.cs.meta => RedirectHandler/RedirectFactory.cs.meta} (100%) create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3.meta create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/index.html create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/index.html.meta create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/node_modules.meta create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package-lock.json create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package-lock.json.meta create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package.json create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package.json.meta create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src.meta create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.css create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.css.meta create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.tsx create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.tsx.meta create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/index.css create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/index.css.meta create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/main.tsx create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/main.tsx.meta create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts.meta create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.json create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.json.meta create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.node.json create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.node.json.meta create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/vite.config.ts create mode 100644 Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/vite.config.ts.meta diff --git a/Assets/WebGLTemplates/SequenceReactV3.meta b/Assets/WebGLTemplates/SequenceReactV3.meta new file mode 100644 index 00000000..8d27c1b6 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 92c81bcfb352c4d0fb6f6245e30aa8fd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/SequenceReactV3/index.html b/Assets/WebGLTemplates/SequenceReactV3/index.html new file mode 100644 index 00000000..fa6c989d --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/index.html @@ -0,0 +1,13 @@ + + + + + + + Sequence Unity Demo + + +
+ + + diff --git a/Assets/WebGLTemplates/SequenceReactV3/index.html.meta b/Assets/WebGLTemplates/SequenceReactV3/index.html.meta new file mode 100644 index 00000000..be02735b --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/index.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5d0aa9b62dd874b9d9ec5123194e1ef1 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/SequenceReactV3/node_modules.meta b/Assets/WebGLTemplates/SequenceReactV3/node_modules.meta new file mode 100644 index 00000000..234683cd --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/node_modules.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4bdbe30ff0f0f4facb63fad291f8ea39 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/SequenceReactV3/package-lock.json b/Assets/WebGLTemplates/SequenceReactV3/package-lock.json new file mode 100644 index 00000000..0cab7127 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/package-lock.json @@ -0,0 +1,2061 @@ +{ + "name": "react-unity-webgl-demo", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-unity-webgl-demo", + "version": "0.0.0", + "dependencies": { + "@react-oauth/google": "^0.12.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-unity-webgl": "^9.5.2" + }, + "devDependencies": { + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@vitejs/plugin-react": "^4.2.1", + "typescript": "^5.4.5", + "vite": "^5.4.14", + "vite-plugin-static-copy": "^2.2.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", + "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-oauth/google": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@react-oauth/google/-/google-0.12.1.tgz", + "integrity": "sha512-qagsy22t+7UdkYAiT5ZhfM4StXi9PPNvw0zuwNmabrWyMKddczMtBIOARflbaIj+wHiQjnMAsZmzsUYuXeyoSg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.4.tgz", + "integrity": "sha512-gGi5adZWvjtJU7Axs//CWaQbQd/vGy8KGcnEaCWiyCqxWYDxwIlAHFuSe6Guoxtd0SRvSfVTDMPd5H+4KE2kKA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.4.tgz", + "integrity": "sha512-1aRlh1gqtF7vNPMnlf1vJKk72Yshw5zknR/ZAVh7zycRAGF2XBMVDAHmFQz/Zws5k++nux3LOq/Ejj1WrDR6xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.4.tgz", + "integrity": "sha512-drHl+4qhFj+PV/jrQ78p9ch6A0MfNVZScl/nBps5a7u01aGf/GuBRrHnRegA9bP222CBDfjYbFdjkIJ/FurvSQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.4.tgz", + "integrity": "sha512-hQqq/8QALU6t1+fbNmm6dwYsa0PDD4L5r3TpHx9dNl+aSEMnIksHZkSO3AVH+hBMvZhpumIGrTFj8XCOGuIXjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.4.tgz", + "integrity": "sha512-/L0LixBmbefkec1JTeAQJP0ETzGjFtNml2gpQXA8rpLo7Md+iXQzo9kwEgzyat5Q+OG/C//2B9Fx52UxsOXbzw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.4.tgz", + "integrity": "sha512-6Rk3PLRK+b8L/M6m/x6Mfj60LhAUcLJ34oPaxufA+CfqkUrDoUPQYFdRrhqyOvtOKXLJZJwxlOLbQjNYQcRQfw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.4.tgz", + "integrity": "sha512-kmT3x0IPRuXY/tNoABp2nDvI9EvdiS2JZsd4I9yOcLCCViKsP0gB38mVHOhluzx+SSVnM1KNn9k6osyXZhLoCA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.4.tgz", + "integrity": "sha512-3iSA9tx+4PZcJH/Wnwsvx/BY4qHpit/u2YoZoXugWVfc36/4mRkgGEoRbRV7nzNBSCOgbWMeuQ27IQWgJ7tRzw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.4.tgz", + "integrity": "sha512-7CwSJW+sEhM9sESEk+pEREF2JL0BmyCro8UyTq0Kyh0nu1v0QPNY3yfLPFKChzVoUmaKj8zbdgBxUhBRR+xGxg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.4.tgz", + "integrity": "sha512-GZdafB41/4s12j8Ss2izofjeFXRAAM7sHCb+S4JsI9vaONX/zQ8cXd87B9MRU/igGAJkKvmFmJJBeeT9jJ5Cbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.4.tgz", + "integrity": "sha512-uuphLuw1X6ur11675c2twC6YxbzyLSpWggvdawTUamlsoUv81aAXRMPBC1uvQllnBGls0Qt5Siw8reSIBnbdqQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.4.tgz", + "integrity": "sha512-KvLEw1os2gSmD6k6QPCQMm2T9P2GYvsMZMRpMz78QpSoEevHbV/KOUbI/46/JRalhtSAYZBYLAnT9YE4i/l4vg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.4.tgz", + "integrity": "sha512-wcpCLHGM9yv+3Dql/CI4zrY2mpQ4WFergD3c9cpRowltEh5I84pRT/EuHZsG0In4eBPPYthXnuR++HrFkeqwkA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.4.tgz", + "integrity": "sha512-nLbfQp2lbJYU8obhRQusXKbuiqm4jSJteLwfjnunDT5ugBKdxqw1X9KWwk8xp1OMC6P5d0WbzxzhWoznuVK6XA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.4.tgz", + "integrity": "sha512-JGejzEfVzqc/XNiCKZj14eb6s5w8DdWlnQ5tWUbs99kkdvfq9btxxVX97AaxiUX7xJTKFA0LwoS0KU8C2faZRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.4.tgz", + "integrity": "sha512-/iFIbhzeyZZy49ozAWJ1ZR2KW6ZdYUbQXLT4O5n1cRZRoTpwExnHLjlurDXXPKEGxiAg0ujaR9JDYKljpr2fDg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.4.tgz", + "integrity": "sha512-qORc3UzoD5UUTneiP2Afg5n5Ti1GAW9Gp5vHPxzvAFFA3FBaum9WqGvYXGf+c7beFdOKNos31/41PRMUwh1tpA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.4.tgz", + "integrity": "sha512-5g7E2PHNK2uvoD5bASBD9aelm44nf1w4I5FEI7MPHLWcCSrR8JragXZWgKPXk5i2FU3JFfa6CGZLw2RrGBHs2Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.4.tgz", + "integrity": "sha512-p0scwGkR4kZ242xLPBuhSckrJ734frz6v9xZzD+kHVYRAkSUmdSLCIJRfql6H5//aF8Q10K+i7q8DiPfZp0b7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", + "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", + "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001697", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001697.tgz", + "integrity": "sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.92", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.92.tgz", + "integrity": "sha512-BeHgmNobs05N1HMmMZ7YIuHfYBGlq/UmvlsTgg+fsbFs9xVMj+xJHFg19GN04+9Q+r8Xnh9LXqaYIyEWElnNgQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-unity-webgl": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/react-unity-webgl/-/react-unity-webgl-9.7.0.tgz", + "integrity": "sha512-j+Q/kfqpOt803G2xf4bn2N2REjmZGilG7kx3FQcOOUnCUvV+moP+TeY1w2HgsiYPZjLuzqw8Hx35KtlTWlHBwA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jeffreylanters" + }, + { + "type": "website", + "url": "https://react-unity-webgl.dev/support" + } + ], + "license": "Apache-2.0", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.4.tgz", + "integrity": "sha512-spF66xoyD7rz3o08sHP7wogp1gZ6itSq22SGa/IZTcUDXDlOyrShwMwkVSB+BUxFRZZCUYqdb3KWDEOMVQZxuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.4", + "@rollup/rollup-android-arm64": "4.34.4", + "@rollup/rollup-darwin-arm64": "4.34.4", + "@rollup/rollup-darwin-x64": "4.34.4", + "@rollup/rollup-freebsd-arm64": "4.34.4", + "@rollup/rollup-freebsd-x64": "4.34.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.4", + "@rollup/rollup-linux-arm-musleabihf": "4.34.4", + "@rollup/rollup-linux-arm64-gnu": "4.34.4", + "@rollup/rollup-linux-arm64-musl": "4.34.4", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.4", + "@rollup/rollup-linux-riscv64-gnu": "4.34.4", + "@rollup/rollup-linux-s390x-gnu": "4.34.4", + "@rollup/rollup-linux-x64-gnu": "4.34.4", + "@rollup/rollup-linux-x64-musl": "4.34.4", + "@rollup/rollup-win32-arm64-msvc": "4.34.4", + "@rollup/rollup-win32-ia32-msvc": "4.34.4", + "@rollup/rollup-win32-x64-msvc": "4.34.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "5.4.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", + "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-static-copy": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.2.0.tgz", + "integrity": "sha512-ytMrKdR9iWEYHbUxs6x53m+MRl4SJsOSoMu1U1+Pfg0DjPeMlsRVx3RR5jvoonineDquIue83Oq69JvNsFSU5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.3", + "fast-glob": "^3.2.11", + "fs-extra": "^11.1.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/Assets/WebGLTemplates/SequenceReactV3/package-lock.json.meta b/Assets/WebGLTemplates/SequenceReactV3/package-lock.json.meta new file mode 100644 index 00000000..9c3de267 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/package-lock.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 61d9b9d19218145f2ad897cdab5f6809 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/SequenceReactV3/package.json b/Assets/WebGLTemplates/SequenceReactV3/package.json new file mode 100644 index 00000000..1daa4928 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/package.json @@ -0,0 +1,25 @@ +{ + "name": "react-unity-webgl-demo", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --port 4444", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@react-oauth/google": "^0.12.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-unity-webgl": "^9.5.2" + }, + "devDependencies": { + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@vitejs/plugin-react": "^4.2.1", + "typescript": "^5.4.5", + "vite": "^5.4.14", + "vite-plugin-static-copy": "^2.2.0" + } +} diff --git a/Assets/WebGLTemplates/SequenceReactV3/package.json.meta b/Assets/WebGLTemplates/SequenceReactV3/package.json.meta new file mode 100644 index 00000000..ea254503 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6ba73bf66c88f4a45a7d8bc35e9a1a61 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/SequenceReactV3/src.meta b/Assets/WebGLTemplates/SequenceReactV3/src.meta new file mode 100644 index 00000000..ef1a991f --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/src.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b9514ac0e239b4942bc2526fc80634f0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/SequenceReactV3/src/App.css b/Assets/WebGLTemplates/SequenceReactV3/src/App.css new file mode 100644 index 00000000..3a1432c1 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/src/App.css @@ -0,0 +1,61 @@ +.outer-container { + display: flex; + align-items: center; + justify-content: center; + width: 100vw; + height: 100vh; +} + +.container { + position: relative; +} + +.container > .loading-overlay { + /* We'll render the overlay on top of the Unity Application. */ + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: #1a1a1a; + /* We'll set the following Flex properties in order to center the text. */ + display: flex; + justify-content: center; + align-items: center; +} + +.container > .unity { + /* The Unity Application matches it size to the container. */ + width: 100%; + height: 100%; +} + +.login-outer-container { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + background: rgba(0, 0, 0, 0.9); +} + +.login-container { + position: relative; + width: 300px; + height: 200px; + display: flex; + flex-direction: column; + align-items: center; + border-radius: 6px; + background-color: white; +} + +.login-title { + display: block; + color: black; + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; + margin-bottom: 40px; +} diff --git a/Assets/WebGLTemplates/SequenceReactV3/src/App.css.meta b/Assets/WebGLTemplates/SequenceReactV3/src/App.css.meta new file mode 100644 index 00000000..1984c427 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/src/App.css.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7a887c1a286a748e981d98bbd32e03c9 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/SequenceReactV3/src/App.tsx b/Assets/WebGLTemplates/SequenceReactV3/src/App.tsx new file mode 100644 index 00000000..70606177 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/src/App.tsx @@ -0,0 +1,106 @@ +import {ReactUnityEventParameter} from "react-unity-webgl/distribution/types/react-unity-event-parameters"; +import { Unity, useUnityContext } from "react-unity-webgl"; +import { useCallback, useEffect, useState } from "react"; + +import "./App.css"; + +function App() { + const { + unityProvider, + addEventListener, + removeEventListener, + sendMessage, + isLoaded, + loadingProgression, + } = useUnityContext({ + loaderUrl: "Build/webgl.loader.js", + dataUrl: "Build/webgl.data.unityweb", + frameworkUrl: "Build/webgl.framework.js.unityweb", + codeUrl: "Build/webgl.wasm.unityweb", + }); + + const loadingPercentage = Math.round(loadingProgression * 100); + + const handleSequenceWalletAuth = useCallback((...parameters: ReactUnityEventParameter[]): ReactUnityEventParameter => { + const inputJson = parameters[0] as string; + const input = JSON.parse(inputJson); + + const walletWindow = window.open(input.url, "Wallet", 'width=600,height=400,left=200,top=200'); + if (!walletWindow) { + throw new Error("Unable to find wallet"); + } + + const message = { + id: 'id-123', + type: 'request', + action: input.action, + payload: input.payload + } + + walletWindow.postMessage(JSON.stringify(message)); + + /*setMessageToSend({ + functionName: "HandleResponse", + value: walletUrl, + });*/ + return ''; + }, []); + + const [messageToSend, setMessageToSend] = useState<{ functionName: string; value: string; } | undefined>(undefined); + + useEffect(() => { + if (messageToSend) { + const message = messageToSend; + setMessageToSend(undefined); + sendMessage("SequenceNativeReceiver", message.functionName, message.value); + } + }, [messageToSend]); + + useEffect(() => { + addEventListener("OpenWalletApp", handleSequenceWalletAuth); + window.addEventListener("message", handleMessage); + window.addEventListener("resize", handleResize); + handleResize() + return () => { + removeEventListener("OpenWalletApp", handleSequenceWalletAuth); + window.removeEventListener("message", handleMessage); + window.removeEventListener("resize", handleResize); + }; + }, []); + + const handleMessage = (e) => { + console.log(e); + } + + const handleResize = () => { + const container = document.querySelector('.container') as any; + + let w = window.innerWidth * 0.98; + let h = window.innerHeight * 0.98; + + const r = 600 / 960; + if (w * r > window.innerHeight) { + w = Math.min(w, Math.ceil(h / r)); + } + + h = Math.floor(w * r); + + container.style.width = w + "px"; + container.style.height = h + "px"; + } + + return ( +
+
+ {isLoaded === false && ( +
+

Loading... ({loadingPercentage}%)

+
+ )} + +
+
+ ); +} + +export default App; diff --git a/Assets/WebGLTemplates/SequenceReactV3/src/App.tsx.meta b/Assets/WebGLTemplates/SequenceReactV3/src/App.tsx.meta new file mode 100644 index 00000000..a5553bd7 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/src/App.tsx.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2a430bed9ca394431b268d632f767d05 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/SequenceReactV3/src/index.css b/Assets/WebGLTemplates/SequenceReactV3/src/index.css new file mode 100644 index 00000000..6db435b1 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #1a1a1a; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/Assets/WebGLTemplates/SequenceReactV3/src/index.css.meta b/Assets/WebGLTemplates/SequenceReactV3/src/index.css.meta new file mode 100644 index 00000000..5403cc13 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/src/index.css.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 00fe04054a2c743de9c361be92d3dffc +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/SequenceReactV3/src/main.tsx b/Assets/WebGLTemplates/SequenceReactV3/src/main.tsx new file mode 100644 index 00000000..3d7150da --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/Assets/WebGLTemplates/SequenceReactV3/src/main.tsx.meta b/Assets/WebGLTemplates/SequenceReactV3/src/main.tsx.meta new file mode 100644 index 00000000..008b5f2f --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/src/main.tsx.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f4c77dc29ce3d4a55872fc21b83ad7f8 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts b/Assets/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/Assets/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts.meta b/Assets/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts.meta new file mode 100644 index 00000000..45d93019 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e45c9381907fc405c812edf182593fad +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/SequenceReactV3/tsconfig.json b/Assets/WebGLTemplates/SequenceReactV3/tsconfig.json new file mode 100644 index 00000000..cb0d143c --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "public/build"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/Assets/WebGLTemplates/SequenceReactV3/tsconfig.json.meta b/Assets/WebGLTemplates/SequenceReactV3/tsconfig.json.meta new file mode 100644 index 00000000..11195868 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/tsconfig.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c49eb2c92e8cf40aa8c6345d24d77479 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/SequenceReactV3/tsconfig.node.json b/Assets/WebGLTemplates/SequenceReactV3/tsconfig.node.json new file mode 100644 index 00000000..97ede7ee --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/Assets/WebGLTemplates/SequenceReactV3/tsconfig.node.json.meta b/Assets/WebGLTemplates/SequenceReactV3/tsconfig.node.json.meta new file mode 100644 index 00000000..2333985a --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/tsconfig.node.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: aa980f1993f0143d9bb53c0a881c2005 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/SequenceReactV3/vite.config.ts b/Assets/WebGLTemplates/SequenceReactV3/vite.config.ts new file mode 100644 index 00000000..2531e09e --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/vite.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +// vite.config.js / vite.config.ts +import { viteStaticCopy } from 'vite-plugin-static-copy' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react(), + viteStaticCopy({ + targets: [ + { + src: 'Build/*', + dest: 'Build' + } + ] + }) + + ], + base: './', + build: { + assetsDir: '.', + outDir: 'dist', + }, +}) diff --git a/Assets/WebGLTemplates/SequenceReactV3/vite.config.ts.meta b/Assets/WebGLTemplates/SequenceReactV3/vite.config.ts.meta new file mode 100644 index 00000000..9888903c --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/vite.config.ts.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c1da6a1b7739d46b4bec87e0acaf88a2 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Plugins/Web/SocialSignIn.jslib b/Packages/Sequence-Unity/Plugins/Web/SocialSignIn.jslib index ff2a9015..f4e3b9b9 100644 --- a/Packages/Sequence-Unity/Plugins/Web/SocialSignIn.jslib +++ b/Packages/Sequence-Unity/Plugins/Web/SocialSignIn.jslib @@ -4,4 +4,8 @@ mergeInto(LibraryManager.library, { window.dispatchReactUnityEvent("GoogleSignIn", UTF8ToString(googleClientId), UTF8ToString(nonce)); }, + OpenWalletApp: function(url) { + window.dispatchReactUnityEvent("OpenWalletApp", UTF8ToString(url)); + }, + }); diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs index 7e622cc3..367802f2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs @@ -1,3 +1,4 @@ +using System; using Sequence.EcosystemWallet.Authentication; using TMPro; using UnityEngine; @@ -37,22 +38,46 @@ private void Start() public async void SignInWithEmail() { SetLoading(true); - var wallet = await _login.SignInWithEmail(_curEmail, _sessionType); - ShowWallet(wallet, false); + + try + { + var wallet = await _login.SignInWithEmail(_curEmail, _sessionType); + ShowWallet(wallet, false); + } + catch (Exception e) + { + ShowError(e.Message); + } } public async void SignInWithGoogle() { SetLoading(true); - var wallet = await _login.SignInWithGoogle(_sessionType); - ShowWallet(wallet, false); + + try + { + var wallet = await _login.SignInWithGoogle(_sessionType); + ShowWallet(wallet, false); + } + catch (Exception e) + { + ShowError(e.Message); + } } public async void SignInWithApple() { SetLoading(true); - var wallet = await _login.SignInWithApple(_sessionType); - ShowWallet(wallet, false); + + try + { + var wallet = await _login.SignInWithApple(_sessionType); + ShowWallet(wallet, false); + } + catch (Exception e) + { + ShowError(e.Message); + } } public void SignOut() @@ -66,6 +91,13 @@ public void OnSessionTypeChanged(int index) _sessionType = (SequenceEcosystemWalletLogin.SessionType)index; } + private void ShowError(string error) + { + Debug.LogError(error); + _messagePopup.Show(error); + SetLoading(false); + } + private void RecoverWalletFromStorage() { var wallet = _login.RecoverSessionFromStorage(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs deleted file mode 100644 index 6b4bd791..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Specialized; -using System.Threading.Tasks; -using UnityEngine; -using System.Net; - -namespace Sequence.EcosystemWallet.Authentication -{ - public class EditorServer - { - private HttpListener _listener; - - public void StopListening() - { - _listener.Stop(); - Debug.Log($"Stopped listening"); - } - - public async Task<(bool Result, NameValueCollection QueryString)> WaitForResponse(string host, int port) - { - try - { - _listener = new HttpListener(); - _listener.Prefixes.Add($"http://{host}:{port}/"); - _listener.Start(); - - var context = await _listener.GetContextAsync(); - StopListening(); - - foreach (var key in context.Request.QueryString.AllKeys) - Debug.Log($"Key: {key}, Value: {context.Request.QueryString[key]}"); - - return (true, context.Request.QueryString); - } - catch (Exception ex) - { - Debug.LogException(ex); - return (false, null); - } - } - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs.meta deleted file mode 100644 index 3161b197..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EditorServer.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: becb32bc12144e14bbe66f24ec4fa142 -timeCreated: 1752091460 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs index 8be62fa9..eac16949 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs @@ -26,8 +26,6 @@ public enum SessionType private Chain _chain; private string _walletUrl; - private string _redirectUrl; - private string _redirectId; private string _emitterAddress; private EOAWallet _sessionWallet; private SessionStorage _sessionStorage; @@ -36,7 +34,6 @@ public SequenceEcosystemWalletLogin(Chain chain) { _chain = chain; _walletUrl = "https://v3.sequence-dev.app"; - _redirectUrl = "http://localhost:8080"; _emitterAddress = "0xb7bE532959236170064cf099e1a3395aEf228F44"; _sessionStorage = new SessionStorage(); } @@ -89,28 +86,20 @@ private async Task CreateNewSession(SessionPermissions payload.Add("email", email); if (isImplicitSession) - payload.Add("implicitSessionRedirectUrl", _redirectUrl); + payload.Add("implicitSessionRedirectUrl", "http://localhost:4444/"); if (!isImplicitSession) payload.Add("permissions", permissions.ToJson()); - + var action = isImplicitSession ? "addImplicitSession" : "addExplicitSession"; - var url = ConstructWalletUrl(action, payload, "/request/connect"); + var url = $"{_walletUrl}/request/connect"; - BrowserFactory.CreateBrowser().Show(url); - - var editorServer = new EditorServer(); - var response = await editorServer.WaitForResponse("localhost", 8080); + var handler = RedirectFactory.CreateHandler(); + var response = await handler.WaitForResponse(url, action, payload); if (!response.Result) { throw new Exception("Error during request"); } - - var id = response.QueryString["id"]; - if (id != _redirectId) - { - throw new Exception("Incorrect request id"); - } if (!response.QueryString.AllKeys.Contains("payload")) { @@ -123,6 +112,7 @@ private async Task CreateNewSession(SessionPermissions var encodedResponsePayload = response.QueryString["payload"]; var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(encodedResponsePayload)); + Debug.Log(responsePayloadJson); var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); if (responsePayload.attestation != null) @@ -144,24 +134,6 @@ private async Task CreateNewSession(SessionPermissions return new SequenceEcosystemWallet(walletAddress); } - - private string ConstructWalletUrl(string action, Dictionary payload, string path) - { - _redirectId = $"sequence:{Guid.NewGuid().ToString()}"; - var encodedPayload = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload))); - - var uriBuilder = new UriBuilder($"{_walletUrl}{path}"); - var query = HttpUtility.ParseQueryString(uriBuilder.Query); - - query["action"] = action; - query["payload"] = encodedPayload; - query["id"] = _redirectId; - query["redirectUrl"] = _redirectUrl; - query["mode"] = "redirect"; - - uriBuilder.Query = query.ToString(); - return uriBuilder.ToString(); - } private SessionPermissions GetPermissionsFromSessionType(SessionType sessionType) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/BrowserFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/BrowserFactory.cs deleted file mode 100644 index b5d58c8b..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/BrowserFactory.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Sequence.EcosystemWallet.Browser -{ - public static class BrowserFactory - { - public static IBrowser CreateBrowser() - { -#if UNITY_IOS && !UNITY_EDITOR - return new IosBrowser(); -#else - return new WebBrowser(); -#endif - } - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IBrowser.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IBrowser.cs deleted file mode 100644 index c1c22b52..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IBrowser.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Sequence.EcosystemWallet.Browser -{ - public interface IBrowser - { - void Show(string url); - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/WebBrowser.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/WebBrowser.cs deleted file mode 100644 index 2d388257..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/WebBrowser.cs +++ /dev/null @@ -1,12 +0,0 @@ -using UnityEngine; - -namespace Sequence.EcosystemWallet.Browser -{ - public class WebBrowser : IBrowser - { - public void Show(string url) - { - Application.OpenURL(url); - } - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs new file mode 100644 index 00000000..a59eaa12 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Threading.Tasks; +using Newtonsoft.Json; +using UnityEngine; + +namespace Sequence.EcosystemWallet.Browser +{ + public class BrowserRedirectHandler : IRedirectHandler + { + private class ResponseErrorData + { + public string error; + } + + private class ResponseData + { + public string id; + public string type; + public string payload; + public ResponseErrorData error; + } + + private NativeReceiver _receiver; + + public async Task<(bool Result, NameValueCollection QueryString)> WaitForResponse(string url, string action, Dictionary payload) + { + try + { + var go = new GameObject("SequenceNativeReceiver"); + _receiver = go.AddComponent(); + + var response = await _receiver.WaitForResponse(JsonConvert.SerializeObject(new {url, action, payload})); + var data = JsonConvert.DeserializeObject(response); + if (data.error != null) + throw new Exception(data.error.error); + + var query = new NameValueCollection(); + query.Add("payload", data.payload); + + return (true, query); + } + catch (Exception ex) + { + Debug.LogException(ex); + return (false, null); + } + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs.meta new file mode 100644 index 00000000..3c084120 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ee281049f7294f33af22b8c044437ddb +timeCreated: 1752168196 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs new file mode 100644 index 00000000..7e5d817d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Threading.Tasks; + +namespace Sequence.EcosystemWallet.Browser +{ + public interface IRedirectHandler + { + Task<(bool Result, NameValueCollection QueryString)> WaitForResponse(string url, string action, Dictionary payload); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IBrowser.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IBrowser.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IosBrowser.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs similarity index 69% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IosBrowser.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs index 6b5c0320..5ec03413 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IosBrowser.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs @@ -1,8 +1,11 @@ +using System.Collections.Generic; +using System.Collections.Specialized; using System.Runtime.InteropServices; +using System.Threading.Tasks; namespace Sequence.EcosystemWallet.Browser { - internal class IosBrowser : IBrowser + internal class IosRedirectHandler : IRedirectHandler { #if UNITY_IOS && !UNITY_EDITOR [DllImport("__Internal")] @@ -19,9 +22,10 @@ private static void _HideWebView() { } private static void _RemoveWebView() { } #endif - public void Show(string url) + public Task<(bool Result, NameValueCollection QueryString)> WaitForResponse(string url, string action, Dictionary payload) { _ShowWebView(url, 0, 0, 375, 667); + return Task.FromResult((false, new NameValueCollection())); } public void Hide() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IosBrowser.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/IosBrowser.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs new file mode 100644 index 00000000..b2860064 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +using UnityEngine; + +namespace Sequence.EcosystemWallet.Browser +{ + public class LocalhostRedirectHandler : IRedirectHandler + { + private const string Listener = "http://localhost:8080"; + + public async Task<(bool Result, NameValueCollection QueryString)> WaitForResponse(string url, string action, Dictionary payload) + { + var redirectId = $"sequence:{Guid.NewGuid().ToString()}"; + var encodedPayload = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload))); + var finalUrl = $"{url}?action={action}&payload={encodedPayload}&id={redirectId}&redirectUrl={Listener}&mode=redirect"; + + Application.OpenURL(finalUrl); + + try + { + var listener = new HttpListener(); + listener.Prefixes.Add(Listener); + listener.Start(); + + var context = await listener.GetContextAsync(); + listener.Stop(); + + var queryString = context.Request.QueryString; + foreach (var key in queryString.AllKeys) + Debug.Log($"Key: {key}, Value: {queryString[key]}"); + + var id = queryString["id"]; + if (id != redirectId) + throw new Exception("Incorrect request id"); + + return (true, queryString); + } + catch (Exception ex) + { + Debug.LogException(ex); + return (false, null); + } + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/WebBrowser.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/WebBrowser.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs new file mode 100644 index 00000000..5cd70d18 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs @@ -0,0 +1,33 @@ +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using UnityEngine; + +namespace Sequence.EcosystemWallet.Browser +{ + internal class NativeReceiver : MonoBehaviour + { + private string _response; + + public void HandleResponse(string response) + { + _response = response; + } + + public async Task WaitForResponse(string url) + { + OpenWalletApp(url); + + while (string.IsNullOrEmpty(_response)) + await Task.Yield(); + + return _response; + } + +#if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void OpenWalletApp(string url); +#else + private static void OpenWalletApp(string url) { } +#endif + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs.meta new file mode 100644 index 00000000..ddedc757 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 472afbe0981643f1849d7079b6f6e952 +timeCreated: 1752174611 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs new file mode 100644 index 00000000..1a6623d0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs @@ -0,0 +1,16 @@ +namespace Sequence.EcosystemWallet.Browser +{ + public static class RedirectFactory + { + public static IRedirectHandler CreateHandler() + { +#if UNITY_IOS && !UNITY_EDITOR + return new IosRedirectHandler(); +#elif UNITY_WEBGL && !UNITY_EDITOR + return new BrowserRedirectHandler(); +#else + return new LocalhostRedirectHandler(); +#endif + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/BrowserFactory.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Browser/BrowserFactory.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs.meta diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3.meta new file mode 100644 index 00000000..416fa5f1 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 21f180fb1c2814f4ca2827b3f6a29ddf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/index.html b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/index.html new file mode 100644 index 00000000..fa6c989d --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/index.html @@ -0,0 +1,13 @@ + + + + + + + Sequence Unity Demo + + +
+ + + diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/index.html.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/index.html.meta new file mode 100644 index 00000000..546d1629 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/index.html.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e952b92f337b1467989d3c3f327d7759 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/node_modules.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/node_modules.meta new file mode 100644 index 00000000..556c3e2c --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/node_modules.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63c50da8024204a42806dfdcceecd26d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package-lock.json b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package-lock.json new file mode 100644 index 00000000..0cab7127 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package-lock.json @@ -0,0 +1,2061 @@ +{ + "name": "react-unity-webgl-demo", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-unity-webgl-demo", + "version": "0.0.0", + "dependencies": { + "@react-oauth/google": "^0.12.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-unity-webgl": "^9.5.2" + }, + "devDependencies": { + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@vitejs/plugin-react": "^4.2.1", + "typescript": "^5.4.5", + "vite": "^5.4.14", + "vite-plugin-static-copy": "^2.2.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", + "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-oauth/google": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@react-oauth/google/-/google-0.12.1.tgz", + "integrity": "sha512-qagsy22t+7UdkYAiT5ZhfM4StXi9PPNvw0zuwNmabrWyMKddczMtBIOARflbaIj+wHiQjnMAsZmzsUYuXeyoSg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.4.tgz", + "integrity": "sha512-gGi5adZWvjtJU7Axs//CWaQbQd/vGy8KGcnEaCWiyCqxWYDxwIlAHFuSe6Guoxtd0SRvSfVTDMPd5H+4KE2kKA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.4.tgz", + "integrity": "sha512-1aRlh1gqtF7vNPMnlf1vJKk72Yshw5zknR/ZAVh7zycRAGF2XBMVDAHmFQz/Zws5k++nux3LOq/Ejj1WrDR6xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.4.tgz", + "integrity": "sha512-drHl+4qhFj+PV/jrQ78p9ch6A0MfNVZScl/nBps5a7u01aGf/GuBRrHnRegA9bP222CBDfjYbFdjkIJ/FurvSQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.4.tgz", + "integrity": "sha512-hQqq/8QALU6t1+fbNmm6dwYsa0PDD4L5r3TpHx9dNl+aSEMnIksHZkSO3AVH+hBMvZhpumIGrTFj8XCOGuIXjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.4.tgz", + "integrity": "sha512-/L0LixBmbefkec1JTeAQJP0ETzGjFtNml2gpQXA8rpLo7Md+iXQzo9kwEgzyat5Q+OG/C//2B9Fx52UxsOXbzw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.4.tgz", + "integrity": "sha512-6Rk3PLRK+b8L/M6m/x6Mfj60LhAUcLJ34oPaxufA+CfqkUrDoUPQYFdRrhqyOvtOKXLJZJwxlOLbQjNYQcRQfw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.4.tgz", + "integrity": "sha512-kmT3x0IPRuXY/tNoABp2nDvI9EvdiS2JZsd4I9yOcLCCViKsP0gB38mVHOhluzx+SSVnM1KNn9k6osyXZhLoCA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.4.tgz", + "integrity": "sha512-3iSA9tx+4PZcJH/Wnwsvx/BY4qHpit/u2YoZoXugWVfc36/4mRkgGEoRbRV7nzNBSCOgbWMeuQ27IQWgJ7tRzw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.4.tgz", + "integrity": "sha512-7CwSJW+sEhM9sESEk+pEREF2JL0BmyCro8UyTq0Kyh0nu1v0QPNY3yfLPFKChzVoUmaKj8zbdgBxUhBRR+xGxg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.4.tgz", + "integrity": "sha512-GZdafB41/4s12j8Ss2izofjeFXRAAM7sHCb+S4JsI9vaONX/zQ8cXd87B9MRU/igGAJkKvmFmJJBeeT9jJ5Cbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.4.tgz", + "integrity": "sha512-uuphLuw1X6ur11675c2twC6YxbzyLSpWggvdawTUamlsoUv81aAXRMPBC1uvQllnBGls0Qt5Siw8reSIBnbdqQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.4.tgz", + "integrity": "sha512-KvLEw1os2gSmD6k6QPCQMm2T9P2GYvsMZMRpMz78QpSoEevHbV/KOUbI/46/JRalhtSAYZBYLAnT9YE4i/l4vg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.4.tgz", + "integrity": "sha512-wcpCLHGM9yv+3Dql/CI4zrY2mpQ4WFergD3c9cpRowltEh5I84pRT/EuHZsG0In4eBPPYthXnuR++HrFkeqwkA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.4.tgz", + "integrity": "sha512-nLbfQp2lbJYU8obhRQusXKbuiqm4jSJteLwfjnunDT5ugBKdxqw1X9KWwk8xp1OMC6P5d0WbzxzhWoznuVK6XA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.4.tgz", + "integrity": "sha512-JGejzEfVzqc/XNiCKZj14eb6s5w8DdWlnQ5tWUbs99kkdvfq9btxxVX97AaxiUX7xJTKFA0LwoS0KU8C2faZRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.4.tgz", + "integrity": "sha512-/iFIbhzeyZZy49ozAWJ1ZR2KW6ZdYUbQXLT4O5n1cRZRoTpwExnHLjlurDXXPKEGxiAg0ujaR9JDYKljpr2fDg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.4.tgz", + "integrity": "sha512-qORc3UzoD5UUTneiP2Afg5n5Ti1GAW9Gp5vHPxzvAFFA3FBaum9WqGvYXGf+c7beFdOKNos31/41PRMUwh1tpA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.4.tgz", + "integrity": "sha512-5g7E2PHNK2uvoD5bASBD9aelm44nf1w4I5FEI7MPHLWcCSrR8JragXZWgKPXk5i2FU3JFfa6CGZLw2RrGBHs2Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.4.tgz", + "integrity": "sha512-p0scwGkR4kZ242xLPBuhSckrJ734frz6v9xZzD+kHVYRAkSUmdSLCIJRfql6H5//aF8Q10K+i7q8DiPfZp0b7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", + "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", + "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001697", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001697.tgz", + "integrity": "sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.92", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.92.tgz", + "integrity": "sha512-BeHgmNobs05N1HMmMZ7YIuHfYBGlq/UmvlsTgg+fsbFs9xVMj+xJHFg19GN04+9Q+r8Xnh9LXqaYIyEWElnNgQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-unity-webgl": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/react-unity-webgl/-/react-unity-webgl-9.7.0.tgz", + "integrity": "sha512-j+Q/kfqpOt803G2xf4bn2N2REjmZGilG7kx3FQcOOUnCUvV+moP+TeY1w2HgsiYPZjLuzqw8Hx35KtlTWlHBwA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jeffreylanters" + }, + { + "type": "website", + "url": "https://react-unity-webgl.dev/support" + } + ], + "license": "Apache-2.0", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.4.tgz", + "integrity": "sha512-spF66xoyD7rz3o08sHP7wogp1gZ6itSq22SGa/IZTcUDXDlOyrShwMwkVSB+BUxFRZZCUYqdb3KWDEOMVQZxuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.4", + "@rollup/rollup-android-arm64": "4.34.4", + "@rollup/rollup-darwin-arm64": "4.34.4", + "@rollup/rollup-darwin-x64": "4.34.4", + "@rollup/rollup-freebsd-arm64": "4.34.4", + "@rollup/rollup-freebsd-x64": "4.34.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.4", + "@rollup/rollup-linux-arm-musleabihf": "4.34.4", + "@rollup/rollup-linux-arm64-gnu": "4.34.4", + "@rollup/rollup-linux-arm64-musl": "4.34.4", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.4", + "@rollup/rollup-linux-riscv64-gnu": "4.34.4", + "@rollup/rollup-linux-s390x-gnu": "4.34.4", + "@rollup/rollup-linux-x64-gnu": "4.34.4", + "@rollup/rollup-linux-x64-musl": "4.34.4", + "@rollup/rollup-win32-arm64-msvc": "4.34.4", + "@rollup/rollup-win32-ia32-msvc": "4.34.4", + "@rollup/rollup-win32-x64-msvc": "4.34.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "5.4.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", + "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-static-copy": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.2.0.tgz", + "integrity": "sha512-ytMrKdR9iWEYHbUxs6x53m+MRl4SJsOSoMu1U1+Pfg0DjPeMlsRVx3RR5jvoonineDquIue83Oq69JvNsFSU5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.3", + "fast-glob": "^3.2.11", + "fs-extra": "^11.1.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package-lock.json.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package-lock.json.meta new file mode 100644 index 00000000..46760520 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package-lock.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f8f47eeb3e81e401f8b1e46a0cbbb3ab +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package.json b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package.json new file mode 100644 index 00000000..1daa4928 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package.json @@ -0,0 +1,25 @@ +{ + "name": "react-unity-webgl-demo", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --port 4444", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@react-oauth/google": "^0.12.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-unity-webgl": "^9.5.2" + }, + "devDependencies": { + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@vitejs/plugin-react": "^4.2.1", + "typescript": "^5.4.5", + "vite": "^5.4.14", + "vite-plugin-static-copy": "^2.2.0" + } +} diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package.json.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package.json.meta new file mode 100644 index 00000000..2f534f57 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9aedafb5a604144e29bf1b8b6b5c151f +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src.meta new file mode 100644 index 00000000..b09ff60f --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 079b8d3f36fb244e1aa8c037876b1bd9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.css b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.css new file mode 100644 index 00000000..3a1432c1 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.css @@ -0,0 +1,61 @@ +.outer-container { + display: flex; + align-items: center; + justify-content: center; + width: 100vw; + height: 100vh; +} + +.container { + position: relative; +} + +.container > .loading-overlay { + /* We'll render the overlay on top of the Unity Application. */ + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: #1a1a1a; + /* We'll set the following Flex properties in order to center the text. */ + display: flex; + justify-content: center; + align-items: center; +} + +.container > .unity { + /* The Unity Application matches it size to the container. */ + width: 100%; + height: 100%; +} + +.login-outer-container { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + background: rgba(0, 0, 0, 0.9); +} + +.login-container { + position: relative; + width: 300px; + height: 200px; + display: flex; + flex-direction: column; + align-items: center; + border-radius: 6px; + background-color: white; +} + +.login-title { + display: block; + color: black; + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; + margin-bottom: 40px; +} diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.css.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.css.meta new file mode 100644 index 00000000..86a2ce84 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.css.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 63e7feff58ab24f27a38d3c97fb298be +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.tsx b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.tsx new file mode 100644 index 00000000..70606177 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.tsx @@ -0,0 +1,106 @@ +import {ReactUnityEventParameter} from "react-unity-webgl/distribution/types/react-unity-event-parameters"; +import { Unity, useUnityContext } from "react-unity-webgl"; +import { useCallback, useEffect, useState } from "react"; + +import "./App.css"; + +function App() { + const { + unityProvider, + addEventListener, + removeEventListener, + sendMessage, + isLoaded, + loadingProgression, + } = useUnityContext({ + loaderUrl: "Build/webgl.loader.js", + dataUrl: "Build/webgl.data.unityweb", + frameworkUrl: "Build/webgl.framework.js.unityweb", + codeUrl: "Build/webgl.wasm.unityweb", + }); + + const loadingPercentage = Math.round(loadingProgression * 100); + + const handleSequenceWalletAuth = useCallback((...parameters: ReactUnityEventParameter[]): ReactUnityEventParameter => { + const inputJson = parameters[0] as string; + const input = JSON.parse(inputJson); + + const walletWindow = window.open(input.url, "Wallet", 'width=600,height=400,left=200,top=200'); + if (!walletWindow) { + throw new Error("Unable to find wallet"); + } + + const message = { + id: 'id-123', + type: 'request', + action: input.action, + payload: input.payload + } + + walletWindow.postMessage(JSON.stringify(message)); + + /*setMessageToSend({ + functionName: "HandleResponse", + value: walletUrl, + });*/ + return ''; + }, []); + + const [messageToSend, setMessageToSend] = useState<{ functionName: string; value: string; } | undefined>(undefined); + + useEffect(() => { + if (messageToSend) { + const message = messageToSend; + setMessageToSend(undefined); + sendMessage("SequenceNativeReceiver", message.functionName, message.value); + } + }, [messageToSend]); + + useEffect(() => { + addEventListener("OpenWalletApp", handleSequenceWalletAuth); + window.addEventListener("message", handleMessage); + window.addEventListener("resize", handleResize); + handleResize() + return () => { + removeEventListener("OpenWalletApp", handleSequenceWalletAuth); + window.removeEventListener("message", handleMessage); + window.removeEventListener("resize", handleResize); + }; + }, []); + + const handleMessage = (e) => { + console.log(e); + } + + const handleResize = () => { + const container = document.querySelector('.container') as any; + + let w = window.innerWidth * 0.98; + let h = window.innerHeight * 0.98; + + const r = 600 / 960; + if (w * r > window.innerHeight) { + w = Math.min(w, Math.ceil(h / r)); + } + + h = Math.floor(w * r); + + container.style.width = w + "px"; + container.style.height = h + "px"; + } + + return ( +
+
+ {isLoaded === false && ( +
+

Loading... ({loadingPercentage}%)

+
+ )} + +
+
+ ); +} + +export default App; diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.tsx.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.tsx.meta new file mode 100644 index 00000000..3ea5354a --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.tsx.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8b58458d025de405280006ba606a4efe +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/index.css b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/index.css new file mode 100644 index 00000000..6db435b1 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #1a1a1a; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/index.css.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/index.css.meta new file mode 100644 index 00000000..e4650d70 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/index.css.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0f6f65754f12541aeabb6de0a8ac0960 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/main.tsx b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/main.tsx new file mode 100644 index 00000000..3d7150da --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/main.tsx.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/main.tsx.meta new file mode 100644 index 00000000..1d9f072b --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/main.tsx.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f102aac3dc36b404486032450a62dbfe +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts.meta new file mode 100644 index 00000000..04d4bf87 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/vite-env.d.ts.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 01e63b63242434acd96037eed62e2ec6 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.json b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.json new file mode 100644 index 00000000..cb0d143c --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "public/build"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.json.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.json.meta new file mode 100644 index 00000000..985e664e --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f3b008b1e16df4b6c98c5631195ecf7d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.node.json b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.node.json new file mode 100644 index 00000000..97ede7ee --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.node.json.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.node.json.meta new file mode 100644 index 00000000..12714d96 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/tsconfig.node.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2869ab9bcfb71464f84c57746ad46e3c +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/vite.config.ts b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/vite.config.ts new file mode 100644 index 00000000..2531e09e --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/vite.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +// vite.config.js / vite.config.ts +import { viteStaticCopy } from 'vite-plugin-static-copy' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react(), + viteStaticCopy({ + targets: [ + { + src: 'Build/*', + dest: 'Build' + } + ] + }) + + ], + base: './', + build: { + assetsDir: '.', + outDir: 'dist', + }, +}) diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/vite.config.ts.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/vite.config.ts.meta new file mode 100644 index 00000000..d35d9c16 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/vite.config.ts.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e7b44fc75d622429eb4305a36722d1f8 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 176c18aa..9cdfa224 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -804,7 +804,7 @@ PlayerSettings: webGLDebugSymbols: 0 webGLEmscriptenArgs: webGLModulesDirectory: - webGLTemplate: PROJECT:SequenceReact + webGLTemplate: PROJECT:SequenceReactV3 webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 webGLCompressionFormat: 1 From b8ed12a822166de5b808222496ecf4ef3aa94f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 11 Jul 2025 16:22:34 +0200 Subject: [PATCH 101/165] added GetPageOrigin() and calls to sign in with passkey and mnemonic --- .../SequenceReactV3/src/App.tsx | 109 +- .../Plugins/Web/SocialSignIn.jslib | 6 + .../Sequence/Samples~/Demo V3/DemoV3.unity | 2869 +++++++++-------- .../SequenceEcosystemWalletWindow.cs | 32 +- .../Authentication/RedirectOrigin.cs | 24 + .../Authentication/RedirectOrigin.cs.meta | 3 + .../SequenceEcosystemWalletLogin.cs | 13 +- .../RedirectHandler/BrowserRedirectHandler.cs | 3 + .../LocalhostRedirectHandler.cs | 7 +- .../SequenceReactV3/src/App.tsx | 109 +- 10 files changed, 1849 insertions(+), 1326 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs.meta diff --git a/Assets/WebGLTemplates/SequenceReactV3/src/App.tsx b/Assets/WebGLTemplates/SequenceReactV3/src/App.tsx index 70606177..83a9a28c 100644 --- a/Assets/WebGLTemplates/SequenceReactV3/src/App.tsx +++ b/Assets/WebGLTemplates/SequenceReactV3/src/App.tsx @@ -4,6 +4,15 @@ import { useCallback, useEffect, useState } from "react"; import "./App.css"; +let walletWindow: Window | null = null; +let authInput: AuthInput | null = null; + +interface AuthInput { + url: string; + action: string; + payload: string; +} + function App() { const { unityProvider, @@ -23,26 +32,14 @@ function App() { const handleSequenceWalletAuth = useCallback((...parameters: ReactUnityEventParameter[]): ReactUnityEventParameter => { const inputJson = parameters[0] as string; - const input = JSON.parse(inputJson); - - const walletWindow = window.open(input.url, "Wallet", 'width=600,height=400,left=200,top=200'); - if (!walletWindow) { - throw new Error("Unable to find wallet"); - } - - const message = { - id: 'id-123', - type: 'request', - action: input.action, - payload: input.payload - } + authInput = JSON.parse(inputJson) as AuthInput; - walletWindow.postMessage(JSON.stringify(message)); + const sessionId = generateId(); + walletWindow = window.open( + `${authInput?.url}?dappOrigin=${window.location.origin}&sessionId=${sessionId}`, + "Wallet", + 'width=600,height=600,left=300,top=300'); - /*setMessageToSend({ - functionName: "HandleResponse", - value: walletUrl, - });*/ return ''; }, []); @@ -68,8 +65,74 @@ function App() { }; }, []); - const handleMessage = (e) => { - console.log(e); + const handleMessage = async (event: MessageEvent) => { + if (!walletWindow) { + return; + } + + switch (event.data.type) { + case "WALLET_OPENED": + postMessageToWallet({ + id: generateId(), + type: 'INIT', + sessionId: 'mcyc0abl-8q11zpb', + }); + + console.log(authInput) + postMessageToWallet({ + id: generateId(), + type: 'REQUEST', + action: authInput?.action, + payload: authInput?.payload + }); + + console.log('sent init message') + break; + case "RESPONSE": + let data = event.data; + if (data.payload) { + const parsedPayload = JSON.stringify(data.payload, (_, v) => { + if (typeof v === 'bigint') { + return {_isBigInt: true, data: v.toString()}; + } else if (v instanceof Uint8Array) { + return {_isUint8Array: true, data: bytesToHex(v)}; + } else { + return v; + } + }); + + data = {...data, payload: btoa(parsedPayload)}; + } + + console.log(data); + + setMessageToSend({ + functionName: "HandleResponse", + value: JSON.stringify(data) + }); + + walletWindow.close(); + break; + } + } + + function bytesToHex(bytes: Uint8Array): string { + return '0x' + Array.from(bytes) + .map(b => b.toString(16).padStart(2, "0")) + .join(""); + } + + const postMessageToWallet = (message: any) => { + try { + if (!walletWindow) { + throw new Error("Unable to find wallet"); + } + + const walletOrigin = new URL(authInput?.url || '').origin; + walletWindow.postMessage(message, walletOrigin); + } catch (e) { + console.error(e); + } } const handleResize = () => { @@ -89,6 +152,12 @@ function App() { container.style.height = h + "px"; } + const generateId = (): string => { + return `${Date.now().toString(36)}-${Math.random() + .toString(36) + .substring(2, 9)}`; + } + return (
diff --git a/Packages/Sequence-Unity/Plugins/Web/SocialSignIn.jslib b/Packages/Sequence-Unity/Plugins/Web/SocialSignIn.jslib index f4e3b9b9..3ee18060 100644 --- a/Packages/Sequence-Unity/Plugins/Web/SocialSignIn.jslib +++ b/Packages/Sequence-Unity/Plugins/Web/SocialSignIn.jslib @@ -8,4 +8,10 @@ mergeInto(LibraryManager.library, { window.dispatchReactUnityEvent("OpenWalletApp", UTF8ToString(url)); }, + GetPageOrigin: function () { + var origin = window.location.origin; + var buffer = allocate(intArrayFromString(origin), 'i8', ALLOC_STACK); + return buffer; + } + }); diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index e208b581..432d8b44 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -308,6 +308,141 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 17360256} m_CullTransparentMesh: 1 +--- !u!1 &90459729 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 90459730} + - component: {fileID: 90459732} + - component: {fileID: 90459731} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &90459730 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 90459729} + 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: 203863150} + 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: 10, y: 0} + m_SizeDelta: {x: -40, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &90459731 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 90459729} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Use Mnemonic + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &90459732 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 90459729} + m_CullTransparentMesh: 1 --- !u!1 &116513910 GameObject: m_ObjectHideFlags: 0 @@ -603,6 +738,156 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 161099257} m_CullTransparentMesh: 1 +--- !u!1 &203863149 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 203863150} + - component: {fileID: 203863154} + - component: {fileID: 203863153} + - component: {fileID: 203863152} + - component: {fileID: 203863151} + m_Layer: 5 + m_Name: MnemonicButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &203863150 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 203863149} + 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: 90459730} + - {fileID: 748463502} + m_Father: {fileID: 4209220039127894524} + m_RootOrder: 7 + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &203863151 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 203863149} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &203863152 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 203863149} + 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.8509804} + 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: 0 + m_TargetGraphic: {fileID: 203863153} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignInWithMnemonic + 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 &203863153 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 203863149} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &203863154 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 203863149} + m_CullTransparentMesh: 1 --- !u!1 &220577104 GameObject: m_ObjectHideFlags: 0 @@ -1014,7 +1299,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 448961315} m_CullTransparentMesh: 1 ---- !u!1 &628532634 +--- !u!1 &467585875 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1022,11 +1307,296 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 628532637} - - component: {fileID: 628532636} - - component: {fileID: 628532635} - m_Layer: 0 - m_Name: EventSystem + - component: {fileID: 467585876} + - component: {fileID: 467585878} + - component: {fileID: 467585877} + m_Layer: 5 + m_Name: Text (TMP) (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &467585876 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 467585875} + 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: 4209220039127894524} + 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: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &467585877 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 467585875} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Sign In + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4284900966 + m_fontColor: {r: 0.4, g: 0.4, b: 0.4, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 2, 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 &467585878 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 467585875} + m_CullTransparentMesh: 1 +--- !u!1 &512459740 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 512459741} + - component: {fileID: 512459745} + - component: {fileID: 512459744} + - component: {fileID: 512459743} + - component: {fileID: 512459742} + m_Layer: 5 + m_Name: PasskeyButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &512459741 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512459740} + 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: 960124013} + - {fileID: 1883453221} + m_Father: {fileID: 4209220039127894524} + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &512459742 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512459740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &512459743 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512459740} + 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.8509804} + 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: 0 + m_TargetGraphic: {fileID: 512459744} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignInWithPasskey + 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 &512459744 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512459740} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &512459745 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512459740} + m_CullTransparentMesh: 1 +--- !u!1 &628532634 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 628532637} + - component: {fileID: 628532636} + - component: {fileID: 628532635} + m_Layer: 0 + m_Name: EventSystem m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -1117,7 +1687,7 @@ RectTransform: - {fileID: 1423156422} - {fileID: 17360257} m_Father: {fileID: 4209220039127894524} - m_RootOrder: 0 + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1235,7 +1805,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 722266040} m_CullTransparentMesh: 1 ---- !u!1 &796531349 +--- !u!1 &748463501 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1243,8 +1813,84 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 796531350} - - component: {fileID: 796531352} + - component: {fileID: 748463502} + - component: {fileID: 748463504} + - component: {fileID: 748463503} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &748463502 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748463501} + 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: 203863150} + 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: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &748463503 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748463501} + 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: 7587ac7b3e6c1471ca5ab6307ab32ec5, 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 &748463504 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748463501} + m_CullTransparentMesh: 1 +--- !u!1 &796531349 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 796531350} + - component: {fileID: 796531352} - component: {fileID: 796531351} m_Layer: 5 m_Name: Text (TMP) @@ -1407,6 +2053,82 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 28} m_Pivot: {x: 0.5, y: 1} +--- !u!1 &900828004 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 900828005} + - component: {fileID: 900828007} + - component: {fileID: 900828006} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &900828005 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 900828004} + 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: 1129766508066712729} + 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: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &900828006 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 900828004} + 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: d03d44fa67fc3480a9617f6df236254d, 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 &900828007 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 900828004} + m_CullTransparentMesh: 1 --- !u!1 &906953578 GameObject: m_ObjectHideFlags: 0 @@ -1636,6 +2358,141 @@ MonoBehaviour: m_ChildScaleWidth: 0 m_ChildScaleHeight: 0 m_ReverseArrangement: 0 +--- !u!1 &960124012 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 960124013} + - component: {fileID: 960124015} + - component: {fileID: 960124014} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &960124013 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 960124012} + 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: 512459741} + 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: 10, y: 0} + m_SizeDelta: {x: -40, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &960124014 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 960124012} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Use Passkey + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &960124015 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 960124012} + m_CullTransparentMesh: 1 --- !u!1 &1050865737 GameObject: m_ObjectHideFlags: 0 @@ -1744,6 +2601,141 @@ GameObject: m_CorrespondingSourceObject: {fileID: 3094631411173026328, guid: 21aa1af318f304faca1367525db9bc28, type: 3} m_PrefabInstance: {fileID: 5107492344900098706} m_PrefabAsset: {fileID: 0} +--- !u!1 &1115529824 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1115529825} + - component: {fileID: 1115529827} + - component: {fileID: 1115529826} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1115529825 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1115529824} + 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: 4209220039127894524} + 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: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1115529826 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1115529824} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Select a session type + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4284900966 + m_fontColor: {r: 0.4, g: 0.4, b: 0.4, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 2, 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 &1115529827 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1115529824} + m_CullTransparentMesh: 1 --- !u!1 &1126746399 GameObject: m_ObjectHideFlags: 0 @@ -2191,7 +3183,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1423156421} m_CullTransparentMesh: 1 ---- !u!1 &1788955834 +--- !u!1 &1446444768 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2199,43 +3191,43 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1788955835} - - component: {fileID: 1788955837} - - component: {fileID: 1788955836} + - component: {fileID: 1446444769} + - component: {fileID: 1446444771} + - component: {fileID: 1446444770} m_Layer: 5 - m_Name: Background + m_Name: Image (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1788955835 +--- !u!224 &1446444769 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1788955834} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1446444768} + 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: 1050865742} - m_RootOrder: 0 + m_Father: {fileID: 3495957624811024636} + 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: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1788955836 +--- !u!114 &1446444770 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1788955834} + m_GameObject: {fileID: 1446444768} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -2249,9 +3241,9 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 76b048e2d7f8e459ca9b54c935448f66, type: 3} + m_Sprite: {fileID: 21300000, guid: 668a5199388a248cdbcfc5cb42946bde, type: 3} m_Type: 0 - m_PreserveAspect: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -2259,15 +3251,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1788955837 +--- !u!222 &1446444771 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1788955834} + m_GameObject: {fileID: 1446444768} m_CullTransparentMesh: 1 ---- !u!1 &1979708984 +--- !u!1 &1492627056 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2275,183 +3267,178 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1979708985} - - component: {fileID: 1979708988} - - component: {fileID: 1979708987} - - component: {fileID: 1979708986} + - component: {fileID: 1492627057} + - component: {fileID: 1492627059} + - component: {fileID: 1492627058} m_Layer: 5 - m_Name: Scrollbar + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1979708985 +--- !u!224 &1492627057 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1979708984} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1492627056} + 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: 1267233531} - m_Father: {fileID: 17360257} - m_RootOrder: 1 + m_Children: [] + m_Father: {fileID: 1129766508066712729} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} + m_AnchorMin: {x: 0, 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 &1979708986 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1979708984} - 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: 161099259} - m_HandleRect: {fileID: 161099258} - m_Direction: 2 - m_Value: 0 - m_Size: 0.2 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &1979708987 + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: -40, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1492627058 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1979708984} + m_GameObject: {fileID: 1492627056} 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} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 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 &1979708988 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1979708984} - m_CullTransparentMesh: 1 ---- !u!1 &2053860376 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} + m_text: Sign In with Google + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &1492627059 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1492627056} + m_CullTransparentMesh: 1 +--- !u!1 &1721989092 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2053860377} - - component: {fileID: 2053860380} - - component: {fileID: 2053860379} - - component: {fileID: 2053860378} + - component: {fileID: 1721989093} + - component: {fileID: 1721989095} + - component: {fileID: 1721989094} m_Layer: 5 - m_Name: VersionText + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &2053860377 +--- !u!224 &1721989093 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2053860376} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1721989092} + 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: 1050865742} - m_RootOrder: 2 + m_Father: {fileID: 3495957624811024636} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -5, y: 5} - m_SizeDelta: {x: 300, y: 10} - m_Pivot: {x: 1, y: 0} ---- !u!114 &2053860378 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2053860376} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 66917f722796445f1a9d5d54218cd973, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!114 &2053860379 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: -40, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1721989094 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2053860376} + m_GameObject: {fileID: 1721989092} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -2465,7 +3452,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Version + m_text: Sign In with Apple m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -2474,8 +3461,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 2583691263 - m_fontColor: {r: 1, g: 1, b: 1, a: 0.6} + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -2498,8 +3485,8 @@ MonoBehaviour: m_enableAutoSizing: 0 m_fontSizeMin: 18 m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 4 + m_fontStyle: 1 + m_HorizontalAlignment: 1 m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 @@ -2534,15 +3521,15 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &2053860380 +--- !u!222 &1721989095 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2053860376} + m_GameObject: {fileID: 1721989092} m_CullTransparentMesh: 1 ---- !u!1 &2100922579 +--- !u!1 &1788955834 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2550,45 +3537,43 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2100922580} - - component: {fileID: 2100922583} - - component: {fileID: 2100922582} - - component: {fileID: 2100922581} + - component: {fileID: 1788955835} + - component: {fileID: 1788955837} + - component: {fileID: 1788955836} m_Layer: 5 - m_Name: Viewport + m_Name: Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &2100922580 +--- !u!224 &1788955835 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2100922579} + m_GameObject: {fileID: 1788955834} 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: 873417223} - m_Father: {fileID: 17360257} + m_Children: [] + m_Father: {fileID: 1050865742} 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 &2100922581 + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1788955836 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2100922579} + m_GameObject: {fileID: 1788955834} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -2602,8 +3587,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 + m_Sprite: {fileID: 21300000, guid: 76b048e2d7f8e459ca9b54c935448f66, type: 3} + m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -2612,28 +3597,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &2100922582 +--- !u!222 &1788955837 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2100922579} + m_GameObject: {fileID: 1788955834} m_CullTransparentMesh: 1 ---- !u!114 &2100922583 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2100922579} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!1 &105214555915701266 +--- !u!1 &1883453220 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2641,118 +3613,58 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 6668015762455010229} - - component: {fileID: 7468446259786097445} - - component: {fileID: 5160393790428650344} + - component: {fileID: 1883453221} + - component: {fileID: 1883453223} + - component: {fileID: 1883453222} m_Layer: 5 - m_Name: Layout + m_Name: Image (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &292080265208782336 +--- !u!224 &1883453221 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7453753217345858256} + m_GameObject: {fileID: 1883453220} 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: 5626829297434306198} + m_Father: {fileID: 512459741} 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: 95, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &320339275645968252 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4209220039127894524} - - component: {fileID: 4993712313665796667} - - component: {fileID: 7675607662054216073} - m_Layer: 5 - m_Name: LoginState - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &364841223076288887 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1185936199800087165} - 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: 3251032449294067148} - 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: 10, y: 0} - m_SizeDelta: {x: -40, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &370308474855488987 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6736238217287931418} - 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: 1129766508066712729} - - {fileID: 3495957624811024636} - m_Father: {fileID: 4209220039127894524} - 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: 30} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &380487859157681410 +--- !u!114 &1883453222 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8750106440804939110} + m_GameObject: {fileID: 1883453220} 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.19215687, g: 0.19215687, b: 0.19215687, 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: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 + m_Sprite: {fileID: 21300000, guid: 7587ac7b3e6c1471ca5ab6307ab32ec5, type: 3} + m_Type: 0 m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 @@ -2761,41 +3673,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!114 &489461982354477915 -MonoBehaviour: +--- !u!222 &1883453223 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6736238217287931418} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, 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!222 &632956993693942245 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7235549539173168322} + m_GameObject: {fileID: 1883453220} m_CullTransparentMesh: 1 ---- !u!1 &769755465153914955 +--- !u!1 &1979708984 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2803,23 +3689,94 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 5626829297434306198} - - component: {fileID: 7564344634148780842} - - component: {fileID: 1994501452718507400} + - component: {fileID: 1979708985} + - component: {fileID: 1979708988} + - component: {fileID: 1979708987} + - component: {fileID: 1979708986} m_Layer: 5 - m_Name: Layout + m_Name: Scrollbar m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &777970533174975600 +--- !u!224 &1979708985 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1979708984} + 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: 1267233531} + m_Father: {fileID: 17360257} + 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 &1979708986 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2445699972653285594} + m_GameObject: {fileID: 1979708984} + 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: 161099259} + m_HandleRect: {fileID: 161099258} + m_Direction: 2 + m_Value: 0 + m_Size: 0.2 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1979708987 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1979708984} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -2833,9 +3790,9 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: d03d44fa67fc3480a9617f6df236254d, type: 3} - m_Type: 0 - m_PreserveAspect: 1 + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -2843,13 +3800,72 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!114 &924609053866080383 +--- !u!222 &1979708988 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1979708984} + m_CullTransparentMesh: 1 +--- !u!1 &2053860376 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2053860377} + - component: {fileID: 2053860380} + - component: {fileID: 2053860379} + - component: {fileID: 2053860378} + m_Layer: 5 + m_Name: VersionText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2053860377 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053860376} + 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: 1050865742} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -5, y: 5} + m_SizeDelta: {x: 300, y: 10} + m_Pivot: {x: 1, y: 0} +--- !u!114 &2053860378 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053860376} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66917f722796445f1a9d5d54218cd973, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &2053860379 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7426289429606426455} + m_GameObject: {fileID: 2053860376} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -2863,17 +3879,17 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Powered by Sequence + m_text: Version m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4288256409 - m_fontColor: {r: 0.6, g: 0.6, b: 0.6, a: 1} + rgba: 2583691263 + m_fontColor: {r: 1, g: 1, b: 1, a: 0.6} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -2896,8 +3912,8 @@ MonoBehaviour: m_enableAutoSizing: 0 m_fontSizeMin: 18 m_fontSizeMax: 72 - m_fontStyle: 1 - m_HorizontalAlignment: 2 + m_fontStyle: 0 + m_HorizontalAlignment: 4 m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 @@ -2932,15 +3948,15 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &949280588057901389 +--- !u!222 &2053860380 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1571441453081982020} + m_GameObject: {fileID: 2053860376} m_CullTransparentMesh: 1 ---- !u!1 &1039274815797997968 +--- !u!1 &2100922579 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2948,24 +3964,175 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 4231729613209684367} - - component: {fileID: 7376973567988763871} - - component: {fileID: 8218687474100291355} + - component: {fileID: 2100922580} + - component: {fileID: 2100922583} + - component: {fileID: 2100922582} + - component: {fileID: 2100922581} m_Layer: 5 - m_Name: Image (1) + m_Name: Viewport m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!222 &1119861398305917097 +--- !u!224 &2100922580 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100922579} + 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: 873417223} + m_Father: {fileID: 17360257} + 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 &2100922581 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100922579} + 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 &2100922582 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7426289429606426455} + m_GameObject: {fileID: 2100922579} m_CullTransparentMesh: 1 +--- !u!114 &2100922583 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100922579} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &320339275645968252 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4209220039127894524} + - component: {fileID: 4993712313665796667} + - component: {fileID: 7675607662054216073} + m_Layer: 5 + m_Name: LoginState + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &364841223076288887 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1185936199800087165} + 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: 3251032449294067148} + 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: 10, y: 0} + m_SizeDelta: {x: -40, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &380487859157681410 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8750106440804939110} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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!1 &1039274815797997968 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4231729613209684367} + - component: {fileID: 7376973567988763871} + - component: {fileID: 8218687474100291355} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 --- !u!224 &1129766508066712729 RectTransform: m_ObjectHideFlags: 0 @@ -2978,14 +4145,15 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 5626829297434306198} - m_Father: {fileID: 370308474855488987} - m_RootOrder: 0 + - {fileID: 1492627057} + - {fileID: 900828005} + m_Father: {fileID: 4209220039127894524} + m_RootOrder: 4 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_SizeDelta: {x: 0, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1181566138228532167 MonoBehaviour: @@ -3062,245 +4230,47 @@ MonoBehaviour: m_PersistentCalls: m_Calls: [] m_OnEndTextSelection: - m_PersistentCalls: - m_Calls: [] - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_OnTouchScreenKeyboardStatusChanged: - m_PersistentCalls: - m_Calls: [] - m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_CustomCaretColor: 0 - m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} - m_Text: - m_CaretBlinkRate: 0.85 - m_CaretWidth: 1 - m_ReadOnly: 0 - m_RichText: 1 - m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_OnFocusSelectAll: 1 - m_ResetOnDeActivation: 1 - m_RestoreOriginalTextOnEscape: 1 - m_isRichTextEditingAllowed: 0 - m_LineLimit: 0 - m_InputValidator: {fileID: 0} ---- !u!224 &1184608820065580092 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2445699972653285594} - 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: 5626829297434306198} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 7.5, y: -15} - m_SizeDelta: {x: 15, y: 15} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1185936199800087165 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 364841223076288887} - - component: {fileID: 7147867555355416424} - - component: {fileID: 4272771836669574709} - m_Layer: 5 - m_Name: Text (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1202243266122474360 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7453753217345858256} - 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: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Continue with Google - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - 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: 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!114 &1222631999357543459 -MonoBehaviour: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!1 &1185936199800087165 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1571441453081982020} - 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: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Continue with Apple - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - 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: 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} + serializedVersion: 6 + m_Component: + - component: {fileID: 364841223076288887} + - component: {fileID: 7147867555355416424} + - component: {fileID: 4272771836669574709} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 --- !u!114 &1365941811581567776 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3452,24 +4422,6 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 ---- !u!1 &1571441453081982020 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6827772154608939493} - - component: {fileID: 949280588057901389} - - component: {fileID: 1222631999357543459} - m_Layer: 5 - m_Name: Text (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 --- !u!224 &1654620268838434455 RectTransform: m_ObjectHideFlags: 0 @@ -3490,44 +4442,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 7, y: 7} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1749343221507412373 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5776690245397318217} - m_Layer: 5 - m_Name: Break - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!222 &1969879511555196001 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4154666571978088412} - m_CullTransparentMesh: 1 ---- !u!114 &1994501452718507400 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 769755465153914955} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 2 - m_VerticalFit: 0 --- !u!224 &2198483992803733903 RectTransform: m_ObjectHideFlags: 0 @@ -3552,7 +4466,7 @@ RectTransform: 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: 240, y: 210} + m_SizeDelta: {x: 240, y: 290} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2325936309338030303 MonoBehaviour: @@ -3611,26 +4525,6 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 ---- !u!224 &2360241989201869676 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7134328821713460319} - 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: 6668015762455010229} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 7.5, y: -15} - m_SizeDelta: {x: 15, y: 15} - m_Pivot: {x: 0.5, y: 0.5} --- !u!224 &2364319422627657610 RectTransform: m_ObjectHideFlags: 0 @@ -3762,24 +4656,6 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!1 &2445699972653285594 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1184608820065580092} - - component: {fileID: 4551461482545358887} - - component: {fileID: 777970533174975600} - m_Layer: 5 - m_Name: Icon - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 --- !u!1 &2673375261290894866 GameObject: m_ObjectHideFlags: 0 @@ -3866,36 +4742,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &2905918359473744821 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7134328821713460319} - 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: 668a5199388a248cdbcfc5cb42946bde, 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!114 &3025777727642342367 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3996,54 +4842,15 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 6668015762455010229} - m_Father: {fileID: 370308474855488987} - m_RootOrder: 1 + - {fileID: 1721989093} + - {fileID: 1446444769} + m_Father: {fileID: 4209220039127894524} + m_RootOrder: 5 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!224 &3530038144121264930 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7235549539173168322} - 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: 5776690245397318217} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.6, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: -0.0000038146973, y: 0} - m_SizeDelta: {x: 0, y: 1} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &3768554904066845669 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4154666571978088412} - 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: 5776690245397318217} - 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_SizeDelta: {x: 0, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &3833055132679331405 MonoBehaviour: @@ -4132,24 +4939,6 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 ---- !u!1 &4154666571978088412 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3768554904066845669} - - component: {fileID: 1969879511555196001} - - component: {fileID: 6701857477172623370} - m_Layer: 5 - m_Name: Text (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 --- !u!224 &4209220039127894524 RectTransform: m_ObjectHideFlags: 0 @@ -4162,11 +4951,14 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: + - {fileID: 1115529825} - {fileID: 722266041} - - {fileID: 5776690245397318217} - - {fileID: 370308474855488987} + - {fileID: 467585876} - {fileID: 2856355940061643817} - - {fileID: 7902663795230052217} + - {fileID: 1129766508066712729} + - {fileID: 3495957624811024636} + - {fileID: 512459741} + - {fileID: 203863150} m_Father: {fileID: 2198483992803733903} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -4381,22 +5173,6 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &4551461482545358887 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2445699972653285594} - m_CullTransparentMesh: 1 ---- !u!222 &4820383406529155423 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5252546436801395163} - m_CullTransparentMesh: 1 --- !u!114 &4821899330820860530 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4614,20 +5390,6 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} m_PrefabInstance: {fileID: 5107492344900098706} m_PrefabAsset: {fileID: 0} ---- !u!114 &5160393790428650344 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 105214555915701266} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 2 - m_VerticalFit: 0 --- !u!222 &5231001844959997263 CanvasRenderer: m_ObjectHideFlags: 0 @@ -4803,245 +5565,26 @@ MonoBehaviour: m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} --- !u!224 &5231001846775536177 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5231001846775536178} - 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: 2198483992803733903} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 1} - m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: 0, y: -20} - m_SizeDelta: {x: 200, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &5231001846775536178 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5231001846775536177} - - component: {fileID: 5231001846775536143} - - component: {fileID: 5231001846775536176} - m_Layer: 5 - m_Name: TitleText - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &5252546436801395163 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7918050602330817002} - - component: {fileID: 4820383406529155423} - - component: {fileID: 6881998436349686276} - m_Layer: 5 - m_Name: Image - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &5626829297434306198 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 769755465153914955} - 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: 1184608820065580092} - - {fileID: 292080265208782336} - m_Father: {fileID: 1129766508066712729} - 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: 0, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &5736418155645019230 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2673375261290894866} - m_CullTransparentMesh: 1 ---- !u!224 &5776690245397318217 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1749343221507412373} - 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: 7918050602330817002} - - {fileID: 3530038144121264930} - - {fileID: 3768554904066845669} - m_Father: {fileID: 4209220039127894524} - 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: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &6427513404366440442 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3245547436246206480} - - component: {fileID: 4896115008353292649} - - component: {fileID: 2369011026816092588} - - component: {fileID: 8630391446351500689} - m_Layer: 5 - m_Name: Placeholder - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &6668015762455010229 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 105214555915701266} - 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: 2360241989201869676} - - {fileID: 6827772154608939493} - m_Father: {fileID: 3495957624811024636} - 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: 0, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &6701857477172623370 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4154666571978088412} - 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: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: select - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4281413937 - m_fontColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - 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: 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!1 &6736238217287931418 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5231001846775536178} + 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: 2198483992803733903} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -20} + m_SizeDelta: {x: 200, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &5231001846775536178 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5049,43 +5592,43 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 370308474855488987} - - component: {fileID: 489461982354477915} + - component: {fileID: 5231001846775536177} + - component: {fileID: 5231001846775536143} + - component: {fileID: 5231001846775536176} m_Layer: 5 - m_Name: SocialLayout + m_Name: TitleText m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &6827772154608939493 -RectTransform: +--- !u!222 &5736418155645019230 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1571441453081982020} - 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: 6668015762455010229} - 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: 90, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &6851259219541849663 -CanvasRenderer: + m_GameObject: {fileID: 2673375261290894866} + m_CullTransparentMesh: 1 +--- !u!1 &6427513404366440442 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7453753217345858256} - m_CullTransparentMesh: 1 + serializedVersion: 6 + m_Component: + - component: {fileID: 3245547436246206480} + - component: {fileID: 4896115008353292649} + - component: {fileID: 2369011026816092588} + - component: {fileID: 8630391446351500689} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 --- !u!1 &6879894437146287264 GameObject: m_ObjectHideFlags: 0 @@ -5106,36 +5649,6 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &6881998436349686276 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5252546436801395163} - 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.19215687, g: 0.19215687, b: 0.19215687, a: 1} - m_RaycastTarget: 0 - 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 &6976053017350654453 CanvasRenderer: m_ObjectHideFlags: 0 @@ -5144,14 +5657,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6879894437146287264} m_CullTransparentMesh: 1 ---- !u!222 &7042892034569271523 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7134328821713460319} - m_CullTransparentMesh: 1 --- !u!224 &7053000246198018492 RectTransform: m_ObjectHideFlags: 0 @@ -5189,24 +5694,6 @@ MonoBehaviour: m_EffectColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 1 ---- !u!1 &7134328821713460319 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2360241989201869676} - - component: {fileID: 7042892034569271523} - - component: {fileID: 2905918359473744821} - m_Layer: 5 - m_Name: Icon - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 --- !u!222 &7147867555355416424 CanvasRenderer: m_ObjectHideFlags: 0 @@ -5215,24 +5702,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1185936199800087165} m_CullTransparentMesh: 1 ---- !u!1 &7235549539173168322 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3530038144121264930} - - component: {fileID: 632956993693942245} - - component: {fileID: 8313833047788328780} - m_Layer: 5 - m_Name: Image (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 --- !u!222 &7376973567988763871 CanvasRenderer: m_ObjectHideFlags: 0 @@ -5254,68 +5723,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_ShowMaskGraphic: 1 ---- !u!1 &7426289429606426455 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7902663795230052217} - - component: {fileID: 1119861398305917097} - - component: {fileID: 924609053866080383} - m_Layer: 5 - m_Name: TitleText - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &7453753217345858256 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 292080265208782336} - - component: {fileID: 6851259219541849663} - - component: {fileID: 1202243266122474360} - m_Layer: 5 - m_Name: Text (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &7468446259786097445 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 105214555915701266} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 4 - m_Spacing: 5 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 1 - m_ChildControlWidth: 0 - m_ChildControlHeight: 0 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 --- !u!1 &7526353788427293348 GameObject: m_ObjectHideFlags: 0 @@ -5333,32 +5740,6 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &7564344634148780842 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 769755465153914955} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 4 - m_Spacing: 5 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 1 - m_ChildControlWidth: 0 - m_ChildControlHeight: 0 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 --- !u!114 &7675607662054216073 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5431,46 +5812,6 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 1 m_CallState: 2 ---- !u!224 &7902663795230052217 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7426289429606426455} - 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: 4209220039127894524} - m_RootOrder: 4 - 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: 25} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &7918050602330817002 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5252546436801395163} - 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: 5776690245397318217} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0.4, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 1} - m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &8046914839405764275 MonoBehaviour: m_ObjectHideFlags: 0 @@ -5551,36 +5892,6 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &8313833047788328780 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7235549539173168322} - 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.19215687, g: 0.19215687, b: 0.19215687, a: 1} - m_RaycastTarget: 0 - 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!1 &8496890551459878638 GameObject: m_ObjectHideFlags: 0 diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs index 367802f2..f174b797 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs @@ -79,6 +79,36 @@ public async void SignInWithApple() ShowError(e.Message); } } + + public async void SignInWithPasskey() + { + SetLoading(true); + + try + { + var wallet = await _login.SignInWithPasskey(_sessionType); + ShowWallet(wallet, false); + } + catch (Exception e) + { + ShowError(e.Message); + } + } + + public async void SignInWithMnemonic() + { + SetLoading(true); + + try + { + var wallet = await _login.SignInWithMnemonic(_sessionType); + ShowWallet(wallet, false); + } + catch (Exception e) + { + ShowError(e.Message); + } + } public void SignOut() { @@ -94,7 +124,7 @@ public void OnSessionTypeChanged(int index) private void ShowError(string error) { Debug.LogError(error); - _messagePopup.Show(error); + _messagePopup.Show(error, true); SetLoading(false); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs new file mode 100644 index 00000000..34d6e233 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs @@ -0,0 +1,24 @@ +using System.Runtime.InteropServices; + +namespace Sequence.EcosystemWallet.Authentication +{ + internal static class RedirectOrigin + { + public const string DefaultOrigin = "http://localhost:8080/"; + +#if UNITY_WEBGL &&! UNITY_EDITOR + [DllImport("__Internal")] + private static extern System.IntPtr GetPageOrigin(); + + public static string GetOriginString() + { + return Marshal.PtrToStringAnsi(GetPageOrigin()); + } +#else + public static string GetOriginString() + { + return DefaultOrigin; + } +#endif + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs.meta new file mode 100644 index 00000000..415b5b32 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8c3df5890313460e88db35070a602b4a +timeCreated: 1752227561 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs index eac16949..ae05e8e6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs @@ -52,6 +52,16 @@ public async Task SignInWithApple(SessionType sessionTy { return await CreateNewSession(GetPermissionsFromSessionType(sessionType),"apple"); } + + public async Task SignInWithPasskey(SessionType sessionType) + { + return await CreateNewSession(GetPermissionsFromSessionType(sessionType),"passkey"); + } + + public async Task SignInWithMnemonic(SessionType sessionType) + { + return await CreateNewSession(GetPermissionsFromSessionType(sessionType),"mnemonic"); + } public SequenceEcosystemWallet RecoverSessionFromStorage() { @@ -86,7 +96,7 @@ private async Task CreateNewSession(SessionPermissions payload.Add("email", email); if (isImplicitSession) - payload.Add("implicitSessionRedirectUrl", "http://localhost:4444/"); + payload.Add("implicitSessionRedirectUrl", RedirectOrigin.GetOriginString()); if (!isImplicitSession) payload.Add("permissions", permissions.ToJson()); @@ -112,7 +122,6 @@ private async Task CreateNewSession(SessionPermissions var encodedResponsePayload = response.QueryString["payload"]; var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(encodedResponsePayload)); - Debug.Log(responsePayloadJson); var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); if (responsePayload.attestation != null) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs index a59eaa12..a7a91f8e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs @@ -32,6 +32,9 @@ private class ResponseData _receiver = go.AddComponent(); var response = await _receiver.WaitForResponse(JsonConvert.SerializeObject(new {url, action, payload})); + + GameObject.Destroy(_receiver.gameObject); + var data = JsonConvert.DeserializeObject(response); if (data.error != null) throw new Exception(data.error.error); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs index b2860064..b6e2728b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs @@ -5,26 +5,25 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; +using Sequence.EcosystemWallet.Authentication; using UnityEngine; namespace Sequence.EcosystemWallet.Browser { public class LocalhostRedirectHandler : IRedirectHandler { - private const string Listener = "http://localhost:8080"; - public async Task<(bool Result, NameValueCollection QueryString)> WaitForResponse(string url, string action, Dictionary payload) { var redirectId = $"sequence:{Guid.NewGuid().ToString()}"; var encodedPayload = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload))); - var finalUrl = $"{url}?action={action}&payload={encodedPayload}&id={redirectId}&redirectUrl={Listener}&mode=redirect"; + var finalUrl = $"{url}?action={action}&payload={encodedPayload}&id={redirectId}&redirectUrl={RedirectOrigin.DefaultOrigin}&mode=redirect"; Application.OpenURL(finalUrl); try { var listener = new HttpListener(); - listener.Prefixes.Add(Listener); + listener.Prefixes.Add(RedirectOrigin.DefaultOrigin); listener.Start(); var context = await listener.GetContextAsync(); diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.tsx b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.tsx index 70606177..83a9a28c 100644 --- a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.tsx +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.tsx @@ -4,6 +4,15 @@ import { useCallback, useEffect, useState } from "react"; import "./App.css"; +let walletWindow: Window | null = null; +let authInput: AuthInput | null = null; + +interface AuthInput { + url: string; + action: string; + payload: string; +} + function App() { const { unityProvider, @@ -23,26 +32,14 @@ function App() { const handleSequenceWalletAuth = useCallback((...parameters: ReactUnityEventParameter[]): ReactUnityEventParameter => { const inputJson = parameters[0] as string; - const input = JSON.parse(inputJson); - - const walletWindow = window.open(input.url, "Wallet", 'width=600,height=400,left=200,top=200'); - if (!walletWindow) { - throw new Error("Unable to find wallet"); - } - - const message = { - id: 'id-123', - type: 'request', - action: input.action, - payload: input.payload - } + authInput = JSON.parse(inputJson) as AuthInput; - walletWindow.postMessage(JSON.stringify(message)); + const sessionId = generateId(); + walletWindow = window.open( + `${authInput?.url}?dappOrigin=${window.location.origin}&sessionId=${sessionId}`, + "Wallet", + 'width=600,height=600,left=300,top=300'); - /*setMessageToSend({ - functionName: "HandleResponse", - value: walletUrl, - });*/ return ''; }, []); @@ -68,8 +65,74 @@ function App() { }; }, []); - const handleMessage = (e) => { - console.log(e); + const handleMessage = async (event: MessageEvent) => { + if (!walletWindow) { + return; + } + + switch (event.data.type) { + case "WALLET_OPENED": + postMessageToWallet({ + id: generateId(), + type: 'INIT', + sessionId: 'mcyc0abl-8q11zpb', + }); + + console.log(authInput) + postMessageToWallet({ + id: generateId(), + type: 'REQUEST', + action: authInput?.action, + payload: authInput?.payload + }); + + console.log('sent init message') + break; + case "RESPONSE": + let data = event.data; + if (data.payload) { + const parsedPayload = JSON.stringify(data.payload, (_, v) => { + if (typeof v === 'bigint') { + return {_isBigInt: true, data: v.toString()}; + } else if (v instanceof Uint8Array) { + return {_isUint8Array: true, data: bytesToHex(v)}; + } else { + return v; + } + }); + + data = {...data, payload: btoa(parsedPayload)}; + } + + console.log(data); + + setMessageToSend({ + functionName: "HandleResponse", + value: JSON.stringify(data) + }); + + walletWindow.close(); + break; + } + } + + function bytesToHex(bytes: Uint8Array): string { + return '0x' + Array.from(bytes) + .map(b => b.toString(16).padStart(2, "0")) + .join(""); + } + + const postMessageToWallet = (message: any) => { + try { + if (!walletWindow) { + throw new Error("Unable to find wallet"); + } + + const walletOrigin = new URL(authInput?.url || '').origin; + walletWindow.postMessage(message, walletOrigin); + } catch (e) { + console.error(e); + } } const handleResize = () => { @@ -89,6 +152,12 @@ function App() { container.style.height = h + "px"; } + const generateId = (): string => { + return `${Date.now().toString(36)}-${Math.random() + .toString(36) + .substring(2, 9)}`; + } + return (
From 3ebf38ecc8eea31d47426e0c077586df66893a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 15 Jul 2025 22:53:02 +0200 Subject: [PATCH 102/165] added SessionBuilder and SessionTemplates --- .../UnitTests/AuthenticationTests.cs | 19 ++-- .../SequenceEcosystemWalletWindow.cs | 34 ++++-- .../SequenceEcosystemWalletLogin.cs | 107 ++---------------- .../Authentication/SessionBuilder.cs | 72 ++++++++++++ .../Authentication/SessionBuilder.cs.meta | 3 + .../Authentication/SessionTemplates.cs | 52 +++++++++ .../Authentication/SessionTemplates.cs.meta | 3 + 7 files changed, 178 insertions(+), 112 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs index 8e21d85a..f3abe788 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs @@ -2,19 +2,21 @@ using System.Threading.Tasks; using NUnit.Framework; using Sequence.EcosystemWallet.Authentication; +using Sequence.EcosystemWallet.Primitives; namespace Sequence.EcosystemWallet.UnitTests { public class AuthenticationTests { - private readonly SequenceEcosystemWalletLogin _login = new(Chain.TestnetArbitrumSepolia); + private static readonly Chain _chain = Chain.TestnetArbitrumSepolia; + private readonly SequenceEcosystemWalletLogin _login = new(_chain); [TestCase("agru@horizon.io", "implicit")] [TestCase("agru@horizon.io", "explicit_open")] [TestCase("agru@horizon.io", "explicit_restrictive")] public async Task SignInWithEmailTest(string email, string sessionType) { - var wallet = await _login.SignInWithEmail(email, ConvertToSessionType(sessionType)); + var wallet = await _login.SignInWithEmail(email, GetPermissionsFromInput(sessionType)); CheckStoredWallet(wallet); } @@ -23,7 +25,7 @@ public async Task SignInWithEmailTest(string email, string sessionType) [TestCase("explicit_restrictive")] public async Task SignInWithGoogleTest(string sessionType) { - var wallet = await _login.SignInWithGoogle(ConvertToSessionType(sessionType)); + var wallet = await _login.SignInWithGoogle(GetPermissionsFromInput(sessionType)); CheckStoredWallet(wallet); } @@ -32,7 +34,7 @@ public async Task SignInWithGoogleTest(string sessionType) [TestCase("explicit_restrictive")] public async Task SignInWithAppleTest(string sessionType) { - var wallet = await _login.SignInWithApple(ConvertToSessionType(sessionType)); + var wallet = await _login.SignInWithApple(GetPermissionsFromInput(sessionType)); CheckStoredWallet(wallet); } @@ -42,13 +44,14 @@ private void CheckStoredWallet(SequenceEcosystemWallet wallet) Assert.AreEqual(storedWallet.Address, wallet.Address); } - private SequenceEcosystemWalletLogin.SessionType ConvertToSessionType(string sessionType) + private SessionPermissions GetPermissionsFromInput(string sessionType) { + var templates = new SessionTemplates(_chain); return sessionType switch { - "implicit" => SequenceEcosystemWalletLogin.SessionType.Implicit, - "explicit_open" => SequenceEcosystemWalletLogin.SessionType.ExplicitOpen, - "explicit_restrictive" => SequenceEcosystemWalletLogin.SessionType.ExplicitRestrictive, + "implicit" => null, + "explicit_open" => templates.BuildUnrestrictivePermissions(), + "explicit_restrictive" => templates.BuildBasicRestrictivePermissions(), _ => throw new Exception("Invalid session type"), }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs index f174b797..b414910b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs @@ -1,5 +1,6 @@ using System; using Sequence.EcosystemWallet.Authentication; +using Sequence.EcosystemWallet.Primitives; using TMPro; using UnityEngine; using UnityEngine.UI; @@ -8,6 +9,13 @@ namespace Sequence.Boilerplates { public class SequenceEcosystemWalletWindow : MonoBehaviour { + private enum SessionType + { + Implicit, + ExplicitOpen, + ExplicitRestrictive + } + [SerializeField] private Button _emailLoginButton; [SerializeField] private Button _emailContinueButton; [SerializeField] private TMP_InputField _emailInput; @@ -18,7 +26,7 @@ public class SequenceEcosystemWalletWindow : MonoBehaviour [SerializeField] private MessagePopup _messagePopup; private SequenceEcosystemWalletLogin _login; - private SequenceEcosystemWalletLogin.SessionType _sessionType; + private SessionType _sessionType; private string _curEmail; private void Start() @@ -41,7 +49,7 @@ public async void SignInWithEmail() try { - var wallet = await _login.SignInWithEmail(_curEmail, _sessionType); + var wallet = await _login.SignInWithEmail(_curEmail, GetPermissionsFromSessionType()); ShowWallet(wallet, false); } catch (Exception e) @@ -56,7 +64,7 @@ public async void SignInWithGoogle() try { - var wallet = await _login.SignInWithGoogle(_sessionType); + var wallet = await _login.SignInWithGoogle(GetPermissionsFromSessionType()); ShowWallet(wallet, false); } catch (Exception e) @@ -71,7 +79,7 @@ public async void SignInWithApple() try { - var wallet = await _login.SignInWithApple(_sessionType); + var wallet = await _login.SignInWithApple(GetPermissionsFromSessionType()); ShowWallet(wallet, false); } catch (Exception e) @@ -86,7 +94,7 @@ public async void SignInWithPasskey() try { - var wallet = await _login.SignInWithPasskey(_sessionType); + var wallet = await _login.SignInWithPasskey(GetPermissionsFromSessionType()); ShowWallet(wallet, false); } catch (Exception e) @@ -101,7 +109,7 @@ public async void SignInWithMnemonic() try { - var wallet = await _login.SignInWithMnemonic(_sessionType); + var wallet = await _login.SignInWithMnemonic(GetPermissionsFromSessionType()); ShowWallet(wallet, false); } catch (Exception e) @@ -118,7 +126,7 @@ public void SignOut() public void OnSessionTypeChanged(int index) { - _sessionType = (SequenceEcosystemWalletLogin.SessionType)index; + _sessionType = (SessionType)index; } private void ShowError(string error) @@ -172,5 +180,17 @@ private void VerifyEmailInput(string input) _emailContinueButton.interactable = validEmail; } + + private SessionPermissions GetPermissionsFromSessionType() + { + var templates = new SessionTemplates(Chain.TestnetArbitrumSepolia); + return _sessionType switch + { + SessionType.Implicit => null, + SessionType.ExplicitOpen => templates.BuildUnrestrictivePermissions(), + SessionType.ExplicitRestrictive => templates.BuildBasicRestrictivePermissions(), + _ => throw new Exception("Unsupported session type") + }; + } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs index ae05e8e6..b521fc98 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs @@ -1,15 +1,11 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Numerics; using System.Text; using System.Threading.Tasks; -using System.Web; -using Nethereum.Util; using Newtonsoft.Json; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; -using Sequence.Utils; using Sequence.Wallet; using UnityEngine; @@ -17,16 +13,8 @@ namespace Sequence.EcosystemWallet.Authentication { public class SequenceEcosystemWalletLogin { - public enum SessionType - { - Implicit, - ExplicitOpen, - ExplicitRestrictive - } - private Chain _chain; private string _walletUrl; - private string _emitterAddress; private EOAWallet _sessionWallet; private SessionStorage _sessionStorage; @@ -34,33 +22,32 @@ public SequenceEcosystemWalletLogin(Chain chain) { _chain = chain; _walletUrl = "https://v3.sequence-dev.app"; - _emitterAddress = "0xb7bE532959236170064cf099e1a3395aEf228F44"; _sessionStorage = new SessionStorage(); } - public async Task SignInWithEmail(string email, SessionType sessionType) + public async Task SignInWithEmail(string email, SessionPermissions permissions) { - return await CreateNewSession(GetPermissionsFromSessionType(sessionType),"email", email); + return await CreateNewSession(permissions,"email", email); } - public async Task SignInWithGoogle(SessionType sessionType) + public async Task SignInWithGoogle(SessionPermissions permissions) { - return await CreateNewSession(GetPermissionsFromSessionType(sessionType),"google"); + return await CreateNewSession(permissions,"google"); } - public async Task SignInWithApple(SessionType sessionType) + public async Task SignInWithApple(SessionPermissions permissions) { - return await CreateNewSession(GetPermissionsFromSessionType(sessionType),"apple"); + return await CreateNewSession(permissions,"apple"); } - public async Task SignInWithPasskey(SessionType sessionType) + public async Task SignInWithPasskey(SessionPermissions permissions) { - return await CreateNewSession(GetPermissionsFromSessionType(sessionType),"passkey"); + return await CreateNewSession(permissions,"passkey"); } - public async Task SignInWithMnemonic(SessionType sessionType) + public async Task SignInWithMnemonic(SessionPermissions permissions) { - return await CreateNewSession(GetPermissionsFromSessionType(sessionType),"mnemonic"); + return await CreateNewSession(permissions,"mnemonic"); } public SequenceEcosystemWallet RecoverSessionFromStorage() @@ -143,79 +130,5 @@ private async Task CreateNewSession(SessionPermissions return new SequenceEcosystemWallet(walletAddress); } - - private SessionPermissions GetPermissionsFromSessionType(SessionType sessionType) - { - return sessionType switch - { - SessionType.Implicit => null, - SessionType.ExplicitOpen => GetOpenPermissions(), - SessionType.ExplicitRestrictive => GetRestrictivePermissions(), - _ => throw new Exception("Unsupported session type") - }; - } - - private SessionPermissions GetOpenPermissions() - { - return new SessionPermissions - { - chainId = new BigInteger((int)_chain), - signer = new Address(_emitterAddress), - valueLimit = new BigInteger(0), - deadline = new BigInteger(DateTime.UtcNow.ToUnixTimestamp() * 1000 + 1000 * 60 * 5000), - permissions = new [] - { - new Permission - { - target = new Address("0x8F6066bA491b019bAc33407255f3bc5cC684A5a4"), - rules = Array.Empty() - } - } - }; - } - - private SessionPermissions GetRestrictivePermissions() - { - return new SessionPermissions - { - chainId = new BigInteger((int)_chain), - signer = new Address(_emitterAddress), - valueLimit = new BigInteger(0), - deadline = new BigInteger(DateTime.UtcNow.ToUnixTimestamp() * 1000 + 1000 * 60 * 5000), - permissions = new [] - { - new Permission - { - target = new Address("0x8F6066bA491b019bAc33407255f3bc5cC684A5a4"), - rules = new [] - { - new ParameterRule - { - cumulative = false, - operation = ParameterOperation.equal, - value = HashFunctionSelector("explicitEmit()").HexStringToByteArray().PadRight(32), - offset = new BigInteger(0), - mask = ParameterRule.SelectorMask - }, - new ParameterRule - { - cumulative = true, - operation = ParameterOperation.greaterThanOrEqual, - value = "0x1234567890123456789012345678901234567890".HexStringToByteArray().PadRight(32), - offset = new BigInteger(4), - mask = ParameterRule.Uint256Mask - } - } - } - } - }; - } - - private string HashFunctionSelector(string function) - { - var sha3 = new Sha3Keccack(); - var hash = sha3.CalculateHash(function); - return "0x" + hash.Substring(0, 8); - } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs new file mode 100644 index 00000000..fa264f73 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs @@ -0,0 +1,72 @@ +using System.Collections.Generic; +using System.Numerics; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Authentication +{ + public class SessionBuilder + { + public Chain Chain; + public Address Signer; + public BigInteger ValueLimit; + public BigInteger Deadline; + + private Dictionary> _permissions = new(); + + public SessionBuilder(Chain chain, Address signer, BigInteger valueLimit, BigInteger deadline) + { + this.Chain = chain; + this.Signer = signer; + this.ValueLimit = valueLimit; + this.Deadline = deadline; + } + + public void AddPermission(Address target) + { + if (!_permissions.ContainsKey(target)) + _permissions.Add(target, new List()); + } + + public void AddPermission(Address target, bool cumulative, ParameterOperation operation, string value, BigInteger offset, byte[] mask) + { + var rule = new ParameterRule + { + cumulative = cumulative, + operation = operation, + value = value.HexStringToByteArray().PadRight(32), + offset = offset, + mask = mask + }; + + if (!_permissions.ContainsKey(target)) + _permissions.Add(target, new List()); + + _permissions[target].Add(rule); + } + + public SessionPermissions GetPermissions() + { + var targets = _permissions.GetKeys(); + var permissions = new Permission[targets.Length]; + + for (var i = 0; i < targets.Length; i++) + { + permissions[i] = new Permission + { + target = targets[i], + rules = _permissions[targets[i]].ToArray() + }; + } + + return new SessionPermissions + { + chainId = new BigInteger((int)Chain), + signer = new Address(Signer), + valueLimit = ValueLimit, + deadline = Deadline, + permissions = permissions + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs.meta new file mode 100644 index 00000000..b6d89dcd --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 17a642e1e798445980e09b495fea66bc +timeCreated: 1752611111 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs new file mode 100644 index 00000000..61c195fd --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs @@ -0,0 +1,52 @@ +using System; +using System.Numerics; +using Nethereum.Util; +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.Authentication +{ + public class SessionTemplates + { + private readonly Chain _chain; + + public SessionTemplates(Chain chain) + { + _chain = chain; + } + + public SessionPermissions BuildUnrestrictivePermissions() + { + var signer = new Address("0xb7bE532959236170064cf099e1a3395aEf228F44"); + var deadline = new BigInteger(DateTime.UtcNow.ToUnixTimestamp() * 1000 + 1000 * 60 * 5000); + var target = new Address("0x8F6066bA491b019bAc33407255f3bc5cC684A5a4"); + + var sessionBuilder = new SessionBuilder(_chain, signer, 0, deadline); + sessionBuilder.AddPermission(target); + + return sessionBuilder.GetPermissions(); + } + + public SessionPermissions BuildBasicRestrictivePermissions() + { + var signer = new Address("0xb7bE532959236170064cf099e1a3395aEf228F44"); + var deadline = new BigInteger(DateTime.UtcNow.ToUnixTimestamp() * 1000 + 1000 * 60 * 5000); + var target = new Address("0x8F6066bA491b019bAc33407255f3bc5cC684A5a4"); + + var sessionBuilder = new SessionBuilder(_chain, signer, 0, deadline); + sessionBuilder.AddPermission(target, false, ParameterOperation.equal, + HashFunctionSelector("explicitEmit()"), 0, ParameterRule.SelectorMask); + + sessionBuilder.AddPermission(target, true, ParameterOperation.greaterThanOrEqual, + "0x1234567890123456789012345678901234567890", 4, ParameterRule.Uint256Mask); + + return sessionBuilder.GetPermissions(); + } + + private string HashFunctionSelector(string function) + { + var sha3 = new Sha3Keccack(); + var hash = sha3.CalculateHash(function); + return "0x" + hash.Substring(0, 8); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs.meta new file mode 100644 index 00000000..65eb3a8d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f89ff3a67cd34f1296cd468264f2738a +timeCreated: 1752612201 \ No newline at end of file From d4b12a498d20cb5b97b04486719b32465e5a7ec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 16 Jul 2025 12:01:49 +0200 Subject: [PATCH 103/165] added sign message request --- .../Sequence/Samples~/Demo V3/DemoV3.unity | 1520 +++++++++++++++-- .../UI/Boilerplates/Common/VersionText.cs | 7 +- .../SequenceEcosystemWalletWindow.cs | 44 + .../Authentication/Requests.meta | 3 + .../Authentication/Requests/Connect.cs | 22 + .../Authentication/Requests/Connect.cs.meta | 3 + .../Authentication/Requests/SignMessage.cs | 18 + .../Requests/SignMessage.cs.meta | 3 + .../Authentication/SequenceEcosystemWallet.cs | 26 +- .../SequenceEcosystemWalletLogin.cs | 62 +- .../RedirectHandler/BrowserRedirectHandler.cs | 6 +- .../RedirectHandler/IRedirectHandler.cs | 4 +- .../RedirectHandler/IosRedirectHandler.cs | 8 +- .../LocalhostRedirectHandler.cs | 17 +- 14 files changed, 1534 insertions(+), 209 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 432d8b44..8e616de9 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -921,6 +921,8 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 148098787} + - {fileID: 1972349263} + - {fileID: 541267863} - {fileID: 906953579} m_Father: {fileID: 2198483992803733903} m_RootOrder: 3 @@ -1299,6 +1301,141 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 448961315} m_CullTransparentMesh: 1 +--- !u!1 &455107485 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 455107486} + - component: {fileID: 455107488} + - component: {fileID: 455107487} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &455107486 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 455107485} + 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: 1972349263} + 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: -10, y: 0} + m_SizeDelta: {x: -40, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &455107487 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 455107485} + 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: 0 + 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: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 + 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: 1 + 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 &455107488 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 455107485} + m_CullTransparentMesh: 1 --- !u!1 &467585875 GameObject: m_ObjectHideFlags: 0 @@ -1584,75 +1721,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 512459740} m_CullTransparentMesh: 1 ---- !u!1 &628532634 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 628532637} - - component: {fileID: 628532636} - - component: {fileID: 628532635} - m_Layer: 0 - m_Name: EventSystem - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &628532635 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 628532634} - 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 &628532636 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 628532634} - 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 &628532637 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 628532634} - 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} ---- !u!1 &722266040 +--- !u!1 &541267862 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1660,50 +1729,65 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 722266041} - - component: {fileID: 722266044} - - component: {fileID: 722266043} - - component: {fileID: 722266042} + - component: {fileID: 541267863} + - component: {fileID: 541267867} + - component: {fileID: 541267866} + - component: {fileID: 541267865} + - component: {fileID: 541267864} m_Layer: 5 - m_Name: SessionDropdown + m_Name: MessageInput m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &722266041 +--- !u!224 &541267863 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 722266040} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 541267862} + 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: 448961316} - - {fileID: 1423156422} - - {fileID: 17360257} - m_Father: {fileID: 4209220039127894524} - m_RootOrder: 1 + - {fileID: 1987947400} + - {fileID: 893155973} + m_Father: {fileID: 220577105} + 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: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &722266042 +--- !u!114 &541267864 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 722266040} + m_GameObject: {fileID: 541267862} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} + m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!114 &541267865 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541267862} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} m_Name: m_EditorClassIdentifier: m_Navigation: @@ -1734,23 +1818,345 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 722266043} - m_Template: {fileID: 17360257} - m_CaptionText: {fileID: 448961317} - m_CaptionImage: {fileID: 0} - m_Placeholder: {fileID: 0} - m_ItemText: {fileID: 390971676} - m_ItemImage: {fileID: 0} - m_Value: 0 - m_Options: - m_Options: - - m_Text: Implicit - m_Image: {fileID: 0} - - m_Text: Explicit (Open) - m_Image: {fileID: 0} - - m_Text: Explicit (Restrictive) - m_Image: {fileID: 0} - m_OnValueChanged: + m_TargetGraphic: {fileID: 541267866} + m_TextViewport: {fileID: 1987947400} + m_TextComponent: {fileID: 1158876113} + m_Placeholder: {fileID: 1035093049} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 0 + m_RegexValue: + m_GlobalPointSize: 14 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!114 &541267866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541267862} + 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: 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &541267867 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541267862} + m_CullTransparentMesh: 1 +--- !u!1 &628532634 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 628532637} + - component: {fileID: 628532636} + - component: {fileID: 628532635} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &628532635 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 628532634} + 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 &628532636 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 628532634} + 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 &628532637 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 628532634} + 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} +--- !u!1 &629025366 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 629025367} + - component: {fileID: 629025369} + - component: {fileID: 629025368} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &629025367 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 629025366} + 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: 2082724705} + 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: 7, y: 7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &629025368 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 629025366} + 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: 7eeaa0f6357c9474abdf30939e119719, 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 &629025369 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 629025366} + m_CullTransparentMesh: 1 +--- !u!1 &722266040 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 722266041} + - component: {fileID: 722266044} + - component: {fileID: 722266043} + - component: {fileID: 722266042} + m_Layer: 5 + m_Name: SessionDropdown + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &722266041 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 722266040} + 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: 448961316} + - {fileID: 1423156422} + - {fileID: 17360257} + m_Father: {fileID: 4209220039127894524} + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &722266042 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 722266040} + 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: 722266043} + m_Template: {fileID: 17360257} + m_CaptionText: {fileID: 448961317} + m_CaptionImage: {fileID: 0} + m_Placeholder: {fileID: 0} + m_ItemText: {fileID: 390971676} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: + - m_Text: Implicit + m_Image: {fileID: 0} + - m_Text: Explicit (Open) + m_Image: {fileID: 0} + - m_Text: Explicit (Restrictive) + m_Image: {fileID: 0} + m_OnValueChanged: m_PersistentCalls: m_Calls: - m_Target: {fileID: 9144345594371459776} @@ -2024,35 +2430,184 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 873417223} + - component: {fileID: 873417223} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &873417223 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 873417222} + 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: 1303578556} + m_Father: {fileID: 2100922580} + 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 &893155972 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 893155973} + - component: {fileID: 893155977} + - component: {fileID: 893155976} + - component: {fileID: 893155975} + - component: {fileID: 893155974} m_Layer: 5 - m_Name: Content + m_Name: Button m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &873417223 +--- !u!224 &893155973 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 873417222} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 893155972} + 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: 1303578556} - m_Father: {fileID: 2100922580} - m_RootOrder: 0 + - {fileID: 1378034940} + m_Father: {fileID: 541267863} + m_RootOrder: 1 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} + 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 &893155974 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893155972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &893155975 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893155972} + 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: 893155976} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignMessage + 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 &893155976 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893155972} + 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.26666668, g: 0.06666667, b: 0.88235295, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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 &893155977 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893155972} + m_CullTransparentMesh: 1 --- !u!1 &900828004 GameObject: m_ObjectHideFlags: 0 @@ -2163,7 +2718,7 @@ RectTransform: m_Children: - {fileID: 946315311} m_Father: {fileID: 220577105} - m_RootOrder: 1 + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -2366,43 +2921,199 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 960124013} - - component: {fileID: 960124015} - - component: {fileID: 960124014} + - component: {fileID: 960124013} + - component: {fileID: 960124015} + - component: {fileID: 960124014} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &960124013 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 960124012} + 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: 512459741} + 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: 10, y: 0} + m_SizeDelta: {x: -40, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &960124014 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 960124012} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Use Passkey + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &960124015 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 960124012} + m_CullTransparentMesh: 1 +--- !u!1 &1035093046 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1035093047} + - component: {fileID: 1035093050} + - component: {fileID: 1035093049} + - component: {fileID: 1035093048} m_Layer: 5 - m_Name: Text (TMP) + m_Name: Placeholder m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &960124013 +--- !u!224 &1035093047 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 960124012} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1035093046} + 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: 512459741} + m_Father: {fileID: 1987947400} 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: 10, y: 0} - m_SizeDelta: {x: -40, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &960124014 +--- !u!114 &1035093048 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 960124012} + m_GameObject: {fileID: 1035093046} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1035093049 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1035093046} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -2410,23 +3121,23 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 + m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Use Passkey + m_text: Enter message to sign... m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + 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} + rgba: 4286611584 + m_fontColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -2459,13 +3170,13 @@ MonoBehaviour: m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_enableWordWrapping: 0 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_enableExtraPadding: 0 + m_enableExtraPadding: 1 checkPaddingRequired: 0 m_isRichText: 1 m_parseCtrlCharacters: 1 @@ -2485,13 +3196,13 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &960124015 +--- !u!222 &1035093050 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 960124012} + m_GameObject: {fileID: 1035093046} m_CullTransparentMesh: 1 --- !u!1 &1050865737 GameObject: @@ -2830,6 +3541,141 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1158876111 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1158876112} + - component: {fileID: 1158876114} + - component: {fileID: 1158876113} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1158876112 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1158876111} + 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: 1987947400} + 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_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1158876113 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1158876111} + 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: "\u200B" + 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: 8 + m_fontSizeBase: 8 + 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: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + 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 &1158876114 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1158876111} + m_CullTransparentMesh: 1 --- !u!1 &1199011675 GameObject: m_ObjectHideFlags: 0 @@ -3107,6 +3953,82 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1331741679} m_CullTransparentMesh: 1 +--- !u!1 &1378034939 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1378034940} + - component: {fileID: 1378034942} + - component: {fileID: 1378034941} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1378034940 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1378034939} + 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: 893155973} + 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: 7, y: 7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1378034941 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1378034939} + 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: 7bff9d6884f5e4bee9b34e722bf48b70, 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 &1378034942 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1378034939} + m_CullTransparentMesh: 1 --- !u!1 &1423156421 GameObject: m_ObjectHideFlags: 0 @@ -3392,7 +4314,83 @@ CanvasRenderer: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1492627056} + m_GameObject: {fileID: 1492627056} + m_CullTransparentMesh: 1 +--- !u!1 &1496107486 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1496107487} + - component: {fileID: 1496107489} + - component: {fileID: 1496107488} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1496107487 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1496107486} + 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: 1972349263} + 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 &1496107488 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1496107486} + 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.12, g: 0.12, b: 0.12, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &1496107489 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1496107486} m_CullTransparentMesh: 1 --- !u!1 &1721989092 GameObject: @@ -3681,6 +4679,45 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1883453220} m_CullTransparentMesh: 1 +--- !u!1 &1972349262 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1972349263} + m_Layer: 5 + m_Name: SignatureLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1972349263 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1972349262} + 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: 1496107487} + - {fileID: 455107486} + - {fileID: 2082724705} + m_Father: {fileID: 220577105} + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1979708984 GameObject: m_ObjectHideFlags: 0 @@ -3808,6 +4845,59 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1979708984} m_CullTransparentMesh: 1 +--- !u!1 &1987947399 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1987947400} + - component: {fileID: 1987947401} + m_Layer: 5 + m_Name: Text Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1987947400 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1987947399} + 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: 1035093047} + - {fileID: 1158876112} + m_Father: {fileID: 541267863} + 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: -10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1987947401 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1987947399} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: -8, y: -5, z: -8, w: -5} + m_Softness: {x: 0, y: 0} --- !u!1 &2053860376 GameObject: m_ObjectHideFlags: 0 @@ -3956,6 +5046,155 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2053860376} m_CullTransparentMesh: 1 +--- !u!1 &2082724704 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2082724705} + - component: {fileID: 2082724709} + - component: {fileID: 2082724708} + - component: {fileID: 2082724707} + - component: {fileID: 2082724706} + m_Layer: 5 + m_Name: CopyButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2082724705 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2082724704} + 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: 629025367} + m_Father: {fileID: 1972349263} + m_RootOrder: 2 + 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 &2082724706 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2082724704} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &2082724707 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2082724704} + 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: 2082724708} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: CopySignature + 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 &2082724708 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2082724704} + 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.19, g: 0.19, b: 0.19, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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 &2082724709 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2082724704} + m_CullTransparentMesh: 1 --- !u!1 &2100922579 GameObject: m_ObjectHideFlags: 0 @@ -6197,8 +7436,11 @@ MonoBehaviour: m_EditorClassIdentifier: _emailLoginButton: {fileID: 1459061464521247473} _emailContinueButton: {fileID: 2325936309338030303} + _signMessageButton: {fileID: 2082724707} _emailInput: {fileID: 1181566138228532167} + _messageInput: {fileID: 541267865} _walletText: {fileID: 148098788} + _signatureText: {fileID: 455107487} _loginState: {fileID: 320339275645968252} _walletState: {fileID: 220577104} _loadingOverlay: {fileID: 1084335994} diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Common/VersionText.cs b/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Common/VersionText.cs index ec425522..988b288b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Common/VersionText.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/Boilerplates/Common/VersionText.cs @@ -9,13 +9,10 @@ public class VersionText : MonoBehaviour private TextMeshProUGUI _text; private SequenceWallet _wallet; - private void Awake() - { - SequenceWallet.OnWalletCreated += OnWalletCreated; - } - private void Start() { + SequenceWallet.OnWalletCreated += OnWalletCreated; + _text = GetComponent(); OnWalletCreated(null); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs index b414910b..e87054bf 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs @@ -18,16 +18,21 @@ private enum SessionType [SerializeField] private Button _emailLoginButton; [SerializeField] private Button _emailContinueButton; + [SerializeField] private Button _signMessageButton; [SerializeField] private TMP_InputField _emailInput; + [SerializeField] private TMP_InputField _messageInput; [SerializeField] private TMP_Text _walletText; + [SerializeField] private TMP_Text _signatureText; [SerializeField] private GameObject _loginState; [SerializeField] private GameObject _walletState; [SerializeField] private GameObject _loadingOverlay; [SerializeField] private MessagePopup _messagePopup; private SequenceEcosystemWalletLogin _login; + private SequenceEcosystemWallet _wallet; private SessionType _sessionType; private string _curEmail; + private string _curSignature; private void Start() { @@ -39,6 +44,7 @@ private void Start() OnSessionTypeChanged(0); EnableWalletState(false); EnableEmailButton(true); + ShowSignature(string.Empty); RecoverWalletFromStorage(); } @@ -118,6 +124,35 @@ public async void SignInWithMnemonic() } } + public async void SignMessage() + { + var message = _messageInput.text; + SetLoading(true); + + try + { + var signature = await _wallet.SignMessage(Chain.TestnetArbitrumSepolia, message); + ShowSignature(signature.signature); + SetLoading(false); + } + catch (Exception e) + { + ShowError(e.Message); + } + } + + public void CopySignature() + { + if (string.IsNullOrEmpty(_curSignature)) + { + _messagePopup.Show("Empty Signature", true); + return; + } + + GUIUtility.systemCopyBuffer = _curSignature; + _messagePopup.Show("Copied"); + } + public void SignOut() { _login.SignOut(); @@ -142,9 +177,18 @@ private void RecoverWalletFromStorage() ShowWallet(wallet, true); } + private void ShowSignature(string signature) + { + _curSignature = signature; + _signatureText.text = signature; + _signMessageButton.interactable = !string.IsNullOrEmpty(_curSignature); + } + private void ShowWallet(SequenceEcosystemWallet wallet, bool recovered) { + _wallet = wallet; _walletText.text = wallet.Address; + EnableWalletState(true); SetLoading(false); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests.meta new file mode 100644 index 00000000..beef7a9f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 05e2f0f8d1b14c478da95a01e6dea42a +timeCreated: 1752658059 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs new file mode 100644 index 00000000..f25aeb83 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs @@ -0,0 +1,22 @@ +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.Authentication +{ + public struct ConnectArgs + { + public Address sessionAddress; + public string preferredLoginMethod; + public string email; + public string implicitSessionRedirectUrl; + public object permissions; + } + + public struct ConnectResponse + { + public Address walletAddress; + public string email; + public string loginMethod; + public Attestation attestation; + public RSY signature; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs.meta new file mode 100644 index 00000000..94abdde3 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e01ae8c265b84b52b0982ab24d5f3db8 +timeCreated: 1752658364 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs new file mode 100644 index 00000000..f7bc6096 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs @@ -0,0 +1,18 @@ +using Sequence.EcosystemWallet.Primitives.Common; + +namespace Sequence.EcosystemWallet.Authentication.Requests +{ + public struct SignMessageArgs + { + public Address address; + public BigInt chainId; + public string message; + } + + public struct SignMessageResponse + { + public string signature; + public string walletAddress; + public string managerRequestId; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs.meta new file mode 100644 index 00000000..b849daa1 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ea2e2b5f8de74b9b8510b831edfa5805 +timeCreated: 1752658074 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs index 1ab3df9a..6f501286 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs @@ -1,20 +1,40 @@ using System; using System.Threading.Tasks; +using Sequence.EcosystemWallet.Authentication.Requests; +using Sequence.EcosystemWallet.Browser; +using Sequence.EcosystemWallet.Primitives.Common; namespace Sequence.EcosystemWallet.Authentication { public class SequenceEcosystemWallet { + public static Action OnWalletCreated; + public Address Address { get; } public SequenceEcosystemWallet(Address address) { - Address = address; + Address = address; + OnWalletCreated?.Invoke(this); } - public async Task SignMessage(string message) + public async Task SignMessage(Chain chain, string message) { - throw new NotImplementedException(); + var args = new SignMessageArgs + { + address = Address, + chainId = new BigInt((int)chain), + message = message + }; + var url = $"{SequenceEcosystemWalletLogin.WalletUrl}/request/sign"; + + var redirectHandler = RedirectFactory.CreateHandler(); + var response = await redirectHandler.WaitForResponse(url, "signMessage", args); + + if (!response.Result) + throw new Exception("Failed to sign message"); + + return response.Data; } public async Task SendTransaction() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs index b521fc98..dac28ec1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs @@ -1,27 +1,22 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; -using Newtonsoft.Json; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; using Sequence.Wallet; -using UnityEngine; namespace Sequence.EcosystemWallet.Authentication { public class SequenceEcosystemWalletLogin { + internal const string WalletUrl = "https://v3.sequence-dev.app"; + private Chain _chain; - private string _walletUrl; private EOAWallet _sessionWallet; private SessionStorage _sessionStorage; public SequenceEcosystemWalletLogin(Chain chain) { _chain = chain; - _walletUrl = "https://v3.sequence-dev.app"; _sessionStorage = new SessionStorage(); } @@ -77,56 +72,33 @@ private async Task CreateNewSession(SessionPermissions _sessionWallet = new EOAWallet(); var isImplicitSession = permissions == null; - var payload = new Dictionary(); - payload.Add("sessionAddress", _sessionWallet.GetAddress()); - payload.Add("preferredLoginMethod", preferredLoginMethod); - payload.Add("email", email); - - if (isImplicitSession) - payload.Add("implicitSessionRedirectUrl", RedirectOrigin.GetOriginString()); + var payload = new ConnectArgs + { + sessionAddress = _sessionWallet.GetAddress(), + preferredLoginMethod = preferredLoginMethod, + email = email, + implicitSessionRedirectUrl = isImplicitSession ? RedirectOrigin.GetOriginString() : null, + permissions = isImplicitSession ? null : permissions.ToJson() + }; - if (!isImplicitSession) - payload.Add("permissions", permissions.ToJson()); - var action = isImplicitSession ? "addImplicitSession" : "addExplicitSession"; - var url = $"{_walletUrl}/request/connect"; + var url = $"{WalletUrl}/request/connect"; var handler = RedirectFactory.CreateHandler(); - var response = await handler.WaitForResponse(url, action, payload); + var response = await handler.WaitForResponse(url, action, payload); if (!response.Result) - { throw new Exception("Error during request"); - } - - if (!response.QueryString.AllKeys.Contains("payload")) - { - var errorJson = Encoding.UTF8.GetString(Convert.FromBase64String(response.QueryString["error"])); - var error = JsonConvert.DeserializeObject>(errorJson)["error"]; - - Debug.LogError($"Error from wallet app: {error}"); - throw new Exception(error); - } - - var encodedResponsePayload = response.QueryString["payload"]; - var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(encodedResponsePayload)); - var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); - if (responsePayload.attestation != null) - Debug.Log($"Attestation approvedSigner: {responsePayload.attestation.approvedSigner}"); - - if (responsePayload.signature != null) - Debug.Log($"Signature: {responsePayload.signature}"); - - var walletAddress = responsePayload.walletAddress; + var walletAddress = response.Data.walletAddress; _sessionStorage.StoreWalletAddress(walletAddress); _sessionStorage.AddSession(new SessionData( _sessionWallet.GetPrivateKeyAsHex(), walletAddress, - responsePayload.attestation, - responsePayload.signature, + response.Data.attestation, + response.Data.signature, ChainDictionaries.ChainIdOf[_chain], - responsePayload.loginMethod, - responsePayload.email)); + response.Data.loginMethod, + response.Data.email)); return new SequenceEcosystemWallet(walletAddress); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs index a7a91f8e..2b295313 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs @@ -24,7 +24,7 @@ private class ResponseData private NativeReceiver _receiver; - public async Task<(bool Result, NameValueCollection QueryString)> WaitForResponse(string url, string action, Dictionary payload) + public async Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) { try { @@ -42,12 +42,12 @@ private class ResponseData var query = new NameValueCollection(); query.Add("payload", data.payload); - return (true, query); + return (true, default); } catch (Exception ex) { Debug.LogException(ex); - return (false, null); + return (false, default); } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs index 7e5d817d..f29d7022 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs @@ -1,11 +1,9 @@ -using System.Collections.Generic; -using System.Collections.Specialized; using System.Threading.Tasks; namespace Sequence.EcosystemWallet.Browser { public interface IRedirectHandler { - Task<(bool Result, NameValueCollection QueryString)> WaitForResponse(string url, string action, Dictionary payload); + Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs index 5ec03413..65b845ab 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Runtime.InteropServices; +using System; using System.Threading.Tasks; namespace Sequence.EcosystemWallet.Browser @@ -22,10 +20,10 @@ private static void _HideWebView() { } private static void _RemoveWebView() { } #endif - public Task<(bool Result, NameValueCollection QueryString)> WaitForResponse(string url, string action, Dictionary payload) + public Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) { _ShowWebView(url, 0, 0, 375, 667); - return Task.FromResult((false, new NameValueCollection())); + throw new NotImplementedException(); } public void Hide() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs index b6e2728b..867c9944 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs @@ -12,10 +12,11 @@ namespace Sequence.EcosystemWallet.Browser { public class LocalhostRedirectHandler : IRedirectHandler { - public async Task<(bool Result, NameValueCollection QueryString)> WaitForResponse(string url, string action, Dictionary payload) + public async Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) { var redirectId = $"sequence:{Guid.NewGuid().ToString()}"; - var encodedPayload = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload))); + var serializedPayload = JsonConvert.SerializeObject(payload); + var encodedPayload = Convert.ToBase64String(Encoding.UTF8.GetBytes(serializedPayload)); var finalUrl = $"{url}?action={action}&payload={encodedPayload}&id={redirectId}&redirectUrl={RedirectOrigin.DefaultOrigin}&mode=redirect"; Application.OpenURL(finalUrl); @@ -30,19 +31,23 @@ public class LocalhostRedirectHandler : IRedirectHandler listener.Stop(); var queryString = context.Request.QueryString; - foreach (var key in queryString.AllKeys) - Debug.Log($"Key: {key}, Value: {queryString[key]}"); var id = queryString["id"]; if (id != redirectId) throw new Exception("Incorrect request id"); - return (true, queryString); + if (queryString["error"] != null) + throw new Exception($"Error during request: {queryString["error"]}"); + + var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(queryString["payload"])); + var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); + + return (true, responsePayload); } catch (Exception ex) { Debug.LogException(ex); - return (false, null); + return (false, default); } } } From b4a84c0f9aa90946b1f8bc7813e73a41dfc7e7e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 16 Jul 2025 12:54:54 +0200 Subject: [PATCH 104/165] adjusted demo ui, removed old data classes --- .../Sequence/Samples~/Demo V3/DemoV3.unity | 720 +++++++++++++----- .../SequenceEcosystemWalletWindow.cs | 16 +- .../Authentication/AuthPayload.cs | 15 - .../Authentication/AuthPayload.cs.meta | 3 - .../Authentication/AuthResponse.cs | 13 - .../Authentication/AuthResponse.cs.meta | 3 - 6 files changed, 543 insertions(+), 227 deletions(-) delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 8e616de9..a47b8f7a 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -527,141 +527,6 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &148098786 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 148098787} - - component: {fileID: 148098789} - - component: {fileID: 148098788} - m_Layer: 5 - m_Name: Text (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &148098787 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 148098786} - 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: 220577105} - 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: 10} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &148098788 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 148098786} - 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: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Wallet - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 1 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 256 - 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: 1 - 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 &148098789 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 148098786} - m_CullTransparentMesh: 1 --- !u!1 &161099257 GameObject: m_ObjectHideFlags: 0 @@ -920,17 +785,17 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 148098787} + - {fileID: 838531873} - {fileID: 1972349263} - {fileID: 541267863} - {fileID: 906953579} m_Father: {fileID: 2198483992803733903} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} + m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: -40} - m_SizeDelta: {x: -30, y: 0} + m_SizeDelta: {x: -30, y: -55} m_Pivot: {x: 0.5, y: 1} --- !u!114 &220577106 MonoBehaviour: @@ -945,7 +810,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_HorizontalFit: 0 - m_VerticalFit: 2 + m_VerticalFit: 0 --- !u!114 &220577107 MonoBehaviour: m_ObjectHideFlags: 0 @@ -963,10 +828,10 @@ MonoBehaviour: m_Right: 0 m_Top: 0 m_Bottom: 0 - m_ChildAlignment: 0 - m_Spacing: 10 + m_ChildAlignment: 1 + m_Spacing: 5 m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 1 + m_ChildForceExpandHeight: 0 m_ChildControlWidth: 1 m_ChildControlHeight: 0 m_ChildScaleWidth: 0 @@ -1025,13 +890,297 @@ CanvasGroup: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 220577104} - m_Enabled: 1 - m_Alpha: 1 - m_Interactable: 1 - m_BlocksRaycasts: 1 - m_IgnoreParentGroups: 0 ---- !u!1 &390971674 + m_GameObject: {fileID: 220577104} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &317570297 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 317570298} + - component: {fileID: 317570302} + - component: {fileID: 317570301} + - component: {fileID: 317570300} + - component: {fileID: 317570299} + m_Layer: 5 + m_Name: CopyButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &317570298 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317570297} + 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: 1016496429} + m_Father: {fileID: 838531873} + m_RootOrder: 2 + 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 &317570299 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317570297} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &317570300 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317570297} + 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: 317570301} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: CopyWalletAddress + 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 &317570301 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317570297} + 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.19, g: 0.19, b: 0.19, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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 &317570302 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317570297} + m_CullTransparentMesh: 1 +--- !u!1 &390971674 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 390971675} + - component: {fileID: 390971677} + - component: {fileID: 390971676} + 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 &390971675 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390971674} + 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: 1303578556} + 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 &390971676 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390971674} + 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: 3b399a2d8fd4949958a248da594a7b27, 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: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 1 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &390971677 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390971674} + m_CullTransparentMesh: 1 +--- !u!1 &398224072 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1039,43 +1188,23 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 390971675} - - component: {fileID: 390971677} - - component: {fileID: 390971676} + - component: {fileID: 398224075} + - component: {fileID: 398224074} + - component: {fileID: 398224073} m_Layer: 5 - m_Name: Item Label + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &390971675 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 390971674} - 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: 1303578556} - 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 &390971676 +--- !u!114 &398224073 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 390971674} + m_GameObject: {fileID: 398224072} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -1083,16 +1212,16 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Option A + m_text: m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -1111,7 +1240,7 @@ MonoBehaviour: m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: 0 + m_TextStyleHashCode: -1183493901 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 @@ -1123,8 +1252,8 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 1 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 512 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 m_wordSpacing: 0 @@ -1132,9 +1261,9 @@ MonoBehaviour: m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_enableWordWrapping: 0 m_wordWrappingRatios: 0.4 - m_overflowMode: 0 + m_overflowMode: 1 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 @@ -1155,17 +1284,37 @@ MonoBehaviour: m_margin: {x: 0, y: 0, z: 0, w: 0} m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_hasFontAssetChanged: 1 + m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &390971677 +--- !u!222 &398224074 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 390971674} + m_GameObject: {fileID: 398224072} m_CullTransparentMesh: 1 +--- !u!224 &398224075 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 398224072} + 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: 838531873} + 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: -10, y: 0} + m_SizeDelta: {x: -40, y: -20} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &448961315 GameObject: m_ObjectHideFlags: 0 @@ -2320,9 +2469,9 @@ RectTransform: m_Father: {fileID: 946315311} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 45, y: -15} m_SizeDelta: {x: 90, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &796531351 @@ -2422,6 +2571,45 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 796531349} m_CullTransparentMesh: 1 +--- !u!1 &838531872 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 838531873} + m_Layer: 5 + m_Name: AddressLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &838531873 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 838531872} + 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: 1164194671} + - {fileID: 398224075} + - {fileID: 317570298} + m_Father: {fileID: 220577105} + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &873417222 GameObject: m_ObjectHideFlags: 0 @@ -3048,6 +3236,82 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 960124012} m_CullTransparentMesh: 1 +--- !u!1 &1016496428 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1016496429} + - component: {fileID: 1016496431} + - component: {fileID: 1016496430} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1016496429 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016496428} + 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: 317570298} + 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: 7, y: 7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1016496430 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016496428} + 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: 7eeaa0f6357c9474abdf30939e119719, 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 &1016496431 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016496428} + m_CullTransparentMesh: 1 --- !u!1 &1035093046 GameObject: m_ObjectHideFlags: 0 @@ -3676,6 +3940,82 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1158876111} m_CullTransparentMesh: 1 +--- !u!1 &1164194670 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1164194671} + - component: {fileID: 1164194673} + - component: {fileID: 1164194672} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1164194671 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1164194670} + 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: 838531873} + 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 &1164194672 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1164194670} + 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.12, g: 0.12, b: 0.12, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &1164194673 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1164194670} + m_CullTransparentMesh: 1 --- !u!1 &1199011675 GameObject: m_ObjectHideFlags: 0 @@ -7439,7 +7779,7 @@ MonoBehaviour: _signMessageButton: {fileID: 2082724707} _emailInput: {fileID: 1181566138228532167} _messageInput: {fileID: 541267865} - _walletText: {fileID: 148098788} + _walletText: {fileID: 398224073} _signatureText: {fileID: 455107487} _loginState: {fileID: 320339275645968252} _walletState: {fileID: 220577104} diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs index e87054bf..545bd19b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs @@ -141,15 +141,25 @@ public async void SignMessage() } } + public void CopyWalletAddress() + { + CopyText(_wallet.Address.Value); + } + public void CopySignature() { - if (string.IsNullOrEmpty(_curSignature)) + CopyText(_curSignature); + } + + private void CopyText(string text) + { + if (string.IsNullOrEmpty(text)) { - _messagePopup.Show("Empty Signature", true); + _messagePopup.Show("Empty text", true); return; } - GUIUtility.systemCopyBuffer = _curSignature; + GUIUtility.systemCopyBuffer = text; _messagePopup.Show("Copied"); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs deleted file mode 100644 index 4e86f9d7..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Sequence.EcosystemWallet.Primitives; -using UnityEngine.Scripting; - -namespace Sequence.EcosystemWallet.Authentication -{ - [Preserve] - public class AuthPayload - { - public Address sessionAddress; - public object permissions; - public string implicitSessionRedirectUrl; - public string preferredLoginMethod; - public string email; - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs.meta deleted file mode 100644 index 3d094568..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthPayload.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 65148229043b47bbb057aa90359b6eeb -timeCreated: 1752089536 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs deleted file mode 100644 index 9ce058e7..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Sequence.EcosystemWallet.Primitives; - -namespace Sequence.EcosystemWallet.Authentication -{ - public class AuthResponse - { - public Address walletAddress; - public string email; - public string loginMethod; - public Attestation attestation; - public RSY signature; - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs.meta deleted file mode 100644 index b23e8e40..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/AuthResponse.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 027bd659e06e402c982faf5c21fd8226 -timeCreated: 1752095000 \ No newline at end of file From 6c66a01f7bd61b9ef04a4ec63697e1c937864d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 16 Jul 2025 13:01:46 +0200 Subject: [PATCH 105/165] demo ui adjustments --- .../Sequence/Samples~/Demo V3/DemoV3.unity | 535 ++++++++++-------- .../SequenceEcosystemWalletWindow.cs | 2 + 2 files changed, 298 insertions(+), 239 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index a47b8f7a..31a80ef8 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -140,7 +140,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &8597592 RectTransform: m_ObjectHideFlags: 0 @@ -148,18 +148,18 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8597591} - 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: [] - m_Father: {fileID: 946315311} + m_Father: {fileID: 906953579} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 7.5, y: -15} - m_SizeDelta: {x: 15, y: 15} + 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: 7, y: 7} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &8597593 MonoBehaviour: @@ -181,7 +181,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 668a5199388a248cdbcfc5cb42946bde, type: 3} + m_Sprite: {fileID: 21300000, guid: 27fce2dc15e7945c2acb7f911dd18eaa, type: 3} m_Type: 0 m_PreserveAspect: 1 m_FillCenter: 1 @@ -785,12 +785,13 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: + - {fileID: 1984812366} - {fileID: 838531873} + - {fileID: 1199799818} - {fileID: 1972349263} - {fileID: 541267863} - - {fileID: 906953579} m_Father: {fileID: 2198483992803733903} - m_RootOrder: 3 + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -1905,7 +1906,7 @@ RectTransform: - {fileID: 1987947400} - {fileID: 893155973} m_Father: {fileID: 220577105} - m_RootOrder: 2 + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -2436,141 +2437,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 748463501} m_CullTransparentMesh: 1 ---- !u!1 &796531349 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 796531350} - - component: {fileID: 796531352} - - component: {fileID: 796531351} - m_Layer: 5 - m_Name: Text (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &796531350 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 796531349} - 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: 946315311} - 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: 45, y: -15} - m_SizeDelta: {x: 90, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &796531351 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 796531349} - 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: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Sign Out - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - 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: 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 &796531352 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 796531349} - m_CullTransparentMesh: 1 --- !u!1 &838531872 GameObject: m_ObjectHideFlags: 0 @@ -2603,7 +2469,7 @@ RectTransform: - {fileID: 398224075} - {fileID: 317570298} m_Father: {fileID: 220577105} - m_RootOrder: 0 + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -2904,14 +2770,14 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 946315311} - m_Father: {fileID: 220577105} - m_RootOrder: 3 + - {fileID: 8597592} + m_Father: {fileID: 2198483992803733903} + 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: 30} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -25, y: -20} + m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &906953580 MonoBehaviour: @@ -3003,7 +2869,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Sprite: {fileID: 21300000, guid: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} m_Type: 1 m_PreserveAspect: 1 m_FillCenter: 1 @@ -3021,86 +2887,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 906953578} m_CullTransparentMesh: 1 ---- !u!1 &946315310 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 946315311} - - component: {fileID: 946315313} - - component: {fileID: 946315312} - m_Layer: 5 - m_Name: Layout - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &946315311 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 946315310} - 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: 8597592} - - {fileID: 796531350} - m_Father: {fileID: 906953579} - 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: 0, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &946315312 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 946315310} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} - m_Name: - m_EditorClassIdentifier: - m_HorizontalFit: 2 - m_VerticalFit: 0 ---- !u!114 &946315313 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 946315310} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 4 - m_Spacing: 5 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 1 - m_ChildControlWidth: 0 - m_ChildControlHeight: 0 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 --- !u!1 &960124012 GameObject: m_ObjectHideFlags: 0 @@ -4092,6 +3878,141 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1199011675} m_CullTransparentMesh: 1 +--- !u!1 &1199799817 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1199799818} + - component: {fileID: 1199799820} + - component: {fileID: 1199799819} + m_Layer: 5 + m_Name: Text (TMP) (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1199799818 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1199799817} + 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: 220577105} + 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: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1199799819 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1199799817} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Message Signature + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4284900966 + m_fontColor: {r: 0.4, g: 0.4, b: 0.4, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 2, 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 &1199799820 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1199799817} + m_CullTransparentMesh: 1 --- !u!1 &1267233530 GameObject: m_ObjectHideFlags: 0 @@ -5051,7 +4972,7 @@ RectTransform: - {fileID: 455107486} - {fileID: 2082724705} m_Father: {fileID: 220577105} - m_RootOrder: 1 + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -5185,6 +5106,141 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1979708984} m_CullTransparentMesh: 1 +--- !u!1 &1984812365 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1984812366} + - component: {fileID: 1984812368} + - component: {fileID: 1984812367} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1984812366 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1984812365} + 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: 220577105} + 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: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1984812367 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1984812365} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Wallet Address + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4284900966 + m_fontColor: {r: 0.4, g: 0.4, b: 0.4, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 2, 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 &1984812368 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1984812365} + m_CullTransparentMesh: 1 --- !u!1 &1987947399 GameObject: m_ObjectHideFlags: 0 @@ -6035,6 +6091,7 @@ RectTransform: m_Children: - {fileID: 5231001844959997297} - {fileID: 5231001846775536177} + - {fileID: 906953579} - {fileID: 4209220039127894524} - {fileID: 220577105} - {fileID: 8737090446545054563} @@ -6539,7 +6596,7 @@ RectTransform: - {fileID: 512459741} - {fileID: 203863150} m_Father: {fileID: 2198483992803733903} - m_RootOrder: 2 + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -6880,7 +6937,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} propertyPath: m_RootOrder - value: 5 + value: 6 objectReference: {fileID: 0} - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} propertyPath: m_AnchorMax.x @@ -7556,7 +7613,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_RootOrder - value: 4 + value: 5 objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_AnchorMax.x diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs index 545bd19b..776a13ab 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/SequenceEcosystemWalletWindow.cs @@ -18,6 +18,7 @@ private enum SessionType [SerializeField] private Button _emailLoginButton; [SerializeField] private Button _emailContinueButton; + [SerializeField] private Button _signOutButton; [SerializeField] private Button _signMessageButton; [SerializeField] private TMP_InputField _emailInput; [SerializeField] private TMP_InputField _messageInput; @@ -210,6 +211,7 @@ public void EnableWalletState(bool enable) { _loginState.SetActive(!enable); _walletState.SetActive(enable); + _signOutButton.gameObject.SetActive(enable); } public void EnableEmailButton(bool enable) From e2978d19455a4466045895561fe76eedaa1f14bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 16 Jul 2025 22:06:30 +0200 Subject: [PATCH 106/165] started adding ios webview plugin --- .../Plugins/iOS/WKWebViewPlugin.mm | 113 ++++++++++++++++++ .../Plugins/iOS/WKWebViewPlugin.mm.meta | 3 + .../Plugins/iOS/WebViewPlugin.mm | 39 ------ .../Plugins/iOS/WebViewPlugin.mm.meta | 3 - .../Sequence/Samples~/Demo V3/DemoV3.unity | 1 + .../Authentication/RedirectOrigin.cs | 5 + .../Authentication/SequenceEcosystemWallet.cs | 3 +- .../RedirectHandler/BrowserRedirectHandler.cs | 4 +- .../RedirectHandler/IRedirectHandler.cs | 9 -- .../RedirectHandler/IosRedirectHandler.cs | 37 +++--- .../LocalhostRedirectHandler.cs | 13 +- .../RedirectHandler/RedirectFactory.cs | 4 +- .../RedirectHandler/RedirectHandler.cs | 22 ++++ ...andler.cs.meta => RedirectHandler.cs.meta} | 0 14 files changed, 169 insertions(+), 87 deletions(-) create mode 100644 Packages/Sequence-Unity/Plugins/iOS/WKWebViewPlugin.mm create mode 100644 Packages/Sequence-Unity/Plugins/iOS/WKWebViewPlugin.mm.meta delete mode 100644 Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm delete mode 100644 Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/{IRedirectHandler.cs.meta => RedirectHandler.cs.meta} (100%) diff --git a/Packages/Sequence-Unity/Plugins/iOS/WKWebViewPlugin.mm b/Packages/Sequence-Unity/Plugins/iOS/WKWebViewPlugin.mm new file mode 100644 index 00000000..e0fd8ef1 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/iOS/WKWebViewPlugin.mm @@ -0,0 +1,113 @@ +// WKWebViewPlugin.mm +// This file should be placed in your Unity project under Assets/Plugins/iOS/ + +#import +#import +#import +#import + +@interface WebViewLoggerDelegate : NSObject +@end + +@implementation WebViewLoggerDelegate + +- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation { + NSLog(@"WKWebViewPlugin: Starting to load: %@", webView.URL.absoluteString); +} + +- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { + NSLog(@"WKWebViewPlugin: Finished loading: %@", webView.URL.absoluteString); +} + +- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error { + NSLog(@"WKWebViewPlugin: Failed to load: %@, error: %@", webView.URL.absoluteString, error.localizedDescription); +} + +@end + +// Extern C block to make these functions callable from C# +extern "C" { + + // Function to open a URL in a WKWebView + void _OpenURLInWKWebView(const char* urlString) { + // Get the main thread to perform UI operations + dispatch_async(dispatch_get_main_queue(), ^{ + // Convert C string to NSString + NSString *nsUrlString = [NSString stringWithUTF8String:urlString]; + NSURL *url = [NSURL URLWithString:nsUrlString]; + + NSLog(@"WKWebViewPlugin: Received URL string (C char*): %s", urlString); + NSLog(@"WKWebViewPlugin: Converted URL string (NSString): %@", nsUrlString); + + // Get the current Unity view controller + // UnityGetViewController() is a Unity-provided function to get the root view controller + UIViewController *unityViewController = UnityGetGLViewController(); + + if (unityViewController) { + // Configure WKWebView + WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; + WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config]; + webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + + // Create and attach the navigation delegate + WebViewLoggerDelegate *loggerDelegate = [[WebViewLoggerDelegate alloc] init]; + webView.navigationDelegate = loggerDelegate; + + // Create a UIViewController to host the WKWebView + UIViewController *webViewController = [[UIViewController alloc] init]; + webViewController.view.backgroundColor = [UIColor whiteColor]; // Set background color + + // Add the WKWebView to the webViewController's view + [webViewController.view addSubview:webView]; + + // Retain the delegate by associating it with the controller + objc_setAssociatedObject(webViewController, @"loggerDelegate", loggerDelegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + // Set constraints for the webView to fill the webViewController's view + webView.translatesAutoresizingMaskIntoConstraints = NO; + [NSLayoutConstraint activateConstraints:@[ + [webView.topAnchor constraintEqualToAnchor:webViewController.view.safeAreaLayoutGuide.topAnchor], + [webView.bottomAnchor constraintEqualToAnchor:webViewController.view.safeAreaLayoutGuide.bottomAnchor], + [webView.leadingAnchor constraintEqualToAnchor:webViewController.view.safeAreaLayoutGuide.leadingAnchor], + [webView.trailingAnchor constraintEqualToAnchor:webViewController.view.safeAreaLayoutGuide.trailingAnchor] + ]]; + + // Add a "Done" button to dismiss the web view + UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [doneButton setTitle:@"Done" forState:UIControlStateNormal]; + [doneButton addTarget:webViewController action:@selector(dismissWebView) forControlEvents:UIControlEventTouchUpInside]; + doneButton.translatesAutoresizingMaskIntoConstraints = NO; + [webViewController.view addSubview:doneButton]; + + // Position the done button (e.g., top right) + [NSLayoutConstraint activateConstraints:@[ + [doneButton.topAnchor constraintEqualToAnchor:webViewController.view.safeAreaLayoutGuide.topAnchor constant:10], + [doneButton.trailingAnchor constraintEqualToAnchor:webViewController.view.safeAreaLayoutGuide.trailingAnchor constant:-10] + ]]; + + // Set the done button's content edge insets for better touch target + doneButton.contentEdgeInsets = UIEdgeInsetsMake(5, 10, 5, 10); + doneButton.layer.cornerRadius = 8; + doneButton.backgroundColor = [UIColor colorWithWhite:0.9 alpha:0.8]; // Slightly transparent background + + // Load the URL + if (url) { + [webView loadRequest:[NSURLRequest requestWithURL:url]]; + } else { + NSLog(@"WKWebViewPlugin: Invalid URL string provided: %@", nsUrlString); + } + + // Present the web view controller modally + [unityViewController presentViewController:webViewController animated:YES completion:nil]; + + } else { + NSLog(@"WKWebViewPlugin: Could not get Unity view controller."); + } + }); + } + +} // extern "C" + +// Forward declaration for UnityGetViewController (provided by Unity's iOS framework) +// This function is defined in Unity's AppController.h, which is automatically linked. +UIViewController* UnityGetViewController(); diff --git a/Packages/Sequence-Unity/Plugins/iOS/WKWebViewPlugin.mm.meta b/Packages/Sequence-Unity/Plugins/iOS/WKWebViewPlugin.mm.meta new file mode 100644 index 00000000..dcaa03b8 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/iOS/WKWebViewPlugin.mm.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 81a8fa9064fa4d219e7986b00d8a55c1 +timeCreated: 1752664568 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm b/Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm deleted file mode 100644 index 974b4a36..00000000 --- a/Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm +++ /dev/null @@ -1,39 +0,0 @@ -#import -#import - -static WKWebView* webView = nil; - -extern "C" { - void _ShowWebView(const char* url, float x, float y, float width, float height) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (webView == nil) { - WKWebViewConfiguration* config = [[WKWebViewConfiguration alloc] init]; - webView = [[WKWebView alloc] initWithFrame:CGRectMake(x, y, width, height) configuration:config]; - - UIViewController* rootVC = [UIApplication sharedApplication].keyWindow.rootViewController; - [rootVC.view addSubview:webView]; - } - - NSString* nsUrl = [NSString stringWithUTF8String:url]; - [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:nsUrl]]]; - webView.hidden = NO; - }); - } - - void _HideWebView() { - dispatch_async(dispatch_get_main_queue(), ^{ - if (webView != nil) { - webView.hidden = YES; - } - }); - } - - void _RemoveWebView() { - dispatch_async(dispatch_get_main_queue(), ^{ - if (webView != nil) { - [webView removeFromSuperview]; - webView = nil; - } - }); - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm.meta b/Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm.meta deleted file mode 100644 index 8fbda80d..00000000 --- a/Packages/Sequence-Unity/Plugins/iOS/WebViewPlugin.mm.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: cfcb79edfd4845a2948a3fbe1b18b95c -timeCreated: 1752157684 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 31a80ef8..952d0a88 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -7833,6 +7833,7 @@ MonoBehaviour: m_EditorClassIdentifier: _emailLoginButton: {fileID: 1459061464521247473} _emailContinueButton: {fileID: 2325936309338030303} + _signOutButton: {fileID: 906953581} _signMessageButton: {fileID: 2082724707} _emailInput: {fileID: 1181566138228532167} _messageInput: {fileID: 541267865} diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs index 34d6e233..a6730b6f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs @@ -14,6 +14,11 @@ public static string GetOriginString() { return Marshal.PtrToStringAnsi(GetPageOrigin()); } +#elif UNITY_IOS && UNITY_EDITOR + public static string GetOriginString() + { + return "sequencedemo://auth/callback"; + } #else public static string GetOriginString() { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs index 6f501286..0b9969af 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Sequence.EcosystemWallet.Authentication.Requests; using Sequence.EcosystemWallet.Browser; +using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Primitives.Common; namespace Sequence.EcosystemWallet.Authentication @@ -37,7 +38,7 @@ public async Task SignMessage(Chain chain, string message) return response.Data; } - public async Task SendTransaction() + public async Task SendTransaction(Call[] calls) { throw new NotImplementedException(); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs index 2b295313..7e63f4fd 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs @@ -7,7 +7,7 @@ namespace Sequence.EcosystemWallet.Browser { - public class BrowserRedirectHandler : IRedirectHandler + internal class BrowserRedirectHandler : RedirectHandler { private class ResponseErrorData { @@ -24,7 +24,7 @@ private class ResponseData private NativeReceiver _receiver; - public async Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) + public override async Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) { try { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs deleted file mode 100644 index f29d7022..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Threading.Tasks; - -namespace Sequence.EcosystemWallet.Browser -{ - public interface IRedirectHandler - { - Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload); - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs index 65b845ab..c343f7a6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs @@ -1,39 +1,32 @@ using System; +using System.Runtime.InteropServices; using System.Threading.Tasks; +using UnityEngine; namespace Sequence.EcosystemWallet.Browser { - internal class IosRedirectHandler : IRedirectHandler + internal class IosRedirectHandler : RedirectHandler { #if UNITY_IOS && !UNITY_EDITOR [DllImport("__Internal")] - private static extern void _ShowWebView(string url, float x, float y, float width, float height); - - [DllImport("__Internal")] - private static extern void _HideWebView(); - - [DllImport("__Internal")] - private static extern void _RemoveWebView(); + private static extern void _OpenURLInWKWebView(IntPtr urlString); #else - private static void _ShowWebView(string url, float x, float y, float width, float height) { } - private static void _HideWebView() { } - private static void _RemoveWebView() { } + private static void _OpenURLInWKWebView(IntPtr urlString) { } #endif - public Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) + public override async Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) { - _ShowWebView(url, 0, 0, 375, 667); - throw new NotImplementedException(); - } + Application.OpenURL(ConstructUrl(url, action, payload)); + + var utf8Bytes = System.Text.Encoding.UTF8.GetBytes(ConstructUrl(url, action, payload) + '\0'); + var urlPtr = Marshal.AllocHGlobal(utf8Bytes.Length); + Marshal.Copy(utf8Bytes, 0, urlPtr, utf8Bytes.Length); - public void Hide() - { - _HideWebView(); - } + _OpenURLInWKWebView(urlPtr); - public void Remove() - { - _RemoveWebView(); + await Task.Yield(); + + return (false, default); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs index 867c9944..f725a25e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs @@ -10,16 +10,11 @@ namespace Sequence.EcosystemWallet.Browser { - public class LocalhostRedirectHandler : IRedirectHandler + internal class LocalhostRedirectHandler : RedirectHandler { - public async Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) + public override async Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) { - var redirectId = $"sequence:{Guid.NewGuid().ToString()}"; - var serializedPayload = JsonConvert.SerializeObject(payload); - var encodedPayload = Convert.ToBase64String(Encoding.UTF8.GetBytes(serializedPayload)); - var finalUrl = $"{url}?action={action}&payload={encodedPayload}&id={redirectId}&redirectUrl={RedirectOrigin.DefaultOrigin}&mode=redirect"; - - Application.OpenURL(finalUrl); + Application.OpenURL(ConstructUrl(url, action, payload)); try { @@ -33,7 +28,7 @@ public class LocalhostRedirectHandler : IRedirectHandler var queryString = context.Request.QueryString; var id = queryString["id"]; - if (id != redirectId) + if (id != Id) throw new Exception("Incorrect request id"); if (queryString["error"] != null) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs index 1a6623d0..e54afb56 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs @@ -1,8 +1,8 @@ namespace Sequence.EcosystemWallet.Browser { - public static class RedirectFactory + internal static class RedirectFactory { - public static IRedirectHandler CreateHandler() + public static RedirectHandler CreateHandler() { #if UNITY_IOS && !UNITY_EDITOR return new IosRedirectHandler(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs new file mode 100644 index 00000000..4e28f9f1 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs @@ -0,0 +1,22 @@ +using System; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Sequence.EcosystemWallet.Authentication; + +namespace Sequence.EcosystemWallet.Browser +{ + internal abstract class RedirectHandler + { + protected string Id = $"sequence:{Guid.NewGuid().ToString()}"; + + public abstract Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload); + + protected string ConstructUrl(string url, string action, TPayload payload) + { + var serializedPayload = JsonConvert.SerializeObject(payload); + var encodedPayload = Convert.ToBase64String(Encoding.UTF8.GetBytes(serializedPayload)); + return $"{url}?action={action}&payload={encodedPayload}&id={Id}&redirectUrl={RedirectOrigin.GetOriginString()}&mode=redirect"; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IRedirectHandler.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs.meta From 96e5d1b5bbe6e27c19fdb5ff20e578c4eef2291a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 17 Jul 2025 22:25:23 +0200 Subject: [PATCH 107/165] v3 auth working on android, added android plugin to handle deeplinks --- Assets/Plugins/Android/AndroidManifest.xml | 40 +++--- .../Sequence-Unity/Editor/CheckUrlScheme.cs | 132 ++++++++++++++++-- Packages/Sequence-Unity/Plugins/Android.meta | 3 + .../Plugins/Android/DeeplinkHandler.java | 17 +++ .../Plugins/Android/DeeplinkHandler.java.meta | 32 +++++ .../Plugins/iOS/NativeBrowserPlugin.mm | 80 +++++++++++ ...in.mm.meta => NativeBrowserPlugin.mm.meta} | 0 .../Plugins/iOS/WKWebViewPlugin.mm | 113 --------------- .../Authentication/RedirectOrigin.cs | 14 +- .../Authentication/Storage/SessionData.cs | 3 + .../Primitives/Attestation/Attestation.cs | 1 + .../Primitives/Attestation/AuthData.cs | 1 + .../Primitives/Common/BigInt.cs | 1 + .../Primitives/Common/Bytes.cs | 1 + .../Primitives/Signature/RSY.cs | 2 + .../RedirectHandler/BrowserRedirectHandler.cs | 7 +- .../RedirectHandler/IosRedirectHandler.cs | 38 +++-- .../RedirectHandler/NativeReceiver.cs | 25 +++- .../RedirectHandler/RedirectFactory.cs | 4 +- .../RedirectHandler/RedirectHandler.cs | 2 +- .../SequenceSDK/Ethereum/Address/Address.cs | 5 +- ProjectSettings/EditorBuildSettings.asset | 5 +- ProjectSettings/ProjectSettings.asset | 2 +- 23 files changed, 342 insertions(+), 186 deletions(-) create mode 100644 Packages/Sequence-Unity/Plugins/Android.meta create mode 100644 Packages/Sequence-Unity/Plugins/Android/DeeplinkHandler.java create mode 100644 Packages/Sequence-Unity/Plugins/Android/DeeplinkHandler.java.meta create mode 100644 Packages/Sequence-Unity/Plugins/iOS/NativeBrowserPlugin.mm rename Packages/Sequence-Unity/Plugins/iOS/{WKWebViewPlugin.mm.meta => NativeBrowserPlugin.mm.meta} (100%) delete mode 100644 Packages/Sequence-Unity/Plugins/iOS/WKWebViewPlugin.mm diff --git a/Assets/Plugins/Android/AndroidManifest.xml b/Assets/Plugins/Android/AndroidManifest.xml index be55bd8f..f5b7100e 100644 --- a/Assets/Plugins/Android/AndroidManifest.xml +++ b/Assets/Plugins/Android/AndroidManifest.xml @@ -1,24 +1,18 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs b/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs index 0032a83a..9cf7f502 100644 --- a/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs +++ b/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs @@ -7,6 +7,7 @@ using UnityEditor.Callbacks; using UnityEngine; using System.Collections.Generic; +using System.Xml; #if UNITY_IOS || UNITY_STANDALONE_OSX using UnityEditor.iOS.Xcode; #endif @@ -16,13 +17,14 @@ namespace Sequence.Editor public class CheckUrlScheme : IPreprocessBuildWithReport { private static string _plistPath; + private static string _pathToBuiltProject; private static string _urlScheme; [PostProcessBuild] public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProject) { - SequenceConfig config = SequenceConfig.GetConfig(SequenceService.None); - _urlScheme = config.UrlScheme; + _pathToBuiltProject = pathToBuiltProject; + _urlScheme = Application.identifier.Replace(".", "").ToLower(); if (string.IsNullOrWhiteSpace(_urlScheme)) { @@ -90,36 +92,138 @@ private static void CheckPlistUrlScheme() } } } +#elif UNITY_IOS + var plist = new PlistDocument(); + plist.ReadFromFile(_plistPath); + + var rootDict = plist.root; + + const string key = "CFBundleURLTypes"; + var urlTypes = rootDict[key] != null + ? rootDict[key].AsArray() + : rootDict.CreateArray(key); + + var dict = urlTypes.AddDict(); + dict.SetString("CFBundleURLName", Application.identifier); + var schemes = dict.CreateArray("CFBundleURLSchemes"); + schemes.AddString(_urlScheme); + + plist.WriteToFile(_plistPath); + + // Add SafariServices.framework + var projPath = PBXProject.GetPBXProjectPath(_pathToBuiltProject); + var proj = new PBXProject(); + proj.ReadFromFile(projPath); + + var targetGuid = proj.GetUnityFrameworkTargetGuid(); + proj.AddFrameworkToProject(targetGuid, "SafariServices.framework", false); + proj.WriteToFile(projPath); #endif } public int callbackOrder => 0; public void OnPreprocessBuild(BuildReport report) { - SequenceConfig config = SequenceConfig.GetConfig(); - _urlScheme = config.UrlScheme; +#if UNITY_ANDROID + _urlScheme = Application.identifier.Replace(".", "").ToLower(); + string manifestPath = Path.Combine(Application.dataPath, "Plugins/Android/AndroidManifest.xml"); - List warnings = new List(); + if (!File.Exists(manifestPath)) + { + Debug.LogWarning("AndroidManifest.xml not found in Plugins/Android. Creating a basic one."); + CreateBasicManifest(manifestPath); + } - if (string.IsNullOrWhiteSpace(_urlScheme)) + XmlDocument doc = new XmlDocument(); + doc.Load(manifestPath); + + XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable); + + XmlNode appNode = doc.SelectSingleNode("/manifest/application"); + + if (appNode == null) { - warnings.Add(SequenceConfig.MissingConfigError("Url Scheme").Message); + Debug.LogError("Missing tag in AndroidManifest.xml."); + return; } - if (_urlScheme.ToLower() != _urlScheme) + if (HasCustomScheme(appNode, nsMgr)) { - warnings.Add($"{nameof(config.UrlScheme)} should be all lowercase; if uppercase characters are included, you may encounter difficulties with deep-linking on certain platforms."); + Debug.Log("Custom URL scheme already exists in manifest."); + return; } - if (warnings.Count > 0) + string androidNs = "http://schemas.android.com/apk/res/android"; + XmlElement intentFilter = doc.CreateElement("intent-filter"); + + XmlElement action = doc.CreateElement("action"); + action.SetAttribute("name", androidNs, "android.intent.action.VIEW"); + intentFilter.AppendChild(action); + + XmlElement category1 = doc.CreateElement("category"); + category1.SetAttribute("name", androidNs, "android.intent.category.DEFAULT"); + intentFilter.AppendChild(category1); + + XmlElement category2 = doc.CreateElement("category"); + category2.SetAttribute("name", androidNs, "android.intent.category.BROWSABLE"); + intentFilter.AppendChild(category2); + + XmlElement data = doc.CreateElement("data"); + data.SetAttribute("scheme", androidNs, _urlScheme); + intentFilter.AppendChild(data); + + // Attach to main activity + XmlNodeList activities = appNode.SelectNodes("activity"); + foreach (XmlNode activity in activities) { - foreach (var warning in warnings) + XmlAttribute nameAttr = activity.Attributes["android:name"]; + if (nameAttr != null && nameAttr.Value == "com.unity3d.player.UnityPlayerActivity") { - Debug.LogWarning(warning); + activity.AppendChild(intentFilter); + Debug.Log($"Added custom URL scheme \"{_urlScheme}\" to AndroidManifest."); + doc.Save(manifestPath); + return; } - - SequenceWarningPopup.ShowWindow(warnings, "https://docs.sequence.xyz/sdk/unity/onboard/authentication/oidc"); } + + Debug.LogWarning("UnityPlayerActivity not found. Could not add URL scheme intent filter."); +#endif + } + + private bool HasCustomScheme(XmlNode appNode, XmlNamespaceManager nsMgr) + { + var nodes = appNode.SelectNodes("//intent-filter/data", nsMgr); + foreach (XmlNode node in nodes) + { + var schemeAttr = node.Attributes["android:scheme"]; + if (schemeAttr != null && schemeAttr.Value == _urlScheme) + return true; + } + return false; + } + + private void CreateBasicManifest(string path) + { + var manifestContent = $@" + + + + + + + + + + + "; + + File.WriteAllText(path, manifestContent); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Plugins/Android.meta b/Packages/Sequence-Unity/Plugins/Android.meta new file mode 100644 index 00000000..4a5d5482 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Android.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 183e9e29be6a437480b66090398cd25d +timeCreated: 1752781829 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Plugins/Android/DeeplinkHandler.java b/Packages/Sequence-Unity/Plugins/Android/DeeplinkHandler.java new file mode 100644 index 00000000..1b284f42 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Android/DeeplinkHandler.java @@ -0,0 +1,17 @@ +package xyz.sequence; + +import android.app.Activity; +import android.content.Intent; +import android.net.Uri; +import com.unity3d.player.UnityPlayer; + +public class DeeplinkHandler { + public static void checkIntent(Activity activity) { + Intent intent = activity.getIntent(); + Uri data = intent.getData(); + if (data != null) { + String url = data.toString(); + UnityPlayer.UnitySendMessage("SequenceNativeReceiver", "HandleResponse", url); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Plugins/Android/DeeplinkHandler.java.meta b/Packages/Sequence-Unity/Plugins/Android/DeeplinkHandler.java.meta new file mode 100644 index 00000000..6509ef00 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Android/DeeplinkHandler.java.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: d21d3eb096314c909702b1500a685f33 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Plugins/iOS/NativeBrowserPlugin.mm b/Packages/Sequence-Unity/Plugins/iOS/NativeBrowserPlugin.mm new file mode 100644 index 00000000..01f264b2 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/iOS/NativeBrowserPlugin.mm @@ -0,0 +1,80 @@ +#import +#import +#import +#import +#import + +static SFSafariViewController *safariVC = nil; + +extern "C" { + void OpenWalletApp(const char *urlCString) + { + NSString *urlString = [NSString stringWithUTF8String:urlCString]; + NSURL *url = [NSURL URLWithString:urlString]; + if (!url) return; + + UIViewController *rootVC = [UIApplication sharedApplication].keyWindow.rootViewController; + safariVC = [[SFSafariViewController alloc] initWithURL:url]; + + NSLog(@"[SafariPlugin] Presenting SFSafariViewController with URL: %@", urlString); + + dispatch_async(dispatch_get_main_queue(), ^{ + [rootVC presentViewController:safariVC animated:YES completion:nil]; + }); + } +} + +@interface DeepLinkListener : NSObject +@end + +@implementation DeepLinkListener + ++ (void)load +{ + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(setupDeepLinkHandler) + name:UIApplicationDidFinishLaunchingNotification + object:nil]; +} + ++ (void)setupDeepLinkHandler +{ + Class appDelegateClass = [UIApplication sharedApplication].delegate.class; + + SEL originalSelector = @selector(application:openURL:options:); + SEL swizzledSelector = @selector(my_application:openURL:options:); + + Method originalMethod = class_getInstanceMethod(appDelegateClass, originalSelector); + Method swizzledMethod = class_getInstanceMethod(self, swizzledSelector); + + BOOL didAdd = class_addMethod(appDelegateClass, + originalSelector, + method_getImplementation(swizzledMethod), + method_getTypeEncoding(swizzledMethod)); + + if (!didAdd) + { + method_exchangeImplementations(originalMethod, swizzledMethod); + } +} + +- (BOOL)my_application:(UIApplication *)app + openURL:(NSURL *)url + options:(NSDictionary *)options +{ + NSLog(@"[SafariPlugin] Deep link received: %@", url.absoluteString); + + UnitySendMessage("SequenceNativeReceiver", "HandleResponse", url.absoluteString.UTF8String); + + if (safariVC) + { + NSLog(@"[SafariPlugin] Dismissing SFSafariViewController"); + dispatch_async(dispatch_get_main_queue(), ^{ + [safariVC dismissViewControllerAnimated:YES completion:nil]; + safariVC = nil; + }); + } + return YES; +} + +@end diff --git a/Packages/Sequence-Unity/Plugins/iOS/WKWebViewPlugin.mm.meta b/Packages/Sequence-Unity/Plugins/iOS/NativeBrowserPlugin.mm.meta similarity index 100% rename from Packages/Sequence-Unity/Plugins/iOS/WKWebViewPlugin.mm.meta rename to Packages/Sequence-Unity/Plugins/iOS/NativeBrowserPlugin.mm.meta diff --git a/Packages/Sequence-Unity/Plugins/iOS/WKWebViewPlugin.mm b/Packages/Sequence-Unity/Plugins/iOS/WKWebViewPlugin.mm deleted file mode 100644 index e0fd8ef1..00000000 --- a/Packages/Sequence-Unity/Plugins/iOS/WKWebViewPlugin.mm +++ /dev/null @@ -1,113 +0,0 @@ -// WKWebViewPlugin.mm -// This file should be placed in your Unity project under Assets/Plugins/iOS/ - -#import -#import -#import -#import - -@interface WebViewLoggerDelegate : NSObject -@end - -@implementation WebViewLoggerDelegate - -- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation { - NSLog(@"WKWebViewPlugin: Starting to load: %@", webView.URL.absoluteString); -} - -- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { - NSLog(@"WKWebViewPlugin: Finished loading: %@", webView.URL.absoluteString); -} - -- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error { - NSLog(@"WKWebViewPlugin: Failed to load: %@, error: %@", webView.URL.absoluteString, error.localizedDescription); -} - -@end - -// Extern C block to make these functions callable from C# -extern "C" { - - // Function to open a URL in a WKWebView - void _OpenURLInWKWebView(const char* urlString) { - // Get the main thread to perform UI operations - dispatch_async(dispatch_get_main_queue(), ^{ - // Convert C string to NSString - NSString *nsUrlString = [NSString stringWithUTF8String:urlString]; - NSURL *url = [NSURL URLWithString:nsUrlString]; - - NSLog(@"WKWebViewPlugin: Received URL string (C char*): %s", urlString); - NSLog(@"WKWebViewPlugin: Converted URL string (NSString): %@", nsUrlString); - - // Get the current Unity view controller - // UnityGetViewController() is a Unity-provided function to get the root view controller - UIViewController *unityViewController = UnityGetGLViewController(); - - if (unityViewController) { - // Configure WKWebView - WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; - WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config]; - webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - - // Create and attach the navigation delegate - WebViewLoggerDelegate *loggerDelegate = [[WebViewLoggerDelegate alloc] init]; - webView.navigationDelegate = loggerDelegate; - - // Create a UIViewController to host the WKWebView - UIViewController *webViewController = [[UIViewController alloc] init]; - webViewController.view.backgroundColor = [UIColor whiteColor]; // Set background color - - // Add the WKWebView to the webViewController's view - [webViewController.view addSubview:webView]; - - // Retain the delegate by associating it with the controller - objc_setAssociatedObject(webViewController, @"loggerDelegate", loggerDelegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - - // Set constraints for the webView to fill the webViewController's view - webView.translatesAutoresizingMaskIntoConstraints = NO; - [NSLayoutConstraint activateConstraints:@[ - [webView.topAnchor constraintEqualToAnchor:webViewController.view.safeAreaLayoutGuide.topAnchor], - [webView.bottomAnchor constraintEqualToAnchor:webViewController.view.safeAreaLayoutGuide.bottomAnchor], - [webView.leadingAnchor constraintEqualToAnchor:webViewController.view.safeAreaLayoutGuide.leadingAnchor], - [webView.trailingAnchor constraintEqualToAnchor:webViewController.view.safeAreaLayoutGuide.trailingAnchor] - ]]; - - // Add a "Done" button to dismiss the web view - UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeSystem]; - [doneButton setTitle:@"Done" forState:UIControlStateNormal]; - [doneButton addTarget:webViewController action:@selector(dismissWebView) forControlEvents:UIControlEventTouchUpInside]; - doneButton.translatesAutoresizingMaskIntoConstraints = NO; - [webViewController.view addSubview:doneButton]; - - // Position the done button (e.g., top right) - [NSLayoutConstraint activateConstraints:@[ - [doneButton.topAnchor constraintEqualToAnchor:webViewController.view.safeAreaLayoutGuide.topAnchor constant:10], - [doneButton.trailingAnchor constraintEqualToAnchor:webViewController.view.safeAreaLayoutGuide.trailingAnchor constant:-10] - ]]; - - // Set the done button's content edge insets for better touch target - doneButton.contentEdgeInsets = UIEdgeInsetsMake(5, 10, 5, 10); - doneButton.layer.cornerRadius = 8; - doneButton.backgroundColor = [UIColor colorWithWhite:0.9 alpha:0.8]; // Slightly transparent background - - // Load the URL - if (url) { - [webView loadRequest:[NSURLRequest requestWithURL:url]]; - } else { - NSLog(@"WKWebViewPlugin: Invalid URL string provided: %@", nsUrlString); - } - - // Present the web view controller modally - [unityViewController presentViewController:webViewController animated:YES completion:nil]; - - } else { - NSLog(@"WKWebViewPlugin: Could not get Unity view controller."); - } - }); - } - -} // extern "C" - -// Forward declaration for UnityGetViewController (provided by Unity's iOS framework) -// This function is defined in Unity's AppController.h, which is automatically linked. -UIViewController* UnityGetViewController(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs index a6730b6f..b7fea0a1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs @@ -1,12 +1,13 @@ using System.Runtime.InteropServices; +using UnityEngine; namespace Sequence.EcosystemWallet.Authentication { - internal static class RedirectOrigin + public static class RedirectOrigin { public const string DefaultOrigin = "http://localhost:8080/"; -#if UNITY_WEBGL &&! UNITY_EDITOR +#if !UNITY_EDITOR && UNITY_WEBGL [DllImport("__Internal")] private static extern System.IntPtr GetPageOrigin(); @@ -14,10 +15,10 @@ public static string GetOriginString() { return Marshal.PtrToStringAnsi(GetPageOrigin()); } -#elif UNITY_IOS && UNITY_EDITOR +#elif !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID) public static string GetOriginString() { - return "sequencedemo://auth/callback"; + return $"{CreateUrlScheme()}://"; } #else public static string GetOriginString() @@ -25,5 +26,10 @@ public static string GetOriginString() return DefaultOrigin; } #endif + + public static string CreateUrlScheme() + { + return Application.identifier.Replace(".", "").ToLower(); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs index af32d7c1..5e40b8cf 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs @@ -2,9 +2,11 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Sequence.EcosystemWallet.Primitives; +using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Authentication { + [Preserve] [JsonConverter(typeof(SessionDataConverter))] internal class SessionData { @@ -29,6 +31,7 @@ public SessionData(string privateKey, Address address, Attestation attestation, } } + [Preserve] internal class SessionDataConverter : JsonConverter { public override void WriteJson(JsonWriter writer, SessionData value, JsonSerializer serializer) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs index 28d20a39..11b06b1a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs @@ -9,6 +9,7 @@ namespace Sequence.EcosystemWallet.Primitives { + [Preserve] public class Attestation { public static readonly byte[] ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX = diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs index a08fd9d7..8860ef52 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs @@ -6,6 +6,7 @@ namespace Sequence.EcosystemWallet.Primitives { + [Preserve] [Serializable] public class AuthData { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/BigInt.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/BigInt.cs index 97f7419c..d70d29a8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/BigInt.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/BigInt.cs @@ -6,6 +6,7 @@ namespace Sequence.EcosystemWallet.Primitives.Common { + [Preserve] [JsonConverter(typeof(BigIntConverter))] public class BigInt { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs index 7f66e994..b86339ea 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs @@ -5,6 +5,7 @@ namespace Sequence.EcosystemWallet.Primitives.Common { + [Preserve] [JsonConverter(typeof(BytesConverter))] public class Bytes { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs index 7fbbe0d3..ecc5bb1e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs @@ -3,9 +3,11 @@ using System.Numerics; using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Utils; +using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives { + [Preserve] public class RSY { public BigInt r; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs index 7e63f4fd..b2e92940 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; +using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using UnityEngine; @@ -39,10 +40,10 @@ private class ResponseData if (data.error != null) throw new Exception(data.error.error); - var query = new NameValueCollection(); - query.Add("payload", data.payload); + var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(data.payload)); + var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); - return (true, default); + return (true, responsePayload); } catch (Exception ex) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs index c343f7a6..d1eec0a4 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs @@ -1,32 +1,40 @@ using System; -using System.Runtime.InteropServices; +using System.Text; using System.Threading.Tasks; +using Newtonsoft.Json; +using Sequence.Utils; using UnityEngine; namespace Sequence.EcosystemWallet.Browser { internal class IosRedirectHandler : RedirectHandler { -#if UNITY_IOS && !UNITY_EDITOR - [DllImport("__Internal")] - private static extern void _OpenURLInWKWebView(IntPtr urlString); -#else - private static void _OpenURLInWKWebView(IntPtr urlString) { } -#endif + private NativeReceiver _receiver; public override async Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) { - Application.OpenURL(ConstructUrl(url, action, payload)); + var go = new GameObject("SequenceNativeReceiver"); + _receiver = go.AddComponent(); - var utf8Bytes = System.Text.Encoding.UTF8.GetBytes(ConstructUrl(url, action, payload) + '\0'); - var urlPtr = Marshal.AllocHGlobal(utf8Bytes.Length); - Marshal.Copy(utf8Bytes, 0, urlPtr, utf8Bytes.Length); - - _OpenURLInWKWebView(urlPtr); + var response = await _receiver.WaitForResponse(ConstructUrl(url, action, payload)); + + GameObject.Destroy(_receiver.gameObject); + + var data = response.ExtractQueryAndHashParameters(); + + Debug.Log($"Query Data: {JsonConvert.SerializeObject(data)}"); + + var id = data["id"]; + if (id != Id) + throw new Exception("Invalid request id"); - await Task.Yield(); + if (data.TryGetValue("error", out var error)) + throw new Exception(error); - return (false, default); + var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(Uri.UnescapeDataString(data["payload"]))); + var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); + + return (true, responsePayload); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs index 5cd70d18..412a99aa 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs @@ -1,4 +1,4 @@ -using System.Runtime.InteropServices; +using System; using System.Threading.Tasks; using UnityEngine; @@ -8,6 +8,20 @@ internal class NativeReceiver : MonoBehaviour { private string _response; + private void OnApplicationFocus(bool hasFocus) + { +#if UNITY_ANDROID && !UNITY_EDITOR + using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) + { + var activity = unityPlayer.GetStatic("currentActivity"); + using (var plugin = new AndroidJavaClass("xyz.sequence.DeeplinkHandler")) + { + plugin.CallStatic("checkIntent", activity); + } + } +#endif + } + public void HandleResponse(string response) { _response = response; @@ -23,11 +37,14 @@ public async Task WaitForResponse(string url) return _response; } -#if UNITY_WEBGL && !UNITY_EDITOR - [DllImport("__Internal")] +#if !UNITY_EDITOR && (UNITY_WEBGL || UNITY_IOS) + [System.Runtime.InteropServices.DllImport("__Internal")] private static extern void OpenWalletApp(string url); #else - private static void OpenWalletApp(string url) { } + private static void OpenWalletApp(string url) + { + Application.OpenURL(url); + } #endif } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs index e54afb56..841d8d5a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs @@ -4,9 +4,9 @@ internal static class RedirectFactory { public static RedirectHandler CreateHandler() { -#if UNITY_IOS && !UNITY_EDITOR +#if !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID) return new IosRedirectHandler(); -#elif UNITY_WEBGL && !UNITY_EDITOR +#elif !UNITY_EDITOR && UNITY_WEBGL return new BrowserRedirectHandler(); #else return new LocalhostRedirectHandler(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs index 4e28f9f1..74d5c7c3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs @@ -8,7 +8,7 @@ namespace Sequence.EcosystemWallet.Browser { internal abstract class RedirectHandler { - protected string Id = $"sequence:{Guid.NewGuid().ToString()}"; + protected string Id = $"sequence-{Guid.NewGuid().ToString()}"; public abstract Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs index 2205b3b5..8a03dc76 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs @@ -3,8 +3,9 @@ using Sequence.Utils; using UnityEngine.Scripting; -namespace Sequence { - +namespace Sequence +{ + [Preserve] [JsonConverter(typeof(AddressJsonConverter))] public class Address { public readonly string Value; diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index 9a2a022b..ea3ab68a 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -5,12 +5,9 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: - - enabled: 1 + - enabled: 0 path: Packages/xyz.0xsequence.waas-unity/Sequence/Samples/Demo/Demo.unity guid: d87896574aa4f42aab6b98685b555474 - - enabled: 0 - path: Assets/SequenceFrontend/Scenes/Tests.unity - guid: 4dfb06a7c845a4513907bd9b1a335575 - enabled: 1 path: Packages/xyz.0xsequence.waas-unity/Sequence/Samples/Demo V3/DemoV3.unity guid: f5b54afb1350744a98ab2261e01ebff6 diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 9cdfa224..dd0b0000 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -164,7 +164,7 @@ PlayerSettings: Standalone: 0 iPhone: 0 tvOS: 0 - overrideDefaultApplicationIdentifier: 1 + overrideDefaultApplicationIdentifier: 0 AndroidBundleVersionCode: 1 AndroidMinSdkVersion: 22 AndroidTargetSdkVersion: 34 From 5d62c2812977c421cdb95a1aa1775bd1a6835825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 18 Jul 2025 09:19:34 +0200 Subject: [PATCH 108/165] add additional explicit sessions --- .../UnitTests/AuthenticationTests.cs | 59 - .../UnitTests/AuthenticationTests.cs.meta | 3 - Assets/StreamingAssets.meta | 8 + .../Sequence-Unity/Editor/CheckUrlScheme.cs | 6 +- .../Editor/Sequence.Editor.asmdef | 3 +- .../Sequence/Samples~/Demo V3/DemoV3.unity | 7705 ++++++++++++----- .../SequenceEcosystemWalletWindow.cs | 113 +- .../Authentication/RedirectOrigin.cs | 10 +- .../Authentication/SequenceEcosystemWallet.cs | 15 +- .../SequenceEcosystemWalletLogin.cs | 57 +- .../{SessionData.cs => SessionCredentials.cs} | 23 +- ...ata.cs.meta => SessionCredentials.cs.meta} | 0 .../Authentication/Storage/SessionStorage.cs | 10 +- .../SequenceSDK/Utils/UrlSchemeFactory.cs | 12 + .../Utils/UrlSchemeFactory.cs.meta | 3 + 15 files changed, 5613 insertions(+), 2414 deletions(-) delete mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs delete mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs.meta create mode 100644 Assets/StreamingAssets.meta rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/{SessionData.cs => SessionCredentials.cs} (71%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/{SessionData.cs.meta => SessionCredentials.cs.meta} (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UrlSchemeFactory.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UrlSchemeFactory.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs deleted file mode 100644 index f3abe788..00000000 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Threading.Tasks; -using NUnit.Framework; -using Sequence.EcosystemWallet.Authentication; -using Sequence.EcosystemWallet.Primitives; - -namespace Sequence.EcosystemWallet.UnitTests -{ - public class AuthenticationTests - { - private static readonly Chain _chain = Chain.TestnetArbitrumSepolia; - private readonly SequenceEcosystemWalletLogin _login = new(_chain); - - [TestCase("agru@horizon.io", "implicit")] - [TestCase("agru@horizon.io", "explicit_open")] - [TestCase("agru@horizon.io", "explicit_restrictive")] - public async Task SignInWithEmailTest(string email, string sessionType) - { - var wallet = await _login.SignInWithEmail(email, GetPermissionsFromInput(sessionType)); - CheckStoredWallet(wallet); - } - - [TestCase("implicit")] - [TestCase("explicit_open")] - [TestCase("explicit_restrictive")] - public async Task SignInWithGoogleTest(string sessionType) - { - var wallet = await _login.SignInWithGoogle(GetPermissionsFromInput(sessionType)); - CheckStoredWallet(wallet); - } - - [TestCase("implicit")] - [TestCase("explicit_open")] - [TestCase("explicit_restrictive")] - public async Task SignInWithAppleTest(string sessionType) - { - var wallet = await _login.SignInWithApple(GetPermissionsFromInput(sessionType)); - CheckStoredWallet(wallet); - } - - private void CheckStoredWallet(SequenceEcosystemWallet wallet) - { - var storedWallet = _login.RecoverSessionFromStorage(); - Assert.AreEqual(storedWallet.Address, wallet.Address); - } - - private SessionPermissions GetPermissionsFromInput(string sessionType) - { - var templates = new SessionTemplates(_chain); - return sessionType switch - { - "implicit" => null, - "explicit_open" => templates.BuildUnrestrictivePermissions(), - "explicit_restrictive" => templates.BuildBasicRestrictivePermissions(), - _ => throw new Exception("Invalid session type"), - }; - } - } -} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs.meta deleted file mode 100644 index ba5e8c2a..00000000 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 4ca14ee5c535484890091874aa50ec66 -timeCreated: 1752092641 \ No newline at end of file diff --git a/Assets/StreamingAssets.meta b/Assets/StreamingAssets.meta new file mode 100644 index 00000000..80da033a --- /dev/null +++ b/Assets/StreamingAssets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fe779403b5ad2472aa19fc66bb32bf19 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs b/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs index 9cf7f502..0b8691f8 100644 --- a/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs +++ b/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs @@ -8,6 +8,7 @@ using UnityEngine; using System.Collections.Generic; using System.Xml; +using Sequence.Utils; #if UNITY_IOS || UNITY_STANDALONE_OSX using UnityEditor.iOS.Xcode; #endif @@ -18,13 +19,13 @@ public class CheckUrlScheme : IPreprocessBuildWithReport { private static string _plistPath; private static string _pathToBuiltProject; - private static string _urlScheme; + + private static string _urlScheme => UrlSchemeFactory.CreateFromAppIdentifier(); [PostProcessBuild] public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProject) { _pathToBuiltProject = pathToBuiltProject; - _urlScheme = Application.identifier.Replace(".", "").ToLower(); if (string.IsNullOrWhiteSpace(_urlScheme)) { @@ -125,7 +126,6 @@ private static void CheckPlistUrlScheme() public void OnPreprocessBuild(BuildReport report) { #if UNITY_ANDROID - _urlScheme = Application.identifier.Replace(".", "").ToLower(); string manifestPath = Path.Combine(Application.dataPath, "Plugins/Android/AndroidManifest.xml"); if (!File.Exists(manifestPath)) diff --git a/Packages/Sequence-Unity/Editor/Sequence.Editor.asmdef b/Packages/Sequence-Unity/Editor/Sequence.Editor.asmdef index 76bbe353..c4a04ed6 100644 --- a/Packages/Sequence-Unity/Editor/Sequence.Editor.asmdef +++ b/Packages/Sequence-Unity/Editor/Sequence.Editor.asmdef @@ -2,7 +2,8 @@ "name": "Sequence.Editor", "rootNamespace": "", "references": [ - "GUID:a35e3a53d4439435f8b36ed2c6158cd8" + "GUID:a35e3a53d4439435f8b36ed2c6158cd8", + "GUID:b4f9c0f8f363f439b9e337f79050f189" ], "includePlatforms": [ "Editor" diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 952d0a88..95200e57 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -308,6 +308,290 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 17360256} m_CullTransparentMesh: 1 +--- !u!1 &28996670 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 28996671} + - component: {fileID: 28996675} + - component: {fileID: 28996674} + - component: {fileID: 28996673} + - component: {fileID: 28996672} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &28996671 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 28996670} + 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: 1656381960} + m_Father: {fileID: 794886187} + m_RootOrder: 3 + 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 &28996672 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 28996670} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &28996673 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 28996670} + 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: 28996674} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceBoilerplates + m_MethodName: AddExplicitSession + 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 &28996674 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 28996670} + 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.26666668, g: 0.06666667, b: 0.88235295, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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 &28996675 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 28996670} + m_CullTransparentMesh: 1 +--- !u!1 &48218463 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 48218464} + - component: {fileID: 48218466} + - component: {fileID: 48218465} + 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 &48218464 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 48218463} + 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: 2070597442} + 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 &48218465 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 48218463} + 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: 3b399a2d8fd4949958a248da594a7b27, 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: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 1 + 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: 1 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &48218466 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 48218463} + m_CullTransparentMesh: 1 --- !u!1 &90459729 GameObject: m_ObjectHideFlags: 0 @@ -443,7 +727,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 90459729} m_CullTransparentMesh: 1 ---- !u!1 &116513910 +--- !u!1 &90679724 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -451,9 +735,136 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 116513913} - - component: {fileID: 116513912} - - component: {fileID: 116513911} + - component: {fileID: 90679725} + - component: {fileID: 90679728} + - component: {fileID: 90679727} + - component: {fileID: 90679726} + m_Layer: 5 + m_Name: Scrollbar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &90679725 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 90679724} + 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: 1097154362} + m_Father: {fileID: 160974638} + 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 &90679726 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 90679724} + 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: 1370557954} + m_HandleRect: {fileID: 1370557953} + m_Direction: 2 + m_Value: 0 + m_Size: 0.2 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &90679727 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 90679724} + 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 &90679728 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 90679724} + m_CullTransparentMesh: 1 +--- !u!1 &116513910 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 116513913} + - component: {fileID: 116513912} + - component: {fileID: 116513911} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -527,7 +938,7 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &161099257 +--- !u!1 &130231370 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -535,43 +946,80 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 161099258} - - component: {fileID: 161099260} - - component: {fileID: 161099259} + - component: {fileID: 130231371} m_Layer: 5 - m_Name: Handle + m_Name: Content m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &161099258 +--- !u!224 &130231371 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 161099257} + m_GameObject: {fileID: 130231370} 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: 1267233531} + m_Children: + - {fileID: 2070597442} + m_Father: {fileID: 974586687} 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_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 &143763336 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 143763337} + - component: {fileID: 143763339} + - component: {fileID: 143763338} + 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 &143763337 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 143763336} + 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: 1492591166} + 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 &161099259 +--- !u!114 &143763338 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 161099257} + m_GameObject: {fileID: 143763336} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -585,8 +1033,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 @@ -595,15 +1043,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &161099260 +--- !u!222 &143763339 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 161099257} + m_GameObject: {fileID: 143763336} m_CullTransparentMesh: 1 ---- !u!1 &203863149 +--- !u!1 &157765780 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -611,124 +1059,185 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 203863150} - - component: {fileID: 203863154} - - component: {fileID: 203863153} - - component: {fileID: 203863152} - - component: {fileID: 203863151} + - component: {fileID: 157765781} + - component: {fileID: 157765783} + - component: {fileID: 157765782} m_Layer: 5 - m_Name: MnemonicButton + m_Name: Label m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &203863150 +--- !u!224 &157765781 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 203863149} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 157765780} + 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: 90459730} - - {fileID: 748463502} - m_Father: {fileID: 4209220039127894524} - m_RootOrder: 7 + m_Children: [] + m_Father: {fileID: 191605878} + 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: 30} + 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 &203863151 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 203863149} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &203863152 +--- !u!114 &157765782 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 203863149} + m_GameObject: {fileID: 157765780} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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.8509804} - 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: 0 - m_TargetGraphic: {fileID: 203863153} - 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_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceExamples - m_MethodName: SignInWithMnemonic - 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 &203863153 + m_Calls: [] + m_text: + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 1 + 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 &157765783 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 157765780} + m_CullTransparentMesh: 1 +--- !u!1 &160243270 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 160243271} + - component: {fileID: 160243273} + - component: {fileID: 160243272} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &160243271 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 160243270} + 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: 1299171964} + 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 &160243272 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 203863149} + m_GameObject: {fileID: 160243270} 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.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 0.12, g: 0.12, b: 0.12, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -737,7 +1246,7 @@ MonoBehaviour: m_Calls: [] m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} m_Type: 1 - m_PreserveAspect: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -745,15 +1254,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &203863154 +--- !u!222 &160243273 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 203863149} + m_GameObject: {fileID: 160243270} m_CullTransparentMesh: 1 ---- !u!1 &220577104 +--- !u!1 &160974637 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -761,143 +1270,184 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 220577105} - - component: {fileID: 220577107} - - component: {fileID: 220577106} - - component: {fileID: 220577109} - - component: {fileID: 220577108} + - component: {fileID: 160974638} + - component: {fileID: 160974641} + - component: {fileID: 160974640} + - component: {fileID: 160974639} m_Layer: 5 - m_Name: WalletState + m_Name: Template m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &220577105 + m_IsActive: 0 +--- !u!224 &160974638 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 220577104} + m_GameObject: {fileID: 160974637} 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: 1984812366} - - {fileID: 838531873} - - {fileID: 1199799818} - - {fileID: 1972349263} - - {fileID: 541267863} - m_Father: {fileID: 2198483992803733903} - m_RootOrder: 4 + - {fileID: 1205415408} + - {fileID: 90679725} + m_Father: {fileID: 794886187} + 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: -40} - m_SizeDelta: {x: -30, y: -55} + 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 &220577106 +--- !u!114 &160974639 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 220577104} + m_GameObject: {fileID: 160974637} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} m_Name: m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 0 ---- !u!114 &220577107 + m_Content: {fileID: 1123123167} + 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: 1205415408} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 90679726} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &160974640 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 220577104} + m_GameObject: {fileID: 160974637} 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: 1 - m_Spacing: 5 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 0 - m_ChildControlWidth: 1 - m_ChildControlHeight: 0 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 ---- !u!114 &220577108 + m_Material: {fileID: 0} + m_Color: {r: 0.254717, g: 0.254717, b: 0.254717, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &160974641 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 160974637} + m_CullTransparentMesh: 1 +--- !u!1 &161099257 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 161099258} + - component: {fileID: 161099260} + - component: {fileID: 161099259} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &161099258 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161099257} + 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: 1267233531} + 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 &161099259 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 220577104} + m_GameObject: {fileID: 161099257} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: eb6fa7d82312143d9b451ac5e7465a38, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: - _start: 0.7 - _duration: 0.3 - _animationCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 2 - outSlope: 2 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.77346337 - value: 1.1153979 - inSlope: -0.25566182 - outSlope: -0.25566182 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.7318018 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: -0.17961398 - outSlope: -0.17961398 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.6227655 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 ---- !u!225 &220577109 -CanvasGroup: + 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 &161099260 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 220577104} - m_Enabled: 1 - m_Alpha: 1 - m_Interactable: 1 - m_BlocksRaycasts: 1 - m_IgnoreParentGroups: 0 ---- !u!1 &317570297 + m_GameObject: {fileID: 161099257} + m_CullTransparentMesh: 1 +--- !u!1 &191605877 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -905,62 +1455,51 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 317570298} - - component: {fileID: 317570302} - - component: {fileID: 317570301} - - component: {fileID: 317570300} - - component: {fileID: 317570299} + - component: {fileID: 191605878} + - component: {fileID: 191605881} + - component: {fileID: 191605880} + - component: {fileID: 191605879} m_Layer: 5 - m_Name: CopyButton + m_Name: WalletDropdown m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &317570298 +--- !u!224 &191605878 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317570297} + m_GameObject: {fileID: 191605877} 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: 1016496429} - m_Father: {fileID: 838531873} - m_RootOrder: 2 + - {fileID: 157765781} + - {fileID: 400068442} + - {fileID: 988110724} + - {fileID: 317570298} + m_Father: {fileID: 220577105} + m_RootOrder: 3 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_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &317570299 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317570297} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &317570300 +--- !u!114 &191605879 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317570297} + m_GameObject: {fileID: 191605877} 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: m_Navigation: @@ -991,15 +1530,24 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 317570301} - m_OnClick: + m_TargetGraphic: {fileID: 191605880} + m_Template: {fileID: 988110724} + m_CaptionText: {fileID: 157765782} + m_CaptionImage: {fileID: 0} + m_Placeholder: {fileID: 0} + m_ItemText: {fileID: 48218465} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: [] + m_OnValueChanged: m_PersistentCalls: m_Calls: - m_Target: {fileID: 9144345594371459776} m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceExamples - m_MethodName: CopyWalletAddress - m_Mode: 1 + SequenceBoilerplates + m_MethodName: OnWalletChanged + m_Mode: 3 m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine @@ -1008,29 +1556,30 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 ---- !u!114 &317570301 + m_AlphaFadeSpeed: 0.15 +--- !u!114 &191605880 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317570297} + m_GameObject: {fileID: 191605877} 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.19, g: 0.19, b: 0.19, a: 1} + m_Color: {r: 0.12156863, g: 0.12156863, b: 0.12156863, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} m_Type: 1 - m_PreserveAspect: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -1038,15 +1587,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &317570302 +--- !u!222 &191605881 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317570297} + m_GameObject: {fileID: 191605877} m_CullTransparentMesh: 1 ---- !u!1 &390971674 +--- !u!1 &203863149 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1054,134 +1603,149 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 390971675} - - component: {fileID: 390971677} - - component: {fileID: 390971676} + - component: {fileID: 203863150} + - component: {fileID: 203863154} + - component: {fileID: 203863153} + - component: {fileID: 203863152} + - component: {fileID: 203863151} m_Layer: 5 - m_Name: Item Label + m_Name: MnemonicButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &390971675 +--- !u!224 &203863150 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 390971674} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 203863149} + 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: 1303578556} - m_RootOrder: 2 + m_Children: + - {fileID: 90459730} + - {fileID: 748463502} + m_Father: {fileID: 4209220039127894524} + m_RootOrder: 7 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_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &390971676 +--- !u!114 &203863151 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 390971674} + m_GameObject: {fileID: 203863149} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &203863152 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 203863149} + 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.8509804} + 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: 0 + m_TargetGraphic: {fileID: 203863153} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignInWithMnemonic + 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 &203863153 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 203863149} + 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_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, 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: 3b399a2d8fd4949958a248da594a7b27, 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: 0 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - 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: 1 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &390971677 + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &203863154 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 390971674} + m_GameObject: {fileID: 203863149} m_CullTransparentMesh: 1 ---- !u!1 &398224072 +--- !u!1 &220577104 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1189,269 +1753,2813 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 398224075} - - component: {fileID: 398224074} - - component: {fileID: 398224073} + - component: {fileID: 220577105} + - component: {fileID: 220577107} + - component: {fileID: 220577106} + - component: {fileID: 220577109} + - component: {fileID: 220577108} m_Layer: 5 - m_Name: Text (TMP) + m_Name: WalletState m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &398224073 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 398224072} - 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: 0 - 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: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 1 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 256 - 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: 1 - 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 &398224074 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 398224072} - m_CullTransparentMesh: 1 ---- !u!224 &398224075 +--- !u!224 &220577105 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 398224072} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 220577104} + 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: 838531873} - m_RootOrder: 1 + m_Children: + - {fileID: 1984812366} + - {fileID: 1299171964} + - {fileID: 717198282} + - {fileID: 191605878} + - {fileID: 1678482373} + - {fileID: 794886187} + - {fileID: 1199799818} + - {fileID: 1972349263} + - {fileID: 541267863} + m_Father: {fileID: 2198483992803733903} + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -10, y: 0} - m_SizeDelta: {x: -40, y: -20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &448961315 -GameObject: + m_AnchoredPosition: {x: 0, y: -40} + m_SizeDelta: {x: -30, y: -55} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &220577106 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 448961316} - - component: {fileID: 448961318} - - component: {fileID: 448961317} - m_Layer: 5 - m_Name: Label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &448961316 -RectTransform: + m_GameObject: {fileID: 220577104} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 0 +--- !u!114 &220577107 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 448961315} - 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: 722266041} - 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 &448961317 + m_GameObject: {fileID: 220577104} + 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: 1 + m_Spacing: 5 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &220577108 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 448961315} + m_GameObject: {fileID: 220577104} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Script: {fileID: 11500000, guid: eb6fa7d82312143d9b451ac5e7465a38, 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: Implicit - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: + _start: 0.7 + _duration: 0.3 + _animationCurve: serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - 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 &448961318 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 2 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.77346337 + value: 1.1153979 + inSlope: -0.25566182 + outSlope: -0.25566182 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.7318018 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: -0.17961398 + outSlope: -0.17961398 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.6227655 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!225 &220577109 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 220577104} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &317570297 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 317570298} + - component: {fileID: 317570302} + - component: {fileID: 317570301} + - component: {fileID: 317570300} + - component: {fileID: 317570299} + m_Layer: 5 + m_Name: CopyButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &317570298 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317570297} + 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: 1016496429} + m_Father: {fileID: 191605878} + m_RootOrder: 3 + 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 &317570299 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317570297} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &317570300 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317570297} + 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: 317570301} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: CopyWalletAddress + 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 &317570301 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317570297} + 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.19, g: 0.19, b: 0.19, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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 &317570302 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317570297} + m_CullTransparentMesh: 1 +--- !u!1 &390971674 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 390971675} + - component: {fileID: 390971677} + - component: {fileID: 390971676} + 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 &390971675 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390971674} + 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: 1303578556} + 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 &390971676 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390971674} + 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: 3b399a2d8fd4949958a248da594a7b27, 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: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 1 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &390971677 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390971674} + m_CullTransparentMesh: 1 +--- !u!1 &400068441 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 400068442} + - component: {fileID: 400068444} + - component: {fileID: 400068443} + m_Layer: 5 + m_Name: Arrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &400068442 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 400068441} + 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: 191605878} + 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 &400068443 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 400068441} + 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 &400068444 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 400068441} + m_CullTransparentMesh: 1 +--- !u!1 &448961315 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 448961316} + - component: {fileID: 448961318} + - component: {fileID: 448961317} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &448961316 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 448961315} + 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: 722266041} + 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 &448961317 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 448961315} + 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: None + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &448961318 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 448961315} + m_CullTransparentMesh: 1 +--- !u!1 &455107485 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 455107486} + - component: {fileID: 455107488} + - component: {fileID: 455107487} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &455107486 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 455107485} + 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: 1972349263} + 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: -10, y: 0} + m_SizeDelta: {x: -40, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &455107487 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 455107485} + 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: 0 + 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: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 + 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: 1 + 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 &455107488 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 455107485} + m_CullTransparentMesh: 1 +--- !u!1 &467585875 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 467585876} + - component: {fileID: 467585878} + - component: {fileID: 467585877} + m_Layer: 5 + m_Name: Text (TMP) (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &467585876 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 467585875} + 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: 4209220039127894524} + 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: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &467585877 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 467585875} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Sign In + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4284900966 + m_fontColor: {r: 0.4, g: 0.4, b: 0.4, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 2, 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 &467585878 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 467585875} + m_CullTransparentMesh: 1 +--- !u!1 &512459740 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 512459741} + - component: {fileID: 512459745} + - component: {fileID: 512459744} + - component: {fileID: 512459743} + - component: {fileID: 512459742} + m_Layer: 5 + m_Name: PasskeyButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &512459741 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512459740} + 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: 960124013} + - {fileID: 1883453221} + m_Father: {fileID: 4209220039127894524} + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &512459742 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512459740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &512459743 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512459740} + 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.8509804} + 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: 0 + m_TargetGraphic: {fileID: 512459744} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignInWithPasskey + 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 &512459744 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512459740} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &512459745 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512459740} + m_CullTransparentMesh: 1 +--- !u!1 &541267862 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 541267863} + - component: {fileID: 541267867} + - component: {fileID: 541267866} + - component: {fileID: 541267865} + - component: {fileID: 541267864} + m_Layer: 5 + m_Name: MessageInput + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &541267863 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541267862} + 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: 1987947400} + - {fileID: 893155973} + m_Father: {fileID: 220577105} + m_RootOrder: 8 + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &541267864 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541267862} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!114 &541267865 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541267862} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, 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: 541267866} + m_TextViewport: {fileID: 1987947400} + m_TextComponent: {fileID: 1158876113} + m_Placeholder: {fileID: 1035093049} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 0 + m_RegexValue: + m_GlobalPointSize: 14 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!114 &541267866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541267862} + 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: 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &541267867 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 541267862} + m_CullTransparentMesh: 1 +--- !u!1 &559540155 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 559540156} + - component: {fileID: 559540158} + - component: {fileID: 559540157} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &559540156 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 559540155} + 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: 794886187} + 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 &559540157 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 559540155} + 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: Unrestrictive + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &559540158 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 559540155} + m_CullTransparentMesh: 1 +--- !u!1 &628532634 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 628532637} + - component: {fileID: 628532636} + - component: {fileID: 628532635} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &628532635 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 628532634} + 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 &628532636 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 628532634} + 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 &628532637 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 628532634} + 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} +--- !u!1 &629025366 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 629025367} + - component: {fileID: 629025369} + - component: {fileID: 629025368} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &629025367 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 629025366} + 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: 2082724705} + 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: 7, y: 7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &629025368 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 629025366} + 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: 7eeaa0f6357c9474abdf30939e119719, 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 &629025369 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 629025366} + m_CullTransparentMesh: 1 +--- !u!1 &687704959 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 687704960} + - component: {fileID: 687704962} + - component: {fileID: 687704961} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &687704960 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687704959} + 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: 755374150} + 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: 7, y: 7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &687704961 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687704959} + 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: 7eeaa0f6357c9474abdf30939e119719, 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 &687704962 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687704959} + m_CullTransparentMesh: 1 +--- !u!1 &717198281 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 717198282} + - component: {fileID: 717198284} + - component: {fileID: 717198283} + m_Layer: 5 + m_Name: Text (TMP) (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &717198282 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 717198281} + 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: 220577105} + 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: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &717198283 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 717198281} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Sessions + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4284900966 + m_fontColor: {r: 0.4, g: 0.4, b: 0.4, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 2, 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 &717198284 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 717198281} + m_CullTransparentMesh: 1 +--- !u!1 &722266040 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 722266041} + - component: {fileID: 722266044} + - component: {fileID: 722266043} + - component: {fileID: 722266042} + m_Layer: 5 + m_Name: SessionDropdown + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &722266041 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 722266040} + 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: 448961316} + - {fileID: 1423156422} + - {fileID: 17360257} + m_Father: {fileID: 4209220039127894524} + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &722266042 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 722266040} + 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: 722266043} + m_Template: {fileID: 17360257} + m_CaptionText: {fileID: 448961317} + m_CaptionImage: {fileID: 0} + m_Placeholder: {fileID: 0} + m_ItemText: {fileID: 390971676} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: + - m_Text: None + m_Image: {fileID: 0} + - m_Text: Unrestrictive + m_Image: {fileID: 0} + - m_Text: Basic Restrictive + m_Image: {fileID: 0} + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceBoilerplates + m_MethodName: OnImplicitSessionTypeChanged + m_Mode: 3 + 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 + m_AlphaFadeSpeed: 0.15 +--- !u!114 &722266043 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 722266040} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &722266044 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 722266040} + m_CullTransparentMesh: 1 +--- !u!1 &748463501 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 748463502} + - component: {fileID: 748463504} + - component: {fileID: 748463503} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &748463502 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748463501} + 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: 203863150} + 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: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &748463503 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748463501} + 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: 7587ac7b3e6c1471ca5ab6307ab32ec5, 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 &748463504 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748463501} + m_CullTransparentMesh: 1 +--- !u!1 &755374149 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 755374150} + - component: {fileID: 755374154} + - component: {fileID: 755374153} + - component: {fileID: 755374152} + - component: {fileID: 755374151} + m_Layer: 5 + m_Name: CopyButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &755374150 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 755374149} + 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: 687704960} + m_Father: {fileID: 1299171964} + m_RootOrder: 2 + 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 &755374151 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 755374149} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &755374152 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 755374149} + 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: 755374153} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceBoilerplates + m_MethodName: CopyWalletAddress + 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 &755374153 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 755374149} + 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.19, g: 0.19, b: 0.19, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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 &755374154 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 755374149} + m_CullTransparentMesh: 1 +--- !u!1 &794886186 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 794886187} + - component: {fileID: 794886190} + - component: {fileID: 794886189} + - component: {fileID: 794886188} + m_Layer: 5 + m_Name: SessionDropdown + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &794886187 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 794886186} + 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: 559540156} + - {fileID: 1746889450} + - {fileID: 160974638} + - {fileID: 28996671} + m_Father: {fileID: 220577105} + m_RootOrder: 5 + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &794886188 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 794886186} + 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: 794886189} + m_Template: {fileID: 160974638} + m_CaptionText: {fileID: 559540157} + m_CaptionImage: {fileID: 0} + m_Placeholder: {fileID: 0} + m_ItemText: {fileID: 1359569577} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: + - m_Text: Unrestrictive + m_Image: {fileID: 0} + - m_Text: Basic Restrictive + m_Image: {fileID: 0} + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceBoilerplates + m_MethodName: OnExplicitSessionTypeChanged + m_Mode: 3 + 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 + m_AlphaFadeSpeed: 0.15 +--- !u!114 &794886189 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 794886186} + 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.12156863, g: 0.12156863, b: 0.12156863, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &794886190 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 794886186} + m_CullTransparentMesh: 1 +--- !u!1 &873417222 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 873417223} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &873417223 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 873417222} + 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: 1303578556} + m_Father: {fileID: 2100922580} + 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 &893155972 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 893155973} + - component: {fileID: 893155977} + - component: {fileID: 893155976} + - component: {fileID: 893155975} + - component: {fileID: 893155974} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &893155973 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893155972} + 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: 1378034940} + m_Father: {fileID: 541267863} + 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 &893155974 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893155972} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &893155975 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893155972} + 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: 893155976} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignMessage + 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 &893155976 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893155972} + 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.26666668, g: 0.06666667, b: 0.88235295, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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 &893155977 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893155972} + m_CullTransparentMesh: 1 +--- !u!1 &900828004 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 900828005} + - component: {fileID: 900828007} + - component: {fileID: 900828006} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &900828005 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 900828004} + 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: 1129766508066712729} + 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: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &900828006 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 900828004} + 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: d03d44fa67fc3480a9617f6df236254d, 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 &900828007 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 900828004} + m_CullTransparentMesh: 1 +--- !u!1 &906953578 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 906953579} + - component: {fileID: 906953583} + - component: {fileID: 906953582} + - component: {fileID: 906953581} + - component: {fileID: 906953580} + m_Layer: 5 + m_Name: SignOutButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &906953579 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 906953578} + 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: 8597592} + m_Father: {fileID: 2198483992803733903} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -25, y: -20} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &906953580 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 906953578} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &906953581 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 906953578} + 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: 906953582} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignOut + 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 &906953582 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 906953578} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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 &906953583 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 906953578} + m_CullTransparentMesh: 1 +--- !u!1 &917880583 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 917880584} + - component: {fileID: 917880587} + - component: {fileID: 917880586} + - component: {fileID: 917880585} + m_Layer: 5 + m_Name: Scrollbar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &917880584 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 917880583} + 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: 1255006567} + m_Father: {fileID: 988110724} + 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 &917880585 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 917880583} + 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: 1279357136} + m_HandleRect: {fileID: 1279357135} + m_Direction: 2 + m_Value: 0 + m_Size: 0.2 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &917880586 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 917880583} + 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 &917880587 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 448961315} + m_GameObject: {fileID: 917880583} m_CullTransparentMesh: 1 ---- !u!1 &455107485 +--- !u!1 &960124012 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1459,9 +4567,9 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 455107486} - - component: {fileID: 455107488} - - component: {fileID: 455107487} + - component: {fileID: 960124013} + - component: {fileID: 960124015} + - component: {fileID: 960124014} m_Layer: 5 m_Name: Text (TMP) m_TagString: Untagged @@ -1469,33 +4577,33 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &455107486 +--- !u!224 &960124013 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 455107485} + m_GameObject: {fileID: 960124012} 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: 1972349263} - m_RootOrder: 1 + m_Father: {fileID: 512459741} + 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: -10, y: 0} - m_SizeDelta: {x: -40, y: -20} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: -40, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &455107487 +--- !u!114 &960124014 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 455107485} + m_GameObject: {fileID: 960124012} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -1509,7 +4617,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: + m_text: Use Passkey m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -1543,8 +4651,8 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 1 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 256 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 m_wordSpacing: 0 @@ -1552,9 +4660,9 @@ MonoBehaviour: m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_enableWordWrapping: 1 m_wordWrappingRatios: 0.4 - m_overflowMode: 1 + m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 @@ -1578,15 +4686,215 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &455107488 +--- !u!222 &960124015 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 960124012} + m_CullTransparentMesh: 1 +--- !u!1 &974586686 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 974586687} + - component: {fileID: 974586690} + - component: {fileID: 974586689} + - component: {fileID: 974586688} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &974586687 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974586686} + 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: 130231371} + m_Father: {fileID: 988110724} + 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 &974586688 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974586686} + 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 &974586689 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974586686} + m_CullTransparentMesh: 1 +--- !u!114 &974586690 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974586686} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &988110723 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 988110724} + - component: {fileID: 988110727} + - component: {fileID: 988110726} + - component: {fileID: 988110725} + m_Layer: 5 + m_Name: Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &988110724 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 988110723} + 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: 974586687} + - {fileID: 917880584} + m_Father: {fileID: 191605878} + 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 &988110725 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 988110723} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 130231371} + 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: 974586687} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 917880585} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &988110726 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 988110723} + 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.254717, g: 0.254717, b: 0.254717, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &988110727 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 455107485} + m_GameObject: {fileID: 988110723} m_CullTransparentMesh: 1 ---- !u!1 &467585875 +--- !u!1 &1016496428 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1594,134 +4902,75 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 467585876} - - component: {fileID: 467585878} - - component: {fileID: 467585877} + - component: {fileID: 1016496429} + - component: {fileID: 1016496431} + - component: {fileID: 1016496430} m_Layer: 5 - m_Name: Text (TMP) (1) + m_Name: Image (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &467585876 +--- !u!224 &1016496429 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 467585875} + m_GameObject: {fileID: 1016496428} 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: 4209220039127894524} - m_RootOrder: 2 + m_Father: {fileID: 317570298} + 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.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 10} + m_SizeDelta: {x: 7, y: 7} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &467585877 +--- !u!114 &1016496430 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 467585875} + m_GameObject: {fileID: 1016496428} 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} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 + m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Sign In - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4284900966 - m_fontColor: {r: 0.4, g: 0.4, b: 0.4, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - 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: 2, 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 &467585878 + m_Sprite: {fileID: 21300000, guid: 7eeaa0f6357c9474abdf30939e119719, 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 &1016496431 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 467585875} + m_GameObject: {fileID: 1016496428} m_CullTransparentMesh: 1 ---- !u!1 &512459740 +--- !u!1 &1035093046 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1729,149 +4978,155 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 512459741} - - component: {fileID: 512459745} - - component: {fileID: 512459744} - - component: {fileID: 512459743} - - component: {fileID: 512459742} + - component: {fileID: 1035093047} + - component: {fileID: 1035093050} + - component: {fileID: 1035093049} + - component: {fileID: 1035093048} m_Layer: 5 - m_Name: PasskeyButton + m_Name: Placeholder m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &512459741 +--- !u!224 &1035093047 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 512459740} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1035093046} + 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: 960124013} - - {fileID: 1883453221} - m_Father: {fileID: 4209220039127894524} - m_RootOrder: 6 + m_Children: [] + m_Father: {fileID: 1987947400} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 30} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &512459742 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 512459740} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &512459743 +--- !u!114 &1035093048 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 512459740} + m_GameObject: {fileID: 1035093046} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, 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.8509804} - 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: 0 - m_TargetGraphic: {fileID: 512459744} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceExamples - m_MethodName: SignInWithPasskey - 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 &512459744 + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1035093049 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 512459740} + m_GameObject: {fileID: 1035093046} 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} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, 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: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 - 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 &512459745 + m_text: Enter message to sign... + 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: 4286611584 + m_fontColor: {r: 0.5, g: 0.5, b: 0.5, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 1 + 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 &1035093050 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 512459740} + m_GameObject: {fileID: 1035093046} m_CullTransparentMesh: 1 ---- !u!1 &541267862 +--- !u!1 &1050865737 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1879,192 +5134,144 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 541267863} - - component: {fileID: 541267867} - - component: {fileID: 541267866} - - component: {fileID: 541267865} - - component: {fileID: 541267864} + - component: {fileID: 1050865742} + - component: {fileID: 1050865741} + - component: {fileID: 1050865740} + - component: {fileID: 1050865739} m_Layer: 5 - m_Name: MessageInput + m_Name: SequenceCanvas m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &541267863 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 541267862} - 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: 1987947400} - - {fileID: 893155973} - m_Father: {fileID: 220577105} - m_RootOrder: 4 - 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: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &541267864 +--- !u!114 &1050865739 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 541267862} + m_GameObject: {fileID: 1050865737} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} - m_EffectDistance: {x: 1, y: -1} - m_UseGraphicAlpha: 1 ---- !u!114 &541267865 + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1050865740 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 541267862} + m_GameObject: {fileID: 1050865737} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, 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: 541267866} - m_TextViewport: {fileID: 1987947400} - m_TextComponent: {fileID: 1158876113} - m_Placeholder: {fileID: 1035093049} - m_VerticalScrollbar: {fileID: 0} - m_VerticalScrollbarEventHandler: {fileID: 0} - m_LayoutGroup: {fileID: 0} - m_ScrollSensitivity: 1 - m_ContentType: 0 - m_InputType: 0 - m_AsteriskChar: 42 - m_KeyboardType: 0 - m_LineType: 0 - m_HideMobileInput: 0 - m_HideSoftKeyboard: 0 - m_CharacterValidation: 0 - m_RegexValue: - m_GlobalPointSize: 14 - m_CharacterLimit: 0 - m_OnEndEdit: - m_PersistentCalls: - m_Calls: [] - m_OnSubmit: - m_PersistentCalls: - m_Calls: [] - m_OnSelect: - m_PersistentCalls: - m_Calls: [] - m_OnDeselect: - m_PersistentCalls: - m_Calls: [] - m_OnTextSelection: - m_PersistentCalls: - m_Calls: [] - m_OnEndTextSelection: - m_PersistentCalls: - m_Calls: [] - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_OnTouchScreenKeyboardStatusChanged: - m_PersistentCalls: - m_Calls: [] - m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_CustomCaretColor: 0 - m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} - m_Text: - m_CaretBlinkRate: 0.85 - m_CaretWidth: 1 - m_ReadOnly: 0 - m_RichText: 1 - m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_OnFocusSelectAll: 1 - m_ResetOnDeActivation: 1 - m_RestoreOriginalTextOnEscape: 1 - m_isRichTextEditingAllowed: 0 - m_LineLimit: 0 - m_InputValidator: {fileID: 0} ---- !u!114 &541267866 -MonoBehaviour: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 200 + m_DefaultSpriteDPI: 200 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1050865741 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1050865737} + 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 &1050865742 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 541267862} - 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: 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} - 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 &541267867 -CanvasRenderer: + m_GameObject: {fileID: 1050865737} + 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: 1788955835} + - {fileID: 2198483992803733903} + - {fileID: 2053860377} + 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 &1084335994 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 3094631411173026328, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + m_PrefabInstance: {fileID: 5107492344900098706} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1097154361 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 541267862} - m_CullTransparentMesh: 1 ---- !u!1 &628532634 + serializedVersion: 6 + m_Component: + - component: {fileID: 1097154362} + 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 &1097154362 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1097154361} + 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: 1370557953} + m_Father: {fileID: 90679725} + 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 &1115529824 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2072,143 +5279,265 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 628532637} - - component: {fileID: 628532636} - - component: {fileID: 628532635} - m_Layer: 0 - m_Name: EventSystem + - component: {fileID: 1115529825} + - component: {fileID: 1115529827} + - component: {fileID: 1115529826} + m_Layer: 5 + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &628532635 -MonoBehaviour: +--- !u!224 &1115529825 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 628532634} - 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 &628532636 + m_GameObject: {fileID: 1115529824} + 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: 4209220039127894524} + 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: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1115529826 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 628532634} + m_GameObject: {fileID: 1115529824} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} m_Name: m_EditorClassIdentifier: - m_FirstSelected: {fileID: 0} - m_sendNavigationEvents: 1 - m_DragThreshold: 10 ---- !u!4 &628532637 -Transform: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Select permissions (optional) + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4284900966 + m_fontColor: {r: 0.4, g: 0.4, b: 0.4, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 2, 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 &1115529827 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 628532634} + m_GameObject: {fileID: 1115529824} + m_CullTransparentMesh: 1 +--- !u!1 &1123123166 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1123123167} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1123123167 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1123123166} 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_Children: + - {fileID: 1492591166} + m_Father: {fileID: 1205415408} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &629025366 + 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 &1126746399 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 629025367} - - component: {fileID: 629025369} - - component: {fileID: 629025368} - m_Layer: 5 - m_Name: Image (1) + serializedVersion: 6 + m_Component: + - component: {fileID: 1126746401} + - component: {fileID: 1126746400} + m_Layer: 0 + m_Name: Directional Light m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &629025367 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 629025366} - 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: 2082724705} - 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: 7, y: 7} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &629025368 -MonoBehaviour: +--- !u!108 &1126746400 +Light: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 629025366} + m_GameObject: {fileID: 1126746399} 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: 7eeaa0f6357c9474abdf30939e119719, 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 &629025369 -CanvasRenderer: + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1126746401 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 629025366} - m_CullTransparentMesh: 1 ---- !u!1 &722266040 + m_GameObject: {fileID: 1126746399} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, 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: 50, y: -30, z: 0} +--- !u!1 &1158876111 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2216,152 +5545,134 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 722266041} - - component: {fileID: 722266044} - - component: {fileID: 722266043} - - component: {fileID: 722266042} + - component: {fileID: 1158876112} + - component: {fileID: 1158876114} + - component: {fileID: 1158876113} m_Layer: 5 - m_Name: SessionDropdown + m_Name: Text m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &722266041 +--- !u!224 &1158876112 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 722266040} + m_GameObject: {fileID: 1158876111} 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: 448961316} - - {fileID: 1423156422} - - {fileID: 17360257} - m_Father: {fileID: 4209220039127894524} + m_Children: [] + m_Father: {fileID: 1987947400} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 30} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &722266042 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 722266040} - 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: 722266043} - m_Template: {fileID: 17360257} - m_CaptionText: {fileID: 448961317} - m_CaptionImage: {fileID: 0} - m_Placeholder: {fileID: 0} - m_ItemText: {fileID: 390971676} - m_ItemImage: {fileID: 0} - m_Value: 0 - m_Options: - m_Options: - - m_Text: Implicit - m_Image: {fileID: 0} - - m_Text: Explicit (Open) - m_Image: {fileID: 0} - - m_Text: Explicit (Restrictive) - m_Image: {fileID: 0} - m_OnValueChanged: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceExamples - m_MethodName: OnSessionTypeChanged - m_Mode: 0 - 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 - m_AlphaFadeSpeed: 0.15 ---- !u!114 &722266043 +--- !u!114 &1158876113 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 722266040} + m_GameObject: {fileID: 1158876111} 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} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, 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: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} - 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 &722266044 + m_text: "\u200B" + 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: 8 + m_fontSizeBase: 8 + 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: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + 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 &1158876114 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 722266040} + m_GameObject: {fileID: 1158876111} m_CullTransparentMesh: 1 ---- !u!1 &748463501 +--- !u!1 &1172248266 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2369,43 +5680,43 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 748463502} - - component: {fileID: 748463504} - - component: {fileID: 748463503} + - component: {fileID: 1172248267} + - component: {fileID: 1172248269} + - component: {fileID: 1172248268} m_Layer: 5 - m_Name: Image (1) + m_Name: Item Checkmark m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &748463502 +--- !u!224 &1172248267 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748463501} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1172248266} + 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: 203863150} + m_Father: {fileID: 2070597442} 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: 15, y: 0} - m_SizeDelta: {x: 10, y: 10} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &748463503 +--- !u!114 &1172248268 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748463501} + m_GameObject: {fileID: 1172248266} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -2419,9 +5730,9 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 7587ac7b3e6c1471ca5ab6307ab32ec5, type: 3} + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} m_Type: 0 - m_PreserveAspect: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -2429,15 +5740,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &748463504 +--- !u!222 &1172248269 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748463501} + m_GameObject: {fileID: 1172248266} m_CullTransparentMesh: 1 ---- !u!1 &838531872 +--- !u!1 &1199011675 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2445,75 +5756,75 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 838531873} + - component: {fileID: 1199011676} + - component: {fileID: 1199011678} + - component: {fileID: 1199011677} m_Layer: 5 - m_Name: AddressLabel + m_Name: Item Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &838531873 +--- !u!224 &1199011676 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 838531872} + m_GameObject: {fileID: 1199011675} 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: 1164194671} - - {fileID: 398224075} - - {fileID: 317570298} - m_Father: {fileID: 220577105} - m_RootOrder: 1 + m_Children: [] + m_Father: {fileID: 1303578556} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 30} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &873417222 -GameObject: +--- !u!114 &1199011677 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 873417223} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &873417223 -RectTransform: + m_GameObject: {fileID: 1199011675} + 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.25490198, g: 0.25490198, b: 0.25490198, 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 &1199011678 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 873417222} - 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: 1303578556} - m_Father: {fileID: 2100922580} - 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 &893155972 + m_GameObject: {fileID: 1199011675} + m_CullTransparentMesh: 1 +--- !u!1 &1199799817 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2521,148 +5832,134 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 893155973} - - component: {fileID: 893155977} - - component: {fileID: 893155976} - - component: {fileID: 893155975} - - component: {fileID: 893155974} + - component: {fileID: 1199799818} + - component: {fileID: 1199799820} + - component: {fileID: 1199799819} m_Layer: 5 - m_Name: Button + m_Name: Text (TMP) (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &893155973 +--- !u!224 &1199799818 RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 893155972} - 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: 1378034940} - m_Father: {fileID: 541267863} - 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 &893155974 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 893155972} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &893155975 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 893155972} - 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: 893155976} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceExamples - m_MethodName: SignMessage - 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 &893155976 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1199799817} + 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: 220577105} + 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: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1199799819 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 893155972} + m_GameObject: {fileID: 1199799817} 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} - m_Color: {r: 0.26666668, g: 0.06666667, b: 0.88235295, a: 1} - m_RaycastTarget: 1 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} - m_Type: 1 - 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 &893155977 + m_text: Message signature + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4284900966 + m_fontColor: {r: 0.4, g: 0.4, b: 0.4, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 2, 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 &1199799820 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 893155972} + m_GameObject: {fileID: 1199799817} m_CullTransparentMesh: 1 ---- !u!1 &900828004 +--- !u!1 &1205415407 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2670,43 +5967,45 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 900828005} - - component: {fileID: 900828007} - - component: {fileID: 900828006} + - component: {fileID: 1205415408} + - component: {fileID: 1205415411} + - component: {fileID: 1205415410} + - component: {fileID: 1205415409} m_Layer: 5 - m_Name: Image (1) + m_Name: Viewport m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &900828005 +--- !u!224 &1205415408 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 900828004} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1205415407} + 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: 1129766508066712729} - m_RootOrder: 1 + m_Children: + - {fileID: 1123123167} + m_Father: {fileID: 160974638} + m_RootOrder: 0 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: 15, y: 0} - m_SizeDelta: {x: 10, y: 10} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &900828006 + 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 &1205415409 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 900828004} + m_GameObject: {fileID: 1205415407} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -2720,9 +6019,9 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: d03d44fa67fc3480a9617f6df236254d, type: 3} - m_Type: 0 - m_PreserveAspect: 1 + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -2730,15 +6029,28 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &900828007 +--- !u!222 &1205415410 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 900828004} + m_GameObject: {fileID: 1205415407} m_CullTransparentMesh: 1 ---- !u!1 &906953578 +--- !u!114 &1205415411 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1205415407} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &1255006566 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2746,132 +6058,133 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 906953579} - - component: {fileID: 906953583} - - component: {fileID: 906953582} - - component: {fileID: 906953581} - - component: {fileID: 906953580} + - component: {fileID: 1255006567} m_Layer: 5 - m_Name: SignOutButton + m_Name: Sliding Area m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &906953579 +--- !u!224 &1255006567 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 906953578} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1255006566} + 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: 8597592} - m_Father: {fileID: 2198483992803733903} - m_RootOrder: 2 + - {fileID: 1279357135} + m_Father: {fileID: 917880584} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 1} + m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -25, y: -20} - m_SizeDelta: {x: 20, y: 20} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &906953580 -MonoBehaviour: +--- !u!1 &1267233530 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 906953578} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &906953581 -MonoBehaviour: + serializedVersion: 6 + m_Component: + - component: {fileID: 1267233531} + 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 &1267233531 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 906953578} - 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: 906953582} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceExamples - m_MethodName: SignOut - 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 &906953582 + m_GameObject: {fileID: 1267233530} + 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: 161099258} + m_Father: {fileID: 1979708985} + 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 &1279357134 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1279357135} + - component: {fileID: 1279357137} + - component: {fileID: 1279357136} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1279357135 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1279357134} + 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: 1255006567} + 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 &1279357136 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 906953578} + m_GameObject: {fileID: 1279357134} 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.19215687, g: 0.19215687, b: 0.19215687, 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: 21300000, guid: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} m_Type: 1 - m_PreserveAspect: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -2879,15 +6192,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &906953583 +--- !u!222 &1279357137 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 906953578} + m_GameObject: {fileID: 1279357134} m_CullTransparentMesh: 1 ---- !u!1 &960124012 +--- !u!1 &1299171963 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2895,134 +6208,38 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 960124013} - - component: {fileID: 960124015} - - component: {fileID: 960124014} + - component: {fileID: 1299171964} m_Layer: 5 - m_Name: Text (TMP) + m_Name: WalletLabel m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &960124013 +--- !u!224 &1299171964 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 960124012} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1299171963} + 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: 512459741} - m_RootOrder: 0 + m_Children: + - {fileID: 160243271} + - {fileID: 1610280876} + - {fileID: 755374150} + m_Father: {fileID: 220577105} + 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: 10, y: 0} - m_SizeDelta: {x: -40, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &960124014 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 960124012} - 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: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Use Passkey - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - 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 &960124015 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 960124012} - m_CullTransparentMesh: 1 ---- !u!1 &1016496428 +--- !u!1 &1303578555 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3030,75 +6247,87 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1016496429} - - component: {fileID: 1016496431} - - component: {fileID: 1016496430} + - component: {fileID: 1303578556} + - component: {fileID: 1303578557} m_Layer: 5 - m_Name: Image (1) + m_Name: Item m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1016496429 +--- !u!224 &1303578556 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1303578555} + 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: 317570298} + m_Children: + - {fileID: 1199011676} + - {fileID: 1331741680} + - {fileID: 390971675} + m_Father: {fileID: 873417223} 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_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 7, y: 7} + m_SizeDelta: {x: 0, y: 20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1016496430 +--- !u!114 &1303578557 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} + m_GameObject: {fileID: 1303578555} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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: 7eeaa0f6357c9474abdf30939e119719, 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 &1016496431 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} - m_CullTransparentMesh: 1 ---- !u!1 &1035093046 + 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.8627451, g: 0.8627451, b: 0.8627451, a: 1} + m_PressedColor: {r: 0.7075472, g: 0.7075472, b: 0.7075472, 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: 1199011677} + toggleTransition: 1 + graphic: {fileID: 1331741681} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &1331741679 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3106,67 +6335,46 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1035093047} - - component: {fileID: 1035093050} - - component: {fileID: 1035093049} - - component: {fileID: 1035093048} + - component: {fileID: 1331741680} + - component: {fileID: 1331741682} + - component: {fileID: 1331741681} m_Layer: 5 - m_Name: Placeholder + m_Name: Item Checkmark m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1035093047 +--- !u!224 &1331741680 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1035093046} + m_GameObject: {fileID: 1331741679} 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: 1987947400} - m_RootOrder: 0 + m_Father: {fileID: 1303578556} + 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: 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 &1035093048 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1035093046} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 1 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: -1 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!114 &1035093049 +--- !u!114 &1331741681 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1035093046} + m_GameObject: {fileID: 1331741679} 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} @@ -3177,192 +6385,25 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Enter message to sign... - 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: 4286611584 - m_fontColor: {r: 0.5, g: 0.5, b: 0.5, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - 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: 1 - 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 &1035093050 + 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 &1331741682 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1035093046} + m_GameObject: {fileID: 1331741679} m_CullTransparentMesh: 1 ---- !u!1 &1050865737 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1050865742} - - component: {fileID: 1050865741} - - component: {fileID: 1050865740} - - component: {fileID: 1050865739} - m_Layer: 5 - m_Name: SequenceCanvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1050865739 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1050865737} - 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 &1050865740 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1050865737} - 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: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 200 - m_DefaultSpriteDPI: 200 - m_DynamicPixelsPerUnit: 1 - m_PresetInfoIsWorld: 0 ---- !u!223 &1050865741 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1050865737} - 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 &1050865742 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1050865737} - 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: 1788955835} - - {fileID: 2198483992803733903} - - {fileID: 2053860377} - 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 &1084335994 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 3094631411173026328, guid: 21aa1af318f304faca1367525db9bc28, type: 3} - m_PrefabInstance: {fileID: 5107492344900098706} - m_PrefabAsset: {fileID: 0} ---- !u!1 &1115529824 +--- !u!1 &1359569575 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3370,43 +6411,43 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1115529825} - - component: {fileID: 1115529827} - - component: {fileID: 1115529826} + - component: {fileID: 1359569576} + - component: {fileID: 1359569578} + - component: {fileID: 1359569577} m_Layer: 5 - m_Name: Text (TMP) + m_Name: Item Label m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1115529825 +--- !u!224 &1359569576 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1115529824} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1359569575} + 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: 4209220039127894524} - m_RootOrder: 0 + m_Father: {fileID: 1492591166} + 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: 10} + 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 &1115529826 +--- !u!114 &1359569577 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1115529824} + m_GameObject: {fileID: 1359569575} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -3414,23 +6455,23 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 + 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 a session type + m_text: Option A m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4284900966 - m_fontColor: {r: 0.4, g: 0.4, b: 0.4, a: 1} + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -3442,7 +6483,7 @@ MonoBehaviour: m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 + m_TextStyleHashCode: 0 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 @@ -3483,21 +6524,21 @@ MonoBehaviour: m_VertexBufferAutoSizeReduction: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 - m_margin: {x: 2, y: 0, z: 0, w: 0} + m_margin: {x: 0, y: 0, z: 0, w: 0} m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 + m_hasFontAssetChanged: 1 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1115529827 +--- !u!222 &1359569578 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1115529824} + m_GameObject: {fileID: 1359569575} m_CullTransparentMesh: 1 ---- !u!1 &1126746399 +--- !u!1 &1370557952 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3505,93 +6546,75 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1126746401} - - component: {fileID: 1126746400} - m_Layer: 0 - m_Name: Directional Light + - component: {fileID: 1370557953} + - component: {fileID: 1370557955} + - component: {fileID: 1370557954} + m_Layer: 5 + m_Name: Handle m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!108 &1126746400 -Light: +--- !u!224 &1370557953 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1126746399} + m_GameObject: {fileID: 1370557952} + 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: 1097154362} + 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 &1370557954 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1370557952} m_Enabled: 1 - serializedVersion: 10 + 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_Shape: 0 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &1126746401 -Transform: + 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 &1370557955 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1126746399} - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, 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: 50, y: -30, z: 0} ---- !u!1 &1158876111 + m_GameObject: {fileID: 1370557952} + m_CullTransparentMesh: 1 +--- !u!1 &1378034939 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3599,46 +6622,46 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1158876112} - - component: {fileID: 1158876114} - - component: {fileID: 1158876113} + - component: {fileID: 1378034940} + - component: {fileID: 1378034942} + - component: {fileID: 1378034941} m_Layer: 5 - m_Name: Text + m_Name: Image (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1158876112 +--- !u!224 &1378034940 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1158876111} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1378034939} + 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: 1987947400} - m_RootOrder: 1 + m_Father: {fileID: 893155973} + m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} + 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: 0, y: 0} + m_SizeDelta: {x: 7, y: 7} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1158876113 +--- !u!114 &1378034941 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1158876111} + m_GameObject: {fileID: 1378034939} 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} @@ -3647,86 +6670,27 @@ MonoBehaviour: m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: "\u200B" - 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: 8 - m_fontSizeBase: 8 - 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: 0 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 1 - 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 &1158876114 + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 7bff9d6884f5e4bee9b34e722bf48b70, 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 &1378034942 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1158876111} + m_GameObject: {fileID: 1378034939} m_CullTransparentMesh: 1 ---- !u!1 &1164194670 +--- !u!1 &1423156421 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3734,58 +6698,58 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1164194671} - - component: {fileID: 1164194673} - - component: {fileID: 1164194672} + - component: {fileID: 1423156422} + - component: {fileID: 1423156424} + - component: {fileID: 1423156423} m_Layer: 5 - m_Name: Background + m_Name: Arrow m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1164194671 +--- !u!224 &1423156422 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1164194670} + m_GameObject: {fileID: 1423156421} 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: 838531873} - m_RootOrder: 0 + m_Father: {fileID: 722266041} + 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 &1164194672 +--- !u!114 &1423156423 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1164194670} + m_GameObject: {fileID: 1423156421} 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.12, g: 0.12, b: 0.12, 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: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 + m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -3794,15 +6758,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1164194673 +--- !u!222 &1423156424 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1164194670} + m_GameObject: {fileID: 1423156421} m_CullTransparentMesh: 1 ---- !u!1 &1199011675 +--- !u!1 &1446444768 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3810,59 +6774,59 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1199011676} - - component: {fileID: 1199011678} - - component: {fileID: 1199011677} + - component: {fileID: 1446444769} + - component: {fileID: 1446444771} + - component: {fileID: 1446444770} m_Layer: 5 - m_Name: Item Background + m_Name: Image (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1199011676 +--- !u!224 &1446444769 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1199011675} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1446444768} + 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: 1303578556} - m_RootOrder: 0 + m_Father: {fileID: 3495957624811024636} + 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: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1199011677 +--- !u!114 &1446444770 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1199011675} + m_GameObject: {fileID: 1446444768} 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.25490198, g: 0.25490198, b: 0.25490198, 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: 21300000, guid: 668a5199388a248cdbcfc5cb42946bde, type: 3} m_Type: 0 - m_PreserveAspect: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -3870,15 +6834,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1199011678 +--- !u!222 &1446444771 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1199011675} + m_GameObject: {fileID: 1446444768} m_CullTransparentMesh: 1 ---- !u!1 &1199799817 +--- !u!1 &1492591165 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3886,43 +6850,131 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1199799818} - - component: {fileID: 1199799820} - - component: {fileID: 1199799819} + - component: {fileID: 1492591166} + - component: {fileID: 1492591167} m_Layer: 5 - m_Name: Text (TMP) (1) + m_Name: Item m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1199799818 +--- !u!224 &1492591166 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1199799817} + m_GameObject: {fileID: 1492591165} + 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: 1617284437} + - {fileID: 143763337} + - {fileID: 1359569576} + m_Father: {fileID: 1123123167} + 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 &1492591167 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1492591165} + 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.8627451, g: 0.8627451, b: 0.8627451, a: 1} + m_PressedColor: {r: 0.7075472, g: 0.7075472, b: 0.7075472, 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: 1617284438} + toggleTransition: 1 + graphic: {fileID: 143763338} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &1492627056 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1492627057} + - component: {fileID: 1492627059} + - component: {fileID: 1492627058} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1492627057 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1492627056} 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: 220577105} - m_RootOrder: 2 + m_Father: {fileID: 1129766508066712729} + 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: 10} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: -40, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1199799819 +--- !u!114 &1492627058 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1199799817} + m_GameObject: {fileID: 1492627056} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -3936,7 +6988,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Message Signature + m_text: Sign In with Google m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -3945,8 +6997,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4284900966 - m_fontColor: {r: 0.4, g: 0.4, b: 0.4, a: 1} + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -3999,58 +7051,21 @@ MonoBehaviour: m_VertexBufferAutoSizeReduction: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 - m_margin: {x: 2, y: 0, z: 0, w: 0} + 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 &1199799820 +--- !u!222 &1492627059 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1199799817} + m_GameObject: {fileID: 1492627056} m_CullTransparentMesh: 1 ---- !u!1 &1267233530 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1267233531} - 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 &1267233531 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1267233530} - 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: 161099258} - m_Father: {fileID: 1979708985} - 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 &1303578555 +--- !u!1 &1496107486 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4058,87 +7073,75 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1303578556} - - component: {fileID: 1303578557} + - component: {fileID: 1496107487} + - component: {fileID: 1496107489} + - component: {fileID: 1496107488} m_Layer: 5 - m_Name: Item + m_Name: Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1303578556 +--- !u!224 &1496107487 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1303578555} + m_GameObject: {fileID: 1496107486} 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: 1199011676} - - {fileID: 1331741680} - - {fileID: 390971675} - m_Father: {fileID: 873417223} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1972349263} 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_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 20} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1303578557 +--- !u!114 &1496107488 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1303578555} + m_GameObject: {fileID: 1496107486} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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.8627451, g: 0.8627451, b: 0.8627451, a: 1} - m_PressedColor: {r: 0.7075472, g: 0.7075472, b: 0.7075472, 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: 1199011677} - toggleTransition: 1 - graphic: {fileID: 1331741681} - m_Group: {fileID: 0} - onValueChanged: + m_Material: {fileID: 0} + m_Color: {r: 0.12, g: 0.12, b: 0.12, 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_IsOn: 1 ---- !u!1 &1331741679 + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &1496107489 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1496107486} + m_CullTransparentMesh: 1 +--- !u!1 &1610280875 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4146,75 +7149,134 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1331741680} - - component: {fileID: 1331741682} - - component: {fileID: 1331741681} + - component: {fileID: 1610280876} + - component: {fileID: 1610280878} + - component: {fileID: 1610280877} m_Layer: 5 - m_Name: Item Checkmark + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1331741680 +--- !u!224 &1610280876 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1331741679} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1610280875} + 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: 1303578556} + m_Father: {fileID: 1299171964} 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_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -10, y: 0} + m_SizeDelta: {x: -40, y: -20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1331741681 +--- !u!114 &1610280877 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1331741679} + m_GameObject: {fileID: 1610280875} 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} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 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 &1331741682 + m_text: + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 + 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: 1 + 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 &1610280878 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1331741679} + m_GameObject: {fileID: 1610280875} m_CullTransparentMesh: 1 ---- !u!1 &1378034939 +--- !u!1 &1614547398 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4222,59 +7284,59 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1378034940} - - component: {fileID: 1378034942} - - component: {fileID: 1378034941} + - component: {fileID: 1614547399} + - component: {fileID: 1614547401} + - component: {fileID: 1614547400} m_Layer: 5 - m_Name: Image (1) + m_Name: Item Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1378034940 +--- !u!224 &1614547399 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1378034939} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1614547398} + 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: 893155973} + m_Father: {fileID: 2070597442} 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_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 7, y: 7} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1378034941 +--- !u!114 &1614547400 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1378034939} + m_GameObject: {fileID: 1614547398} 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_Color: {r: 0.25490198, g: 0.25490198, b: 0.25490198, 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: 7bff9d6884f5e4bee9b34e722bf48b70, type: 3} + m_Sprite: {fileID: 0} m_Type: 0 - m_PreserveAspect: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -4282,15 +7344,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1378034942 +--- !u!222 &1614547401 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1378034939} + m_GameObject: {fileID: 1614547398} m_CullTransparentMesh: 1 ---- !u!1 &1423156421 +--- !u!1 &1617284436 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4298,57 +7360,57 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1423156422} - - component: {fileID: 1423156424} - - component: {fileID: 1423156423} + - component: {fileID: 1617284437} + - component: {fileID: 1617284439} + - component: {fileID: 1617284438} m_Layer: 5 - m_Name: Arrow + m_Name: Item Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1423156422 +--- !u!224 &1617284437 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1423156421} + m_GameObject: {fileID: 1617284436} 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: 722266041} - m_RootOrder: 1 + m_Father: {fileID: 1492591166} + m_RootOrder: 0 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_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 &1423156423 +--- !u!114 &1617284438 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1423156421} + m_GameObject: {fileID: 1617284436} 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_Color: {r: 0.25490198, g: 0.25490198, b: 0.25490198, 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_Sprite: {fileID: 0} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -4358,15 +7420,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1423156424 +--- !u!222 &1617284439 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1423156421} + m_GameObject: {fileID: 1617284436} m_CullTransparentMesh: 1 ---- !u!1 &1446444768 +--- !u!1 &1656381959 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4374,9 +7436,9 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1446444769} - - component: {fileID: 1446444771} - - component: {fileID: 1446444770} + - component: {fileID: 1656381960} + - component: {fileID: 1656381962} + - component: {fileID: 1656381961} m_Layer: 5 m_Name: Image (1) m_TagString: Untagged @@ -4384,33 +7446,33 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1446444769 +--- !u!224 &1656381960 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1446444768} + m_GameObject: {fileID: 1656381959} 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: 3495957624811024636} - m_RootOrder: 1 + m_Father: {fileID: 28996671} + m_RootOrder: 0 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: 15, y: 0} - m_SizeDelta: {x: 10, y: 10} + 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: 7, y: 7} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1446444770 +--- !u!114 &1656381961 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1446444768} + m_GameObject: {fileID: 1656381959} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -4424,7 +7486,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 668a5199388a248cdbcfc5cb42946bde, type: 3} + m_Sprite: {fileID: 21300000, guid: 7bff9d6884f5e4bee9b34e722bf48b70, type: 3} m_Type: 0 m_PreserveAspect: 1 m_FillCenter: 1 @@ -4434,15 +7496,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1446444771 +--- !u!222 &1656381962 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1446444768} + m_GameObject: {fileID: 1656381959} m_CullTransparentMesh: 1 ---- !u!1 &1492627056 +--- !u!1 &1678482372 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4450,43 +7512,43 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1492627057} - - component: {fileID: 1492627059} - - component: {fileID: 1492627058} + - component: {fileID: 1678482373} + - component: {fileID: 1678482375} + - component: {fileID: 1678482374} m_Layer: 5 - m_Name: Text (TMP) + m_Name: Text (TMP) (2) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1492627057 +--- !u!224 &1678482373 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1492627056} + m_GameObject: {fileID: 1678482372} 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: 1129766508066712729} - m_RootOrder: 0 + m_Father: {fileID: 220577105} + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 10, y: 0} - m_SizeDelta: {x: -40, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1492627058 +--- !u!114 &1678482374 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1492627056} + m_GameObject: {fileID: 1678482372} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -4500,7 +7562,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Sign In with Google + m_text: Add new session m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -4509,8 +7571,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} + rgba: 4284900966 + m_fontColor: {r: 0.4, g: 0.4, b: 0.4, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -4563,95 +7625,19 @@ MonoBehaviour: m_VertexBufferAutoSizeReduction: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} + m_margin: {x: 2, 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 &1492627059 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1492627056} - m_CullTransparentMesh: 1 ---- !u!1 &1496107486 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1496107487} - - component: {fileID: 1496107489} - - component: {fileID: 1496107488} - m_Layer: 5 - m_Name: Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1496107487 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1496107486} - 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: 1972349263} - 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 &1496107488 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1496107486} - 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.12, g: 0.12, b: 0.12, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} - 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 &1496107489 +--- !u!222 &1678482375 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1496107486} + m_GameObject: {fileID: 1678482372} m_CullTransparentMesh: 1 --- !u!1 &1721989092 GameObject: @@ -4788,6 +7774,82 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1721989092} m_CullTransparentMesh: 1 +--- !u!1 &1746889449 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1746889450} + - component: {fileID: 1746889452} + - component: {fileID: 1746889451} + m_Layer: 5 + m_Name: Arrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1746889450 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1746889449} + 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: 794886187} + 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 &1746889451 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1746889449} + 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 &1746889452 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1746889449} + m_CullTransparentMesh: 1 --- !u!1 &1788955834 GameObject: m_ObjectHideFlags: 0 @@ -4972,7 +8034,7 @@ RectTransform: - {fileID: 455107486} - {fileID: 2082724705} m_Father: {fileID: 220577105} - m_RootOrder: 3 + m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -5164,7 +8226,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Wallet Address + m_text: Wallet address m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -5442,6 +8504,94 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2053860376} m_CullTransparentMesh: 1 +--- !u!1 &2070597441 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2070597442} + - component: {fileID: 2070597443} + m_Layer: 5 + m_Name: Item + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2070597442 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2070597441} + 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: 1614547399} + - {fileID: 1172248267} + - {fileID: 48218464} + m_Father: {fileID: 130231371} + 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 &2070597443 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2070597441} + 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.8627451, g: 0.8627451, b: 0.8627451, a: 1} + m_PressedColor: {r: 0.7075472, g: 0.7075472, b: 0.7075472, 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: 1614547400} + toggleTransition: 1 + graphic: {fileID: 1172248268} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 --- !u!1 &2082724704 GameObject: m_ObjectHideFlags: 0 @@ -7603,6 +10753,18 @@ PrefabInstance: propertyPath: m_IsActive value: 1 objectReference: {fileID: 0} + - target: {fileID: 1535245597814173636, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchoredPosition.x + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 2058581237705155925, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchoredPosition.x + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 3205133098445542216, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchoredPosition.x + value: -10 + objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_Pivot.x value: 0.5 @@ -7617,7 +10779,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_AnchorMax.x - value: 0.5 + value: 1 objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_AnchorMax.y @@ -7625,7 +10787,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_AnchorMin.x - value: 0.5 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_AnchorMin.y @@ -7633,11 +10795,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_SizeDelta.x - value: 200 + value: -30 objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_SizeDelta.y - value: 30 + value: 20 objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_LocalPosition.x @@ -7673,7 +10835,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_AnchoredPosition.y - value: -15 + value: -5 objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -7835,9 +10997,10 @@ MonoBehaviour: _emailContinueButton: {fileID: 2325936309338030303} _signOutButton: {fileID: 906953581} _signMessageButton: {fileID: 2082724707} + _walletDropdown: {fileID: 191605879} _emailInput: {fileID: 1181566138228532167} _messageInput: {fileID: 541267865} - _walletText: {fileID: 398224073} + _walletText: {fileID: 1610280877} _signatureText: {fileID: 455107487} _loginState: {fileID: 320339275645968252} _walletState: {fileID: 220577104} diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs index 776a13ab..da7b8263 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using Sequence.EcosystemWallet.Authentication; using Sequence.EcosystemWallet.Primitives; using TMPro; @@ -9,17 +10,24 @@ namespace Sequence.Boilerplates { public class SequenceEcosystemWalletWindow : MonoBehaviour { - private enum SessionType + private enum ImplicitSessionType { - Implicit, - ExplicitOpen, - ExplicitRestrictive + None, + Unrestrictive, + BasicRestrictive + } + + private enum ExplicitSessionType + { + Unrestrictive, + BasicRestrictive } [SerializeField] private Button _emailLoginButton; [SerializeField] private Button _emailContinueButton; [SerializeField] private Button _signOutButton; [SerializeField] private Button _signMessageButton; + [SerializeField] private TMP_Dropdown _walletDropdown; [SerializeField] private TMP_InputField _emailInput; [SerializeField] private TMP_InputField _messageInput; [SerializeField] private TMP_Text _walletText; @@ -30,8 +38,10 @@ private enum SessionType [SerializeField] private MessagePopup _messagePopup; private SequenceEcosystemWalletLogin _login; - private SequenceEcosystemWallet _wallet; - private SessionType _sessionType; + private SequenceEcosystemWallet[] _wallets; + private ImplicitSessionType _implicitPermissions; + private ExplicitSessionType _explicitPermissions; + private int _selectedWallet; private string _curEmail; private string _curSignature; @@ -42,7 +52,8 @@ private void Start() _messagePopup.gameObject.SetActive(false); _loadingOverlay.SetActive(false); - OnSessionTypeChanged(0); + OnImplicitSessionTypeChanged(0); + OnExplicitSessionTypeChanged(0); EnableWalletState(false); EnableEmailButton(true); ShowSignature(string.Empty); @@ -56,8 +67,8 @@ public async void SignInWithEmail() try { - var wallet = await _login.SignInWithEmail(_curEmail, GetPermissionsFromSessionType()); - ShowWallet(wallet, false); + await _login.SignInWithEmail(_curEmail, GetImplicitPermissions()); + ShowWallet(false); } catch (Exception e) { @@ -71,8 +82,8 @@ public async void SignInWithGoogle() try { - var wallet = await _login.SignInWithGoogle(GetPermissionsFromSessionType()); - ShowWallet(wallet, false); + await _login.SignInWithGoogle(GetImplicitPermissions()); + ShowWallet(false); } catch (Exception e) { @@ -86,8 +97,8 @@ public async void SignInWithApple() try { - var wallet = await _login.SignInWithApple(GetPermissionsFromSessionType()); - ShowWallet(wallet, false); + await _login.SignInWithApple(GetImplicitPermissions()); + ShowWallet(false); } catch (Exception e) { @@ -101,8 +112,8 @@ public async void SignInWithPasskey() try { - var wallet = await _login.SignInWithPasskey(GetPermissionsFromSessionType()); - ShowWallet(wallet, false); + await _login.SignInWithPasskey(GetImplicitPermissions()); + ShowWallet(false); } catch (Exception e) { @@ -116,8 +127,8 @@ public async void SignInWithMnemonic() try { - var wallet = await _login.SignInWithMnemonic(GetPermissionsFromSessionType()); - ShowWallet(wallet, false); + await _login.SignInWithMnemonic(GetImplicitPermissions()); + ShowWallet(false); } catch (Exception e) { @@ -132,7 +143,7 @@ public async void SignMessage() try { - var signature = await _wallet.SignMessage(Chain.TestnetArbitrumSepolia, message); + var signature = await _wallets[_selectedWallet].SignMessage(Chain.TestnetArbitrumSepolia, message); ShowSignature(signature.signature); SetLoading(false); } @@ -144,7 +155,7 @@ public async void SignMessage() public void CopyWalletAddress() { - CopyText(_wallet.Address.Value); + CopyText(_wallets[_selectedWallet].Address.Value); } public void CopySignature() @@ -164,15 +175,40 @@ private void CopyText(string text) _messagePopup.Show("Copied"); } + public async void AddExplicitSession() + { + SetLoading(true); + + try + { + await _login.AddSession(GetExplicitPermissions()); + ShowWallet(false); + } + catch (Exception e) + { + ShowError(e.Message); + } + } + public void SignOut() { _login.SignOut(); EnableWalletState(false); } + + public void OnWalletChanged(int index) + { + _selectedWallet = index; + } - public void OnSessionTypeChanged(int index) + public void OnImplicitSessionTypeChanged(int index) + { + _implicitPermissions = (ImplicitSessionType)index; + } + + public void OnExplicitSessionTypeChanged(int index) { - _sessionType = (SessionType)index; + _explicitPermissions = (ExplicitSessionType)index; } private void ShowError(string error) @@ -184,8 +220,7 @@ private void ShowError(string error) private void RecoverWalletFromStorage() { - var wallet = _login.RecoverSessionFromStorage(); - ShowWallet(wallet, true); + ShowWallet(true); } private void ShowSignature(string signature) @@ -195,10 +230,16 @@ private void ShowSignature(string signature) _signMessageButton.interactable = !string.IsNullOrEmpty(_curSignature); } - private void ShowWallet(SequenceEcosystemWallet wallet, bool recovered) + private void ShowWallet(bool recovered) { - _wallet = wallet; - _walletText.text = wallet.Address; + _wallets = _login.RecoverSessionsFromStorage(); + _walletText.text = _wallets[_selectedWallet].Address.Value; + + var addresses = _wallets.Select(w => w.SessionAddress.Value).ToList(); + _walletDropdown.ClearOptions(); + _walletDropdown.AddOptions(addresses); + _walletDropdown.value = 0; + _selectedWallet = 0; EnableWalletState(true); SetLoading(false); @@ -236,15 +277,25 @@ private void VerifyEmailInput(string input) _emailContinueButton.interactable = validEmail; } + + private SessionPermissions GetImplicitPermissions() + { + return GetPermissionsFromSessionType((int)_implicitPermissions); + } + + private SessionPermissions GetExplicitPermissions() + { + return GetPermissionsFromSessionType((int)_explicitPermissions + 1); + } - private SessionPermissions GetPermissionsFromSessionType() + private SessionPermissions GetPermissionsFromSessionType(int type) { var templates = new SessionTemplates(Chain.TestnetArbitrumSepolia); - return _sessionType switch + return type switch { - SessionType.Implicit => null, - SessionType.ExplicitOpen => templates.BuildUnrestrictivePermissions(), - SessionType.ExplicitRestrictive => templates.BuildBasicRestrictivePermissions(), + 0 => null, + 1 => templates.BuildUnrestrictivePermissions(), + 2 => templates.BuildBasicRestrictivePermissions(), _ => throw new Exception("Unsupported session type") }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs index b7fea0a1..59b5a831 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs @@ -1,4 +1,5 @@ using System.Runtime.InteropServices; +using Sequence.Utils; using UnityEngine; namespace Sequence.EcosystemWallet.Authentication @@ -15,10 +16,10 @@ public static string GetOriginString() { return Marshal.PtrToStringAnsi(GetPageOrigin()); } -#elif !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID) +#elif !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID || UNITY_STANDALONE_OSX) public static string GetOriginString() { - return $"{CreateUrlScheme()}://"; + return $"{UrlSchemeFactory.CreateFromAppIdentifier()}://"; } #else public static string GetOriginString() @@ -26,10 +27,5 @@ public static string GetOriginString() return DefaultOrigin; } #endif - - public static string CreateUrlScheme() - { - return Application.identifier.Replace(".", "").ToLower(); - } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs index 0b9969af..1ea4a65b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs @@ -4,6 +4,7 @@ using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Primitives.Common; +using Sequence.Wallet; namespace Sequence.EcosystemWallet.Authentication { @@ -12,10 +13,20 @@ public class SequenceEcosystemWallet public static Action OnWalletCreated; public Address Address { get; } + public Address SessionAddress { get; } + public Chain Chain { get; } + public bool IsExplicit { get; } + + private readonly SessionCredentials _credentials; - public SequenceEcosystemWallet(Address address) + internal SequenceEcosystemWallet(SessionCredentials credentials) { - Address = address; + _credentials = credentials; + + Address = credentials.address; + SessionAddress = new EOAWallet(credentials.privateKey).GetAddress(); + Chain = ChainDictionaries.ChainById[credentials.chainId]; + IsExplicit = credentials.isExplicit; OnWalletCreated?.Invoke(this); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs index dac28ec1..099b0710 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs @@ -3,6 +3,7 @@ using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; using Sequence.Wallet; +using UnityEngine.Assertions; namespace Sequence.EcosystemWallet.Authentication { @@ -19,41 +20,49 @@ public SequenceEcosystemWalletLogin(Chain chain) _chain = chain; _sessionStorage = new SessionStorage(); } + + public async Task AddSession(SessionPermissions permissions) + { + Assert.IsNotNull(permissions); + return await CreateNewSession(true, permissions, string.Empty); + } public async Task SignInWithEmail(string email, SessionPermissions permissions) { - return await CreateNewSession(permissions,"email", email); + return await CreateNewSession(false, permissions,"email", email); } public async Task SignInWithGoogle(SessionPermissions permissions) { - return await CreateNewSession(permissions,"google"); + return await CreateNewSession(false, permissions,"google"); } public async Task SignInWithApple(SessionPermissions permissions) { - return await CreateNewSession(permissions,"apple"); + return await CreateNewSession(false, permissions,"apple"); } public async Task SignInWithPasskey(SessionPermissions permissions) { - return await CreateNewSession(permissions,"passkey"); + return await CreateNewSession(false, permissions,"passkey"); } public async Task SignInWithMnemonic(SessionPermissions permissions) { - return await CreateNewSession(permissions,"mnemonic"); + return await CreateNewSession(false, permissions,"mnemonic"); } - public SequenceEcosystemWallet RecoverSessionFromStorage() + public SequenceEcosystemWallet[] RecoverSessionsFromStorage() { - var walletAddress = _sessionStorage.GetWalletAddress(); - var sessions = _sessionStorage.GetSessions(); - - if (string.IsNullOrEmpty(walletAddress) || sessions.Length == 0) + var credentials = _sessionStorage.GetSessions(); + if (credentials.Length == 0) throw new Exception("No session found in storage."); - return new SequenceEcosystemWallet(new Address(walletAddress)); + var wallets = new SequenceEcosystemWallet[credentials.Length]; + for (var i = 0; i < credentials.Length; i++) + wallets[i] = new SequenceEcosystemWallet(credentials[i]); + + return wallets; } public void SignOut() @@ -64,24 +73,24 @@ public void SignOut() /// /// Create an implicit- or explicit session based on a given set of permissions. /// + /// Leave it null to create an implicit session. Otherwise, we create an explicit session. /// Leave it null to create an implicit session. Otherwise, we create an explicit session. /// /// - private async Task CreateNewSession(SessionPermissions permissions, string preferredLoginMethod, string email = null) + private async Task CreateNewSession(bool isExplicit, SessionPermissions permissions, string preferredLoginMethod, string email = null) { _sessionWallet = new EOAWallet(); - var isImplicitSession = permissions == null; var payload = new ConnectArgs { sessionAddress = _sessionWallet.GetAddress(), preferredLoginMethod = preferredLoginMethod, email = email, - implicitSessionRedirectUrl = isImplicitSession ? RedirectOrigin.GetOriginString() : null, - permissions = isImplicitSession ? null : permissions.ToJson() + implicitSessionRedirectUrl = isExplicit ? null : RedirectOrigin.GetOriginString(), + permissions = permissions?.ToJson() }; - var action = isImplicitSession ? "addImplicitSession" : "addExplicitSession"; + var action = isExplicit ? "addExplicitSession" : "addImplicitSession"; var url = $"{WalletUrl}/request/connect"; var handler = RedirectFactory.CreateHandler(); @@ -89,18 +98,18 @@ private async Task CreateNewSession(SessionPermissions if (!response.Result) throw new Exception("Error during request"); - var walletAddress = response.Data.walletAddress; - _sessionStorage.StoreWalletAddress(walletAddress); - _sessionStorage.AddSession(new SessionData( - _sessionWallet.GetPrivateKeyAsHex(), - walletAddress, - response.Data.attestation, + var credentials = new SessionCredentials( + isExplicit, + _sessionWallet.GetPrivateKeyAsHex(), + response.Data.walletAddress, + response.Data.attestation, response.Data.signature, ChainDictionaries.ChainIdOf[_chain], response.Data.loginMethod, - response.Data.email)); + response.Data.email); - return new SequenceEcosystemWallet(walletAddress); + _sessionStorage.AddSession(credentials); + return new SequenceEcosystemWallet(credentials); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs similarity index 71% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs index 5e40b8cf..dbe8a285 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs @@ -2,14 +2,16 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Sequence.EcosystemWallet.Primitives; +using Sequence.EcosystemWallet.Primitives.Common; using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Authentication { [Preserve] - [JsonConverter(typeof(SessionDataConverter))] - internal class SessionData + [JsonConverter(typeof(SessionCredentialsConverter))] + internal class SessionCredentials { + public bool isExplicit; public string privateKey; public Address address; public Attestation attestation; @@ -18,9 +20,10 @@ internal class SessionData public string loginMethod; public string email; - public SessionData(string privateKey, Address address, Attestation attestation, RSY signature, + public SessionCredentials(bool isExplicit, string privateKey, Address address, Attestation attestation, RSY signature, string chainId, string loginMethod, string email) { + this.isExplicit = isExplicit; this.privateKey = privateKey; this.address = address; this.attestation = attestation; @@ -32,11 +35,14 @@ public SessionData(string privateKey, Address address, Attestation attestation, } [Preserve] - internal class SessionDataConverter : JsonConverter + internal class SessionCredentialsConverter : JsonConverter { - public override void WriteJson(JsonWriter writer, SessionData value, JsonSerializer serializer) + public override void WriteJson(JsonWriter writer, SessionCredentials value, JsonSerializer serializer) { writer.WriteStartObject(); + + writer.WritePropertyName("isExplicit"); + writer.WriteValue(value.isExplicit); writer.WritePropertyName("privateKey"); writer.WriteValue(value.privateKey); @@ -74,11 +80,12 @@ public override void WriteJson(JsonWriter writer, SessionData value, JsonSeriali writer.WriteEndObject(); } - public override SessionData ReadJson(JsonReader reader, Type objectType, SessionData existingValue, bool hasExistingValue, JsonSerializer serializer) + public override SessionCredentials ReadJson(JsonReader reader, Type objectType, SessionCredentials existingValue, bool hasExistingValue, JsonSerializer serializer) { JObject obj = JObject.Load(reader); - string privateKey = obj["privateKey"]?.ToString(); + var isExplicit = obj["isExplicit"]?.ToObject() ?? false; + var privateKey = obj["privateKey"]?.ToString(); var address = obj["address"]?.ToObject
(serializer); var attestation = obj["attestation"]?.ToObject(serializer); var signature = obj["signature"]?.ToObject(serializer); @@ -87,7 +94,7 @@ public override SessionData ReadJson(JsonReader reader, Type objectType, Session string loginMethod = obj["loginMethod"]?.ToString(); string email = obj["email"]?.ToString(); - return new SessionData(privateKey, address, attestation, signature, chainId, loginMethod, email); + return new SessionCredentials(isExplicit, privateKey, address, attestation, signature, chainId, loginMethod, email); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionData.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs index 7fb125c2..8784c25c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs @@ -30,25 +30,25 @@ public string GetWalletAddress() return _storage.RetrieveString(WalletAddressKey); } - public void AddSession(SessionData session) + public void AddSession(SessionCredentials session) { var sessions = GetSessions(); var newSessions = sessions.AddToArray(session); StoreSessions(newSessions); } - public void StoreSessions(SessionData[] sessions) + public void StoreSessions(SessionCredentials[] sessions) { var json = JsonConvert.SerializeObject(sessions); _storage.StoreString(SessionsKey, json); } - public SessionData[] GetSessions() + public SessionCredentials[] GetSessions() { var json = _storage.RetrieveString(SessionsKey); return string.IsNullOrEmpty(json) ? - Array.Empty() : - JsonConvert.DeserializeObject(json); + Array.Empty() : + JsonConvert.DeserializeObject(json); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UrlSchemeFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UrlSchemeFactory.cs new file mode 100644 index 00000000..44996777 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UrlSchemeFactory.cs @@ -0,0 +1,12 @@ +using UnityEngine; + +namespace Sequence.Utils +{ + public class UrlSchemeFactory + { + public static string CreateFromAppIdentifier() + { + return Application.identifier.Replace(".", "").ToLower(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UrlSchemeFactory.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UrlSchemeFactory.cs.meta new file mode 100644 index 00000000..6c28ac59 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UrlSchemeFactory.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3f04c49b8d1d43e08dcb20a8f84ebfc5 +timeCreated: 1752823044 \ No newline at end of file From b494919e1e2e2c1ba36acd62f5c46c2058abe91b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 18 Jul 2025 11:25:38 +0200 Subject: [PATCH 109/165] v3 auth working on macos --- .../Sequence-Unity/Editor/CheckUrlScheme.cs | 51 ++---------------- .../Plugins/MacOS/libKeychainAccess.dylib | Bin 84968 -> 84968 bytes .../Sequence/Samples~/Demo V3/DemoV3.unity | 4 +- .../SequenceEcosystemWalletWindow.cs | 3 +- .../Authentication/OpenIdAuthenticator.cs | 2 +- .../SequenceEcosystemWalletLogin.cs | 20 +++++-- .../RedirectHandler/NativeReceiver.cs | 10 ++++ .../RedirectHandler/RedirectFactory.cs | 2 +- ProjectSettings/ProjectSettings.asset | 3 +- 9 files changed, 37 insertions(+), 58 deletions(-) diff --git a/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs b/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs index 0b8691f8..b872fa57 100644 --- a/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs +++ b/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs @@ -26,7 +26,7 @@ public class CheckUrlScheme : IPreprocessBuildWithReport public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProject) { _pathToBuiltProject = pathToBuiltProject; - + if (string.IsNullOrWhiteSpace(_urlScheme)) { Debug.LogWarning(SequenceConfig.MissingConfigError("Url Scheme").Message); @@ -49,51 +49,7 @@ public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProj private static void CheckPlistUrlScheme() { -#if UNITY_STANDALONE_OSX - PlistDocument plist = new PlistDocument(); - plist.ReadFromFile(_plistPath); - - PlistElementDict rootDict = plist.root; - if (!rootDict.values.ContainsKey("CFBundleURLTypes")) - { - throw _missingUrlSchemeException; - } - if (rootDict.values["CFBundleURLTypes"] is PlistElementArray existingArray) - { - if (existingArray.values.Count == 0) - { - throw _missingUrlSchemeException; - } - if (existingArray.values[0] is PlistElementDict existingDict) - { - if (!existingDict.values.ContainsKey("CFBundleURLSchemes")) - { - throw _missingUrlSchemeException; - } - if (existingDict.values["CFBundleURLSchemes"] is PlistElementArray newArray) - { - List values = newArray.values; - int count = values.Count; - if (count == 0) - { - throw _missingUrlSchemeException; - } - for (int i =0; i < count; i++) - { - PlistElement plistElement = values[i]; - if (plistElement is PlistElementString plistElementString) - { - if (plistElementString.value == _urlScheme) - { - return; - } - } - } - throw _missingUrlSchemeException; - } - } - } -#elif UNITY_IOS +#if UNITY_IOS || UNITY_STANDALONE_OSX var plist = new PlistDocument(); plist.ReadFromFile(_plistPath); @@ -111,6 +67,7 @@ private static void CheckPlistUrlScheme() plist.WriteToFile(_plistPath); +#if UNITY_IOS // Add SafariServices.framework var projPath = PBXProject.GetPBXProjectPath(_pathToBuiltProject); var proj = new PBXProject(); @@ -119,6 +76,8 @@ private static void CheckPlistUrlScheme() var targetGuid = proj.GetUnityFrameworkTargetGuid(); proj.AddFrameworkToProject(targetGuid, "SafariServices.framework", false); proj.WriteToFile(projPath); +#endif + #endif } diff --git a/Packages/Sequence-Unity/Plugins/MacOS/libKeychainAccess.dylib b/Packages/Sequence-Unity/Plugins/MacOS/libKeychainAccess.dylib index d72dc8079d0c50595bf345014ada871bc5a55235..c992c8d1ac19d816564b7f97f18095b8e406480b 100755 GIT binary patch delta 4577 zcmdT|eQ;FO6~Avcn{2)|n`}0lkiag404WS6NC*ZKUjm!Fh}19Q1S?G-U;z;*g&M86 z4>wqr6d}FfrnJ=bvZF4u%P#DaJ?Wy09Jgimj6i#6pQ8|7DfGN!nqsDz z*{{$HXI}DvM|j^wFJzDExGkLrf554aUSlHUWu+d8I&TXRlD4Xe@Np$-tkMBzt zA%_xRi8>=mglGY;uC-g9VAFP{4MJ;;YX-FY<61~-_io0TA+5b~2S>|ZM>uV3gQ0Dm zH&}gur5$xX&rE?$txAS z(*D3Z#ug-jc+bmt?eoIgEd%S5wT;KS;I{CX@gpqAaO+S=gBJK$+jwO=rf^x6NIeC) zzJlRQEIDzFRW@vi<%LYVonRRPni5~bGMN(BSoP1xJ&=!OFs`v@aE)ta`8f!>wP6t1 z9jHEF6%RKlksd8@`JTm*l2y_*{|23`n+!)4j>b-A3Y^f|8+5I`>~~H=4hq*pENsBr zd)ca;@bMLi5B(a zFh+~s;`ihH{vUq#Aa=B99KVm}_s@Wf3-3&w{nSdp;%$tBUqqu*Fh7C$9siC-8|K%} zym#H&<*U9&FOE5HW3Ou!CMMNs^nLftzS~q2P4sNZ$pVBIh3=5!kcUmMB&ScElkwA% z+zjz1wiEFd*E>p!=p7~5Ndj)}C@rqv&0pbm@*6pRD#!8st!yVLa{RNz#Vg-VP-$Ft zJvL_3t0k^X@tU<0oM~>&-j`Q;+18=vCVQYSgB+*n>USPcPyka2M1!n_;Ov=x4H z5nNNNB(cww(nRjXK+L4eh1*ayZUfc9jv8f##Q`uU_+E{YPd~27uL#+7bH52(S&M3K$20WT58aSrSqzbx~PD?qNE@dQ$i8n*EHD z&fM4|vN4=`z3xmqW|^i@c8gA+NI3wC`M9`AkKlPW=bYPAhDRR5JsRqRB00p z!qhg_AS`N=4T3Jb@1muf;tj&yO(PnFw{C0@2(5pr&awu-;u{)-lMU}SWaZy#*?;xg zsdd@Qj!Z*n4+M`5*Z$c}#`sgVn* zY9y3TB9maUI@O3(Q6sx|lT$tZ(P56|39P$?VPgcADX<>%n6TkiBaNANqp3zbQm{DVlfhC zjFk(_ZXST;*M@YSVfi^w{1y~H18F+c$O>Rah8i(au_@}j zOd+qa)L0yXgdT$Z0uIAP*!+mGlf@_`5&Y`2qZk!Jul?4R$G82O3f)JG-k7+cfdyfw z37fK&MiPmz;N7V0Q;dK-ZC%KSVKJH8sNb__nZlh{tytH!gg^9bZ{+qy4ULu+RSn zd*ev^OtCp5!3jJta={3DbIeYkJ~GNVgzs@7k{h@djh@E52=nRm@R7^5PV4nn1fQ+< z-Np2;M~V{+UfM<)w7yeZjvRY6mtbM$&svOiBzE?3>ql?2mO<^QTJX<#{-$!Ql! zAVV8XxDN!k)hM$}gS;o1?(579n+8melUN_Z9v-`5eTY3p=&TPJgSSEK^S(jqM1G^6 zmAXgjr=+e*{d1`|OT7TG5U-Hv5||?Z(k1m}&~506`_qHnvz4jSP7m*V@F0hDL5z1k z(8c4s-uX1L&gX|pu+^)0(zCFZwM^{E=b+Kan@Gr5%<(59{}X-!M)si`1sMk^gp7w2 z?LX&LE}6%&xdLHV_ODR=+n$zyvbjuST-1*F}nwJMZzFk@5e&oJmorP~-d^~5BaV+m1TK?nr8uvd| z^;+Pg=Z;=WdHgI})a-dQW&W~yuldZ3e$QKhmWK;^X1)HWzyEwHt-n+}S?z3{#8-{~ pS^cbYAI;r+wP^8~7fj_ZF1a#exzB#}T=DdDYkgl^d-$VK+n`!AcV#1Or*W1eRycv@O^^K#?T3qRECIO2DA#Eml z(c-fANw!n68P@M9$)mMaXZnZ~9+bin6WwKXr9WmCSQ7G>nf@N^fW$d+cEC)hr@QPg zNOrAcGpu7P4B1Td#q_mG2TiqATRSX5Zj{qH=o;JY*3Rp=owV0hsI<}F+U6-q)SB@! zeZ^|X-@1Oowz|57mCGxoGRR4%7-!RS8M$+Q!pW zS$nO_6Xr+}I-?e2@3FgV|2+89O0AV|yL5|I$E+C*byZf`-j(7-VP! zs4;;wpv4Ik_5|H+m~+JwtT+Wbo?z)dM%rsMPy5o5%03o)%)XJ^ZEcFhVxGa)2SLEb zy{6yOK7MI;Wgkm#%>HH)J&zqf6Rh#U&@*7YfgB()o7qAEch3d(1M>{J zdq9|>9#24QY|t>ulLn^D7CUmDppfo3!E&;Cz^kcPVT0MRP$tWNsn`=}j(7qOU(w3= z;_Sp#EMp-AYa(zWAH$ga6J|W%Mg}To3mF0~Rk-X!Aqzw16fz8#VruDybf$ZhJJvj+ z4G}M__)iqC9xyvpv0MI2Djc|?y~(@{xRLORVQ67-w!rh;z_u?J?-w#=d>@ysh%fGM z4kwb?3hC=X7;Mf%}*6)o5XExA>yVFSrugpT~eHpBKY-tN{YPa`8{tT zpGi84U)dJ2PSVAa=1D5v1q(rb&@4Xe8K+`#3&APoI8O02tq7%8D`#kL5(E_DAa))-*J(57jMFvh%qHuIf5+4;$)9I1it;DmJPN1*()e1{;RC^qs0X z>Tjb?0(NG~BJ5{I2a zemBD~Tc39P>H_5vg&N&XJJV&`$+nFBka2p5jh4C{p)R+QdHiFy(x5wfwz_Pt(n;;U zZT9-xFo898U7#_nqx&uM((5ZEM-Wn9K`;7T>HU%&mhAotTE4?&?{W$3lx&9i3)_u? zqF)O6Il_c~7q1*nOLn|+IPId-ce>Iw$v!AeX<(zEc;a?};{^r7iGt#@ovff(=|@4K zifQb=W37Ys`cY7*9FRD-lPWE&pqSjk3W_x?Ur|u_gl0A^X&qBgNbWKrBw^r0L9wd! zx`N`JYYPe^jkZ=Bn(zz1rl2tFckkSOZ&}&1-KV2Bb(Oy`6Ske`*kUwn>i=F)4B!;O zM!cXf(!1KKkJfvdifLzCb~2vFo+2xKy={`$qL958Qq<_Vo75K%Pu8o^g~a!P0^8v%5c z4QHv*-x2T}ADNLt4s#+-^eHlaj$Ee1HjT%p4l)%=rdokM>O>cyVX+%KP2= z3D-EI%_33eOt)Y1ON5hJ8TfhN>+>UVC)bfO-v=YiBY4RcSKu{noV|zrb;77sC>xd3 zQ7!90ZliSc2vv4DydsTiv~};E7nUH=k74Z^*9+nL)azUyn_HPj?H1_63zko= zf2(vo9=2UznSXDOak89%n7KlcoS=6kVr)T3&#(|}*oX#fgc+gQ)aVxQG_xAjZo;B0 z*9!S74^a_&F^z5HMm4$_^UmRbe2h7M*m|1TDkM=op_#$Ve7@`rvQ$gm!Ko`(Fazv# zVPR%eOCeEa_#kqO8-A}QPhS^K73b^gBEGl|oaT;ff&*~+kpJ6}hnNF!+(q9FI%;rx zareS{Ig?q2g^iNWti~-Ig!Uaw8&)+~i-+7MLuO&J)J&%(PgHwxnf6$8YLw_4AMtVW znDMwVW7C-NoH66_F=N-5@ggxUfc*lG8s)aD1kXvF!?Jsa`Gh4moFL@OzDBz zk{3J00;_H`LCWjna{6+6uH8~aNFgqso~yCg-zy23jPW#jwtdvZ-We5$b-XOQ^NVO~ z_f%2K>;R9~GPt6;%6ipfDXgFokBEhcm*&fYM(}w-BVG;*`INsP7Lv@L3=6qM(gl*< zC+T)c)7gS!3mWdhe^Jo*xE{a#uPtbfD~dAeN_9fsh<-AZrYirpB~1;BLQjr8iXxzG zCn_cq4*jS~nWyV(3Z1A@W_!b1TlB-aACPz<6E7O#h0GtznFUeEOhh3QuMwJcgfJYI zHN$ff6ZyiwFR@eNe@d)MJOR4UFC_Jnu~0CGPvS;k6DpT3SLoRV%8Z%E<_kx7>4a*- z$Tw1!PQdJ$X6PC0(o ztz6U>urW;VmT~nDam9^OudjrqIwCmC9DY!`l-vwCB}>v!&3dEdnk`zJkj_Eh7>+FL{G7AvZ1IPZON z;MX7C_wT9yXec9eS$ZNWr}P;pdB%d^)xHJCoP8Ki*lI zacZ_6I-6Np<>O2=K_zxw3m$ca@`8V@wCzO?SoY5N?9wv47d^^->s(0>4jSG1@A diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 95200e57..04166643 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -3596,7 +3596,7 @@ MonoBehaviour: m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, SequenceBoilerplates m_MethodName: OnImplicitSessionTypeChanged - m_Mode: 3 + m_Mode: 0 m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine @@ -3973,7 +3973,7 @@ MonoBehaviour: m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, SequenceBoilerplates m_MethodName: OnExplicitSessionTypeChanged - m_Mode: 3 + m_Mode: 0 m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs index da7b8263..25819d22 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs @@ -220,6 +220,7 @@ private void ShowError(string error) private void RecoverWalletFromStorage() { + _login.RecoverSessionsFromStorage(); ShowWallet(true); } @@ -232,7 +233,7 @@ private void ShowSignature(string signature) private void ShowWallet(bool recovered) { - _wallets = _login.RecoverSessionsFromStorage(); + _wallets = _login.GetAllSessions(); _walletText.text = _wallets[_selectedWallet].Address.Value; var addresses = _wallets.Select(w => w.SessionAddress.Value).ToList(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Authentication/OpenIdAuthenticator.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Authentication/OpenIdAuthenticator.cs index 4f22f51c..7e6cba49 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Authentication/OpenIdAuthenticator.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Authentication/OpenIdAuthenticator.cs @@ -46,7 +46,7 @@ public OpenIdAuthenticator(string nonce = null) { SequenceConfig config = SequenceConfig.GetConfig(SequenceService.None); - _urlScheme = config.UrlScheme; + _urlScheme = UrlSchemeFactory.CreateFromAppIdentifier(); SetClientIds(config); #if UNITY_EDITOR diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs index 099b0710..d55cd9d5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; @@ -14,6 +16,7 @@ public class SequenceEcosystemWalletLogin private Chain _chain; private EOAWallet _sessionWallet; private SessionStorage _sessionStorage; + private List _credentials = new(); public SequenceEcosystemWalletLogin(Chain chain) { @@ -54,13 +57,18 @@ public async Task SignInWithMnemonic(SessionPermissions public SequenceEcosystemWallet[] RecoverSessionsFromStorage() { - var credentials = _sessionStorage.GetSessions(); - if (credentials.Length == 0) + _credentials = _sessionStorage.GetSessions().ToList(); + return GetAllSessions(); + } + + public SequenceEcosystemWallet[] GetAllSessions() + { + if (_credentials.Count == 0) throw new Exception("No session found in storage."); - var wallets = new SequenceEcosystemWallet[credentials.Length]; - for (var i = 0; i < credentials.Length; i++) - wallets[i] = new SequenceEcosystemWallet(credentials[i]); + var wallets = new SequenceEcosystemWallet[_credentials.Count]; + for (var i = 0; i < _credentials.Count; i++) + wallets[i] = new SequenceEcosystemWallet(_credentials[i]); return wallets; } @@ -109,6 +117,8 @@ private async Task CreateNewSession(bool isExplicit, Se response.Data.email); _sessionStorage.AddSession(credentials); + _credentials.Add(credentials); + return new SequenceEcosystemWallet(credentials); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs index 412a99aa..203573f9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs @@ -8,6 +8,16 @@ internal class NativeReceiver : MonoBehaviour { private string _response; + private void Awake() + { + Application.deepLinkActivated += HandleResponse; + } + + private void OnDestroy() + { + Application.deepLinkActivated -= HandleResponse; + } + private void OnApplicationFocus(bool hasFocus) { #if UNITY_ANDROID && !UNITY_EDITOR diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs index 841d8d5a..4d66fac0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs @@ -4,7 +4,7 @@ internal static class RedirectFactory { public static RedirectHandler CreateHandler() { -#if !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID) +#if !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID || UNITY_STANDALONE_OSX) return new IosRedirectHandler(); #elif !UNITY_EDITOR && UNITY_WEBGL return new BrowserRedirectHandler(); diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index dd0b0000..d4378f7c 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -222,8 +222,7 @@ PlayerSettings: iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] - macOSURLSchemes: - - sdk-powered-by-sequence + macOSURLSchemes: [] iOSBackgroundModes: 0 iOSMetalForceHardShadows: 0 metalEditorSupport: 1 From 22a04d856d1129e024ef78a67cbe8ec58419b72e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 18 Jul 2025 12:06:28 +0200 Subject: [PATCH 110/165] some more adjustments --- .../Authentication/Requests/Connect.cs | 2 +- .../Authentication/Requests/SignMessage.cs | 1 + .../SequenceEcosystemWalletLogin.cs | 4 ++- .../Authentication/SessionBuilder.cs | 2 +- .../Permission/ParameterOperation.cs | 4 +-- .../Primitives/Permission/ParameterRule.cs | 33 ++++++++----------- .../RedirectHandler/NativeReceiver.cs | 14 -------- 7 files changed, 21 insertions(+), 39 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs index f25aeb83..1312aff6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs @@ -8,7 +8,7 @@ public struct ConnectArgs public string preferredLoginMethod; public string email; public string implicitSessionRedirectUrl; - public object permissions; + public SessionPermissions permissions; } public struct ConnectResponse diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs index f7bc6096..80f056c3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs @@ -2,6 +2,7 @@ namespace Sequence.EcosystemWallet.Authentication.Requests { + public struct SignMessageArgs { public Address address; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs index d55cd9d5..3198af25 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs @@ -2,9 +2,11 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Newtonsoft.Json; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; using Sequence.Wallet; +using UnityEngine; using UnityEngine.Assertions; namespace Sequence.EcosystemWallet.Authentication @@ -95,7 +97,7 @@ private async Task CreateNewSession(bool isExplicit, Se preferredLoginMethod = preferredLoginMethod, email = email, implicitSessionRedirectUrl = isExplicit ? null : RedirectOrigin.GetOriginString(), - permissions = permissions?.ToJson() + permissions = permissions }; var action = isExplicit ? "addExplicitSession" : "addImplicitSession"; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs index fa264f73..a64ab3fe 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs @@ -33,7 +33,7 @@ public void AddPermission(Address target, bool cumulative, ParameterOperation op var rule = new ParameterRule { cumulative = cumulative, - operation = operation, + operation = (int)operation, value = value.HexStringToByteArray().PadRight(32), offset = offset, mask = mask diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs index 3302c9b5..dcbfc550 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs @@ -3,8 +3,8 @@ namespace Sequence.EcosystemWallet.Primitives { - [JsonConverter(typeof(EnumConverter))] - public enum ParameterOperation + [JsonConverter(typeof(EnumConverter))] + public enum ParameterOperation : int { equal = 0, notEqual = 1, diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs index b9785702..f01fc7e9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Numerics; using Newtonsoft.Json; +using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives @@ -14,10 +15,10 @@ public class ParameterRule public static readonly byte[] Uint256Mask = Enumerable.Repeat((byte)0xff, 32).ToArray().PadLeft(32); public bool cumulative; - public ParameterOperation operation; - public byte[] value; - public BigInteger offset; - public byte[] mask; + public int operation; + public Bytes value; + public BigInt offset; + public Bytes mask; public object ToJson() { @@ -25,17 +26,9 @@ public object ToJson() { cumulative = cumulative, operation = (int)operation, - value = new Dictionary - { - {"_isUint8Array", true}, - {"data", value.ByteArrayToHexStringWithPrefix()} - }, - offset = offset.ToString(), - mask = new Dictionary - { - {"_isUint8Array", true}, - {"data", mask.ByteArrayToHexStringWithPrefix()} - } + value = value, + offset = offset, + mask = mask }; } @@ -43,9 +36,9 @@ public byte[] Encode() { byte operationCumulative = (byte)(((byte)operation << 1) | (cumulative ? 1 : 0)); List result = new() { operationCumulative }; - result.AddRange(value.PadLeft(32)); - result.AddRange(offset.ToByteArray().PadLeft(32)); - result.AddRange(mask.PadLeft(32)); + result.AddRange(value.Data.PadLeft(32)); + result.AddRange(offset.Value.ToByteArray().PadLeft(32)); + result.AddRange(mask.Data.PadLeft(32)); return result.ToArray(); } @@ -55,7 +48,7 @@ public static ParameterRule FromJson(string json) return new() { cumulative = (bool)data["cumulative"], - operation = (ParameterOperation)Convert.ToInt32(data["operation"]), + operation = Convert.ToInt32(data["operation"]), value = data["value"].ToString().HexStringToByteArray(), offset = BigInteger.Parse(data["offset"].ToString()), mask = data["mask"].ToString().HexStringToByteArray() @@ -78,7 +71,7 @@ public static ParameterRule Decode(byte[] data) return new ParameterRule { cumulative = cumulative, - operation = operation, + operation = (int)operation, value = value, offset = offset, mask = mask diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs index 203573f9..676e76d9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs @@ -18,20 +18,6 @@ private void OnDestroy() Application.deepLinkActivated -= HandleResponse; } - private void OnApplicationFocus(bool hasFocus) - { -#if UNITY_ANDROID && !UNITY_EDITOR - using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) - { - var activity = unityPlayer.GetStatic("currentActivity"); - using (var plugin = new AndroidJavaClass("xyz.sequence.DeeplinkHandler")) - { - plugin.CallStatic("checkIntent", activity); - } - } -#endif - } - public void HandleResponse(string response) { _response = response; From f15ba5498532c31afdd4078d2e09448f60cc255a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 18 Jul 2025 12:27:11 +0200 Subject: [PATCH 111/165] switching aspect ratio to portrait --- .../Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity | 2 +- ProjectSettings/ProjectSettings.asset | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 04166643..0bf5d0c3 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -5179,7 +5179,7 @@ MonoBehaviour: m_ScaleFactor: 1 m_ReferenceResolution: {x: 800, y: 600} m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 + m_MatchWidthOrHeight: 1 m_PhysicalUnit: 3 m_FallbackScreenDPI: 200 m_DefaultSpriteDPI: 200 diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index d4378f7c..ce124fff 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -8,7 +8,7 @@ PlayerSettings: AndroidProfiler: 0 AndroidFilterTouchesWhenObscured: 0 AndroidEnableSustainedPerformanceMode: 0 - defaultScreenOrientation: 2 + defaultScreenOrientation: 0 targetDevice: 2 useOnDemandResources: 0 accelerometerFrequency: 60 @@ -159,7 +159,7 @@ PlayerSettings: applicationIdentifier: Android: com.HorizonGames.demounitygame Standalone: com.HorizonGames.demo-unity-game - iPhone: com.HorizonGames.demo-unity-game2 + iPhone: com.HorizonGames.demo-unity-game buildNumber: Standalone: 0 iPhone: 0 From 2bd43bf7b6b9d26c3ea80d0d6aa62a8a73125833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 21 Jul 2025 09:07:08 +0200 Subject: [PATCH 112/165] redirect working on windows builds --- .../SequenceEcosystemWalletWindow.cs | 1 + .../Authentication/RedirectOrigin.cs | 15 +- .../Authentication/SequenceEcosystemWallet.cs | 6 +- .../SequenceEcosystemWalletLogin.cs | 11 +- ...tHandler.cs => DeeplinkRedirectHandler.cs} | 4 +- ...s.meta => DeeplinkRedirectHandler.cs.meta} | 0 .../LocalhostRedirectHandler.cs | 5 +- .../RedirectHandler/RedirectFactory.cs | 2 +- .../RedirectHandler/RedirectHandler.cs | 10 +- .../RedirectHandler/TcpRedirectHandler.cs | 160 ++++++++++++++++++ .../TcpRedirectHandler.cs.meta | 3 + .../RedirectHandler/WindowsRedirectCheck.cs | 53 ++++++ .../WindowsRedirectCheck.cs.meta | 3 + .../WindowsProtectedDataStorage.cs | 47 +++-- 14 files changed, 289 insertions(+), 31 deletions(-) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/{IosRedirectHandler.cs => DeeplinkRedirectHandler.cs} (89%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/{IosRedirectHandler.cs.meta => DeeplinkRedirectHandler.cs.meta} (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/TcpRedirectHandler.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/TcpRedirectHandler.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/WindowsRedirectCheck.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/WindowsRedirectCheck.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs index 25819d22..1c986649 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs @@ -48,6 +48,7 @@ private enum ExplicitSessionType private void Start() { _login = new(Chain.TestnetArbitrumSepolia); + _emailInput.onValueChanged.AddListener(VerifyEmailInput); _messagePopup.gameObject.SetActive(false); _loadingOverlay.SetActive(false); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs index 59b5a831..c5483f40 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs @@ -1,3 +1,5 @@ +using System.Net; +using System.Net.Sockets; using System.Runtime.InteropServices; using Sequence.Utils; using UnityEngine; @@ -6,8 +8,6 @@ namespace Sequence.EcosystemWallet.Authentication { public static class RedirectOrigin { - public const string DefaultOrigin = "http://localhost:8080/"; - #if !UNITY_EDITOR && UNITY_WEBGL [DllImport("__Internal")] private static extern System.IntPtr GetPageOrigin(); @@ -24,7 +24,16 @@ public static string GetOriginString() #else public static string GetOriginString() { - return DefaultOrigin; + return $"http://localhost:{GetAvailablePort()}/"; + } + + private static int GetAvailablePort() + { + var tcpListener = new TcpListener(IPAddress.Loopback, 0); + tcpListener.Start(); + var port = ((IPEndPoint)tcpListener.LocalEndpoint).Port; + tcpListener.Stop(); + return port; } #endif } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs index 1ea4a65b..f21a02a6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs @@ -40,8 +40,10 @@ public async Task SignMessage(Chain chain, string message) }; var url = $"{SequenceEcosystemWalletLogin.WalletUrl}/request/sign"; - var redirectHandler = RedirectFactory.CreateHandler(); - var response = await redirectHandler.WaitForResponse(url, "signMessage", args); + var handler = RedirectFactory.CreateHandler(); + handler.SetRedirectUrl(RedirectOrigin.GetOriginString()); + + var response = await handler.WaitForResponse(url, "signMessage", args); if (!response.Result) throw new Exception("Failed to sign message"); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs index 3198af25..e00d7ab9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs @@ -2,11 +2,9 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Newtonsoft.Json; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; using Sequence.Wallet; -using UnityEngine; using UnityEngine.Assertions; namespace Sequence.EcosystemWallet.Authentication @@ -24,6 +22,7 @@ public SequenceEcosystemWalletLogin(Chain chain) { _chain = chain; _sessionStorage = new SessionStorage(); + _credentials = _sessionStorage.GetSessions().ToList(); } public async Task AddSession(SessionPermissions permissions) @@ -59,7 +58,6 @@ public async Task SignInWithMnemonic(SessionPermissions public SequenceEcosystemWallet[] RecoverSessionsFromStorage() { - _credentials = _sessionStorage.GetSessions().ToList(); return GetAllSessions(); } @@ -90,13 +88,14 @@ public void SignOut() private async Task CreateNewSession(bool isExplicit, SessionPermissions permissions, string preferredLoginMethod, string email = null) { _sessionWallet = new EOAWallet(); - + + var redirectUrl = RedirectOrigin.GetOriginString(); var payload = new ConnectArgs { sessionAddress = _sessionWallet.GetAddress(), preferredLoginMethod = preferredLoginMethod, email = email, - implicitSessionRedirectUrl = isExplicit ? null : RedirectOrigin.GetOriginString(), + implicitSessionRedirectUrl = isExplicit ? null : redirectUrl, permissions = permissions }; @@ -104,6 +103,8 @@ private async Task CreateNewSession(bool isExplicit, Se var url = $"{WalletUrl}/request/connect"; var handler = RedirectFactory.CreateHandler(); + handler.SetRedirectUrl(redirectUrl); + var response = await handler.WaitForResponse(url, action, payload); if (!response.Result) throw new Exception("Error during request"); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/DeeplinkRedirectHandler.cs similarity index 89% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/DeeplinkRedirectHandler.cs index d1eec0a4..55f2aa93 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/DeeplinkRedirectHandler.cs @@ -7,7 +7,7 @@ namespace Sequence.EcosystemWallet.Browser { - internal class IosRedirectHandler : RedirectHandler + internal class DeeplinkRedirectHandler : RedirectHandler { private NativeReceiver _receiver; @@ -22,8 +22,6 @@ internal class IosRedirectHandler : RedirectHandler var data = response.ExtractQueryAndHashParameters(); - Debug.Log($"Query Data: {JsonConvert.SerializeObject(data)}"); - var id = data["id"]; if (id != Id) throw new Exception("Invalid request id"); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/DeeplinkRedirectHandler.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/IosRedirectHandler.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/DeeplinkRedirectHandler.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs index f725a25e..e1fc5033 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs @@ -1,11 +1,8 @@ using System; -using System.Collections.Generic; -using System.Collections.Specialized; using System.Net; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; -using Sequence.EcosystemWallet.Authentication; using UnityEngine; namespace Sequence.EcosystemWallet.Browser @@ -19,7 +16,7 @@ internal class LocalhostRedirectHandler : RedirectHandler try { var listener = new HttpListener(); - listener.Prefixes.Add(RedirectOrigin.DefaultOrigin); + listener.Prefixes.Add(RedirectUrl); listener.Start(); var context = await listener.GetContextAsync(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs index 4d66fac0..1171c323 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs @@ -5,7 +5,7 @@ internal static class RedirectFactory public static RedirectHandler CreateHandler() { #if !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID || UNITY_STANDALONE_OSX) - return new IosRedirectHandler(); + return new DeeplinkRedirectHandler(); #elif !UNITY_EDITOR && UNITY_WEBGL return new BrowserRedirectHandler(); #else diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs index 74d5c7c3..688d1cd3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs @@ -6,17 +6,23 @@ namespace Sequence.EcosystemWallet.Browser { - internal abstract class RedirectHandler + public abstract class RedirectHandler { protected string Id = $"sequence-{Guid.NewGuid().ToString()}"; + protected string RedirectUrl; public abstract Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload); + + public void SetRedirectUrl(string redirectUrl) + { + RedirectUrl = redirectUrl; + } protected string ConstructUrl(string url, string action, TPayload payload) { var serializedPayload = JsonConvert.SerializeObject(payload); var encodedPayload = Convert.ToBase64String(Encoding.UTF8.GetBytes(serializedPayload)); - return $"{url}?action={action}&payload={encodedPayload}&id={Id}&redirectUrl={RedirectOrigin.GetOriginString()}&mode=redirect"; + return $"{url}?action={action}&payload={encodedPayload}&id={Id}&redirectUrl={RedirectUrl}&mode=redirect"; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/TcpRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/TcpRedirectHandler.cs new file mode 100644 index 00000000..d71803f3 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/TcpRedirectHandler.cs @@ -0,0 +1,160 @@ +using System; +using System.IO; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet.Browser +{ + public class TcpRedirectHandler : RedirectHandler + { + public static readonly int WindowsIpcPort = 52836; + + private static bool _running; + private static string _response; + + public override async Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) + { + _response = string.Empty; + + PrepareServer("_redirectUrl"); + StartServer(); + + var finalUrl = ConstructUrl(url, action, payload); + Application.OpenURL(finalUrl); + + while (string.IsNullOrEmpty(_response)) + await Task.Delay(100); + + Debug.Log($"Received Response from tcp: {_response}"); + + var data = _response.ExtractQueryAndHashParameters(); + + Debug.Log($"Query Data: {JsonConvert.SerializeObject(data)}"); + + var id = data["id"]; + if (id != Id) + throw new Exception("Invalid request id"); + + if (data.TryGetValue("error", out var error)) + throw new Exception(error); + + var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(Uri.UnescapeDataString(data["payload"]))); + var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); + + return (true, responsePayload); + } + + /// + /// Run a TCP server on Windows standalone to get the auth token from the other instance. + /// IMPORTANT NOTE: Do not add code to this TCP server/client without thinking very carefully; it's easy to get driveby exploited since this is a TCP server any application can talk to. + /// IMPORTANT NOTE: Do not increase the attack surface without careful thought. + /// + private static void StartServer() + { + var syncContext = SynchronizationContext.Current; + var ipcListener = new Thread(() => + { + var socketConnection = new TcpListener(System.Net.IPAddress.Parse("127.0.0.1"), WindowsIpcPort); + socketConnection.Start(); + var bytes = new System.Byte[1024]; + var msg = ""; + + while (true) + { + using (var connectedTcpClient = socketConnection.AcceptTcpClient()) + { + using (NetworkStream stream = connectedTcpClient.GetStream()) + { + int length; + while ((length = stream.Read(bytes, 0, bytes.Length)) != 0) + { + var data = new byte[length]; + System.Array.Copy(bytes, 0, data, 0, length); + // Convert byte array to string message. + string clientMessage = System.Text.Encoding.ASCII.GetString(data); + if (clientMessage.StartsWith("@@@@")) + { + msg = clientMessage.Replace("@@@@", "").Replace("$$$$", ""); + } + else + { + msg += clientMessage.Replace("$$$$", ""); + } + if (msg.Length > 8192) + { + // got some weird garbage, toss it to avoid memory leaks. + msg = ""; + } + if (clientMessage.EndsWith("$$$$")) + { + syncContext.Post((data) => + { + Debug.Log($"{(string)data}"); + _response = (string)data; + }, msg); + } + } + } + } + } + }); + + ipcListener.IsBackground = true; + ipcListener.Start(); + _running = true; + } + + private static void PrepareServer(string redirectUrl) + { + if (_running) + return; + + // Register a Windows URL protocol handler in the Windows Registry. + var scheme = redirectUrl.Replace("://", string.Empty); + var appPath = Path.GetFullPath(Application.dataPath.Replace("_Data", ".exe")); + + string[] commands = new string[]{ + $"add HKEY_CURRENT_USER\\Software\\Classes\\{scheme} /t REG_SZ /d \"URL:Sequence Login for {Application.productName}\" /f", + $"add HKEY_CURRENT_USER\\Software\\Classes\\{scheme} /v \"URL Protocol\" /t REG_SZ /d \"\" /f", + $"add HKEY_CURRENT_USER\\Software\\Classes\\{scheme}\\shell /f", + $"add HKEY_CURRENT_USER\\Software\\Classes\\{scheme}\\shell\\open /f", + $"add HKEY_CURRENT_USER\\Software\\Classes\\{scheme}\\shell\\open\\command /t REG_SZ /d \"\\\"{appPath}\\\" \\\"%1\\\"\" /f", + }; + +#if ENABLE_MONO + foreach(var args in commands) { + var command = new System.Diagnostics.ProcessStartInfo(); + command.FileName = "C:\\Windows\\System32\\reg.exe"; + command.Arguments = args; + command.UseShellExecute = false; + command.CreateNoWindow = true; + System.Diagnostics.Process.Start(command); + } +#elif ENABLE_IL2CPP + try + { + foreach(var args in commands) { + var command = new System.Diagnostics.ProcessStartInfo(); + command.FileName = "C:\\Windows\\System32\\reg.exe"; + command.Arguments = args; + command.UseShellExecute = false; + command.CreateNoWindow = true; + System.Diagnostics.Process.Start(command); + } + } + catch (Exception ex) + { + string message = $"Failed to register URL scheme '{scheme}': {ex.Message}" + "\nSocial sign in is not currently supported on IL2CPP"; + Debug.LogWarning(message); + throw new Exception(message); + } +#endif + + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/TcpRedirectHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/TcpRedirectHandler.cs.meta new file mode 100644 index 00000000..6aa4927b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/TcpRedirectHandler.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ad9ab44dc25a48b997d66403ea30eb9f +timeCreated: 1753070976 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/WindowsRedirectCheck.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/WindowsRedirectCheck.cs new file mode 100644 index 00000000..6abfcccc --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/WindowsRedirectCheck.cs @@ -0,0 +1,53 @@ +#if !UNITY_EDITOR && UNITY_STANDALONE_WIN +using System; +using System.Net.Sockets; +using System.Threading; +#endif + +using UnityEngine; + +namespace Sequence.EcosystemWallet.Browser +{ + public class WindowsRedirectCheck : MonoBehaviour + { +#if !UNITY_EDITOR && UNITY_STANDALONE_WIN + private static Mutex _mutex; + + private void Start() + { + return; + if (IsFirstInstance()) + return; + + TrySendArgsToRunningInstance(Environment.GetCommandLineArgs()); + Application.Quit(); + } + + private void TrySendArgsToRunningInstance(string[] args) + { + if (args.Length <= 1) + return; + + try + { + using var client = new TcpClient("127.0.0.1", TcpRedirectHandler.WindowsIpcPort); + using var stream = client.GetStream(); + + var message = "@@@@" + args[1] + "$$$$"; + var bytes = System.Text.Encoding.ASCII.GetBytes(message); + stream.Write(bytes, 0, bytes.Length); + } + catch (Exception e) + { + Debug.LogWarning($"Failed to send deep link to running instance: {e.Message}"); + } + } + + private bool IsFirstInstance() + { + _mutex = new Mutex(true, "SequenceWindowsInstance", out var createdNew); + return createdNew; + } +#endif + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/WindowsRedirectCheck.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/WindowsRedirectCheck.cs.meta new file mode 100644 index 00000000..f58c7ce9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/WindowsRedirectCheck.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3419741f3b4c4304bfe77185000739a8 +timeCreated: 1753076729 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/WindowsProtectedDataStorage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/WindowsProtectedDataStorage.cs index 39b2c9a6..e36e9558 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/WindowsProtectedDataStorage.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/WindowsProtectedDataStorage.cs @@ -23,15 +23,24 @@ public WindowsProtectedDataStorage() public void StoreString(string key, string value) { #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN - byte[] data = Util.EncryptData(value, Encoding.UTF8.GetBytes(key)); - - using (FileStream fs = new FileStream(DataFile, FileMode.OpenOrCreate, FileAccess.Write)) + try { - using (BinaryWriter bw = new BinaryWriter(fs)) + CheckFileExists(); + + byte[] data = Util.EncryptData(value, Encoding.UTF8.GetBytes(key)); + + using (FileStream fs = new FileStream(DataFile, FileMode.OpenOrCreate, FileAccess.Write)) { - bw.Write(data); + using (BinaryWriter bw = new BinaryWriter(fs)) + { + bw.Write(data); + } } } + catch (Exception e) + { + Debug.LogException(e); + } #endif } @@ -41,19 +50,35 @@ public string RetrieveString(string key) #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN - byte[] data = null; - using (FileStream fs = new FileStream(DataFile, FileMode.Open, FileAccess.Read)) + try { - using (BinaryReader br = new BinaryReader(fs)) + CheckFileExists(); + + byte[] data = null; + using (FileStream fs = new FileStream(DataFile, FileMode.Open, FileAccess.Read)) { - data = br.ReadBytes((int)br.BaseStream.Length); + using (BinaryReader br = new BinaryReader(fs)) + { + data = br.ReadBytes((int)br.BaseStream.Length); + } } - } - value = Util.DecryptData(data, Encoding.UTF8.GetBytes(key)); + value = Util.DecryptData(data, Encoding.UTF8.GetBytes(key)); + } + catch (Exception e) + { + Debug.LogException(e); + return null; + } #endif return value; } + + private void CheckFileExists() + { + if (!File.Exists(DataFile)) + File.Create(DataFile).Dispose(); + } } } From cf3604ab8de0f7bffe774b329c776723d76ae533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 24 Jul 2025 10:17:19 +0200 Subject: [PATCH 113/165] added generic HttpClient to Sequence.Utils, removed it from EmbeddedWallet asmdef --- .../SequenceSDK/WaaS/Tests/HttpClientTests.cs | 19 -- .../WaaS/Tests/HttpClientTests.cs.meta | 3 - .../WaaS/Tests/IntentSenderTests.cs | 39 +-- .../Authentication/SequenceEcosystemWallet.cs | 15 +- .../Primitives/Payload/Call.cs | 10 + .../SequenceEcosystemWallet.asmdef | 3 +- .../EmbeddedWallet/EOAWalletLinker.cs | 7 +- .../EmbeddedWallet/HttpClient.cs.meta | 3 - .../SequenceSDK/EmbeddedWallet/IHttpClient.cs | 15 - .../EmbeddedWallet/IHttpClient.cs.meta | 3 - .../EmbeddedWallet/IntentSender.cs | 36 ++- .../EmbeddedWallet/SequenceWallet.cs | 2 +- .../SequenceSDK/Relayer/DataTypes.meta | 3 + .../Relayer/DataTypes/FeeOption.cs | 10 + .../Relayer/DataTypes/FeeOption.cs.meta | 3 + .../Relayer/DataTypes/FeeOptionsArgs.cs | 18 ++ .../Relayer/DataTypes/FeeOptionsArgs.cs.meta | 3 + .../Relayer/DataTypes/FeeOptionsReturn.cs | 9 + .../DataTypes/FeeOptionsReturn.cs.meta | 3 + .../Sequence/SequenceSDK/Relayer/IRelayer.cs | 9 + .../SequenceSDK/Relayer/IRelayer.cs.meta | 3 + .../Sequence/SequenceSDK/Relayer/Relayer.cs | 28 ++ .../SequenceSDK/Relayer/Relayer.cs.meta | 3 + .../SequenceSDK/Utils/Networking.meta | 3 + .../Networking}/HttpClient.cs | 284 +++++++----------- .../Utils/Networking/HttpClient.cs.meta | 3 + .../Utils/Networking/IHttpClient.cs | 11 + .../Utils/Networking/IHttpClient.cs.meta | 3 + 28 files changed, 309 insertions(+), 242 deletions(-) delete mode 100644 Assets/SequenceSDK/WaaS/Tests/HttpClientTests.cs delete mode 100644 Assets/SequenceSDK/WaaS/Tests/HttpClientTests.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/HttpClient.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IHttpClient.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IHttpClient.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsReturn.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsReturn.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/Relayer.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/Relayer.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking.meta rename Packages/Sequence-Unity/Sequence/SequenceSDK/{EmbeddedWallet => Utils/Networking}/HttpClient.cs (61%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/IHttpClient.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/IHttpClient.cs.meta diff --git a/Assets/SequenceSDK/WaaS/Tests/HttpClientTests.cs b/Assets/SequenceSDK/WaaS/Tests/HttpClientTests.cs deleted file mode 100644 index 2e3cd13a..00000000 --- a/Assets/SequenceSDK/WaaS/Tests/HttpClientTests.cs +++ /dev/null @@ -1,19 +0,0 @@ -using NUnit.Framework; -using Sequence.Config; - -namespace Sequence.EmbeddedWallet.Tests -{ - public class HttpClientTests - { - [Test] - public void TestHttpClientIncludesAPIKey() - { - HttpClient client = new HttpClient("https://randomurl.com"); - var request = client.BuildRequest("", null); - string header = request.Item1.GetRequestHeader("X-Access-Key"); - Assert.IsTrue(header.Length > 0); - Assert.AreEqual(SequenceConfig.GetConfig(SequenceService.WaaS).BuilderAPIKey, header); - Assert.IsTrue(request.Item2.Contains(header)); - } - } -} \ No newline at end of file diff --git a/Assets/SequenceSDK/WaaS/Tests/HttpClientTests.cs.meta b/Assets/SequenceSDK/WaaS/Tests/HttpClientTests.cs.meta deleted file mode 100644 index 0c17261c..00000000 --- a/Assets/SequenceSDK/WaaS/Tests/HttpClientTests.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 00108527afd24cba8bed98de4fb652d6 -timeCreated: 1702910013 \ No newline at end of file diff --git a/Assets/SequenceSDK/WaaS/Tests/IntentSenderTests.cs b/Assets/SequenceSDK/WaaS/Tests/IntentSenderTests.cs index c65b7ac6..d4d2cc23 100644 --- a/Assets/SequenceSDK/WaaS/Tests/IntentSenderTests.cs +++ b/Assets/SequenceSDK/WaaS/Tests/IntentSenderTests.cs @@ -156,54 +156,57 @@ public async Task TestTimeMismatchExceptionResultsInRetry(int timeOffset) private class MockHttpClientReturnsFailedTransaction : IHttpClient { public static string error = "Mock failed transaction"; - public async Task SendRequest(string path, T args, Dictionary headers = null, string overrideUrl = null) + + public async Task SendPostRequest(string path, TArgs args, Dictionary headers = null) { var response = new IntentResponse(new Response( - FailedTransactionReturn.IdentifyingCode, - new FailedTransactionReturn(error, null, null))); + FailedTransactionReturn.IdentifyingCode, new FailedTransactionReturn(error, null, null))); + string responseJson = JsonConvert.SerializeObject(response); - return JsonConvert.DeserializeObject(responseJson); + return JsonConvert.DeserializeObject(responseJson); } - public async Task GetTimeShift() + public Task SendGetRequest(string path, Dictionary headers = null) { - return TimeSpan.Zero; + throw new NotImplementedException(); } } private class MockHttpClientReturnsUnknownCode : IHttpClient { public static string code = "some unrecognized code"; - public async Task SendRequest(string path, T args, Dictionary headers = null, string overrideUrl = null) + + public async Task SendPostRequest(string path, TArgs args, Dictionary headers = null) { var response = new IntentResponse(new Response( - code, - new FailedTransactionReturn("", null, null))); + code, new FailedTransactionReturn("", null, null))); + string responseJson = JsonConvert.SerializeObject(response); - return JsonConvert.DeserializeObject(responseJson); + return JsonConvert.DeserializeObject(responseJson); } - public async Task GetTimeShift() + public Task SendGetRequest(string path, Dictionary headers = null) { - return TimeSpan.Zero; + throw new NotImplementedException(); } } private class MockHttpClientReturnsSuccessfulTransaction : IHttpClient { public static string txHash = "txhash"; - public async Task SendRequest(string path, T args, Dictionary headers = null, string overrideUrl = null) + + public async Task SendPostRequest(string path, TArgs args, Dictionary headers = null) { var response = new IntentResponse(new Response( - SuccessfulTransactionReturn.IdentifyingCode, - new SuccessfulTransactionReturn(txHash, "", null, null))); + SuccessfulTransactionReturn.IdentifyingCode, new SuccessfulTransactionReturn(txHash, "", null, null))); + string responseJson = JsonConvert.SerializeObject(response); - return JsonConvert.DeserializeObject(responseJson); + return JsonConvert.DeserializeObject(responseJson); } - public async Task GetTimeShift() + public Task SendGetRequest(string path, Dictionary headers = null) { - return TimeSpan.Zero; + throw new NotImplementedException(); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs index f21a02a6..4921419c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs @@ -4,6 +4,7 @@ using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Primitives.Common; +using Sequence.Relayer; using Sequence.Wallet; namespace Sequence.EcosystemWallet.Authentication @@ -51,7 +52,19 @@ public async Task SignMessage(Chain chain, string message) return response.Data; } - public async Task SendTransaction(Call[] calls) + public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) + { + var signedCalls = await SignCalls(calls); + throw new NotImplementedException(); + } + + public async Task GetFeeOption(Call[] calls) + { + var signedCalls = await SignCalls(calls); + throw new NotImplementedException(); + } + + private async Task<(Address To, byte[] Data)> SignCalls(Call[] calls) { throw new NotImplementedException(); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs index d7bab164..8f35a6f8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs @@ -1,5 +1,6 @@ using System; using System.Numerics; +using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; using UnityEngine.Scripting; @@ -23,6 +24,15 @@ public class Call public BehaviourOnError behaviorOnError; [Preserve] + public Call(Address to, BigInteger value, byte[] data) + { + this.to = to; + this.value = value; + this.data = data; + } + + [Preserve] + [JsonConstructor] public Call(Address to, BigInteger value, byte[] data, BigInteger gasLimit, bool delegateCall, bool onlyFallback, BehaviourOnError behaviorOnError) { this.to = to; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef index 78f2cb74..5781bad8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef @@ -4,7 +4,8 @@ "references": [ "GUID:a35e3a53d4439435f8b36ed2c6158cd8", "GUID:b4f9c0f8f363f439b9e337f79050f189", - "GUID:f7fd4ba36aabd1d499450c174865e70b" + "GUID:f7fd4ba36aabd1d499450c174865e70b", + "GUID:94b67778c44684afdab21990eebf60aa" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/EOAWalletLinker.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/EOAWalletLinker.cs index 62d56777..6482fed6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/EOAWalletLinker.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/EOAWalletLinker.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Sequence.Utils; using UnityEngine; using UnityEngine.Scripting; @@ -30,7 +31,7 @@ public async Task GetLinkedWallets() try { var client = new HttpClient(ApiUrl); - var response = await client.SendRequest( + var response = await client.SendPostRequest( "GetLinkedWallets", new LinkedWalletsRequestData { signatureChainId = _chain.GetChainId(), @@ -57,7 +58,7 @@ public async Task UnlinkWallet(string walletAddress) try { var client = new HttpClient(ApiUrl); - await client.SendRequest( + await client.SendPostRequest( "RemoveLinkedWallet", new LinkedWalletsRequestData { signatureChainId = _chain.GetChainId(), @@ -82,7 +83,7 @@ public async Task GenerateEoaWalletLink() { var client = new HttpClient(NonceGenerationLink); NonceResponseData nonceResponse = - await client.SendRequest("", + await client.SendPostRequest("", new NonceRequestData(_wallet.GetWalletAddress()), new Dictionary() { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/HttpClient.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/HttpClient.cs.meta deleted file mode 100644 index f35b968c..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/HttpClient.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 908f66a3a95e4949b0b87bd7ffc90763 -timeCreated: 1692105075 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IHttpClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IHttpClient.cs deleted file mode 100644 index 06782aa6..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IHttpClient.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using JetBrains.Annotations; - -namespace Sequence.EmbeddedWallet -{ - public interface IHttpClient - { - public Task SendRequest(string path, T args, - [CanBeNull] Dictionary headers = null, string overrideUrl = null); - - public Task GetTimeShift(); - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IHttpClient.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IHttpClient.cs.meta deleted file mode 100644 index 2a59f919..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IHttpClient.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 5a99f35beac44ac4b4face13dc0dc7a7 -timeCreated: 1710459961 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IntentSender.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IntentSender.cs index d67fa03d..00ffe42c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IntentSender.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/IntentSender.cs @@ -4,9 +4,11 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Sequence.ABI; +using Sequence.Config; using Sequence.Utils; using Sequence.WaaS.DataTypes; using UnityEngine; +using UnityEngine.Networking; namespace Sequence.EmbeddedWallet { @@ -38,10 +40,34 @@ public IntentSender(IHttpClient httpClient, Sequence.Wallet.IWallet sessionWalle GetTimeShift().ConfigureAwait(false); } - private async Task GetTimeShift() + public async Task GetTimeShift() { - _timeshift = await _httpClient.GetTimeShift(); - _ready = true; + var config = SequenceConfig.GetConfig(SequenceService.WaaS); + var configJwt = SequenceConfig.GetConfigJwt(config); + var rpcUrl = configJwt.rpcServer; + + if (string.IsNullOrWhiteSpace(rpcUrl)) + throw SequenceConfig.MissingConfigError("RPC Server"); + + UnityWebRequest request = UnityWebRequest.Get(rpcUrl.AppendTrailingSlashIfNeeded() + "status"); + request.method = UnityWebRequest.kHttpVerbGET; + + try + { + await request.SendWebRequest(); + DateTime serverTime = DateTime.Parse(request.GetResponseHeader("date")).ToUniversalTime(); + DateTime localTime = DateTime.UtcNow; + _timeshift = serverTime - localTime; + } + catch (Exception e) + { + Debug.LogError("Error getting time shift: " + e.Message); + _timeshift = TimeSpan.Zero; + } + finally + { + request.Dispose(); + } } public async Task SendIntent(T2 args, IntentType type, uint timeBeforeExpiryInSeconds = 30, uint currentTime = 0) @@ -103,7 +129,7 @@ public async Task SendIntent(T2 args, IntentType type, uint timeBefore private async Task> SendTransactionIntent(string intent, Dictionary headers) { - IntentResponse result = await _httpClient.SendRequest>("SendIntent", intent, headers); + IntentResponse result = await _httpClient.SendPostRequest>("SendIntent", intent, headers); if (result.response.code == SuccessfulTransactionReturn.IdentifyingCode) { SuccessfulTransactionReturn successfulTransactionReturn = JsonConvert.DeserializeObject(result.response.data.ToString()); @@ -169,7 +195,7 @@ public async Task PostIntent(string payload, string path) var transactionReturn = await SendTransactionIntent(payload, headers); return (T)(object)transactionReturn; } - T result = await _httpClient.SendRequest(path, payload, headers); + T result = await _httpClient.SendPostRequest(path, payload, headers); return result; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceWallet.cs index 401bbb2b..60444770 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceWallet.cs @@ -88,7 +88,7 @@ public Task IsValidMessageSignature(Chain network throw SequenceConfig.MissingConfigError("Builder API Key"); } - return _httpClient.SendRequest( + return _httpClient.SendPostRequest( "API/IsValidMessageSignature", new IsValidMessageSignatureArgs(network, _address, message, signature), new Dictionary() {{"X-Access-Key", _builderApiKey}}); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes.meta new file mode 100644 index 00000000..f0eef46f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e696c75ad3ff463bab4fe2dcfa615bc7 +timeCreated: 1753339785 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs new file mode 100644 index 00000000..d9ea3017 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs @@ -0,0 +1,10 @@ +namespace Sequence.Relayer +{ + public class FeeOption + { + public Address token; + public string to; + public string value; + public int gasLimit; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs.meta new file mode 100644 index 00000000..0f07491c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5afd8764cec14d36b1bf19ed848c7400 +timeCreated: 1753338972 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs new file mode 100644 index 00000000..a79197ca --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs @@ -0,0 +1,18 @@ +namespace Sequence.Relayer +{ + public class FeeOptionsArgs + { + public Address wallet; + public string to; + public byte[] data; + public bool simulate; + + public FeeOptionsArgs(Address wallet, string to, byte[] data, bool simulate = false) + { + this.wallet = wallet; + this.to = to; + this.data = data; + this.simulate = simulate; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs.meta new file mode 100644 index 00000000..662bbea9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4d0f526f2c3f4ad89acab5e80c0d2e7b +timeCreated: 1753339802 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsReturn.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsReturn.cs new file mode 100644 index 00000000..927707e5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsReturn.cs @@ -0,0 +1,9 @@ +namespace Sequence.Relayer +{ + public class FeeOptionsReturn + { + public FeeOption[] options; + public bool sponsored; + public string quote; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsReturn.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsReturn.cs.meta new file mode 100644 index 00000000..18b4e69c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsReturn.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3d77e005c790458984bd97b37c7b6ac4 +timeCreated: 1753339868 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs new file mode 100644 index 00000000..ce3770e5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Sequence.Relayer +{ + public interface IRelayer + { + Task GetFeeOptions(FeeOptionsArgs args); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs.meta new file mode 100644 index 00000000..75bcf9d4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ce16dd5473c04effb786461d8bd975a4 +timeCreated: 1753339465 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/Relayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/Relayer.cs new file mode 100644 index 00000000..0562da2a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/Relayer.cs @@ -0,0 +1,28 @@ +using System; +using System.Threading.Tasks; +using Sequence.Utils; + +namespace Sequence.Relayer +{ + public class Relayer : IRelayer + { + private readonly IHttpClient _httpClient; + + public Relayer(Chain chain) + { + var name = chain switch + { + Chain.ArbitrumOne => "v3-arbitrum", + _ => throw new NotSupportedException($"Chain {chain} not supported.") + }; + + var relayerUrl = $"https://{name}-relayer.sequence.app/rpc/Relayer"; + _httpClient = new HttpClient(relayerUrl); + } + + public async Task GetFeeOptions(FeeOptionsArgs args) + { + return await _httpClient.SendPostRequest("FeeOptions", args); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/Relayer.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/Relayer.cs.meta new file mode 100644 index 00000000..bf33d2be --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/Relayer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a2e889b23c8f4c54bf3fb5ab7b6a34eb +timeCreated: 1753339457 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking.meta new file mode 100644 index 00000000..a0c27c1f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1c64f5c5b0784993b33e458583df5295 +timeCreated: 1753344775 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/HttpClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs similarity index 61% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/HttpClient.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs index cf2c65aa..be68917c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/HttpClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs @@ -3,142 +3,39 @@ using System.Globalization; using System.IO; using System.Net.Http; -using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using JetBrains.Annotations; using Newtonsoft.Json; -using Sequence.ABI; -using Sequence.Authentication; -using Sequence.Config; -using Sequence.Provider; -using Sequence.Utils; -using Sequence.WaaS.DataTypes; -using UnityEngine; using UnityEngine.Networking; -namespace Sequence.EmbeddedWallet +namespace Sequence.Utils { public class HttpClient : IHttpClient { - private readonly string _url; - private Dictionary _defaultHeaders; - private JsonSerializerSettings serializerSettings = new JsonSerializerSettings + private readonly string _baseUrl; + private readonly Dictionary _defaultHeaders; + private readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; - - private ResponseSignatureValidator _signatureValidator; - private string _waasUrl; - - public HttpClient(string url) + + public HttpClient(string baseUrl) { - _signatureValidator = new ResponseSignatureValidator(); - _url = url; - this._defaultHeaders = new Dictionary(); + _baseUrl = baseUrl; + _defaultHeaders = new Dictionary(); _defaultHeaders["Content-Type"] = "application/json"; _defaultHeaders["Accept"] = "application/json"; - SequenceConfig config = SequenceConfig.GetConfig(SequenceService.WaaS); - _defaultHeaders["X-Access-Key"] = config.BuilderAPIKey; _defaultHeaders["Accept-Signature"] = "sig=()"; - if (string.IsNullOrWhiteSpace(config.BuilderAPIKey)) - { - throw SequenceConfig.MissingConfigError("Builder API Key"); - } - - ConfigJwt configJwt = SequenceConfig.GetConfigJwt(config); - string rpcUrl = configJwt.rpcServer; - if (string.IsNullOrWhiteSpace(rpcUrl)) - { - throw SequenceConfig.MissingConfigError("RPC Server"); - } - _waasUrl = rpcUrl; - } - - public void AddDefaultHeader(string key, string value) - { - this._defaultHeaders[key] = value; - } - - public (UnityWebRequest, string, string) BuildRequest(string path, T args, - [CanBeNull] Dictionary headers = null, string overrideUrl = null) - { - string url = _url.AppendTrailingSlashIfNeeded() + path; - url = url.RemoveTrailingSlash(); - if (overrideUrl != null) - { - url = overrideUrl.AppendTrailingSlashIfNeeded() + path; - } - - UnityWebRequest request = UnityWebRequest.Get(url); - request.method = UnityWebRequest.kHttpVerbPOST; - SetHeaders(request, headers); - - string requestJson = SetRequestData(request, args); - - string method = request.method; - string headersString = ExtractHeaders(request); - string curlRequest = $"curl -X {method} '{url}' {headersString} -d '{requestJson}'"; - if (requestJson == "") - { - curlRequest = $"curl -X {method} '{url}' {headersString}"; - } - - return (request, curlRequest, url); } - - private void SetHeaders(UnityWebRequest request, Dictionary headers) + + public async Task SendPostRequest(string path, TArgs args, Dictionary headers = null) { - if (headers == null) - { - headers = _defaultHeaders; - } - else - { - foreach (string key in _defaultHeaders.Keys) - { - if (!headers.ContainsKey(key)) - { - headers[key] = _defaultHeaders[key]; - } - } - } + var newRequest = BuildRequest(path, UnityWebRequest.kHttpVerbPOST, args, headers); + var request = newRequest.Item1; + var curlRequest = newRequest.Item2; + var url = newRequest.Item3; - foreach (string key in headers.Keys) - { - if (headers[key] == null) - { - continue; - } - request.SetRequestHeader(key, headers[key]); - } - } - - private string SetRequestData(UnityWebRequest request, T args) - { - string requestJson = ""; - if (typeof(T) == typeof(string)) - { - requestJson = args as string; - } - else - { - requestJson = JsonConvert.SerializeObject(args, serializerSettings); - } - byte[] requestData = Encoding.UTF8.GetBytes(requestJson); - request.uploadHandler = new UploadHandlerRaw(requestData); - request.uploadHandler.contentType = "application/json"; - return requestJson; - } - - public async Task SendRequest(string path, T args, [CanBeNull] Dictionary headers = null, string overrideUrl = null) - { - (UnityWebRequest, string, string) newRequest = BuildRequest(path, args, headers, overrideUrl); - UnityWebRequest request = newRequest.Item1; - string curlRequest = newRequest.Item2; - string url = newRequest.Item3; - Debug.Log(curlRequest); - try { await request.SendWebRequest(); @@ -148,41 +45,12 @@ public async Task SendRequest(string path, T args, [CanBeNull] Dictio { throw new Exception($"Error sending request to {url}: {request.responseCode} {request.error}"); } - else - { - while (!_signatureValidator.PublicKeyFetched) - { - await Task.Yield(); - } - string responseJson = ""; - if (url.Contains(_waasUrl)) - { - try - { - responseJson = _signatureValidator.ValidateResponse(request); - } - catch (Exception e) - { - throw new Exception("Error validating response: " + e.Message + " Warning: this response may have been tampered with!"); - } - } - else - { - byte[] results = request.downloadHandler.data; - responseJson = Encoding.UTF8.GetString(results); - } - try - { - T2 result = JsonConvert.DeserializeObject(responseJson); - return result; - } - catch (Exception e) - { - throw new Exception( - $"Error unmarshalling response from {url}: {e.Message} | given: {responseJson}"); - } - } + var results = request.downloadHandler.data; + var responseJson = Encoding.UTF8.GetString(results); + var response = JsonConvert.DeserializeObject(responseJson, _serializerSettings); + + return response; } catch (HttpRequestException e) { @@ -212,7 +80,7 @@ public async Task SendRequest(string path, T args, [CanBeNull] Dictio CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out DateTime dateTime)) { long currentTimeAccordingToServer = ((DateTimeOffset)dateTime).ToUnixTimeSeconds(); - throw new TimeMismatchException(exceptionMessage, currentTimeAccordingToServer); + throw new Exception($"{exceptionMessage}, {currentTimeAccordingToServer}"); } else { @@ -238,24 +106,33 @@ public async Task SendRequest(string path, T args, [CanBeNull] Dictio request.Dispose(); } } - - public async Task GetTimeShift() + + public async Task SendGetRequest(string path, Dictionary headers = null) { - UnityWebRequest request = UnityWebRequest.Get(_waasUrl.AppendTrailingSlashIfNeeded() + "status"); + var url = _baseUrl.AppendTrailingSlashIfNeeded() + path; + var request = UnityWebRequest.Get(url); request.method = UnityWebRequest.kHttpVerbGET; + SetHeaders(request, headers); try { await request.SendWebRequest(); - DateTime serverTime = DateTime.Parse(request.GetResponseHeader("date")).ToUniversalTime(); - DateTime localTime = DateTime.UtcNow; - TimeSpan timeShift = serverTime - localTime; - return timeShift; + + if (request.error != null || request.result != UnityWebRequest.Result.Success || + request.responseCode < 200 || request.responseCode > 299) + { + throw new Exception($"Error sending request to {url}: {request.responseCode} {request.error}"); + } + + var results = request.downloadHandler.data; + var responseJson = Encoding.UTF8.GetString(results); + var response = JsonConvert.DeserializeObject(responseJson, _serializerSettings); + + return response; } catch (Exception e) { - Debug.LogError("Error getting time shift: " + e.Message); - return TimeSpan.Zero; + throw new Exception(e.Message); } finally { @@ -263,26 +140,93 @@ public async Task GetTimeShift() } } - private string GetRequestErrorIfAvailable(UnityWebRequest request) + public (UnityWebRequest, string, string) BuildRequest(string path, string method, T args, + [CanBeNull] Dictionary headers = null, string overrideUrl = null) { - if (request.downloadHandler != null && request.downloadHandler.data != null) + string url = _baseUrl.AppendTrailingSlashIfNeeded() + path; + url = url.RemoveTrailingSlash(); + if (overrideUrl != null) { - return " " + Encoding.UTF8.GetString(request.downloadHandler.data); + url = overrideUrl.AppendTrailingSlashIfNeeded() + path; } - return ""; + UnityWebRequest request = UnityWebRequest.Get(url); + request.method = method; + SetHeaders(request, headers); + + string requestJson = SetRequestData(request, args); + + string headersString = ExtractHeaders(request); + string curlRequest = $"curl -X {method} '{url}' {headersString} -d '{requestJson}'"; + if (requestJson == "") + { + curlRequest = $"curl -X {method} '{url}' {headersString}"; + } + + return (request, curlRequest, url); + } + + private void SetHeaders(UnityWebRequest request, Dictionary headers) + { + if (headers == null) + { + headers = _defaultHeaders; + } + else + { + foreach (string key in _defaultHeaders.Keys) + { + if (!headers.ContainsKey(key)) + { + headers[key] = _defaultHeaders[key]; + } + } + } + + foreach (string key in headers.Keys) + { + if (headers[key] == null) + { + continue; + } + request.SetRequestHeader(key, headers[key]); + } } + private string SetRequestData(UnityWebRequest request, T args) + { + string requestJson = ""; + if (typeof(T) == typeof(string)) + { + requestJson = args as string; + } + else + { + requestJson = JsonConvert.SerializeObject(args, _serializerSettings); + } + byte[] requestData = Encoding.UTF8.GetBytes(requestJson); + request.uploadHandler = new UploadHandlerRaw(requestData); + request.uploadHandler.contentType = "application/json"; + return requestJson; + } + + private string GetRequestErrorIfAvailable(UnityWebRequest request) + { + if (request.downloadHandler != null && request.downloadHandler.data != null) + return " " + Encoding.UTF8.GetString(request.downloadHandler.data); + + return string.Empty; + } + private string ExtractHeaders(UnityWebRequest request) { - StringBuilder headerBuilder = new StringBuilder(); - foreach (string headerKey in new string[]{"Content-Type", "Accept", "Authorization", "X-Sequence-Tenant", "X-Access-Key"}) + var headerBuilder = new StringBuilder(); + foreach (string headerKey in new []{"Content-Type", "Accept", "Authorization", "X-Sequence-Tenant", "X-Access-Key"}) { - string headerValue = request.GetRequestHeader(headerKey); + var headerValue = request.GetRequestHeader(headerKey); if (string.IsNullOrEmpty(headerValue)) - { continue; - } + headerBuilder.Append($"-H '{headerKey}: {headerValue}' "); } return headerBuilder.ToString(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs.meta new file mode 100644 index 00000000..b647a889 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 80cc6106f782498a9692a6edefdff091 +timeCreated: 1753343437 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/IHttpClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/IHttpClient.cs new file mode 100644 index 00000000..0fa90d8c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/IHttpClient.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Sequence.Utils +{ + public interface IHttpClient + { + Task SendPostRequest(string path, TArgs args, Dictionary headers = null); + Task SendGetRequest(string path, Dictionary headers = null); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/IHttpClient.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/IHttpClient.cs.meta new file mode 100644 index 00000000..594d64d4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/IHttpClient.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2ff2e97fd1b54cb99bd20d1f5257d5df +timeCreated: 1753344784 \ No newline at end of file From fb7e5c88da63bfe367ed40281b75c90b396ce6d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 25 Jul 2025 08:54:13 +0200 Subject: [PATCH 114/165] added structure for sequence session wallets --- .../SequenceEcosystemWalletWindow.cs | 26 ++++----- .../EcosystemWallet/Authentication/IWallet.cs | 14 +++++ .../Authentication/IWallet.cs.meta | 3 ++ .../Authentication/RedirectOrigin.cs | 2 +- .../Authentication/Requests/Connect.cs | 2 +- .../Authentication/Requests/SignMessage.cs | 2 +- ...ystemWalletLogin.cs => SequenceConnect.cs} | 53 ++++++++++++------- ...tLogin.cs.meta => SequenceConnect.cs.meta} | 0 ...stemWallet.cs => SequenceSessionWallet.cs} | 40 +++++++------- .../SequenceSessionWallet.cs.meta | 3 ++ .../Authentication/SequenceWallet.cs | 50 +++++++++++++++++ ...mWallet.cs.meta => SequenceWallet.cs.meta} | 0 .../Authentication/SessionBuilder.cs | 2 +- .../Authentication/SessionTemplates.cs | 2 +- .../Storage/SessionCredentials.cs | 7 ++- .../Authentication/Storage/SessionStorage.cs | 2 +- .../Permission/SessionPermissions.cs | 1 - .../Relayer/DataTypes/IntentPrecondition.cs | 9 ++++ .../DataTypes/IntentPrecondition.cs.meta | 3 ++ .../SequenceSDK/Relayer/DataTypes/MetaTxn.cs | 16 ++++++ .../Relayer/DataTypes/MetaTxn.cs.meta | 3 ++ .../Relayer/DataTypes/OperationStatus.cs | 8 +++ .../Relayer/DataTypes/OperationStatus.cs.meta | 3 ++ .../Relayer/DataTypes/SendMetaTxnArgs.cs | 18 +++++++ .../Relayer/DataTypes/SendMetaTxnArgs.cs.meta | 3 ++ .../Relayer/DataTypes/SendMetaTxnReturn.cs | 8 +++ .../DataTypes/SendMetaTxnReturn.cs.meta | 3 ++ .../Sequence/SequenceSDK/Relayer/IRelayer.cs | 4 ++ .../Sequence/SequenceSDK/Relayer/Relayer.cs | 28 ---------- .../SequenceSDK/Relayer/SequenceRelayer.cs | 45 ++++++++++++++++ ...elayer.cs.meta => SequenceRelayer.cs.meta} | 0 31 files changed, 270 insertions(+), 90 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs.meta rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/{SequenceEcosystemWalletLogin.cs => SequenceConnect.cs} (64%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/{SequenceEcosystemWalletLogin.cs.meta => SequenceConnect.cs.meta} (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/{SequenceEcosystemWallet.cs => SequenceSessionWallet.cs} (65%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/{SequenceEcosystemWallet.cs.meta => SequenceWallet.cs.meta} (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxn.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxn.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/OperationStatus.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/OperationStatus.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnArgs.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnArgs.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnReturn.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnReturn.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/Relayer.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs rename Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/{Relayer.cs.meta => SequenceRelayer.cs.meta} (100%) diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs index 1c986649..47d6ce7a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using Sequence.EcosystemWallet; using Sequence.EcosystemWallet.Authentication; using Sequence.EcosystemWallet.Primitives; using TMPro; @@ -37,8 +38,8 @@ private enum ExplicitSessionType [SerializeField] private GameObject _loadingOverlay; [SerializeField] private MessagePopup _messagePopup; - private SequenceEcosystemWalletLogin _login; - private SequenceEcosystemWallet[] _wallets; + private SequenceConnect _login; + private SequenceWallet _wallet; private ImplicitSessionType _implicitPermissions; private ExplicitSessionType _explicitPermissions; private int _selectedWallet; @@ -58,8 +59,9 @@ private void Start() EnableWalletState(false); EnableEmailButton(true); ShowSignature(string.Empty); - - RecoverWalletFromStorage(); + + if (_login.GetAllSessionWallets().Length > 0) + ShowWallet(true); } public async void SignInWithEmail() @@ -144,7 +146,7 @@ public async void SignMessage() try { - var signature = await _wallets[_selectedWallet].SignMessage(Chain.TestnetArbitrumSepolia, message); + var signature = await _wallet.SignMessage(Chain.TestnetArbitrumSepolia, message); ShowSignature(signature.signature); SetLoading(false); } @@ -156,7 +158,7 @@ public async void SignMessage() public void CopyWalletAddress() { - CopyText(_wallets[_selectedWallet].Address.Value); + CopyText(_wallet.Address.Value); } public void CopySignature() @@ -219,12 +221,6 @@ private void ShowError(string error) SetLoading(false); } - private void RecoverWalletFromStorage() - { - _login.RecoverSessionsFromStorage(); - ShowWallet(true); - } - private void ShowSignature(string signature) { _curSignature = signature; @@ -234,10 +230,10 @@ private void ShowSignature(string signature) private void ShowWallet(bool recovered) { - _wallets = _login.GetAllSessions(); - _walletText.text = _wallets[_selectedWallet].Address.Value; + _wallet = _login.GetWallet(); + _walletText.text = _wallet.Address.Value; - var addresses = _wallets.Select(w => w.SessionAddress.Value).ToList(); + var addresses = _wallet.SessionWallets.Select(w => w.Address.Value).ToList(); _walletDropdown.ClearOptions(); _walletDropdown.AddOptions(addresses); _walletDropdown.value = 0; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs new file mode 100644 index 00000000..2218bb50 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs @@ -0,0 +1,14 @@ +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Relayer; + +namespace Sequence.EcosystemWallet +{ + public interface IWallet + { + Address Address { get; } + Task SignMessage(Chain chain, string message); + Task GetFeeOption(Call[] calls); + Task SendTransaction(Call[] calls, FeeOption feeOption = null); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs.meta new file mode 100644 index 00000000..6975ca7d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2cdf3326863d437da3013b3abc4d42c3 +timeCreated: 1753425315 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs index c5483f40..40ab0e28 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs @@ -4,7 +4,7 @@ using Sequence.Utils; using UnityEngine; -namespace Sequence.EcosystemWallet.Authentication +namespace Sequence.EcosystemWallet { public static class RedirectOrigin { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs index 1312aff6..90a70350 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs @@ -1,6 +1,6 @@ using Sequence.EcosystemWallet.Primitives; -namespace Sequence.EcosystemWallet.Authentication +namespace Sequence.EcosystemWallet { public struct ConnectArgs { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs index 80f056c3..c7817d2b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs @@ -1,6 +1,6 @@ using Sequence.EcosystemWallet.Primitives.Common; -namespace Sequence.EcosystemWallet.Authentication.Requests +namespace Sequence.EcosystemWallet { public struct SignMessageArgs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs similarity index 64% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index e00d7ab9..7944aea3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -9,73 +9,89 @@ namespace Sequence.EcosystemWallet.Authentication { - public class SequenceEcosystemWalletLogin + public class SequenceConnect { - internal const string WalletUrl = "https://v3.sequence-dev.app"; + internal const string WalletUrl = "https://v3.sequence-dev.app"; + + public static Action SessionsChanged; private Chain _chain; private EOAWallet _sessionWallet; private SessionStorage _sessionStorage; - private List _credentials = new(); + private List _credentials; + private SequenceWallet _wallet; - public SequenceEcosystemWalletLogin(Chain chain) + public SequenceConnect(Chain chain) { _chain = chain; _sessionStorage = new SessionStorage(); _credentials = _sessionStorage.GetSessions().ToList(); } - public async Task AddSession(SessionPermissions permissions) + public async Task AddSession(SessionPermissions permissions) { Assert.IsNotNull(permissions); return await CreateNewSession(true, permissions, string.Empty); } - public async Task SignInWithEmail(string email, SessionPermissions permissions) + public async Task SignInWithEmail(string email, SessionPermissions permissions) { return await CreateNewSession(false, permissions,"email", email); } - public async Task SignInWithGoogle(SessionPermissions permissions) + public async Task SignInWithGoogle(SessionPermissions permissions) { return await CreateNewSession(false, permissions,"google"); } - public async Task SignInWithApple(SessionPermissions permissions) + public async Task SignInWithApple(SessionPermissions permissions) { return await CreateNewSession(false, permissions,"apple"); } - public async Task SignInWithPasskey(SessionPermissions permissions) + public async Task SignInWithPasskey(SessionPermissions permissions) { return await CreateNewSession(false, permissions,"passkey"); } - public async Task SignInWithMnemonic(SessionPermissions permissions) + public async Task SignInWithMnemonic(SessionPermissions permissions) { return await CreateNewSession(false, permissions,"mnemonic"); } - public SequenceEcosystemWallet[] RecoverSessionsFromStorage() + public SequenceWallet GetWallet() { - return GetAllSessions(); + _wallet ??= new SequenceWallet(GetAllSessionWallets()); + return _wallet; } - public SequenceEcosystemWallet[] GetAllSessions() + public SequenceSessionWallet[] GetAllSessionWallets() { if (_credentials.Count == 0) throw new Exception("No session found in storage."); - var wallets = new SequenceEcosystemWallet[_credentials.Count]; + var sessionWallets = new SequenceSessionWallet[_credentials.Count]; for (var i = 0; i < _credentials.Count; i++) - wallets[i] = new SequenceEcosystemWallet(_credentials[i]); + sessionWallets[i] = new SequenceSessionWallet(_credentials[i]); - return wallets; + return sessionWallets; } public void SignOut() { _sessionStorage.Clear(); + _credentials.Clear(); + } + + public void RemoveSession(Address sessionAddress) + { + var index = _credentials.FindIndex(c => c.sessionAddress.Equals(sessionAddress)); + if (index == -1) + throw new Exception(""); + + _credentials.RemoveAt(index); + _sessionStorage.StoreSessions(_credentials.ToArray()); + SessionsChanged?.Invoke(GetAllSessionWallets()); } /// @@ -85,7 +101,7 @@ public void SignOut() /// Leave it null to create an implicit session. Otherwise, we create an explicit session. /// /// - private async Task CreateNewSession(bool isExplicit, SessionPermissions permissions, string preferredLoginMethod, string email = null) + private async Task CreateNewSession(bool isExplicit, SessionPermissions permissions, string preferredLoginMethod, string email = null) { _sessionWallet = new EOAWallet(); @@ -122,7 +138,8 @@ private async Task CreateNewSession(bool isExplicit, Se _sessionStorage.AddSession(credentials); _credentials.Add(credentials); - return new SequenceEcosystemWallet(credentials); + SessionsChanged?.Invoke(GetAllSessionWallets()); + return new SequenceSessionWallet(credentials); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWalletLogin.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs similarity index 65% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs index 4921419c..d80f84ac 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs @@ -1,36 +1,31 @@ using System; using System.Threading.Tasks; -using Sequence.EcosystemWallet.Authentication.Requests; +using Sequence.EcosystemWallet.Authentication; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Relayer; using Sequence.Wallet; -namespace Sequence.EcosystemWallet.Authentication +namespace Sequence.EcosystemWallet { - public class SequenceEcosystemWallet + public class SequenceSessionWallet : IWallet { - public static Action OnWalletCreated; - public Address Address { get; } - public Address SessionAddress { get; } public Chain Chain { get; } public bool IsExplicit { get; } private readonly SessionCredentials _credentials; - internal SequenceEcosystemWallet(SessionCredentials credentials) + internal SequenceSessionWallet(SessionCredentials credentials) { _credentials = credentials; - Address = credentials.address; - SessionAddress = new EOAWallet(credentials.privateKey).GetAddress(); + Address = new EOAWallet(credentials.privateKey).GetAddress(); Chain = ChainDictionaries.ChainById[credentials.chainId]; IsExplicit = credentials.isExplicit; - OnWalletCreated?.Invoke(this); } - + public async Task SignMessage(Chain chain, string message) { var args = new SignMessageArgs @@ -39,7 +34,8 @@ public async Task SignMessage(Chain chain, string message) chainId = new BigInt((int)chain), message = message }; - var url = $"{SequenceEcosystemWalletLogin.WalletUrl}/request/sign"; + + var url = $"{SequenceConnect.WalletUrl}/request/sign"; var handler = RedirectFactory.CreateHandler(); handler.SetRedirectUrl(RedirectOrigin.GetOriginString()); @@ -51,22 +47,26 @@ public async Task SignMessage(Chain chain, string message) return response.Data; } - - public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) - { - var signedCalls = await SignCalls(calls); - throw new NotImplementedException(); - } public async Task GetFeeOption(Call[] calls) { var signedCalls = await SignCalls(calls); - throw new NotImplementedException(); + var relayer = new SequenceRelayer(Chain.TestnetArbitrumSepolia); + + var args = new FeeOptionsArgs(Address, signedCalls.To, signedCalls.Data); + var response = await relayer.GetFeeOptions(args); + + return response.options; } + public Task SendTransaction(Call[] calls, FeeOption feeOption = null) + { + throw new System.NotImplementedException(); + } + private async Task<(Address To, byte[] Data)> SignCalls(Call[] calls) { - throw new NotImplementedException(); + throw new System.NotImplementedException(); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs.meta new file mode 100644 index 00000000..ffb61a28 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 327ef63ee174429b80fba1c3d063cc94 +timeCreated: 1753424808 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs new file mode 100644 index 00000000..408ac3ba --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -0,0 +1,50 @@ +using System; +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Authentication; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Relayer; + +namespace Sequence.EcosystemWallet +{ + public class SequenceWallet : IWallet, IDisposable + { + public static Action OnWalletCreated; + + public Address Address { get; } + public SequenceSessionWallet[] SessionWallets { get; private set; } + + internal SequenceWallet(SequenceSessionWallet[] sessionWallets) + { + SessionWallets = sessionWallets; + Address = sessionWallets[0].Address; + OnWalletCreated?.Invoke(this); + + SequenceConnect.SessionsChanged += SessionsChanged; + } + + public void Dispose() + { + SequenceConnect.SessionsChanged -= SessionsChanged; + } + + private void SessionsChanged(SequenceSessionWallet[] sessionWallets) + { + SessionWallets = sessionWallets; + } + + public async Task SignMessage(Chain chain, string message) + { + return await SessionWallets[0].SignMessage(chain, message); + } + + public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) + { + return await SessionWallets[0].SendTransaction(calls, feeOption); + } + + public async Task GetFeeOption(Call[] calls) + { + return await SessionWallets[0].GetFeeOption(calls); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceEcosystemWallet.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs index a64ab3fe..c3f0dd41 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs @@ -3,7 +3,7 @@ using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; -namespace Sequence.EcosystemWallet.Authentication +namespace Sequence.EcosystemWallet { public class SessionBuilder { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs index 61c195fd..82057963 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs @@ -3,7 +3,7 @@ using Nethereum.Util; using Sequence.EcosystemWallet.Primitives; -namespace Sequence.EcosystemWallet.Authentication +namespace Sequence.EcosystemWallet { public class SessionTemplates { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs index dbe8a285..3ee64d71 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs @@ -2,10 +2,10 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Sequence.EcosystemWallet.Primitives; -using Sequence.EcosystemWallet.Primitives.Common; +using Sequence.Wallet; using UnityEngine.Scripting; -namespace Sequence.EcosystemWallet.Authentication +namespace Sequence.EcosystemWallet { [Preserve] [JsonConverter(typeof(SessionCredentialsConverter))] @@ -14,6 +14,7 @@ internal class SessionCredentials public bool isExplicit; public string privateKey; public Address address; + public Address sessionAddress; public Attestation attestation; public RSY signature; public string chainId; @@ -31,6 +32,8 @@ public SessionCredentials(bool isExplicit, string privateKey, Address address, A this.chainId = chainId; this.loginMethod = loginMethod; this.email = email; + + sessionAddress = new EOAWallet(privateKey).GetAddress(); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs index 8784c25c..e55c50e6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs @@ -5,7 +5,7 @@ using Sequence.Utils.SecureStorage; using UnityEngine; -namespace Sequence.EcosystemWallet.Authentication +namespace Sequence.EcosystemWallet { internal class SessionStorage { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs index ffb51086..53d268ba 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs @@ -4,7 +4,6 @@ using System.Numerics; using Newtonsoft.Json; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs new file mode 100644 index 00000000..1c30800b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs @@ -0,0 +1,9 @@ +namespace Sequence.Relayer +{ + public class IntentPrecondition + { + public string type; + public string chainId; + public string data; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs.meta new file mode 100644 index 00000000..b64f6068 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 94d4044e17f0488b8ebeab19ed26f456 +timeCreated: 1753346023 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxn.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxn.cs new file mode 100644 index 00000000..ca7d423d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxn.cs @@ -0,0 +1,16 @@ +namespace Sequence.Relayer +{ + public class MetaTxn + { + public Address walletAddress; + public string contract; + public string input; + + public MetaTxn(Address walletAddress, string contract, string input) + { + this.walletAddress = walletAddress; + this.contract = contract; + this.input = input; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxn.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxn.cs.meta new file mode 100644 index 00000000..835a49cf --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxn.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 96d2bfb038044bef8f3bf584d7491e45 +timeCreated: 1753345954 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/OperationStatus.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/OperationStatus.cs new file mode 100644 index 00000000..a10fd6f3 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/OperationStatus.cs @@ -0,0 +1,8 @@ +namespace Sequence.Relayer +{ + public class OperationStatus + { + public string status; + public string reason; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/OperationStatus.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/OperationStatus.cs.meta new file mode 100644 index 00000000..28b39e3a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/OperationStatus.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e49d8a0c3e3e44febd55d603dad92db4 +timeCreated: 1753346950 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnArgs.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnArgs.cs new file mode 100644 index 00000000..68823b8f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnArgs.cs @@ -0,0 +1,18 @@ +namespace Sequence.Relayer +{ + public class SendMetaTxnArgs + { + public MetaTxn call; + public string quote; + public int projectID; + public IntentPrecondition[] preconditions; + + public SendMetaTxnArgs(MetaTxn call, string quote = null, int projectID = -1, IntentPrecondition[] preconditions = null) + { + this.call = call; + this.quote = quote; + this.projectID = projectID; + this.preconditions = preconditions; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnArgs.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnArgs.cs.meta new file mode 100644 index 00000000..faa7bca9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnArgs.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5e678689c12a4b508bbd5c088dd0be02 +timeCreated: 1753345817 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnReturn.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnReturn.cs new file mode 100644 index 00000000..781083ca --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnReturn.cs @@ -0,0 +1,8 @@ +namespace Sequence.Relayer +{ + public class SendMetaTxnReturn + { + public bool status; + public string txnHash; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnReturn.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnReturn.cs.meta new file mode 100644 index 00000000..da601b48 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnReturn.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9450544885994549a556f7817154a598 +timeCreated: 1753345825 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs index ce3770e5..9ab3663d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs @@ -1,9 +1,13 @@ +using System.Numerics; using System.Threading.Tasks; namespace Sequence.Relayer { public interface IRelayer { + Task Relay(Address to, string data, string quote = null, IntentPrecondition[] preconditions = null); + Task Status(string opHash, BigInteger chainId); Task GetFeeOptions(FeeOptionsArgs args); + Task SendMetaTxn(SendMetaTxnArgs args); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/Relayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/Relayer.cs deleted file mode 100644 index 0562da2a..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/Relayer.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Threading.Tasks; -using Sequence.Utils; - -namespace Sequence.Relayer -{ - public class Relayer : IRelayer - { - private readonly IHttpClient _httpClient; - - public Relayer(Chain chain) - { - var name = chain switch - { - Chain.ArbitrumOne => "v3-arbitrum", - _ => throw new NotSupportedException($"Chain {chain} not supported.") - }; - - var relayerUrl = $"https://{name}-relayer.sequence.app/rpc/Relayer"; - _httpClient = new HttpClient(relayerUrl); - } - - public async Task GetFeeOptions(FeeOptionsArgs args) - { - return await _httpClient.SendPostRequest("FeeOptions", args); - } - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs new file mode 100644 index 00000000..42c74c06 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs @@ -0,0 +1,45 @@ +using System; +using System.Numerics; +using System.Threading.Tasks; +using Sequence.Utils; + +namespace Sequence.Relayer +{ + public class SequenceRelayer : IRelayer + { + private readonly IHttpClient _httpClient; + + public SequenceRelayer(Chain chain) + { + var name = chain switch + { + Chain.ArbitrumOne => "v3-arbitrum", + _ => throw new NotSupportedException($"Chain {chain} not supported.") + }; + + var relayerUrl = $"https://{name}-relayer.sequence.app/rpc/Relayer"; + _httpClient = new HttpClient(relayerUrl); + } + + public async Task Relay(Address to, string data, string quote = null, IntentPrecondition[] preconditions = null) + { + var response = await SendMetaTxn(new SendMetaTxnArgs(new MetaTxn(to, to.Value, data), quote, -1, preconditions)); + return response.txnHash; + } + + public async Task Status(string opHash, BigInteger chainId) + { + return await _httpClient.SendPostRequest("FeeOptions", opHash); + } + + public async Task GetFeeOptions(FeeOptionsArgs args) + { + return await _httpClient.SendPostRequest("FeeOptions", args); + } + + public async Task SendMetaTxn(SendMetaTxnArgs args) + { + return await _httpClient.SendPostRequest("SendMetaTxn", args); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/Relayer.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/Relayer.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs.meta From d848792d8ba56c1417ac58c56d7e5e36b609f89f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 25 Jul 2025 09:10:23 +0200 Subject: [PATCH 115/165] added ecosytem type to connect constructor --- .../Scripts/Login/SequenceLoginWindow.cs | 1 - .../SequenceEcosystemWalletWindow.cs | 3 +-- .../Authentication/EcosystemBindings.cs | 17 +++++++++++++++++ .../Authentication/EcosystemBindings.cs.meta | 3 +++ .../Authentication/EcosystemType.cs | 7 +++++++ .../Authentication/EcosystemType.cs.meta | 3 +++ .../Authentication/SequenceConnect.cs | 12 +++++++----- .../Authentication/SequenceSessionWallet.cs | 6 +++--- .../Authentication/SequenceWallet.cs | 1 - .../Storage/SessionCredentials.cs | 16 +++++++++++----- .../RedirectHandler/RedirectHandler.cs | 1 - 11 files changed, 52 insertions(+), 18 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/Login/SequenceLoginWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/Login/SequenceLoginWindow.cs index 428c422b..040431a1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/Login/SequenceLoginWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/Login/SequenceLoginWindow.cs @@ -2,7 +2,6 @@ using System.Collections; using System.Collections.Generic; using Sequence.Authentication; -using Sequence.EcosystemWallet.Authentication; using Sequence.EmbeddedWallet; using TMPro; using UnityEngine; diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs index 47d6ce7a..df860e2b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs @@ -1,7 +1,6 @@ using System; using System.Linq; using Sequence.EcosystemWallet; -using Sequence.EcosystemWallet.Authentication; using Sequence.EcosystemWallet.Primitives; using TMPro; using UnityEngine; @@ -48,7 +47,7 @@ private enum ExplicitSessionType private void Start() { - _login = new(Chain.TestnetArbitrumSepolia); + _login = new(Chain.TestnetArbitrumSepolia, EcosystemType.Sequence); _emailInput.onValueChanged.AddListener(VerifyEmailInput); _messagePopup.gameObject.SetActive(false); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs new file mode 100644 index 00000000..a0f971b7 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +namespace Sequence.EcosystemWallet +{ + internal static class EcosystemBindings + { + private static Dictionary UrlBindings = new () + { + { EcosystemType.Sequence, "https://v3.sequence-dev.app" } + }; + + public static string GetUrl(EcosystemType ecosystem) + { + return UrlBindings[ecosystem]; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs.meta new file mode 100644 index 00000000..1dfdb795 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 29d630bf49cb45be8a2ea0f6f988902a +timeCreated: 1753427240 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs new file mode 100644 index 00000000..715a9f0b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs @@ -0,0 +1,7 @@ +namespace Sequence.EcosystemWallet +{ + public enum EcosystemType + { + Sequence = 0 + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs.meta new file mode 100644 index 00000000..f9c5706f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3135174bc3c7451eadd5356a1e0b206c +timeCreated: 1753427200 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index 7944aea3..e9b5fc60 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -7,23 +7,23 @@ using Sequence.Wallet; using UnityEngine.Assertions; -namespace Sequence.EcosystemWallet.Authentication +namespace Sequence.EcosystemWallet { public class SequenceConnect { - internal const string WalletUrl = "https://v3.sequence-dev.app"; - public static Action SessionsChanged; private Chain _chain; + private EcosystemType _ecosystem; private EOAWallet _sessionWallet; private SessionStorage _sessionStorage; private List _credentials; private SequenceWallet _wallet; - public SequenceConnect(Chain chain) + public SequenceConnect(Chain chain, EcosystemType ecosystem) { _chain = chain; + _ecosystem = ecosystem; _sessionStorage = new SessionStorage(); _credentials = _sessionStorage.GetSessions().ToList(); } @@ -116,7 +116,8 @@ private async Task CreateNewSession(bool isExplicit, Sess }; var action = isExplicit ? "addExplicitSession" : "addImplicitSession"; - var url = $"{WalletUrl}/request/connect"; + var ecosystemUrl = EcosystemBindings.GetUrl(_ecosystem); + var url = $"{ecosystemUrl}/request/connect"; var handler = RedirectFactory.CreateHandler(); handler.SetRedirectUrl(redirectUrl); @@ -131,6 +132,7 @@ private async Task CreateNewSession(bool isExplicit, Sess response.Data.walletAddress, response.Data.attestation, response.Data.signature, + (int)_ecosystem, ChainDictionaries.ChainIdOf[_chain], response.Data.loginMethod, response.Data.email); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs index d80f84ac..fddb0e19 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs @@ -1,6 +1,5 @@ using System; using System.Threading.Tasks; -using Sequence.EcosystemWallet.Authentication; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Primitives.Common; @@ -34,8 +33,9 @@ public async Task SignMessage(Chain chain, string message) chainId = new BigInt((int)chain), message = message }; - - var url = $"{SequenceConnect.WalletUrl}/request/sign"; + + var ecosystem = (EcosystemType)_credentials.ecosystemId; + var url = $"{EcosystemBindings.GetUrl(ecosystem)}/request/sign"; var handler = RedirectFactory.CreateHandler(); handler.SetRedirectUrl(RedirectOrigin.GetOriginString()); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index 408ac3ba..6da09913 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -1,6 +1,5 @@ using System; using System.Threading.Tasks; -using Sequence.EcosystemWallet.Authentication; using Sequence.EcosystemWallet.Primitives; using Sequence.Relayer; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs index 3ee64d71..23dd2363 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs @@ -17,18 +17,20 @@ internal class SessionCredentials public Address sessionAddress; public Attestation attestation; public RSY signature; + public int ecosystemId; public string chainId; public string loginMethod; public string email; public SessionCredentials(bool isExplicit, string privateKey, Address address, Attestation attestation, RSY signature, - string chainId, string loginMethod, string email) + int ecosystemId, string chainId, string loginMethod, string email) { this.isExplicit = isExplicit; this.privateKey = privateKey; this.address = address; this.attestation = attestation; this.signature = signature; + this.ecosystemId = ecosystemId; this.chainId = chainId; this.loginMethod = loginMethod; this.email = email; @@ -52,6 +54,9 @@ public override void WriteJson(JsonWriter writer, SessionCredentials value, Json writer.WritePropertyName("address"); serializer.Serialize(writer, value.address); + + writer.WritePropertyName("ecosystemId"); + writer.WriteValue(value.ecosystemId); writer.WritePropertyName("chainId"); writer.WriteValue(value.chainId.ToString()); @@ -93,11 +98,12 @@ public override SessionCredentials ReadJson(JsonReader reader, Type objectType, var attestation = obj["attestation"]?.ToObject(serializer); var signature = obj["signature"]?.ToObject(serializer); - string chainId = obj["chainId"]?.ToString(); - string loginMethod = obj["loginMethod"]?.ToString(); - string email = obj["email"]?.ToString(); + var ecosystemId = obj["ecosystemId"]?.ToObject() ?? -1; + var chainId = obj["chainId"]?.ToString(); + var loginMethod = obj["loginMethod"]?.ToString(); + var email = obj["email"]?.ToString(); - return new SessionCredentials(isExplicit, privateKey, address, attestation, signature, chainId, loginMethod, email); + return new SessionCredentials(isExplicit, privateKey, address, attestation, signature, ecosystemId, chainId, loginMethod, email); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs index 688d1cd3..692a747a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs @@ -2,7 +2,6 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; -using Sequence.EcosystemWallet.Authentication; namespace Sequence.EcosystemWallet.Browser { From 0fe39c991fc565afa329e91f155c3fefcdbbc08e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 25 Jul 2025 10:45:44 +0200 Subject: [PATCH 116/165] added GetMetaTxnReceipt functions to relayer and status for receipts --- .../Sequence/Samples~/Demo V3/DemoV3.unity | 554 +++++++++++++++- .../Sequence/Samples~/Demo V3/Prefabs.meta | 8 + .../Demo V3/Prefabs/SessionWalletTile.prefab | 597 ++++++++++++++++++ .../Prefabs/SessionWalletTile.prefab.meta | 7 + .../Scripts/EcosystemWallet.meta | 8 + .../SequenceEcosystemWalletWindow.cs | 47 +- .../SequenceEcosystemWalletWindow.cs.meta | 0 .../EcosystemWallet/SessionWalletTile.cs | 30 + .../EcosystemWallet/SessionWalletTile.cs.meta | 11 + .../Authentication/SequenceConnect.cs | 12 +- .../Authentication/SequenceSessionWallet.cs | 23 +- .../DataTypes/GetMetaTxnReceiptArgs.cs | 7 + .../DataTypes/GetMetaTxnReceiptArgs.cs.meta | 3 + .../DataTypes/GetMetaTxnReceiptReturn.cs | 7 + .../DataTypes/GetMetaTxnReceiptReturn.cs.meta | 3 + .../Relayer/DataTypes/MetaTxnReceipt.cs | 31 + .../Relayer/DataTypes/MetaTxnReceipt.cs.meta | 3 + .../Relayer/DataTypes/MetaTxnReceiptLog.cs | 9 + .../DataTypes/MetaTxnReceiptLog.cs.meta | 3 + .../Relayer/DataTypes/OperationStatus.cs | 8 +- .../Sequence/SequenceSDK/Relayer/IRelayer.cs | 3 +- .../SequenceSDK/Relayer/SequenceRelayer.cs | 11 +- 22 files changed, 1343 insertions(+), 42 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs.meta create mode 100644 Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab create mode 100644 Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet.meta rename Packages/Sequence-Unity/Sequence/SequenceBoilerplates/{ => Scripts/EcosystemWallet}/SequenceEcosystemWalletWindow.cs (87%) rename Packages/Sequence-Unity/Sequence/SequenceBoilerplates/{ => Scripts/EcosystemWallet}/SequenceEcosystemWalletWindow.cs.meta (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptReturn.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptReturn.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceiptLog.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceiptLog.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 0bf5d0c3..4be7b7ff 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -1460,7 +1460,7 @@ GameObject: - component: {fileID: 191605880} - component: {fileID: 191605879} m_Layer: 5 - m_Name: WalletDropdown + m_Name: ChainDropdown m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -1482,14 +1482,14 @@ RectTransform: - {fileID: 400068442} - {fileID: 988110724} - {fileID: 317570298} - m_Father: {fileID: 220577105} + m_Father: {fileID: 2198483992803733903} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 5} m_SizeDelta: {x: 0, y: 30} - m_Pivot: {x: 0.5, y: 0.5} + m_Pivot: {x: 0.5, y: 0} --- !u!114 &191605879 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1546,8 +1546,8 @@ MonoBehaviour: - m_Target: {fileID: 9144345594371459776} m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, SequenceBoilerplates - m_MethodName: OnWalletChanged - m_Mode: 3 + m_MethodName: OnChainChanged + m_Mode: 0 m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine @@ -1570,7 +1570,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.12156863, g: 0.12156863, b: 0.12156863, a: 1} + m_Color: {r: 0, g: 0, b: 0, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -1780,14 +1780,14 @@ RectTransform: - {fileID: 1984812366} - {fileID: 1299171964} - {fileID: 717198282} - - {fileID: 191605878} + - {fileID: 1009042193} - {fileID: 1678482373} - {fileID: 794886187} - {fileID: 1199799818} - {fileID: 1972349263} - {fileID: 541267863} m_Father: {fileID: 2198483992803733903} - m_RootOrder: 4 + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -2253,6 +2253,84 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 400068441} m_CullTransparentMesh: 1 +--- !u!1 &409830142 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 409830143} + - component: {fileID: 409830145} + - component: {fileID: 409830144} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &409830143 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 409830142} + 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: 1396476262} + 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: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &409830144 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 409830142} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_ChildAlignment: 0 + m_Spacing: 2 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &409830145 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 409830142} + 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 &448961315 GameObject: m_ObjectHideFlags: 0 @@ -2388,6 +2466,43 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 448961315} m_CullTransparentMesh: 1 +--- !u!1 &453938997 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 453938998} + 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 &453938998 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453938997} + 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: 504017413} + m_Father: {fileID: 1918409864} + 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 &455107485 GameObject: m_ObjectHideFlags: 0 @@ -2658,6 +2773,82 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 467585875} m_CullTransparentMesh: 1 +--- !u!1 &504017412 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 504017413} + - component: {fileID: 504017415} + - component: {fileID: 504017414} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &504017413 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 504017412} + 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: 453938998} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &504017414 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 504017412} + 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 &504017415 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 504017412} + m_CullTransparentMesh: 1 --- !u!1 &512459740 GameObject: m_ObjectHideFlags: 0 @@ -4894,6 +5085,115 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 988110723} m_CullTransparentMesh: 1 +--- !u!1 &1009042192 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1009042193} + - component: {fileID: 1009042196} + - component: {fileID: 1009042195} + - component: {fileID: 1009042194} + m_Layer: 5 + m_Name: Scroll View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1009042193 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1009042192} + 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: 1396476262} + - {fileID: 1918409864} + m_Father: {fileID: 220577105} + 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: 60} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1009042194 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1009042192} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 409830143} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 1396476262} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1918409865} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1009042195 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1009042192} + 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: 0} + 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 &1009042196 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1009042192} + m_CullTransparentMesh: 1 --- !u!1 &1016496428 GameObject: m_ObjectHideFlags: 0 @@ -6690,6 +6990,97 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1378034939} m_CullTransparentMesh: 1 +--- !u!1 &1396476261 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1396476262} + - component: {fileID: 1396476265} + - component: {fileID: 1396476264} + - component: {fileID: 1396476263} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1396476262 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1396476261} + 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: 409830143} + m_Father: {fileID: 1009042193} + 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, y: 1} +--- !u!114 &1396476263 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1396476261} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &1396476264 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1396476261} + 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.06666667, g: 0.06666667, b: 0.06666667, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &1396476265 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1396476261} + m_CullTransparentMesh: 1 --- !u!1 &1423156421 GameObject: m_ObjectHideFlags: 0 @@ -8002,6 +8393,133 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1883453220} m_CullTransparentMesh: 1 +--- !u!1 &1918409863 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1918409864} + - component: {fileID: 1918409867} + - component: {fileID: 1918409866} + - component: {fileID: 1918409865} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1918409864 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1918409863} + 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: 453938998} + m_Father: {fileID: 1009042193} + 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: 10, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1918409865 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1918409863} + 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: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} + m_HighlightedColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_PressedColor: {r: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} + m_SelectedColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_DisabledColor: {r: 0, g: 0, b: 0, a: 1} + 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: 504017414} + m_HandleRect: {fileID: 504017413} + m_Direction: 2 + m_Value: 1 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1918409866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1918409863} + 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: 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 &1918409867 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1918409863} + m_CullTransparentMesh: 1 --- !u!1 &1972349262 GameObject: m_ObjectHideFlags: 0 @@ -9242,6 +9760,7 @@ RectTransform: - {fileID: 5231001844959997297} - {fileID: 5231001846775536177} - {fileID: 906953579} + - {fileID: 191605878} - {fileID: 4209220039127894524} - {fileID: 220577105} - {fileID: 8737090446545054563} @@ -9746,7 +10265,7 @@ RectTransform: - {fileID: 512459741} - {fileID: 203863150} m_Father: {fileID: 2198483992803733903} - m_RootOrder: 3 + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -10087,7 +10606,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} propertyPath: m_RootOrder - value: 6 + value: 7 objectReference: {fileID: 0} - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} propertyPath: m_AnchorMax.x @@ -10775,7 +11294,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_RootOrder - value: 5 + value: 6 objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_AnchorMax.x @@ -10997,7 +11516,7 @@ MonoBehaviour: _emailContinueButton: {fileID: 2325936309338030303} _signOutButton: {fileID: 906953581} _signMessageButton: {fileID: 2082724707} - _walletDropdown: {fileID: 191605879} + _chainDropdown: {fileID: 191605879} _emailInput: {fileID: 1181566138228532167} _messageInput: {fileID: 541267865} _walletText: {fileID: 1610280877} @@ -11006,3 +11525,8 @@ MonoBehaviour: _walletState: {fileID: 220577104} _loadingOverlay: {fileID: 1084335994} _messagePopup: {fileID: 8737090446545054564} + _sessionPool: + _amount: 20 + _setAsLastSibling: 1 + _parent: {fileID: 409830143} + _prefab: {fileID: 7890725239804470961, guid: bfec625d64418404da8f952460922c70, type: 3} diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs.meta b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs.meta new file mode 100644 index 00000000..1a888f51 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0b10a3f86a2f04238a15881430916d92 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab new file mode 100644 index 00000000..2ab7bde6 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab @@ -0,0 +1,597 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &830406694634154231 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3278267076527203141} + - component: {fileID: 5002622919313635968} + - component: {fileID: 1925516040117653435} + - component: {fileID: 7484730057957455665} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3278267076527203141 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 830406694634154231} + 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: 3341521885508034341} + 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!222 &5002622919313635968 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 830406694634154231} + m_CullTransparentMesh: 1 +--- !u!114 &1925516040117653435 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 830406694634154231} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Message signature + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 1 + 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!114 &7484730057957455665 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 830406694634154231} + 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: -1 + m_FlexibleWidth: 1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &855452429909574649 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3341521885508034341} + - component: {fileID: 5734162964895938067} + m_Layer: 5 + m_Name: Layout + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3341521885508034341 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 855452429909574649} + 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: 3278267076527203141} + - {fileID: 7890725238531800109} + m_Father: {fileID: 7890725239804470962} + 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: 2.5, y: 0} + m_SizeDelta: {x: -15, y: -10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &5734162964895938067 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 855452429909574649} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, 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: 0 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &7890725237866539878 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7890725237866539877} + - component: {fileID: 7890725237866539875} + - component: {fileID: 7890725237866539876} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7890725237866539877 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7890725237866539878} + 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: 7890725238531800109} + 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: 7, y: 7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7890725237866539875 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7890725237866539878} + m_CullTransparentMesh: 1 +--- !u!114 &7890725237866539876 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7890725237866539878} + 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: e0aca7c4ac2ed4cc589962721c508d77, 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!1 &7890725238531800110 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7890725238531800109} + - component: {fileID: 7890725238531800105} + - component: {fileID: 7890725238531800106} + - component: {fileID: 7890725238531800107} + - component: {fileID: 7890725238531800108} + - component: {fileID: 1909815714930344878} + m_Layer: 5 + m_Name: RemoveButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7890725238531800109 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7890725238531800110} + 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: 7890725237866539877} + m_Father: {fileID: 3341521885508034341} + 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!222 &7890725238531800105 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7890725238531800110} + m_CullTransparentMesh: 1 +--- !u!114 &7890725238531800106 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7890725238531800110} + 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.19, g: 0.19, b: 0.19, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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!114 &7890725238531800107 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7890725238531800110} + 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: 7890725238531800106} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 7890725239804470961} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SessionWalletTile, SequenceBoilerplates + m_MethodName: Remove + 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 &7890725238531800108 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7890725238531800110} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &1909815714930344878 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7890725238531800110} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: 20 + m_MinHeight: -1 + m_PreferredWidth: 20 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &7890725238708147592 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7890725238708147591} + - component: {fileID: 7890725238708147589} + - component: {fileID: 7890725238708147590} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7890725238708147591 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7890725238708147592} + 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: 7890725239804470962} + 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!222 &7890725238708147589 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7890725238708147592} + m_CullTransparentMesh: 1 +--- !u!114 &7890725238708147590 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7890725238708147592} + 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.12156863, g: 0.12156863, b: 0.12156863, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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!1 &7890725239804470963 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7890725239804470962} + - component: {fileID: 7890725239804470961} + m_Layer: 5 + m_Name: SessionWalletTile + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7890725239804470962 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7890725239804470963} + 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: 7890725238708147591} + - {fileID: 3341521885508034341} + m_Father: {fileID: 0} + 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: 200, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &7890725239804470961 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7890725239804470963} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 94daf3e0487e5469a8287bc0ab4c9d59, type: 3} + m_Name: + m_EditorClassIdentifier: + _addressText: {fileID: 1925516040117653435} + _removeButton: {fileID: 7890725238531800107} diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab.meta b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab.meta new file mode 100644 index 00000000..da5b8686 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bfec625d64418404da8f952460922c70 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet.meta new file mode 100644 index 00000000..40861bcb --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3e5d8877bdf4844dca2788d5a0253fe8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs similarity index 87% rename from Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs rename to Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index df860e2b..04427f33 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -27,7 +27,7 @@ private enum ExplicitSessionType [SerializeField] private Button _emailContinueButton; [SerializeField] private Button _signOutButton; [SerializeField] private Button _signMessageButton; - [SerializeField] private TMP_Dropdown _walletDropdown; + [SerializeField] private TMP_Dropdown _chainDropdown; [SerializeField] private TMP_InputField _emailInput; [SerializeField] private TMP_InputField _messageInput; [SerializeField] private TMP_Text _walletText; @@ -36,6 +36,7 @@ private enum ExplicitSessionType [SerializeField] private GameObject _walletState; [SerializeField] private GameObject _loadingOverlay; [SerializeField] private MessagePopup _messagePopup; + [SerializeField] private GenericObjectPool _sessionPool; private SequenceConnect _login; private SequenceWallet _wallet; @@ -45,6 +46,12 @@ private enum ExplicitSessionType private string _curEmail; private string _curSignature; + private Chain[] _chains = + { + Chain.TestnetArbitrumSepolia, + Chain.ArbitrumOne + }; + private void Start() { _login = new(Chain.TestnetArbitrumSepolia, EcosystemType.Sequence); @@ -61,6 +68,9 @@ private void Start() if (_login.GetAllSessionWallets().Length > 0) ShowWallet(true); + + _chainDropdown.ClearOptions(); + _chainDropdown.AddOptions(_chains.Select(c => c.ToString()).ToList()); } public async void SignInWithEmail() @@ -145,7 +155,7 @@ public async void SignMessage() try { - var signature = await _wallet.SignMessage(Chain.TestnetArbitrumSepolia, message); + var signature = await _wallet.SignMessage(_login.Chain, message); ShowSignature(signature.signature); SetLoading(false); } @@ -198,9 +208,9 @@ public void SignOut() EnableWalletState(false); } - public void OnWalletChanged(int index) + public void OnChainChanged(int index) { - _selectedWallet = index; + _login.SetChain(_chains[index]); } public void OnImplicitSessionTypeChanged(int index) @@ -231,13 +241,8 @@ private void ShowWallet(bool recovered) { _wallet = _login.GetWallet(); _walletText.text = _wallet.Address.Value; - - var addresses = _wallet.SessionWallets.Select(w => w.Address.Value).ToList(); - _walletDropdown.ClearOptions(); - _walletDropdown.AddOptions(addresses); - _walletDropdown.value = 0; - _selectedWallet = 0; - + + LoadSessions(); EnableWalletState(true); SetLoading(false); @@ -245,11 +250,29 @@ private void ShowWallet(bool recovered) _messagePopup.Show("Session Created."); } + private void RemoveSession(Address address) + { + _login.RemoveSession(address); + LoadSessions(); + } + + private void LoadSessions() + { + _sessionPool.Cleanup(); + foreach (var wallet in _wallet.SessionWallets) + _sessionPool.GetObject().Apply(wallet, RemoveSession); + } + public void EnableWalletState(bool enable) { _loginState.SetActive(!enable); _walletState.SetActive(enable); _signOutButton.gameObject.SetActive(enable); + + var rect = transform as RectTransform; + var size = rect.sizeDelta; + size.y = enable ? 315 : 290; + rect.sizeDelta = size; } public void EnableEmailButton(bool enable) @@ -287,7 +310,7 @@ private SessionPermissions GetExplicitPermissions() private SessionPermissions GetPermissionsFromSessionType(int type) { - var templates = new SessionTemplates(Chain.TestnetArbitrumSepolia); + var templates = new SessionTemplates(_login.Chain); return type switch { 0 => null, diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceEcosystemWalletWindow.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs new file mode 100644 index 00000000..dcdfdfeb --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs @@ -0,0 +1,30 @@ +using System; +using Sequence.EcosystemWallet; +using TMPro; +using UnityEngine; +using UnityEngine.UI; + +namespace Sequence.Boilerplates +{ + public class SessionWalletTile : MonoBehaviour + { + [SerializeField] private TMP_Text _addressText; + [SerializeField] private Button _removeButton; + + private SequenceSessionWallet _wallet; + private Action
_onRemove; + + public void Apply(SequenceSessionWallet wallet, Action
onRemove) + { + _wallet = wallet; + _onRemove = onRemove; + _addressText.text = $"({(wallet.IsExplicit ? "E" : "I")}) {wallet.Address}"; + _removeButton.gameObject.SetActive(wallet.IsExplicit); + } + + public void Remove() + { + _onRemove?.Invoke(_wallet.Address); + } + } +} diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs.meta new file mode 100644 index 00000000..fb1a39d2 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 94daf3e0487e5469a8287bc0ab4c9d59 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index e9b5fc60..6011a08e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -13,7 +13,8 @@ public class SequenceConnect { public static Action SessionsChanged; - private Chain _chain; + public Chain Chain { get; private set; } + private EcosystemType _ecosystem; private EOAWallet _sessionWallet; private SessionStorage _sessionStorage; @@ -22,12 +23,17 @@ public class SequenceConnect public SequenceConnect(Chain chain, EcosystemType ecosystem) { - _chain = chain; + SetChain(chain); _ecosystem = ecosystem; _sessionStorage = new SessionStorage(); _credentials = _sessionStorage.GetSessions().ToList(); } + public void SetChain(Chain chain) + { + Chain = chain; + } + public async Task AddSession(SessionPermissions permissions) { Assert.IsNotNull(permissions); @@ -133,7 +139,7 @@ private async Task CreateNewSession(bool isExplicit, Sess response.Data.attestation, response.Data.signature, (int)_ecosystem, - ChainDictionaries.ChainIdOf[_chain], + ChainDictionaries.ChainIdOf[Chain], response.Data.loginMethod, response.Data.email); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs index fddb0e19..7c9deeaa 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs @@ -4,6 +4,7 @@ using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Relayer; +using Sequence.Utils; using Sequence.Wallet; namespace Sequence.EcosystemWallet @@ -59,9 +60,27 @@ public async Task GetFeeOption(Call[] calls) return response.options; } - public Task SendTransaction(Call[] calls, FeeOption feeOption = null) + public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) { - throw new System.NotImplementedException(); + var signedCalls = await SignCalls(calls); + + var relayer = new SequenceRelayer(Chain); + var hash = await relayer.Relay(signedCalls.To, signedCalls.Data.ByteArrayToHexStringWithPrefix()); + + MetaTxnReceipt receipt = null; + var status = OperationStatus.Pending; + + while (status != OperationStatus.Confirmed && status != OperationStatus.Failed) + { + var receiptResponse = await relayer.GetMetaTxnReceipt(hash); + receipt = receiptResponse.receipt; + status = receipt?.EvaluateStatus() ?? OperationStatus.Unknown; + } + + if (receipt == null) + throw new Exception("receipt is null"); + + return receipt.txnReceipt; } private async Task<(Address To, byte[] Data)> SignCalls(Call[] calls) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs new file mode 100644 index 00000000..2bf75d25 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs @@ -0,0 +1,7 @@ +namespace Sequence.Relayer +{ + public class GetMetaTxnReceiptArgs + { + public string metaTxnID; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs.meta new file mode 100644 index 00000000..dff70803 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bfff2d7f1f42464e9a64953615f6969c +timeCreated: 1753431515 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptReturn.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptReturn.cs new file mode 100644 index 00000000..39e29ac4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptReturn.cs @@ -0,0 +1,7 @@ +namespace Sequence.Relayer +{ + public class GetMetaTxnReceiptReturn + { + public MetaTxnReceipt receipt; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptReturn.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptReturn.cs.meta new file mode 100644 index 00000000..509eab77 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptReturn.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d40055a9992b4a319acde42119132d4b +timeCreated: 1753431567 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs new file mode 100644 index 00000000..7c80024f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs @@ -0,0 +1,31 @@ +using System; + +namespace Sequence.Relayer +{ + public class MetaTxnReceipt + { + public string id; + public string status; + public string revertReason; + public int index; + public string txnReceipt; + public MetaTxnReceipt[] receipts; + public MetaTxnReceiptLog[] logs; + + public OperationStatus EvaluateStatus() + { + return status switch + { + "QUEUED" => OperationStatus.Pending, + "SENT" => OperationStatus.Pending, + "PENDING_PRECONDITION" => OperationStatus.Pending, + "SUCCEEDED" => OperationStatus.Confirmed, + "FAILED" => OperationStatus.Failed, + "PARTIALLY_FAILED" => OperationStatus.Failed, + "DROPPED" => OperationStatus.Failed, + "UNKNOWN" => OperationStatus.Unknown, + _ => throw new ArgumentOutOfRangeException() + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs.meta new file mode 100644 index 00000000..af647066 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 97b5c962b5b746dca1e306053b2a44fd +timeCreated: 1753431560 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceiptLog.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceiptLog.cs new file mode 100644 index 00000000..e718e8e8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceiptLog.cs @@ -0,0 +1,9 @@ +namespace Sequence.Relayer +{ + public class MetaTxnReceiptLog + { + public string address; + public string data; + public string[] topics; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceiptLog.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceiptLog.cs.meta new file mode 100644 index 00000000..b72d4d4d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceiptLog.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6265520c9d974c45b7f0ba359beaacf6 +timeCreated: 1753431664 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/OperationStatus.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/OperationStatus.cs index a10fd6f3..4d6eed29 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/OperationStatus.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/OperationStatus.cs @@ -1,8 +1,10 @@ namespace Sequence.Relayer { - public class OperationStatus + public enum OperationStatus { - public string status; - public string reason; + Unknown, + Pending, + Confirmed, + Failed } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs index 9ab3663d..343ec80e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs @@ -1,4 +1,3 @@ -using System.Numerics; using System.Threading.Tasks; namespace Sequence.Relayer @@ -6,8 +5,8 @@ namespace Sequence.Relayer public interface IRelayer { Task Relay(Address to, string data, string quote = null, IntentPrecondition[] preconditions = null); - Task Status(string opHash, BigInteger chainId); Task GetFeeOptions(FeeOptionsArgs args); + Task GetMetaTxnReceipt(string metaTxnID); Task SendMetaTxn(SendMetaTxnArgs args); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs index 42c74c06..68dce8c3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs @@ -26,17 +26,18 @@ public async Task Relay(Address to, string data, string quote = null, In var response = await SendMetaTxn(new SendMetaTxnArgs(new MetaTxn(to, to.Value, data), quote, -1, preconditions)); return response.txnHash; } - - public async Task Status(string opHash, BigInteger chainId) - { - return await _httpClient.SendPostRequest("FeeOptions", opHash); - } public async Task GetFeeOptions(FeeOptionsArgs args) { return await _httpClient.SendPostRequest("FeeOptions", args); } + public async Task GetMetaTxnReceipt(string metaTxnID) + { + var args = new GetMetaTxnReceiptArgs { metaTxnID = metaTxnID }; + return await _httpClient.SendPostRequest("GetMetaTxnReceipt", args); + } + public async Task SendMetaTxn(SendMetaTxnArgs args) { return await _httpClient.SendPostRequest("SendMetaTxn", args); From 65ae8fe586f52d37ca1a34546027d8a374da2c1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 25 Jul 2025 14:42:49 +0200 Subject: [PATCH 117/165] some more changes --- .../EcosystemWallet/SequenceEcosystemWalletWindow.cs | 4 ++-- .../EcosystemWallet/Authentication/IWallet.cs | 2 +- .../EcosystemWallet/Authentication/SequenceConnect.cs | 10 +++++----- .../Authentication/SequenceSessionWallet.cs | 4 ++-- .../EcosystemWallet/Authentication/SequenceWallet.cs | 4 ++-- Packages/Sequence-Unity/package.json | 7 ++++++- 6 files changed, 18 insertions(+), 13 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index 04427f33..abe71953 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -79,7 +79,7 @@ public async void SignInWithEmail() try { - await _login.SignInWithEmail(_curEmail, GetImplicitPermissions()); + SequenceSessionWallet wallet = await _login.SignInWithEmail(_curEmail, null); ShowWallet(false); } catch (Exception e) @@ -155,7 +155,7 @@ public async void SignMessage() try { - var signature = await _wallet.SignMessage(_login.Chain, message); + var signature = await _wallet.SignMessage(message); ShowSignature(signature.signature); SetLoading(false); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs index 2218bb50..8b1f29dd 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs @@ -7,7 +7,7 @@ namespace Sequence.EcosystemWallet public interface IWallet { Address Address { get; } - Task SignMessage(Chain chain, string message); + Task SignMessage(string message); Task GetFeeOption(Call[] calls); Task SendTransaction(Call[] calls, FeeOption feeOption = null); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index 6011a08e..b9b101ef 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -40,27 +40,27 @@ public async Task AddSession(SessionPermissions permissio return await CreateNewSession(true, permissions, string.Empty); } - public async Task SignInWithEmail(string email, SessionPermissions permissions) + public async Task SignInWithEmail(string email, SessionPermissions permissions = null) { return await CreateNewSession(false, permissions,"email", email); } - public async Task SignInWithGoogle(SessionPermissions permissions) + public async Task SignInWithGoogle(SessionPermissions permissions = null) { return await CreateNewSession(false, permissions,"google"); } - public async Task SignInWithApple(SessionPermissions permissions) + public async Task SignInWithApple(SessionPermissions permissions = null) { return await CreateNewSession(false, permissions,"apple"); } - public async Task SignInWithPasskey(SessionPermissions permissions) + public async Task SignInWithPasskey(SessionPermissions permissions = null) { return await CreateNewSession(false, permissions,"passkey"); } - public async Task SignInWithMnemonic(SessionPermissions permissions) + public async Task SignInWithMnemonic(SessionPermissions permissions = null) { return await CreateNewSession(false, permissions,"mnemonic"); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs index 7c9deeaa..e7bcf0f8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs @@ -26,12 +26,12 @@ internal SequenceSessionWallet(SessionCredentials credentials) IsExplicit = credentials.isExplicit; } - public async Task SignMessage(Chain chain, string message) + public async Task SignMessage(string message) { var args = new SignMessageArgs { address = Address, - chainId = new BigInt((int)chain), + chainId = new BigInt((int)Chain), message = message }; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index 6da09913..f582c9e2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -31,9 +31,9 @@ private void SessionsChanged(SequenceSessionWallet[] sessionWallets) SessionWallets = sessionWallets; } - public async Task SignMessage(Chain chain, string message) + public async Task SignMessage(string message) { - return await SessionWallets[0].SignMessage(chain, message); + return await SessionWallets[0].SignMessage(message); } public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) diff --git a/Packages/Sequence-Unity/package.json b/Packages/Sequence-Unity/package.json index 0b6a4b09..e177015f 100644 --- a/Packages/Sequence-Unity/package.json +++ b/Packages/Sequence-Unity/package.json @@ -1,6 +1,6 @@ { "name": "xyz.0xsequence.waas-unity", - "version": "4.3.1", + "version": "5.0.0", "displayName": "Sequence Embedded Wallet SDK", "description": "A Unity SDK for Sequence APIs", "unity": "2021.3", @@ -40,6 +40,11 @@ "description": "Basic demo scene showcasing the SDK functionality using Sequence's boilerplates.", "path": "Sequence/Samples~/Demo" }, + { + "displayName": "Ecosystem Wallet Demo", + "description": "Basic Ecosystem Wallet Demo showcasing the SDK functionality.", + "path": "Sequence/Samples~/Demo V3" + }, { "displayName": "Android Secure Storage", "description": "Android native code required for secure, Keystore-based, storage.", From d6409408cf0a5807c1ec07d5e0bd505a1bb38ea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 25 Jul 2025 17:02:18 +0200 Subject: [PATCH 118/165] some more changes --- .../EcosystemWallet/SequenceEcosystemWalletWindow.cs | 6 +++--- .../EcosystemWallet/Authentication/SequenceConnect.cs | 3 ++- .../EcosystemWallet/Authentication/SequenceSessionWallet.cs | 4 +++- .../EcosystemWallet/Authentication/SequenceWallet.cs | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index abe71953..02ae746a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -66,11 +66,11 @@ private void Start() EnableEmailButton(true); ShowSignature(string.Empty); - if (_login.GetAllSessionWallets().Length > 0) - ShowWallet(true); - _chainDropdown.ClearOptions(); _chainDropdown.AddOptions(_chains.Select(c => c.ToString()).ToList()); + + if (_login.GetAllSessionWallets().Length > 0) + ShowWallet(true); } public async void SignInWithEmail() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index b9b101ef..647ca323 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -74,7 +74,7 @@ public SequenceWallet GetWallet() public SequenceSessionWallet[] GetAllSessionWallets() { if (_credentials.Count == 0) - throw new Exception("No session found in storage."); + return Array.Empty(); var sessionWallets = new SequenceSessionWallet[_credentials.Count]; for (var i = 0; i < _credentials.Count; i++) @@ -87,6 +87,7 @@ public void SignOut() { _sessionStorage.Clear(); _credentials.Clear(); + SessionsChanged?.Invoke(GetAllSessionWallets()); } public void RemoveSession(Address sessionAddress) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs index e7bcf0f8..b8c85300 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs @@ -11,6 +11,7 @@ namespace Sequence.EcosystemWallet { public class SequenceSessionWallet : IWallet { + public Address ParentAddress { get; } public Address Address { get; } public Chain Chain { get; } public bool IsExplicit { get; } @@ -20,7 +21,8 @@ public class SequenceSessionWallet : IWallet internal SequenceSessionWallet(SessionCredentials credentials) { _credentials = credentials; - + + ParentAddress = credentials.address; Address = new EOAWallet(credentials.privateKey).GetAddress(); Chain = ChainDictionaries.ChainById[credentials.chainId]; IsExplicit = credentials.isExplicit; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index f582c9e2..fe129670 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -15,7 +15,7 @@ public class SequenceWallet : IWallet, IDisposable internal SequenceWallet(SequenceSessionWallet[] sessionWallets) { SessionWallets = sessionWallets; - Address = sessionWallets[0].Address; + Address = sessionWallets[0].ParentAddress; OnWalletCreated?.Invoke(this); SequenceConnect.SessionsChanged += SessionsChanged; From c41f12febcafe339a460e24f15bc31e2373431f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 4 Aug 2025 14:06:56 +0200 Subject: [PATCH 119/165] origin in addImplicitSession request, changed SequenceSessionWallet to SessionSigner --- .../Plugins/iOS/NativeBrowserPlugin.mm | 8 +++++ .../SequenceEcosystemWalletWindow.cs | 2 +- .../EcosystemWallet/SessionWalletTile.cs | 12 +++---- .../Authentication/Requests/Connect.cs | 2 +- .../Authentication/SequenceConnect.cs | 32 +++++++++---------- .../Authentication/SequenceWallet.cs | 6 ++-- ...uenceSessionWallet.cs => SessionSigner.cs} | 4 +-- ...onWallet.cs.meta => SessionSigner.cs.meta} | 0 .../Primitives/Attestation/AuthData.cs | 1 - .../RedirectHandler/RedirectHandler.cs | 7 +++- 10 files changed, 43 insertions(+), 31 deletions(-) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/{SequenceSessionWallet.cs => SessionSigner.cs} (96%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/{SequenceSessionWallet.cs.meta => SessionSigner.cs.meta} (100%) diff --git a/Packages/Sequence-Unity/Plugins/iOS/NativeBrowserPlugin.mm b/Packages/Sequence-Unity/Plugins/iOS/NativeBrowserPlugin.mm index 01f264b2..b60b19f5 100644 --- a/Packages/Sequence-Unity/Plugins/iOS/NativeBrowserPlugin.mm +++ b/Packages/Sequence-Unity/Plugins/iOS/NativeBrowserPlugin.mm @@ -15,6 +15,14 @@ void OpenWalletApp(const char *urlCString) UIViewController *rootVC = [UIApplication sharedApplication].keyWindow.rootViewController; safariVC = [[SFSafariViewController alloc] initWithURL:url]; + + if (@available(iOS 11.0, *)) { + safariVC.dismissButtonStyle = SFSafariViewControllerDismissButtonStyleCancel; + } + + if (@available(iOS 13.0, *)) { + safariVC.modalInPresentation = YES; + } NSLog(@"[SafariPlugin] Presenting SFSafariViewController with URL: %@", urlString); diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index 02ae746a..bef0623a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -79,7 +79,7 @@ public async void SignInWithEmail() try { - SequenceSessionWallet wallet = await _login.SignInWithEmail(_curEmail, null); + SessionSigner signer = await _login.SignInWithEmail(_curEmail, null); ShowWallet(false); } catch (Exception e) diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs index dcdfdfeb..8bbeb96a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs @@ -11,20 +11,20 @@ public class SessionWalletTile : MonoBehaviour [SerializeField] private TMP_Text _addressText; [SerializeField] private Button _removeButton; - private SequenceSessionWallet _wallet; + private SessionSigner _signer; private Action
_onRemove; - public void Apply(SequenceSessionWallet wallet, Action
onRemove) + public void Apply(SessionSigner signer, Action
onRemove) { - _wallet = wallet; + _signer = signer; _onRemove = onRemove; - _addressText.text = $"({(wallet.IsExplicit ? "E" : "I")}) {wallet.Address}"; - _removeButton.gameObject.SetActive(wallet.IsExplicit); + _addressText.text = $"({(signer.IsExplicit ? "E" : "I")}) {signer.Address}"; + _removeButton.gameObject.SetActive(signer.IsExplicit); } public void Remove() { - _onRemove?.Invoke(_wallet.Address); + _onRemove?.Invoke(_signer.Address); } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs index 90a70350..2c46b324 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs @@ -7,7 +7,7 @@ public struct ConnectArgs public Address sessionAddress; public string preferredLoginMethod; public string email; - public string implicitSessionRedirectUrl; + public string origin; public SessionPermissions permissions; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index 647ca323..0ac3acf8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -11,7 +11,7 @@ namespace Sequence.EcosystemWallet { public class SequenceConnect { - public static Action SessionsChanged; + public static Action SessionsChanged; public Chain Chain { get; private set; } @@ -34,33 +34,33 @@ public void SetChain(Chain chain) Chain = chain; } - public async Task AddSession(SessionPermissions permissions) + public async Task AddSession(SessionPermissions permissions) { Assert.IsNotNull(permissions); return await CreateNewSession(true, permissions, string.Empty); } - public async Task SignInWithEmail(string email, SessionPermissions permissions = null) + public async Task SignInWithEmail(string email, SessionPermissions permissions = null) { return await CreateNewSession(false, permissions,"email", email); } - public async Task SignInWithGoogle(SessionPermissions permissions = null) + public async Task SignInWithGoogle(SessionPermissions permissions = null) { return await CreateNewSession(false, permissions,"google"); } - public async Task SignInWithApple(SessionPermissions permissions = null) + public async Task SignInWithApple(SessionPermissions permissions = null) { return await CreateNewSession(false, permissions,"apple"); } - public async Task SignInWithPasskey(SessionPermissions permissions = null) + public async Task SignInWithPasskey(SessionPermissions permissions = null) { return await CreateNewSession(false, permissions,"passkey"); } - public async Task SignInWithMnemonic(SessionPermissions permissions = null) + public async Task SignInWithMnemonic(SessionPermissions permissions = null) { return await CreateNewSession(false, permissions,"mnemonic"); } @@ -71,14 +71,14 @@ public SequenceWallet GetWallet() return _wallet; } - public SequenceSessionWallet[] GetAllSessionWallets() + public SessionSigner[] GetAllSessionWallets() { if (_credentials.Count == 0) - return Array.Empty(); + return Array.Empty(); - var sessionWallets = new SequenceSessionWallet[_credentials.Count]; + var sessionWallets = new SessionSigner[_credentials.Count]; for (var i = 0; i < _credentials.Count; i++) - sessionWallets[i] = new SequenceSessionWallet(_credentials[i]); + sessionWallets[i] = new SessionSigner(_credentials[i]); return sessionWallets; } @@ -108,17 +108,17 @@ public void RemoveSession(Address sessionAddress) /// Leave it null to create an implicit session. Otherwise, we create an explicit session. /// /// - private async Task CreateNewSession(bool isExplicit, SessionPermissions permissions, string preferredLoginMethod, string email = null) + private async Task CreateNewSession(bool isExplicit, SessionPermissions permissions, string preferredLoginMethod, string email = null) { _sessionWallet = new EOAWallet(); - var redirectUrl = RedirectOrigin.GetOriginString(); + var origin = RedirectOrigin.GetOriginString(); var payload = new ConnectArgs { sessionAddress = _sessionWallet.GetAddress(), preferredLoginMethod = preferredLoginMethod, email = email, - implicitSessionRedirectUrl = isExplicit ? null : redirectUrl, + origin = origin, permissions = permissions }; @@ -127,7 +127,7 @@ private async Task CreateNewSession(bool isExplicit, Sess var url = $"{ecosystemUrl}/request/connect"; var handler = RedirectFactory.CreateHandler(); - handler.SetRedirectUrl(redirectUrl); + handler.SetRedirectUrl(origin); var response = await handler.WaitForResponse(url, action, payload); if (!response.Result) @@ -148,7 +148,7 @@ private async Task CreateNewSession(bool isExplicit, Sess _credentials.Add(credentials); SessionsChanged?.Invoke(GetAllSessionWallets()); - return new SequenceSessionWallet(credentials); + return new SessionSigner(credentials); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index fe129670..c29f85fe 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -10,9 +10,9 @@ public class SequenceWallet : IWallet, IDisposable public static Action OnWalletCreated; public Address Address { get; } - public SequenceSessionWallet[] SessionWallets { get; private set; } + public SessionSigner[] SessionWallets { get; private set; } - internal SequenceWallet(SequenceSessionWallet[] sessionWallets) + internal SequenceWallet(SessionSigner[] sessionWallets) { SessionWallets = sessionWallets; Address = sessionWallets[0].ParentAddress; @@ -26,7 +26,7 @@ public void Dispose() SequenceConnect.SessionsChanged -= SessionsChanged; } - private void SessionsChanged(SequenceSessionWallet[] sessionWallets) + private void SessionsChanged(SessionSigner[] sessionWallets) { SessionWallets = sessionWallets; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs similarity index 96% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs index b8c85300..5e0da89b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs @@ -9,7 +9,7 @@ namespace Sequence.EcosystemWallet { - public class SequenceSessionWallet : IWallet + public class SessionSigner : IWallet { public Address ParentAddress { get; } public Address Address { get; } @@ -18,7 +18,7 @@ public class SequenceSessionWallet : IWallet private readonly SessionCredentials _credentials; - internal SequenceSessionWallet(SessionCredentials credentials) + internal SessionSigner(SessionCredentials credentials) { _credentials = credentials; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceSessionWallet.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs index 8860ef52..89098318 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs @@ -1,5 +1,4 @@ using System; -using System.Numerics; using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Utils; using UnityEngine.Scripting; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs index 692a747a..6cc3d6eb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs @@ -21,7 +21,12 @@ protected string ConstructUrl(string url, string action, TPayload payl { var serializedPayload = JsonConvert.SerializeObject(payload); var encodedPayload = Convert.ToBase64String(Encoding.UTF8.GetBytes(serializedPayload)); - return $"{url}?action={action}&payload={encodedPayload}&id={Id}&redirectUrl={RedirectUrl}&mode=redirect"; + var finalUrl = $"{url}?action={action}&payload={encodedPayload}&id={Id}&mode=redirect"; + + if (!string.IsNullOrEmpty(RedirectUrl)) + finalUrl += $"&redirectUrl={RedirectUrl}"; + + return finalUrl; } } } \ No newline at end of file From b6364bf6a4ce0c7d530f812f6c84b2b688b622a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 4 Aug 2025 14:38:50 +0200 Subject: [PATCH 120/165] started finding signers, preparing transactions --- .../Authentication/SequenceWallet.cs | 21 +++++++----- .../Authentication/SessionSigner.cs | 33 +++++++++++++++++++ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index c29f85fe..83d69c40 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -10,12 +10,12 @@ public class SequenceWallet : IWallet, IDisposable public static Action OnWalletCreated; public Address Address { get; } - public SessionSigner[] SessionWallets { get; private set; } + public SessionSigner[] SessionSigners { get; private set; } - internal SequenceWallet(SessionSigner[] sessionWallets) + internal SequenceWallet(SessionSigner[] sessionSigners) { - SessionWallets = sessionWallets; - Address = sessionWallets[0].ParentAddress; + SessionSigners = sessionSigners; + Address = sessionSigners[0].ParentAddress; OnWalletCreated?.Invoke(this); SequenceConnect.SessionsChanged += SessionsChanged; @@ -28,22 +28,27 @@ public void Dispose() private void SessionsChanged(SessionSigner[] sessionWallets) { - SessionWallets = sessionWallets; + SessionSigners = sessionWallets; } public async Task SignMessage(string message) { - return await SessionWallets[0].SignMessage(message); + return await FindSessionSigner().SignMessage(message); } public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) { - return await SessionWallets[0].SendTransaction(calls, feeOption); + return await FindSessionSigner().SendTransaction(calls, feeOption); } public async Task GetFeeOption(Call[] calls) { - return await SessionWallets[0].GetFeeOption(calls); + return await FindSessionSigner().GetFeeOption(calls); + } + + private SessionSigner FindSessionSigner() + { + return SessionSigners[0]; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs index 5e0da89b..e6acf8c2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs @@ -1,6 +1,7 @@ using System; using System.Threading.Tasks; using Sequence.EcosystemWallet.Browser; +using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Relayer; @@ -87,7 +88,39 @@ public async Task SendTransaction(Call[] calls, FeeOption feeOption = nu private async Task<(Address To, byte[] Data)> SignCalls(Call[] calls) { + /* + * 1. Prepare Increment, add the increment to the calls array + * 2. + */ + + var preparedIncrement = PrepareIncrement(); + if (preparedIncrement != null) + calls.AddToArray(preparedIncrement); + + var envelope = PrepareTransaction(calls); + var parentedEnvelope = new Parented(new [] { Address }, envelope.payload); + + // Get Image hash + + // sign sapient + throw new System.NotImplementedException(); } + + private Call PrepareIncrement() + { + return null; + } + + private Envelope PrepareTransaction(Call[] calls) + { + var space = 0; + var nonce = 0; + return new Envelope + { + wallet = null, + payload = new Calls(space, nonce, calls) + }; + } } } \ No newline at end of file From 7a10e9db1a3e08395d61705d33f856f367fa54ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 6 Aug 2025 08:02:11 +0200 Subject: [PATCH 121/165] added v3 key machine requests to get wallet config --- .../SequenceEcosystemWalletWindow.cs | 2 +- .../Authentication/RedirectOrigin.cs | 2 +- .../Authentication/SequenceConnect.cs | 4 + .../Authentication/SequenceWallet.cs | 102 +++++++++++++++-- .../Authentication/SessionSigner.cs | 104 +----------------- .../Envelope/{Signed.cs => SignedEnvelope.cs} | 2 +- ...{Signed.cs.meta => SignedEnvelope.cs.meta} | 0 .../EcosystemWallet/KeyMachine.meta | 3 + .../KeyMachine/KeyMachineApi.cs | 32 ++++++ .../KeyMachine/KeyMachineApi.cs.meta | 3 + .../EcosystemWallet/KeyMachine/Models.meta | 3 + .../KeyMachine/Models/Config.cs | 18 +++ .../KeyMachine/Models/Config.cs.meta | 3 + .../KeyMachine/Models/DeployHash.cs | 17 +++ .../KeyMachine/Models/DeployHash.cs.meta | 3 + .../Primitives/Signature/SignatureHandler.cs | 4 +- .../LocalhostRedirectHandler.cs | 5 +- 17 files changed, 191 insertions(+), 116 deletions(-) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/{Signed.cs => SignedEnvelope.cs} (69%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/{Signed.cs.meta => SignedEnvelope.cs.meta} (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index bef0623a..7ab9e7df 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -259,7 +259,7 @@ private void RemoveSession(Address address) private void LoadSessions() { _sessionPool.Cleanup(); - foreach (var wallet in _wallet.SessionWallets) + foreach (var wallet in _wallet.SessionSigners) _sessionPool.GetObject().Apply(wallet, RemoveSession); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs index 40ab0e28..4742e50a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs @@ -24,7 +24,7 @@ public static string GetOriginString() #else public static string GetOriginString() { - return $"http://localhost:{GetAvailablePort()}/"; + return $"http://localhost:{GetAvailablePort()}"; } private static int GetAvailablePort() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index 0ac3acf8..a928da4c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -133,6 +133,10 @@ private async Task CreateNewSession(bool isExplicit, SessionPermi if (!response.Result) throw new Exception("Error during request"); + var keyMachine = new KeyMachineApi(); + var deployResponse = await keyMachine.GetDeploy(response.Data.walletAddress); + var configResponse = await keyMachine.GetConfiguration(deployResponse.deployHash); + var credentials = new SessionCredentials( isExplicit, _sessionWallet.GetPrivateKeyAsHex(), diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index 83d69c40..e11ec40e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -1,7 +1,12 @@ using System; +using System.Numerics; using System.Threading.Tasks; +using Sequence.EcosystemWallet.Browser; +using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; +using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Relayer; +using Sequence.Utils; namespace Sequence.EcosystemWallet { @@ -30,23 +35,106 @@ private void SessionsChanged(SessionSigner[] sessionWallets) { SessionSigners = sessionWallets; } - + public async Task SignMessage(string message) { - return await FindSessionSigner().SignMessage(message); + var args = new SignMessageArgs + { + address = Address, + chainId = new BigInt((int)SessionSigners[0].Chain), + message = message + }; + + var url = $"{EcosystemBindings.GetUrl(EcosystemType.Sequence)}/request/sign"; + + var handler = RedirectFactory.CreateHandler(); + handler.SetRedirectUrl(RedirectOrigin.GetOriginString()); + + var response = await handler.WaitForResponse(url, "signMessage", args); + + if (!response.Result) + throw new Exception("Failed to sign message"); + + return response.Data; } - + + public async Task GetFeeOption(Call[] calls) + { + var signedCalls = await SignCalls(calls); + var relayer = new SequenceRelayer(SessionSigners[0].Chain); + + var args = new FeeOptionsArgs(Address, signedCalls.To, signedCalls.Data); + var response = await relayer.GetFeeOptions(args); + + return response.options; + } + public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) { - return await FindSessionSigner().SendTransaction(calls, feeOption); + var signedCalls = await SignCalls(calls); + + var relayer = new SequenceRelayer(SessionSigners[0].Chain); + var hash = await relayer.Relay(signedCalls.To, signedCalls.Data.ByteArrayToHexStringWithPrefix()); + + MetaTxnReceipt receipt = null; + var status = OperationStatus.Pending; + + while (status != OperationStatus.Confirmed && status != OperationStatus.Failed) + { + var receiptResponse = await relayer.GetMetaTxnReceipt(hash); + receipt = receiptResponse.receipt; + status = receipt?.EvaluateStatus() ?? OperationStatus.Unknown; + } + + if (receipt == null) + throw new Exception("receipt is null"); + + return receipt.txnReceipt; + } + + private async Task<(Address To, byte[] Data)> SignCalls(Call[] calls) + { + /* + * 1. Prepare Increment, add the increment to the calls array + * 2. + */ + + var preparedIncrement = PrepareIncrement(null, 2, null); + if (preparedIncrement != null) + calls.AddToArray(preparedIncrement); + + var envelope = PrepareTransaction(calls); + var parentedEnvelope = new Parented(new [] { Address }, envelope.payload); + + // Get Image hash + + // sign sapient + + throw new System.NotImplementedException(); + } + + private Call PrepareIncrement(Address wallet, BigInteger chainId, Calls calls) + { + return null; } - public async Task GetFeeOption(Call[] calls) + private Envelope PrepareTransaction(Call[] calls) { - return await FindSessionSigner().GetFeeOption(calls); + var space = 0; + var nonce = 0; + + return new Envelope + { + wallet = null, + payload = new Calls(space, nonce, calls) + }; } - private SessionSigner FindSessionSigner() + private void BuildTransaction(SignedEnvelope envelope) + { + } + + private SessionSigner FindSignersForCalls(Calls calls) { return SessionSigners[0]; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs index e6acf8c2..4a079363 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs @@ -1,16 +1,8 @@ -using System; -using System.Threading.Tasks; -using Sequence.EcosystemWallet.Browser; -using Sequence.EcosystemWallet.Envelope; -using Sequence.EcosystemWallet.Primitives; -using Sequence.EcosystemWallet.Primitives.Common; -using Sequence.Relayer; -using Sequence.Utils; using Sequence.Wallet; namespace Sequence.EcosystemWallet { - public class SessionSigner : IWallet + public class SessionSigner { public Address ParentAddress { get; } public Address Address { get; } @@ -28,99 +20,5 @@ internal SessionSigner(SessionCredentials credentials) Chain = ChainDictionaries.ChainById[credentials.chainId]; IsExplicit = credentials.isExplicit; } - - public async Task SignMessage(string message) - { - var args = new SignMessageArgs - { - address = Address, - chainId = new BigInt((int)Chain), - message = message - }; - - var ecosystem = (EcosystemType)_credentials.ecosystemId; - var url = $"{EcosystemBindings.GetUrl(ecosystem)}/request/sign"; - - var handler = RedirectFactory.CreateHandler(); - handler.SetRedirectUrl(RedirectOrigin.GetOriginString()); - - var response = await handler.WaitForResponse(url, "signMessage", args); - - if (!response.Result) - throw new Exception("Failed to sign message"); - - return response.Data; - } - - public async Task GetFeeOption(Call[] calls) - { - var signedCalls = await SignCalls(calls); - var relayer = new SequenceRelayer(Chain.TestnetArbitrumSepolia); - - var args = new FeeOptionsArgs(Address, signedCalls.To, signedCalls.Data); - var response = await relayer.GetFeeOptions(args); - - return response.options; - } - - public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) - { - var signedCalls = await SignCalls(calls); - - var relayer = new SequenceRelayer(Chain); - var hash = await relayer.Relay(signedCalls.To, signedCalls.Data.ByteArrayToHexStringWithPrefix()); - - MetaTxnReceipt receipt = null; - var status = OperationStatus.Pending; - - while (status != OperationStatus.Confirmed && status != OperationStatus.Failed) - { - var receiptResponse = await relayer.GetMetaTxnReceipt(hash); - receipt = receiptResponse.receipt; - status = receipt?.EvaluateStatus() ?? OperationStatus.Unknown; - } - - if (receipt == null) - throw new Exception("receipt is null"); - - return receipt.txnReceipt; - } - - private async Task<(Address To, byte[] Data)> SignCalls(Call[] calls) - { - /* - * 1. Prepare Increment, add the increment to the calls array - * 2. - */ - - var preparedIncrement = PrepareIncrement(); - if (preparedIncrement != null) - calls.AddToArray(preparedIncrement); - - var envelope = PrepareTransaction(calls); - var parentedEnvelope = new Parented(new [] { Address }, envelope.payload); - - // Get Image hash - - // sign sapient - - throw new System.NotImplementedException(); - } - - private Call PrepareIncrement() - { - return null; - } - - private Envelope PrepareTransaction(Call[] calls) - { - var space = 0; - var nonce = 0; - return new Envelope - { - wallet = null, - payload = new Calls(space, nonce, calls) - }; - } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signed.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SignedEnvelope.cs similarity index 69% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signed.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SignedEnvelope.cs index 858da00e..5b047f0d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signed.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SignedEnvelope.cs @@ -2,7 +2,7 @@ namespace Sequence.EcosystemWallet.Envelope { - public class Signed : Envelope where T : Payload + public class SignedEnvelope : Envelope where T : Payload { public EnvelopeSignature[] signatures; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signed.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SignedEnvelope.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signed.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SignedEnvelope.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine.meta new file mode 100644 index 00000000..9237b8f9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: eab3b627ca7f4b1bb0ebd7095b4332d4 +timeCreated: 1754459461 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs new file mode 100644 index 00000000..a1628c54 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs @@ -0,0 +1,32 @@ +using System.Threading.Tasks; +using Sequence.EcosystemWallet.KeyMachine.Models; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet +{ + internal class KeyMachineApi + { + private const string DefaultHost = "https://v3-keymachine.sequence-dev.app"; + + private readonly string _host; + private readonly HttpClient _httpClient; + + public KeyMachineApi(string host = null) + { + _host = host ?? DefaultHost; + _httpClient = new HttpClient(_host); + } + + public async Task GetDeploy(Address walletAddress) + { + var args = new DeployHashArgs(walletAddress); + return await _httpClient.SendPostRequest("rpc/Sessions/DeployHash", args); + } + + public async Task GetConfiguration(string imageHash) + { + var args = new ConfigArgs(imageHash); + return await _httpClient.SendPostRequest("rpc/Sessions/Config", args); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs.meta new file mode 100644 index 00000000..693f8315 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a67a137b9b4e4b76bcddf03151c1bc54 +timeCreated: 1754458894 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models.meta new file mode 100644 index 00000000..2b45d198 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fa3a770839f640738c306ad5f5789182 +timeCreated: 1754459510 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs new file mode 100644 index 00000000..f73a70bc --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs @@ -0,0 +1,18 @@ +namespace Sequence.EcosystemWallet.KeyMachine.Models +{ + internal struct ConfigArgs + { + public string imageHash; + + public ConfigArgs(string imageHash) + { + this.imageHash = imageHash; + } + } + + internal struct ConfigReturn + { + public int version; + public object config; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs.meta new file mode 100644 index 00000000..e1c3920f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 53ff0efb102444bb9c8970a4ee25e6b0 +timeCreated: 1754459717 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs new file mode 100644 index 00000000..80fcc012 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs @@ -0,0 +1,17 @@ +namespace Sequence.EcosystemWallet.KeyMachine.Models +{ + public struct DeployHashArgs + { + public Address wallet; + + public DeployHashArgs(Address wallet) + { + this.wallet = wallet; + } + } + + public struct DeployHashReturn + { + public string deployHash; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs.meta new file mode 100644 index 00000000..d8ccaa02 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e777784bdc514e478c640cfc9299b057 +timeCreated: 1754459532 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs index bf5f0400..53225a48 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs @@ -65,7 +65,7 @@ leaf is AnyAddressSubdigestLeaf || throw new Exception("Invalid topology"); } - public static RawSignature EncodeSignature(Signed envelope) + public static RawSignature EncodeSignature(SignedEnvelope envelope) { var topology = FillLeaves(envelope.configuration.topology, leaf => SignatureForLeaf(envelope, leaf)); @@ -83,7 +83,7 @@ public static RawSignature EncodeSignature(Signed envelope) }; } - public static EnvelopeSignature SignatureForLeaf(Signed envelope, Leaf leaf) + public static EnvelopeSignature SignatureForLeaf(SignedEnvelope envelope, Leaf leaf) { if (leaf is SignerLeaf signerLeaf) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs index e1fc5033..b8dd6953 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs @@ -3,6 +3,7 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; +using Sequence.Utils; using UnityEngine; namespace Sequence.EcosystemWallet.Browser @@ -16,7 +17,7 @@ internal class LocalhostRedirectHandler : RedirectHandler try { var listener = new HttpListener(); - listener.Prefixes.Add(RedirectUrl); + listener.Prefixes.Add(RedirectUrl.AppendTrailingSlashIfNeeded()); listener.Start(); var context = await listener.GetContextAsync(); @@ -34,6 +35,8 @@ internal class LocalhostRedirectHandler : RedirectHandler var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(queryString["payload"])); var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); + Debug.Log($"{responsePayloadJson}"); + return (true, responsePayload); } catch (Exception ex) From c318399bde5ef19dfae667abdcc55f12871e7f15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 6 Aug 2025 08:49:10 +0200 Subject: [PATCH 122/165] converting service tree to config primitive --- .../Authentication/SequenceConnect.cs | 9 +- .../KeyMachine/KeyMachineApi.cs | 16 ++- .../KeyMachine/Models/Config.cs | 9 +- .../KeyMachine/Models/DeployHash.cs | 15 ++- .../Primitives/Config/Config.cs | 2 + .../Primitives/Config/Topology.cs | 78 +++++++++++++ .../Utils/Networking/HttpClient.cs | 104 ++---------------- 7 files changed, 129 insertions(+), 104 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index a928da4c..b8b282c1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -1,10 +1,13 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Numerics; using System.Threading.Tasks; +using Newtonsoft.Json; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; using Sequence.Wallet; +using UnityEngine; using UnityEngine.Assertions; namespace Sequence.EcosystemWallet @@ -134,8 +137,10 @@ private async Task CreateNewSession(bool isExplicit, SessionPermi throw new Exception("Error during request"); var keyMachine = new KeyMachineApi(); - var deployResponse = await keyMachine.GetDeploy(response.Data.walletAddress); - var configResponse = await keyMachine.GetConfiguration(deployResponse.deployHash); + var deployResponse = await keyMachine.GetDeployHash(response.Data.walletAddress); + var config = await keyMachine.GetConfiguration(deployResponse.deployHash); + + Debug.Log($"Config: {config.ToJson()}"); var credentials = new SessionCredentials( isExplicit, diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs index a1628c54..2e0630eb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs @@ -1,5 +1,7 @@ +using System.Numerics; using System.Threading.Tasks; using Sequence.EcosystemWallet.KeyMachine.Models; +using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; namespace Sequence.EcosystemWallet @@ -17,16 +19,24 @@ public KeyMachineApi(string host = null) _httpClient = new HttpClient(_host); } - public async Task GetDeploy(Address walletAddress) + public async Task GetDeployHash(Address walletAddress) { var args = new DeployHashArgs(walletAddress); return await _httpClient.SendPostRequest("rpc/Sessions/DeployHash", args); } - public async Task GetConfiguration(string imageHash) + public async Task GetConfiguration(string imageHash) { var args = new ConfigArgs(imageHash); - return await _httpClient.SendPostRequest("rpc/Sessions/Config", args); + var response = await _httpClient.SendPostRequest("rpc/Sessions/Config", args); + + var topology = Topology.FromServiceConfigTree(response.config.tree.ToString()); + return new Primitives.Config + { + threshold = new BigInteger(response.config.threshold), + checkpoint = BigInteger.Parse(response.config.checkpoint), + topology = topology, + }; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs index f73a70bc..a75123f7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs @@ -13,6 +13,13 @@ public ConfigArgs(string imageHash) internal struct ConfigReturn { public int version; - public object config; + public ConfigContext config; + } + + internal struct ConfigContext + { + public string checkpoint; + public int threshold; + public object tree; } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs index 80fcc012..5701bc3a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs @@ -1,6 +1,6 @@ namespace Sequence.EcosystemWallet.KeyMachine.Models { - public struct DeployHashArgs + internal struct DeployHashArgs { public Address wallet; @@ -10,8 +10,19 @@ public DeployHashArgs(Address wallet) } } - public struct DeployHashReturn + internal struct DeployHashReturn { public string deployHash; + public DeployHashContext context; + } + + internal struct DeployHashContext + { + public int version; + public string factory; + public string guestModule; + public string mainModule; + public string mainModuleUpgradable; + public string walletCreationCode; } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs index fdc0d1c6..831960d9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs @@ -1,6 +1,8 @@ +using System; using System.Collections.Generic; using System.Numerics; using Newtonsoft.Json; +using Org.BouncyCastle.Utilities.Encoders; using Sequence.ABI; using Sequence.Utils; using UnityEngine; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index cfc0287f..3e40deb6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -326,5 +326,83 @@ public static List ParseContentToLeafs(string elements) return leaves; } + + public static Topology FromServiceConfigTree(string input) + { + if (input.StartsWith("[")) + { + var list = JsonConvert.DeserializeObject>(input); + if (list.Count != 2) + { + throw new Exception("Invalid node structure in JSON"); + } + + return new Topology(new Node( + FromServiceConfigTree(list[0].ToString()), + FromServiceConfigTree(list[1].ToString()))); + } + + if (input.StartsWith("0x")) + { + return new NodeLeaf + { + Value = input.HexStringToByteArray() + }.ToTopology(); + } + + var obj = JsonConvert.DeserializeObject>(input); + if (obj.ContainsKey("weight")) + { + if (obj.ContainsKey("address")) + { + if (obj.ContainsKey("imageHash")) + { + return new SapientSignerLeaf + { + address = new Address(obj["address"] as string), + weight = BigInteger.Parse(obj["weight"].ToString()), + imageHash = obj["imageHash"] as string + }.ToTopology(); + } + + return new SignerLeaf + { + address = new Address(obj["address"] as string), + weight = BigInteger.Parse(obj["weight"].ToString()) + }.ToTopology(); + } + + if (obj.ContainsKey("tree")) + { + return new NestedLeaf + { + weight = BigInteger.Parse(obj["weight"].ToString()), + threshold = BigInteger.Parse(obj["threshold"].ToString()), + tree = FromServiceConfigTree(obj["tree"].ToString()) + }.ToTopology(); + } + } + + if (obj.ContainsKey("subdigest")) + { + var subdigest = obj["subdigest"].ToString().HexStringToByteArray(); + var isAny = obj.ContainsKey("isAnyAddress") && (bool)obj["isAnyAddress"]; + + if (isAny) + { + return new AnyAddressSubdigestLeaf + { + digest = subdigest + }.ToTopology(); + } + + return new SubdigestLeaf + { + digest = subdigest + }.ToTopology(); + } + + throw new Exception($"Unknown config tree '{input}'"); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs index a6dc7204..2f0e057b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs @@ -36,72 +36,8 @@ public async Task SendPostRequest(string path, TArg var curlRequest = newRequest.Item2; var url = newRequest.Item3; - string requestJson = SetRequestData(request, args); - - string method = request.method; - string headersString = ExtractHeaders(request); - string curlRequest = $"curl -X {method} '{url}' {headersString} -d '{requestJson}'"; - if (requestJson == "") - { - curlRequest = $"curl -X {method} '{url}' {headersString}"; - } - - return (request, curlRequest, url); - } - - private void SetHeaders(UnityWebRequest request, Dictionary headers) - { - if (headers == null) - { - headers = _defaultHeaders; - } - else - { - foreach (string key in _defaultHeaders.Keys) - { - if (!headers.ContainsKey(key)) - { - headers[key] = _defaultHeaders[key]; - } - } - } - - foreach (string key in headers.Keys) - { - if (headers[key] == null) - { - continue; - } - request.SetRequestHeader(key, headers[key]); - } - } - - private string SetRequestData(UnityWebRequest request, T args) - { - string requestJson = ""; - if (typeof(T) == typeof(string)) - { - requestJson = args as string; - } - else - { - requestJson = JsonConvert.SerializeObject(args, serializerSettings); - } - byte[] requestData = Encoding.UTF8.GetBytes(requestJson); - request.uploadHandler = new UploadHandlerRaw(requestData); - request.uploadHandler.contentType = "application/json"; - return requestJson; - } - - public async Task SendRequest(string path, T args, [CanBeNull] Dictionary headers = null, string overrideUrl = null) - { - (UnityWebRequest, string, string) newRequest = BuildRequest(path, args, headers, overrideUrl); - UnityWebRequest request = newRequest.Item1; - string curlRequest = newRequest.Item2; - string url = newRequest.Item3; - SequenceLog.Info($">> {curlRequest}"); - + try { await request.SendWebRequest(); @@ -112,35 +48,12 @@ public async Task SendRequest(string path, T args, [CanBeNull] Dictio throw new Exception($"Error sending request to {url}: {request.responseCode} {request.error}"); } - string responseJson = ""; - if (url.Contains(_waasUrl)) - { - try - { - responseJson = _signatureValidator.ValidateResponse(request); - } - catch (Exception e) - { - throw new Exception("Error validating response: " + e.Message + " Warning: this response may have been tampered with!"); - } - } - else - { - byte[] results = request.downloadHandler.data; - responseJson = Encoding.UTF8.GetString(results); - } - try - { - SequenceLog.Info($"<< {responseJson} (from {url})"); - T2 result = JsonConvert.DeserializeObject(responseJson); - return result; - } - catch (Exception e) - { - throw new Exception( - $"Error unmarshalling response from {url}: {e.Message} | given: {responseJson}"); - } - } + var results = request.downloadHandler.data; + var responseJson = Encoding.UTF8.GetString(results); + + SequenceLog.Info($"<< {responseJson}"); + + return JsonConvert.DeserializeObject(responseJson, _serializerSettings); } catch (HttpRequestException e) { @@ -222,8 +135,7 @@ public async Task SendGetRequest(string path, Dictionary Date: Wed, 6 Aug 2025 22:31:06 +0200 Subject: [PATCH 123/165] transaction test, getting sessions topology from key machine --- .../SequenceEcosystemWalletTests.asmdef | 3 +- .../UnitTests/AuthenticationTests.cs | 15 ++++ .../UnitTests/AuthenticationTests.cs.meta | 3 + .../UnitTests/TransactionTests.cs | 18 +++++ .../UnitTests/TransactionTests.cs.meta | 3 + .../Authentication/SequenceConnect.cs | 6 -- .../Authentication/SequenceWallet.cs | 54 +++++++++++++- .../KeyMachine/KeyMachineApi.cs | 17 ++++- .../EcosystemWallet/KeyMachine/Models/Tree.cs | 18 +++++ .../KeyMachine/Models/Tree.cs.meta | 3 + .../Sessions/ImplicitBlacklistLeaf.cs | 4 +- .../Primitives/Sessions/SessionsTopology.cs | 70 +++++++++++++++++++ 12 files changed, 201 insertions(+), 13 deletions(-) create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs.meta create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs create mode 100644 Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Tree.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Tree.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef b/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef index 5b5c0eb6..e6937e58 100644 --- a/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef +++ b/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef @@ -11,7 +11,8 @@ "GUID:403077141e1554429a890cbc129df651", "GUID:b4f9c0f8f363f439b9e337f79050f189", "GUID:0acc523941302664db1f4e527237feb3", - "GUID:27619889b8ba8c24980f49ee34dbb44a" + "GUID:27619889b8ba8c24980f49ee34dbb44a", + "GUID:94b67778c44684afdab21990eebf60aa" ], "includePlatforms": [ "Editor" diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs new file mode 100644 index 00000000..b16e165f --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs @@ -0,0 +1,15 @@ +using System.Threading.Tasks; +using NUnit.Framework; + +namespace Sequence.EcosystemWallet.UnitTests +{ + public class AuthenticationTests + { + [Test] + public async Task SignInWithGoogle() + { + var connect = new SequenceConnect(Chain.TestnetArbitrumSepolia, EcosystemType.Sequence); + await connect.SignInWithGoogle(); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs.meta new file mode 100644 index 00000000..87a8b46f --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9528213ba51e48989bc98bae2082e360 +timeCreated: 1754509113 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs new file mode 100644 index 00000000..a085d5f9 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs @@ -0,0 +1,18 @@ +using System; +using System.Threading.Tasks; +using NUnit.Framework; +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.UnitTests +{ + public class TransactionTests + { + [Test] + public async Task SendTransaction() + { + var connect = new SequenceConnect(Chain.TestnetArbitrumSepolia, EcosystemType.Sequence); + var wallet = connect.GetWallet(); + await wallet.SendTransaction(Array.Empty()); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs.meta new file mode 100644 index 00000000..45fe7bb9 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 58a0fcc5a82c4662b74858c8630cf708 +timeCreated: 1754511079 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index b8b282c1..a8499ff6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -136,12 +136,6 @@ private async Task CreateNewSession(bool isExplicit, SessionPermi if (!response.Result) throw new Exception("Error during request"); - var keyMachine = new KeyMachineApi(); - var deployResponse = await keyMachine.GetDeployHash(response.Data.walletAddress); - var config = await keyMachine.GetConfiguration(deployResponse.deployHash); - - Debug.Log($"Config: {config.ToJson()}"); - var credentials = new SessionCredentials( isExplicit, _sessionWallet.GetPrivateKeyAsHex(), diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index e11ec40e..c0f846e7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Numerics; using System.Threading.Tasks; using Sequence.EcosystemWallet.Browser; @@ -7,6 +8,7 @@ using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Relayer; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet { @@ -71,6 +73,20 @@ public async Task GetFeeOption(Call[] calls) public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) { + var keyMachine = new KeyMachineApi(); + var deployResponse = await keyMachine.GetDeployHash(Address); + var config = await keyMachine.GetConfiguration(deployResponse.deployHash); + + Debug.Log($"Config: {config.ToJson()}"); + + var signerLeaf = config.topology.FindSignerLeaf(new Address("0x23c2eB9958BcAC9E531E785c4f65e91F1F426142")) as SapientSignerLeaf; + var treeReturn = await keyMachine.GetTree(signerLeaf.imageHash); + var sessionsTopology = SessionsTopology.FromTree(treeReturn.tree.ToString()); + + Debug.Log($"Sessions Topology {sessionsTopology.JsonSerialize()}"); + + return ""; + var signedCalls = await SignCalls(calls); var relayer = new SequenceRelayer(SessionSigners[0].Chain); @@ -133,10 +149,44 @@ private Envelope PrepareTransaction(Call[] calls) private void BuildTransaction(SignedEnvelope envelope) { } + + private async Task SignSapient(Calls calls) + { + if (!calls.isCalls || calls.calls.Length == 0) + throw new Exception("calls is empty"); + + var deployHashReturn = await new KeyMachineApi().GetDeployHash(Address); + var imageHash = deployHashReturn.deployHash; + + var implicitSigners = new List
(); + var explicitSigners = new List
(); + + var signers = FindSignersForCalls(calls); + foreach (var signer in signers) + { + if (signer.IsExplicit) + explicitSigners.Add(signer.Address); + else + implicitSigners.Add(signer.Address); + } + + var sessionSignatures = SessionCallSignature.EncodeSignatures( + null, + null, + explicitSigners.ToArray(), + implicitSigners.ToArray()); + + return new SignatureOfSapientSignerLeaf + { + curType = SignatureOfSapientSignerLeaf.Type.sapient, + address = Address, + data = sessionSignatures + }; + } - private SessionSigner FindSignersForCalls(Calls calls) + private SessionSigner[] FindSignersForCalls(Calls calls) { - return SessionSigners[0]; + return SessionSigners; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs index 2e0630eb..fe8becf7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs @@ -22,13 +22,19 @@ public KeyMachineApi(string host = null) public async Task GetDeployHash(Address walletAddress) { var args = new DeployHashArgs(walletAddress); - return await _httpClient.SendPostRequest("rpc/Sessions/DeployHash", args); + return await SendRequest("DeployHash", args); + } + + public async Task GetTree(string imageHash) + { + var args = new TreeArgs(imageHash); + return await SendRequest("Tree", args); } public async Task GetConfiguration(string imageHash) { var args = new ConfigArgs(imageHash); - var response = await _httpClient.SendPostRequest("rpc/Sessions/Config", args); + var response = await SendRequest("Config", args); var topology = Topology.FromServiceConfigTree(response.config.tree.ToString()); return new Primitives.Config @@ -37,6 +43,11 @@ public async Task GetDeployHash(Address walletAddress) checkpoint = BigInteger.Parse(response.config.checkpoint), topology = topology, }; - } + } + + private async Task SendRequest(string endpoint, TArgs args) + { + return await _httpClient.SendPostRequest("rpc/Sessions/" + endpoint, args); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Tree.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Tree.cs new file mode 100644 index 00000000..fdd37373 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Tree.cs @@ -0,0 +1,18 @@ +namespace Sequence.EcosystemWallet.KeyMachine.Models +{ + internal struct TreeArgs + { + public string imageHash; + + public TreeArgs(string imageHash) + { + this.imageHash = imageHash; + } + } + + internal struct TreeReturn + { + public int version; + public object tree; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Tree.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Tree.cs.meta new file mode 100644 index 00000000..5887f5e0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Tree.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a9f2b46232734225b4555e06653fe14a +timeCreated: 1754507606 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs index 57330e7a..c19cc3f7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs @@ -13,7 +13,9 @@ public override object ToJsonObject() return new { type = ImplicitBlacklistType, - blacklist = blacklist.Select(a => a.Value).ToArray() , + blacklist = blacklist is { Length: <= 0 } ? + blacklist.Select(a => a.Value).ToArray() : + Array.Empty() }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index e867df9e..c7552839 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -6,6 +6,7 @@ using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -179,11 +180,80 @@ public void RemoveFromImplicitBlacklist(Address address) leaf.blacklist = newBlacklist; } + public static SessionLeaf DecodeLeaf(string value) + { + var data = value.HexStringToByteArray(); + if (data.Length == 0) + throw new ArgumentException("Bytes array is empty"); + + var flagBytes = new[] { data[0] }; + var flag = flagBytes.ToInteger(); + + if (flag == FlagBlacklist) + { + var blacklist = new Address[data.Length - 1]; + var index = 0; + + for (int i = 1; i < data.Length; i += 20) + { + byte[] slice = data.Skip(i).Take(20).ToArray(); + blacklist[index] = new Address(slice.ByteArrayToHexStringWithPrefix()); + } + + return new ImplicitBlacklistLeaf + { + blacklist = blacklist + }; + } + + if (flag == FlagIdentitySigner) + { + string identitySigner = data.Skip(1).Take(20).ToArray().ByteArrayToHexStringWithPrefix(); + + return new IdentitySignerLeaf + { + identitySigner = new Address(identitySigner) + }; + } + + if (flag == FlagPermissions) + { + byte[] slice = data.Skip(1).ToArray(); + var permissions = SessionPermissions.Decode(slice); + + return new PermissionLeaf + { + permissions = permissions + }; + } + + throw new Exception("Invalid leaf"); + } + public static SessionsTopology MergeSessionsTopologies(SessionsTopology a, SessionsTopology b) { return new SessionsTopology(new SessionBranch(a, b)); } + public static SessionsTopology FromTree(string tree) + { + if (tree.StartsWith("[")) + { + var list = JsonConvert.DeserializeObject>(tree); + if (list.Count < 2) + throw new Exception("Invalid node structure in JSON"); + + var children = list.Select(i => FromTree(i.ToString())).ToArray(); + return new SessionBranch(children).ToTopology(); + } + + if (tree.StartsWith("0x")) + throw new Exception("Unknown in configuration tree"); + + var data = JsonConvert.DeserializeObject>(tree)["data"]; + return DecodeLeaf(data).ToTopology(); + } + public static SessionsTopology FromJson(string json) { if (json.StartsWith("[")) From c51d9e61bbcf4c60afacf1e8b23e185755c30e11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 7 Aug 2025 12:48:21 +0200 Subject: [PATCH 124/165] started signing calls with sessionSigner --- .../Authentication/SequenceWallet.cs | 68 ++++++++++---- .../Authentication/SessionSigner.cs | 91 +++++++++++++++++++ .../Authentication/WalletState.cs | 39 ++++++++ .../Authentication/WalletState.cs.meta | 3 + .../Primitives/Sessions/SessionsTopology.cs | 32 ++++++- .../Primitives/Topology/TopologyExtensions.cs | 5 + .../Sequence/SequenceSDK/Utils/ArrayUtils.cs | 8 ++ 7 files changed, 227 insertions(+), 19 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index c0f846e7..010502a5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Numerics; using System.Threading.Tasks; using Sequence.EcosystemWallet.Browser; @@ -18,12 +19,15 @@ public class SequenceWallet : IWallet, IDisposable public Address Address { get; } public SessionSigner[] SessionSigners { get; private set; } + + private WalletState _state; internal SequenceWallet(SessionSigner[] sessionSigners) { SessionSigners = sessionSigners; Address = sessionSigners[0].ParentAddress; OnWalletCreated?.Invoke(this); + _state = new WalletState(Address); SequenceConnect.SessionsChanged += SessionsChanged; } @@ -73,17 +77,7 @@ public async Task GetFeeOption(Call[] calls) public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) { - var keyMachine = new KeyMachineApi(); - var deployResponse = await keyMachine.GetDeployHash(Address); - var config = await keyMachine.GetConfiguration(deployResponse.deployHash); - - Debug.Log($"Config: {config.ToJson()}"); - - var signerLeaf = config.topology.FindSignerLeaf(new Address("0x23c2eB9958BcAC9E531E785c4f65e91F1F426142")) as SapientSignerLeaf; - var treeReturn = await keyMachine.GetTree(signerLeaf.imageHash); - var sessionsTopology = SessionsTopology.FromTree(treeReturn.tree.ToString()); - - Debug.Log($"Sessions Topology {sessionsTopology.JsonSerialize()}"); + await _state.Update(); return ""; @@ -150,18 +144,23 @@ private void BuildTransaction(SignedEnvelope envelope) { } - private async Task SignSapient(Calls calls) + private SignatureOfSapientSignerLeaf SignSapient(Calls calls) { if (!calls.isCalls || calls.calls.Length == 0) throw new Exception("calls is empty"); - var deployHashReturn = await new KeyMachineApi().GetDeployHash(Address); - var imageHash = deployHashReturn.deployHash; - var implicitSigners = new List
(); var explicitSigners = new List
(); var signers = FindSignersForCalls(calls); + + var signatures = new SessionCallSignature[signers.Length]; + for (var i = 0; i < signers.Length; i++) + { + var signature = signers[i].SignCall(calls.calls[i], calls.space, calls.nonce); + signatures[i] = signature; + } + foreach (var signer in signers) { if (signer.IsExplicit) @@ -171,8 +170,8 @@ private async Task SignSapient(Calls calls) } var sessionSignatures = SessionCallSignature.EncodeSignatures( - null, - null, + signatures, + _state.SessionsTopology, explicitSigners.ToArray(), implicitSigners.ToArray()); @@ -186,7 +185,40 @@ private async Task SignSapient(Calls calls) private SessionSigner[] FindSignersForCalls(Calls calls) { - return SessionSigners; + var identitySigner = _state.SessionsTopology.GetIdentitySigner(); + if (identitySigner == null) + throw new Exception("identitySigner is null"); + + var blacklist = _state.SessionsTopology.GetImplicitBlacklist(); + if (blacklist == null) + throw new Exception("blacklist is null"); + + var validImplicitSigners = SessionSigners.Where(s => + !s.IsExplicit && + s.IdentitySigner.Equals(identitySigner) && + !blacklist.Contains(s.Address) + ).ToArray(); + + var explicitSigners = _state.SessionsTopology.GetExplicitSigners(); + var validExplicitSigners = SessionSigners + .Where(s => s.IsExplicit && + Array.Exists(explicitSigners, es => es.Equals(s.Address))).ToArray(); + + var availableSigners = ArrayUtils.CombineArrays(validImplicitSigners, validExplicitSigners); + if (availableSigners.Length == 0) + throw new Exception("no valid signers found"); + + var signers = new List(); + foreach (var call in calls.calls) + { + foreach (var signer in availableSigners) + { + if (signer.IsSupportedCall(call)) + signers.Add(signer); + } + } + + return signers.ToArray(); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs index 4a079363..f0bccbe3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs @@ -1,14 +1,37 @@ +using System; +using System.Linq; +using System.Numerics; +using System.Text; +using Nethereum.Util; +using Sequence.ABI; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Signer; +using Sequence.Utils; using Sequence.Wallet; namespace Sequence.EcosystemWallet { public class SessionSigner { + private const string IncrementUsageLimit = + "{\n type: 'function',\n name: 'incrementUsageLimit',\n inputs: [\n {\n name: 'limits',\n type: 'tuple[]',\n internalType: 'struct UsageLimit[]',\n components: [\n { name: 'usageHash', type: 'bytes32', internalType: 'bytes32' },\n { name: 'usageAmount', type: 'uint256', internalType: 'uint256' },\n ],\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n }"; + public Address ParentAddress { get; } public Address Address { get; } public Chain Chain { get; } public bool IsExplicit { get; } + public Address IdentitySigner + { + get + { + if (IsExplicit) + throw new Exception("no identity signer for explicit sessions"); + + return Address; + } + } + private readonly SessionCredentials _credentials; internal SessionSigner(SessionCredentials credentials) @@ -20,5 +43,73 @@ internal SessionSigner(SessionCredentials credentials) Chain = ChainDictionaries.ChainById[credentials.chainId]; IsExplicit = credentials.isExplicit; } + + public bool IsSupportedCall(Call call) + { + if (IsExplicit) + { + if (call.data.Length > 4 && + ByteArrayExtensions.Slice(call.data, 0, 4).ByteArrayToHexStringWithPrefix() == + GetIncrementUsageLimitSelector()) + { + return true; + } + } + + return true; + } + + public Permission FindSupportedPermission(Call call) + { + + } + + public string GetIncrementUsageLimitSelector() + { + string signature = "incrementUsageLimit((bytes32,uint256)[])"; + + var sha3 = new Sha3Keccack(); + var hash = sha3.CalculateHash(Encoding.UTF8.GetBytes(signature)); + + return "0x" + BitConverter.ToString(hash.Take(4).ToArray()).Replace("-", "").ToLowerInvariant(); + } + + public SessionCallSignature SignCall(Call call, BigInteger space, BigInteger nonce) + { + var pvKey = _credentials.privateKey; + var eoaWallet = new EOAWallet(pvKey); + + var hashedCall = HashCallWithReplayProtection(call, space, nonce); + var signedCall = EthSignature.Sign(hashedCall, eoaWallet.privKey); + + var rsy = RSY.Unpack(signedCall.HexStringToByteArray()); + + if (IsExplicit) + { + return new ExplicitSessionCallSignature + { + permissionIndex = 0, + sessionSignature = rsy + }; + } + + return new ImplicitSessionCallSignature + { + attestation = _credentials.attestation, + identitySignature = _credentials.signature, + sessionSignature = rsy + }; + } + + private byte[] HashCallWithReplayProtection(Call call, BigInteger space, BigInteger nonce) + { + var chainBytes = BigInteger.Parse(Chain.GetChainId()).ByteArrayFromNumber(32); + var spaceBytes = space.ByteArrayFromNumber(32); + var nonceBytes = nonce.ByteArrayFromNumber(32); + var callHashBytes = call.Hash().HexStringToByteArray(); + + var concatenated = ByteArrayExtensions.ConcatenateByteArrays(chainBytes, spaceBytes, nonceBytes, callHashBytes); + return SequenceCoder.KeccakHash(concatenated); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs new file mode 100644 index 00000000..466bd8be --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs @@ -0,0 +1,39 @@ +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Primitives; +using UnityEngine; + +namespace Sequence.EcosystemWallet +{ + internal class WalletState + { + public Address Address { get; } + public string ImageHash { get; private set; } + public Primitives.Config Config { get; private set; } + public SessionsTopology SessionsTopology { get; private set; } + + private readonly KeyMachineApi _keyMachine = new(); + + public WalletState(Address address) + { + this.Address = address; + } + + public async Task Update() + { + var deployResponse = await _keyMachine.GetDeployHash(Address); + var config = await _keyMachine.GetConfiguration(deployResponse.deployHash); + + Debug.Log($"Config: {config.ToJson()}"); + + var signerLeaf = config.topology.FindSignerLeaf(new Address("0x23c2eB9958BcAC9E531E785c4f65e91F1F426142")) as SapientSignerLeaf; + var treeReturn = await _keyMachine.GetTree(signerLeaf.imageHash); + var sessionsTopology = SessionsTopology.FromTree(treeReturn.tree.ToString()); + + ImageHash = deployResponse.deployHash; + Config = config; + SessionsTopology = sessionsTopology; + + Debug.Log($"Sessions Topology {sessionsTopology.JsonSerialize()}"); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs.meta new file mode 100644 index 00000000..286bf8d8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c566cfa68d3b474c85a7653570d61f55 +timeCreated: 1754545388 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index c7552839..97e15a82 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -156,9 +156,39 @@ public SessionsTopology RemoveExplicitSession(Address address) return this; } + public Address GetIdentitySigner() + { + return this.FindLeaf()?.identitySigner; + } + + public Address[] GetImplicitBlacklist() + { + return this.FindLeaf().blacklist; + } + + public Address[] GetExplicitSigners() + { + return GetExplicitSigners(Array.Empty
()); + } + + public Address[] GetExplicitSigners(Address[] current) + { + if (this.IsLeaf() && Leaf is PermissionLeaf permissionLeaf) + return current.AddToArray(permissionLeaf.permissions.signer); + + if (this.IsBranch()) + { + var children = (SessionsTopology[])Branch.Children; + foreach (var child in children) + current = child.GetExplicitSigners(current); + } + + return current; + } + public void AddToImplicitBlacklist(Address address) { - var existingLeaf = this.FindLeaf(_ => true); + var existingLeaf = this.FindLeaf(); if (existingLeaf == null) throw new Exception("No blacklist found."); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs index c2ad08af..7369fb26 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs @@ -82,6 +82,11 @@ public static string Hash(this ITopology topology, bool raw = false) throw new Exception("Invalid tree structure"); } + + public static T FindLeaf(this ITopology topology) where T : ILeaf + { + return topology.FindLeaf(_ => true); + } public static T FindLeaf(this ITopology topology, Func check) where T : ILeaf { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs index 110e7cb2..46c2ad84 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs @@ -96,6 +96,14 @@ public static T[] AddToArray(this T[] array, T item) return result; } + public static T[] AddToArray(T[] array1, T[] array2) + { + T[] result = new T[array1.Length + array2.Length]; + Array.Copy(array1, 0, result, 0, array1.Length); + Array.Copy(array2, 0, result, array1.Length, array2.Length); + return result; + } + public static T[] CombineArrays(T[] arr1, T[] arr2) { int length1 = arr1.Length; From 9649f54a3a1ab930b873b652d3e67c060a713515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 8 Aug 2025 16:21:19 +0200 Subject: [PATCH 125/165] testing ASWebAuthenticationSession --- .../UnitTests/TransactionTests.cs | 8 +- .../Sequence-Unity/Plugins/iOS/ASWebAuth.mm | 116 ++++++++++++++++++ .../Plugins/iOS/ASWebAuth.mm.meta | 37 ++++++ .../Authentication/SequenceWallet.cs | 78 +++++++----- .../Authentication/SessionSigner.cs | 10 +- .../Authentication/TransactionData.cs | 14 +++ .../Authentication/TransactionData.cs.meta | 3 + .../EcosystemWallet/Envelope/Envelope.cs | 12 ++ .../Primitives/Sessions/SessionsTopology.cs | 5 + .../Primitives/Signature/SignatureHandler.cs | 4 +- .../RedirectHandler/BrowserRedirectHandler.cs | 2 +- .../DeeplinkRedirectHandler.cs | 5 +- .../RedirectHandler/NativeReceiver.cs | 23 +++- .../RedirectHandler/RedirectHandler.cs | 7 +- ProjectSettings/ProjectSettings.asset | 4 +- 15 files changed, 280 insertions(+), 48 deletions(-) create mode 100644 Packages/Sequence-Unity/Plugins/iOS/ASWebAuth.mm create mode 100644 Packages/Sequence-Unity/Plugins/iOS/ASWebAuth.mm.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs index a085d5f9..39ef784c 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs @@ -12,7 +12,13 @@ public async Task SendTransaction() { var connect = new SequenceConnect(Chain.TestnetArbitrumSepolia, EcosystemType.Sequence); var wallet = connect.GetWallet(); - await wallet.SendTransaction(Array.Empty()); + + var calls = new Call[] + { + new (wallet.Address, 1000, Array.Empty()) + }; + + await wallet.SendTransaction(calls); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Plugins/iOS/ASWebAuth.mm b/Packages/Sequence-Unity/Plugins/iOS/ASWebAuth.mm new file mode 100644 index 00000000..72cb3b23 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/iOS/ASWebAuth.mm @@ -0,0 +1,116 @@ +// ASWebAuth.mm +#import +#import +#import +#import "UnityInterface.h" + +static ASWebAuthenticationSession *g_session = nil; +static char g_gameObject[256] = {0}; +static char g_callbackMethod[256] = {0}; + +@interface ASWebAuthAnchorProvider : NSObject +@end + +@implementation ASWebAuthAnchorProvider +- (ASPresentationAnchor)presentationAnchorForWebAuthenticationSession:(ASWebAuthenticationSession *)session +{ + UIWindow *keyWindow = nil; + + if (@available(iOS 13.0, *)) { + for (UIWindowScene *scene in [UIApplication sharedApplication].connectedScenes) { + if (scene.activationState == UISceneActivationStateForegroundActive) { + for (UIWindow *window in scene.windows) { + if (window.isKeyWindow) { keyWindow = window; break; } + } + if (keyWindow) break; + } + } + } else { + keyWindow = [UIApplication sharedApplication].keyWindow; + } + + return keyWindow ?: [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; +} +@end + +static ASWebAuthAnchorProvider *g_anchorProvider; + +extern "C" { + +static void SendUnityMessage(const char *payload) +{ + UnitySendMessage("SequenceNativeReceiver", "HandleResponse", payload ? payload : ""); +} + +void ASWebAuth_Start(const char *urlCString, const char *callbackSchemeCString) +{ + if (@available(iOS 12.0, *)) { + + NSString *urlStr = urlCString ? [NSString stringWithUTF8String:urlCString] : @""; + NSString *schemeStr = callbackSchemeCString ? [NSString stringWithUTF8String:callbackSchemeCString] : nil; + + dispatch_async(dispatch_get_main_queue(), ^{ + if (g_session) { + [g_session cancel]; + g_session = nil; + } + + NSURL *url = [NSURL URLWithString:urlStr]; + + if (url == nil || urlStr.length == 0) { + NSString *msg = [NSString stringWithFormat:@"ERROR: invalid URL = %@", urlStr ?: @"(null)"]; + SendUnityMessage(msg.UTF8String); + return; + } + + g_anchorProvider = [ASWebAuthAnchorProvider new]; + + g_session = [[ASWebAuthenticationSession alloc] + initWithURL:url + callbackURLScheme:schemeStr + completionHandler:^(NSURL * _Nullable callbackURL, NSError * _Nullable error) { + + if (error) { + // ASWebAuthenticationSessionErrorCodeCanceledLogin == 1 + NSString *msg = [NSString stringWithFormat:@"ERROR:%ld:%@", (long)error.code, error.localizedDescription ?: @"Unknown"]; + SendUnityMessage(msg.UTF8String); + } else if (callbackURL) { + SendUnityMessage(callbackURL.absoluteString.UTF8String); + } else { + SendUnityMessage("ERROR:unknown"); + } + + g_session = nil; + }]; + + if (@available(iOS 13.0, *)) { + g_session.presentationContextProvider = g_anchorProvider; + // Optional: use ephemeral browser session (no shared cookies) + // g_session.prefersEphemeralWebBrowserSession = YES; + } + + BOOL started = [g_session start]; + if (!started) { + SendUnityMessage("ERROR:failed_to_start"); + g_session = nil; + } + }); + } else { + SendUnityMessage("ERROR:iOS_version_unsupported"); + } +} + +void ASWebAuth_Cancel() +{ + if (@available(iOS 12.0, *)) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (g_session) { + [g_session cancel]; + g_session = nil; + SendUnityMessage("CANCELED"); + } + }); + } +} + +} // extern "C" diff --git a/Packages/Sequence-Unity/Plugins/iOS/ASWebAuth.mm.meta b/Packages/Sequence-Unity/Plugins/iOS/ASWebAuth.mm.meta new file mode 100644 index 00000000..ec134da8 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/iOS/ASWebAuth.mm.meta @@ -0,0 +1,37 @@ +fileFormatVersion: 2 +guid: 8503f684e6c24eef8ab81645d71b5238 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: {} + - first: + tvOS: tvOS + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index 010502a5..0b1c1ff4 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -3,18 +3,22 @@ using System.Linq; using System.Numerics; using System.Threading.Tasks; +using Nethereum.ABI.FunctionEncoding; +using Nethereum.ABI.Model; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Relayer; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet { public class SequenceWallet : IWallet, IDisposable { + private const string ExecuteAbiSelector = + "function execute(bytes calldata _payload, bytes calldata _signature) external"; + public static Action OnWalletCreated; public Address Address { get; } @@ -66,7 +70,7 @@ public async Task SignMessage(string message) public async Task GetFeeOption(Call[] calls) { - var signedCalls = await SignCalls(calls); + var signedCalls = SignCalls(calls); var relayer = new SequenceRelayer(SessionSigners[0].Chain); var args = new FeeOptionsArgs(Address, signedCalls.To, signedCalls.Data); @@ -78,13 +82,10 @@ public async Task GetFeeOption(Call[] calls) public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) { await _state.Update(); - - return ""; - - var signedCalls = await SignCalls(calls); + var transactionData = SignCalls(calls); var relayer = new SequenceRelayer(SessionSigners[0].Chain); - var hash = await relayer.Relay(signedCalls.To, signedCalls.Data.ByteArrayToHexStringWithPrefix()); + var hash = await relayer.Relay(transactionData.To, transactionData.Data.ByteArrayToHexStringWithPrefix()); MetaTxnReceipt receipt = null; var status = OperationStatus.Pending; @@ -102,25 +103,47 @@ public async Task SendTransaction(Call[] calls, FeeOption feeOption = nu return receipt.txnReceipt; } - private async Task<(Address To, byte[] Data)> SignCalls(Call[] calls) + private TransactionData SignCalls(Call[] calls) { - /* - * 1. Prepare Increment, add the increment to the calls array - * 2. - */ - var preparedIncrement = PrepareIncrement(null, 2, null); if (preparedIncrement != null) calls.AddToArray(preparedIncrement); var envelope = PrepareTransaction(calls); - var parentedEnvelope = new Parented(new [] { Address }, envelope.payload); - - // Get Image hash - // sign sapient + var signature = SignSapient(envelope); + var sapientSignature = new SapientSignature + { + imageHash = _state.ImageHash, + signature = signature + }; + + var signedEnvelope = envelope.ToSigned(sapientSignature); + + var rawSignature = SignatureHandler.EncodeSignature(signedEnvelope); + + var deployed = true; + if (deployed) + { + var function = new FunctionABI("deploy", false); + function.InputParameters = new[] + { + new Parameter("bytes", "_payload"), + new Parameter("bytes", "_signature") + }; + + var encoder = new FunctionCallEncoder(); + + return new TransactionData + { + To = Address, + Data = encoder.EncodeRequest(function.Sha3Signature, Array.Empty(), + envelope.payload.Encode(), + rawSignature.Encode()).HexStringToByteArray() + }; + } - throw new System.NotImplementedException(); + return new TransactionData(new Address(""), envelope.payload.Encode()); } private Call PrepareIncrement(Address wallet, BigInteger chainId, Calls calls) @@ -135,18 +158,15 @@ private Envelope PrepareTransaction(Call[] calls) return new Envelope { - wallet = null, + wallet = Address, payload = new Calls(space, nonce, calls) }; } - private void BuildTransaction(SignedEnvelope envelope) - { - } - - private SignatureOfSapientSignerLeaf SignSapient(Calls calls) + private SignatureOfSapientSignerLeaf SignSapient(Envelope envelope) { - if (!calls.isCalls || calls.calls.Length == 0) + var calls = envelope.payload.calls; + if (calls.Length == 0) throw new Exception("calls is empty"); var implicitSigners = new List
(); @@ -157,7 +177,7 @@ private SignatureOfSapientSignerLeaf SignSapient(Calls calls) var signatures = new SessionCallSignature[signers.Length]; for (var i = 0; i < signers.Length; i++) { - var signature = signers[i].SignCall(calls.calls[i], calls.space, calls.nonce); + var signature = signers[i].SignCall(calls[i], envelope.payload.space, envelope.payload.nonce); signatures[i] = signature; } @@ -183,7 +203,7 @@ private SignatureOfSapientSignerLeaf SignSapient(Calls calls) }; } - private SessionSigner[] FindSignersForCalls(Calls calls) + private SessionSigner[] FindSignersForCalls(Call[] calls) { var identitySigner = _state.SessionsTopology.GetIdentitySigner(); if (identitySigner == null) @@ -209,11 +229,11 @@ private SessionSigner[] FindSignersForCalls(Calls calls) throw new Exception("no valid signers found"); var signers = new List(); - foreach (var call in calls.calls) + foreach (var call in calls) { foreach (var signer in availableSigners) { - if (signer.IsSupportedCall(call)) + if (signer.IsSupportedCall(call, _state.SessionsTopology)) signers.Add(signer); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs index f0bccbe3..be771444 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs @@ -44,7 +44,7 @@ internal SessionSigner(SessionCredentials credentials) IsExplicit = credentials.isExplicit; } - public bool IsSupportedCall(Call call) + public bool IsSupportedCall(Call call, SessionsTopology topology) { if (IsExplicit) { @@ -54,14 +54,18 @@ public bool IsSupportedCall(Call call) { return true; } + + var permission = FindSupportedPermission(call, topology); + return true; } return true; } - public Permission FindSupportedPermission(Call call) + public Permission FindSupportedPermission(Call call, SessionsTopology topology) { - + var permissions = topology.GetPermissions()?.permissions; + return permissions is {Length: > 0} ? permissions[0] : null; } public string GetIncrementUsageLimitSelector() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs new file mode 100644 index 00000000..2baa2c1c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs @@ -0,0 +1,14 @@ +namespace Sequence.EcosystemWallet +{ + public struct TransactionData + { + public Address To; + public byte[] Data; + + public TransactionData(Address to, byte[] data) + { + To = to; + Data = data; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs.meta new file mode 100644 index 00000000..e79d23fa --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a0ba80adbd0245f092953dfac6e847cc +timeCreated: 1754566046 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Envelope.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Envelope.cs index 3096a76a..ad524ef5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Envelope.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Envelope.cs @@ -9,5 +9,17 @@ public class Envelope where T : Payload public BigInteger chainId; public Primitives.Config configuration; public T payload; + + public SignedEnvelope ToSigned(EnvelopeSignature signature) + { + return new SignedEnvelope + { + wallet = wallet, + chainId = chainId, + configuration = configuration, + payload = payload, + signatures = new[] { signature }, + }; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index 97e15a82..fe2f4042 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -165,6 +165,11 @@ public Address[] GetImplicitBlacklist() { return this.FindLeaf().blacklist; } + + public SessionPermissions GetPermissions() + { + return this.FindLeaf().permissions; + } public Address[] GetExplicitSigners() { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs index 53225a48..bae91fce 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs @@ -65,7 +65,7 @@ leaf is AnyAddressSubdigestLeaf || throw new Exception("Invalid topology"); } - public static RawSignature EncodeSignature(SignedEnvelope envelope) + public static RawSignature EncodeSignature(SignedEnvelope envelope) { var topology = FillLeaves(envelope.configuration.topology, leaf => SignatureForLeaf(envelope, leaf)); @@ -83,7 +83,7 @@ public static RawSignature EncodeSignature(SignedEnvelope envelope) }; } - public static EnvelopeSignature SignatureForLeaf(SignedEnvelope envelope, Leaf leaf) + public static EnvelopeSignature SignatureForLeaf(SignedEnvelope envelope, Leaf leaf) { if (leaf is SignerLeaf signerLeaf) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs index b2e92940..82195fa8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs @@ -32,7 +32,7 @@ private class ResponseData var go = new GameObject("SequenceNativeReceiver"); _receiver = go.AddComponent(); - var response = await _receiver.WaitForResponse(JsonConvert.SerializeObject(new {url, action, payload})); + var response = await _receiver.WaitForResponse(JsonConvert.SerializeObject(new {url, action, payload}), RedirectUrl); GameObject.Destroy(_receiver.gameObject); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/DeeplinkRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/DeeplinkRedirectHandler.cs index 55f2aa93..5d5d0f6e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/DeeplinkRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/DeeplinkRedirectHandler.cs @@ -16,9 +16,12 @@ internal class DeeplinkRedirectHandler : RedirectHandler var go = new GameObject("SequenceNativeReceiver"); _receiver = go.AddComponent(); - var response = await _receiver.WaitForResponse(ConstructUrl(url, action, payload)); + var response = await _receiver.WaitForResponse(ConstructUrl(url, action, payload), RedirectUrl); GameObject.Destroy(_receiver.gameObject); + + if (!response.Contains(RedirectUrl)) + throw new Exception(response); var data = response.ExtractQueryAndHashParameters(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs index 676e76d9..558831ae 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs @@ -6,6 +6,7 @@ namespace Sequence.EcosystemWallet.Browser { internal class NativeReceiver : MonoBehaviour { + private string _redirectUrl; private string _response; private void Awake() @@ -20,11 +21,16 @@ private void OnDestroy() public void HandleResponse(string response) { + Debug.Log($"Received response from native plugin: {response}"); + _response = response; } - public async Task WaitForResponse(string url) + public async Task WaitForResponse(string url, string redirectUrl) { + Debug.Log($"Opening URL {url}"); + + _redirectUrl = redirectUrl.Replace("://", ""); OpenWalletApp(url); while (string.IsNullOrEmpty(_response)) @@ -32,10 +38,21 @@ public async Task WaitForResponse(string url) return _response; } - -#if !UNITY_EDITOR && (UNITY_WEBGL || UNITY_IOS) + +#if !UNITY_EDITOR && (UNITY_WEBGL) [System.Runtime.InteropServices.DllImport("__Internal")] private static extern void OpenWalletApp(string url); +#elif !UNITY_EDITOR && UNITY_IOS + private void OpenWalletApp(string url) + { + ASWebAuth_Start(url, _redirectUrl); + } + + [System.Runtime.InteropServices.DllImport("__Internal")] + private static extern void ASWebAuth_Start(string url, string callbackScheme); + + [System.Runtime.InteropServices.DllImport("__Internal")] + private static extern void ASWebAuth_Cancel(); #else private static void OpenWalletApp(string url) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs index 6cc3d6eb..eec25a7d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs @@ -21,12 +21,7 @@ protected string ConstructUrl(string url, string action, TPayload payl { var serializedPayload = JsonConvert.SerializeObject(payload); var encodedPayload = Convert.ToBase64String(Encoding.UTF8.GetBytes(serializedPayload)); - var finalUrl = $"{url}?action={action}&payload={encodedPayload}&id={Id}&mode=redirect"; - - if (!string.IsNullOrEmpty(RedirectUrl)) - finalUrl += $"&redirectUrl={RedirectUrl}"; - - return finalUrl; + return $"{url}?action={action}&payload={encodedPayload}&id={Id}&mode=redirect&redirectUrl={RedirectUrl}"; } } } \ No newline at end of file diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 07f5952c..af72a470 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -159,12 +159,12 @@ PlayerSettings: applicationIdentifier: Android: com.HorizonGames.demounitygame Standalone: com.HorizonGames.demo-unity-game - iPhone: com.HorizonGames.demo-unity-game + iPhone: com.HorizonGames.demo-unity-game2 buildNumber: Standalone: 0 iPhone: 0 tvOS: 0 - overrideDefaultApplicationIdentifier: 0 + overrideDefaultApplicationIdentifier: 1 AndroidBundleVersionCode: 1 AndroidMinSdkVersion: 22 AndroidTargetSdkVersion: 34 From 9cc6ec2f299d0e907f7f2e800fdc44129b53fe33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 8 Aug 2025 18:07:48 +0200 Subject: [PATCH 126/165] create identity signer address --- .../Authentication/SequenceWallet.cs | 3 +- .../Authentication/SessionSigner.cs | 9 +- .../EcosystemWallet/CryptoHelpers.cs | 102 ++++++++++++++++++ .../EcosystemWallet/CryptoHelpers.cs.meta | 3 + .../Primitives/Signature/RSY.cs | 16 ++- .../Primitives/Signature/SignatureHandler.cs | 2 +- .../SequenceSDK/Relayer/SequenceRelayer.cs | 1 + 7 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index 0b1c1ff4..0175c9ca 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -137,7 +137,7 @@ private TransactionData SignCalls(Call[] calls) return new TransactionData { To = Address, - Data = encoder.EncodeRequest(function.Sha3Signature, Array.Empty(), + Data = encoder.EncodeRequest(function.Sha3Signature, function.InputParameters, envelope.payload.Encode(), rawSignature.Encode()).HexStringToByteArray() }; @@ -159,6 +159,7 @@ private Envelope PrepareTransaction(Call[] calls) return new Envelope { wallet = Address, + configuration = _state.Config, payload = new Calls(space, nonce, calls) }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs index be771444..9662eb13 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs @@ -28,7 +28,12 @@ public Address IdentitySigner if (IsExplicit) throw new Exception("no identity signer for explicit sessions"); - return Address; + var attestationHash = _credentials.attestation.Hash(); + var pub = EthCrypto.RecoverPublicKey(_credentials.signature.Pack(), attestationHash); + var pubXY = EthCrypto.PublicKeyXY(pub); + var address = EthCrypto.AddressFromPublicKey(pubXY); + + return new Address(address); } } @@ -86,7 +91,7 @@ public SessionCallSignature SignCall(Call call, BigInteger space, BigInteger non var hashedCall = HashCallWithReplayProtection(call, space, nonce); var signedCall = EthSignature.Sign(hashedCall, eoaWallet.privKey); - var rsy = RSY.Unpack(signedCall.HexStringToByteArray()); + var rsy = RSY.UnpackFrom65(signedCall.HexStringToByteArray()); if (IsExplicit) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs new file mode 100644 index 00000000..a5f1a991 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs @@ -0,0 +1,102 @@ +using System; +using System.Linq; +using System.Text; +using Org.BouncyCastle.Crypto.Digests; +using NBitcoin.Secp256k1; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet +{ + public static class EthCrypto + { + /// + /// Recover an ECPubKey from (r,s,yParity) and a 32-byte payload hash. + /// - r, s: 32-byte big-endian + /// - yParity: 0 or 1 (normalize 27/28 or EIP-155 before calling) + /// - payloadHash32: the exact 32-byte digest that was signed + /// + public static ECPubKey RecoverPublicKey(byte[] r, byte[] s, int v, byte[] msg32) + { + if (r?.Length != 32 || s?.Length != 32) throw new ArgumentException("r and s must be 32 bytes."); + if (msg32?.Length != 32) throw new ArgumentException("msg32 must be 32 bytes."); + + // Normalize v → recId 0/1 + int recId = v >= 35 ? ((v - 35) % 2) : (v >= 27 ? v - 27 : v); + if (recId is < 0 or > 1) throw new ArgumentException("Invalid recovery id (v)."); + + var compact = r.Concat(s).ToArray(); // r||s + + if (!SecpRecoverableECDSASignature.TryCreateFromCompact(compact, recId, out var recSig)) + throw new InvalidOperationException("Failed to create recoverable signature."); + + var ctx = Context.Instance; + + if (!ECPubKey.TryRecover(ctx, recSig, msg32, out var pubKey)) + throw new InvalidOperationException("Public key recovery failed."); + + return pubKey; + } + + public static ECPubKey RecoverPublicKey(byte[] sig, byte[] payloadHash32) + { + var rsy = RSY.Unpack(sig); + var r = rsy.r.Value.ByteArrayFromNumber(); + var s = rsy.s.Value.ByteArrayFromNumber(); + var v = rsy.yParity + 27; + + return RecoverPublicKey(r, s, v, payloadHash32); + } + + /// + /// If you want X||Y (64 bytes) like many JS libs return. + /// + public static byte[] PublicKeyXY(ECPubKey pubKey) + { + var uncompressed = pubKey.ToBytes(false); // 0x04||X||Y + return uncompressed.Skip(1).ToArray(); // drop 0x04 → 64 bytes + } + + // Compute EIP-55 address from 64-byte pubkey (X||Y) + public static string AddressFromPublicKey(byte[] pubkeyXY64) + { + if (pubkeyXY64 == null || pubkeyXY64.Length != 64) throw new ArgumentException("pubkey must be 64 bytes"); + + // keccak256 of pubkey (no 0x04), take last 20 bytes + var keccak = Keccak256(pubkeyXY64); + var addrBytes = keccak.Skip(12).ToArray(); // last 20 bytes + var hexLower = "0x" + BytesToHex(addrBytes).ToLowerInvariant(); + return ToEip55Checksum(hexLower); + } + + private static byte[] Keccak256(byte[] data) + { + var d = new KeccakDigest(256); + d.BlockUpdate(data, 0, data.Length); + var output = new byte[32]; + d.DoFinal(output, 0); + return output; + } + + private static string BytesToHex(byte[] bytes) => + string.Concat(bytes.Select(b => b.ToString("x2"))); + + // EIP-55 checksum casing + private static string ToEip55Checksum(string hexWith0xLower) + { + var hex = hexWith0xLower.StartsWith("0x", StringComparison.OrdinalIgnoreCase) + ? hexWith0xLower.Substring(2) + : hexWith0xLower; + + var hash = Keccak256(Encoding.ASCII.GetBytes(hex)).Select(b => b.ToString("x2")).Aggregate(string.Concat); + var sb = new StringBuilder("0x", 42); + for (int i = 0; i < hex.Length; i++) + { + char c = hex[i]; + int nibble = int.Parse(hash[i].ToString(), System.Globalization.NumberStyles.HexNumber); + sb.Append((nibble >= 8) ? char.ToUpperInvariant(c) : c); + } + return sb.ToString(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs.meta new file mode 100644 index 00000000..1145ead6 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 87ea398bebc24825b03a0be165255856 +timeCreated: 1754666396 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs index ecc5bb1e..c6258fd1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs @@ -47,7 +47,7 @@ public static RSY FromString(string input) public static RSY Unpack(byte[] rsy) { if (rsy.Length != 64) - throw new ArgumentException("RSY must be exactly 64 bytes"); + throw new ArgumentException($"RSY must be exactly 64 bytes ({rsy.Length})"); var r = rsy[..32].ToBigInteger(); @@ -67,6 +67,20 @@ public static RSY Unpack(byte[] rsy) }; } + public static RSY UnpackFrom65(byte[] sig65) + { + var r = sig65.AsSpan(0, 32).ToArray(); + var s = sig65.AsSpan(32, 32).ToArray(); + var v = sig65[64]; + + return new RSY + { + r = r.ToBigInteger(), + s = s.ToBigInteger(), + yParity = VToYParity(v) + }; + } + public static int VToYParity(BigInteger v) { if (v == 27) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs index bae91fce..e3a23ded 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs @@ -78,7 +78,7 @@ public static RawSignature EncodeSignature(SignedEnvelope envelope) threshold = envelope.configuration.threshold, checkpoint = envelope.configuration.checkpoint, checkpointer = envelope.configuration.checkpointer, - topology = null, + topology = topology, } }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs index 68dce8c3..a840f633 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs @@ -14,6 +14,7 @@ public SequenceRelayer(Chain chain) var name = chain switch { Chain.ArbitrumOne => "v3-arbitrum", + Chain.TestnetArbitrumSepolia => "v3-arbitrum-sepolia", _ => throw new NotSupportedException($"Chain {chain} not supported.") }; From c5a61f6768b2be20564c99ada6b374422fd48dd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Sat, 9 Aug 2025 10:36:50 +0200 Subject: [PATCH 127/165] get nonce from node, test to get fee options --- .../UnitTests/TransactionTests.cs | 23 +++++++--- .../Authentication/RedirectOrigin.cs | 2 +- .../Authentication/SequenceWallet.cs | 17 +++----- .../Authentication/SessionSigner.cs | 12 +----- .../Authentication/SessionTemplates.cs | 9 +--- .../Authentication/WalletState.cs | 34 +++++++++++++++ .../EcosystemWallet/CryptoHelpers.cs | 10 ++++- .../EcosystemWallet/Utils/Erc6492Helper.cs | 2 +- .../Ethereum/Provider/HttpRpcClient.cs | 4 +- .../Relayer/DataTypes/FeeOptionsArgs.cs | 4 +- .../Relayer/DataTypes/SendMetaTxnArgs.cs | 43 +++++++++++++++++++ .../SequenceSDK/Relayer/SequenceRelayer.cs | 9 ++-- 12 files changed, 124 insertions(+), 45 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs index 39ef784c..262aa669 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs @@ -1,24 +1,33 @@ -using System; using System.Threading.Tasks; using NUnit.Framework; using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; namespace Sequence.EcosystemWallet.UnitTests { public class TransactionTests { + private static readonly Call[] ImplicitCalls = new Call[] + { + new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, EthCrypto.HashFunctionSelector("selfExecute()").HexStringToByteArray()) + }; + [Test] public async Task SendTransaction() { var connect = new SequenceConnect(Chain.TestnetArbitrumSepolia, EcosystemType.Sequence); var wallet = connect.GetWallet(); - var calls = new Call[] - { - new (wallet.Address, 1000, Array.Empty()) - }; - - await wallet.SendTransaction(calls); + await wallet.SendTransaction(ImplicitCalls); + } + + [Test] + public async Task GetFeeOptions() + { + var connect = new SequenceConnect(Chain.TestnetArbitrumSepolia, EcosystemType.Sequence); + var wallet = connect.GetWallet(); + + await wallet.GetFeeOption(ImplicitCalls); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs index 4742e50a..683c55f0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs @@ -29,7 +29,7 @@ public static string GetOriginString() private static int GetAvailablePort() { - var tcpListener = new TcpListener(IPAddress.Loopback, 0); + var tcpListener = new TcpListener(IPAddress.Loopback, 4444); tcpListener.Start(); var port = ((IPEndPoint)tcpListener.LocalEndpoint).Port; tcpListener.Stop(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index 0175c9ca..e974a3dc 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -70,10 +70,11 @@ public async Task SignMessage(string message) public async Task GetFeeOption(Call[] calls) { - var signedCalls = SignCalls(calls); + await _state.Update(); + var transactionData = SignCalls(calls); var relayer = new SequenceRelayer(SessionSigners[0].Chain); - var args = new FeeOptionsArgs(Address, signedCalls.To, signedCalls.Data); + var args = new FeeOptionsArgs(Address, transactionData.To, transactionData.Data.ByteArrayToHexStringWithPrefix()); var response = await relayer.GetFeeOptions(args); return response.options; @@ -122,10 +123,9 @@ private TransactionData SignCalls(Call[] calls) var rawSignature = SignatureHandler.EncodeSignature(signedEnvelope); - var deployed = true; - if (deployed) + if (_state.IsDeployed) { - var function = new FunctionABI("deploy", false); + var function = new FunctionABI("execute", false); function.InputParameters = new[] { new Parameter("bytes", "_payload"), @@ -143,7 +143,7 @@ private TransactionData SignCalls(Call[] calls) }; } - return new TransactionData(new Address(""), envelope.payload.Encode()); + throw new Exception("wallet status is not deployed"); } private Call PrepareIncrement(Address wallet, BigInteger chainId, Calls calls) @@ -153,14 +153,11 @@ private Call PrepareIncrement(Address wallet, BigInteger chainId, Calls calls) private Envelope PrepareTransaction(Call[] calls) { - var space = 0; - var nonce = 0; - return new Envelope { wallet = Address, configuration = _state.Config, - payload = new Calls(space, nonce, calls) + payload = new Calls(0, _state.Nonce, calls) }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs index 9662eb13..39b886e3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs @@ -55,7 +55,7 @@ public bool IsSupportedCall(Call call, SessionsTopology topology) { if (call.data.Length > 4 && ByteArrayExtensions.Slice(call.data, 0, 4).ByteArrayToHexStringWithPrefix() == - GetIncrementUsageLimitSelector()) + EthCrypto.HashFunctionSelector("incrementUsageLimit((bytes32,uint256)[])")) { return true; } @@ -72,16 +72,6 @@ public Permission FindSupportedPermission(Call call, SessionsTopology topology) var permissions = topology.GetPermissions()?.permissions; return permissions is {Length: > 0} ? permissions[0] : null; } - - public string GetIncrementUsageLimitSelector() - { - string signature = "incrementUsageLimit((bytes32,uint256)[])"; - - var sha3 = new Sha3Keccack(); - var hash = sha3.CalculateHash(Encoding.UTF8.GetBytes(signature)); - - return "0x" + BitConverter.ToString(hash.Take(4).ToArray()).Replace("-", "").ToLowerInvariant(); - } public SessionCallSignature SignCall(Call call, BigInteger space, BigInteger nonce) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs index 82057963..1cd0873b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs @@ -34,19 +34,12 @@ public SessionPermissions BuildBasicRestrictivePermissions() var sessionBuilder = new SessionBuilder(_chain, signer, 0, deadline); sessionBuilder.AddPermission(target, false, ParameterOperation.equal, - HashFunctionSelector("explicitEmit()"), 0, ParameterRule.SelectorMask); + EthCrypto.HashFunctionSelector("explicitEmit()"), 0, ParameterRule.SelectorMask); sessionBuilder.AddPermission(target, true, ParameterOperation.greaterThanOrEqual, "0x1234567890123456789012345678901234567890", 4, ParameterRule.Uint256Mask); return sessionBuilder.GetPermissions(); } - - private string HashFunctionSelector(string function) - { - var sha3 = new Sha3Keccack(); - var hash = sha3.CalculateHash(function); - return "0x" + hash.Substring(0, 8); - } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs index 466bd8be..54ba0d97 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs @@ -1,5 +1,10 @@ +using System; +using System.Numerics; using System.Threading.Tasks; +using Nethereum.ABI.FunctionEncoding; +using Nethereum.ABI.Model; using Sequence.EcosystemWallet.Primitives; +using Sequence.Provider; using UnityEngine; namespace Sequence.EcosystemWallet @@ -8,6 +13,8 @@ internal class WalletState { public Address Address { get; } public string ImageHash { get; private set; } + public bool IsDeployed { get; private set; } = true; // At what condition is this false? + public BigInteger Nonce { get; private set; } public Primitives.Config Config { get; private set; } public SessionsTopology SessionsTopology { get; private set; } @@ -25,6 +32,7 @@ public async Task Update() Debug.Log($"Config: {config.ToJson()}"); + // Why this signer leaf? var signerLeaf = config.topology.FindSignerLeaf(new Address("0x23c2eB9958BcAC9E531E785c4f65e91F1F426142")) as SapientSignerLeaf; var treeReturn = await _keyMachine.GetTree(signerLeaf.imageHash); var sessionsTopology = SessionsTopology.FromTree(treeReturn.tree.ToString()); @@ -34,6 +42,32 @@ public async Task Update() SessionsTopology = sessionsTopology; Debug.Log($"Sessions Topology {sessionsTopology.JsonSerialize()}"); + + await UpdateNonce(0); + } + + public async Task UpdateNonce(BigInteger space) + { + var function = new FunctionABI("readNonce", false) + { + InputParameters = new[] + { + new Parameter("uint256", "_space") + } + }; + + var encoder = new FunctionCallEncoder(); + var encodedRequest = encoder.EncodeRequest(function.Sha3Signature, function.InputParameters, space); + + var response = await new SequenceEthClient(Chain.TestnetArbitrumSepolia).CallContract(new object[] { + new + { + Address, + encodedRequest + } + }); + + Nonce = response == "0x" ? 0 : BigInteger.Parse(response); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs index a5f1a991..6d133f11 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs @@ -3,6 +3,7 @@ using System.Text; using Org.BouncyCastle.Crypto.Digests; using NBitcoin.Secp256k1; +using Nethereum.Util; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; @@ -10,7 +11,14 @@ namespace Sequence.EcosystemWallet { public static class EthCrypto { - /// + public static string HashFunctionSelector(string function) + { + var sha3 = new Sha3Keccack(); + var hash = sha3.CalculateHash(function); + return "0x" + hash.Substring(0, 8); + } + + /// /// Recover an ECPubKey from (r,s,yParity) and a 32-byte payload hash. /// - r, s: 32-byte big-endian /// - yParity: 0 or 1 (normalize 27/28 or EIP-155 before calling) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs index 7bafae3c..32d52d9f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs @@ -38,7 +38,7 @@ private static string EncodeDeploy(string stage1, string deployHash) }; var encoder = new FunctionCallEncoder(); - return encoder.EncodeRequest(function.Sha3Signature, Array.Empty(), stage1, deployHash.HexToByteArray()); + return encoder.EncodeRequest(function.Sha3Signature, function.InputParameters, stage1, deployHash.HexToByteArray()); } public static byte[] Wrap(byte[] signature, Address to, byte[] data) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Provider/HttpRpcClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Provider/HttpRpcClient.cs index dd57fc7e..224d9350 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Provider/HttpRpcClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Provider/HttpRpcClient.cs @@ -52,7 +52,7 @@ public async Task SendRequest(string requestJson) string curlRequest = $"curl -X {request.method} '{_url}' -H 'Content-Type: {request.GetRequestHeader("Content-Type")}' -H 'Accept: {request.GetRequestHeader("Accept")}' -H 'X-Access-Key: {request.GetRequestHeader("X-Access-Key")}' -d '{requestJson}'"; - SequenceLog.Info(curlRequest); + SequenceLog.Info($">> {curlRequest}"); try { @@ -67,6 +67,8 @@ public async Task SendRequest(string requestJson) byte[] results = request.downloadHandler.data; request.Dispose(); var responseJson = Encoding.UTF8.GetString(results); + + SequenceLog.Info($"<< {responseJson}"); try { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs index a79197ca..0fa7af86 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs @@ -4,10 +4,10 @@ public class FeeOptionsArgs { public Address wallet; public string to; - public byte[] data; + public string data; public bool simulate; - public FeeOptionsArgs(Address wallet, string to, byte[] data, bool simulate = false) + public FeeOptionsArgs(Address wallet, string to, string data, bool simulate = false) { this.wallet = wallet; this.to = to; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnArgs.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnArgs.cs index 68823b8f..9a3d0ded 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnArgs.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnArgs.cs @@ -1,5 +1,11 @@ +using System; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using UnityEngine.Scripting; + namespace Sequence.Relayer { + [JsonConverter(typeof(SessionCredentialsConverter))] public class SendMetaTxnArgs { public MetaTxn call; @@ -15,4 +21,41 @@ public SendMetaTxnArgs(MetaTxn call, string quote = null, int projectID = -1, In this.preconditions = preconditions; } } + + [Preserve] + internal class SessionCredentialsConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, SendMetaTxnArgs value, JsonSerializer serializer) + { + writer.WriteStartObject(); + + writer.WritePropertyName("call"); + serializer.Serialize(writer, value.call); + + if (!string.IsNullOrEmpty(value.quote)) + { + writer.WritePropertyName("quote"); + writer.WriteValue(value.quote); + } + + if (value.projectID != -1) + { + writer.WritePropertyName("projectID"); + writer.WriteValue(value.quote); + } + + if (value.preconditions != null) + { + writer.WritePropertyName("preconditions"); + serializer.Serialize(writer, value.preconditions); + } + + writer.WriteEndObject(); + } + + public override SendMetaTxnArgs ReadJson(JsonReader reader, Type objectType, SendMetaTxnArgs existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return null; + } + } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs index a840f633..d880760f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs @@ -1,6 +1,8 @@ using System; +using System.Collections.Generic; using System.Numerics; using System.Threading.Tasks; +using Sequence.Config; using Sequence.Utils; namespace Sequence.Relayer @@ -8,6 +10,7 @@ namespace Sequence.Relayer public class SequenceRelayer : IRelayer { private readonly IHttpClient _httpClient; + private readonly Dictionary _headers = new(); public SequenceRelayer(Chain chain) { @@ -30,18 +33,18 @@ public async Task Relay(Address to, string data, string quote = null, In public async Task GetFeeOptions(FeeOptionsArgs args) { - return await _httpClient.SendPostRequest("FeeOptions", args); + return await _httpClient.SendPostRequest("FeeOptions", args, _headers); } public async Task GetMetaTxnReceipt(string metaTxnID) { var args = new GetMetaTxnReceiptArgs { metaTxnID = metaTxnID }; - return await _httpClient.SendPostRequest("GetMetaTxnReceipt", args); + return await _httpClient.SendPostRequest("GetMetaTxnReceipt", args, _headers); } public async Task SendMetaTxn(SendMetaTxnArgs args) { - return await _httpClient.SendPostRequest("SendMetaTxn", args); + return await _httpClient.SendPostRequest("SendMetaTxn", args, _headers); } } } \ No newline at end of file From e10dbe08b837d365ddc81efabe105e1af5a6ef08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Sat, 9 Aug 2025 16:03:37 +0200 Subject: [PATCH 128/165] get config updates from key machine, more updates --- .../UnitTests/TransactionTests.cs | 2 +- .../Authentication/SequenceWallet.cs | 16 ++++++++-- .../Authentication/SessionSigner.cs | 3 ++ .../Authentication/WalletState.cs | 30 ++++++++++++------- .../Envelope/SapientSignature.cs | 8 ++++- .../EcosystemWallet/Envelope/Signature.cs | 2 +- .../KeyMachine/KeyMachineApi.cs | 6 ++++ .../KeyMachine/Models/ConfigUpdates.cs | 25 ++++++++++++++++ .../KeyMachine/Models/ConfigUpdates.cs.meta | 3 ++ .../Primitives/Config/SapientSignerLeaf.cs | 5 ++++ .../Permission/SessionPermissions.cs | 3 -- .../Sessions/SessionCallSignature.cs | 2 -- .../Primitives/Signature/SignatureHandler.cs | 6 ++++ 13 files changed, 91 insertions(+), 20 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/ConfigUpdates.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/ConfigUpdates.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs index 262aa669..161d267c 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs @@ -9,7 +9,7 @@ public class TransactionTests { private static readonly Call[] ImplicitCalls = new Call[] { - new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, EthCrypto.HashFunctionSelector("selfExecute()").HexStringToByteArray()) + new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, EthCrypto.HashFunctionSelector("implicitEmit()").HexStringToByteArray()) }; [Test] diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index e974a3dc..9ed7894d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -5,12 +5,14 @@ using System.Threading.Tasks; using Nethereum.ABI.FunctionEncoding; using Nethereum.ABI.Model; +using Newtonsoft.Json; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Relayer; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet { @@ -82,6 +84,8 @@ public async Task GetFeeOption(Call[] calls) public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) { + Debug.Log($"{calls[0].ToString()}"); + await _state.Update(); var transactionData = SignCalls(calls); @@ -115,11 +119,19 @@ private TransactionData SignCalls(Call[] calls) var signature = SignSapient(envelope); var sapientSignature = new SapientSignature { - imageHash = _state.ImageHash, + imageHash = _state.SessionsImageHash, signature = signature }; var signedEnvelope = envelope.ToSigned(sapientSignature); + + foreach (var sig in signedEnvelope.signatures) + { + if (sig is Signature regSig) + Debug.Log($"Signature '{sig.type}' '{regSig.address}'"); + else if (sig is SapientSignature sapientSig) + Debug.Log($"SapientSignature '{sig.type}' '{sapientSig.imageHash}' '{sapientSig.signature.address}'"); + } var rawSignature = SignatureHandler.EncodeSignature(signedEnvelope); @@ -196,7 +208,7 @@ private SignatureOfSapientSignerLeaf SignSapient(Envelope envelope) return new SignatureOfSapientSignerLeaf { curType = SignatureOfSapientSignerLeaf.Type.sapient, - address = Address, + address = _state.Sessions, data = sessionSignatures }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs index 39b886e3..427952bf 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs @@ -8,6 +8,7 @@ using Sequence.Signer; using Sequence.Utils; using Sequence.Wallet; +using UnityEngine; namespace Sequence.EcosystemWallet { @@ -47,6 +48,8 @@ internal SessionSigner(SessionCredentials credentials) Address = new EOAWallet(credentials.privateKey).GetAddress(); Chain = ChainDictionaries.ChainById[credentials.chainId]; IsExplicit = credentials.isExplicit; + + Debug.Log($"IdentitySigner: {IdentitySigner}, Address: {Address}"); } public bool IsSupportedCall(Call call, SessionsTopology topology) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs index 54ba0d97..7677c376 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs @@ -5,14 +5,19 @@ using Nethereum.ABI.Model; using Sequence.EcosystemWallet.Primitives; using Sequence.Provider; +using Sequence.Utils; using UnityEngine; namespace Sequence.EcosystemWallet { internal class WalletState { + // Why this signer leaf? + public Address Sessions = new Address("0x06aa3a8F781F2be39b888Ac8a639c754aEe9dA29"); + public Address Address { get; } public string ImageHash { get; private set; } + public string SessionsImageHash { get; private set; } public bool IsDeployed { get; private set; } = true; // At what condition is this false? public BigInteger Nonce { get; private set; } public Primitives.Config Config { get; private set; } @@ -28,16 +33,20 @@ public WalletState(Address address) public async Task Update() { var deployResponse = await _keyMachine.GetDeployHash(Address); - var config = await _keyMachine.GetConfiguration(deployResponse.deployHash); + var configUpdates = await _keyMachine.GetConfigUpdates(Address, deployResponse.deployHash); + var imageHash = configUpdates.updates.Length > 0 ? configUpdates.updates[^1].toImageHash : deployResponse.deployHash; + + var config = await _keyMachine.GetConfiguration(imageHash); Debug.Log($"Config: {config.ToJson()}"); - - // Why this signer leaf? - var signerLeaf = config.topology.FindSignerLeaf(new Address("0x23c2eB9958BcAC9E531E785c4f65e91F1F426142")) as SapientSignerLeaf; - var treeReturn = await _keyMachine.GetTree(signerLeaf.imageHash); + + var signerLeaf = config.topology.FindSignerLeaf(Sessions) as SapientSignerLeaf; + SessionsImageHash = signerLeaf.imageHash; + + var treeReturn = await _keyMachine.GetTree(SessionsImageHash); var sessionsTopology = SessionsTopology.FromTree(treeReturn.tree.ToString()); - ImageHash = deployResponse.deployHash; + ImageHash = imageHash; Config = config; SessionsTopology = sessionsTopology; @@ -57,17 +66,18 @@ public async Task UpdateNonce(BigInteger space) }; var encoder = new FunctionCallEncoder(); - var encodedRequest = encoder.EncodeRequest(function.Sha3Signature, function.InputParameters, space); + var data = encoder.EncodeRequest(function.Sha3Signature, function.InputParameters, space); var response = await new SequenceEthClient(Chain.TestnetArbitrumSepolia).CallContract(new object[] { new { - Address, - encodedRequest + to = Address, + data } }); - Nonce = response == "0x" ? 0 : BigInteger.Parse(response); + Nonce = response == "0x" ? 0 : response.HexStringToBigInteger(); + Debug.Log($"Nonce: {Nonce}"); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs index f8b7aa96..1ddc2439 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs @@ -1,4 +1,5 @@ using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; namespace Sequence.EcosystemWallet.Envelope { @@ -10,7 +11,12 @@ public class SapientSignature : EnvelopeSignature public override byte[] Encode(Leaf leaf) { - throw new System.NotImplementedException("SapientSignature.Encode"); + return signature.Encode(leaf); + } + + public string ToString() + { + return $"Envelope SapientSignature, Image Hash: {imageHash}, Address: {signature.address}, Type: {signature.type}, Data: {signature.data.ByteArrayToHexStringWithPrefix()}"; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs index bd262a0e..5a4b4d41 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs @@ -10,7 +10,7 @@ public class Signature : EnvelopeSignature public override byte[] Encode(Leaf leaf) { - throw new System.NotImplementedException("Signature.Encode"); + return signature.Encode(leaf); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs index fe8becf7..82a536f2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs @@ -31,6 +31,12 @@ public async Task GetTree(string imageHash) return await SendRequest("Tree", args); } + public async Task GetConfigUpdates(string wallet, string fromImageHash) + { + var args = new ConfigUpdatesArgs(wallet, fromImageHash); + return await SendRequest("ConfigUpdates", args); + } + public async Task GetConfiguration(string imageHash) { var args = new ConfigArgs(imageHash); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/ConfigUpdates.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/ConfigUpdates.cs new file mode 100644 index 00000000..13cba852 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/ConfigUpdates.cs @@ -0,0 +1,25 @@ +namespace Sequence.EcosystemWallet.KeyMachine.Models +{ + internal struct ConfigUpdatesArgs + { + public string wallet; + public string fromImageHash; + + public ConfigUpdatesArgs(string wallet, string fromImageHash) + { + this.wallet = wallet; + this.fromImageHash = fromImageHash; + } + } + + internal struct ConfigUpdatesReturn + { + public ConfigUpdate[] updates; + } + + internal struct ConfigUpdate + { + public string toImageHash; + public string signature; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/ConfigUpdates.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/ConfigUpdates.cs.meta new file mode 100644 index 00000000..10cc759d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/ConfigUpdates.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0ef0ab13f86a4d399646aa521d9a41ee +timeCreated: 1754744618 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs index 4c3aec84..129cce2e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs @@ -37,5 +37,10 @@ public override byte[] HashConfiguration() return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(prefix, address, weight, imageHash)); } + + public string ToString() + { + return $"Address: {address}, Weight:{weight.ToString()}, Image Hash: {imageHash}"; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs index 53d268ba..a2428700 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs @@ -72,9 +72,6 @@ public static SessionPermissions Decode(byte[] data) ptr += consumed; } - if (permissions.Length == 0) - throw new Exception("No permissions"); - return new SessionPermissions { signer = signer, valueLimit = valueLimit, diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs index 7f855c1f..db7d21a9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs @@ -47,8 +47,6 @@ public static byte[] EncodeSignatures(SessionCallSignature[] signatures, Session sessionsTopology = sessionsTopology.Minimise(explicitSigners, implicitSigners); - Debug.Log($"{sessionsTopology.JsonSerialize()}"); - var encodedTopology = sessionsTopology.Encode(); if (encodedTopology.Length.MinBytesFor() > 3) throw new Exception("Session topology is too large"); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs index e3a23ded..aedcbce5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs @@ -1,5 +1,6 @@ using System; using Sequence.EcosystemWallet.Envelope; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -21,6 +22,7 @@ public static Topology FillLeaves(Topology topology, Func if (leaf is SignerLeaf signerLeaf) { var signature = signatureFor(signerLeaf); + Debug.Log($"SignerLeaf Signature {signature?.type}"); var newLeaf = signature != null ? new SignedSignerLeaf { address = signerLeaf.address, @@ -34,6 +36,7 @@ public static Topology FillLeaves(Topology topology, Func if (leaf is SapientSignerLeaf sapientSignerLeaf) { var signature = signatureFor(sapientSignerLeaf); + Debug.Log($"SapientSignerLeaf Signature {signature?.type}"); var newLeaf = signature != null ? new SignedSapientSignerLeaf { address = sapientSignerLeaf.address, @@ -94,6 +97,9 @@ sig is Signature signature && if (leaf is SapientSignerLeaf sapientSignerLeaf) { + Debug.Log("1:: " + sapientSignerLeaf.ToString()); + Debug.Log("2:: " + (envelope.signatures[0] as SapientSignature)?.ToString()); + return Array.Find(envelope.signatures, sig => sig is SapientSignature sapient && sapient.imageHash == sapientSignerLeaf.imageHash && From e7e6e8afe89490b0d4fa6f775ec03afdbb931960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Sun, 10 Aug 2025 00:37:13 +0200 Subject: [PATCH 129/165] implicit transactions are working --- .../UnitTests/TransactionTests.cs | 2 +- .../Authentication/SequenceWallet.cs | 43 +++++-------------- .../Authentication/SessionSigner.cs | 2 +- .../Authentication/SessionTemplates.cs | 2 +- .../Authentication/TransactionData.cs | 4 +- .../Authentication/WalletState.cs | 3 ++ .../EcosystemWallet/CryptoHelpers.cs | 7 --- .../Primitives/Config/SignerLeaf.cs | 1 - .../Primitives/Payload/Call.cs | 2 +- .../Primitives/Payload/CallEncoder.cs | 2 + .../Primitives/Payload/CallsEncoder.cs | 1 + .../Permission/SessionPermissions.cs | 32 +++++++------- .../Sessions/SessionCallSignature.cs | 2 + .../Primitives/Sessions/SessionsTopology.cs | 3 ++ .../Primitives/Signature/RSY.cs | 2 + .../Primitives/Signature/RawSignature.cs | 4 +- .../Primitives/Signature/SignatureHandler.cs | 8 +--- .../Signature/SignatureOfSapientSignerLeaf.cs | 7 +++ .../Signature/SignedSapientSignerLeaf.cs | 3 ++ .../Ethereum/ABI/Coders/TupleCoder.cs | 2 +- .../DataTypes/GetMetaTxnReceiptArgs.cs | 2 +- .../SequenceSDK/Relayer/SequenceRelayer.cs | 6 +-- 22 files changed, 64 insertions(+), 76 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs index 161d267c..123a3a06 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs @@ -9,7 +9,7 @@ public class TransactionTests { private static readonly Call[] ImplicitCalls = new Call[] { - new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, EthCrypto.HashFunctionSelector("implicitEmit()").HexStringToByteArray()) + new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, ABI.ABI.FunctionSelector("implicitEmit()").HexStringToByteArray()) }; [Test] diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index 9ed7894d..482bfae0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -3,24 +3,17 @@ using System.Linq; using System.Numerics; using System.Threading.Tasks; -using Nethereum.ABI.FunctionEncoding; -using Nethereum.ABI.Model; -using Newtonsoft.Json; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Relayer; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet { public class SequenceWallet : IWallet, IDisposable { - private const string ExecuteAbiSelector = - "function execute(bytes calldata _payload, bytes calldata _signature) external"; - public static Action OnWalletCreated; public Address Address { get; } @@ -76,7 +69,7 @@ public async Task GetFeeOption(Call[] calls) var transactionData = SignCalls(calls); var relayer = new SequenceRelayer(SessionSigners[0].Chain); - var args = new FeeOptionsArgs(Address, transactionData.To, transactionData.Data.ByteArrayToHexStringWithPrefix()); + var args = new FeeOptionsArgs(Address, transactionData.To, transactionData.Data); var response = await relayer.GetFeeOptions(args); return response.options; @@ -84,13 +77,11 @@ public async Task GetFeeOption(Call[] calls) public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) { - Debug.Log($"{calls[0].ToString()}"); - await _state.Update(); var transactionData = SignCalls(calls); var relayer = new SequenceRelayer(SessionSigners[0].Chain); - var hash = await relayer.Relay(transactionData.To, transactionData.Data.ByteArrayToHexStringWithPrefix()); + var hash = await relayer.Relay(transactionData.To, transactionData.Data); MetaTxnReceipt receipt = null; var status = OperationStatus.Pending; @@ -110,7 +101,7 @@ public async Task SendTransaction(Call[] calls, FeeOption feeOption = nu private TransactionData SignCalls(Call[] calls) { - var preparedIncrement = PrepareIncrement(null, 2, null); + var preparedIncrement = PrepareIncrement(null, 0, null); if (preparedIncrement != null) calls.AddToArray(preparedIncrement); @@ -124,34 +115,19 @@ private TransactionData SignCalls(Call[] calls) }; var signedEnvelope = envelope.ToSigned(sapientSignature); - - foreach (var sig in signedEnvelope.signatures) - { - if (sig is Signature regSig) - Debug.Log($"Signature '{sig.type}' '{regSig.address}'"); - else if (sig is SapientSignature sapientSig) - Debug.Log($"SapientSignature '{sig.type}' '{sapientSig.imageHash}' '{sapientSig.signature.address}'"); - } - var rawSignature = SignatureHandler.EncodeSignature(signedEnvelope); + + rawSignature.suffix = _state.ConfigUpdates + .Select(u => RawSignature.Decode(u.signature.HexStringToByteArray())).ToArray(); if (_state.IsDeployed) { - var function = new FunctionABI("execute", false); - function.InputParameters = new[] - { - new Parameter("bytes", "_payload"), - new Parameter("bytes", "_signature") - }; - - var encoder = new FunctionCallEncoder(); - return new TransactionData { To = Address, - Data = encoder.EncodeRequest(function.Sha3Signature, function.InputParameters, + Data = ABI.ABI.Pack("execute(bytes,bytes)", envelope.payload.Encode(), - rawSignature.Encode()).HexStringToByteArray() + rawSignature.Encode()) }; } @@ -167,6 +143,7 @@ private Envelope PrepareTransaction(Call[] calls) { return new Envelope { + chainId = BigInteger.Parse(ChainDictionaries.ChainIdOf[SessionSigners[0].Chain]), wallet = Address, configuration = _state.Config, payload = new Calls(0, _state.Nonce, calls) @@ -198,7 +175,7 @@ private SignatureOfSapientSignerLeaf SignSapient(Envelope envelope) else implicitSigners.Add(signer.Address); } - + var sessionSignatures = SessionCallSignature.EncodeSignatures( signatures, _state.SessionsTopology, diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs index 427952bf..840575fe 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs @@ -58,7 +58,7 @@ public bool IsSupportedCall(Call call, SessionsTopology topology) { if (call.data.Length > 4 && ByteArrayExtensions.Slice(call.data, 0, 4).ByteArrayToHexStringWithPrefix() == - EthCrypto.HashFunctionSelector("incrementUsageLimit((bytes32,uint256)[])")) + ABI.ABI.FunctionSelector("incrementUsageLimit((bytes32,uint256)[])")) { return true; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs index 1cd0873b..891e2805 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs @@ -34,7 +34,7 @@ public SessionPermissions BuildBasicRestrictivePermissions() var sessionBuilder = new SessionBuilder(_chain, signer, 0, deadline); sessionBuilder.AddPermission(target, false, ParameterOperation.equal, - EthCrypto.HashFunctionSelector("explicitEmit()"), 0, ParameterRule.SelectorMask); + ABI.ABI.FunctionSelector("explicitEmit()"), 0, ParameterRule.SelectorMask); sessionBuilder.AddPermission(target, true, ParameterOperation.greaterThanOrEqual, "0x1234567890123456789012345678901234567890", 4, ParameterRule.Uint256Mask); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs index 2baa2c1c..a050f8e9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs @@ -3,9 +3,9 @@ namespace Sequence.EcosystemWallet public struct TransactionData { public Address To; - public byte[] Data; + public string Data; - public TransactionData(Address to, byte[] data) + public TransactionData(Address to, string data) { To = to; Data = data; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs index 7677c376..46a0eec6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs @@ -7,6 +7,7 @@ using Sequence.Provider; using Sequence.Utils; using UnityEngine; +using ConfigUpdate = Sequence.EcosystemWallet.KeyMachine.Models.ConfigUpdate; namespace Sequence.EcosystemWallet { @@ -22,6 +23,7 @@ internal class WalletState public BigInteger Nonce { get; private set; } public Primitives.Config Config { get; private set; } public SessionsTopology SessionsTopology { get; private set; } + public ConfigUpdate[] ConfigUpdates { get; private set; } private readonly KeyMachineApi _keyMachine = new(); @@ -46,6 +48,7 @@ public async Task Update() var treeReturn = await _keyMachine.GetTree(SessionsImageHash); var sessionsTopology = SessionsTopology.FromTree(treeReturn.tree.ToString()); + ConfigUpdates = configUpdates.updates; ImageHash = imageHash; Config = config; SessionsTopology = sessionsTopology; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs index 6d133f11..a39bdca2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs @@ -11,13 +11,6 @@ namespace Sequence.EcosystemWallet { public static class EthCrypto { - public static string HashFunctionSelector(string function) - { - var sha3 = new Sha3Keccack(); - var hash = sha3.CalculateHash(function); - return "0x" + hash.Substring(0, 8); - } - /// /// Recover an ECPubKey from (r,s,yParity) and a 32-byte payload hash. /// - r, s: 32-byte big-endian diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs index f9a8b0f2..b6eb247c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs @@ -3,7 +3,6 @@ using System.Text; using Sequence.ABI; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs index 8f35a6f8..f4eb8b9a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs @@ -21,7 +21,7 @@ public class Call public BigInteger gasLimit; public bool delegateCall; public bool onlyFallback; - public BehaviourOnError behaviorOnError; + public BehaviourOnError behaviorOnError = BehaviourOnError.revert; [Preserve] public Call(Address to, BigInteger value, byte[] data) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs index b1cfc888..33b496d3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs @@ -1,6 +1,7 @@ using System; using System.Numerics; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -31,6 +32,7 @@ public CallEncoder(byte[] outBytes, Call call) public byte[] Encode(Address self) { flags = SetFlags(self); + Debug.Log($"Call flags {flags.ByteArrayFromNumber(1).ByteArrayToHexString()}"); outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, flags.ByteArrayFromNumber(1)); outBytes = AddToAddress(outBytes); outBytes = AddValue(outBytes); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsEncoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsEncoder.cs index 75a0c19f..bf715a40 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsEncoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsEncoder.cs @@ -1,6 +1,7 @@ using System; using System.Numerics; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs index a2428700..09919a9f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs @@ -4,6 +4,7 @@ using System.Numerics; using Newtonsoft.Json; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -35,6 +36,7 @@ public byte[] Encode() List result = new(); result.AddRange(signer.ToString().HexStringToByteArray().PadLeft(20)); + result.AddRange(chainId.ByteArrayFromNumber().PadLeft(32)); result.AddRange(valueLimit.ByteArrayFromNumber(32)); result.AddRange(deadline.ByteArrayFromNumber(8)); result.Add((byte)permissions.Length); @@ -50,30 +52,28 @@ public static SessionPermissions Decode(byte[] data) { if (data.Length < 85) throw new Exception("Data too short"); + + Debug.Log($"{data.Length}"); - var ptr = 0; - - var signer = new Address(data.AsSpan(ptr, 20).ToArray()); - ptr += 20; - - var valueLimit = new BigInteger(data.AsSpan(ptr, 32).ToArray(), isUnsigned: true, isBigEndian: true); - ptr += 32; - - var deadline = new BigInteger(data.AsSpan(ptr, 32).ToArray(), isUnsigned: true, isBigEndian: true); - ptr += 32; - - var permissionsLength = data[ptr]; - ptr += 1; + var signer = new Address(data.AsSpan(0, 20).ToArray()); + var chainId = new BigInteger(data.AsSpan(20, 32).ToArray(), isUnsigned: true, isBigEndian: true); + var valueLimit = new BigInteger(data.AsSpan(52, 32).ToArray(), isUnsigned: true, isBigEndian: true); + var deadline = new BigInteger(data.AsSpan(84, 8).ToArray(), isUnsigned: true, isBigEndian: true); + var permissionsLength = data[92]; + + var pointer = 93; var permissions = new Permission[permissionsLength]; + for (var i = 0; i < permissionsLength; i++) { - var (permission, consumed) = Permission.Decode(data, ptr); + var (permission, consumed) = Permission.Decode(data, pointer); permissions[i] = permission; - ptr += consumed; + pointer += consumed; } - + return new SessionPermissions { signer = signer, + chainId = chainId, valueLimit = valueLimit, deadline = deadline, permissions = permissions diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs index db7d21a9..45c6797c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs @@ -47,6 +47,8 @@ public static byte[] EncodeSignatures(SessionCallSignature[] signatures, Session sessionsTopology = sessionsTopology.Minimise(explicitSigners, implicitSigners); + Debug.Log($"EncodeSignatures {JsonConvert.SerializeObject(sessionsTopology.ToJsonObject())}"); + var encodedTopology = sessionsTopology.Encode(); if (encodedTopology.Length.MinBytesFor() > 3) throw new Exception("Session topology is too large"); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index fe2f4042..225b650c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -254,8 +254,11 @@ public static SessionLeaf DecodeLeaf(string value) if (flag == FlagPermissions) { byte[] slice = data.Skip(1).ToArray(); + Debug.Log($"SessesionPermissions.Start {slice.ByteArrayToHexString()}"); var permissions = SessionPermissions.Decode(slice); + Debug.Log($"SessesionPermissions.Decode {JsonConvert.SerializeObject(permissions.ToJson())}"); + return new PermissionLeaf { permissions = permissions diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs index c6258fd1..b73879e2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs @@ -3,6 +3,7 @@ using System.Numerics; using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Utils; +using UnityEngine; using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives @@ -25,6 +26,7 @@ public byte[] Pack() if (yParity % 2 == 1) sBytes[0] |= 0x80; + Debug.Log($"RSY Pack {ByteArrayExtensions.ConcatenateByteArrays(rBytes, sBytes).ByteArrayToHexString()}"); return ByteArrayExtensions.ConcatenateByteArrays(rBytes, sBytes); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs index 33b85092..f9508c87 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -83,7 +83,7 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd } byte[] output = new byte[] { flag }; - + if (configuration.checkpointer != null && !skipCheckpointerAddress) { var checkpointerBytes = configuration.checkpointer.Value.HexStringToByteArray(); @@ -107,7 +107,7 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd var topologyBytes = configuration.topology.Encode(noChainId, checkpointerData); output = ByteArrayExtensions.ConcatenateByteArrays(output, topologyBytes); - + return erc6492 != null ? Erc6492Helper.Wrap(output, erc6492.to, erc6492.data) : output; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs index aedcbce5..dab1bfca 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs @@ -1,4 +1,5 @@ using System; +using Newtonsoft.Json; using Sequence.EcosystemWallet.Envelope; using UnityEngine; @@ -22,7 +23,6 @@ public static Topology FillLeaves(Topology topology, Func if (leaf is SignerLeaf signerLeaf) { var signature = signatureFor(signerLeaf); - Debug.Log($"SignerLeaf Signature {signature?.type}"); var newLeaf = signature != null ? new SignedSignerLeaf { address = signerLeaf.address, @@ -36,7 +36,6 @@ public static Topology FillLeaves(Topology topology, Func if (leaf is SapientSignerLeaf sapientSignerLeaf) { var signature = signatureFor(sapientSignerLeaf); - Debug.Log($"SapientSignerLeaf Signature {signature?.type}"); var newLeaf = signature != null ? new SignedSapientSignerLeaf { address = sapientSignerLeaf.address, @@ -72,7 +71,7 @@ public static RawSignature EncodeSignature(SignedEnvelope envelope) { var topology = FillLeaves(envelope.configuration.topology, leaf => SignatureForLeaf(envelope, leaf)); - + return new RawSignature { noChainId = envelope.chainId == 0, @@ -97,9 +96,6 @@ sig is Signature signature && if (leaf is SapientSignerLeaf sapientSignerLeaf) { - Debug.Log("1:: " + sapientSignerLeaf.ToString()); - Debug.Log("2:: " + (envelope.signatures[0] as SapientSignature)?.ToString()); - return Array.Find(envelope.signatures, sig => sig is SapientSignature sapient && sapient.imageHash == sapientSignerLeaf.imageHash && diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs index 07639373..d08d0de2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs @@ -1,5 +1,6 @@ using System; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -42,6 +43,12 @@ public override byte[] Encode(Leaf leaf) weightBytes = weight.ByteArrayFromNumber(weight.MinBytesFor()); else throw new Exception("Weight too large"); + + Debug.Log($"SignatureOfSapientSignerLeaf flag {flag.ByteArrayFromNumber(flag.MinBytesFor()).ByteArrayToHexString()}"); + Debug.Log($"SignatureOfSapientSignerLeaf weight {weightBytes.ByteArrayToHexString()}"); + Debug.Log($"SignatureOfSapientSignerLeaf address {address.Value.HexStringToByteArray(20).ByteArrayToHexString()}"); + Debug.Log($"SignatureOfSapientSignerLeaf dataLength {data.Length.ByteArrayFromNumber(bytesForSignatureSize).ByteArrayToHexString()}"); + Debug.Log($"SignatureOfSapientSignerLeaf data {data.ByteArrayToHexString()}"); return ByteArrayExtensions.ConcatenateByteArrays( flag.ByteArrayFromNumber(flag.MinBytesFor()), diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs index ecc905a6..4fd2eed3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs @@ -1,3 +1,6 @@ +using Sequence.Utils; +using UnityEngine; + namespace Sequence.EcosystemWallet.Primitives { public class SignedSapientSignerLeaf : SapientSignerLeaf diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs index 47e87bde..3324bb8a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs @@ -5,6 +5,7 @@ using System.Text; using System; using Sequence.Utils; +using UnityEngine; namespace Sequence.ABI @@ -110,7 +111,6 @@ public string EncodeToString(object value, string[] evmTypes) break; //Dynamics: head(X(i)) = enc(len( head(X(1)) ... head(X(k)) tail(X(1)) ... tail(X(i-1)) )) tail(X(i)) = enc(X(i)) case ABIType.BYTES: - SequenceLog.Info("object in tuple array: bytes"); head_i = _numberCoder.EncodeToString((object)(headerTotalByteLength + tailLength)); tail_i = _fixedBytesCoder.EncodeToString(valueTuple[i]); break; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs index 2bf75d25..c8b82b02 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs @@ -2,6 +2,6 @@ namespace Sequence.Relayer { public class GetMetaTxnReceiptArgs { - public string metaTxnID; + public string metaTxID; } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs index d880760f..0fc256c9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs @@ -17,7 +17,7 @@ public SequenceRelayer(Chain chain) var name = chain switch { Chain.ArbitrumOne => "v3-arbitrum", - Chain.TestnetArbitrumSepolia => "v3-arbitrum-sepolia", + Chain.TestnetArbitrumSepolia => "dev-arbitrum-sepolia", _ => throw new NotSupportedException($"Chain {chain} not supported.") }; @@ -36,9 +36,9 @@ public async Task GetFeeOptions(FeeOptionsArgs args) return await _httpClient.SendPostRequest("FeeOptions", args, _headers); } - public async Task GetMetaTxnReceipt(string metaTxnID) + public async Task GetMetaTxnReceipt(string metaTxID) { - var args = new GetMetaTxnReceiptArgs { metaTxnID = metaTxnID }; + var args = new GetMetaTxnReceiptArgs { metaTxID = metaTxID.EnsureHexPrefix() }; return await _httpClient.SendPostRequest("GetMetaTxnReceipt", args, _headers); } From 7cf20a3be975c796ae92840131c83c64bb59e55b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Sun, 10 Aug 2025 08:53:42 +0200 Subject: [PATCH 130/165] started finding permissions for explicit transaction, some log cleanup --- .../Authentication/SequenceWallet.cs | 2 +- .../Authentication/SessionSigner.cs | 30 +++++++++++-------- .../Authentication/WalletState.cs | 1 - .../Primitives/Config/Topology.cs | 3 +- .../Primitives/Payload/CallEncoder.cs | 2 -- .../Primitives/Payload/Calls.cs | 2 -- .../Permission/SessionPermissions.cs | 3 -- .../Sessions/SessionCallSignature.cs | 2 -- .../Primitives/Sessions/SessionsTopology.cs | 4 --- .../Primitives/Signature/RSY.cs | 3 -- .../Primitives/Signature/RawSignature.cs | 1 - .../Primitives/Signature/SignatureHandler.cs | 2 -- .../Signature/SignatureOfSapientSignerLeaf.cs | 7 ----- 13 files changed, 20 insertions(+), 42 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index 482bfae0..5c29c71f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -164,7 +164,7 @@ private SignatureOfSapientSignerLeaf SignSapient(Envelope envelope) var signatures = new SessionCallSignature[signers.Length]; for (var i = 0; i < signers.Length; i++) { - var signature = signers[i].SignCall(calls[i], envelope.payload.space, envelope.payload.nonce); + var signature = signers[i].SignCall(calls[i], _state.SessionsTopology, envelope.payload.space, envelope.payload.nonce); signatures[i] = signature; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs index 840575fe..fc2312eb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs @@ -1,22 +1,15 @@ using System; -using System.Linq; using System.Numerics; -using System.Text; -using Nethereum.Util; using Sequence.ABI; using Sequence.EcosystemWallet.Primitives; using Sequence.Signer; using Sequence.Utils; using Sequence.Wallet; -using UnityEngine; namespace Sequence.EcosystemWallet { public class SessionSigner { - private const string IncrementUsageLimit = - "{\n type: 'function',\n name: 'incrementUsageLimit',\n inputs: [\n {\n name: 'limits',\n type: 'tuple[]',\n internalType: 'struct UsageLimit[]',\n components: [\n { name: 'usageHash', type: 'bytes32', internalType: 'bytes32' },\n { name: 'usageAmount', type: 'uint256', internalType: 'uint256' },\n ],\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n }"; - public Address ParentAddress { get; } public Address Address { get; } public Chain Chain { get; } @@ -48,8 +41,6 @@ internal SessionSigner(SessionCredentials credentials) Address = new EOAWallet(credentials.privateKey).GetAddress(); Chain = ChainDictionaries.ChainById[credentials.chainId]; IsExplicit = credentials.isExplicit; - - Debug.Log($"IdentitySigner: {IdentitySigner}, Address: {Address}"); } public bool IsSupportedCall(Call call, SessionsTopology topology) @@ -69,14 +60,20 @@ public bool IsSupportedCall(Call call, SessionsTopology topology) return true; } - + public Permission FindSupportedPermission(Call call, SessionsTopology topology) { var permissions = topology.GetPermissions()?.permissions; return permissions is {Length: > 0} ? permissions[0] : null; } - public SessionCallSignature SignCall(Call call, BigInteger space, BigInteger nonce) + public int FindSupportedPermissionIndex(Call call, SessionsTopology topology) + { + var permissions = topology.GetPermissions()?.permissions; + return permissions is {Length: > 0} ? 0 : -1; + } + + public SessionCallSignature SignCall(Call call, SessionsTopology topology, BigInteger space, BigInteger nonce) { var pvKey = _credentials.privateKey; var eoaWallet = new EOAWallet(pvKey); @@ -88,9 +85,18 @@ public SessionCallSignature SignCall(Call call, BigInteger space, BigInteger non if (IsExplicit) { + var permissionIndex = 0; + if (!(call.data.Length > 4 && call.data.Slice(4).ByteArrayToHexStringWithPrefix() == + ABI.ABI.FunctionSelector("incrementUsageLimit"))) + { + permissionIndex = FindSupportedPermissionIndex(call, topology); + if (permissionIndex == -1) + throw new Exception("Invalid permission"); + } + return new ExplicitSessionCallSignature { - permissionIndex = 0, + permissionIndex = permissionIndex, sessionSignature = rsy }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs index 46a0eec6..9f8b136a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs @@ -1,4 +1,3 @@ -using System; using System.Numerics; using System.Threading.Tasks; using Nethereum.ABI.FunctionEncoding; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index 3e40deb6..af9c06e9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -4,7 +4,6 @@ using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -322,7 +321,7 @@ public static List ParseContentToLeafs(string elements) } if (leaves.Count == 0) - Debug.LogError($"Topology.FromLeaves resulted in an empty list of leafs: {elements}"); + throw new Exception($"Topology.FromLeaves resulted in an empty list of leafs: {elements}"); return leaves; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs index 33b496d3..b1cfc888 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs @@ -1,7 +1,6 @@ using System; using System.Numerics; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -32,7 +31,6 @@ public CallEncoder(byte[] outBytes, Call call) public byte[] Encode(Address self) { flags = SetFlags(self); - Debug.Log($"Call flags {flags.ByteArrayFromNumber(1).ByteArrayToHexString()}"); outBytes = ByteArrayExtensions.ConcatenateByteArrays(outBytes, flags.ByteArrayFromNumber(1)); outBytes = AddToAddress(outBytes); outBytes = AddValue(outBytes); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs index a41fc614..bbb2d008 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs @@ -2,11 +2,9 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; -using NUnit.Framework; using Sequence.ABI; using Sequence.Utils; using UnityEngine.Scripting; -using StringExtensions = Sequence.Utils.StringExtensions; namespace Sequence.EcosystemWallet.Primitives { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs index 09919a9f..3db10dd6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs @@ -4,7 +4,6 @@ using System.Numerics; using Newtonsoft.Json; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -53,8 +52,6 @@ public static SessionPermissions Decode(byte[] data) if (data.Length < 85) throw new Exception("Data too short"); - Debug.Log($"{data.Length}"); - var signer = new Address(data.AsSpan(0, 20).ToArray()); var chainId = new BigInteger(data.AsSpan(20, 32).ToArray(), isUnsigned: true, isBigEndian: true); var valueLimit = new BigInteger(data.AsSpan(52, 32).ToArray(), isUnsigned: true, isBigEndian: true); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs index 45c6797c..db7d21a9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs @@ -47,8 +47,6 @@ public static byte[] EncodeSignatures(SessionCallSignature[] signatures, Session sessionsTopology = sessionsTopology.Minimise(explicitSigners, implicitSigners); - Debug.Log($"EncodeSignatures {JsonConvert.SerializeObject(sessionsTopology.ToJsonObject())}"); - var encodedTopology = sessionsTopology.Encode(); if (encodedTopology.Length.MinBytesFor() > 3) throw new Exception("Session topology is too large"); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index 225b650c..92718ac5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -6,7 +6,6 @@ using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -254,11 +253,8 @@ public static SessionLeaf DecodeLeaf(string value) if (flag == FlagPermissions) { byte[] slice = data.Skip(1).ToArray(); - Debug.Log($"SessesionPermissions.Start {slice.ByteArrayToHexString()}"); var permissions = SessionPermissions.Decode(slice); - Debug.Log($"SessesionPermissions.Decode {JsonConvert.SerializeObject(permissions.ToJson())}"); - return new PermissionLeaf { permissions = permissions diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs index b73879e2..23f016d5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs @@ -1,9 +1,7 @@ using System; -using System.Linq; using System.Numerics; using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Utils; -using UnityEngine; using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives @@ -26,7 +24,6 @@ public byte[] Pack() if (yParity % 2 == 1) sBytes[0] |= 0x80; - Debug.Log($"RSY Pack {ByteArrayExtensions.ConcatenateByteArrays(rBytes, sBytes).ByteArrayToHexString()}"); return ByteArrayExtensions.ConcatenateByteArrays(rBytes, sBytes); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs index f9508c87..bb85e273 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -4,7 +4,6 @@ using Newtonsoft.Json; using Sequence.EcosystemWallet.Utils; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs index dab1bfca..dd9e838e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs @@ -1,7 +1,5 @@ using System; -using Newtonsoft.Json; using Sequence.EcosystemWallet.Envelope; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs index d08d0de2..ae05a7fb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs @@ -1,6 +1,5 @@ using System; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -44,12 +43,6 @@ public override byte[] Encode(Leaf leaf) else throw new Exception("Weight too large"); - Debug.Log($"SignatureOfSapientSignerLeaf flag {flag.ByteArrayFromNumber(flag.MinBytesFor()).ByteArrayToHexString()}"); - Debug.Log($"SignatureOfSapientSignerLeaf weight {weightBytes.ByteArrayToHexString()}"); - Debug.Log($"SignatureOfSapientSignerLeaf address {address.Value.HexStringToByteArray(20).ByteArrayToHexString()}"); - Debug.Log($"SignatureOfSapientSignerLeaf dataLength {data.Length.ByteArrayFromNumber(bytesForSignatureSize).ByteArrayToHexString()}"); - Debug.Log($"SignatureOfSapientSignerLeaf data {data.ByteArrayToHexString()}"); - return ByteArrayExtensions.ConcatenateByteArrays( flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, From 873e0c3a48a845d3ba2f7e96d1cefd411391c1b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Sun, 10 Aug 2025 08:59:01 +0200 Subject: [PATCH 131/165] added tests for explicitEmit --- .../UnitTests/TransactionTests.cs | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs index 123a3a06..751fc50a 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs @@ -12,22 +12,42 @@ public class TransactionTests new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, ABI.ABI.FunctionSelector("implicitEmit()").HexStringToByteArray()) }; - [Test] - public async Task SendTransaction() + private static readonly Call[] ExplicitCalls = new Call[] { - var connect = new SequenceConnect(Chain.TestnetArbitrumSepolia, EcosystemType.Sequence); - var wallet = connect.GetWallet(); + new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, ABI.ABI.FunctionSelector("explicitEmit()").HexStringToByteArray()) + }; - await wallet.SendTransaction(ImplicitCalls); + private static SequenceWallet Wallet + { + get + { + var connect = new SequenceConnect(Chain.TestnetArbitrumSepolia, EcosystemType.Sequence); + return connect.GetWallet(); + } } [Test] - public async Task GetFeeOptions() + public async Task SendImplicitTransaction() { - var connect = new SequenceConnect(Chain.TestnetArbitrumSepolia, EcosystemType.Sequence); - var wallet = connect.GetWallet(); - - await wallet.GetFeeOption(ImplicitCalls); + await Wallet.SendTransaction(ImplicitCalls); + } + + [Test] + public async Task SendExplicitTransaction() + { + await Wallet.SendTransaction(ExplicitCalls); + } + + [Test] + public async Task GetFeeOptionsForImplicitCalls() + { + await Wallet.GetFeeOption(ImplicitCalls); + } + + [Test] + public async Task GetFeeOptionsForExplicitCalls() + { + await Wallet.GetFeeOption(ExplicitCalls); } } } \ No newline at end of file From 35fe14cb6d2af93ab7e5bc7b1ba87272b2f6198e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 11 Aug 2025 09:25:28 +0200 Subject: [PATCH 132/165] handle fee options call --- .../Authentication/SequenceWallet.cs | 18 ++++++++++++++++++ .../Sequence/SequenceSDK/Utils/ArrayUtils.cs | 8 ++++++++ 2 files changed, 26 insertions(+) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index 5c29c71f..0e16a3a0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -78,6 +78,24 @@ public async Task GetFeeOption(Call[] calls) public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) { await _state.Update(); + + if (feeOption != null) + { + var encodedFeeOptionData = ABI.ABI.Pack("transfer(address,uint256)", + feeOption.to, feeOption.value).HexStringToByteArray(); + + var feeOptionCall = new Call( + feeOption.token, + 0, + encodedFeeOptionData, + feeOption.gasLimit, + false, + false, + BehaviourOnError.revert); + + calls = calls.Unshift(feeOptionCall); + } + var transactionData = SignCalls(calls); var relayer = new SequenceRelayer(SessionSigners[0].Chain); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs index 46c2ad84..adcd69b6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs @@ -7,6 +7,14 @@ namespace Sequence.Utils { public static class ArrayUtils { + public static T[] Unshift(this T[] array, T newItem) + { + T[] newArray = new T[array.Length + 1]; + newArray[0] = newItem; + Array.Copy(array, 0, newArray, 1, array.Length); + return newArray; + } + public static T[] ConvertToTArray(this T2 value) { if (value is Array array) From 2195492bf5e34c18c76a4bfeb50099ad91c2964d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 12 Aug 2025 09:02:13 +0200 Subject: [PATCH 133/165] latest changes --- .../UnitTests/AuthenticationTests.cs | 25 +- .../UnitTests/TransactionTests.cs | 45 +- .../Sequence/Samples~/Demo V3/DemoV3.unity | 1031 +++++++++++++++-- .../SequenceEcosystemWalletWindow.cs | 81 +- .../EcosystemWallet/SessionWalletTile.cs | 9 +- .../SequenceBoilerplates.asmdef | 3 +- .../SequenceSDK/Config/SequenceConfig.asmdef | 15 +- .../Authentication/EcosystemClient.cs | 70 ++ .../Authentication/EcosystemClient.cs.meta | 3 + .../EcosystemWallet/Authentication/IWallet.cs | 4 +- .../Authentication/SequenceConnect.cs | 143 +-- .../Authentication/SequenceWallet.cs | 140 ++- .../Authentication/SessionBuilder.cs | 6 +- .../Authentication/SessionSigner.cs | 86 +- .../Authentication/SessionTemplates.cs | 10 +- .../Authentication/Storage/SessionStorage.cs | 39 +- .../Authentication/WalletState.cs | 24 +- .../SequenceSDK/EcosystemWallet/Config.meta | 3 + .../KeyMachine/Models/DeployHash.cs | 6 +- .../Permission/SessionPermissions.cs | 4 +- .../Sessions/SessionCallSignature.cs | 1 - .../Primitives/Sessions/SessionsTopology.cs | 21 +- .../LocalhostRedirectHandler.cs | 13 +- .../Sequence/SequenceSDK/Ethereum/ABI/ABI.cs | 3 +- .../SequenceSDK/Ethereum/ABI/FunctionAbi.cs | 2 + .../Relayer/DataTypes/FeeOption.cs | 16 +- .../SequenceSDK/Relayer/SequenceRelayer.cs | 3 +- 27 files changed, 1441 insertions(+), 365 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Config.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs index b16e165f..e194c27c 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs @@ -5,11 +5,34 @@ namespace Sequence.EcosystemWallet.UnitTests { public class AuthenticationTests { + private static readonly Chain Chain = Chain.TestnetArbitrumSepolia; + private static readonly EcosystemType Ecosystem = EcosystemType.Sequence; + + [Test] + public void SignOut() + { + SequenceWallet.RecoverFromStorage().SignOut(); + } + [Test] public async Task SignInWithGoogle() { - var connect = new SequenceConnect(Chain.TestnetArbitrumSepolia, EcosystemType.Sequence); + var connect = new SequenceConnect(Ecosystem, Chain); await connect.SignInWithGoogle(); } + + [Test] + public async Task AddUnrestrictiveExplicitSession() + { + var wallet = SequenceWallet.RecoverFromStorage(); + await wallet.AddSession(Chain, new SessionTemplates(Chain).BuildUnrestrictivePermissions()); + } + + [Test] + public async Task AddRestrictiveExplicitSession() + { + var wallet = SequenceWallet.RecoverFromStorage(); + await wallet.AddSession(Chain, new SessionTemplates(Chain).BuildBasicRestrictivePermissions()); + } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs index 751fc50a..9ab3f6a4 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs @@ -1,3 +1,6 @@ +using System; +using System.Linq; +using System.Numerics; using System.Threading.Tasks; using NUnit.Framework; using Sequence.EcosystemWallet.Primitives; @@ -7,6 +10,8 @@ namespace Sequence.EcosystemWallet.UnitTests { public class TransactionTests { + private static readonly EcosystemType Ecosystem = EcosystemType.Sequence; + private static readonly Call[] ImplicitCalls = new Call[] { new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, ABI.ABI.FunctionSelector("implicitEmit()").HexStringToByteArray()) @@ -17,37 +22,57 @@ public class TransactionTests new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, ABI.ABI.FunctionSelector("explicitEmit()").HexStringToByteArray()) }; - private static SequenceWallet Wallet + private static SequenceWallet Wallet => SequenceWallet.RecoverFromStorage(); + + [Test] + public async Task AddPermissionForUsdcTransfer() + { + var usdcAddress = new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607"); + var target = new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"); + var deadline = new BigInteger(DateTimeOffset.UtcNow.ToUnixTimeSeconds() * 1000 + 1000 * 60 * 5000); + + var sessionBuilder = new SessionBuilder(Chain.Optimism, 1000000, deadline); + sessionBuilder.AddPermission(usdcAddress); + sessionBuilder.AddPermission(target); + + var permissions = sessionBuilder.GetPermissions(); + + await Wallet.AddSession(Chain.Optimism, permissions); + } + + [Test] + public async Task SendExplicitTransactionWithFeeOption() { - get - { - var connect = new SequenceConnect(Chain.TestnetArbitrumSepolia, EcosystemType.Sequence); - return connect.GetWallet(); - } + var feeOptions = await Wallet.GetFeeOption(Chain.Optimism, ExplicitCalls); + var feeOption = feeOptions.First(o => o.token.symbol == "USDC"); + if (feeOption == null) + throw new Exception($"Fee option 'USDC' not available"); + + await Wallet.SendTransaction(Chain.Optimism, ExplicitCalls, feeOption); } [Test] public async Task SendImplicitTransaction() { - await Wallet.SendTransaction(ImplicitCalls); + await Wallet.SendTransaction(Chain.TestnetArbitrumSepolia, ImplicitCalls); } [Test] public async Task SendExplicitTransaction() { - await Wallet.SendTransaction(ExplicitCalls); + await Wallet.SendTransaction(Chain.TestnetArbitrumSepolia, ExplicitCalls); } [Test] public async Task GetFeeOptionsForImplicitCalls() { - await Wallet.GetFeeOption(ImplicitCalls); + await Wallet.GetFeeOption(Chain.Optimism, ImplicitCalls); } [Test] public async Task GetFeeOptionsForExplicitCalls() { - await Wallet.GetFeeOption(ExplicitCalls); + await Wallet.GetFeeOption(Chain.Optimism, ExplicitCalls); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 4be7b7ff..c74237c8 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -199,6 +199,141 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8597591} m_CullTransparentMesh: 1 +--- !u!1 &11641990 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 11641991} + - component: {fileID: 11641993} + - component: {fileID: 11641992} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &11641991 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 11641990} + 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: 1017792475} + 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: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &11641992 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 11641990} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Send Explicit Txn (Testnet) + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &11641993 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 11641990} + m_CullTransparentMesh: 1 --- !u!1 &17360256 GameObject: m_ObjectHideFlags: 0 @@ -1786,6 +1921,9 @@ RectTransform: - {fileID: 1199799818} - {fileID: 1972349263} - {fileID: 541267863} + - {fileID: 1151746261} + - {fileID: 1017792475} + - {fileID: 791456579} m_Father: {fileID: 2198483992803733903} m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -1893,6 +2031,141 @@ CanvasGroup: m_Interactable: 1 m_BlocksRaycasts: 1 m_IgnoreParentGroups: 0 +--- !u!1 &236621038 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 236621039} + - component: {fileID: 236621041} + - component: {fileID: 236621040} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &236621039 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 236621038} + 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: 1151746261} + 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: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &236621040 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 236621038} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Send Implicit Txn (Testnet) + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &236621041 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 236621038} + m_CullTransparentMesh: 1 --- !u!1 &317570297 GameObject: m_ObjectHideFlags: 0 @@ -2432,9 +2705,181 @@ MonoBehaviour: m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + 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 &448961318 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 448961315} + m_CullTransparentMesh: 1 +--- !u!1 &453938997 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 453938998} + 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 &453938998 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453938997} + 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: 504017413} + m_Father: {fileID: 1918409864} + 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 &455107485 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 455107486} + - component: {fileID: 455107488} + - component: {fileID: 455107487} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &455107486 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 455107485} + 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: 1972349263} + 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: -10, y: 0} + m_SizeDelta: {x: -40, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &455107487 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 455107485} + 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: 0 + 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: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 + 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_overflowMode: 1 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 @@ -2458,52 +2903,15 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &448961318 +--- !u!222 &455107488 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 448961315} + m_GameObject: {fileID: 455107485} m_CullTransparentMesh: 1 ---- !u!1 &453938997 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 453938998} - 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 &453938998 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 453938997} - 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: 504017413} - m_Father: {fileID: 1918409864} - 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 &455107485 +--- !u!1 &456472303 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2511,9 +2919,9 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 455107486} - - component: {fileID: 455107488} - - component: {fileID: 455107487} + - component: {fileID: 456472304} + - component: {fileID: 456472306} + - component: {fileID: 456472305} m_Layer: 5 m_Name: Text (TMP) m_TagString: Untagged @@ -2521,33 +2929,33 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &455107486 +--- !u!224 &456472304 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 455107485} + m_GameObject: {fileID: 456472303} 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: 1972349263} - m_RootOrder: 1 + m_Father: {fileID: 791456579} + 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: -10, y: 0} - m_SizeDelta: {x: -40, y: -20} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -30, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &455107487 +--- !u!114 &456472305 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 455107485} + m_GameObject: {fileID: 456472303} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -2561,7 +2969,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: + m_text: Send Explicit Txn (with USDC fee) m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -2595,8 +3003,8 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 1 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 256 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 m_wordSpacing: 0 @@ -2604,9 +3012,9 @@ MonoBehaviour: m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_enableWordWrapping: 1 m_wordWrappingRatios: 0.4 - m_overflowMode: 1 + m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 @@ -2630,13 +3038,13 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &455107488 +--- !u!222 &456472306 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 455107485} + m_GameObject: {fileID: 456472303} m_CullTransparentMesh: 1 --- !u!1 &467585875 GameObject: @@ -4060,6 +4468,155 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 755374149} m_CullTransparentMesh: 1 +--- !u!1 &791456578 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 791456579} + - component: {fileID: 791456583} + - component: {fileID: 791456582} + - component: {fileID: 791456581} + - component: {fileID: 791456580} + m_Layer: 5 + m_Name: SendExplicitTransactionWithFee + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &791456579 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 791456578} + 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: 456472304} + m_Father: {fileID: 220577105} + m_RootOrder: 11 + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &791456580 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 791456578} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &791456581 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 791456578} + 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: 791456582} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceBoilerplates + m_MethodName: SendExplicitTransactionWithUsdc + 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 &791456582 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 791456578} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &791456583 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 791456578} + m_CullTransparentMesh: 1 --- !u!1 &794886186 GameObject: m_ObjectHideFlags: 0 @@ -5162,23 +5719,99 @@ MonoBehaviour: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1009042192} + m_GameObject: {fileID: 1009042192} + 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: 0} + 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 &1009042196 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1009042192} + m_CullTransparentMesh: 1 +--- !u!1 &1016496428 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1016496429} + - component: {fileID: 1016496431} + - component: {fileID: 1016496430} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1016496429 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016496428} + 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: 317570298} + 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: 7, y: 7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1016496430 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016496428} 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: 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_Sprite: {fileID: 21300000, guid: 7eeaa0f6357c9474abdf30939e119719, type: 3} + m_Type: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -5186,15 +5819,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1009042196 +--- !u!222 &1016496431 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1009042192} + m_GameObject: {fileID: 1016496428} m_CullTransparentMesh: 1 ---- !u!1 &1016496428 +--- !u!1 &1017792474 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5202,58 +5835,131 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1016496429} - - component: {fileID: 1016496431} - - component: {fileID: 1016496430} + - component: {fileID: 1017792475} + - component: {fileID: 1017792479} + - component: {fileID: 1017792478} + - component: {fileID: 1017792477} + - component: {fileID: 1017792476} m_Layer: 5 - m_Name: Image (1) + m_Name: SendExplicitTransaction m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1016496429 +--- !u!224 &1017792475 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} + m_GameObject: {fileID: 1017792474} 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: 317570298} - m_RootOrder: 0 + m_Children: + - {fileID: 11641991} + m_Father: {fileID: 220577105} + m_RootOrder: 10 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: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 7, y: 7} + m_SizeDelta: {x: 0, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1016496430 +--- !u!114 &1017792476 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} + m_GameObject: {fileID: 1017792474} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &1017792477 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1017792474} + 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: 1017792478} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceBoilerplates + m_MethodName: SendExplicitTransaction + 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 &1017792478 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1017792474} 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_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, 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: 7eeaa0f6357c9474abdf30939e119719, type: 3} - m_Type: 0 + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 @@ -5262,13 +5968,13 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1016496431 +--- !u!222 &1017792479 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} + m_GameObject: {fileID: 1017792474} m_CullTransparentMesh: 1 --- !u!1 &1035093046 GameObject: @@ -5837,6 +6543,155 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1151746260 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1151746261} + - component: {fileID: 1151746265} + - component: {fileID: 1151746264} + - component: {fileID: 1151746263} + - component: {fileID: 1151746262} + m_Layer: 5 + m_Name: SendImplicitTransaction + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1151746261 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1151746260} + 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: 236621039} + m_Father: {fileID: 220577105} + m_RootOrder: 9 + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1151746262 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1151746260} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &1151746263 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1151746260} + 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: 1151746264} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceBoilerplates + m_MethodName: SendImplicitTransaction + 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 &1151746264 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1151746260} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &1151746265 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1151746260} + m_CullTransparentMesh: 1 --- !u!1 &1158876111 GameObject: m_ObjectHideFlags: 0 @@ -8476,7 +9331,7 @@ MonoBehaviour: m_TargetGraphic: {fileID: 504017414} m_HandleRect: {fileID: 504017413} m_Direction: 2 - m_Value: 1 + m_Value: 0 m_Size: 1 m_NumberOfSteps: 0 m_OnValueChanged: diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index 7ab9e7df..90c876d8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -2,6 +2,7 @@ using System.Linq; using Sequence.EcosystemWallet; using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; using TMPro; using UnityEngine; using UnityEngine.UI; @@ -23,6 +24,11 @@ private enum ExplicitSessionType BasicRestrictive } + [Header("Config")] + [SerializeField] private EcosystemType _ecosystem; + [SerializeField] private Chain _chain; + + [Header("Components")] [SerializeField] private Button _emailLoginButton; [SerializeField] private Button _emailContinueButton; [SerializeField] private Button _signOutButton; @@ -38,24 +44,24 @@ private enum ExplicitSessionType [SerializeField] private MessagePopup _messagePopup; [SerializeField] private GenericObjectPool _sessionPool; - private SequenceConnect _login; private SequenceWallet _wallet; + private SequenceConnect _connect; private ImplicitSessionType _implicitPermissions; private ExplicitSessionType _explicitPermissions; private int _selectedWallet; private string _curEmail; private string _curSignature; - private Chain[] _chains = + private readonly Chain[] _chains = { Chain.TestnetArbitrumSepolia, - Chain.ArbitrumOne + Chain.ArbitrumOne, + Chain.Optimism, }; private void Start() { - _login = new(Chain.TestnetArbitrumSepolia, EcosystemType.Sequence); - + _connect = new SequenceConnect(_ecosystem, _chain); _emailInput.onValueChanged.AddListener(VerifyEmailInput); _messagePopup.gameObject.SetActive(false); _loadingOverlay.SetActive(false); @@ -68,8 +74,9 @@ private void Start() _chainDropdown.ClearOptions(); _chainDropdown.AddOptions(_chains.Select(c => c.ToString()).ToList()); - - if (_login.GetAllSessionWallets().Length > 0) + + _wallet = SequenceWallet.RecoverFromStorage(); + if (_wallet != null) ShowWallet(true); } @@ -79,7 +86,7 @@ public async void SignInWithEmail() try { - SessionSigner signer = await _login.SignInWithEmail(_curEmail, null); + _wallet = await _connect.SignInWithEmail(_curEmail); ShowWallet(false); } catch (Exception e) @@ -94,7 +101,7 @@ public async void SignInWithGoogle() try { - await _login.SignInWithGoogle(GetImplicitPermissions()); + _wallet = await _connect.SignInWithGoogle(GetImplicitPermissions()); ShowWallet(false); } catch (Exception e) @@ -109,7 +116,7 @@ public async void SignInWithApple() try { - await _login.SignInWithApple(GetImplicitPermissions()); + _wallet = await _connect.SignInWithApple(GetImplicitPermissions()); ShowWallet(false); } catch (Exception e) @@ -124,7 +131,7 @@ public async void SignInWithPasskey() try { - await _login.SignInWithPasskey(GetImplicitPermissions()); + _wallet = await _connect.SignInWithPasskey(GetImplicitPermissions()); ShowWallet(false); } catch (Exception e) @@ -139,7 +146,7 @@ public async void SignInWithMnemonic() try { - await _login.SignInWithMnemonic(GetImplicitPermissions()); + _wallet = await _connect.SignInWithMnemonic(GetImplicitPermissions()); ShowWallet(false); } catch (Exception e) @@ -193,8 +200,9 @@ public async void AddExplicitSession() try { - await _login.AddSession(GetExplicitPermissions()); - ShowWallet(false); + await _wallet.AddSession(_chain, GetExplicitPermissions()); + SetLoading(false); + LoadSessions(); } catch (Exception e) { @@ -204,13 +212,14 @@ public async void AddExplicitSession() public void SignOut() { - _login.SignOut(); + _wallet.SignOut(); EnableWalletState(false); } public void OnChainChanged(int index) { - _login.SetChain(_chains[index]); + _chain = _chains[index]; + _connect = new SequenceConnect(_ecosystem, _chain); } public void OnImplicitSessionTypeChanged(int index) @@ -239,7 +248,6 @@ private void ShowSignature(string signature) private void ShowWallet(bool recovered) { - _wallet = _login.GetWallet(); _walletText.text = _wallet.Address.Value; LoadSessions(); @@ -252,14 +260,13 @@ private void ShowWallet(bool recovered) private void RemoveSession(Address address) { - _login.RemoveSession(address); LoadSessions(); } private void LoadSessions() { _sessionPool.Cleanup(); - foreach (var wallet in _wallet.SessionSigners) + foreach (var wallet in _wallet.GetAllSigners()) _sessionPool.GetObject().Apply(wallet, RemoveSession); } @@ -281,6 +288,40 @@ public void EnableEmailButton(bool enable) _emailInput.gameObject.SetActive(!enable); } + public async void SendImplicitTransaction() + { + await _wallet.SendTransaction(Chain.TestnetArbitrumSepolia, new Call[] + { + new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, + ABI.ABI.FunctionSelector("implicitEmit()").HexStringToByteArray()) + }); + } + + public async void SendExplicitTransaction() + { + await _wallet.SendTransaction(Chain.TestnetArbitrumSepolia, new Call[] + { + new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, + ABI.ABI.FunctionSelector("explicitEmit()").HexStringToByteArray()) + }); + } + + public async void SendExplicitTransactionWithUsdc() + { + var calls = new Call[] + { + new(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, + ABI.ABI.FunctionSelector("explicitEmit()").HexStringToByteArray()) + }; + + var feeOptions = await _wallet.GetFeeOption(Chain.Optimism, calls); + var feeOption = feeOptions.First(o => o.token.symbol == "USDC"); + if (feeOption == null) + throw new Exception($"Fee option 'USDC' not available"); + + await _wallet.SendTransaction(Chain.Optimism, calls, feeOption); + } + private void SetLoading(bool value) { _loadingOverlay.SetActive(value); @@ -310,7 +351,7 @@ private SessionPermissions GetExplicitPermissions() private SessionPermissions GetPermissionsFromSessionType(int type) { - var templates = new SessionTemplates(_login.Chain); + var templates = new SessionTemplates(_chain); return type switch { 0 => null, diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs index 8bbeb96a..4a05d7c1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs @@ -11,20 +11,19 @@ public class SessionWalletTile : MonoBehaviour [SerializeField] private TMP_Text _addressText; [SerializeField] private Button _removeButton; - private SessionSigner _signer; + private Address _signer; private Action
_onRemove; - public void Apply(SessionSigner signer, Action
onRemove) + public void Apply(Address signer, Action
onRemove) { _signer = signer; _onRemove = onRemove; - _addressText.text = $"({(signer.IsExplicit ? "E" : "I")}) {signer.Address}"; - _removeButton.gameObject.SetActive(signer.IsExplicit); + _addressText.text = $"{_signer}"; } public void Remove() { - _onRemove?.Invoke(_signer.Address); + _onRemove?.Invoke(_signer); } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceBoilerplates.asmdef b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceBoilerplates.asmdef index 5a15c1a1..cf4a66df 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceBoilerplates.asmdef +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceBoilerplates.asmdef @@ -11,7 +11,8 @@ "GUID:403077141e1554429a890cbc129df651", "GUID:a67bc3d548bec4971b914c7b64c9e959", "GUID:19b9eb7db56cc47349571a4fbb0dd677", - "GUID:8cb4ab25ee18e4b4da9647cf481addbb" + "GUID:8cb4ab25ee18e4b4da9647cf481addbb", + "GUID:94b67778c44684afdab21990eebf60aa" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Config/SequenceConfig.asmdef b/Packages/Sequence-Unity/Sequence/SequenceSDK/Config/SequenceConfig.asmdef index d2bfce6d..0735f0d5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Config/SequenceConfig.asmdef +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Config/SequenceConfig.asmdef @@ -1,3 +1,14 @@ { - "name": "SequenceConfig" -} + "name": "SequenceConfig", + "rootNamespace": "", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs new file mode 100644 index 00000000..df6f1983 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs @@ -0,0 +1,70 @@ +using System; +using System.Threading.Tasks; +using Sequence.Config; +using Sequence.EcosystemWallet.Browser; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Wallet; + +namespace Sequence.EcosystemWallet +{ + internal class EcosystemClient + { + private readonly EcosystemType _ecosystem; + private readonly Chain _chain; + + public EcosystemClient(EcosystemType ecosystem, Chain chain) + { + _ecosystem = ecosystem; + _chain = chain; + } + + /// + /// Create an implicit- or explicit session based on a given set of permissions. + /// + /// The ecosystem you want to connect with. + /// The chain you want to connect with. + /// Leave it null to create an implicit session. Otherwise, we create an explicit session. + /// Leave it null to create an implicit session. Otherwise, we create an explicit session. + /// + /// + public async Task CreateNewSession(bool isExplicit, SessionPermissions permissions, string preferredLoginMethod, string email = null) + { + var sessionWallet = new EOAWallet(); + + var origin = RedirectOrigin.GetOriginString(); + var payload = new ConnectArgs + { + sessionAddress = sessionWallet.GetAddress(), + preferredLoginMethod = preferredLoginMethod, + email = email, + origin = origin, + permissions = permissions + }; + + var action = isExplicit ? "addExplicitSession" : "addImplicitSession"; + var ecosystemUrl = EcosystemBindings.GetUrl(_ecosystem); + var url = $"{ecosystemUrl}/request/connect"; + + var handler = RedirectFactory.CreateHandler(); + handler.SetRedirectUrl(origin); + + var response = await handler.WaitForResponse(url, action, payload); + if (!response.Result) + throw new Exception("Error during request"); + + var credentials = new SessionCredentials( + isExplicit, + sessionWallet.GetPrivateKeyAsHex(), + response.Data.walletAddress, + response.Data.attestation, + response.Data.signature, + (int)_ecosystem, + ChainDictionaries.ChainIdOf[_chain], + response.Data.loginMethod, + response.Data.email); + + SessionStorage.AddSession(credentials); + return new SessionSigner(credentials); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs.meta new file mode 100644 index 00000000..61248915 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8968b18f470a4bee87ea81b9f4c61894 +timeCreated: 1754979006 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs index 8b1f29dd..bfd0b0fe 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs @@ -8,7 +8,7 @@ public interface IWallet { Address Address { get; } Task SignMessage(string message); - Task GetFeeOption(Call[] calls); - Task SendTransaction(Call[] calls, FeeOption feeOption = null); + Task GetFeeOption(Chain chain, Call[] calls); + Task SendTransaction(Chain chain, Call[] calls, FeeOption feeOption = null); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index a8499ff6..7c4f6cde 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -1,157 +1,46 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Numerics; using System.Threading.Tasks; -using Newtonsoft.Json; -using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; -using Sequence.Wallet; -using UnityEngine; -using UnityEngine.Assertions; namespace Sequence.EcosystemWallet { public class SequenceConnect { - public static Action SessionsChanged; + private EcosystemClient _client; - public Chain Chain { get; private set; } - - private EcosystemType _ecosystem; - private EOAWallet _sessionWallet; - private SessionStorage _sessionStorage; - private List _credentials; - private SequenceWallet _wallet; - - public SequenceConnect(Chain chain, EcosystemType ecosystem) - { - SetChain(chain); - _ecosystem = ecosystem; - _sessionStorage = new SessionStorage(); - _credentials = _sessionStorage.GetSessions().ToList(); - } - - public void SetChain(Chain chain) - { - Chain = chain; - } - - public async Task AddSession(SessionPermissions permissions) + public SequenceConnect(EcosystemType ecosystem, Chain chain) { - Assert.IsNotNull(permissions); - return await CreateNewSession(true, permissions, string.Empty); + _client = new EcosystemClient(ecosystem, chain); } - public async Task SignInWithEmail(string email, SessionPermissions permissions = null) + public async Task SignInWithEmail(string email, SessionPermissions permissions = null) { - return await CreateNewSession(false, permissions,"email", email); + return await SignIn(permissions, "email", email); } - public async Task SignInWithGoogle(SessionPermissions permissions = null) + public async Task SignInWithGoogle(SessionPermissions permissions = null) { - return await CreateNewSession(false, permissions,"google"); + return await SignIn(permissions, "google", null); } - public async Task SignInWithApple(SessionPermissions permissions = null) + public async Task SignInWithApple(SessionPermissions permissions = null) { - return await CreateNewSession(false, permissions,"apple"); + return await SignIn(permissions, "apple", null); } - public async Task SignInWithPasskey(SessionPermissions permissions = null) + public async Task SignInWithPasskey(SessionPermissions permissions = null) { - return await CreateNewSession(false, permissions,"passkey"); + return await SignIn(permissions, "passkey", null); } - public async Task SignInWithMnemonic(SessionPermissions permissions = null) - { - return await CreateNewSession(false, permissions,"mnemonic"); - } - - public SequenceWallet GetWallet() - { - _wallet ??= new SequenceWallet(GetAllSessionWallets()); - return _wallet; - } - - public SessionSigner[] GetAllSessionWallets() - { - if (_credentials.Count == 0) - return Array.Empty(); - - var sessionWallets = new SessionSigner[_credentials.Count]; - for (var i = 0; i < _credentials.Count; i++) - sessionWallets[i] = new SessionSigner(_credentials[i]); - - return sessionWallets; - } - - public void SignOut() + public async Task SignInWithMnemonic(SessionPermissions permissions = null) { - _sessionStorage.Clear(); - _credentials.Clear(); - SessionsChanged?.Invoke(GetAllSessionWallets()); + return await SignIn(permissions, "mnemonic", null); } - public void RemoveSession(Address sessionAddress) - { - var index = _credentials.FindIndex(c => c.sessionAddress.Equals(sessionAddress)); - if (index == -1) - throw new Exception(""); - - _credentials.RemoveAt(index); - _sessionStorage.StoreSessions(_credentials.ToArray()); - SessionsChanged?.Invoke(GetAllSessionWallets()); - } - - /// - /// Create an implicit- or explicit session based on a given set of permissions. - /// - /// Leave it null to create an implicit session. Otherwise, we create an explicit session. - /// Leave it null to create an implicit session. Otherwise, we create an explicit session. - /// - /// - private async Task CreateNewSession(bool isExplicit, SessionPermissions permissions, string preferredLoginMethod, string email = null) + private async Task SignIn(SessionPermissions permissions, string preferredLoginMethod, string email) { - _sessionWallet = new EOAWallet(); - - var origin = RedirectOrigin.GetOriginString(); - var payload = new ConnectArgs - { - sessionAddress = _sessionWallet.GetAddress(), - preferredLoginMethod = preferredLoginMethod, - email = email, - origin = origin, - permissions = permissions - }; - - var action = isExplicit ? "addExplicitSession" : "addImplicitSession"; - var ecosystemUrl = EcosystemBindings.GetUrl(_ecosystem); - var url = $"{ecosystemUrl}/request/connect"; - - var handler = RedirectFactory.CreateHandler(); - handler.SetRedirectUrl(origin); - - var response = await handler.WaitForResponse(url, action, payload); - if (!response.Result) - throw new Exception("Error during request"); - - var credentials = new SessionCredentials( - isExplicit, - _sessionWallet.GetPrivateKeyAsHex(), - response.Data.walletAddress, - response.Data.attestation, - response.Data.signature, - (int)_ecosystem, - ChainDictionaries.ChainIdOf[Chain], - response.Data.loginMethod, - response.Data.email); - - _sessionStorage.AddSession(credentials); - _credentials.Add(credentials); - - SessionsChanged?.Invoke(GetAllSessionWallets()); - return new SessionSigner(credentials); + var signer = await _client.CreateNewSession(false, permissions,preferredLoginMethod, email); + return new SequenceWallet(new [] { signer }); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index 0e16a3a0..2cf24027 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -7,38 +7,59 @@ using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Primitives.Common; +using Sequence.EcosystemWallet.Utils; using Sequence.Relayer; using Sequence.Utils; +using UnityEngine; +using UnityEngine.Assertions; namespace Sequence.EcosystemWallet { - public class SequenceWallet : IWallet, IDisposable + public class SequenceWallet : IWallet { - public static Action OnWalletCreated; - public Address Address { get; } - public SessionSigner[] SessionSigners { get; private set; } - + + private SessionSigner[] _sessionSigners; private WalletState _state; internal SequenceWallet(SessionSigner[] sessionSigners) { - SessionSigners = sessionSigners; Address = sessionSigners[0].ParentAddress; - OnWalletCreated?.Invoke(this); - _state = new WalletState(Address); - SequenceConnect.SessionsChanged += SessionsChanged; + _sessionSigners = sessionSigners; + _state = new WalletState(Address); } - public void Dispose() + public static SequenceWallet RecoverFromStorage() { - SequenceConnect.SessionsChanged -= SessionsChanged; + var credentials = SessionStorage.GetSessions(); + var sessionWallets = new SessionSigner[credentials.Length]; + for (var i = 0; i < credentials.Length; i++) + sessionWallets[i] = new SessionSigner(credentials[i]); + + return new SequenceWallet(sessionWallets); } - private void SessionsChanged(SessionSigner[] sessionWallets) + public Address[] GetAllSigners() + { + return _sessionSigners.Select(x => x.Address).ToArray(); + } + + public async Task AddSession(Chain chain, SessionPermissions permissions) + { + Assert.IsNotNull(permissions); + + var ecosystem = _sessionSigners[0].Ecosystem; + var client = new EcosystemClient(ecosystem, chain); + + var sessionSigner = await client.CreateNewSession(true, permissions, string.Empty); + _sessionSigners.AddToArray(sessionSigner); + } + + public void SignOut() { - SessionSigners = sessionWallets; + SessionStorage.Clear(); + _sessionSigners = Array.Empty(); } public async Task SignMessage(string message) @@ -46,7 +67,7 @@ public async Task SignMessage(string message) var args = new SignMessageArgs { address = Address, - chainId = new BigInt((int)SessionSigners[0].Chain), + chainId = new BigInt((int)_sessionSigners[0].Chain), message = message }; @@ -63,29 +84,30 @@ public async Task SignMessage(string message) return response.Data; } - public async Task GetFeeOption(Call[] calls) + public async Task GetFeeOption(Chain chain, Call[] calls) { - await _state.Update(); - var transactionData = SignCalls(calls); - var relayer = new SequenceRelayer(SessionSigners[0].Chain); + await _state.Update(chain); + + var transactionData = await SignCalls(chain, calls, false); + var relayer = new SequenceRelayer(chain); - var args = new FeeOptionsArgs(Address, transactionData.To, transactionData.Data); + var args = new FeeOptionsArgs(transactionData.To, transactionData.To, transactionData.Data); var response = await relayer.GetFeeOptions(args); return response.options; } - public async Task SendTransaction(Call[] calls, FeeOption feeOption = null) + public async Task SendTransaction(Chain chain, Call[] calls, FeeOption feeOption = null) { - await _state.Update(); + await _state.Update(chain); if (feeOption != null) { var encodedFeeOptionData = ABI.ABI.Pack("transfer(address,uint256)", - feeOption.to, feeOption.value).HexStringToByteArray(); + feeOption.to, BigInteger.Parse(feeOption.value)).HexStringToByteArray(); var feeOptionCall = new Call( - feeOption.token, + feeOption.token.contractAddress, 0, encodedFeeOptionData, feeOption.gasLimit, @@ -96,9 +118,9 @@ public async Task SendTransaction(Call[] calls, FeeOption feeOption = nu calls = calls.Unshift(feeOptionCall); } - var transactionData = SignCalls(calls); + var transactionData = await SignCalls(chain, calls, true); - var relayer = new SequenceRelayer(SessionSigners[0].Chain); + var relayer = new SequenceRelayer(chain); var hash = await relayer.Relay(transactionData.To, transactionData.Data); MetaTxnReceipt receipt = null; @@ -117,15 +139,15 @@ public async Task SendTransaction(Call[] calls, FeeOption feeOption = nu return receipt.txnReceipt; } - private TransactionData SignCalls(Call[] calls) + private async Task SignCalls(Chain chain, Call[] calls, bool checkDeployed) { var preparedIncrement = PrepareIncrement(null, 0, null); if (preparedIncrement != null) calls.AddToArray(preparedIncrement); - var envelope = PrepareTransaction(calls); + var envelope = PrepareTransaction(chain, calls); - var signature = SignSapient(envelope); + var signature = await SignSapient(chain, envelope); var sapientSignature = new SapientSignature { imageHash = _state.SessionsImageHash, @@ -138,18 +160,46 @@ private TransactionData SignCalls(Call[] calls) rawSignature.suffix = _state.ConfigUpdates .Select(u => RawSignature.Decode(u.signature.HexStringToByteArray())).ToArray(); - if (_state.IsDeployed) + var callsData = ABI.ABI.Pack("execute(bytes,bytes)", + envelope.payload.Encode(), + rawSignature.Encode()); + + if (!checkDeployed || _state.IsDeployed) { return new TransactionData { To = Address, - Data = ABI.ABI.Pack("execute(bytes,bytes)", - envelope.payload.Encode(), - rawSignature.Encode()) + Data = callsData }; } - - throw new Exception("wallet status is not deployed"); + + var deployTransaction = BuildDeployTransaction(); + return new TransactionData + { + To = new Address("0xf3c7175460BeD3340A1c4dc700fD6C8Cd3F56250"), + Data = new Calls(0, 0, new Call[] + { + new (deployTransaction.To, 0, deployTransaction.Data.HexStringToByteArray()), + new (Address, 0, callsData.HexStringToByteArray()) + }).Encode().ByteArrayToHexStringWithPrefix() + }; + } + + private TransactionData BuildDeployTransaction() + { + var deployTransaction = Erc6492Helper.Deploy(_state.DeployHash, new Erc6492Helper.Context + { + creationCode = _state.DeployContext.walletCreationCode, + factory = _state.DeployContext.factory, + stage1 = _state.DeployContext.mainModule, + stage2 = _state.DeployContext.mainModuleUpgradable + }); + + return new TransactionData + { + To = new Address(deployTransaction.To), + Data = deployTransaction.Data + }; } private Call PrepareIncrement(Address wallet, BigInteger chainId, Calls calls) @@ -157,18 +207,18 @@ private Call PrepareIncrement(Address wallet, BigInteger chainId, Calls calls) return null; } - private Envelope PrepareTransaction(Call[] calls) + private Envelope PrepareTransaction(Chain chain, Call[] calls) { return new Envelope { - chainId = BigInteger.Parse(ChainDictionaries.ChainIdOf[SessionSigners[0].Chain]), + chainId = BigInteger.Parse(ChainDictionaries.ChainIdOf[chain]), wallet = Address, configuration = _state.Config, payload = new Calls(0, _state.Nonce, calls) }; } - private SignatureOfSapientSignerLeaf SignSapient(Envelope envelope) + private async Task SignSapient(Chain chain, Envelope envelope) { var calls = envelope.payload.calls; if (calls.Length == 0) @@ -177,7 +227,7 @@ private SignatureOfSapientSignerLeaf SignSapient(Envelope envelope) var implicitSigners = new List
(); var explicitSigners = new List
(); - var signers = FindSignersForCalls(calls); + var signers = await FindSignersForCalls(chain, calls); var signatures = new SessionCallSignature[signers.Length]; for (var i = 0; i < signers.Length; i++) @@ -208,7 +258,7 @@ private SignatureOfSapientSignerLeaf SignSapient(Envelope envelope) }; } - private SessionSigner[] FindSignersForCalls(Call[] calls) + private async Task FindSignersForCalls(Chain chain, Call[] calls) { var identitySigner = _state.SessionsTopology.GetIdentitySigner(); if (identitySigner == null) @@ -218,14 +268,14 @@ private SessionSigner[] FindSignersForCalls(Call[] calls) if (blacklist == null) throw new Exception("blacklist is null"); - var validImplicitSigners = SessionSigners.Where(s => + var validImplicitSigners = _sessionSigners.Where(s => !s.IsExplicit && s.IdentitySigner.Equals(identitySigner) && !blacklist.Contains(s.Address) ).ToArray(); var explicitSigners = _state.SessionsTopology.GetExplicitSigners(); - var validExplicitSigners = SessionSigners + var validExplicitSigners = _sessionSigners .Where(s => s.IsExplicit && Array.Exists(explicitSigners, es => es.Equals(s.Address))).ToArray(); @@ -238,8 +288,14 @@ private SessionSigner[] FindSignersForCalls(Call[] calls) { foreach (var signer in availableSigners) { - if (signer.IsSupportedCall(call, _state.SessionsTopology)) + Debug.Log($"Checking signer {signer.Address}"); + var supported = await signer.IsSupportedCall(call, chain, _state.SessionsTopology); + if (supported) + { signers.Add(signer); + Debug.Log($"Using signer {signer.Address}"); + break; + } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs index c3f0dd41..0c1c2eda 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs @@ -8,16 +8,14 @@ namespace Sequence.EcosystemWallet public class SessionBuilder { public Chain Chain; - public Address Signer; public BigInteger ValueLimit; public BigInteger Deadline; private Dictionary> _permissions = new(); - public SessionBuilder(Chain chain, Address signer, BigInteger valueLimit, BigInteger deadline) + public SessionBuilder(Chain chain, BigInteger valueLimit, BigInteger deadline) { this.Chain = chain; - this.Signer = signer; this.ValueLimit = valueLimit; this.Deadline = deadline; } @@ -61,8 +59,8 @@ public SessionPermissions GetPermissions() return new SessionPermissions { + signer = new Address("0xb7bE532959236170064cf099e1a3395aEf228F44"), chainId = new BigInteger((int)Chain), - signer = new Address(Signer), valueLimit = ValueLimit, deadline = Deadline, permissions = permissions diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs index fc2312eb..1d2ae260 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs @@ -1,18 +1,23 @@ using System; using System.Numerics; +using System.Threading.Tasks; using Sequence.ABI; using Sequence.EcosystemWallet.Primitives; +using Sequence.Provider; using Sequence.Signer; using Sequence.Utils; using Sequence.Wallet; namespace Sequence.EcosystemWallet { - public class SessionSigner + internal class SessionSigner { + private static readonly Address ValueTrackingAddress = new ("0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"); + public Address ParentAddress { get; } public Address Address { get; } public Chain Chain { get; } + public EcosystemType Ecosystem { get; } public bool IsExplicit { get; } public Address IdentitySigner @@ -40,11 +45,15 @@ internal SessionSigner(SessionCredentials credentials) ParentAddress = credentials.address; Address = new EOAWallet(credentials.privateKey).GetAddress(); Chain = ChainDictionaries.ChainById[credentials.chainId]; + Ecosystem = (EcosystemType)credentials.ecosystemId; IsExplicit = credentials.isExplicit; } - public bool IsSupportedCall(Call call, SessionsTopology topology) + public async Task IsSupportedCall(Call call, Chain chain, SessionsTopology topology) { + if (Chain != chain) + return false; + if (IsExplicit) { if (call.data.Length > 4 && @@ -54,23 +63,43 @@ public bool IsSupportedCall(Call call, SessionsTopology topology) return true; } - var permission = FindSupportedPermission(call, topology); - return true; + var supportedPermission = FindSupportedPermission(call, topology); + return supportedPermission.Index >= 0; } - - return true; + + var response = await new SequenceEthClient(chain).CallContract(new object[] { + new + { + to = call.to, + data = GetAcceptImplicitRequestFunctionAbi(call) + } + }); + + var expectedResult = GenerateImplicitRequestMagic(ParentAddress, _credentials.attestation); + return response == expectedResult; } - public Permission FindSupportedPermission(Call call, SessionsTopology topology) + private (int Index, Permission Permission) FindSupportedPermission(Call call, SessionsTopology topology) { - var permissions = topology.GetPermissions()?.permissions; - return permissions is {Length: > 0} ? permissions[0] : null; - } + var sessionPermissions = topology.GetPermissions(Address); + if (sessionPermissions == null || ChainDictionaries.ChainById[sessionPermissions.chainId.ToString()] != Chain) + return (-1, null); - public int FindSupportedPermissionIndex(Call call, SessionsTopology topology) - { - var permissions = topology.GetPermissions()?.permissions; - return permissions is {Length: > 0} ? 0 : -1; + // TODO: Read current usage limit, use ValueTrackingAddress + var exceededLimit = call.value > 0 && call.value > sessionPermissions.valueLimit; + if (exceededLimit) + return (-1, null); + + var permissionIndex = 0; + foreach (var permission in sessionPermissions.permissions) + { + if (permission.target.Equals(call.to)) + break; + + permissionIndex++; + } + + return (permissionIndex, sessionPermissions.permissions[permissionIndex]); } public SessionCallSignature SignCall(Call call, SessionsTopology topology, BigInteger space, BigInteger nonce) @@ -89,7 +118,7 @@ public SessionCallSignature SignCall(Call call, SessionsTopology topology, BigIn if (!(call.data.Length > 4 && call.data.Slice(4).ByteArrayToHexStringWithPrefix() == ABI.ABI.FunctionSelector("incrementUsageLimit"))) { - permissionIndex = FindSupportedPermissionIndex(call, topology); + permissionIndex = FindSupportedPermission(call, topology).Index; if (permissionIndex == -1) throw new Exception("Invalid permission"); } @@ -119,5 +148,32 @@ private byte[] HashCallWithReplayProtection(Call call, BigInteger space, BigInte var concatenated = ByteArrayExtensions.ConcatenateByteArrays(chainBytes, spaceBytes, nonceBytes, callHashBytes); return SequenceCoder.KeccakHash(concatenated); } + + private string GetAcceptImplicitRequestFunctionAbi(Call call) + { + var attestation = _credentials.attestation; + var attestationData = new Tuple>( + attestation.approvedSigner, + new FixedByte(4, attestation.identityType.Data), new FixedByte(32, attestation.issuerHash.Data), new FixedByte(32, attestation.audienceHash.Data), attestation.applicationData.Data, + new Tuple(attestation.authData.redirectUrl, attestation.authData.issuedAt)); + + var callData = new Tuple(call.to, call.value, + call.data, call.gasLimit, call.delegateCall, call.onlyFallback, (int)call.behaviorOnError); + + return ABI.ABI.Pack( + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))", + ParentAddress, attestationData, callData); + } + + private string GenerateImplicitRequestMagic(Address address, Attestation attestation) + { + return SequenceCoder.KeccakHash( + ByteArrayExtensions.ConcatenateByteArrays( + SequenceCoder.KeccakHash("acceptImplicitRequest".ToByteArray()), + address.Value.HexStringToByteArray(20), + attestation.audienceHash.Data, + attestation.issuerHash.Data)) + .ByteArrayToHexStringWithPrefix(); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs index 891e2805..ca3ba61e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs @@ -16,11 +16,10 @@ public SessionTemplates(Chain chain) public SessionPermissions BuildUnrestrictivePermissions() { - var signer = new Address("0xb7bE532959236170064cf099e1a3395aEf228F44"); + var target = new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"); var deadline = new BigInteger(DateTime.UtcNow.ToUnixTimestamp() * 1000 + 1000 * 60 * 5000); - var target = new Address("0x8F6066bA491b019bAc33407255f3bc5cC684A5a4"); - var sessionBuilder = new SessionBuilder(_chain, signer, 0, deadline); + var sessionBuilder = new SessionBuilder(_chain, 0, deadline); sessionBuilder.AddPermission(target); return sessionBuilder.GetPermissions(); @@ -28,11 +27,10 @@ public SessionPermissions BuildUnrestrictivePermissions() public SessionPermissions BuildBasicRestrictivePermissions() { - var signer = new Address("0xb7bE532959236170064cf099e1a3395aEf228F44"); var deadline = new BigInteger(DateTime.UtcNow.ToUnixTimestamp() * 1000 + 1000 * 60 * 5000); - var target = new Address("0x8F6066bA491b019bAc33407255f3bc5cC684A5a4"); + var target = new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"); - var sessionBuilder = new SessionBuilder(_chain, signer, 0, deadline); + var sessionBuilder = new SessionBuilder(_chain, 0, deadline); sessionBuilder.AddPermission(target, false, ParameterOperation.equal, ABI.ABI.FunctionSelector("explicitEmit()"), 0, ParameterRule.SelectorMask); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs index e55c50e6..b24f650f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; using Newtonsoft.Json; using Sequence.Utils; using Sequence.Utils.SecureStorage; @@ -7,48 +6,38 @@ namespace Sequence.EcosystemWallet { - internal class SessionStorage + internal static class SessionStorage { private static readonly string WalletAddressKey = $"sequence-wallet-address-{Application.companyName}-{Application.productName}"; private static readonly string SessionsKey = $"sequence-sessions-{Application.companyName}-{Application.productName}"; - private readonly ISecureStorage _storage = SecureStorageFactory.CreateSecureStorage(); + private static readonly ISecureStorage Storage = SecureStorageFactory.CreateSecureStorage(); - public void Clear() + public static void Clear() { - _storage.StoreString(WalletAddressKey, string.Empty); - _storage.StoreString(SessionsKey, string.Empty); + Storage.StoreString(WalletAddressKey, string.Empty); + Storage.StoreString(SessionsKey, string.Empty); } - public void StoreWalletAddress(string walletAddress) - { - _storage.StoreString(WalletAddressKey, walletAddress); - } - - public string GetWalletAddress() - { - return _storage.RetrieveString(WalletAddressKey); - } - - public void AddSession(SessionCredentials session) + public static void AddSession(SessionCredentials session) { var sessions = GetSessions(); var newSessions = sessions.AddToArray(session); StoreSessions(newSessions); } - public void StoreSessions(SessionCredentials[] sessions) - { - var json = JsonConvert.SerializeObject(sessions); - _storage.StoreString(SessionsKey, json); - } - - public SessionCredentials[] GetSessions() + public static SessionCredentials[] GetSessions() { - var json = _storage.RetrieveString(SessionsKey); + var json = Storage.RetrieveString(SessionsKey); return string.IsNullOrEmpty(json) ? Array.Empty() : JsonConvert.DeserializeObject(json); } + + private static void StoreSessions(SessionCredentials[] sessions) + { + var json = JsonConvert.SerializeObject(sessions); + Storage.StoreString(SessionsKey, json); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs index 9f8b136a..22090c86 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Nethereum.ABI.FunctionEncoding; using Nethereum.ABI.Model; +using Sequence.EcosystemWallet.KeyMachine.Models; using Sequence.EcosystemWallet.Primitives; using Sequence.Provider; using Sequence.Utils; @@ -18,7 +19,9 @@ internal class WalletState public Address Address { get; } public string ImageHash { get; private set; } public string SessionsImageHash { get; private set; } - public bool IsDeployed { get; private set; } = true; // At what condition is this false? + public bool IsDeployed { get; private set; } + public string DeployHash { get; private set; } + public DeployHashContext DeployContext { get; private set; } public BigInteger Nonce { get; private set; } public Primitives.Config Config { get; private set; } public SessionsTopology SessionsTopology { get; private set; } @@ -28,12 +31,15 @@ internal class WalletState public WalletState(Address address) { - this.Address = address; + Address = address; } - public async Task Update() + public async Task Update(Chain chain) { var deployResponse = await _keyMachine.GetDeployHash(Address); + DeployHash = deployResponse.deployHash; + DeployContext = deployResponse.context; + var configUpdates = await _keyMachine.GetConfigUpdates(Address, deployResponse.deployHash); var imageHash = configUpdates.updates.Length > 0 ? configUpdates.updates[^1].toImageHash : deployResponse.deployHash; @@ -54,10 +60,16 @@ public async Task Update() Debug.Log($"Sessions Topology {sessionsTopology.JsonSerialize()}"); - await UpdateNonce(0); + await UpdateNonce(chain, 0); + + var ethClient = new SequenceEthClient(chain); + var response = await ethClient.CodeAt(Address, "pending"); + IsDeployed = response != "0x"; + + Debug.Log($"Is deployed: {IsDeployed}"); } - public async Task UpdateNonce(BigInteger space) + public async Task UpdateNonce(Chain chain, BigInteger space) { var function = new FunctionABI("readNonce", false) { @@ -70,7 +82,7 @@ public async Task UpdateNonce(BigInteger space) var encoder = new FunctionCallEncoder(); var data = encoder.EncodeRequest(function.Sha3Signature, function.InputParameters, space); - var response = await new SequenceEthClient(Chain.TestnetArbitrumSepolia).CallContract(new object[] { + var response = await new SequenceEthClient(chain).CallContract(new object[] { new { to = Address, diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Config.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Config.meta new file mode 100644 index 00000000..b41a8bac --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Config.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b02610d2c00a4dc1b4e36c5565505f86 +timeCreated: 1754980396 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs index 5701bc3a..de34eb12 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs @@ -19,10 +19,10 @@ internal struct DeployHashReturn internal struct DeployHashContext { public int version; - public string factory; + public Address factory; public string guestModule; - public string mainModule; - public string mainModuleUpgradable; + public Address mainModule; + public Address mainModuleUpgradable; public string walletCreationCode; } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs index 3db10dd6..826c4ad9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs @@ -4,6 +4,7 @@ using System.Numerics; using Newtonsoft.Json; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -21,6 +22,7 @@ public object ToJson() return new { chainId = chainId, + signer = signer, valueLimit = valueLimit, deadline = deadline, permissions = permissions.Select(permission => permission.ToJson()).ToArray() @@ -56,7 +58,7 @@ public static SessionPermissions Decode(byte[] data) var chainId = new BigInteger(data.AsSpan(20, 32).ToArray(), isUnsigned: true, isBigEndian: true); var valueLimit = new BigInteger(data.AsSpan(52, 32).ToArray(), isUnsigned: true, isBigEndian: true); var deadline = new BigInteger(data.AsSpan(84, 8).ToArray(), isUnsigned: true, isBigEndian: true); - + var permissionsLength = data[92]; var pointer = 93; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs index db7d21a9..93fe8ba0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs @@ -4,7 +4,6 @@ using System.Numerics; using Newtonsoft.Json; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index 92718ac5..4b781354 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -6,6 +6,7 @@ using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -165,9 +166,25 @@ public Address[] GetImplicitBlacklist() return this.FindLeaf().blacklist; } - public SessionPermissions GetPermissions() + public SessionPermissions GetPermissions(Address signer) { - return this.FindLeaf().permissions; + if (this.IsBranch()) + { + var sessionChildren = Branch.Children as SessionsTopology[]; + foreach (var child in sessionChildren) + { + var permissions = child.GetPermissions(signer); + if (permissions != null) + return permissions; + } + + return null; + } + + if (this.IsLeaf() && Leaf is PermissionLeaf permissionLeaf && permissionLeaf.permissions.signer.Equals(signer)) + return permissionLeaf.permissions; + + return null; } public Address[] GetExplicitSigners() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs index b8dd6953..b2cbbc1c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs @@ -19,10 +19,15 @@ internal class LocalhostRedirectHandler : RedirectHandler var listener = new HttpListener(); listener.Prefixes.Add(RedirectUrl.AppendTrailingSlashIfNeeded()); listener.Start(); + + var result = await Task.WhenAny(listener.GetContextAsync(), WaitDelay()); + var context = result.Result; - var context = await listener.GetContextAsync(); listener.Stop(); + if (context == null) + throw new Exception("Request timed out."); + var queryString = context.Request.QueryString; var id = queryString["id"]; @@ -45,5 +50,11 @@ internal class LocalhostRedirectHandler : RedirectHandler return (false, default); } } + + private async Task WaitDelay() + { + await Task.Delay(10000); + return null; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/ABI.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/ABI.cs index 82b84563..c8023569 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/ABI.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/ABI.cs @@ -345,7 +345,8 @@ public static ABIType GetParameterType(object param) break; } - return ABIType.FIXEDARRAY; + // TODO: Change back to FIXEDBYTES + return ABIType.BYTES; } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/FunctionAbi.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/FunctionAbi.cs index 052c9d7a..53fdc450 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/FunctionAbi.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/FunctionAbi.cs @@ -3,6 +3,7 @@ using System.Text; using Sequence.Utils; using UnityEditor; +using UnityEngine; namespace Sequence.ABI { @@ -186,6 +187,7 @@ public T DecodeReturnValue(string value, string functionName, params object[] private string GetReturnType(string functionName, params object[] args) { int index = GetFunctionAbiIndex(functionName, args); + Debug.Log($"ReturnType Index {this.Abi[functionName][index].Item2}"); return this.Abi[functionName][index].Item2; } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs index d9ea3017..47978987 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs @@ -1,10 +1,24 @@ +using System.Numerics; + namespace Sequence.Relayer { public class FeeOption { - public Address token; + public FeeToken token; public string to; public string value; public int gasLimit; } + + public class FeeToken + { + public BigInteger chainId; + public Address contractAddress; + public int decimals; + public string logoURL; + public string name; + public string symbol; + public string tokenID; + public string type; + } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs index 0fc256c9..67c3f392 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs @@ -16,7 +16,8 @@ public SequenceRelayer(Chain chain) { var name = chain switch { - Chain.ArbitrumOne => "v3-arbitrum", + Chain.Optimism => "dev-optimism", + Chain.ArbitrumOne => "dev-arbitrum", Chain.TestnetArbitrumSepolia => "dev-arbitrum-sepolia", _ => throw new NotSupportedException($"Chain {chain} not supported.") }; From 5ff98dca87fbad50b388f8e08e2e5e31db5a17b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 12 Aug 2025 09:13:25 +0200 Subject: [PATCH 134/165] added IConnect interface --- .../UnitTests/AuthenticationTests.cs | 4 +- .../UnitTests/TransactionTests.cs | 2 +- .../SequenceEcosystemWalletWindow.cs | 6 +-- .../Authentication/IConnect.cs | 44 +++++++++++++++++++ .../Authentication/IConnect.cs.meta | 3 ++ .../EcosystemWallet/Authentication/IWallet.cs | 43 ++++++++++++++++++ .../Authentication/SequenceConnect.cs | 2 +- .../Authentication/SequenceWallet.cs | 4 +- .../SequenceSDK/EcosystemWallet/Config.meta | 3 -- 9 files changed, 99 insertions(+), 12 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Config.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs index e194c27c..72355a5b 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs @@ -9,9 +9,9 @@ public class AuthenticationTests private static readonly EcosystemType Ecosystem = EcosystemType.Sequence; [Test] - public void SignOut() + public void Disconnect() { - SequenceWallet.RecoverFromStorage().SignOut(); + SequenceWallet.RecoverFromStorage().Disconnect(); } [Test] diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs index 9ab3f6a4..055b3c6d 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs @@ -22,7 +22,7 @@ public class TransactionTests new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, ABI.ABI.FunctionSelector("explicitEmit()").HexStringToByteArray()) }; - private static SequenceWallet Wallet => SequenceWallet.RecoverFromStorage(); + private static IWallet Wallet => SequenceWallet.RecoverFromStorage(); [Test] public async Task AddPermissionForUsdcTransfer() diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index 90c876d8..751bf24f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -44,8 +44,8 @@ private enum ExplicitSessionType [SerializeField] private MessagePopup _messagePopup; [SerializeField] private GenericObjectPool _sessionPool; - private SequenceWallet _wallet; - private SequenceConnect _connect; + private IWallet _wallet; + private IConnect _connect; private ImplicitSessionType _implicitPermissions; private ExplicitSessionType _explicitPermissions; private int _selectedWallet; @@ -212,7 +212,7 @@ public async void AddExplicitSession() public void SignOut() { - _wallet.SignOut(); + _wallet.Disconnect(); EnableWalletState(false); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs new file mode 100644 index 00000000..6fcdd569 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs @@ -0,0 +1,44 @@ +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet +{ + public interface IConnect + { + /// + /// Sign in using email through an external browser. + /// + /// + /// + /// + Task SignInWithEmail(string email, SessionPermissions permissions = null); + + /// + /// Sign in with Google through an external browser. + /// + /// + /// + Task SignInWithGoogle(SessionPermissions permissions = null); + + /// + /// Sign in with Apple through an external browser. + /// + /// + /// + Task SignInWithApple(SessionPermissions permissions = null); + + /// + /// Sign in with a passkey through an external browser. + /// + /// + /// + Task SignInWithPasskey(SessionPermissions permissions = null); + + /// + /// Sign in using a mnemonic through an external browser. + /// + /// + /// + Task SignInWithMnemonic(SessionPermissions permissions = null); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs.meta new file mode 100644 index 00000000..8784497e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 44443c86b05e4b6dbf370a6333f1abb4 +timeCreated: 1754982644 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs index bfd0b0fe..005c962c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs @@ -6,9 +6,52 @@ namespace Sequence.EcosystemWallet { public interface IWallet { + /// + /// The parent address of this wallet. + /// Address Address { get; } + + /// + /// Retrieves all signer addresses that you connected to your wallet. + /// + /// + Address[] GetAllSigners(); + + /// + /// Add sessions to extend your permissions. + /// + /// + /// + /// + Task AddSession(Chain chain, SessionPermissions permissions); + + /// + /// Clear all session signers from storage. This requires you to re-connect using the SequenceConnect object. + /// + void Disconnect(); + + /// + /// Sign a message through an external browser. + /// + /// The message you want to sign. + /// Task SignMessage(string message); + + /// + /// Get fee options for your calls. Only required for mainnets, if you don't have gas sponsorship configured. + /// + /// + /// + /// Task GetFeeOption(Chain chain, Call[] calls); + + /// + /// Send a transaction. + /// + /// + /// + /// + /// Task SendTransaction(Chain chain, Call[] calls, FeeOption feeOption = null); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index 7c4f6cde..022d899b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -3,7 +3,7 @@ namespace Sequence.EcosystemWallet { - public class SequenceConnect + public class SequenceConnect : IConnect { private EcosystemClient _client; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index 2cf24027..f3a4c261 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -30,7 +30,7 @@ internal SequenceWallet(SessionSigner[] sessionSigners) _state = new WalletState(Address); } - public static SequenceWallet RecoverFromStorage() + public static IWallet RecoverFromStorage() { var credentials = SessionStorage.GetSessions(); var sessionWallets = new SessionSigner[credentials.Length]; @@ -56,7 +56,7 @@ public async Task AddSession(Chain chain, SessionPermissions permissions) _sessionSigners.AddToArray(sessionSigner); } - public void SignOut() + public void Disconnect() { SessionStorage.Clear(); _sessionSigners = Array.Empty(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Config.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Config.meta deleted file mode 100644 index b41a8bac..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Config.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: b02610d2c00a4dc1b4e36c5565505f86 -timeCreated: 1754980396 \ No newline at end of file From b8f111312741331d8d309055743a256cf1107b3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 12 Aug 2025 09:38:49 +0200 Subject: [PATCH 135/165] started adding TDDs for authentication and transactions --- .../EcosystemWallet/AUTHENTICATION.md | 39 +++++++++++++++++++ .../EcosystemWallet/AUTHENTICATION.md.meta | 3 ++ .../{Primitives/README.md => PRIMITIVES.md} | 2 +- .../README.md.meta => PRIMITIVES.md.meta} | 0 .../EcosystemWallet/TRANSACTIONS.md | 31 +++++++++++++++ .../EcosystemWallet/TRANSACTIONS.md.meta | 3 ++ 6 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/AUTHENTICATION.md create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/AUTHENTICATION.md.meta rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Primitives/README.md => PRIMITIVES.md} (98%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Primitives/README.md.meta => PRIMITIVES.md.meta} (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/TRANSACTIONS.md create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/TRANSACTIONS.md.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/AUTHENTICATION.md b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/AUTHENTICATION.md new file mode 100644 index 00000000..9c5ae45c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/AUTHENTICATION.md @@ -0,0 +1,39 @@ +# Sequence Ecosystem Wallets - Authentication + +We create a local signer and let the user define a set of permissions (or none) to connect that signer and its +permissions to their wallet. Authentication is done through external browsers to open the wallet app for +a specified ecosystem. + +## Signers + +When creating sessions, we create a local signer and make a request to the wallet app to connect that signer +to our wallet. This signer and its permissions will be included in the sessions topology we get from the 'Tree' +endpoint from the key machine api. + +## Redirect Handlers + +The application receives response data through a deeplink. +The SDK automatically generates the url scheme based on the application identifier defined in the unity project. + +### Editor + +We perform redirects through a localhost port. We define the http://localhost:4444 as the redirect url, which will +send session data. + +### iOS + +Using the native SafariViewController class to perform in-app requests. + +### Android + +Using the native Custom Chrome Tabs (CCT) class to perform in-app requests. + +### Windows + + + +### MacOS + + + +### WebGL diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/AUTHENTICATION.md.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/AUTHENTICATION.md.meta new file mode 100644 index 00000000..7969329e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/AUTHENTICATION.md.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ac1032b366174ce989ff37114a9c92da +timeCreated: 1754983341 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/PRIMITIVES.md similarity index 98% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/PRIMITIVES.md index 59c4f3a9..b522c68a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/PRIMITIVES.md @@ -1,4 +1,4 @@ -# Sequence Wallets v3 - Primitives +# Sequence Ecosystem Wallets - Primitives The goal of this Technical Design Document (TDD) is to document the architecture for each primitive. The integration of v3 primitives in C# is fully encapsulated from Unity and aims to be an object-oriented library for diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/PRIMITIVES.md.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/README.md.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/PRIMITIVES.md.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/TRANSACTIONS.md b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/TRANSACTIONS.md new file mode 100644 index 00000000..661321e0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/TRANSACTIONS.md @@ -0,0 +1,31 @@ +# Sequence Ecosystem Wallets - Transactions + +Transactions are encoded and signed natively in this SDK and send to our relayer. + +## Implicit + +Implicit transactions require a contract that supports them. We make an eth_call to the contract to validate +if a certain signer is allowed to perform an implicit transaction for a specified call. + +## Explicit + +Explicit sessions require a signer + +## Key Machine + +There's a 'KeyMachineApi' class used to request wallet data such as the current image hash, config updates +or the config- and session topologies from an image hash. + +## Envelope + +We pack together the calls with the parent address. Then when we sign calls, we include them in a 'signed envelope' +and encode that together to send the transactions to the relayer. + +## Dependencies + +--- + +- Newtonsoft.Json +- Nethereum.ABI +- Nethereum.Hex +- Nethereum.Web3 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/TRANSACTIONS.md.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/TRANSACTIONS.md.meta new file mode 100644 index 00000000..f1270134 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/TRANSACTIONS.md.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 72b69134a56f45e686bd543ad50329a7 +timeCreated: 1754983385 \ No newline at end of file From 2592bf673aea94a2b31e52c80ad99626559bea33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 12 Aug 2025 14:41:22 +0200 Subject: [PATCH 136/165] deploy transaction --- .../UnitTests/AuthenticationTests.cs | 2 +- .../Sequence/Samples~/Demo V3/DemoV3.unity | 4 ++++ .../SequenceEcosystemWalletWindow.cs | 5 +++-- .../Authentication/EcosystemClient.cs | 7 +++++-- .../Authentication/SequenceConnect.cs | 2 +- .../Authentication/SequenceWallet.cs | 2 +- .../EcosystemWallet/Authentication/SessionSigner.cs | 1 + .../Authentication/SessionTemplates.cs | 3 +-- .../RedirectHandler/LocalhostRedirectHandler.cs | 13 +++---------- .../EcosystemWallet/Utils/Erc6492Helper.cs | 11 ++--------- 10 files changed, 22 insertions(+), 28 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs index 72355a5b..c5eb3a5b 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs @@ -25,7 +25,7 @@ public async Task SignInWithGoogle() public async Task AddUnrestrictiveExplicitSession() { var wallet = SequenceWallet.RecoverFromStorage(); - await wallet.AddSession(Chain, new SessionTemplates(Chain).BuildUnrestrictivePermissions()); + await wallet.AddSession(Chain, new SessionTemplates(Chain).BuildUnrestrictivePermissions(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"))); } [Test] diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index c74237c8..77ceb1e0 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -4712,6 +4712,8 @@ MonoBehaviour: m_Options: - m_Text: Unrestrictive m_Image: {fileID: 0} + - m_Text: Unrestrictive (USDC) + m_Image: {fileID: 0} - m_Text: Basic Restrictive m_Image: {fileID: 0} m_OnValueChanged: @@ -12367,6 +12369,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a76f3494846944de2a0d1694eeb60856, type: 3} m_Name: m_EditorClassIdentifier: + _ecosystem: 0 + _chain: 421614 _emailLoginButton: {fileID: 1459061464521247473} _emailContinueButton: {fileID: 2325936309338030303} _signOutButton: {fileID: 906953581} diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index 751bf24f..d6fe9aab 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -355,8 +355,9 @@ private SessionPermissions GetPermissionsFromSessionType(int type) return type switch { 0 => null, - 1 => templates.BuildUnrestrictivePermissions(), - 2 => templates.BuildBasicRestrictivePermissions(), + 1 => templates.BuildUnrestrictivePermissions(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA")), + 2 => templates.BuildUnrestrictivePermissions(new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607")), + 3 => templates.BuildBasicRestrictivePermissions(), _ => throw new Exception("Unsupported session type") }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs index df6f1983..a0b0aa49 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs @@ -4,6 +4,7 @@ using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; using Sequence.Wallet; +using UnityEngine; namespace Sequence.EcosystemWallet { @@ -51,7 +52,9 @@ public async Task CreateNewSession(bool isExplicit, SessionPermis var response = await handler.WaitForResponse(url, action, payload); if (!response.Result) throw new Exception("Error during request"); - + + var chainId = ChainDictionaries.ChainIdOf[_chain]; + Debug.Log($"chainId {chainId}"); var credentials = new SessionCredentials( isExplicit, sessionWallet.GetPrivateKeyAsHex(), @@ -59,7 +62,7 @@ public async Task CreateNewSession(bool isExplicit, SessionPermis response.Data.attestation, response.Data.signature, (int)_ecosystem, - ChainDictionaries.ChainIdOf[_chain], + chainId, response.Data.loginMethod, response.Data.email); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index 022d899b..9e0d070b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -5,7 +5,7 @@ namespace Sequence.EcosystemWallet { public class SequenceConnect : IConnect { - private EcosystemClient _client; + private readonly EcosystemClient _client; public SequenceConnect(EcosystemType ecosystem, Chain chain) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index f3a4c261..b3810649 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -176,7 +176,7 @@ private async Task SignCalls(Chain chain, Call[] calls, bool ch var deployTransaction = BuildDeployTransaction(); return new TransactionData { - To = new Address("0xf3c7175460BeD3340A1c4dc700fD6C8Cd3F56250"), + To = new Address(_state.DeployContext.guestModule), Data = new Calls(0, 0, new Call[] { new (deployTransaction.To, 0, deployTransaction.Data.HexStringToByteArray()), diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs index 1d2ae260..569633ae 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs @@ -7,6 +7,7 @@ using Sequence.Signer; using Sequence.Utils; using Sequence.Wallet; +using UnityEngine; namespace Sequence.EcosystemWallet { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs index ca3ba61e..2baae523 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs @@ -14,9 +14,8 @@ public SessionTemplates(Chain chain) _chain = chain; } - public SessionPermissions BuildUnrestrictivePermissions() + public SessionPermissions BuildUnrestrictivePermissions(Address target) { - var target = new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"); var deadline = new BigInteger(DateTime.UtcNow.ToUnixTimestamp() * 1000 + 1000 * 60 * 5000); var sessionBuilder = new SessionBuilder(_chain, 0, deadline); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs index b2cbbc1c..1a2de684 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs @@ -20,15 +20,14 @@ internal class LocalhostRedirectHandler : RedirectHandler listener.Prefixes.Add(RedirectUrl.AppendTrailingSlashIfNeeded()); listener.Start(); - var result = await Task.WhenAny(listener.GetContextAsync(), WaitDelay()); - var context = result.Result; + var result = await listener.GetContextAsync(); listener.Stop(); - if (context == null) + if (result == null) throw new Exception("Request timed out."); - var queryString = context.Request.QueryString; + var queryString = result.Request.QueryString; var id = queryString["id"]; if (id != Id) @@ -50,11 +49,5 @@ internal class LocalhostRedirectHandler : RedirectHandler return (false, default); } } - - private async Task WaitDelay() - { - await Task.Delay(10000); - return null; - } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs index 32d52d9f..ac771255 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs @@ -4,6 +4,7 @@ using Nethereum.ABI.FunctionEncoding; using Nethereum.ABI.Model; using Nethereum.Hex.HexConvertors.Extensions; +using Sequence.ABI; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; @@ -30,15 +31,7 @@ public static (string To, string Data) Deploy(string deployHash, Context context private static string EncodeDeploy(string stage1, string deployHash) { - var function = new FunctionABI("deploy", false); - function.InputParameters = new[] - { - new Parameter("address", "stage1"), - new Parameter("bytes", "hash") - }; - - var encoder = new FunctionCallEncoder(); - return encoder.EncodeRequest(function.Sha3Signature, function.InputParameters, stage1, deployHash.HexToByteArray()); + return ABI.ABI.Pack("deploy(address,bytes32)", stage1, new FixedByte(32, deployHash.HexStringToByteArray())); } public static byte[] Wrap(byte[] signature, Address to, byte[] data) From 12c94d631319555a7687fce7fbe3af94b3689f46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Tue, 12 Aug 2025 23:36:23 +0200 Subject: [PATCH 137/165] added service classes for transactions, signing and finding signers --- .../Sequence/Samples~/Demo V3/DemoV3.unity | 4 +- .../SequenceEcosystemWalletWindow.cs | 22 +- .../Authentication/EcosystemBindings.cs | 1 + .../Authentication/EcosystemClient.cs | 1 - .../Authentication/EcosystemType.cs | 3 +- .../EcosystemWallet/Authentication/IWallet.cs | 8 + .../Authentication/SequenceWallet.cs | 202 +++--------------- .../Authentication/SessionSigner.cs | 15 +- .../Authentication/SessionTemplates.cs | 2 +- .../Authentication/WalletState.cs | 5 +- .../SequenceSDK/EcosystemWallet/Services.meta | 3 + .../Services/FeeOptionService.cs | 47 ++++ .../Services/FeeOptionService.cs.meta | 3 + .../Services/SignatureService.cs | 80 +++++++ .../Services/SignatureService.cs.meta | 3 + .../EcosystemWallet/Services/SignerService.cs | 81 +++++++ .../Services/SignerService.cs.meta | 3 + .../Services/TransactionService.cs | 94 ++++++++ .../Services/TransactionService.cs.meta | 3 + .../{ => Utils}/CryptoHelpers.cs | 0 .../{ => Utils}/CryptoHelpers.cs.meta | 0 .../SequenceSDK/Relayer/SequenceRelayer.cs | 2 +- 22 files changed, 387 insertions(+), 195 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignatureService.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignatureService.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignerService.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignerService.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/TransactionService.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/TransactionService.cs.meta rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Utils}/CryptoHelpers.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Utils}/CryptoHelpers.cs.meta (100%) diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 77ceb1e0..9c1f5f6b 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -10628,7 +10628,7 @@ RectTransform: 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: 240, y: 290} + m_SizeDelta: {x: 240, y: 420} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2325936309338030303 MonoBehaviour: @@ -12369,7 +12369,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a76f3494846944de2a0d1694eeb60856, type: 3} m_Name: m_EditorClassIdentifier: - _ecosystem: 0 + _ecosystem: 1 _chain: 421614 _emailLoginButton: {fileID: 1459061464521247473} _emailContinueButton: {fileID: 2325936309338030303} diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index d6fe9aab..8d45dc39 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -1,5 +1,7 @@ using System; using System.Linq; +using System.Numerics; +using NBitcoin; using Sequence.EcosystemWallet; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; @@ -278,7 +280,7 @@ public void EnableWalletState(bool enable) var rect = transform as RectTransform; var size = rect.sizeDelta; - size.y = enable ? 315 : 290; + size.y = enable ? 420 : 290; rect.sizeDelta = size; } @@ -292,8 +294,8 @@ public async void SendImplicitTransaction() { await _wallet.SendTransaction(Chain.TestnetArbitrumSepolia, new Call[] { - new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, - ABI.ABI.FunctionSelector("implicitEmit()").HexStringToByteArray()) + new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, ABI.ABI.FunctionSelector("implicitEmit()").HexStringToByteArray()), + new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, ABI.ABI.FunctionSelector("implicitEmit()").HexStringToByteArray()) }); } @@ -319,6 +321,7 @@ public async void SendExplicitTransactionWithUsdc() if (feeOption == null) throw new Exception($"Fee option 'USDC' not available"); + Debug.Log($"{feeOption.to} {feeOption.token.contractAddress} {feeOption.value}"); await _wallet.SendTransaction(Chain.Optimism, calls, feeOption); } @@ -351,6 +354,19 @@ private SessionPermissions GetExplicitPermissions() private SessionPermissions GetPermissionsFromSessionType(int type) { + if (type == 0) + return null; + + var deadline = new BigInteger(1955010532000); + + Debug.Log($"deadline {deadline}"); + + var sessionBuilder = new SessionBuilder(_chain, 0, deadline); + sessionBuilder.AddPermission(new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607")); + sessionBuilder.AddPermission(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA")); + + return sessionBuilder.GetPermissions(); + var templates = new SessionTemplates(_chain); return type switch { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs index a0f971b7..b553d8ae 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs @@ -6,6 +6,7 @@ internal static class EcosystemBindings { private static Dictionary UrlBindings = new () { + { EcosystemType.Dev, "http://localhost:5173/" }, { EcosystemType.Sequence, "https://v3.sequence-dev.app" } }; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs index a0b0aa49..87e16e14 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs @@ -1,6 +1,5 @@ using System; using System.Threading.Tasks; -using Sequence.Config; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; using Sequence.Wallet; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs index 715a9f0b..5a3f047a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs @@ -2,6 +2,7 @@ namespace Sequence.EcosystemWallet { public enum EcosystemType { - Sequence = 0 + Dev = 0, + Sequence = 1 } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs index 005c962c..9f157b24 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs @@ -53,5 +53,13 @@ public interface IWallet /// /// Task SendTransaction(Chain chain, Call[] calls, FeeOption feeOption = null); + + /// + /// Checks whether this wallet is capable of signing the given calls. + /// + /// + /// + /// False if no local signer could be found. + Task IsSupportedCalls(Chain chain, Call[] calls); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index b3810649..20d67292 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -1,16 +1,11 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Numerics; using System.Threading.Tasks; using Sequence.EcosystemWallet.Browser; -using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Primitives.Common; -using Sequence.EcosystemWallet.Utils; using Sequence.Relayer; using Sequence.Utils; -using UnityEngine; using UnityEngine.Assertions; namespace Sequence.EcosystemWallet @@ -19,20 +14,23 @@ public class SequenceWallet : IWallet { public Address Address { get; } + private readonly WalletState _state; private SessionSigner[] _sessionSigners; - private WalletState _state; internal SequenceWallet(SessionSigner[] sessionSigners) { Address = sessionSigners[0].ParentAddress; - _sessionSigners = sessionSigners; _state = new WalletState(Address); + _sessionSigners = sessionSigners; } public static IWallet RecoverFromStorage() { var credentials = SessionStorage.GetSessions(); + if (credentials == null || credentials.Length == 0) + return null; + var sessionWallets = new SessionSigner[credentials.Length]; for (var i = 0; i < credentials.Length; i++) sessionWallets[i] = new SessionSigner(credentials[i]); @@ -71,7 +69,7 @@ public async Task SignMessage(string message) message = message }; - var url = $"{EcosystemBindings.GetUrl(EcosystemType.Sequence)}/request/sign"; + var url = $"{EcosystemBindings.GetUrl(EcosystemType.Dev)}/request/sign"; var handler = RedirectFactory.CreateHandler(); handler.SetRedirectUrl(RedirectOrigin.GetOriginString()); @@ -88,7 +86,8 @@ public async Task GetFeeOption(Chain chain, Call[] calls) { await _state.Update(chain); - var transactionData = await SignCalls(chain, calls, false); + var txnService = new TransactionService(_sessionSigners, _state); + var transactionData = await txnService.SignAndBuild(chain, calls, false); var relayer = new SequenceRelayer(chain); var args = new FeeOptionsArgs(transactionData.To, transactionData.To, transactionData.Data); @@ -103,22 +102,17 @@ public async Task SendTransaction(Chain chain, Call[] calls, FeeOption f if (feeOption != null) { - var encodedFeeOptionData = ABI.ABI.Pack("transfer(address,uint256)", - feeOption.to, BigInteger.Parse(feeOption.value)).HexStringToByteArray(); + var feeOptionService = new FeeOptionService(feeOption); + var isNativeTokenOption = feeOption.token.contractAddress.Equals(Address.ZeroAddress); + var feeOptionCall = isNativeTokenOption + ? feeOptionService.BuildCallForNativeTokenOption() + : feeOptionService.BuildCallForCustomTokenOption(); - var feeOptionCall = new Call( - feeOption.token.contractAddress, - 0, - encodedFeeOptionData, - feeOption.gasLimit, - false, - false, - BehaviourOnError.revert); - calls = calls.Unshift(feeOptionCall); } - - var transactionData = await SignCalls(chain, calls, true); + + var txnService = new TransactionService(_sessionSigners, _state); + var transactionData = await txnService.SignAndBuild(chain, calls, true); var relayer = new SequenceRelayer(chain); var hash = await relayer.Relay(transactionData.To, transactionData.Data); @@ -138,168 +132,22 @@ public async Task SendTransaction(Chain chain, Call[] calls, FeeOption f return receipt.txnReceipt; } - - private async Task SignCalls(Chain chain, Call[] calls, bool checkDeployed) - { - var preparedIncrement = PrepareIncrement(null, 0, null); - if (preparedIncrement != null) - calls.AddToArray(preparedIncrement); - - var envelope = PrepareTransaction(chain, calls); - - var signature = await SignSapient(chain, envelope); - var sapientSignature = new SapientSignature - { - imageHash = _state.SessionsImageHash, - signature = signature - }; - - var signedEnvelope = envelope.ToSigned(sapientSignature); - var rawSignature = SignatureHandler.EncodeSignature(signedEnvelope); - - rawSignature.suffix = _state.ConfigUpdates - .Select(u => RawSignature.Decode(u.signature.HexStringToByteArray())).ToArray(); - - var callsData = ABI.ABI.Pack("execute(bytes,bytes)", - envelope.payload.Encode(), - rawSignature.Encode()); - - if (!checkDeployed || _state.IsDeployed) - { - return new TransactionData - { - To = Address, - Data = callsData - }; - } - - var deployTransaction = BuildDeployTransaction(); - return new TransactionData - { - To = new Address(_state.DeployContext.guestModule), - Data = new Calls(0, 0, new Call[] - { - new (deployTransaction.To, 0, deployTransaction.Data.HexStringToByteArray()), - new (Address, 0, callsData.HexStringToByteArray()) - }).Encode().ByteArrayToHexStringWithPrefix() - }; - } - - private TransactionData BuildDeployTransaction() - { - var deployTransaction = Erc6492Helper.Deploy(_state.DeployHash, new Erc6492Helper.Context - { - creationCode = _state.DeployContext.walletCreationCode, - factory = _state.DeployContext.factory, - stage1 = _state.DeployContext.mainModule, - stage2 = _state.DeployContext.mainModuleUpgradable - }); - - return new TransactionData - { - To = new Address(deployTransaction.To), - Data = deployTransaction.Data - }; - } - - private Call PrepareIncrement(Address wallet, BigInteger chainId, Calls calls) - { - return null; - } - - private Envelope PrepareTransaction(Chain chain, Call[] calls) - { - return new Envelope - { - chainId = BigInteger.Parse(ChainDictionaries.ChainIdOf[chain]), - wallet = Address, - configuration = _state.Config, - payload = new Calls(0, _state.Nonce, calls) - }; - } - private async Task SignSapient(Chain chain, Envelope envelope) + public async Task IsSupportedCalls(Chain chain, Call[] calls) { - var calls = envelope.payload.calls; - if (calls.Length == 0) - throw new Exception("calls is empty"); - - var implicitSigners = new List
(); - var explicitSigners = new List
(); - - var signers = await FindSignersForCalls(chain, calls); - - var signatures = new SessionCallSignature[signers.Length]; - for (var i = 0; i < signers.Length; i++) + try { - var signature = signers[i].SignCall(calls[i], _state.SessionsTopology, envelope.payload.space, envelope.payload.nonce); - signatures[i] = signature; - } + await _state.Update(chain); - foreach (var signer in signers) - { - if (signer.IsExplicit) - explicitSigners.Add(signer.Address); - else - implicitSigners.Add(signer.Address); + var signerService = new SignerService(_sessionSigners, _state.SessionsTopology); + var signers = await signerService.FindSignersForCalls(chain, calls); + + return signers.Length == calls.Length; } - - var sessionSignatures = SessionCallSignature.EncodeSignatures( - signatures, - _state.SessionsTopology, - explicitSigners.ToArray(), - implicitSigners.ToArray()); - - return new SignatureOfSapientSignerLeaf - { - curType = SignatureOfSapientSignerLeaf.Type.sapient, - address = _state.Sessions, - data = sessionSignatures - }; - } - - private async Task FindSignersForCalls(Chain chain, Call[] calls) - { - var identitySigner = _state.SessionsTopology.GetIdentitySigner(); - if (identitySigner == null) - throw new Exception("identitySigner is null"); - - var blacklist = _state.SessionsTopology.GetImplicitBlacklist(); - if (blacklist == null) - throw new Exception("blacklist is null"); - - var validImplicitSigners = _sessionSigners.Where(s => - !s.IsExplicit && - s.IdentitySigner.Equals(identitySigner) && - !blacklist.Contains(s.Address) - ).ToArray(); - - var explicitSigners = _state.SessionsTopology.GetExplicitSigners(); - var validExplicitSigners = _sessionSigners - .Where(s => s.IsExplicit && - Array.Exists(explicitSigners, es => es.Equals(s.Address))).ToArray(); - - var availableSigners = ArrayUtils.CombineArrays(validImplicitSigners, validExplicitSigners); - if (availableSigners.Length == 0) - throw new Exception("no valid signers found"); - - var signers = new List(); - foreach (var call in calls) + catch (Exception e) { - foreach (var signer in availableSigners) - { - Debug.Log($"Checking signer {signer.Address}"); - var supported = await signer.IsSupportedCall(call, chain, _state.SessionsTopology); - if (supported) - { - signers.Add(signer); - Debug.Log($"Using signer {signer.Address}"); - break; - } - } + return false; } - - return signers.ToArray(); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs index 569633ae..1c5f9754 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs @@ -91,14 +91,19 @@ public async Task IsSupportedCall(Call call, Chain chain, SessionsTopology if (exceededLimit) return (-1, null); - var permissionIndex = 0; - foreach (var permission in sessionPermissions.permissions) + var permissionIndex = -1; + for (var i = 0; i < sessionPermissions.permissions.Length; i++) { - if (permission.target.Equals(call.to)) - break; + var permission = sessionPermissions.permissions[i]; + if (!permission.target.Equals(call.to)) + continue; - permissionIndex++; + permissionIndex = i; + break; } + + if (permissionIndex < 0) + return (-1, null); return (permissionIndex, sessionPermissions.permissions[permissionIndex]); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs index 2baae523..3ac41898 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs @@ -18,7 +18,7 @@ public SessionPermissions BuildUnrestrictivePermissions(Address target) { var deadline = new BigInteger(DateTime.UtcNow.ToUnixTimestamp() * 1000 + 1000 * 60 * 5000); - var sessionBuilder = new SessionBuilder(_chain, 0, deadline); + var sessionBuilder = new SessionBuilder(_chain, 1000000000, deadline); sessionBuilder.AddPermission(target); return sessionBuilder.GetPermissions(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs index 22090c86..f3593af3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs @@ -13,9 +13,6 @@ namespace Sequence.EcosystemWallet { internal class WalletState { - // Why this signer leaf? - public Address Sessions = new Address("0x06aa3a8F781F2be39b888Ac8a639c754aEe9dA29"); - public Address Address { get; } public string ImageHash { get; private set; } public string SessionsImageHash { get; private set; } @@ -47,7 +44,7 @@ public async Task Update(Chain chain) Debug.Log($"Config: {config.ToJson()}"); - var signerLeaf = config.topology.FindSignerLeaf(Sessions) as SapientSignerLeaf; + var signerLeaf = config.topology.FindSignerLeaf(new Address("0x06aa3a8F781F2be39b888Ac8a639c754aEe9dA29")) as SapientSignerLeaf; SessionsImageHash = signerLeaf.imageHash; var treeReturn = await _keyMachine.GetTree(SessionsImageHash); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services.meta new file mode 100644 index 00000000..7a31f4c4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6dea88d0219849a59da8909a14bd8628 +timeCreated: 1755032847 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs new file mode 100644 index 00000000..15c6248e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs @@ -0,0 +1,47 @@ +using System.Numerics; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Relayer; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet +{ + internal class FeeOptionService + { + private readonly FeeOption _feeOption; + + public FeeOptionService(FeeOption feeOption) + { + _feeOption = feeOption; + } + + public Call BuildCallForNativeTokenOption() + { + var encodedFeeOptionData = ABI.ABI.Pack("forwardValue(address,uint256)", + _feeOption.to, BigInteger.Parse(_feeOption.value)).HexStringToByteArray(); + + return new Call( + new Address("0xABAAd93EeE2a569cF0632f39B10A9f5D734777ca"), // Value forwarder address + BigInteger.Parse(_feeOption.value), + encodedFeeOptionData, + _feeOption.gasLimit, + false, + false, + BehaviourOnError.revert); + } + + public Call BuildCallForCustomTokenOption() + { + var encodedFeeOptionData = ABI.ABI.Pack("transfer(address,uint256)", + _feeOption.to, BigInteger.Parse(_feeOption.value)).HexStringToByteArray(); + + return new Call( + _feeOption.token.contractAddress, + 0, + encodedFeeOptionData, + _feeOption.gasLimit, + false, + false, + BehaviourOnError.revert); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs.meta new file mode 100644 index 00000000..95f56a03 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: eb56688aef7f4be9a8835ba44c4ec3da +timeCreated: 1755033553 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignatureService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignatureService.cs new file mode 100644 index 00000000..c7656afb --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignatureService.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Envelope; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; +using ConfigUpdate = Sequence.EcosystemWallet.KeyMachine.Models.ConfigUpdate; + +namespace Sequence.EcosystemWallet +{ + internal class SignatureService + { + private readonly SessionsTopology _sessions; + private readonly SignerService _signerService; + + public SignatureService(SessionSigner[] sessionSigners, SessionsTopology sessions) + { + _signerService = new SignerService(sessionSigners, sessions); + } + + public async Task SignCalls(Chain chain, string imageHash, Envelope envelope, ConfigUpdate[] configUpdates) + { + var signature = await SignSapient(chain, envelope); + var sapientSignature = new SapientSignature + { + imageHash = imageHash, + signature = signature + }; + + var signedEnvelope = envelope.ToSigned(sapientSignature); + var rawSignature = SignatureHandler.EncodeSignature(signedEnvelope); + + rawSignature.suffix = configUpdates.Select(u => + RawSignature.Decode(u.signature.HexStringToByteArray())).ToArray(); + + return rawSignature; + } + + private async Task SignSapient(Chain chain, Envelope envelope) + { + var calls = envelope.payload.calls; + if (calls.Length == 0) + throw new Exception("calls is empty"); + + var implicitSigners = new List
(); + var explicitSigners = new List
(); + + var signers = await _signerService.FindSignersForCalls(chain, calls); + + var signatures = new SessionCallSignature[signers.Length]; + for (var i = 0; i < signers.Length; i++) + { + var signature = signers[i].SignCall(calls[i], _sessions, envelope.payload.space, envelope.payload.nonce); + signatures[i] = signature; + } + + foreach (var signer in signers) + { + if (signer.IsExplicit) + explicitSigners.Add(signer.Address); + else + implicitSigners.Add(signer.Address); + } + + var sessionSignatures = SessionCallSignature.EncodeSignatures( + signatures, + _sessions, + explicitSigners.ToArray(), + implicitSigners.ToArray()); + + return new SignatureOfSapientSignerLeaf + { + curType = SignatureOfSapientSignerLeaf.Type.sapient, + address = new Address("0x06aa3a8F781F2be39b888Ac8a639c754aEe9dA29"), // Session manager address + data = sessionSignatures + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignatureService.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignatureService.cs.meta new file mode 100644 index 00000000..e8f64fe6 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignatureService.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 914a2f1b2e884216a9069d3c13ff0bcd +timeCreated: 1755032947 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignerService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignerService.cs new file mode 100644 index 00000000..dab5e3f4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignerService.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet +{ + internal class SignerService + { + private readonly SessionSigner[] _sessionSigners; + private readonly SessionsTopology _sessions; + + public SignerService(SessionSigner[] sessionSigners, SessionsTopology sessions) + { + _sessionSigners = sessionSigners; + _sessions = sessions; + } + + public async Task FindSignersForCalls(Chain chain, Call[] calls) + { + var identitySigner = _sessions.GetIdentitySigner(); + if (identitySigner == null) + throw new Exception("identitySigner is null"); + + var blacklist = _sessions.GetImplicitBlacklist(); + if (blacklist == null) + throw new Exception("blacklist is null"); + + var validImplicitSigners = GetValidImplicitSigners(identitySigner, blacklist); + var validExplicitSigners = GetValidExplicitSigners(); + + var availableSigners = ArrayUtils.CombineArrays(validImplicitSigners, validExplicitSigners); + if (availableSigners.Length == 0) + throw new Exception("no valid signers found"); + + var supportedSignersForCalls = await FindSignerForEachCall(chain, availableSigners, calls); + + if (supportedSignersForCalls.Length != calls.Length) + throw new Exception("Unable to find a signer for one of the given calls."); + + return supportedSignersForCalls; + } + + private async Task FindSignerForEachCall(Chain chain, SessionSigner[] availableSigners, Call[] calls) + { + var signers = new List(); + foreach (var call in calls) + { + foreach (var signer in availableSigners) + { + var supported = await signer.IsSupportedCall(call, chain, _sessions); + if (supported) + { + signers.Add(signer); + break; + } + } + } + + return signers.ToArray(); + } + + private SessionSigner[] GetValidImplicitSigners(Address identitySigner, Address[] blacklist) + { + return _sessionSigners.Where(s => + !s.IsExplicit && + s.IdentitySigner.Equals(identitySigner) && + !blacklist.Contains(s.Address) + ).ToArray(); + } + + private SessionSigner[] GetValidExplicitSigners() + { + var explicitSigners = _sessions.GetExplicitSigners(); + return _sessionSigners.Where(s => + s.IsExplicit && Array.Exists(explicitSigners, es => es.Equals(s.Address))).ToArray(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignerService.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignerService.cs.meta new file mode 100644 index 00000000..76306557 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignerService.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 67d4b1bf58f34b35aca5b2cae8bc8297 +timeCreated: 1755032682 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/TransactionService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/TransactionService.cs new file mode 100644 index 00000000..54416caa --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/TransactionService.cs @@ -0,0 +1,94 @@ +using System.Numerics; +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Envelope; +using Sequence.EcosystemWallet.Primitives; +using Sequence.EcosystemWallet.Utils; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet +{ + internal class TransactionService + { + private readonly SessionSigner[] _sessionSigners; + private readonly WalletState _state; + + public TransactionService(SessionSigner[] sessionSigners, WalletState state) + { + _sessionSigners = sessionSigners; + _state = state; + } + + public async Task SignAndBuild(Chain chain, Call[] calls, bool checkDeployed) + { + var preparedIncrement = PrepareIncrement(null, 0, null); + if (preparedIncrement != null) + calls.AddToArray(preparedIncrement); + + var envelope = PrepareTransaction(chain, calls); + + var signatureService = new SignatureService(_sessionSigners, _state.SessionsTopology); + var signature = await signatureService.SignCalls(chain, _state.SessionsImageHash, envelope, _state.ConfigUpdates); + + var callsData = ABI.ABI.Pack("execute(bytes,bytes)", + envelope.payload.Encode(), + signature.Encode()); + + if (!checkDeployed || _state.IsDeployed) + { + return new TransactionData + { + To = _state.Address, + Data = callsData + }; + } + + // Not relevant for signing calls for getting fee options + // If the wallet was not yet deployed onchain, let's make a deploy transaction first + + var deployTransaction = BuildDeployTransaction(); + return new TransactionData + { + To = new Address(_state.DeployContext.guestModule), + Data = new Calls(0, 0, new Call[] + { + new (deployTransaction.To, 0, deployTransaction.Data.HexStringToByteArray()), + new (_state.Address, 0, callsData.HexStringToByteArray()) + }).Encode().ByteArrayToHexStringWithPrefix() + }; + } + + private Call PrepareIncrement(Address wallet, BigInteger chainId, Calls calls) + { + // TODO: Integrate increments + return null; + } + + private TransactionData BuildDeployTransaction() + { + var deployTransaction = Erc6492Helper.Deploy(_state.DeployHash, new Erc6492Helper.Context + { + creationCode = _state.DeployContext.walletCreationCode, + factory = _state.DeployContext.factory, + stage1 = _state.DeployContext.mainModule, + stage2 = _state.DeployContext.mainModuleUpgradable + }); + + return new TransactionData + { + To = new Address(deployTransaction.To), + Data = deployTransaction.Data + }; + } + + private Envelope PrepareTransaction(Chain chain, Call[] calls) + { + return new Envelope + { + chainId = BigInteger.Parse(ChainDictionaries.ChainIdOf[chain]), + wallet = _state.Address, + configuration = _state.Config, + payload = new Calls(0, _state.Nonce, calls) + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/TransactionService.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/TransactionService.cs.meta new file mode 100644 index 00000000..975343aa --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/TransactionService.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b820a98423da48af9ca7d387fa881dc5 +timeCreated: 1755032318 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/CryptoHelpers.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/CryptoHelpers.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/CryptoHelpers.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/CryptoHelpers.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/CryptoHelpers.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs index 67c3f392..f9aa87f8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs @@ -16,7 +16,7 @@ public SequenceRelayer(Chain chain) { var name = chain switch { - Chain.Optimism => "dev-optimism", + Chain.Optimism => "v3-optimism", Chain.ArbitrumOne => "dev-arbitrum", Chain.TestnetArbitrumSepolia => "dev-arbitrum-sepolia", _ => throw new NotSupportedException($"Chain {chain} not supported.") From fda70780966b3d29ba3539ca76004a824292ccff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 13 Aug 2025 00:03:02 +0200 Subject: [PATCH 138/165] added transaction interfaces --- ...sactionTests.cs => RawTransactionTests.cs} | 4 +- ...ts.cs.meta => RawTransactionTests.cs.meta} | 0 .../SequenceEcosystemWalletWindow.cs | 8 ++-- .../EcosystemWallet/Authentication/IWallet.cs | 12 +++--- .../Authentication/SequenceWallet.cs | 10 +++-- .../Authentication/SessionTemplates.cs | 4 +- .../EcosystemWallet/Permissions.meta | 3 ++ .../Permissions/IPermissionBuilder.cs | 9 +++++ .../Permissions/IPermissionBuilder.cs.meta | 3 ++ .../TransactionsPermissionBuilder.cs} | 4 +- .../TransactionsPermissionBuilder.cs.meta} | 0 .../Services/FeeOptionService.cs | 4 +- .../EcosystemWallet/Transactions.meta | 3 ++ .../Transactions/ITransaction.cs | 9 +++++ .../Transactions/ITransaction.cs.meta | 3 ++ .../Transactions/RawTransaction.cs | 39 +++++++++++++++++++ .../Transactions/RawTransaction.cs.meta | 3 ++ .../Transactions/Transaction.cs | 31 +++++++++++++++ .../Transactions/Transaction.cs.meta | 3 ++ .../Transactions/TransactionExtensions.cs | 13 +++++++ .../TransactionExtensions.cs.meta | 3 ++ 21 files changed, 148 insertions(+), 20 deletions(-) rename Assets/SequenceSDK/EcosystemWallet/UnitTests/{TransactionTests.cs => RawTransactionTests.cs} (95%) rename Assets/SequenceSDK/EcosystemWallet/UnitTests/{TransactionTests.cs.meta => RawTransactionTests.cs.meta} (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissionBuilder.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissionBuilder.cs.meta rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Authentication/SessionBuilder.cs => Permissions/TransactionsPermissionBuilder.cs} (92%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Authentication/SessionBuilder.cs.meta => Permissions/TransactionsPermissionBuilder.cs.meta} (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/ITransaction.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/ITransaction.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/RawTransaction.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/RawTransaction.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Transaction.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Transaction.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionExtensions.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionExtensions.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs similarity index 95% rename from Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs rename to Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs index 055b3c6d..0993a345 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs @@ -8,7 +8,7 @@ namespace Sequence.EcosystemWallet.UnitTests { - public class TransactionTests + public class RawTransactionTests { private static readonly EcosystemType Ecosystem = EcosystemType.Sequence; @@ -31,7 +31,7 @@ public async Task AddPermissionForUsdcTransfer() var target = new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"); var deadline = new BigInteger(DateTimeOffset.UtcNow.ToUnixTimeSeconds() * 1000 + 1000 * 60 * 5000); - var sessionBuilder = new SessionBuilder(Chain.Optimism, 1000000, deadline); + var sessionBuilder = new TransactionsPermissionBuilder(Chain.Optimism, 1000000, deadline); sessionBuilder.AddPermission(usdcAddress); sessionBuilder.AddPermission(target); diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs.meta similarity index 100% rename from Assets/SequenceSDK/EcosystemWallet/UnitTests/TransactionTests.cs.meta rename to Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index 8d45dc39..ad9844f2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -8,6 +8,7 @@ using TMPro; using UnityEngine; using UnityEngine.UI; +using Transaction = Sequence.EcosystemWallet.Transaction; namespace Sequence.Boilerplates { @@ -310,10 +311,9 @@ public async void SendExplicitTransaction() public async void SendExplicitTransactionWithUsdc() { - var calls = new Call[] + var calls = new ITransaction[] { - new(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, - ABI.ABI.FunctionSelector("explicitEmit()").HexStringToByteArray()) + new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "explicitEmit()") }; var feeOptions = await _wallet.GetFeeOption(Chain.Optimism, calls); @@ -361,7 +361,7 @@ private SessionPermissions GetPermissionsFromSessionType(int type) Debug.Log($"deadline {deadline}"); - var sessionBuilder = new SessionBuilder(_chain, 0, deadline); + var sessionBuilder = new TransactionsPermissionBuilder(_chain, 0, deadline); sessionBuilder.AddPermission(new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607")); sessionBuilder.AddPermission(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA")); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs index 9f157b24..38aac61b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs @@ -41,25 +41,25 @@ public interface IWallet /// Get fee options for your calls. Only required for mainnets, if you don't have gas sponsorship configured. ///
/// - /// + /// /// - Task GetFeeOption(Chain chain, Call[] calls); + Task GetFeeOption(Chain chain, ITransaction[] transactions); /// /// Send a transaction. /// /// - /// + /// /// /// - Task SendTransaction(Chain chain, Call[] calls, FeeOption feeOption = null); + Task SendTransaction(Chain chain, ITransaction[] transactions, FeeOption feeOption = null); /// /// Checks whether this wallet is capable of signing the given calls. /// /// - /// + /// /// False if no local signer could be found. - Task IsSupportedCalls(Chain chain, Call[] calls); + Task IsSupportedCalls(Chain chain, ITransaction[] transactions); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index 20d67292..cf6db98c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -82,10 +82,11 @@ public async Task SignMessage(string message) return response.Data; } - public async Task GetFeeOption(Chain chain, Call[] calls) + public async Task GetFeeOption(Chain chain, ITransaction[] transactions) { await _state.Update(chain); + var calls = transactions.GetCalls(); var txnService = new TransactionService(_sessionSigners, _state); var transactionData = await txnService.SignAndBuild(chain, calls, false); var relayer = new SequenceRelayer(chain); @@ -96,9 +97,11 @@ public async Task GetFeeOption(Chain chain, Call[] calls) return response.options; } - public async Task SendTransaction(Chain chain, Call[] calls, FeeOption feeOption = null) + public async Task SendTransaction(Chain chain, ITransaction[] transactions, FeeOption feeOption = null) { await _state.Update(chain); + + var calls = transactions.GetCalls(); if (feeOption != null) { @@ -133,12 +136,13 @@ public async Task SendTransaction(Chain chain, Call[] calls, FeeOption f return receipt.txnReceipt; } - public async Task IsSupportedCalls(Chain chain, Call[] calls) + public async Task IsSupportedCalls(Chain chain, ITransaction[] transactions) { try { await _state.Update(chain); + var calls = transactions.GetCalls(); var signerService = new SignerService(_sessionSigners, _state.SessionsTopology); var signers = await signerService.FindSignersForCalls(chain, calls); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs index 3ac41898..a268e6ec 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs @@ -18,7 +18,7 @@ public SessionPermissions BuildUnrestrictivePermissions(Address target) { var deadline = new BigInteger(DateTime.UtcNow.ToUnixTimestamp() * 1000 + 1000 * 60 * 5000); - var sessionBuilder = new SessionBuilder(_chain, 1000000000, deadline); + var sessionBuilder = new TransactionsPermissionBuilder(_chain, 1000000000, deadline); sessionBuilder.AddPermission(target); return sessionBuilder.GetPermissions(); @@ -29,7 +29,7 @@ public SessionPermissions BuildBasicRestrictivePermissions() var deadline = new BigInteger(DateTime.UtcNow.ToUnixTimestamp() * 1000 + 1000 * 60 * 5000); var target = new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"); - var sessionBuilder = new SessionBuilder(_chain, 0, deadline); + var sessionBuilder = new TransactionsPermissionBuilder(_chain, 0, deadline); sessionBuilder.AddPermission(target, false, ParameterOperation.equal, ABI.ABI.FunctionSelector("explicitEmit()"), 0, ParameterRule.SelectorMask); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions.meta new file mode 100644 index 00000000..48a19885 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 56a01c9cecf54ab490178cf50256d4a4 +timeCreated: 1755034738 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissionBuilder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissionBuilder.cs new file mode 100644 index 00000000..7870d34d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissionBuilder.cs @@ -0,0 +1,9 @@ +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet +{ + public interface IPermissionBuilder + { + SessionPermissions GetPermissions(); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissionBuilder.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissionBuilder.cs.meta new file mode 100644 index 00000000..fcc8d6cd --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissionBuilder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5787ef7713ba45b08c9f4f09bf23cc97 +timeCreated: 1755034765 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/TransactionsPermissionBuilder.cs similarity index 92% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/TransactionsPermissionBuilder.cs index 0c1c2eda..0fc4c37e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/TransactionsPermissionBuilder.cs @@ -5,7 +5,7 @@ namespace Sequence.EcosystemWallet { - public class SessionBuilder + public class TransactionsPermissionBuilder : IPermissionBuilder { public Chain Chain; public BigInteger ValueLimit; @@ -13,7 +13,7 @@ public class SessionBuilder private Dictionary> _permissions = new(); - public SessionBuilder(Chain chain, BigInteger valueLimit, BigInteger deadline) + public TransactionsPermissionBuilder(ITransaction[] calls, Chain chain, int deadline) { this.Chain = chain; this.ValueLimit = valueLimit; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/TransactionsPermissionBuilder.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionBuilder.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/TransactionsPermissionBuilder.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs index 15c6248e..78f7af73 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs @@ -7,6 +7,8 @@ namespace Sequence.EcosystemWallet { internal class FeeOptionService { + private static readonly Address ValueForwarder = new ("0xABAAd93EeE2a569cF0632f39B10A9f5D734777ca"); + private readonly FeeOption _feeOption; public FeeOptionService(FeeOption feeOption) @@ -20,7 +22,7 @@ public Call BuildCallForNativeTokenOption() _feeOption.to, BigInteger.Parse(_feeOption.value)).HexStringToByteArray(); return new Call( - new Address("0xABAAd93EeE2a569cF0632f39B10A9f5D734777ca"), // Value forwarder address + ValueForwarder, BigInteger.Parse(_feeOption.value), encodedFeeOptionData, _feeOption.gasLimit, diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions.meta new file mode 100644 index 00000000..7937a9c9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b0ed2e0d4bff487f9e9951cd097bd3e8 +timeCreated: 1755035566 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/ITransaction.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/ITransaction.cs new file mode 100644 index 00000000..3a5b91ad --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/ITransaction.cs @@ -0,0 +1,9 @@ +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet +{ + public interface ITransaction + { + Call GetCall(); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/ITransaction.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/ITransaction.cs.meta new file mode 100644 index 00000000..51ab3888 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/ITransaction.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4f99515337f24515bb66018af44a2839 +timeCreated: 1755035257 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/RawTransaction.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/RawTransaction.cs new file mode 100644 index 00000000..cecc1c58 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/RawTransaction.cs @@ -0,0 +1,39 @@ +using System.Numerics; +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet +{ + public class RawTransaction : ITransaction + { + private readonly Address _to; + private readonly BigInteger _value; + private readonly byte[] _data; + private readonly BigInteger _gasLimit; + private readonly bool _delegateCall; + private readonly bool _onlyFallback; + private readonly BehaviourOnError _behaviorOnError = BehaviourOnError.revert; + + public RawTransaction(Address to, BigInteger value, byte[] data) + { + _to = to; + _value = value; + _data = data; + } + + public RawTransaction(Address to, BigInteger value, byte[] data, BigInteger gasLimit, bool delegateCall, bool onlyFallback, BehaviourOnError behaviourOnError) + { + _to = to; + _value = value; + _data = data; + _gasLimit = gasLimit; + _delegateCall = delegateCall; + _onlyFallback = onlyFallback; + _behaviorOnError = behaviourOnError; + } + + public Call GetCall() + { + return new Call(_to, _value, _data, _gasLimit, _delegateCall, _onlyFallback, _behaviorOnError); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/RawTransaction.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/RawTransaction.cs.meta new file mode 100644 index 00000000..7ac628f8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/RawTransaction.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 73f5fbec17e846bd9ab3618d02e3befb +timeCreated: 1755035077 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Transaction.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Transaction.cs new file mode 100644 index 00000000..71ca8eb7 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Transaction.cs @@ -0,0 +1,31 @@ +using System.Numerics; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet +{ + public class Transaction : ITransaction + { + private readonly Address _to; + private readonly BigInteger _value; + private readonly string _functionSignature; + private readonly object[] _parameters; + + public Transaction(Address to, BigInteger value, string functionSignature, params object[] parameters) + { + _to = to; + _value = value; + _functionSignature = functionSignature; + _parameters = parameters; + } + + public Call GetCall() + { + var data = _parameters is { Length: > 0 } ? + ABI.ABI.Pack(_functionSignature, _parameters).HexStringToByteArray() : + ABI.ABI.FunctionSelector(_functionSignature).HexStringToByteArray(); + + return new Call(_to, _value, data); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Transaction.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Transaction.cs.meta new file mode 100644 index 00000000..62bc591a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Transaction.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e2eb00e4d1d045f893ec23e910f8f94d +timeCreated: 1755035809 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionExtensions.cs new file mode 100644 index 00000000..a77f14e3 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionExtensions.cs @@ -0,0 +1,13 @@ +using System.Linq; +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet +{ + internal static class TransactionExtensions + { + public static Call[] GetCalls(this ITransaction[] transactions) + { + return transactions.Select(t => t.GetCall()).ToArray(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionExtensions.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionExtensions.cs.meta new file mode 100644 index 00000000..abed1a49 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionExtensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0a2b4dd6b7aa48978017584ea9a3b4b2 +timeCreated: 1755035639 \ No newline at end of file From a37501fc5686c3fd321cf4aec953ac260a2833bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 13 Aug 2025 08:35:20 +0200 Subject: [PATCH 139/165] added IPermission interface --- .../UnitTests/AuthenticationTests.cs | 4 +- .../UnitTests/RawTransactionTests.cs | 18 ++--- .../SequenceEcosystemWalletWindow.cs | 46 ++++-------- .../Authentication/IConnect.cs | 10 +-- .../EcosystemWallet/Authentication/IWallet.cs | 2 +- .../Authentication/SequenceConnect.cs | 14 ++-- .../Authentication/SequenceWallet.cs | 5 +- .../Authentication/SessionTemplates.cs | 42 ----------- .../Authentication/SessionTemplates.cs.meta | 3 - .../Permissions/ContractPermission.cs | 36 ++++++++++ .../Permissions/ContractPermission.cs.meta | 3 + ...{IPermissionBuilder.cs => IPermissions.cs} | 2 +- ...onBuilder.cs.meta => IPermissions.cs.meta} | 0 .../Permissions/Permissions.cs | 47 +++++++++++++ .../Permissions/Permissions.cs.meta | 3 + .../TransactionsPermissionBuilder.cs | 70 ------------------- .../TransactionsPermissionBuilder.cs.meta | 3 - 17 files changed, 129 insertions(+), 179 deletions(-) delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs.meta rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/{IPermissionBuilder.cs => IPermissions.cs} (77%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/{IPermissionBuilder.cs.meta => IPermissions.cs.meta} (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/TransactionsPermissionBuilder.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/TransactionsPermissionBuilder.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs index c5eb3a5b..ac8676d4 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs @@ -25,14 +25,14 @@ public async Task SignInWithGoogle() public async Task AddUnrestrictiveExplicitSession() { var wallet = SequenceWallet.RecoverFromStorage(); - await wallet.AddSession(Chain, new SessionTemplates(Chain).BuildUnrestrictivePermissions(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"))); + await wallet.AddSession(Chain, new ContractPermission(Chain, new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, 0)); } [Test] public async Task AddRestrictiveExplicitSession() { var wallet = SequenceWallet.RecoverFromStorage(); - await wallet.AddSession(Chain, new SessionTemplates(Chain).BuildBasicRestrictivePermissions()); + await wallet.AddSession(Chain, new ContractPermission(Chain, new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, 0)); } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs index 0993a345..ea7f502f 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs @@ -12,14 +12,14 @@ public class RawTransactionTests { private static readonly EcosystemType Ecosystem = EcosystemType.Sequence; - private static readonly Call[] ImplicitCalls = new Call[] + private static readonly ITransaction[] ImplicitCalls = new [] { - new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, ABI.ABI.FunctionSelector("implicitEmit()").HexStringToByteArray()) + new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "implicitEmit()") }; - private static readonly Call[] ExplicitCalls = new Call[] + private static readonly ITransaction[] ExplicitCalls = new [] { - new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, ABI.ABI.FunctionSelector("explicitEmit()").HexStringToByteArray()) + new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "explicitEmit()") }; private static IWallet Wallet => SequenceWallet.RecoverFromStorage(); @@ -27,16 +27,12 @@ public class RawTransactionTests [Test] public async Task AddPermissionForUsdcTransfer() { - var usdcAddress = new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607"); - var target = new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"); var deadline = new BigInteger(DateTimeOffset.UtcNow.ToUnixTimeSeconds() * 1000 + 1000 * 60 * 5000); - var sessionBuilder = new TransactionsPermissionBuilder(Chain.Optimism, 1000000, deadline); - sessionBuilder.AddPermission(usdcAddress); - sessionBuilder.AddPermission(target); + var permissions = new Permissions( + new ContractPermission(Chain.Optimism, new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607"), deadline, 1000000), + new ContractPermission(Chain.Optimism, new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), deadline, 0)); - var permissions = sessionBuilder.GetPermissions(); - await Wallet.AddSession(Chain.Optimism, permissions); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index ad9844f2..9c3ad9f9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -293,36 +293,33 @@ public void EnableEmailButton(bool enable) public async void SendImplicitTransaction() { - await _wallet.SendTransaction(Chain.TestnetArbitrumSepolia, new Call[] + await _wallet.SendTransaction(Chain.TestnetArbitrumSepolia, new ITransaction[] { - new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, ABI.ABI.FunctionSelector("implicitEmit()").HexStringToByteArray()), - new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, ABI.ABI.FunctionSelector("implicitEmit()").HexStringToByteArray()) + new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "implicitEmit()") }); } public async void SendExplicitTransaction() { - await _wallet.SendTransaction(Chain.TestnetArbitrumSepolia, new Call[] + await _wallet.SendTransaction(Chain.TestnetArbitrumSepolia, new ITransaction[] { - new (new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, - ABI.ABI.FunctionSelector("explicitEmit()").HexStringToByteArray()) + new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "explicitEmit()") }); } public async void SendExplicitTransactionWithUsdc() { - var calls = new ITransaction[] + var txn = new ITransaction[] { new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "explicitEmit()") }; - var feeOptions = await _wallet.GetFeeOption(Chain.Optimism, calls); + var feeOptions = await _wallet.GetFeeOption(Chain.Optimism, txn); var feeOption = feeOptions.First(o => o.token.symbol == "USDC"); if (feeOption == null) throw new Exception($"Fee option 'USDC' not available"); - Debug.Log($"{feeOption.to} {feeOption.token.contractAddress} {feeOption.value}"); - await _wallet.SendTransaction(Chain.Optimism, calls, feeOption); + await _wallet.SendTransaction(Chain.Optimism, txn, feeOption); } private void SetLoading(bool value) @@ -342,40 +339,27 @@ private void VerifyEmailInput(string input) _emailContinueButton.interactable = validEmail; } - private SessionPermissions GetImplicitPermissions() + private IPermissions GetImplicitPermissions() { return GetPermissionsFromSessionType((int)_implicitPermissions); } - private SessionPermissions GetExplicitPermissions() + private IPermissions GetExplicitPermissions() { return GetPermissionsFromSessionType((int)_explicitPermissions + 1); } - private SessionPermissions GetPermissionsFromSessionType(int type) + private IPermissions GetPermissionsFromSessionType(int type) { - if (type == 0) - return null; - var deadline = new BigInteger(1955010532000); Debug.Log($"deadline {deadline}"); - var sessionBuilder = new TransactionsPermissionBuilder(_chain, 0, deadline); - sessionBuilder.AddPermission(new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607")); - sessionBuilder.AddPermission(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA")); - - return sessionBuilder.GetPermissions(); - - var templates = new SessionTemplates(_chain); - return type switch - { - 0 => null, - 1 => templates.BuildUnrestrictivePermissions(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA")), - 2 => templates.BuildUnrestrictivePermissions(new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607")), - 3 => templates.BuildBasicRestrictivePermissions(), - _ => throw new Exception("Unsupported session type") - }; + var permissions = new Permissions( + new ContractPermission(Chain.Optimism, new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607"), deadline, 0), + new ContractPermission(Chain.Optimism, new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), deadline, 0)); + + return permissions; } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs index 6fcdd569..a81f9b1c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs @@ -11,34 +11,34 @@ public interface IConnect /// /// /// - Task SignInWithEmail(string email, SessionPermissions permissions = null); + Task SignInWithEmail(string email, IPermissions permissions = null); /// /// Sign in with Google through an external browser. /// /// /// - Task SignInWithGoogle(SessionPermissions permissions = null); + Task SignInWithGoogle(IPermissions permissions = null); /// /// Sign in with Apple through an external browser. /// /// /// - Task SignInWithApple(SessionPermissions permissions = null); + Task SignInWithApple(IPermissions permissions = null); /// /// Sign in with a passkey through an external browser. /// /// /// - Task SignInWithPasskey(SessionPermissions permissions = null); + Task SignInWithPasskey(IPermissions permissions = null); /// /// Sign in using a mnemonic through an external browser. /// /// /// - Task SignInWithMnemonic(SessionPermissions permissions = null); + Task SignInWithMnemonic(IPermissions permissions = null); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs index 38aac61b..1bb58a0f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs @@ -23,7 +23,7 @@ public interface IWallet /// /// /// - Task AddSession(Chain chain, SessionPermissions permissions); + Task AddSession(Chain chain, IPermissions permissions); /// /// Clear all session signers from storage. This requires you to re-connect using the SequenceConnect object. diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index 9e0d070b..72d013d6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -12,34 +12,34 @@ public SequenceConnect(EcosystemType ecosystem, Chain chain) _client = new EcosystemClient(ecosystem, chain); } - public async Task SignInWithEmail(string email, SessionPermissions permissions = null) + public async Task SignInWithEmail(string email, IPermissions permissions = null) { return await SignIn(permissions, "email", email); } - public async Task SignInWithGoogle(SessionPermissions permissions = null) + public async Task SignInWithGoogle(IPermissions permissions = null) { return await SignIn(permissions, "google", null); } - public async Task SignInWithApple(SessionPermissions permissions = null) + public async Task SignInWithApple(IPermissions permissions = null) { return await SignIn(permissions, "apple", null); } - public async Task SignInWithPasskey(SessionPermissions permissions = null) + public async Task SignInWithPasskey(IPermissions permissions = null) { return await SignIn(permissions, "passkey", null); } - public async Task SignInWithMnemonic(SessionPermissions permissions = null) + public async Task SignInWithMnemonic(IPermissions permissions = null) { return await SignIn(permissions, "mnemonic", null); } - private async Task SignIn(SessionPermissions permissions, string preferredLoginMethod, string email) + private async Task SignIn(IPermissions permissions, string preferredLoginMethod, string email) { - var signer = await _client.CreateNewSession(false, permissions,preferredLoginMethod, email); + var signer = await _client.CreateNewSession(false, permissions.GetPermissions(), preferredLoginMethod, email); return new SequenceWallet(new [] { signer }); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index cf6db98c..802f0e82 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -2,7 +2,6 @@ using System.Linq; using System.Threading.Tasks; using Sequence.EcosystemWallet.Browser; -using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Relayer; using Sequence.Utils; @@ -43,14 +42,14 @@ public Address[] GetAllSigners() return _sessionSigners.Select(x => x.Address).ToArray(); } - public async Task AddSession(Chain chain, SessionPermissions permissions) + public async Task AddSession(Chain chain, IPermissions permissions) { Assert.IsNotNull(permissions); var ecosystem = _sessionSigners[0].Ecosystem; var client = new EcosystemClient(ecosystem, chain); - var sessionSigner = await client.CreateNewSession(true, permissions, string.Empty); + var sessionSigner = await client.CreateNewSession(true, permissions.GetPermissions(), string.Empty); _sessionSigners.AddToArray(sessionSigner); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs deleted file mode 100644 index a268e6ec..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Numerics; -using Nethereum.Util; -using Sequence.EcosystemWallet.Primitives; - -namespace Sequence.EcosystemWallet -{ - public class SessionTemplates - { - private readonly Chain _chain; - - public SessionTemplates(Chain chain) - { - _chain = chain; - } - - public SessionPermissions BuildUnrestrictivePermissions(Address target) - { - var deadline = new BigInteger(DateTime.UtcNow.ToUnixTimestamp() * 1000 + 1000 * 60 * 5000); - - var sessionBuilder = new TransactionsPermissionBuilder(_chain, 1000000000, deadline); - sessionBuilder.AddPermission(target); - - return sessionBuilder.GetPermissions(); - } - - public SessionPermissions BuildBasicRestrictivePermissions() - { - var deadline = new BigInteger(DateTime.UtcNow.ToUnixTimestamp() * 1000 + 1000 * 60 * 5000); - var target = new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"); - - var sessionBuilder = new TransactionsPermissionBuilder(_chain, 0, deadline); - sessionBuilder.AddPermission(target, false, ParameterOperation.equal, - ABI.ABI.FunctionSelector("explicitEmit()"), 0, ParameterRule.SelectorMask); - - sessionBuilder.AddPermission(target, true, ParameterOperation.greaterThanOrEqual, - "0x1234567890123456789012345678901234567890", 4, ParameterRule.Uint256Mask); - - return sessionBuilder.GetPermissions(); - } - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs.meta deleted file mode 100644 index 65eb3a8d..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionTemplates.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: f89ff3a67cd34f1296cd468264f2738a -timeCreated: 1752612201 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs new file mode 100644 index 00000000..9ae0aec9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs @@ -0,0 +1,36 @@ +using System; +using System.Numerics; +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet +{ + public class ContractPermission : IPermissions + { + private readonly Chain _chain; + private readonly Address _contract; + private readonly BigInteger _deadline; + private readonly BigInteger _valueLimit; + + public ContractPermission(Chain chain, Address contract, BigInteger deadline, BigInteger valueLimit) + { + _chain = chain; + _contract = contract; + _deadline = deadline; + _valueLimit = valueLimit; + } + + public SessionPermissions GetPermissions() + { + var permissions = new[] { new Permission { target = _contract, rules = Array.Empty() } }; + + return new SessionPermissions + { + chainId = BigInteger.Parse(ChainDictionaries.ChainIdOf[_chain]), + deadline = _deadline, + valueLimit = _valueLimit, + signer = new Address("0x1234567890123456789012345678901234567890"), + permissions = permissions + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs.meta new file mode 100644 index 00000000..6682cc91 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 74673252f53a4465b23a5c5c12429713 +timeCreated: 1755065385 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissionBuilder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissions.cs similarity index 77% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissionBuilder.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissions.cs index 7870d34d..7225a674 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissionBuilder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissions.cs @@ -2,7 +2,7 @@ namespace Sequence.EcosystemWallet { - public interface IPermissionBuilder + public interface IPermissions { SessionPermissions GetPermissions(); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissionBuilder.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissions.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissionBuilder.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissions.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs new file mode 100644 index 00000000..28d847db --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; +using System.Numerics; +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet +{ + public class Permissions : IPermissions + { + private readonly IPermissions[] _permissions; + + public Permissions(params IPermissions[] permissions) + { + _permissions = permissions; + } + + public SessionPermissions GetPermissions() + { + BigInteger chain = 0; + BigInteger deadline = 0; + BigInteger valueLimit = 0; + + var allPermissions = new List(); + + foreach (var currentPermissions in _permissions) + { + var permissions = currentPermissions.GetPermissions(); + chain = permissions.chainId; + + if (permissions.deadline > deadline) + deadline = permissions.deadline; + + valueLimit += permissions.valueLimit; + + allPermissions.AddRange(permissions.permissions); + } + + return new SessionPermissions + { + chainId = chain, + deadline = deadline, + valueLimit = valueLimit, + signer = new Address("0x1234567890123456789012345678901234567890"), + permissions = allPermissions.ToArray() + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs.meta new file mode 100644 index 00000000..de742a16 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 88e1782bd7894248965052e45b9a2798 +timeCreated: 1755065881 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/TransactionsPermissionBuilder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/TransactionsPermissionBuilder.cs deleted file mode 100644 index 0fc4c37e..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/TransactionsPermissionBuilder.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System.Collections.Generic; -using System.Numerics; -using Sequence.EcosystemWallet.Primitives; -using Sequence.Utils; - -namespace Sequence.EcosystemWallet -{ - public class TransactionsPermissionBuilder : IPermissionBuilder - { - public Chain Chain; - public BigInteger ValueLimit; - public BigInteger Deadline; - - private Dictionary> _permissions = new(); - - public TransactionsPermissionBuilder(ITransaction[] calls, Chain chain, int deadline) - { - this.Chain = chain; - this.ValueLimit = valueLimit; - this.Deadline = deadline; - } - - public void AddPermission(Address target) - { - if (!_permissions.ContainsKey(target)) - _permissions.Add(target, new List()); - } - - public void AddPermission(Address target, bool cumulative, ParameterOperation operation, string value, BigInteger offset, byte[] mask) - { - var rule = new ParameterRule - { - cumulative = cumulative, - operation = (int)operation, - value = value.HexStringToByteArray().PadRight(32), - offset = offset, - mask = mask - }; - - if (!_permissions.ContainsKey(target)) - _permissions.Add(target, new List()); - - _permissions[target].Add(rule); - } - - public SessionPermissions GetPermissions() - { - var targets = _permissions.GetKeys(); - var permissions = new Permission[targets.Length]; - - for (var i = 0; i < targets.Length; i++) - { - permissions[i] = new Permission - { - target = targets[i], - rules = _permissions[targets[i]].ToArray() - }; - } - - return new SessionPermissions - { - signer = new Address("0xb7bE532959236170064cf099e1a3395aEf228F44"), - chainId = new BigInteger((int)Chain), - valueLimit = ValueLimit, - deadline = Deadline, - permissions = permissions - }; - } - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/TransactionsPermissionBuilder.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/TransactionsPermissionBuilder.cs.meta deleted file mode 100644 index b6d89dcd..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/TransactionsPermissionBuilder.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 17a642e1e798445980e09b495fea66bc -timeCreated: 1752611111 \ No newline at end of file From dee233a703bd4ce2caa1e72e6841564cf11aed4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 13 Aug 2025 10:48:45 +0200 Subject: [PATCH 140/165] latest changes and improvements --- .../UnitTests/AuthenticationTests.cs | 6 +- .../UnitTests/RawTransactionTests.cs | 8 +- .../EcosystemFeatureSelection.cs | 20 +++++ .../EcosystemFeatureSelection.cs.meta | 11 +++ .../EcosystemWallet/EcosystemWalletProfile.cs | 14 ++++ .../EcosystemWalletProfile.cs.meta | 11 +++ .../EcosystemWalletTransactions.cs | 18 +++++ .../EcosystemWalletTransactions.cs.meta | 11 +++ .../SequenceEcosystemWalletWindow.cs | 18 ++--- .../EcosystemWallet/TransactionButton.cs | 78 +++++++++++++++++++ .../EcosystemWallet/TransactionButton.cs.meta | 11 +++ .../Authentication/EcosystemClient.cs | 11 +-- .../Authentication/IConnect.cs | 11 ++- .../EcosystemWallet/Authentication/IWallet.cs | 25 +++++- .../Authentication/SequenceConnect.cs | 16 ++-- .../Authentication/SequenceWallet.cs | 22 ++++-- .../Permissions/ContractPermission.cs | 9 ++- .../Permissions/Permissions.cs | 8 +- .../Sequence/SequenceSDK/Ethereum/ChainId.cs | 5 ++ 19 files changed, 263 insertions(+), 50 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs index ac8676d4..de04e665 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs @@ -17,7 +17,7 @@ public void Disconnect() [Test] public async Task SignInWithGoogle() { - var connect = new SequenceConnect(Ecosystem, Chain); + var connect = new SequenceConnect(Ecosystem); await connect.SignInWithGoogle(); } @@ -25,14 +25,14 @@ public async Task SignInWithGoogle() public async Task AddUnrestrictiveExplicitSession() { var wallet = SequenceWallet.RecoverFromStorage(); - await wallet.AddSession(Chain, new ContractPermission(Chain, new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, 0)); + await wallet.AddSession(new ContractPermission(Chain, new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, 0)); } [Test] public async Task AddRestrictiveExplicitSession() { var wallet = SequenceWallet.RecoverFromStorage(); - await wallet.AddSession(Chain, new ContractPermission(Chain, new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, 0)); + await wallet.AddSession(new ContractPermission(Chain, new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, 0)); } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs index ea7f502f..b80a42a3 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs @@ -29,11 +29,11 @@ public async Task AddPermissionForUsdcTransfer() { var deadline = new BigInteger(DateTimeOffset.UtcNow.ToUnixTimeSeconds() * 1000 + 1000 * 60 * 5000); - var permissions = new Permissions( - new ContractPermission(Chain.Optimism, new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607"), deadline, 1000000), - new ContractPermission(Chain.Optimism, new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), deadline, 0)); + var permissions = new Permissions(Chain.Optimism, + new ContractPermission(new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607"), deadline, 1000000), + new ContractPermission(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), deadline, 0)); - await Wallet.AddSession(Chain.Optimism, permissions); + await Wallet.AddSession(permissions); } [Test] diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs new file mode 100644 index 00000000..865298c7 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs @@ -0,0 +1,20 @@ +using UnityEngine; + +namespace Sequence.Boilerplates +{ + public class EcosystemFeatureSelection : MonoBehaviour + { + [SerializeField] private EcosystemWalletProfile _profile; + [SerializeField] private EcosystemWalletTransactions _transactions; + + public void OpenProfile() + { + _profile.Load(null); + } + + public void OpenTransactions() + { + _transactions.Load(null); + } + } +} diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs.meta new file mode 100644 index 00000000..9f725f48 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2c4c81af6098e41c98ae27c7dc3bdf5f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs new file mode 100644 index 00000000..3d415cd3 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs @@ -0,0 +1,14 @@ +using System; +using Sequence.EcosystemWallet; +using UnityEngine; + +namespace Sequence.Boilerplates +{ + public class EcosystemWalletProfile : MonoBehaviour + { + public void Load(IWallet wallet) + { + gameObject.SetActive(true); + } + } +} diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs.meta new file mode 100644 index 00000000..6dd60410 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 96baada7b6cb742fab4e21a3c52de47b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs new file mode 100644 index 00000000..1b2dfb5d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs @@ -0,0 +1,18 @@ +using Sequence.EcosystemWallet; +using UnityEngine; + +namespace Sequence.Boilerplates +{ + public class EcosystemWalletTransactions : MonoBehaviour + { + [SerializeField] private TransactionButton[] _transactionButtons; + + public void Load(IWallet wallet) + { + gameObject.SetActive(true); + + foreach (var button in _transactionButtons) + button.Load(wallet); + } + } +} diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs.meta new file mode 100644 index 00000000..5ac4b5c1 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68370ec9959be4c67ab321f72b847f9d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index 9c3ad9f9..65271794 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -64,7 +64,7 @@ private enum ExplicitSessionType private void Start() { - _connect = new SequenceConnect(_ecosystem, _chain); + _connect = new SequenceConnect(_ecosystem); _emailInput.onValueChanged.AddListener(VerifyEmailInput); _messagePopup.gameObject.SetActive(false); _loadingOverlay.SetActive(false); @@ -165,7 +165,7 @@ public async void SignMessage() try { - var signature = await _wallet.SignMessage(message); + var signature = await _wallet.SignMessage(_chain, message); ShowSignature(signature.signature); SetLoading(false); } @@ -203,7 +203,7 @@ public async void AddExplicitSession() try { - await _wallet.AddSession(_chain, GetExplicitPermissions()); + await _wallet.AddSession(GetExplicitPermissions()); SetLoading(false); LoadSessions(); } @@ -222,7 +222,6 @@ public void SignOut() public void OnChainChanged(int index) { _chain = _chains[index]; - _connect = new SequenceConnect(_ecosystem, _chain); } public void OnImplicitSessionTypeChanged(int index) @@ -351,13 +350,14 @@ private IPermissions GetExplicitPermissions() private IPermissions GetPermissionsFromSessionType(int type) { - var deadline = new BigInteger(1955010532000); + if (type == 0) + return null; - Debug.Log($"deadline {deadline}"); + var deadline = DateTimeOffset.UtcNow.ToUnixTimeSeconds() * 1000 + 60 * 60 * 24 * 1000; - var permissions = new Permissions( - new ContractPermission(Chain.Optimism, new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607"), deadline, 0), - new ContractPermission(Chain.Optimism, new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), deadline, 0)); + var permissions = new Permissions(Chain.Optimism, + new ContractPermission(new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607"), deadline, 0), + new ContractPermission(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), deadline, 0)); return permissions; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs new file mode 100644 index 00000000..f9dda619 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Sequence.EcosystemWallet; +using UnityEngine; + +namespace Sequence.Boilerplates +{ + public class TransactionButton : MonoBehaviour + { + [Serializable] + public class SerializableTransaction + { + [field: SerializeField] public string To { get; set; } + [field: SerializeField] public string FunctionSelector { get; set; } + + public ITransaction BuildTransaction() + { + return new Transaction(new Address(To), 0, FunctionSelector); + } + } + + private enum State + { + Loading, + Session, + Transaction + } + + [Header("Transactions")] + [SerializeField] private Chain _chain = Chain.TestnetArbitrumSepolia; + [SerializeField] private SerializableTransaction _transaction; + + [Header("Components")] + [SerializeField] private GameObject _loadingObject; + [SerializeField] private GameObject _sessionButtonObject; + [SerializeField] private GameObject _transactionButtonObject; + + private IWallet _wallet; + + public async void Load(IWallet wallet) + { + _wallet = wallet; + await CheckSupportedTransaction(); + } + + public async void AddSession() + { + SetState(State.Loading); + var permission = new ContractPermission(new Address(_transaction.To), 0, 0);; + await _wallet.AddSession(permission); + await CheckSupportedTransaction(); + } + + public async void SendTransaction() + { + SetState(State.Loading); + await _wallet.SendTransaction(_chain, _transaction.BuildTransaction()); + SetState(State.Transaction); + } + + private async Task CheckSupportedTransaction() + { + SetState(State.Loading); + var supported = await _wallet.SupportsTransaction(_chain, _transaction.BuildTransaction()); + SetState(supported ? State.Transaction : State.Session); + } + + private void SetState(State state) + { + _loadingObject.SetActive(state == State.Loading); + _sessionButtonObject.SetActive(state == State.Session); + _transactionButtonObject.SetActive(state == State.Transaction); + } + } +} diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs.meta new file mode 100644 index 00000000..510de5a5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5fa388a969190426facba008de2b8c43 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs index 87e16e14..abe150a6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs @@ -1,4 +1,5 @@ using System; +using System.Numerics; using System.Threading.Tasks; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; @@ -10,12 +11,10 @@ namespace Sequence.EcosystemWallet internal class EcosystemClient { private readonly EcosystemType _ecosystem; - private readonly Chain _chain; - public EcosystemClient(EcosystemType ecosystem, Chain chain) + public EcosystemClient(EcosystemType ecosystem) { _ecosystem = ecosystem; - _chain = chain; } /// @@ -31,6 +30,10 @@ public async Task CreateNewSession(bool isExplicit, SessionPermis { var sessionWallet = new EOAWallet(); + var chainId = string.Empty; + if (permissions != null) + chainId = permissions.chainId.ToString(); + var origin = RedirectOrigin.GetOriginString(); var payload = new ConnectArgs { @@ -52,8 +55,6 @@ public async Task CreateNewSession(bool isExplicit, SessionPermis if (!response.Result) throw new Exception("Error during request"); - var chainId = ChainDictionaries.ChainIdOf[_chain]; - Debug.Log($"chainId {chainId}"); var credentials = new SessionCredentials( isExplicit, sessionWallet.GetPrivateKeyAsHex(), diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs index a81f9b1c..4a66f361 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs @@ -1,5 +1,4 @@ using System.Threading.Tasks; -using Sequence.EcosystemWallet.Primitives; namespace Sequence.EcosystemWallet { @@ -11,34 +10,34 @@ public interface IConnect /// /// /// - Task SignInWithEmail(string email, IPermissions permissions = null); + Task SignInWithEmail(string email, IPermissions permissions = null); /// /// Sign in with Google through an external browser. /// /// /// - Task SignInWithGoogle(IPermissions permissions = null); + Task SignInWithGoogle(IPermissions permissions = null); /// /// Sign in with Apple through an external browser. /// /// /// - Task SignInWithApple(IPermissions permissions = null); + Task SignInWithApple(IPermissions permissions = null); /// /// Sign in with a passkey through an external browser. /// /// /// - Task SignInWithPasskey(IPermissions permissions = null); + Task SignInWithPasskey(IPermissions permissions = null); /// /// Sign in using a mnemonic through an external browser. /// /// /// - Task SignInWithMnemonic(IPermissions permissions = null); + Task SignInWithMnemonic(IPermissions permissions = null); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs index 1bb58a0f..419d0076 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs @@ -20,10 +20,9 @@ public interface IWallet /// /// Add sessions to extend your permissions. /// - /// /// /// - Task AddSession(Chain chain, IPermissions permissions); + Task AddSession(IPermissions permissions); /// /// Clear all session signers from storage. This requires you to re-connect using the SequenceConnect object. @@ -33,9 +32,10 @@ public interface IWallet /// /// Sign a message through an external browser. /// + /// The message you want to sign. /// The message you want to sign. /// - Task SignMessage(string message); + Task SignMessage(Chain chain, string message); /// /// Get fee options for your calls. Only required for mainnets, if you don't have gas sponsorship configured. @@ -45,6 +45,15 @@ public interface IWallet /// Task GetFeeOption(Chain chain, ITransaction[] transactions); + /// + /// Send a single transaction. + /// + /// + /// + /// + /// + Task SendTransaction(Chain chain, ITransaction transaction, FeeOption feeOption = null); + /// /// Send a transaction. /// @@ -54,12 +63,20 @@ public interface IWallet /// Task SendTransaction(Chain chain, ITransaction[] transactions, FeeOption feeOption = null); + /// + /// Checks whether this wallet is capable of signing the given calls. + /// + /// + /// + /// False if no local signer could be found. + Task SupportsTransaction(Chain chain, ITransaction transaction); + /// /// Checks whether this wallet is capable of signing the given calls. /// /// /// /// False if no local signer could be found. - Task IsSupportedCalls(Chain chain, ITransaction[] transactions); + Task SupportsTransaction(Chain chain, ITransaction[] transactions); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index 72d013d6..3fccc32a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -7,37 +7,37 @@ public class SequenceConnect : IConnect { private readonly EcosystemClient _client; - public SequenceConnect(EcosystemType ecosystem, Chain chain) + public SequenceConnect(EcosystemType ecosystem) { - _client = new EcosystemClient(ecosystem, chain); + _client = new EcosystemClient(ecosystem); } - public async Task SignInWithEmail(string email, IPermissions permissions = null) + public async Task SignInWithEmail(string email, IPermissions permissions = null) { return await SignIn(permissions, "email", email); } - public async Task SignInWithGoogle(IPermissions permissions = null) + public async Task SignInWithGoogle(IPermissions permissions = null) { return await SignIn(permissions, "google", null); } - public async Task SignInWithApple(IPermissions permissions = null) + public async Task SignInWithApple(IPermissions permissions = null) { return await SignIn(permissions, "apple", null); } - public async Task SignInWithPasskey(IPermissions permissions = null) + public async Task SignInWithPasskey(IPermissions permissions = null) { return await SignIn(permissions, "passkey", null); } - public async Task SignInWithMnemonic(IPermissions permissions = null) + public async Task SignInWithMnemonic(IPermissions permissions = null) { return await SignIn(permissions, "mnemonic", null); } - private async Task SignIn(IPermissions permissions, string preferredLoginMethod, string email) + private async Task SignIn(IPermissions permissions, string preferredLoginMethod, string email) { var signer = await _client.CreateNewSession(false, permissions.GetPermissions(), preferredLoginMethod, email); return new SequenceWallet(new [] { signer }); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index 802f0e82..0b66e1a7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -42,15 +42,15 @@ public Address[] GetAllSigners() return _sessionSigners.Select(x => x.Address).ToArray(); } - public async Task AddSession(Chain chain, IPermissions permissions) + public async Task AddSession(IPermissions permissions) { Assert.IsNotNull(permissions); var ecosystem = _sessionSigners[0].Ecosystem; - var client = new EcosystemClient(ecosystem, chain); + var client = new EcosystemClient(ecosystem); var sessionSigner = await client.CreateNewSession(true, permissions.GetPermissions(), string.Empty); - _sessionSigners.AddToArray(sessionSigner); + _sessionSigners = _sessionSigners.AddToArray(sessionSigner); } public void Disconnect() @@ -59,12 +59,12 @@ public void Disconnect() _sessionSigners = Array.Empty(); } - public async Task SignMessage(string message) + public async Task SignMessage(Chain chain, string message) { var args = new SignMessageArgs { address = Address, - chainId = new BigInt((int)_sessionSigners[0].Chain), + chainId = new BigInt((int)chain), message = message }; @@ -96,6 +96,11 @@ public async Task GetFeeOption(Chain chain, ITransaction[] transact return response.options; } + public async Task SendTransaction(Chain chain, ITransaction transaction, FeeOption feeOption = null) + { + return await SendTransaction(chain, new[] { transaction }, feeOption); + } + public async Task SendTransaction(Chain chain, ITransaction[] transactions, FeeOption feeOption = null) { await _state.Update(chain); @@ -134,8 +139,13 @@ public async Task SendTransaction(Chain chain, ITransaction[] transactio return receipt.txnReceipt; } + + public async Task SupportsTransaction(Chain chain, ITransaction transaction) + { + return await SupportsTransaction(chain, new[] { transaction }); + } - public async Task IsSupportedCalls(Chain chain, ITransaction[] transactions) + public async Task SupportsTransaction(Chain chain, ITransaction[] transactions) { try { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs index 9ae0aec9..df2a156e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs @@ -11,6 +11,13 @@ public class ContractPermission : IPermissions private readonly BigInteger _deadline; private readonly BigInteger _valueLimit; + public ContractPermission(Address contract, BigInteger deadline, BigInteger valueLimit) + { + _contract = contract; + _deadline = deadline; + _valueLimit = valueLimit; + } + public ContractPermission(Chain chain, Address contract, BigInteger deadline, BigInteger valueLimit) { _chain = chain; @@ -25,7 +32,7 @@ public SessionPermissions GetPermissions() return new SessionPermissions { - chainId = BigInteger.Parse(ChainDictionaries.ChainIdOf[_chain]), + chainId = _chain.IsActive() ? _chain.AsBigInteger() : 0, deadline = _deadline, valueLimit = _valueLimit, signer = new Address("0x1234567890123456789012345678901234567890"), diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs index 28d847db..93ed7cff 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs @@ -6,16 +6,17 @@ namespace Sequence.EcosystemWallet { public class Permissions : IPermissions { + private readonly Chain _chain; private readonly IPermissions[] _permissions; - public Permissions(params IPermissions[] permissions) + public Permissions(Chain chain, params IPermissions[] permissions) { + _chain = chain; _permissions = permissions; } public SessionPermissions GetPermissions() { - BigInteger chain = 0; BigInteger deadline = 0; BigInteger valueLimit = 0; @@ -24,7 +25,6 @@ public SessionPermissions GetPermissions() foreach (var currentPermissions in _permissions) { var permissions = currentPermissions.GetPermissions(); - chain = permissions.chainId; if (permissions.deadline > deadline) deadline = permissions.deadline; @@ -36,7 +36,7 @@ public SessionPermissions GetPermissions() return new SessionPermissions { - chainId = chain, + chainId = _chain.AsBigInteger(), deadline = deadline, valueLimit = valueLimit, signer = new Address("0x1234567890123456789012345678901234567890"), diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ChainId.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ChainId.cs index 706cb04f..643357ec 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ChainId.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ChainId.cs @@ -24,6 +24,11 @@ public static string GetChainId(this Chain chain) return ChainDictionaries.ChainIdOf[chain]; } + public static BigInteger AsBigInteger(this Chain chain) + { + return BigInteger.Parse(GetChainId(chain)); + } + public static bool IsActive(this Chain chain) { return !(chain == Chain.None || chain == Chain.AstarZKEvm || chain == Chain.TestnetAstarZKyoto || From 5adf1218079284853d087fbe075703b7996833b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 13 Aug 2025 10:52:31 +0200 Subject: [PATCH 141/165] assert for session signer length --- .../EcosystemWallet/EcosystemWalletProfile.cs | 1 - .../Authentication/SequenceWallet.cs | 20 +++++++++++++++++-- .../Authentication/SessionSigner.cs | 8 ++++---- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs index 3d415cd3..6b817b46 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs @@ -1,4 +1,3 @@ -using System; using Sequence.EcosystemWallet; using UnityEngine; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs index 0b66e1a7..e1fc9453 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs @@ -44,6 +44,7 @@ public Address[] GetAllSigners() public async Task AddSession(IPermissions permissions) { + AssertSessionSigners(); Assert.IsNotNull(permissions); var ecosystem = _sessionSigners[0].Ecosystem; @@ -61,14 +62,17 @@ public void Disconnect() public async Task SignMessage(Chain chain, string message) { - var args = new SignMessageArgs + AssertSessionSigners(); + + var args = new SignMessageArgs { address = Address, chainId = new BigInt((int)chain), message = message }; - var url = $"{EcosystemBindings.GetUrl(EcosystemType.Dev)}/request/sign"; + var ecosystem = _sessionSigners[0].Ecosystem; + var url = $"{EcosystemBindings.GetUrl(ecosystem)}/request/sign"; var handler = RedirectFactory.CreateHandler(); handler.SetRedirectUrl(RedirectOrigin.GetOriginString()); @@ -83,6 +87,8 @@ public async Task SignMessage(Chain chain, string message) public async Task GetFeeOption(Chain chain, ITransaction[] transactions) { + AssertSessionSigners(); + await _state.Update(chain); var calls = transactions.GetCalls(); @@ -103,6 +109,8 @@ public async Task SendTransaction(Chain chain, ITransaction transaction, public async Task SendTransaction(Chain chain, ITransaction[] transactions, FeeOption feeOption = null) { + AssertSessionSigners(); + await _state.Update(chain); var calls = transactions.GetCalls(); @@ -147,6 +155,8 @@ public async Task SupportsTransaction(Chain chain, ITransaction transactio public async Task SupportsTransaction(Chain chain, ITransaction[] transactions) { + AssertSessionSigners(); + try { await _state.Update(chain); @@ -162,5 +172,11 @@ public async Task SupportsTransaction(Chain chain, ITransaction[] transact return false; } } + + private void AssertSessionSigners() + { + if (_sessionSigners.Length == 0) + throw new Exception("No session signers available. Please sign in again."); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs index 1c5f9754..57bbc559 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs @@ -45,18 +45,18 @@ internal SessionSigner(SessionCredentials credentials) ParentAddress = credentials.address; Address = new EOAWallet(credentials.privateKey).GetAddress(); - Chain = ChainDictionaries.ChainById[credentials.chainId]; + Chain = string.IsNullOrEmpty(credentials.chainId) ? Chain.None : ChainDictionaries.ChainById[credentials.chainId]; Ecosystem = (EcosystemType)credentials.ecosystemId; IsExplicit = credentials.isExplicit; } public async Task IsSupportedCall(Call call, Chain chain, SessionsTopology topology) { - if (Chain != chain) - return false; - if (IsExplicit) { + if (Chain != chain) + return false; + if (call.data.Length > 4 && ByteArrayExtensions.Slice(call.data, 0, 4).ByteArrayToHexStringWithPrefix() == ABI.ABI.FunctionSelector("incrementUsageLimit((bytes32,uint256)[])")) From bde098071bf38cf714f177db62ad113a64ff2d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 13 Aug 2025 10:59:34 +0200 Subject: [PATCH 142/165] directory restructure --- .../{ => Authentication}/RedirectHandler.meta | 0 .../RedirectHandler/BrowserRedirectHandler.cs | 0 .../BrowserRedirectHandler.cs.meta | 0 .../DeeplinkRedirectHandler.cs | 0 .../DeeplinkRedirectHandler.cs.meta | 0 .../LocalhostRedirectHandler.cs | 0 .../LocalhostRedirectHandler.cs.meta | 0 .../RedirectHandler/NativeReceiver.cs | 0 .../RedirectHandler/NativeReceiver.cs.meta | 0 .../RedirectHandler/RedirectFactory.cs | 0 .../RedirectHandler/RedirectFactory.cs.meta | 0 .../RedirectHandler/RedirectHandler.cs | 0 .../RedirectHandler/RedirectHandler.cs.meta | 0 .../RedirectHandler/TcpRedirectHandler.cs | 0 .../TcpRedirectHandler.cs.meta | 0 .../RedirectHandler/WindowsRedirectCheck.cs | 0 .../WindowsRedirectCheck.cs.meta | 0 .../Authentication/TransactionData.cs | 14 ------ .../Authentication/TransactionData.cs.meta | 3 -- .../SequenceSDK/EcosystemWallet/Services.meta | 3 -- .../{ => Transactions}/Envelope.meta | 0 .../{ => Transactions}/Envelope/Envelope.cs | 0 .../Envelope/Envelope.cs.meta | 0 .../Envelope/EnvelopeSignature.cs | 0 .../Envelope/EnvelopeSignature.cs.meta | 0 .../Envelope/SapientSignature.cs | 0 .../Envelope/SapientSignature.cs.meta | 0 .../{ => Transactions}/Envelope/Signature.cs | 0 .../Envelope/Signature.cs.meta | 0 .../Envelope/SignedEnvelope.cs | 0 .../Envelope/SignedEnvelope.cs.meta | 0 .../FeeOptionService.cs | 0 .../FeeOptionService.cs.meta | 0 .../TransactionService.cs | 44 ++++++------------- .../TransactionService.cs.meta | 0 .../EcosystemWallet/Utils/Erc6492Helper.cs | 2 +- .../SequenceSDK/EcosystemWallet/Wallet.meta | 3 ++ .../{Authentication => Wallet}/IWallet.cs | 0 .../IWallet.cs.meta | 0 .../SequenceWallet.cs | 0 .../SequenceWallet.cs.meta | 0 .../SessionSigner.cs | 0 .../SessionSigner.cs.meta | 0 .../{Services => Wallet}/SignatureService.cs | 0 .../SignatureService.cs.meta | 0 .../{Services => Wallet}/SignerService.cs | 0 .../SignerService.cs.meta | 0 .../{Authentication => Wallet}/WalletState.cs | 0 .../WalletState.cs.meta | 0 49 files changed, 17 insertions(+), 52 deletions(-) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/BrowserRedirectHandler.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/BrowserRedirectHandler.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/DeeplinkRedirectHandler.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/DeeplinkRedirectHandler.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/LocalhostRedirectHandler.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/LocalhostRedirectHandler.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/NativeReceiver.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/NativeReceiver.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/RedirectFactory.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/RedirectFactory.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/RedirectHandler.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/RedirectHandler.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/TcpRedirectHandler.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/TcpRedirectHandler.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/WindowsRedirectCheck.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Authentication}/RedirectHandler/WindowsRedirectCheck.cs.meta (100%) delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services.meta rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Transactions}/Envelope.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Transactions}/Envelope/Envelope.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Transactions}/Envelope/Envelope.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Transactions}/Envelope/EnvelopeSignature.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Transactions}/Envelope/EnvelopeSignature.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Transactions}/Envelope/SapientSignature.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Transactions}/Envelope/SapientSignature.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Transactions}/Envelope/Signature.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Transactions}/Envelope/Signature.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Transactions}/Envelope/SignedEnvelope.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{ => Transactions}/Envelope/SignedEnvelope.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Services => Transactions}/FeeOptionService.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Services => Transactions}/FeeOptionService.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Services => Transactions}/TransactionService.cs (71%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Services => Transactions}/TransactionService.cs.meta (100%) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet.meta rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Authentication => Wallet}/IWallet.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Authentication => Wallet}/IWallet.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Authentication => Wallet}/SequenceWallet.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Authentication => Wallet}/SequenceWallet.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Authentication => Wallet}/SessionSigner.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Authentication => Wallet}/SessionSigner.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Services => Wallet}/SignatureService.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Services => Wallet}/SignatureService.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Services => Wallet}/SignerService.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Services => Wallet}/SignerService.cs.meta (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Authentication => Wallet}/WalletState.cs (100%) rename Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/{Authentication => Wallet}/WalletState.cs.meta (100%) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/BrowserRedirectHandler.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/BrowserRedirectHandler.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/BrowserRedirectHandler.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/BrowserRedirectHandler.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/BrowserRedirectHandler.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/DeeplinkRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/DeeplinkRedirectHandler.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/DeeplinkRedirectHandler.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/DeeplinkRedirectHandler.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/DeeplinkRedirectHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/DeeplinkRedirectHandler.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/DeeplinkRedirectHandler.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/DeeplinkRedirectHandler.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/LocalhostRedirectHandler.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/NativeReceiver.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/NativeReceiver.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/NativeReceiver.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/NativeReceiver.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/NativeReceiver.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectFactory.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectFactory.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectFactory.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectFactory.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectFactory.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectHandler.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectHandler.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectHandler.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/RedirectHandler.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectHandler.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/TcpRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/TcpRedirectHandler.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/TcpRedirectHandler.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/TcpRedirectHandler.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/TcpRedirectHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/TcpRedirectHandler.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/TcpRedirectHandler.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/TcpRedirectHandler.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/WindowsRedirectCheck.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/WindowsRedirectCheck.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/WindowsRedirectCheck.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/WindowsRedirectCheck.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/WindowsRedirectCheck.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/WindowsRedirectCheck.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/RedirectHandler/WindowsRedirectCheck.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/WindowsRedirectCheck.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs deleted file mode 100644 index a050f8e9..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Sequence.EcosystemWallet -{ - public struct TransactionData - { - public Address To; - public string Data; - - public TransactionData(Address to, string data) - { - To = to; - Data = data; - } - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs.meta deleted file mode 100644 index e79d23fa..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/TransactionData.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: a0ba80adbd0245f092953dfac6e847cc -timeCreated: 1754566046 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services.meta deleted file mode 100644 index 7a31f4c4..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 6dea88d0219849a59da8909a14bd8628 -timeCreated: 1755032847 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Envelope.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Envelope.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Envelope.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Envelope.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Envelope.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Envelope.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Envelope.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Envelope.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/EnvelopeSignature.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/EnvelopeSignature.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/EnvelopeSignature.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/EnvelopeSignature.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/EnvelopeSignature.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SapientSignature.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SapientSignature.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SapientSignature.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SapientSignature.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SapientSignature.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Signature.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Signature.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Signature.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/Signature.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Signature.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SignedEnvelope.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SignedEnvelope.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SignedEnvelope.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SignedEnvelope.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SignedEnvelope.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SignedEnvelope.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Envelope/SignedEnvelope.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SignedEnvelope.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/FeeOptionService.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/FeeOptionService.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/FeeOptionService.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/FeeOptionService.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/FeeOptionService.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/TransactionService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs similarity index 71% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/TransactionService.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs index 54416caa..6116f7dc 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/TransactionService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs @@ -18,7 +18,7 @@ public TransactionService(SessionSigner[] sessionSigners, WalletState state) _state = state; } - public async Task SignAndBuild(Chain chain, Call[] calls, bool checkDeployed) + public async Task<(Address To, string Data)> SignAndBuild(Chain chain, Call[] calls, bool checkDeployed) { var preparedIncrement = PrepareIncrement(null, 0, null); if (preparedIncrement != null) @@ -35,36 +35,12 @@ public async Task SignAndBuild(Chain chain, Call[] calls, bool if (!checkDeployed || _state.IsDeployed) { - return new TransactionData - { - To = _state.Address, - Data = callsData - }; + return (_state.Address, callsData); } // Not relevant for signing calls for getting fee options // If the wallet was not yet deployed onchain, let's make a deploy transaction first - var deployTransaction = BuildDeployTransaction(); - return new TransactionData - { - To = new Address(_state.DeployContext.guestModule), - Data = new Calls(0, 0, new Call[] - { - new (deployTransaction.To, 0, deployTransaction.Data.HexStringToByteArray()), - new (_state.Address, 0, callsData.HexStringToByteArray()) - }).Encode().ByteArrayToHexStringWithPrefix() - }; - } - - private Call PrepareIncrement(Address wallet, BigInteger chainId, Calls calls) - { - // TODO: Integrate increments - return null; - } - - private TransactionData BuildDeployTransaction() - { var deployTransaction = Erc6492Helper.Deploy(_state.DeployHash, new Erc6492Helper.Context { creationCode = _state.DeployContext.walletCreationCode, @@ -72,12 +48,18 @@ private TransactionData BuildDeployTransaction() stage1 = _state.DeployContext.mainModule, stage2 = _state.DeployContext.mainModuleUpgradable }); - - return new TransactionData + + return (new Address(_state.DeployContext.guestModule), new Calls(0, 0, new Call[] { - To = new Address(deployTransaction.To), - Data = deployTransaction.Data - }; + new (deployTransaction.To, 0, deployTransaction.Data.HexStringToByteArray()), + new (_state.Address, 0, callsData.HexStringToByteArray()) + }).Encode().ByteArrayToHexStringWithPrefix()); + } + + private Call PrepareIncrement(Address wallet, BigInteger chainId, Calls calls) + { + // TODO: Integrate increments + return null; } private Envelope PrepareTransaction(Chain chain, Call[] calls) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/TransactionService.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/TransactionService.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs index ac771255..79459ce0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs @@ -23,7 +23,7 @@ public class Context public string creationCode; } - public static (string To, string Data) Deploy(string deployHash, Context context) + public static (Address To, string Data) Deploy(string deployHash, Context context) { var encoded = EncodeDeploy(context.stage1, deployHash); return (context.factory, encoded); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet.meta new file mode 100644 index 00000000..d8779a9d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 41fbacd2ebf540dc9b2a0d2a6d4d0d3b +timeCreated: 1755075475 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IWallet.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceWallet.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SessionSigner.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignatureService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignatureService.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignatureService.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignatureService.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignerService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignerService.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignerService.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Services/SignerService.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs.meta similarity index 100% rename from Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/WalletState.cs.meta rename to Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs.meta From 3267e1d07b6a884aa5b896279bc8b290be02eeeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 13 Aug 2025 23:07:41 +0200 Subject: [PATCH 143/165] unity version update to 2022 LTS, v3 demo updates --- .../Sequence/Samples~/Demo V3/DemoV3.unity | 13857 ++++++++++------ .../Prefabs/Common/MessagePopup.prefab | 13 +- .../EcosystemFeatureSelection.cs | 43 +- .../EcosystemWallet/EcosystemWalletProfile.cs | 106 +- .../EcosystemWalletTransactions.cs | 15 +- .../SequenceEcosystemWalletWindow.cs | 164 +- .../EcosystemWallet/SessionWalletTile.cs | 9 +- .../Authentication/SequenceConnect.cs | 2 +- .../Transactions/TransactionService.cs | 4 +- .../EcosystemWallet/Wallet/SequenceWallet.cs | 12 +- .../EcosystemWallet/Wallet/SessionSigner.cs | 43 +- .../Wallet/SignatureService.cs | 5 +- .../EcosystemWallet/Wallet/SignerService.cs | 5 + .../EcosystemWallet/Wallet/WalletState.cs | 2 +- .../Relayer/DataTypes/MetaTxnReceipt.cs | 2 + Packages/manifest.json | 13 +- Packages/packages-lock.json | 63 +- .../Settings.json | 2 - ProjectSettings/ProjectVersion.txt | 4 +- ProjectSettings/boot.config | 0 20 files changed, 8895 insertions(+), 5469 deletions(-) delete mode 100644 ProjectSettings/boot.config diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 9c1f5f6b..8539a989 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -38,7 +38,7 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.44657844, g: 0.49641258, b: 0.57481694, a: 1} + m_IndirectSpecularColor: {r: 0.44657844, g: 0.49641263, b: 0.57481724, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: @@ -104,7 +104,7 @@ NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: - serializedVersion: 2 + serializedVersion: 3 agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 @@ -117,89 +117,13 @@ NavMeshSettings: cellSize: 0.16666667 manualTileSize: 0 tileSize: 256 - accuratePlacement: 0 + buildHeightMesh: 0 maxJobWorkers: 0 preserveTilesOutsideBounds: 0 debug: m_Flags: 0 m_NavMeshData: {fileID: 0} ---- !u!1 &8597591 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8597592} - - component: {fileID: 8597594} - - component: {fileID: 8597593} - m_Layer: 5 - m_Name: Icon - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &8597592 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8597591} - 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: 906953579} - 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: 7, y: 7} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &8597593 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8597591} - 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: 27fce2dc15e7945c2acb7f911dd18eaa, 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 &8597594 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8597591} - m_CullTransparentMesh: 1 ---- !u!1 &11641990 +--- !u!1 &5817570 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -207,43 +131,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 11641991} - - component: {fileID: 11641993} - - component: {fileID: 11641992} + - component: {fileID: 5817571} + - component: {fileID: 5817573} + - component: {fileID: 5817572} m_Layer: 5 - m_Name: Text (TMP) + m_Name: TitleText m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &11641991 +--- !u!224 &5817571 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 11641990} + m_GameObject: {fileID: 5817570} 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: 1017792475} - m_RootOrder: 0 + m_Father: {fileID: 1865608230} 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: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -20} + m_SizeDelta: {x: 200, y: 20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &11641992 +--- !u!114 &5817572 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 11641990} + m_GameObject: {fileID: 5817570} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -257,10 +180,10 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Send Explicit Txn (Testnet) + m_text: Wallet Profile m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -284,14 +207,14 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 8 - m_fontSizeBase: 8 + m_fontSize: 10 + m_fontSizeBase: 10 m_fontWeight: 400 m_enableAutoSizing: 0 m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 1 - m_HorizontalAlignment: 1 + m_HorizontalAlignment: 2 m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 @@ -326,124 +249,15 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &11641993 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 11641990} - m_CullTransparentMesh: 1 ---- !u!1 &17360256 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 17360257} - - component: {fileID: 17360260} - - component: {fileID: 17360259} - - component: {fileID: 17360258} - m_Layer: 5 - m_Name: Template - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &17360257 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 17360256} - 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: 2100922580} - - {fileID: 1979708985} - m_Father: {fileID: 722266041} - 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 &17360258 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 17360256} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 873417223} - 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: 2100922580} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 1979708986} - m_HorizontalScrollbarVisibility: 0 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: 0 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &17360259 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 17360256} - 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.254717, g: 0.254717, b: 0.254717, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} - 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 &17360260 +--- !u!222 &5817573 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 17360256} + m_GameObject: {fileID: 5817570} m_CullTransparentMesh: 1 ---- !u!1 &28996670 +--- !u!1 &9715029 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -451,59 +265,58 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 28996671} - - component: {fileID: 28996675} - - component: {fileID: 28996674} - - component: {fileID: 28996673} - - component: {fileID: 28996672} + - component: {fileID: 9715030} + - component: {fileID: 9715034} + - component: {fileID: 9715033} + - component: {fileID: 9715032} + - component: {fileID: 9715031} m_Layer: 5 - m_Name: Button + m_Name: CloseButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &28996671 +--- !u!224 &9715030 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 28996670} + m_GameObject: {fileID: 9715029} 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: 1656381960} - m_Father: {fileID: 794886187} - m_RootOrder: 3 + - {fileID: 1030251669} + m_Father: {fileID: 1865608230} 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_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -25, y: -20} m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &28996672 +--- !u!114 &9715031 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 28996670} + m_GameObject: {fileID: 9715029} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} m_Name: m_EditorClassIdentifier: m_ShowMaskGraphic: 1 ---- !u!114 &28996673 +--- !u!114 &9715032 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 28996670} + m_GameObject: {fileID: 9715029} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} @@ -537,14 +350,13 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 28996674} + m_TargetGraphic: {fileID: 9715033} m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceBoilerplates - m_MethodName: AddExplicitSession + - m_Target: {fileID: 1865608231} + m_TargetAssemblyTypeName: Sequence.Boilerplates.EcosystemWalletProfile, SequenceBoilerplates + m_MethodName: Close m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} @@ -554,20 +366,20 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 ---- !u!114 &28996674 +--- !u!114 &9715033 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 28996670} + m_GameObject: {fileID: 9715029} 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.26666668, g: 0.06666667, b: 0.88235295, a: 1} + m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -584,15 +396,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &28996675 +--- !u!222 &9715034 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 28996670} + m_GameObject: {fileID: 9715029} m_CullTransparentMesh: 1 ---- !u!1 &48218463 +--- !u!1 &17360256 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -600,63 +412,170 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 48218464} - - component: {fileID: 48218466} - - component: {fileID: 48218465} + - component: {fileID: 17360257} + - component: {fileID: 17360260} + - component: {fileID: 17360259} + - component: {fileID: 17360258} m_Layer: 5 - m_Name: Item Label + m_Name: Template m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &48218464 + m_IsActive: 0 +--- !u!224 &17360257 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 48218463} + m_GameObject: {fileID: 17360256} 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: 2070597442} - m_RootOrder: 2 + m_Children: + - {fileID: 2100922580} + - {fileID: 1979708985} + m_Father: {fileID: 722266041} 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 &48218465 + 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 &17360258 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 48218463} + m_GameObject: {fileID: 17360256} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, 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: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] + m_Content: {fileID: 873417223} + 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: 2100922580} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1979708986} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &17360259 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 17360256} + 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.254717, g: 0.254717, b: 0.254717, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &17360260 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 17360256} + m_CullTransparentMesh: 1 +--- !u!1 &48218463 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 48218464} + - component: {fileID: 48218466} + - component: {fileID: 48218465} + 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 &48218464 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 48218463} + 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: 2070597442} + 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 &48218465 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 48218463} + 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: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] m_fontColor32: serializedVersion: 2 rgba: 4294967295 @@ -727,7 +646,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 48218463} m_CullTransparentMesh: 1 ---- !u!1 &90459729 +--- !u!1 &56928012 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -735,43 +654,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 90459730} - - component: {fileID: 90459732} - - component: {fileID: 90459731} + - component: {fileID: 56928013} + - component: {fileID: 56928015} + - component: {fileID: 56928014} m_Layer: 5 - m_Name: Text (TMP) + m_Name: Text (TMP) (3) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &90459730 +--- !u!224 &56928013 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 90459729} + m_GameObject: {fileID: 56928012} 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: 203863150} - m_RootOrder: 0 + m_Father: {fileID: 683925400} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 10, y: 0} - m_SizeDelta: {x: -40, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 210, y: 10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &90459731 +--- !u!114 &56928014 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 90459729} + m_GameObject: {fileID: 56928012} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -785,7 +703,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Use Mnemonic + m_text: Message signature m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -794,8 +712,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} + rgba: 4284900966 + m_fontColor: {r: 0.4, g: 0.4, b: 0.4, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -848,21 +766,21 @@ MonoBehaviour: m_VertexBufferAutoSizeReduction: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} + m_margin: {x: 2, 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 &90459732 +--- !u!222 &56928015 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 90459729} + m_GameObject: {fileID: 56928012} m_CullTransparentMesh: 1 ---- !u!1 &90679724 +--- !u!1 &89467940 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -870,97 +788,45 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 90679725} - - component: {fileID: 90679728} - - component: {fileID: 90679727} - - component: {fileID: 90679726} + - component: {fileID: 89467941} + - component: {fileID: 89467943} + - component: {fileID: 89467942} m_Layer: 5 - m_Name: Scrollbar + m_Name: Text m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &90679725 +--- !u!224 &89467941 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 90679724} + m_GameObject: {fileID: 89467940} 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: 1097154362} - m_Father: {fileID: 160974638} - m_RootOrder: 1 + m_Children: [] + m_Father: {fileID: 769043459} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} + m_AnchorMin: {x: 0, 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 &90679726 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 90679724} - 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: 1370557954} - m_HandleRect: {fileID: 1370557953} - m_Direction: 2 - m_Value: 0 - m_Size: 0.2 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &90679727 + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &89467942 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 90679724} + m_GameObject: {fileID: 89467940} 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} @@ -971,222 +837,84 @@ MonoBehaviour: 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 &90679728 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 90679724} - m_CullTransparentMesh: 1 ---- !u!1 &116513910 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 116513913} - - component: {fileID: 116513912} - - component: {fileID: 116513911} - 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 &116513911 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 116513910} - m_Enabled: 1 ---- !u!20 &116513912 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 116513910} - 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: + m_text: "\u200B" + 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 - 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: + 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 - 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 &116513913 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 116513910} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, 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 &130231370 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 130231371} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &130231371 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 130231370} - 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: 2070597442} - m_Father: {fileID: 974586687} - 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 &143763336 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 143763337} - - component: {fileID: 143763339} - - component: {fileID: 143763338} - 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 &143763337 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 143763336} - 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: 1492591166} - 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 &143763338 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 143763336} - 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 &143763339 + rgba: 4294967295 + m_fontSize: 8 + m_fontSizeBase: 8 + 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: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + 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 &89467943 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 143763336} + m_GameObject: {fileID: 89467940} m_CullTransparentMesh: 1 ---- !u!1 &157765780 +--- !u!1 &90459729 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1194,43 +922,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 157765781} - - component: {fileID: 157765783} - - component: {fileID: 157765782} + - component: {fileID: 90459730} + - component: {fileID: 90459732} + - component: {fileID: 90459731} m_Layer: 5 - m_Name: Label + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &157765781 +--- !u!224 &90459730 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 157765780} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 90459729} + 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: 191605878} - m_RootOrder: 0 + m_Father: {fileID: 203863150} 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_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: -40, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &157765782 +--- !u!114 &90459731 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 157765780} + m_GameObject: {fileID: 90459729} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -1238,13 +965,13 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: + m_text: Use Mnemonic m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -1289,7 +1016,7 @@ MonoBehaviour: m_charWidthMaxAdj: 0 m_enableWordWrapping: 1 m_wordWrappingRatios: 0.4 - m_overflowMode: 1 + m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 @@ -1313,15 +1040,15 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &157765783 +--- !u!222 &90459732 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 157765780} + m_GameObject: {fileID: 90459729} m_CullTransparentMesh: 1 ---- !u!1 &160243270 +--- !u!1 &108717376 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1329,75 +1056,133 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 160243271} - - component: {fileID: 160243273} - - component: {fileID: 160243272} + - component: {fileID: 108717377} + - component: {fileID: 108717379} + - component: {fileID: 108717378} m_Layer: 5 - m_Name: Background + m_Name: Description Text m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &160243271 +--- !u!224 &108717377 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 160243270} + m_GameObject: {fileID: 108717376} 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: 1299171964} - m_RootOrder: 0 + m_Father: {fileID: 1685000285} 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: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -27.5} + m_SizeDelta: {x: 220, y: 15.000001} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &160243272 +--- !u!114 &108717378 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 160243270} + m_GameObject: {fileID: 108717376} 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} - m_Color: {r: 0.12, g: 0.12, b: 0.12, 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: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} - 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 &160243273 + m_text: Send Transactions + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2583691263 + m_fontColor: {r: 1, g: 1, b: 1, a: 0.6} + 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: 8 + m_fontSizeBase: 8 + 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 &108717379 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 160243270} + m_GameObject: {fileID: 108717376} m_CullTransparentMesh: 1 ---- !u!1 &160974637 +--- !u!1 &116513910 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1405,108 +1190,127 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 160974638} - - component: {fileID: 160974641} - - component: {fileID: 160974640} - - component: {fileID: 160974639} - m_Layer: 5 - m_Name: Template - m_TagString: Untagged + - component: {fileID: 116513913} + - component: {fileID: 116513912} + - component: {fileID: 116513911} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &160974638 -RectTransform: + m_IsActive: 1 +--- !u!81 &116513911 +AudioListener: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 160974637} - 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: 1205415408} - - {fileID: 90679725} - m_Father: {fileID: 794886187} - 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 &160974639 -MonoBehaviour: + m_GameObject: {fileID: 116513910} + m_Enabled: 1 +--- !u!20 &116513912 +Camera: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 160974637} + m_GameObject: {fileID: 116513910} m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 1123123167} - 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: 1205415408} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 90679726} - m_HorizontalScrollbarVisibility: 0 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: 0 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &160974640 -MonoBehaviour: + 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_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + 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 &116513913 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 160974637} - 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.254717, g: 0.254717, b: 0.254717, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} - 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 &160974641 -CanvasRenderer: + m_GameObject: {fileID: 116513910} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &130231370 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 160974637} - m_CullTransparentMesh: 1 ---- !u!1 &161099257 + serializedVersion: 6 + m_Component: + - component: {fileID: 130231371} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &130231371 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 130231370} + 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: 2070597442} + m_Father: {fileID: 974586687} + 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 &157765780 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1514,46 +1318,179 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 161099258} - - component: {fileID: 161099260} - - component: {fileID: 161099259} + - component: {fileID: 157765781} + - component: {fileID: 157765783} + - component: {fileID: 157765782} m_Layer: 5 - m_Name: Handle + m_Name: Label m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &161099258 +--- !u!224 &157765781 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 161099257} + m_GameObject: {fileID: 157765780} 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: 1267233531} - m_RootOrder: 0 + m_Father: {fileID: 191605878} 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_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 &161099259 +--- !u!114 &157765782 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 161099257} + m_GameObject: {fileID: 157765780} 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} + 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: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 1 + 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 &157765783 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 157765780} + m_CullTransparentMesh: 1 +--- !u!1 &161099257 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 161099258} + - component: {fileID: 161099260} + - component: {fileID: 161099259} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &161099258 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161099257} + 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: 1267233531} + 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 &161099259 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161099257} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} @@ -1618,7 +1555,6 @@ RectTransform: - {fileID: 988110724} - {fileID: 317570298} m_Father: {fileID: 2198483992803733903} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -1765,12 +1701,11 @@ RectTransform: - {fileID: 90459730} - {fileID: 748463502} m_Father: {fileID: 4209220039127894524} - m_RootOrder: 7 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: 30} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 105, y: -220} + m_SizeDelta: {x: 210, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &203863151 MonoBehaviour: @@ -1880,7 +1815,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 203863149} m_CullTransparentMesh: 1 ---- !u!1 &220577104 +--- !u!1 &215461105 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1888,284 +1823,145 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 220577105} - - component: {fileID: 220577107} - - component: {fileID: 220577106} - - component: {fileID: 220577109} - - component: {fileID: 220577108} + - component: {fileID: 215461110} + - component: {fileID: 215461109} + - component: {fileID: 215461108} + - component: {fileID: 215461107} + - component: {fileID: 215461106} m_Layer: 5 - m_Name: WalletState + m_Name: SessionButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &220577105 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 220577104} - 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: 1984812366} - - {fileID: 1299171964} - - {fileID: 717198282} - - {fileID: 1009042193} - - {fileID: 1678482373} - - {fileID: 794886187} - - {fileID: 1199799818} - - {fileID: 1972349263} - - {fileID: 541267863} - - {fileID: 1151746261} - - {fileID: 1017792475} - - {fileID: 791456579} - m_Father: {fileID: 2198483992803733903} - m_RootOrder: 5 - 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: -40} - m_SizeDelta: {x: -30, y: -55} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &220577106 +--- !u!114 &215461106 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 220577104} + m_GameObject: {fileID: 215461105} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} m_Name: m_EditorClassIdentifier: - m_HorizontalFit: 0 - m_VerticalFit: 0 ---- !u!114 &220577107 + m_ShowMaskGraphic: 1 +--- !u!114 &215461107 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 220577104} + m_GameObject: {fileID: 215461105} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 1 - m_Spacing: 5 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 0 - m_ChildControlWidth: 1 - m_ChildControlHeight: 0 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 ---- !u!114 &220577108 + 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: 215461108} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1242786028} + m_TargetAssemblyTypeName: Sequence.Boilerplates.TransactionButton, SequenceBoilerplates + m_MethodName: AddSession + 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 &215461108 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 220577104} + m_GameObject: {fileID: 215461105} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: eb6fa7d82312143d9b451ac5e7465a38, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: - _start: 0.7 - _duration: 0.3 - _animationCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 2 - outSlope: 2 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 0.77346337 - value: 1.1153979 - inSlope: -0.25566182 - outSlope: -0.25566182 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.7318018 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: -0.17961398 - outSlope: -0.17961398 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.6227655 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 ---- !u!225 &220577109 -CanvasGroup: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 220577104} - m_Enabled: 1 - m_Alpha: 1 - m_Interactable: 1 - m_BlocksRaycasts: 1 - m_IgnoreParentGroups: 0 ---- !u!1 &236621038 -GameObject: + m_Material: {fileID: 0} + m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &215461109 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 236621039} - - component: {fileID: 236621041} - - component: {fileID: 236621040} - m_Layer: 5 - m_Name: Text (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &236621039 + m_GameObject: {fileID: 215461105} + m_CullTransparentMesh: 1 +--- !u!224 &215461110 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 236621038} + m_GameObject: {fileID: 215461105} 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: 1151746261} - m_RootOrder: 0 + m_Children: + - {fileID: 1235258472} + m_Father: {fileID: 1242786027} 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: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &236621040 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 236621038} - 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: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Send Implicit Txn (Testnet) - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - 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 &236621041 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 236621038} - m_CullTransparentMesh: 1 + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -10, y: 0} + m_SizeDelta: {x: 60, y: 20} + m_Pivot: {x: 1, y: 0.5} --- !u!1 &317570297 GameObject: m_ObjectHideFlags: 0 @@ -2200,7 +1996,6 @@ RectTransform: m_Children: - {fileID: 1016496429} m_Father: {fileID: 191605878} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -2315,7 +2110,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 317570297} m_CullTransparentMesh: 1 ---- !u!1 &390971674 +--- !u!1 &319937703 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2323,210 +2118,217 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 390971675} - - component: {fileID: 390971677} - - component: {fileID: 390971676} + - component: {fileID: 319937704} m_Layer: 5 - m_Name: Item Label + m_Name: SignatureLabel m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &390971675 +--- !u!224 &319937704 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 390971674} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 319937703} + 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: 1303578556} - m_RootOrder: 2 + m_Children: + - {fileID: 2145386560} + - {fileID: 1477743772} + - {fileID: 491498808} + m_Father: {fileID: 683925400} 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_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 210, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &390971676 +--- !u!1 &323220475 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 323220476} + - component: {fileID: 323220482} + - component: {fileID: 323220481} + - component: {fileID: 323220480} + - component: {fileID: 323220479} + - component: {fileID: 323220478} + - component: {fileID: 323220477} + m_Layer: 5 + m_Name: FeatureSelection + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &323220476 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 323220475} + 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: 5014169504580503363} + - {fileID: 1685000285} + m_Father: {fileID: 1050865742} + 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: 270, y: 115} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &323220477 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 390971674} + m_GameObject: {fileID: 323220475} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Script: {fileID: 11500000, guid: eb6fa7d82312143d9b451ac5e7465a38, type: 3} + m_Name: + m_EditorClassIdentifier: + _start: 0.7 + _duration: 0.3 + _animationCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 2 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.77346337 + value: 1.1153979 + inSlope: -0.25566182 + outSlope: -0.25566182 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.7318018 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: -0.17961398 + outSlope: -0.17961398 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.6227655 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!225 &323220478 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 323220475} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &323220479 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 323220475} + 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_Color: {r: 0, g: 0, b: 0, 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: 3b399a2d8fd4949958a248da594a7b27, 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: 0 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - 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: 1 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &390971677 + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &323220480 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 390971674} + m_GameObject: {fileID: 323220475} m_CullTransparentMesh: 1 ---- !u!1 &400068441 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 400068442} - - component: {fileID: 400068444} - - component: {fileID: 400068443} - m_Layer: 5 - m_Name: Arrow - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &400068442 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 400068441} - 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: 191605878} - 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 &400068443 +--- !u!114 &323220481 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 400068441} + m_GameObject: {fileID: 323220475} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, 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 &400068444 -CanvasRenderer: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!114 &323220482 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 400068441} - m_CullTransparentMesh: 1 ---- !u!1 &409830142 + m_GameObject: {fileID: 323220475} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 15 + m_Right: 15 + m_Top: 15 + m_Bottom: 15 + m_ChildAlignment: 4 + m_Spacing: 5 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &330825194 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2534,77 +2336,37 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 409830143} - - component: {fileID: 409830145} - - component: {fileID: 409830144} + - component: {fileID: 330825195} m_Layer: 5 - m_Name: Content + m_Name: WalletLabel m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &409830143 +--- !u!224 &330825195 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 409830142} + m_GameObject: {fileID: 330825194} 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: 1396476262} - m_RootOrder: 0 + m_Children: + - {fileID: 874185235} + - {fileID: 1407445814} + - {fileID: 1545678474} + m_Father: {fileID: 683925400} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - 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: 0, y: 0} - m_Pivot: {x: 0, y: 1} ---- !u!114 &409830144 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 409830142} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 2 - m_Right: 2 - m_Top: 2 - m_Bottom: 2 - m_ChildAlignment: 0 - m_Spacing: 2 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 1 - m_ChildControlWidth: 1 - m_ChildControlHeight: 0 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 ---- !u!114 &409830145 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 409830142} - 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 &448961315 + m_SizeDelta: {x: 210, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &390971674 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2612,43 +2374,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 448961316} - - component: {fileID: 448961318} - - component: {fileID: 448961317} + - component: {fileID: 390971675} + - component: {fileID: 390971677} + - component: {fileID: 390971676} m_Layer: 5 - m_Name: Label + m_Name: Item Label m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &448961316 +--- !u!224 &390971675 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 448961315} + m_GameObject: {fileID: 390971674} 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: 722266041} - m_RootOrder: 0 + m_Father: {fileID: 1303578556} 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_AnchoredPosition: {x: 5, y: -0.5} + m_SizeDelta: {x: -30, y: -3} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &448961317 +--- !u!114 &390971676 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 448961315} + m_GameObject: {fileID: 390971674} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -2662,10 +2423,10 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: None + m_text: Option A m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -2684,7 +2445,7 @@ MonoBehaviour: m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 + m_TextStyleHashCode: 0 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 @@ -2728,18 +2489,18 @@ MonoBehaviour: m_margin: {x: 0, y: 0, z: 0, w: 0} m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 + m_hasFontAssetChanged: 1 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &448961318 +--- !u!222 &390971677 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 448961315} + m_GameObject: {fileID: 390971674} m_CullTransparentMesh: 1 ---- !u!1 &453938997 +--- !u!1 &391644458 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2747,80 +2508,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 453938998} + - component: {fileID: 391644459} + - component: {fileID: 391644461} + - component: {fileID: 391644460} m_Layer: 5 - m_Name: Sliding Area + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &453938998 +--- !u!224 &391644459 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 453938997} + m_GameObject: {fileID: 391644458} 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: 504017413} - m_Father: {fileID: 1918409864} - m_RootOrder: 0 + m_Children: [] + m_Father: {fileID: 1853883866} 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_SizeDelta: {x: -10, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &455107485 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 455107486} - - component: {fileID: 455107488} - - component: {fileID: 455107487} - m_Layer: 5 - m_Name: Text (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &455107486 -RectTransform: +--- !u!114 &391644460 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 455107485} - 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: 1972349263} - 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: -10, y: 0} - m_SizeDelta: {x: -40, y: -20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &455107487 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 455107485} + m_GameObject: {fileID: 391644458} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -2834,7 +2557,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: + m_text: Add Session m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -2867,9 +2590,9 @@ MonoBehaviour: m_enableAutoSizing: 0 m_fontSizeMin: 18 m_fontSizeMax: 72 - m_fontStyle: 1 + m_fontStyle: 0 m_HorizontalAlignment: 2 - m_VerticalAlignment: 256 + m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 m_wordSpacing: 0 @@ -2877,9 +2600,9 @@ MonoBehaviour: m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_enableWordWrapping: 1 m_wordWrappingRatios: 0.4 - m_overflowMode: 1 + m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 @@ -2903,15 +2626,15 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &455107488 +--- !u!222 &391644461 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 455107485} + m_GameObject: {fileID: 391644458} m_CullTransparentMesh: 1 ---- !u!1 &456472303 +--- !u!1 &400068441 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -2919,43 +2642,117 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 456472304} - - component: {fileID: 456472306} - - component: {fileID: 456472305} + - component: {fileID: 400068442} + - component: {fileID: 400068444} + - component: {fileID: 400068443} m_Layer: 5 - m_Name: Text (TMP) + m_Name: Arrow m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &456472304 +--- !u!224 &400068442 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 456472303} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 400068441} + 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: 191605878} + 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 &400068443 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 400068441} + 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 &400068444 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 400068441} + m_CullTransparentMesh: 1 +--- !u!1 &448961315 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 448961316} + - component: {fileID: 448961318} + - component: {fileID: 448961317} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &448961316 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 448961315} + 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: 791456579} - m_RootOrder: 0 + m_Father: {fileID: 722266041} 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: 0} + m_AnchoredPosition: {x: -7.5, y: -0.5} + m_SizeDelta: {x: -35, y: -13} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &456472305 +--- !u!114 &448961317 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 456472303} + m_GameObject: {fileID: 448961315} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -2963,13 +2760,13 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 + m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Send Explicit Txn (with USDC fee) + m_text: None m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -3038,14 +2835,137 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &456472306 +--- !u!222 &448961318 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 456472303} + m_GameObject: {fileID: 448961315} m_CullTransparentMesh: 1 +--- !u!1001 &456269665 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1865608230} + m_Modifications: + - target: {fileID: 3094631411173026328, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_Name + value: LoadingScreen + objectReference: {fileID: 0} + - target: {fileID: 3094631411173026328, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_RootOrder + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_ConstrainProportionsScale + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8590561263955264044, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + propertyPath: m_ConstrainProportionsScale + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 21aa1af318f304faca1367525db9bc28, type: 3} +--- !u!224 &456269666 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + m_PrefabInstance: {fileID: 456269665} + m_PrefabAsset: {fileID: 0} +--- !u!1 &456269667 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 3094631411173026328, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + m_PrefabInstance: {fileID: 456269665} + m_PrefabAsset: {fileID: 0} --- !u!1 &467585875 GameObject: m_ObjectHideFlags: 0 @@ -3077,12 +2997,11 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4209220039127894524} - 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: 10} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 105, y: -55} + m_SizeDelta: {x: 210, y: 10} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &467585877 MonoBehaviour: @@ -3181,7 +3100,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 467585875} m_CullTransparentMesh: 1 ---- !u!1 &504017412 +--- !u!1 &485743480 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3189,75 +3108,146 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 504017413} - - component: {fileID: 504017415} - - component: {fileID: 504017414} + - component: {fileID: 485743481} + - component: {fileID: 485743485} + - component: {fileID: 485743484} + - component: {fileID: 485743483} + - component: {fileID: 485743482} m_Layer: 5 - m_Name: Handle + m_Name: Button m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &504017413 +--- !u!224 &485743481 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 504017412} + m_GameObject: {fileID: 485743480} 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: 453938998} - m_RootOrder: 0 + m_Children: + - {fileID: 1993833655} + m_Father: {fileID: 805083868} 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_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 &504017414 +--- !u!114 &485743482 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 504017412} + m_GameObject: {fileID: 485743480} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, 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_ShowMaskGraphic: 1 +--- !u!114 &485743483 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 485743480} + 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: 485743484} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1865608231} + m_TargetAssemblyTypeName: Sequence.Boilerplates.EcosystemWalletProfile, SequenceBoilerplates + m_MethodName: SignMessage + 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 &485743484 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 485743480} + 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.26666668, g: 0.06666667, b: 0.88235295, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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 &504017415 +--- !u!222 &485743485 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 504017412} + m_GameObject: {fileID: 485743480} m_CullTransparentMesh: 1 ---- !u!1 &512459740 +--- !u!1 &491498807 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3265,60 +3255,58 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 512459741} - - component: {fileID: 512459745} - - component: {fileID: 512459744} - - component: {fileID: 512459743} - - component: {fileID: 512459742} + - component: {fileID: 491498808} + - component: {fileID: 491498812} + - component: {fileID: 491498811} + - component: {fileID: 491498810} + - component: {fileID: 491498809} m_Layer: 5 - m_Name: PasskeyButton + m_Name: CopyButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &512459741 +--- !u!224 &491498808 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 512459740} + m_GameObject: {fileID: 491498807} 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: 960124013} - - {fileID: 1883453221} - m_Father: {fileID: 4209220039127894524} - m_RootOrder: 6 + - {fileID: 745017019} + m_Father: {fileID: 319937704} 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: 30} + 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 &512459742 +--- !u!114 &491498809 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 512459740} + m_GameObject: {fileID: 491498807} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} m_Name: m_EditorClassIdentifier: m_ShowMaskGraphic: 1 ---- !u!114 &512459743 +--- !u!114 &491498810 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 512459740} + m_GameObject: {fileID: 491498807} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} @@ -3337,7 +3325,7 @@ MonoBehaviour: 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.8509804} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} m_ColorMultiplier: 1 m_FadeDuration: 0.1 m_SpriteState: @@ -3351,15 +3339,15 @@ MonoBehaviour: m_PressedTrigger: Pressed m_SelectedTrigger: Selected m_DisabledTrigger: Disabled - m_Interactable: 0 - m_TargetGraphic: {fileID: 512459744} + m_Interactable: 1 + m_TargetGraphic: {fileID: 491498811} m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 9144345594371459776} + - m_Target: {fileID: 1865608229} m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, SequenceExamples - m_MethodName: SignInWithPasskey + m_MethodName: m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} @@ -3369,27 +3357,27 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 ---- !u!114 &512459744 +--- !u!114 &491498811 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 512459740} + m_GameObject: {fileID: 491498807} 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.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 0.19, g: 0.19, b: 0.19, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Sprite: {fileID: 21300000, guid: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} m_Type: 1 m_PreserveAspect: 1 m_FillCenter: 1 @@ -3399,15 +3387,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &512459745 +--- !u!222 &491498812 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 512459740} + m_GameObject: {fileID: 491498807} m_CullTransparentMesh: 1 ---- !u!1 &541267862 +--- !u!1 &512459740 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3415,65 +3403,62 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 541267863} - - component: {fileID: 541267867} - - component: {fileID: 541267866} - - component: {fileID: 541267865} - - component: {fileID: 541267864} + - component: {fileID: 512459741} + - component: {fileID: 512459745} + - component: {fileID: 512459744} + - component: {fileID: 512459743} + - component: {fileID: 512459742} m_Layer: 5 - m_Name: MessageInput + m_Name: PasskeyButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &541267863 +--- !u!224 &512459741 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 541267862} + m_GameObject: {fileID: 512459740} 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: 1987947400} - - {fileID: 893155973} - m_Father: {fileID: 220577105} - m_RootOrder: 8 + - {fileID: 960124013} + - {fileID: 1883453221} + m_Father: {fileID: 4209220039127894524} 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: 30} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 105, y: -185} + m_SizeDelta: {x: 210, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &541267864 +--- !u!114 &512459742 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 541267862} + m_GameObject: {fileID: 512459740} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} m_Name: m_EditorClassIdentifier: - m_EffectColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} - m_EffectDistance: {x: 1, y: -1} - m_UseGraphicAlpha: 1 ---- !u!114 &541267865 + m_ShowMaskGraphic: 1 +--- !u!114 &512459743 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 541267862} + m_GameObject: {fileID: 512459740} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: m_Navigation: @@ -3489,7 +3474,7 @@ MonoBehaviour: 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_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.8509804} m_ColorMultiplier: 1 m_FadeDuration: 0.1 m_SpriteState: @@ -3503,79 +3488,38 @@ MonoBehaviour: m_PressedTrigger: Pressed m_SelectedTrigger: Selected m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 541267866} - m_TextViewport: {fileID: 1987947400} - m_TextComponent: {fileID: 1158876113} - m_Placeholder: {fileID: 1035093049} - m_VerticalScrollbar: {fileID: 0} - m_VerticalScrollbarEventHandler: {fileID: 0} - m_LayoutGroup: {fileID: 0} - m_ScrollSensitivity: 1 - m_ContentType: 0 - m_InputType: 0 - m_AsteriskChar: 42 - m_KeyboardType: 0 - m_LineType: 0 - m_HideMobileInput: 0 - m_HideSoftKeyboard: 0 - m_CharacterValidation: 0 - m_RegexValue: - m_GlobalPointSize: 14 - m_CharacterLimit: 0 - m_OnEndEdit: - m_PersistentCalls: - m_Calls: [] - m_OnSubmit: - m_PersistentCalls: - m_Calls: [] - m_OnSelect: - m_PersistentCalls: - m_Calls: [] - m_OnDeselect: - m_PersistentCalls: - m_Calls: [] - m_OnTextSelection: - m_PersistentCalls: - m_Calls: [] - m_OnEndTextSelection: - m_PersistentCalls: - m_Calls: [] - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_OnTouchScreenKeyboardStatusChanged: + m_Interactable: 0 + m_TargetGraphic: {fileID: 512459744} + m_OnClick: m_PersistentCalls: - m_Calls: [] - m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_CustomCaretColor: 0 - m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} - m_Text: - m_CaretBlinkRate: 0.85 - m_CaretWidth: 1 - m_ReadOnly: 0 - m_RichText: 1 - m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_OnFocusSelectAll: 1 - m_ResetOnDeActivation: 1 - m_RestoreOriginalTextOnEscape: 1 - m_isRichTextEditingAllowed: 0 - m_LineLimit: 0 - m_InputValidator: {fileID: 0} ---- !u!114 &541267866 + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignInWithPasskey + 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 &512459744 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 541267862} + m_GameObject: {fileID: 512459740} 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: 1} + m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -3584,7 +3528,7 @@ MonoBehaviour: m_Calls: [] m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} m_Type: 1 - m_PreserveAspect: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -3592,15 +3536,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &541267867 +--- !u!222 &512459745 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 541267862} + m_GameObject: {fileID: 512459740} m_CullTransparentMesh: 1 ---- !u!1 &559540155 +--- !u!1 &545395821 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3608,43 +3552,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 559540156} - - component: {fileID: 559540158} - - component: {fileID: 559540157} + - component: {fileID: 545395822} + - component: {fileID: 545395824} + - component: {fileID: 545395823} m_Layer: 5 - m_Name: Label + m_Name: Description Text m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &559540156 +--- !u!224 &545395822 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 559540155} + m_GameObject: {fileID: 545395821} 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: 794886187} - m_RootOrder: 0 + m_Father: {fileID: 2097849100} 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_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 115, y: 3.5} + m_SizeDelta: {x: 210, y: -7} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &559540157 +--- !u!114 &545395823 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 559540155} + m_GameObject: {fileID: 545395821} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -3658,7 +3601,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Unrestrictive + m_text: Wallet Profile m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -3667,8 +3610,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} + rgba: 2583691263 + m_fontColor: {r: 1, g: 1, b: 1, a: 0.6} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -3686,12 +3629,12 @@ MonoBehaviour: serializedVersion: 2 rgba: 4294967295 m_fontSize: 8 - m_fontSizeBase: 8 + m_fontSizeBase: 10 m_fontWeight: 400 m_enableAutoSizing: 0 m_fontSizeMin: 18 m_fontSizeMax: 72 - m_fontStyle: 1 + m_fontStyle: 0 m_HorizontalAlignment: 1 m_VerticalAlignment: 512 m_textAlignment: 65535 @@ -3727,15 +3670,15 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &559540158 +--- !u!222 &545395824 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 559540155} + m_GameObject: {fileID: 545395821} m_CullTransparentMesh: 1 ---- !u!1 &628532634 +--- !u!1 &564597529 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3743,29 +3686,119 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 628532637} - - component: {fileID: 628532636} - - component: {fileID: 628532635} - m_Layer: 0 - m_Name: EventSystem + - component: {fileID: 564597530} + - component: {fileID: 564597533} + - component: {fileID: 564597532} + - component: {fileID: 564597531} + m_Layer: 5 + m_Name: Viewport m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &628532635 -MonoBehaviour: +--- !u!224 &564597530 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 628532634} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} - m_Name: - m_EditorClassIdentifier: - m_SendPointerHoverToParent: 1 + m_GameObject: {fileID: 564597529} + 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: 1697771492} + m_Father: {fileID: 1757522697} + 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: 1} +--- !u!114 &564597531 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 564597529} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &564597532 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 564597529} + 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.06666667, g: 0.06666667, b: 0.06666667, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &564597533 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 564597529} + m_CullTransparentMesh: 1 +--- !u!1 &628532634 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 628532637} + - component: {fileID: 628532636} + - component: {fileID: 628532635} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &628532635 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 628532634} + 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 @@ -3795,15 +3828,15 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 628532634} + serializedVersion: 2 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} ---- !u!1 &629025366 +--- !u!1 &659355501 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3811,58 +3844,129 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 629025367} - - component: {fileID: 629025369} - - component: {fileID: 629025368} + - component: {fileID: 659355502} + - component: {fileID: 659355506} + - component: {fileID: 659355505} + - component: {fileID: 659355504} + - component: {fileID: 659355503} m_Layer: 5 - m_Name: Image (1) + m_Name: SendButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &629025367 +--- !u!224 &659355502 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 629025366} + m_GameObject: {fileID: 659355501} 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: 2082724705} - m_RootOrder: 0 + m_Children: + - {fileID: 2030306415} + m_Father: {fileID: 696230464} 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: 7, y: 7} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &629025368 + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -10, y: 0} + m_SizeDelta: {x: 60, y: 20} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &659355503 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 659355501} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &659355504 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 659355501} + 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: 659355505} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 696230465} + m_TargetAssemblyTypeName: Sequence.Boilerplates.TransactionButton, SequenceBoilerplates + m_MethodName: SendTransaction + 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 &659355505 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 629025366} + m_GameObject: {fileID: 659355501} 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_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, 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: 7eeaa0f6357c9474abdf30939e119719, type: 3} - m_Type: 0 + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 @@ -3871,15 +3975,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &629025369 +--- !u!222 &659355506 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 629025366} + m_GameObject: {fileID: 659355501} m_CullTransparentMesh: 1 ---- !u!1 &687704959 +--- !u!1 &683925399 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3887,75 +3991,83 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 687704960} - - component: {fileID: 687704962} - - component: {fileID: 687704961} + - component: {fileID: 683925400} + - component: {fileID: 683925401} + - component: {fileID: 683925402} m_Layer: 5 - m_Name: Image (1) + m_Name: Layout m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &687704960 +--- !u!224 &683925400 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 687704959} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 683925399} + 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: 755374150} - m_RootOrder: 0 + m_Children: + - {fileID: 1186454644} + - {fileID: 330825195} + - {fileID: 689232700} + - {fileID: 1757522697} + - {fileID: 56928013} + - {fileID: 805083868} + - {fileID: 319937704} + m_Father: {fileID: 1865608230} 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: 7, y: 7} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &687704961 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -40} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &683925401 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 687704959} + m_GameObject: {fileID: 683925399} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, 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: 7eeaa0f6357c9474abdf30939e119719, 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 &687704962 -CanvasRenderer: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 4 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &683925402 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 687704959} - m_CullTransparentMesh: 1 ---- !u!1 &717198281 + m_GameObject: {fileID: 683925399} + 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 &689232699 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3963,43 +4075,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 717198282} - - component: {fileID: 717198284} - - component: {fileID: 717198283} + - component: {fileID: 689232700} + - component: {fileID: 689232702} + - component: {fileID: 689232701} m_Layer: 5 - m_Name: Text (TMP) (3) + m_Name: Text (TMP) (2) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &717198282 +--- !u!224 &689232700 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 717198281} + m_GameObject: {fileID: 689232699} 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: 220577105} - m_RootOrder: 2 + m_Father: {fileID: 683925400} 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: 10} + m_SizeDelta: {x: 210, y: 10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &717198283 +--- !u!114 &689232701 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 717198281} + m_GameObject: {fileID: 689232699} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -4082,15 +4193,15 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &717198284 +--- !u!222 &689232702 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 717198281} + m_GameObject: {fileID: 689232699} m_CullTransparentMesh: 1 ---- !u!1 &722266040 +--- !u!1 &696230463 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4098,127 +4209,74 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 722266041} - - component: {fileID: 722266044} - - component: {fileID: 722266043} - - component: {fileID: 722266042} + - component: {fileID: 696230464} + - component: {fileID: 696230467} + - component: {fileID: 696230466} + - component: {fileID: 696230465} m_Layer: 5 - m_Name: SessionDropdown + m_Name: ExplicitEmitWithFeeButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &722266041 +--- !u!224 &696230464 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 722266040} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 696230463} + 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: 448961316} - - {fileID: 1423156422} - - {fileID: 17360257} - m_Father: {fileID: 4209220039127894524} - m_RootOrder: 1 + - {fileID: 699969410} + - {fileID: 1762646611} + - {fileID: 1329197019} + - {fileID: 659355502} + - {fileID: 1870792378} + m_Father: {fileID: 1146219656} 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: 30} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 130, y: -150} + m_SizeDelta: {x: 230, y: 40} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &722266042 +--- !u!114 &696230465 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 722266040} + m_GameObject: {fileID: 696230463} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} + m_Script: {fileID: 11500000, guid: 5fa388a969190426facba008de2b8c43, 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: 722266043} - m_Template: {fileID: 17360257} - m_CaptionText: {fileID: 448961317} - m_CaptionImage: {fileID: 0} - m_Placeholder: {fileID: 0} - m_ItemText: {fileID: 390971676} - m_ItemImage: {fileID: 0} - m_Value: 0 - m_Options: - m_Options: - - m_Text: None - m_Image: {fileID: 0} - - m_Text: Unrestrictive - m_Image: {fileID: 0} - - m_Text: Basic Restrictive - m_Image: {fileID: 0} - m_OnValueChanged: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceBoilerplates - m_MethodName: OnImplicitSessionTypeChanged - m_Mode: 0 - 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 - m_AlphaFadeSpeed: 0.15 ---- !u!114 &722266043 + _chain: 10 + _transaction: + k__BackingField: 0x33985d320809E26274a72E03268c8a29927Bc6dA + k__BackingField: explicitEmit() + _loadingObject: {fileID: 1870792377} + _sessionButtonObject: {fileID: 1329197014} + _transactionButtonObject: {fileID: 659355501} +--- !u!114 &696230466 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 722266040} + m_GameObject: {fileID: 696230463} 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.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -4234,16 +4292,16 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &722266044 + m_PixelsPerUnitMultiplier: 2 +--- !u!222 &696230467 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 722266040} + m_GameObject: {fileID: 696230463} m_CullTransparentMesh: 1 ---- !u!1 &748463501 +--- !u!1 &699969409 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4251,46 +4309,45 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 748463502} - - component: {fileID: 748463504} - - component: {fileID: 748463503} + - component: {fileID: 699969410} + - component: {fileID: 699969412} + - component: {fileID: 699969411} m_Layer: 5 - m_Name: Image (1) + m_Name: Title Text m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &748463502 +--- !u!224 &699969410 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748463501} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 699969409} + 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: 203863150} - m_RootOrder: 1 + m_Father: {fileID: 696230464} 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: 15, y: 0} - m_SizeDelta: {x: 10, y: 10} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 115, y: -3.5} + m_SizeDelta: {x: 210, y: -7} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &748463503 +--- !u!114 &699969411 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748463501} + m_GameObject: {fileID: 699969409} 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} @@ -4301,25 +4358,84 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 7587ac7b3e6c1471ca5ab6307ab32ec5, 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 &748463504 + m_text: Wallet Profile + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 10 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &699969412 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748463501} + m_GameObject: {fileID: 699969409} m_CullTransparentMesh: 1 ---- !u!1 &755374149 +--- !u!1 &722266040 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4327,62 +4443,49 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 755374150} - - component: {fileID: 755374154} - - component: {fileID: 755374153} - - component: {fileID: 755374152} - - component: {fileID: 755374151} + - component: {fileID: 722266041} + - component: {fileID: 722266044} + - component: {fileID: 722266043} + - component: {fileID: 722266042} m_Layer: 5 - m_Name: CopyButton + m_Name: SessionDropdown m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &755374150 +--- !u!224 &722266041 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 755374149} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 722266040} + 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: 687704960} - m_Father: {fileID: 1299171964} - m_RootOrder: 2 + - {fileID: 448961316} + - {fileID: 1423156422} + - {fileID: 17360257} + m_Father: {fileID: 4209220039127894524} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 105, y: -30} + m_SizeDelta: {x: 210, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &755374151 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 755374149} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &755374152 +--- !u!114 &722266042 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 755374149} + m_GameObject: {fileID: 722266040} 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: m_Navigation: @@ -4413,15 +4516,30 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 755374153} - m_OnClick: + m_TargetGraphic: {fileID: 722266043} + m_Template: {fileID: 17360257} + m_CaptionText: {fileID: 448961317} + m_CaptionImage: {fileID: 0} + m_Placeholder: {fileID: 0} + m_ItemText: {fileID: 390971676} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: + - m_Text: None + m_Image: {fileID: 0} + - m_Text: Unrestrictive + m_Image: {fileID: 0} + - m_Text: Basic Restrictive + m_Image: {fileID: 0} + m_OnValueChanged: m_PersistentCalls: m_Calls: - m_Target: {fileID: 9144345594371459776} m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, SequenceBoilerplates - m_MethodName: CopyWalletAddress - m_Mode: 1 + m_MethodName: OnImplicitSessionTypeChanged + m_Mode: 0 m_Arguments: m_ObjectArgument: {fileID: 0} m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine @@ -4430,29 +4548,30 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 ---- !u!114 &755374153 + m_AlphaFadeSpeed: 0.15 +--- !u!114 &722266043 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 755374149} + m_GameObject: {fileID: 722266040} 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.19, g: 0.19, b: 0.19, a: 1} + m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} m_Type: 1 - m_PreserveAspect: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -4460,15 +4579,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &755374154 +--- !u!222 &722266044 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 755374149} + m_GameObject: {fileID: 722266040} m_CullTransparentMesh: 1 ---- !u!1 &791456578 +--- !u!1 &745017018 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4476,131 +4595,132 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 791456579} - - component: {fileID: 791456583} - - component: {fileID: 791456582} - - component: {fileID: 791456581} - - component: {fileID: 791456580} + - component: {fileID: 745017019} + - component: {fileID: 745017021} + - component: {fileID: 745017020} m_Layer: 5 - m_Name: SendExplicitTransactionWithFee + m_Name: Image (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &791456579 +--- !u!224 &745017019 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 791456578} + m_GameObject: {fileID: 745017018} 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: 456472304} - m_Father: {fileID: 220577105} - m_RootOrder: 11 + m_Children: [] + m_Father: {fileID: 491498808} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 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: 0, y: 30} + m_SizeDelta: {x: 7, y: 7} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &791456580 +--- !u!114 &745017020 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 791456578} + m_GameObject: {fileID: 745017018} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &791456581 -MonoBehaviour: + 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: 7eeaa0f6357c9474abdf30939e119719, 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 &745017021 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 791456578} - 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: 791456582} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceBoilerplates - m_MethodName: SendExplicitTransactionWithUsdc - 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 &791456582 + m_GameObject: {fileID: 745017018} + m_CullTransparentMesh: 1 +--- !u!1 &748463501 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 748463502} + - component: {fileID: 748463504} + - component: {fileID: 748463503} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &748463502 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 748463501} + 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: 203863150} + 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: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &748463503 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 791456578} + m_GameObject: {fileID: 748463501} 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.19215687, g: 0.19215687, b: 0.19215687, 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: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 + m_Sprite: {fileID: 21300000, guid: 7587ac7b3e6c1471ca5ab6307ab32ec5, type: 3} + m_Type: 0 m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 @@ -4609,15 +4729,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &791456583 +--- !u!222 &748463504 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 791456578} + m_GameObject: {fileID: 748463501} m_CullTransparentMesh: 1 ---- !u!1 &794886186 +--- !u!1 &769043458 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4625,128 +4745,116 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 794886187} - - component: {fileID: 794886190} - - component: {fileID: 794886189} - - component: {fileID: 794886188} + - component: {fileID: 769043459} + - component: {fileID: 769043460} m_Layer: 5 - m_Name: SessionDropdown + m_Name: Text Area m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &794886187 +--- !u!224 &769043459 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 794886186} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 769043458} + 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: 559540156} - - {fileID: 1746889450} - - {fileID: 160974638} - - {fileID: 28996671} - m_Father: {fileID: 220577105} - m_RootOrder: 5 + - {fileID: 1621712494} + - {fileID: 89467941} + m_Father: {fileID: 805083868} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 30} + m_SizeDelta: {x: -20, y: -10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &794886188 +--- !u!114 &769043460 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 794886186} + m_GameObject: {fileID: 769043458} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, 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: 794886189} - m_Template: {fileID: 160974638} - m_CaptionText: {fileID: 559540157} - m_CaptionImage: {fileID: 0} - m_Placeholder: {fileID: 0} - m_ItemText: {fileID: 1359569577} - m_ItemImage: {fileID: 0} - m_Value: 0 - m_Options: - m_Options: - - m_Text: Unrestrictive - m_Image: {fileID: 0} - - m_Text: Unrestrictive (USDC) - m_Image: {fileID: 0} - - m_Text: Basic Restrictive - m_Image: {fileID: 0} - m_OnValueChanged: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceBoilerplates - m_MethodName: OnExplicitSessionTypeChanged - m_Mode: 0 - 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 - m_AlphaFadeSpeed: 0.15 ---- !u!114 &794886189 + m_Padding: {x: -8, y: -5, z: -8, w: -5} + m_Softness: {x: 0, y: 0} +--- !u!1 &802456207 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 802456208} + - component: {fileID: 802456212} + - component: {fileID: 802456211} + - component: {fileID: 802456209} + m_Layer: 5 + m_Name: Loading + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &802456208 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 802456207} + 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: 1564534878} + m_Father: {fileID: 2097849100} + 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: -10, y: 0} + m_SizeDelta: {x: 60, y: 20} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &802456209 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 802456207} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &802456211 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 794886186} + m_GameObject: {fileID: 802456207} 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.12156863, g: 0.12156863, b: 0.12156863, a: 1} + m_Color: {r: 0.15, g: 0.15, b: 0.15, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -4755,7 +4863,7 @@ MonoBehaviour: m_Calls: [] m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} m_Type: 1 - m_PreserveAspect: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -4763,52 +4871,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &794886190 +--- !u!222 &802456212 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 794886186} + m_GameObject: {fileID: 802456207} m_CullTransparentMesh: 1 ---- !u!1 &873417222 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 873417223} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &873417223 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 873417222} - 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: 1303578556} - m_Father: {fileID: 2100922580} - 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 &893155972 +--- !u!1 &805083867 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4816,62 +4887,64 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 893155973} - - component: {fileID: 893155977} - - component: {fileID: 893155976} - - component: {fileID: 893155975} - - component: {fileID: 893155974} + - component: {fileID: 805083868} + - component: {fileID: 805083872} + - component: {fileID: 805083871} + - component: {fileID: 805083870} + - component: {fileID: 805083869} m_Layer: 5 - m_Name: Button + m_Name: MessageInput m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &893155973 +--- !u!224 &805083868 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 893155972} + m_GameObject: {fileID: 805083867} 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: 1378034940} - m_Father: {fileID: 541267863} - m_RootOrder: 1 + - {fileID: 769043459} + - {fileID: 485743481} + m_Father: {fileID: 683925400} 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_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 210, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &893155974 +--- !u!114 &805083869 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 893155972} + m_GameObject: {fileID: 805083867} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} m_Name: m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &893155975 + m_EffectColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!114 &805083870 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 893155972} + m_GameObject: {fileID: 805083867} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} m_Name: m_EditorClassIdentifier: m_Navigation: @@ -4902,46 +4975,87 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 893155976} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceExamples - m_MethodName: SignMessage - 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 &893155976 + m_TargetGraphic: {fileID: 805083871} + m_TextViewport: {fileID: 769043459} + m_TextComponent: {fileID: 89467942} + m_Placeholder: {fileID: 1621712496} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 0 + m_RegexValue: + m_GlobalPointSize: 14 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!114 &805083871 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 893155972} + m_GameObject: {fileID: 805083867} 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.26666668, g: 0.06666667, b: 0.88235295, a: 1} + m_Color: {r: 0, g: 0, b: 0, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} m_Type: 1 - m_PreserveAspect: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -4949,15 +5063,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &893155977 +--- !u!222 &805083872 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 893155972} + m_GameObject: {fileID: 805083867} m_CullTransparentMesh: 1 ---- !u!1 &900828004 +--- !u!1 &812752710 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -4965,75 +5079,170 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 900828005} - - component: {fileID: 900828007} - - component: {fileID: 900828006} + - component: {fileID: 812752711} + - component: {fileID: 812752713} + - component: {fileID: 812752712} m_Layer: 5 - m_Name: Image (1) + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &900828005 +--- !u!224 &812752711 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 900828004} + m_GameObject: {fileID: 812752710} 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: 1129766508066712729} - m_RootOrder: 1 + m_Father: {fileID: 1329197019} 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: 15, y: 0} - m_SizeDelta: {x: 10, y: 10} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -10, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &900828006 +--- !u!114 &812752712 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 900828004} + m_GameObject: {fileID: 812752710} 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} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: d03d44fa67fc3480a9617f6df236254d, 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 &900828007 + m_text: Add Session + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + 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 &812752713 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 900828004} + m_GameObject: {fileID: 812752710} m_CullTransparentMesh: 1 ---- !u!1 &906953578 +--- !u!1 &836095705 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 836095706} + m_Layer: 5 + m_Name: Title + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &836095706 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 836095705} + 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: 1614894632} + - {fileID: 1310990841} + m_Father: {fileID: 1146219656} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 130, y: -20} + m_SizeDelta: {x: 230, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &865590363 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5041,11 +5250,11 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 906953579} - - component: {fileID: 906953583} - - component: {fileID: 906953582} - - component: {fileID: 906953581} - - component: {fileID: 906953580} + - component: {fileID: 865590364} + - component: {fileID: 865590368} + - component: {fileID: 865590367} + - component: {fileID: 865590366} + - component: {fileID: 865590365} m_Layer: 5 m_Name: SignOutButton m_TagString: Untagged @@ -5053,47 +5262,46 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &906953579 +--- !u!224 &865590364 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 906953578} + m_GameObject: {fileID: 865590363} 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: 8597592} - m_Father: {fileID: 2198483992803733903} - m_RootOrder: 2 + - {fileID: 1067417227} + m_Father: {fileID: 1865608230} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -25, y: -20} + m_AnchoredPosition: {x: -50, y: -20} m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &906953580 +--- !u!114 &865590365 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 906953578} + m_GameObject: {fileID: 865590363} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} m_Name: m_EditorClassIdentifier: m_ShowMaskGraphic: 1 ---- !u!114 &906953581 +--- !u!114 &865590366 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 906953578} + m_GameObject: {fileID: 865590363} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} @@ -5127,13 +5335,12 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 906953582} + m_TargetGraphic: {fileID: 865590367} m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceExamples + - m_Target: {fileID: 1865608231} + m_TargetAssemblyTypeName: Sequence.Boilerplates.EcosystemWalletProfile, SequenceBoilerplates m_MethodName: SignOut m_Mode: 1 m_Arguments: @@ -5144,13 +5351,13 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 ---- !u!114 &906953582 +--- !u!114 &865590367 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 906953578} + m_GameObject: {fileID: 865590363} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -5174,15 +5381,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &906953583 +--- !u!222 &865590368 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 906953578} + m_GameObject: {fileID: 865590363} m_CullTransparentMesh: 1 ---- !u!1 &917880583 +--- !u!1 &873417222 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5190,108 +5397,92 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 917880584} - - component: {fileID: 917880587} - - component: {fileID: 917880586} - - component: {fileID: 917880585} + - component: {fileID: 873417223} m_Layer: 5 - m_Name: Scrollbar + m_Name: Content m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &917880584 +--- !u!224 &873417223 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 917880583} + m_GameObject: {fileID: 873417222} 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: 1255006567} - m_Father: {fileID: 988110724} - m_RootOrder: 1 + - {fileID: 1303578556} + m_Father: {fileID: 2100922580} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} + m_AnchorMin: {x: 0, y: 1} 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 &917880585 -MonoBehaviour: + m_SizeDelta: {x: 0, y: 28} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &874185234 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 917880583} - 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: 1279357136} - m_HandleRect: {fileID: 1279357135} - m_Direction: 2 - m_Value: 0 - m_Size: 0.2 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &917880586 + serializedVersion: 6 + m_Component: + - component: {fileID: 874185235} + - component: {fileID: 874185237} + - component: {fileID: 874185236} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &874185235 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 874185234} + 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: 330825195} + 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 &874185236 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 917880583} + m_GameObject: {fileID: 874185234} 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_Color: {r: 0.12, g: 0.12, b: 0.12, 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_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 @@ -5301,15 +5492,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &917880587 +--- !u!222 &874185237 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 917880583} + m_GameObject: {fileID: 874185234} m_CullTransparentMesh: 1 ---- !u!1 &960124012 +--- !u!1 &900828004 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5317,134 +5508,74 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 960124013} - - component: {fileID: 960124015} - - component: {fileID: 960124014} + - component: {fileID: 900828005} + - component: {fileID: 900828007} + - component: {fileID: 900828006} m_Layer: 5 - m_Name: Text (TMP) + m_Name: Image (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &960124013 +--- !u!224 &900828005 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 960124012} + m_GameObject: {fileID: 900828004} 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: 512459741} - m_RootOrder: 0 + m_Father: {fileID: 1129766508066712729} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 10, y: 0} - m_SizeDelta: {x: -40, y: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &960124014 +--- !u!114 &900828006 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 960124012} + m_GameObject: {fileID: 900828004} 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} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 + m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Use Passkey - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - 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 &960124015 + m_Sprite: {fileID: 21300000, guid: d03d44fa67fc3480a9617f6df236254d, 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 &900828007 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 960124012} + m_GameObject: {fileID: 900828004} m_CullTransparentMesh: 1 ---- !u!1 &974586686 +--- !u!1 &917880583 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5452,45 +5583,93 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 974586687} - - component: {fileID: 974586690} - - component: {fileID: 974586689} - - component: {fileID: 974586688} + - component: {fileID: 917880584} + - component: {fileID: 917880587} + - component: {fileID: 917880586} + - component: {fileID: 917880585} m_Layer: 5 - m_Name: Viewport + m_Name: Scrollbar m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &974586687 +--- !u!224 &917880584 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 974586686} + m_GameObject: {fileID: 917880583} 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: 130231371} + - {fileID: 1255006567} m_Father: {fileID: 988110724} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} + m_AnchorMin: {x: 1, 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 &974586688 + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &917880585 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 974586686} + m_GameObject: {fileID: 917880583} + 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: 1279357136} + m_HandleRect: {fileID: 1279357135} + m_Direction: 2 + m_Value: 0 + m_Size: 0.2 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &917880586 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 917880583} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -5504,7 +5683,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 @@ -5514,112 +5693,80 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &974586689 +--- !u!222 &917880587 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 974586686} + m_GameObject: {fileID: 917880583} m_CullTransparentMesh: 1 ---- !u!114 &974586690 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 974586686} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!1 &988110723 -GameObject: +--- !u!1 &921594783 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 988110724} - - component: {fileID: 988110727} - - component: {fileID: 988110726} - - component: {fileID: 988110725} + - component: {fileID: 921594784} + - component: {fileID: 921594787} + - component: {fileID: 921594786} + - component: {fileID: 921594785} m_Layer: 5 - m_Name: Template + m_Name: Loading m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &988110724 + m_IsActive: 1 +--- !u!224 &921594784 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 988110723} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 921594783} + 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: 974586687} - - {fileID: 917880584} - m_Father: {fileID: 191605878} - m_RootOrder: 2 + - {fileID: 1257239531} + m_Father: {fileID: 1242786027} 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 &988110725 + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -10, y: 0} + m_SizeDelta: {x: 60, y: 20} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &921594785 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 988110723} + m_GameObject: {fileID: 921594783} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} m_Name: m_EditorClassIdentifier: - m_Content: {fileID: 130231371} - 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: 974586687} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 917880585} - m_HorizontalScrollbarVisibility: 0 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: 0 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &988110726 + m_ShowMaskGraphic: 1 +--- !u!114 &921594786 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 988110723} + m_GameObject: {fileID: 921594783} 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.254717, g: 0.254717, b: 0.254717, a: 1} + m_Color: {r: 0.15, g: 0.15, b: 0.15, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -5628,7 +5775,7 @@ MonoBehaviour: m_Calls: [] m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} m_Type: 1 - m_PreserveAspect: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -5636,15 +5783,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &988110727 +--- !u!222 &921594787 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 988110723} + m_GameObject: {fileID: 921594783} m_CullTransparentMesh: 1 ---- !u!1 &1009042192 +--- !u!1 &960124012 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5652,108 +5799,133 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1009042193} - - component: {fileID: 1009042196} - - component: {fileID: 1009042195} - - component: {fileID: 1009042194} + - component: {fileID: 960124013} + - component: {fileID: 960124015} + - component: {fileID: 960124014} m_Layer: 5 - m_Name: Scroll View + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1009042193 +--- !u!224 &960124013 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1009042192} + m_GameObject: {fileID: 960124012} 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: 1396476262} - - {fileID: 1918409864} - m_Father: {fileID: 220577105} - m_RootOrder: 3 + m_Children: [] + m_Father: {fileID: 512459741} 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: 60} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: -40, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1009042194 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1009042192} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 409830143} - m_Horizontal: 0 - m_Vertical: 1 - m_MovementType: 1 - m_Elasticity: 0.1 - m_Inertia: 1 - m_DecelerationRate: 0.135 - m_ScrollSensitivity: 1 - m_Viewport: {fileID: 1396476262} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 1918409865} - m_HorizontalScrollbarVisibility: 2 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: -3 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &1009042195 +--- !u!114 &960124014 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1009042192} + m_GameObject: {fileID: 960124012} 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} - m_Color: {r: 1, g: 1, b: 1, a: 0} - m_RaycastTarget: 1 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 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 &1009042196 + m_text: Use Passkey + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &960124015 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1009042192} + m_GameObject: {fileID: 960124012} m_CullTransparentMesh: 1 ---- !u!1 &1016496428 +--- !u!1 &965900426 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5761,135 +5933,58 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1016496429} - - component: {fileID: 1016496431} - - component: {fileID: 1016496430} + - component: {fileID: 965900427} + - component: {fileID: 965900431} + - component: {fileID: 965900430} + - component: {fileID: 965900429} + - component: {fileID: 965900428} m_Layer: 5 - m_Name: Image (1) + m_Name: SendButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1016496429 +--- !u!224 &965900427 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} + m_GameObject: {fileID: 965900426} 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: 317570298} - m_RootOrder: 0 + m_Children: + - {fileID: 1060437062} + m_Father: {fileID: 1242786027} 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: 7, y: 7} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1016496430 + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -10, y: 0} + m_SizeDelta: {x: 60, y: 20} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &965900428 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} + m_GameObject: {fileID: 965900426} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, 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: 7eeaa0f6357c9474abdf30939e119719, 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 &1016496431 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} - m_CullTransparentMesh: 1 ---- !u!1 &1017792474 -GameObject: + m_ShowMaskGraphic: 1 +--- !u!114 &965900429 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1017792475} - - component: {fileID: 1017792479} - - component: {fileID: 1017792478} - - component: {fileID: 1017792477} - - component: {fileID: 1017792476} - m_Layer: 5 - m_Name: SendExplicitTransaction - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1017792475 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1017792474} - 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: 11641991} - m_Father: {fileID: 220577105} - m_RootOrder: 10 - 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: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1017792476 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1017792474} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &1017792477 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1017792474} + m_GameObject: {fileID: 965900426} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} @@ -5923,14 +6018,13 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 1017792478} + m_TargetGraphic: {fileID: 965900430} m_OnClick: m_PersistentCalls: m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceBoilerplates - m_MethodName: SendExplicitTransaction + - m_Target: {fileID: 1242786028} + m_TargetAssemblyTypeName: Sequence.Boilerplates.TransactionButton, SequenceBoilerplates + m_MethodName: SendTransaction m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} @@ -5940,13 +6034,13 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 ---- !u!114 &1017792478 +--- !u!114 &965900430 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1017792474} + m_GameObject: {fileID: 965900426} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -5970,15 +6064,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1017792479 +--- !u!222 &965900431 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1017792474} + m_GameObject: {fileID: 965900426} m_CullTransparentMesh: 1 ---- !u!1 &1035093046 +--- !u!1 &968326747 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5986,67 +6080,45 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1035093047} - - component: {fileID: 1035093050} - - component: {fileID: 1035093049} - - component: {fileID: 1035093048} + - component: {fileID: 968326748} + - component: {fileID: 968326750} + - component: {fileID: 968326749} m_Layer: 5 - m_Name: Placeholder + m_Name: Icon m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1035093047 +--- !u!224 &968326748 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1035093046} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 968326747} + 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: 1987947400} - m_RootOrder: 0 + m_Father: {fileID: 1310990841} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} + 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: 0, y: 0} + m_SizeDelta: {x: 7, y: 7} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1035093048 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1035093046} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 1 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: -1 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!114 &1035093049 +--- !u!114 &968326749 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1035093046} + m_GameObject: {fileID: 968326747} 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} @@ -6057,84 +6129,25 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Enter message to sign... - 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: 4286611584 - m_fontColor: {r: 0.5, g: 0.5, b: 0.5, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - 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: 1 - 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 &1035093050 + m_Sprite: {fileID: 21300000, guid: e0aca7c4ac2ed4cc589962721c508d77, 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 &968326750 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1035093046} + m_GameObject: {fileID: 968326747} m_CullTransparentMesh: 1 ---- !u!1 &1050865737 +--- !u!1 &974586686 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6142,144 +6155,197 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1050865742} - - component: {fileID: 1050865741} - - component: {fileID: 1050865740} - - component: {fileID: 1050865739} + - component: {fileID: 974586687} + - component: {fileID: 974586690} + - component: {fileID: 974586689} + - component: {fileID: 974586688} m_Layer: 5 - m_Name: SequenceCanvas + m_Name: Viewport m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &1050865739 -MonoBehaviour: +--- !u!224 &974586687 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1050865737} - 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 &1050865740 + m_GameObject: {fileID: 974586686} + 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: 130231371} + m_Father: {fileID: 988110724} + 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 &974586688 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1050865737} + m_GameObject: {fileID: 974586686} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: - m_UiScaleMode: 1 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 1 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 200 - m_DefaultSpriteDPI: 200 - m_DynamicPixelsPerUnit: 1 - m_PresetInfoIsWorld: 0 ---- !u!223 &1050865741 -Canvas: + 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 &974586689 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1050865737} + m_GameObject: {fileID: 974586686} + m_CullTransparentMesh: 1 +--- !u!114 &974586690 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 974586686} 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 &1050865742 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1050865737} - 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: 1788955835} - - {fileID: 2198483992803733903} - - {fileID: 2053860377} - 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 &1084335994 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 3094631411173026328, guid: 21aa1af318f304faca1367525db9bc28, type: 3} - m_PrefabInstance: {fileID: 5107492344900098706} - m_PrefabAsset: {fileID: 0} ---- !u!1 &1097154361 -GameObject: + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &988110723 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1097154362} + - component: {fileID: 988110724} + - component: {fileID: 988110727} + - component: {fileID: 988110726} + - component: {fileID: 988110725} m_Layer: 5 - m_Name: Sliding Area + m_Name: Template m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1097154362 + m_IsActive: 0 +--- !u!224 &988110724 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1097154361} + m_GameObject: {fileID: 988110723} 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: 1370557953} - m_Father: {fileID: 90679725} - m_RootOrder: 0 + - {fileID: 974586687} + - {fileID: 917880584} + m_Father: {fileID: 191605878} 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 &1115529824 + 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 &988110725 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 988110723} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 130231371} + 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: 974586687} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 917880585} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &988110726 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 988110723} + 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.254717, g: 0.254717, b: 0.254717, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &988110727 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 988110723} + m_CullTransparentMesh: 1 +--- !u!1 &1016496428 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6287,134 +6353,74 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1115529825} - - component: {fileID: 1115529827} - - component: {fileID: 1115529826} + - component: {fileID: 1016496429} + - component: {fileID: 1016496431} + - component: {fileID: 1016496430} m_Layer: 5 - m_Name: Text (TMP) + m_Name: Image (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1115529825 +--- !u!224 &1016496429 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1115529824} + m_GameObject: {fileID: 1016496428} 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: 4209220039127894524} - m_RootOrder: 0 + m_Father: {fileID: 317570298} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 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: 0, y: 10} + m_SizeDelta: {x: 7, y: 7} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1115529826 +--- !u!114 &1016496430 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1115529824} + m_GameObject: {fileID: 1016496428} 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} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 + 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 permissions (optional) - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4284900966 - m_fontColor: {r: 0.4, g: 0.4, b: 0.4, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - 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: 2, 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 &1115529827 + m_Sprite: {fileID: 21300000, guid: 7eeaa0f6357c9474abdf30939e119719, 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 &1016496431 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1115529824} + m_GameObject: {fileID: 1016496428} m_CullTransparentMesh: 1 ---- !u!1 &1123123166 +--- !u!1 &1030251668 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6422,130 +6428,74 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1123123167} + - component: {fileID: 1030251669} + - component: {fileID: 1030251671} + - component: {fileID: 1030251670} m_Layer: 5 - m_Name: Content + m_Name: Icon m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1123123167 +--- !u!224 &1030251669 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1123123166} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1030251668} + 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: 1492591166} - m_Father: {fileID: 1205415408} - m_RootOrder: 0 + m_Children: [] + m_Father: {fileID: 9715030} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} + 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: 0, y: 28} - m_Pivot: {x: 0.5, y: 1} ---- !u!1 &1126746399 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1126746401} - - component: {fileID: 1126746400} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &1126746400 -Light: + m_SizeDelta: {x: 7, y: 7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1030251670 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1126746399} + m_GameObject: {fileID: 1030251668} m_Enabled: 1 - serializedVersion: 10 - m_Type: 1 - m_Shape: 0 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &1126746401 -Transform: + 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: e0aca7c4ac2ed4cc589962721c508d77, 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 &1030251671 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1126746399} - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, 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: 50, y: -30, z: 0} ---- !u!1 &1151746260 + m_GameObject: {fileID: 1030251668} + m_CullTransparentMesh: 1 +--- !u!1 &1050865737 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6553,148 +6503,123 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1151746261} - - component: {fileID: 1151746265} - - component: {fileID: 1151746264} - - component: {fileID: 1151746263} - - component: {fileID: 1151746262} + - component: {fileID: 1050865742} + - component: {fileID: 1050865741} + - component: {fileID: 1050865740} + - component: {fileID: 1050865739} + - component: {fileID: 1050865743} m_Layer: 5 - m_Name: SendImplicitTransaction + m_Name: SequenceCanvas m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1151746261 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1151746260} - 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: 236621039} - m_Father: {fileID: 220577105} - m_RootOrder: 9 - 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: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1151746262 +--- !u!114 &1050865739 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1151746260} + m_GameObject: {fileID: 1050865737} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} m_Name: m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &1151746263 + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1050865740 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1151746260} + m_GameObject: {fileID: 1050865737} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, 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: 1151746264} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceBoilerplates - m_MethodName: SendImplicitTransaction - 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 &1151746264 -MonoBehaviour: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 1 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 200 + m_DefaultSpriteDPI: 200 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1050865741 +Canvas: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1151746260} + m_GameObject: {fileID: 1050865737} 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 - 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 &1151746265 -CanvasRenderer: + 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_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1050865742 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1151746260} - m_CullTransparentMesh: 1 ---- !u!1 &1158876111 + m_GameObject: {fileID: 1050865737} + 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: 1788955835} + - {fileID: 2198483992803733903} + - {fileID: 323220476} + - {fileID: 1865608230} + - {fileID: 1146219656} + - {fileID: 2053860377} + m_Father: {fileID: 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, y: 0} +--- !u!114 &1050865743 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1050865737} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2c4c81af6098e41c98ae27c7dc3bdf5f, type: 3} + m_Name: + m_EditorClassIdentifier: + _login: {fileID: 9144345594371459776} + _featureSelection: {fileID: 323220475} + _profile: {fileID: 1865608231} + _transactions: {fileID: 1146219663} +--- !u!1 &1060437061 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6702,43 +6627,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1158876112} - - component: {fileID: 1158876114} - - component: {fileID: 1158876113} + - component: {fileID: 1060437062} + - component: {fileID: 1060437064} + - component: {fileID: 1060437063} m_Layer: 5 - m_Name: Text + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1158876112 +--- !u!224 &1060437062 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1158876111} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1060437061} + 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: 1987947400} - m_RootOrder: 1 + m_Father: {fileID: 965900427} 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_SizeDelta: {x: -10, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1158876113 +--- !u!114 &1060437063 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1158876111} + m_GameObject: {fileID: 1060437061} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -6746,16 +6670,16 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: "\u200B" + m_text: Send m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -6786,7 +6710,7 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_HorizontalAlignment: 1 + m_HorizontalAlignment: 2 m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 @@ -6795,13 +6719,13 @@ MonoBehaviour: m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_enableWordWrapping: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_enableExtraPadding: 1 + m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 m_parseCtrlCharacters: 1 @@ -6821,15 +6745,15 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1158876114 +--- !u!222 &1060437064 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1158876111} + m_GameObject: {fileID: 1060437061} m_CullTransparentMesh: 1 ---- !u!1 &1172248266 +--- !u!1 &1067417226 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6837,43 +6761,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1172248267} - - component: {fileID: 1172248269} - - component: {fileID: 1172248268} + - component: {fileID: 1067417227} + - component: {fileID: 1067417229} + - component: {fileID: 1067417228} m_Layer: 5 - m_Name: Item Checkmark + m_Name: Icon m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1172248267 +--- !u!224 &1067417227 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1172248266} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1067417226} + 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: 2070597442} - m_RootOrder: 1 + m_Father: {fileID: 865590364} 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_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 7, y: 7} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1172248268 +--- !u!114 &1067417228 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1172248266} + m_GameObject: {fileID: 1067417226} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -6887,9 +6810,9 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Sprite: {fileID: 21300000, guid: 27fce2dc15e7945c2acb7f911dd18eaa, type: 3} m_Type: 0 - m_PreserveAspect: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -6897,15 +6820,20 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1172248269 +--- !u!222 &1067417229 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1172248266} + m_GameObject: {fileID: 1067417226} m_CullTransparentMesh: 1 ---- !u!1 &1199011675 +--- !u!1 &1084335994 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 3094631411173026328, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + m_PrefabInstance: {fileID: 5107492344900098706} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1102907215 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6913,58 +6841,87 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1199011676} - - component: {fileID: 1199011678} - - component: {fileID: 1199011677} + - component: {fileID: 1102907216} + - component: {fileID: 1102907219} + - component: {fileID: 1102907218} + - component: {fileID: 1102907217} m_Layer: 5 - m_Name: Item Background + m_Name: Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1199011676 +--- !u!224 &1102907216 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1199011675} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1102907215} + 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: 1303578556} - m_RootOrder: 0 + m_Father: {fileID: 1865608230} 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 &1199011677 +--- !u!114 &1102907217 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1199011675} + m_GameObject: {fileID: 1102907215} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0b148fe25e99eb48b9724523833bab1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Delegates: + - eventID: 4 + callback: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: SequenceSDK.Samples.SequenceLoginWindow, Sequence.Boilerplates + m_MethodName: EnableEmailButton + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 +--- !u!114 &1102907218 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1102907215} 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.25490198, g: 0.25490198, b: 0.25490198, a: 1} + m_Color: {r: 0, g: 0, b: 0, 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_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -6973,15 +6930,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1199011678 +--- !u!222 &1102907219 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1199011675} + m_GameObject: {fileID: 1102907215} m_CullTransparentMesh: 1 ---- !u!1 &1199799817 +--- !u!1 &1115529824 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6989,43 +6946,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1199799818} - - component: {fileID: 1199799820} - - component: {fileID: 1199799819} + - component: {fileID: 1115529825} + - component: {fileID: 1115529827} + - component: {fileID: 1115529826} m_Layer: 5 - m_Name: Text (TMP) (1) + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1199799818 +--- !u!224 &1115529825 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1199799817} + m_GameObject: {fileID: 1115529824} 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: 220577105} - m_RootOrder: 6 + m_Father: {fileID: 4209220039127894524} 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: 10} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 105, y: -5} + m_SizeDelta: {x: 210, y: 10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1199799819 +--- !u!114 &1115529826 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1199799817} + m_GameObject: {fileID: 1115529824} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -7039,7 +6995,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Message signature + m_text: Select permissions (optional) m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -7108,15 +7064,15 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1199799820 +--- !u!222 &1115529827 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1199799817} + m_GameObject: {fileID: 1115529824} m_CullTransparentMesh: 1 ---- !u!1 &1205415407 +--- !u!1 &1126746399 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -7124,90 +7080,93 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1205415408} - - component: {fileID: 1205415411} - - component: {fileID: 1205415410} - - component: {fileID: 1205415409} - m_Layer: 5 - m_Name: Viewport + - component: {fileID: 1126746401} + - component: {fileID: 1126746400} + m_Layer: 0 + m_Name: Directional Light m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1205415408 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1205415407} - 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: 1123123167} - m_Father: {fileID: 160974638} - 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 &1205415409 -MonoBehaviour: +--- !u!108 &1126746400 +Light: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1205415407} + m_GameObject: {fileID: 1126746399} 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} + serializedVersion: 10 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 &1205415410 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1205415407} - m_CullTransparentMesh: 1 ---- !u!114 &1205415411 -MonoBehaviour: + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1126746401 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1205415407} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!1 &1255006566 + m_GameObject: {fileID: 1126746399} + serializedVersion: 2 + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1146219655 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -7215,131 +7174,124 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1255006567} + - component: {fileID: 1146219656} + - component: {fileID: 1146219663} + - component: {fileID: 1146219662} + - component: {fileID: 1146219661} + - component: {fileID: 1146219660} + - component: {fileID: 1146219659} + - component: {fileID: 1146219658} + - component: {fileID: 1146219657} m_Layer: 5 - m_Name: Sliding Area + m_Name: Transactions m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1255006567 + m_IsActive: 0 +--- !u!224 &1146219656 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1255006566} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1146219655} + 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: 1279357135} - m_Father: {fileID: 917880584} - m_RootOrder: 0 + - {fileID: 836095706} + - {fileID: 2097849100} + - {fileID: 1242786027} + - {fileID: 696230464} + m_Father: {fileID: 1050865742} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} + 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: -20, y: -20} + m_SizeDelta: {x: 240, y: 185} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1267233530 -GameObject: +--- !u!114 &1146219657 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1267233531} - 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 &1267233531 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1267233530} - 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: 161099258} - m_Father: {fileID: 1979708985} - 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 &1279357134 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1279357135} - - component: {fileID: 1279357137} - - component: {fileID: 1279357136} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1279357135 -RectTransform: + m_GameObject: {fileID: 1146219655} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eb6fa7d82312143d9b451ac5e7465a38, type: 3} + m_Name: + m_EditorClassIdentifier: + _start: 0.7 + _duration: 0.3 + _animationCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 2 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.77346337 + value: 1.1153979 + inSlope: -0.25566182 + outSlope: -0.25566182 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.7318018 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: -0.17961398 + outSlope: -0.17961398 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.6227655 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!225 &1146219658 +CanvasGroup: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1279357134} - 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: 1255006567} - 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 &1279357136 + m_GameObject: {fileID: 1146219655} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &1146219659 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1279357134} + m_GameObject: {fileID: 1146219655} 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_Color: {r: 0, g: 0, b: 0, 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_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 @@ -7349,142 +7301,71 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1279357137 +--- !u!222 &1146219660 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1279357134} + m_GameObject: {fileID: 1146219655} m_CullTransparentMesh: 1 ---- !u!1 &1299171963 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1299171964} - m_Layer: 5 - m_Name: WalletLabel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1299171964 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1299171963} - 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: 160243271} - - {fileID: 1610280876} - - {fileID: 755374150} - m_Father: {fileID: 220577105} - 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: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1303578555 -GameObject: +--- !u!114 &1146219661 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1303578556} - - component: {fileID: 1303578557} - m_Layer: 5 - m_Name: Item - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1303578556 -RectTransform: + m_GameObject: {fileID: 1146219655} + 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 &1146219662 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1303578555} - 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: 1199011676} - - {fileID: 1331741680} - - {fileID: 390971675} - m_Father: {fileID: 873417223} - 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 &1303578557 + m_GameObject: {fileID: 1146219655} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 15 + m_Right: 15 + m_Top: 5 + m_Bottom: 15 + m_ChildAlignment: 4 + m_Spacing: 5 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1146219663 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1303578555} + m_GameObject: {fileID: 1146219655} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Script: {fileID: 11500000, guid: 68370ec9959be4c67ab321f72b847f9d, 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.8627451, g: 0.8627451, b: 0.8627451, a: 1} - m_PressedColor: {r: 0.7075472, g: 0.7075472, b: 0.7075472, 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: 1199011677} - toggleTransition: 1 - graphic: {fileID: 1331741681} - m_Group: {fileID: 0} - onValueChanged: - m_PersistentCalls: - m_Calls: [] - m_IsOn: 1 ---- !u!1 &1331741679 + _transactionButtons: + - {fileID: 2097849102} + - {fileID: 1242786028} + - {fileID: 696230465} +--- !u!1 &1172248266 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -7492,9 +7373,9 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1331741680} - - component: {fileID: 1331741682} - - component: {fileID: 1331741681} + - component: {fileID: 1172248267} + - component: {fileID: 1172248269} + - component: {fileID: 1172248268} m_Layer: 5 m_Name: Item Checkmark m_TagString: Untagged @@ -7502,33 +7383,32 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1331741680 +--- !u!224 &1172248267 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1331741679} + m_GameObject: {fileID: 1172248266} 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: 1303578556} - m_RootOrder: 1 + m_Father: {fileID: 2070597442} 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 &1331741681 +--- !u!114 &1172248268 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1331741679} + m_GameObject: {fileID: 1172248266} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -7552,15 +7432,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1331741682 +--- !u!222 &1172248269 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1331741679} + m_GameObject: {fileID: 1172248266} m_CullTransparentMesh: 1 ---- !u!1 &1359569575 +--- !u!1 &1186454643 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -7568,43 +7448,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1359569576} - - component: {fileID: 1359569578} - - component: {fileID: 1359569577} + - component: {fileID: 1186454644} + - component: {fileID: 1186454646} + - component: {fileID: 1186454645} m_Layer: 5 - m_Name: Item Label + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1359569576 +--- !u!224 &1186454644 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1359569575} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1186454643} + 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: 1492591166} - m_RootOrder: 2 + m_Father: {fileID: 683925400} 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_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 210, y: 10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1359569577 +--- !u!114 &1186454645 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1359569575} + m_GameObject: {fileID: 1186454643} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -7612,23 +7491,23 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Option A + m_text: Wallet address m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 4284900966 + m_fontColor: {r: 0.4, g: 0.4, b: 0.4, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -7640,7 +7519,7 @@ MonoBehaviour: m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: 0 + m_TextStyleHashCode: -1183493901 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 @@ -7681,21 +7560,21 @@ MonoBehaviour: m_VertexBufferAutoSizeReduction: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} + m_margin: {x: 2, y: 0, z: 0, w: 0} m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_hasFontAssetChanged: 1 + m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1359569578 +--- !u!222 &1186454646 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1359569575} + m_GameObject: {fileID: 1186454643} m_CullTransparentMesh: 1 ---- !u!1 &1370557952 +--- !u!1 &1199011675 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -7703,58 +7582,57 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1370557953} - - component: {fileID: 1370557955} - - component: {fileID: 1370557954} + - component: {fileID: 1199011676} + - component: {fileID: 1199011678} + - component: {fileID: 1199011677} m_Layer: 5 - m_Name: Handle + m_Name: Item Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1370557953 +--- !u!224 &1199011676 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1370557952} + m_GameObject: {fileID: 1199011675} 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: 1097154362} - m_RootOrder: 0 + m_Father: {fileID: 1303578556} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0.2} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 20} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1370557954 +--- !u!114 &1199011677 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1370557952} + m_GameObject: {fileID: 1199011675} 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_Color: {r: 0.25490198, g: 0.25490198, b: 0.25490198, 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_Sprite: {fileID: 0} + m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -7763,15 +7641,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1370557955 +--- !u!222 &1199011678 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1370557952} + m_GameObject: {fileID: 1199011675} m_CullTransparentMesh: 1 ---- !u!1 &1378034939 +--- !u!1 &1235258471 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -7779,75 +7657,133 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1378034940} - - component: {fileID: 1378034942} - - component: {fileID: 1378034941} + - component: {fileID: 1235258472} + - component: {fileID: 1235258474} + - component: {fileID: 1235258473} m_Layer: 5 - m_Name: Image (1) + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1378034940 +--- !u!224 &1235258472 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1378034939} + m_GameObject: {fileID: 1235258471} 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: 893155973} - m_RootOrder: 0 + m_Father: {fileID: 215461110} 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: 7, y: 7} + m_SizeDelta: {x: -10, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1378034941 +--- !u!114 &1235258473 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1378034939} + m_GameObject: {fileID: 1235258471} 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} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 7bff9d6884f5e4bee9b34e722bf48b70, 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 &1378034942 + m_text: Add Session + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + 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 &1235258474 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1378034939} + m_GameObject: {fileID: 1235258471} m_CullTransparentMesh: 1 ---- !u!1 &1396476261 +--- !u!1 &1242786026 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -7855,65 +7791,74 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1396476262} - - component: {fileID: 1396476265} - - component: {fileID: 1396476264} - - component: {fileID: 1396476263} + - component: {fileID: 1242786027} + - component: {fileID: 1242786030} + - component: {fileID: 1242786029} + - component: {fileID: 1242786028} m_Layer: 5 - m_Name: Viewport + m_Name: ExplicitEmitButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1396476262 +--- !u!224 &1242786027 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1396476261} + m_GameObject: {fileID: 1242786026} 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: 409830143} - m_Father: {fileID: 1009042193} - m_RootOrder: 0 + - {fileID: 2064835422} + - {fileID: 1374590915} + - {fileID: 215461110} + - {fileID: 965900427} + - {fileID: 921594784} + m_Father: {fileID: 1146219656} 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: 1} ---- !u!114 &1396476263 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 130, y: -105} + m_SizeDelta: {x: 230, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1242786028 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1396476261} + m_GameObject: {fileID: 1242786026} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Script: {fileID: 11500000, guid: 5fa388a969190426facba008de2b8c43, type: 3} m_Name: m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &1396476264 + _chain: 421614 + _transaction: + k__BackingField: 0x33985d320809E26274a72E03268c8a29927Bc6dA + k__BackingField: explicitEmit() + _loadingObject: {fileID: 921594783} + _sessionButtonObject: {fileID: 215461105} + _transactionButtonObject: {fileID: 965900426} +--- !u!114 &1242786029 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1396476261} + m_GameObject: {fileID: 1242786026} 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.06666667, g: 0.06666667, b: 0.06666667, a: 1} + m_Color: {r: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -7929,16 +7874,16 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1396476265 + m_PixelsPerUnitMultiplier: 2 +--- !u!222 &1242786030 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1396476261} + m_GameObject: {fileID: 1242786026} m_CullTransparentMesh: 1 ---- !u!1 &1423156421 +--- !u!1 &1255006566 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -7946,75 +7891,35 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1423156422} - - component: {fileID: 1423156424} - - component: {fileID: 1423156423} + - component: {fileID: 1255006567} m_Layer: 5 - m_Name: Arrow + m_Name: Sliding Area m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1423156422 +--- !u!224 &1255006567 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1423156421} + m_GameObject: {fileID: 1255006566} 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: 722266041} - m_RootOrder: 1 + m_Children: + - {fileID: 1279357135} + m_Father: {fileID: 917880584} 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_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 &1423156423 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1423156421} - 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 &1423156424 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1423156421} - m_CullTransparentMesh: 1 ---- !u!1 &1446444768 +--- !u!1 &1257239530 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8022,221 +7927,56 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1446444769} - - component: {fileID: 1446444771} - - component: {fileID: 1446444770} + - component: {fileID: 1257239531} + - component: {fileID: 1257239533} + - component: {fileID: 1257239532} m_Layer: 5 - m_Name: Image (1) + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1446444769 +--- !u!224 &1257239531 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1446444768} + m_GameObject: {fileID: 1257239530} 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: 3495957624811024636} - m_RootOrder: 1 + m_Father: {fileID: 921594784} 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: 15, y: 0} - m_SizeDelta: {x: 10, y: 10} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -10, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1446444770 +--- !u!114 &1257239532 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1446444768} + m_GameObject: {fileID: 1257239530} 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} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 668a5199388a248cdbcfc5cb42946bde, 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 &1446444771 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1446444768} - m_CullTransparentMesh: 1 ---- !u!1 &1492591165 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1492591166} - - component: {fileID: 1492591167} - m_Layer: 5 - m_Name: Item - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1492591166 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1492591165} - 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: 1617284437} - - {fileID: 143763337} - - {fileID: 1359569576} - m_Father: {fileID: 1123123167} - 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 &1492591167 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1492591165} - 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.8627451, g: 0.8627451, b: 0.8627451, a: 1} - m_PressedColor: {r: 0.7075472, g: 0.7075472, b: 0.7075472, 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: 1617284438} - toggleTransition: 1 - graphic: {fileID: 143763338} - m_Group: {fileID: 0} - onValueChanged: - m_PersistentCalls: - m_Calls: [] - m_IsOn: 1 ---- !u!1 &1492627056 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1492627057} - - component: {fileID: 1492627059} - - component: {fileID: 1492627058} - m_Layer: 5 - m_Name: Text (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1492627057 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1492627056} - 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: 1129766508066712729} - 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: 10, y: 0} - m_SizeDelta: {x: -40, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1492627058 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1492627056} - 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: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Sign In with Google + m_text: Loading... m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -8269,8 +8009,8 @@ MonoBehaviour: m_enableAutoSizing: 0 m_fontSizeMin: 18 m_fontSizeMax: 72 - m_fontStyle: 1 - m_HorizontalAlignment: 1 + m_fontStyle: 0 + m_HorizontalAlignment: 2 m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 @@ -8305,15 +8045,15 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1492627059 +--- !u!222 &1257239533 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1492627056} + m_GameObject: {fileID: 1257239530} m_CullTransparentMesh: 1 ---- !u!1 &1496107486 +--- !u!1 &1267233530 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8321,57 +8061,92 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1496107487} - - component: {fileID: 1496107489} - - component: {fileID: 1496107488} + - component: {fileID: 1267233531} m_Layer: 5 - m_Name: Background + m_Name: Sliding Area m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1496107487 +--- !u!224 &1267233531 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1496107486} + m_GameObject: {fileID: 1267233530} 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: 1972349263} - m_RootOrder: 0 + m_Children: + - {fileID: 161099258} + m_Father: {fileID: 1979708985} 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_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1279357134 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1279357135} + - component: {fileID: 1279357137} + - component: {fileID: 1279357136} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1279357135 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1279357134} + 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: 1255006567} + 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 &1496107488 +--- !u!114 &1279357136 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1496107486} + m_GameObject: {fileID: 1279357134} 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.12, g: 0.12, b: 0.12, 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: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 @@ -8381,15 +8156,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1496107489 +--- !u!222 &1279357137 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1496107486} + m_GameObject: {fileID: 1279357134} m_CullTransparentMesh: 1 ---- !u!1 &1610280875 +--- !u!1 &1280987657 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8397,61 +8172,207 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1610280876} - - component: {fileID: 1610280878} - - component: {fileID: 1610280877} + - component: {fileID: 1280987658} + - component: {fileID: 1280987662} + - component: {fileID: 1280987661} + - component: {fileID: 1280987660} + - component: {fileID: 1280987659} m_Layer: 5 - m_Name: Text (TMP) + m_Name: SendButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1610280876 +--- !u!224 &1280987658 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1610280875} + m_GameObject: {fileID: 1280987657} 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: 1299171964} - m_RootOrder: 1 + m_Children: + - {fileID: 1560497914} + m_Father: {fileID: 2097849100} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} m_AnchoredPosition: {x: -10, y: 0} - m_SizeDelta: {x: -40, y: -20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1610280877 + m_SizeDelta: {x: 60, y: 20} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1280987659 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1610280875} + m_GameObject: {fileID: 1280987657} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: + m_ShowMaskGraphic: 1 +--- !u!114 &1280987660 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1280987657} + 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: 1280987661} + m_OnClick: m_PersistentCalls: - m_Calls: [] - m_text: - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_fontSharedMaterials: [] + m_Calls: + - m_Target: {fileID: 2097849102} + m_TargetAssemblyTypeName: Sequence.Boilerplates.TransactionButton, SequenceBoilerplates + m_MethodName: SendTransaction + 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 &1280987661 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1280987657} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &1280987662 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1280987657} + m_CullTransparentMesh: 1 +--- !u!1 &1299434845 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1299434846} + - component: {fileID: 1299434848} + - component: {fileID: 1299434847} + m_Layer: 5 + m_Name: Title Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1299434846 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1299434845} + 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: 2097849100} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 115, y: -3.5} + m_SizeDelta: {x: 210, y: -7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1299434847 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1299434845} + 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: Wallet Profile + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] m_fontColor32: @@ -8475,14 +8396,14 @@ MonoBehaviour: serializedVersion: 2 rgba: 4294967295 m_fontSize: 8 - m_fontSizeBase: 8 + m_fontSizeBase: 10 m_fontWeight: 400 m_enableAutoSizing: 0 m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 1 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 256 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 m_wordSpacing: 0 @@ -8490,9 +8411,9 @@ MonoBehaviour: m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_enableWordWrapping: 1 m_wordWrappingRatios: 0.4 - m_overflowMode: 1 + m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 @@ -8516,15 +8437,15 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1610280878 +--- !u!222 &1299434848 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1610280875} + m_GameObject: {fileID: 1299434845} m_CullTransparentMesh: 1 ---- !u!1 &1614547398 +--- !u!1 &1303578555 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8532,75 +8453,86 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1614547399} - - component: {fileID: 1614547401} - - component: {fileID: 1614547400} + - component: {fileID: 1303578556} + - component: {fileID: 1303578557} m_Layer: 5 - m_Name: Item Background + m_Name: Item m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1614547399 +--- !u!224 &1303578556 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1614547398} + m_GameObject: {fileID: 1303578555} 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: 2070597442} - m_RootOrder: 0 + m_Children: + - {fileID: 1199011676} + - {fileID: 1331741680} + - {fileID: 390971675} + m_Father: {fileID: 873417223} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} + 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: 0} + m_SizeDelta: {x: 0, y: 20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1614547400 +--- !u!114 &1303578557 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1614547398} + m_GameObject: {fileID: 1303578555} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} m_Name: m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.25490198, g: 0.25490198, b: 0.25490198, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: + 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.8627451, g: 0.8627451, b: 0.8627451, a: 1} + m_PressedColor: {r: 0.7075472, g: 0.7075472, b: 0.7075472, 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: 1199011677} + toggleTransition: 1 + graphic: {fileID: 1331741681} + m_Group: {fileID: 0} + onValueChanged: 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 &1614547401 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1614547398} - m_CullTransparentMesh: 1 ---- !u!1 &1617284436 + m_IsOn: 1 +--- !u!1 &1305107876 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8608,209 +8540,56 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1617284437} - - component: {fileID: 1617284439} - - component: {fileID: 1617284438} + - component: {fileID: 1305107877} + - component: {fileID: 1305107879} + - component: {fileID: 1305107878} m_Layer: 5 - m_Name: Item Background + m_Name: Title Text m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1617284437 +--- !u!224 &1305107877 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1617284436} + m_GameObject: {fileID: 1305107876} 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: 1492591166} - m_RootOrder: 0 + m_Father: {fileID: 1685000285} 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: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -12.5} + m_SizeDelta: {x: 220, y: 15.000001} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1617284438 +--- !u!114 &1305107878 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1617284436} + m_GameObject: {fileID: 1305107876} 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} - m_Color: {r: 0.25490198, g: 0.25490198, b: 0.25490198, 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_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 &1617284439 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1617284436} - m_CullTransparentMesh: 1 ---- !u!1 &1656381959 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1656381960} - - component: {fileID: 1656381962} - - component: {fileID: 1656381961} - m_Layer: 5 - m_Name: Image (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1656381960 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1656381959} - 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: 28996671} - 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: 7, y: 7} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1656381961 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1656381959} - 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: 7bff9d6884f5e4bee9b34e722bf48b70, 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 &1656381962 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1656381959} - m_CullTransparentMesh: 1 ---- !u!1 &1678482372 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1678482373} - - component: {fileID: 1678482375} - - component: {fileID: 1678482374} - m_Layer: 5 - m_Name: Text (TMP) (2) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1678482373 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1678482372} - 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: 220577105} - m_RootOrder: 4 - 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: 10} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1678482374 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1678482372} - 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: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Add new session + m_text: Send Transactions m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -8819,8 +8598,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4284900966 - m_fontColor: {r: 0.4, g: 0.4, b: 0.4, a: 1} + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -8838,7 +8617,7 @@ MonoBehaviour: serializedVersion: 2 rgba: 4294967295 m_fontSize: 8 - m_fontSizeBase: 8 + m_fontSizeBase: 10 m_fontWeight: 400 m_enableAutoSizing: 0 m_fontSizeMin: 18 @@ -8873,21 +8652,21 @@ MonoBehaviour: m_VertexBufferAutoSizeReduction: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 - m_margin: {x: 2, y: 0, z: 0, w: 0} + 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 &1678482375 +--- !u!222 &1305107879 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1678482372} + m_GameObject: {fileID: 1305107876} m_CullTransparentMesh: 1 ---- !u!1 &1721989092 +--- !u!1 &1310990840 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8895,134 +8674,147 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1721989093} - - component: {fileID: 1721989095} - - component: {fileID: 1721989094} + - component: {fileID: 1310990841} + - component: {fileID: 1310990845} + - component: {fileID: 1310990844} + - component: {fileID: 1310990843} + - component: {fileID: 1310990842} m_Layer: 5 - m_Name: Text (TMP) + m_Name: CloseButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1721989093 +--- !u!224 &1310990841 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1721989092} + m_GameObject: {fileID: 1310990840} 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: 3495957624811024636} - m_RootOrder: 0 + m_Children: + - {fileID: 968326748} + m_Father: {fileID: 836095706} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 10, y: 0} - m_SizeDelta: {x: -40, y: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, 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 &1721989094 +--- !u!114 &1310990842 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1721989092} + m_GameObject: {fileID: 1310990840} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &1310990843 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1310990840} + 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: 1310990844} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1146219663} + m_TargetAssemblyTypeName: Sequence.Boilerplates.EcosystemWalletTransactions, + SequenceBoilerplates + 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 &1310990844 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1310990840} + 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: 0 + m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, 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: Sign In with Apple - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - 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 &1721989095 + m_Sprite: {fileID: 21300000, guid: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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 &1310990845 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1721989092} + m_GameObject: {fileID: 1310990840} m_CullTransparentMesh: 1 ---- !u!1 &1746889449 +--- !u!1 &1321288302 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -9030,43 +8822,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1746889450} - - component: {fileID: 1746889452} - - component: {fileID: 1746889451} + - component: {fileID: 1321288303} + - component: {fileID: 1321288305} + - component: {fileID: 1321288304} m_Layer: 5 - m_Name: Arrow + m_Name: Handle m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1746889450 +--- !u!224 &1321288303 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1746889449} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1321288302} + 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: 794886187} - m_RootOrder: 1 + m_Father: {fileID: 2016817959} 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_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1746889451 +--- !u!114 &1321288304 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1746889449} + m_GameObject: {fileID: 1321288302} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -9080,8 +8871,8 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -9090,15 +8881,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1746889452 +--- !u!222 &1321288305 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1746889449} + m_GameObject: {fileID: 1321288302} m_CullTransparentMesh: 1 ---- !u!1 &1788955834 +--- !u!1 &1329197014 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -9106,59 +8897,110 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1788955835} - - component: {fileID: 1788955837} - - component: {fileID: 1788955836} + - component: {fileID: 1329197019} + - component: {fileID: 1329197018} + - component: {fileID: 1329197017} + - component: {fileID: 1329197016} + - component: {fileID: 1329197015} m_Layer: 5 - m_Name: Background + m_Name: SessionButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1788955835 -RectTransform: +--- !u!114 &1329197015 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1788955834} - 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: 1050865742} - 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 &1788955836 + m_GameObject: {fileID: 1329197014} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &1329197016 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1788955834} + m_GameObject: {fileID: 1329197014} + 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: 1329197017} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 696230465} + m_TargetAssemblyTypeName: Sequence.Boilerplates.TransactionButton, SequenceBoilerplates + m_MethodName: AddSession + 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 &1329197017 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1329197014} 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_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, 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: 76b048e2d7f8e459ca9b54c935448f66, type: 3} - m_Type: 0 - m_PreserveAspect: 0 + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -9166,15 +9008,35 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1788955837 +--- !u!222 &1329197018 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1788955834} + m_GameObject: {fileID: 1329197014} m_CullTransparentMesh: 1 ---- !u!1 &1883453220 +--- !u!224 &1329197019 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1329197014} + 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: 812752711} + m_Father: {fileID: 696230464} + 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: -10, y: 0} + m_SizeDelta: {x: 60, y: 20} + m_Pivot: {x: 1, y: 0.5} +--- !u!1 &1331741679 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -9182,43 +9044,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1883453221} - - component: {fileID: 1883453223} - - component: {fileID: 1883453222} + - component: {fileID: 1331741680} + - component: {fileID: 1331741682} + - component: {fileID: 1331741681} m_Layer: 5 - m_Name: Image (1) + m_Name: Item Checkmark m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1883453221 +--- !u!224 &1331741680 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1883453220} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1331741679} + 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: 512459741} - m_RootOrder: 1 + m_Father: {fileID: 1303578556} 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: 15, y: 0} - m_SizeDelta: {x: 10, y: 10} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1883453222 +--- !u!114 &1331741681 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1883453220} + m_GameObject: {fileID: 1331741679} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -9232,9 +9093,9 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 7587ac7b3e6c1471ca5ab6307ab32ec5, type: 3} + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} m_Type: 0 - m_PreserveAspect: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -9242,15 +9103,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1883453223 +--- !u!222 &1331741682 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1883453220} + m_GameObject: {fileID: 1331741679} m_CullTransparentMesh: 1 ---- !u!1 &1918409863 +--- !u!1 &1374590914 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -9258,292 +9119,133 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1918409864} - - component: {fileID: 1918409867} - - component: {fileID: 1918409866} - - component: {fileID: 1918409865} + - component: {fileID: 1374590915} + - component: {fileID: 1374590917} + - component: {fileID: 1374590916} m_Layer: 5 - m_Name: Scrollbar Vertical + m_Name: Description Text m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1918409864 +--- !u!224 &1374590915 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1918409863} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1374590914} + 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: 453938998} - m_Father: {fileID: 1009042193} - m_RootOrder: 1 + m_Children: [] + m_Father: {fileID: 1242786027} 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: 10, y: 0} - m_Pivot: {x: 1, y: 1} ---- !u!114 &1918409865 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1918409863} - 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: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} - m_HighlightedColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} - m_PressedColor: {r: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} - m_SelectedColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} - m_DisabledColor: {r: 0, g: 0, b: 0, a: 1} - 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: 504017414} - m_HandleRect: {fileID: 504017413} - m_Direction: 2 - m_Value: 0 - m_Size: 1 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &1918409866 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 115, y: 3.5} + m_SizeDelta: {x: 210, y: -7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1374590916 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1918409863} + m_GameObject: {fileID: 1374590914} 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} - m_Color: {r: 0, g: 0, b: 0, 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: 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 &1918409867 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1918409863} - m_CullTransparentMesh: 1 ---- !u!1 &1972349262 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1972349263} - m_Layer: 5 - m_Name: SignatureLabel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1972349263 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1972349262} - 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: 1496107487} - - {fileID: 455107486} - - {fileID: 2082724705} - m_Father: {fileID: 220577105} - m_RootOrder: 7 - 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: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1979708984 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1979708985} - - component: {fileID: 1979708988} - - component: {fileID: 1979708987} - - component: {fileID: 1979708986} - m_Layer: 5 - m_Name: Scrollbar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1979708985 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1979708984} - 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: 1267233531} - m_Father: {fileID: 17360257} - 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 &1979708986 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1979708984} - 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: 161099259} - m_HandleRect: {fileID: 161099258} - m_Direction: 2 - m_Value: 0 - m_Size: 0.2 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &1979708987 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1979708984} - 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 &1979708988 + m_text: Wallet Profile + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2583691263 + m_fontColor: {r: 1, g: 1, b: 1, a: 0.6} + 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: 8 + m_fontSizeBase: 10 + 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 &1374590917 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1979708984} + m_GameObject: {fileID: 1374590914} m_CullTransparentMesh: 1 ---- !u!1 &1984812365 +--- !u!1 &1407445813 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -9551,9 +9253,9 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1984812366} - - component: {fileID: 1984812368} - - component: {fileID: 1984812367} + - component: {fileID: 1407445814} + - component: {fileID: 1407445816} + - component: {fileID: 1407445815} m_Layer: 5 m_Name: Text (TMP) m_TagString: Untagged @@ -9561,33 +9263,32 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1984812366 +--- !u!224 &1407445814 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1984812365} + m_GameObject: {fileID: 1407445813} 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: 220577105} - m_RootOrder: 0 + m_Father: {fileID: 330825195} 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: 10} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -10, y: 0} + m_SizeDelta: {x: -40, y: -20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1984812367 +--- !u!114 &1407445815 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1984812365} + m_GameObject: {fileID: 1407445813} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -9601,7 +9302,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Wallet address + m_text: m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -9610,8 +9311,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4284900966 - m_fontColor: {r: 0.4, g: 0.4, b: 0.4, a: 1} + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -9635,8 +9336,8 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 1 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 512 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 m_wordSpacing: 0 @@ -9644,9 +9345,9 @@ MonoBehaviour: m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_enableWordWrapping: 0 m_wordWrappingRatios: 0.4 - m_overflowMode: 0 + m_overflowMode: 1 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 @@ -9664,21 +9365,21 @@ MonoBehaviour: m_VertexBufferAutoSizeReduction: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 - m_margin: {x: 2, y: 0, z: 0, w: 0} + 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 &1984812368 +--- !u!222 &1407445816 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1984812365} + m_GameObject: {fileID: 1407445813} m_CullTransparentMesh: 1 ---- !u!1 &1987947399 +--- !u!1 &1423156421 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -9686,109 +9387,117 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1987947400} - - component: {fileID: 1987947401} + - component: {fileID: 1423156422} + - component: {fileID: 1423156424} + - component: {fileID: 1423156423} m_Layer: 5 - m_Name: Text Area + m_Name: Arrow m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1987947400 +--- !u!224 &1423156422 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1987947399} + m_GameObject: {fileID: 1423156421} 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: 1035093047} - - {fileID: 1158876112} - m_Father: {fileID: 541267863} - m_RootOrder: 0 + m_Children: [] + m_Father: {fileID: 722266041} 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: -10} + 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 &1987947401 +--- !u!114 &1423156423 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1987947399} + m_GameObject: {fileID: 1423156421} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: - m_Padding: {x: -8, y: -5, z: -8, w: -5} - m_Softness: {x: 0, y: 0} ---- !u!1 &2053860376 -GameObject: + 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 &1423156424 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2053860377} - - component: {fileID: 2053860380} - - component: {fileID: 2053860379} - - component: {fileID: 2053860378} + m_GameObject: {fileID: 1423156421} + m_CullTransparentMesh: 1 +--- !u!1 &1423415635 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1423415636} + - component: {fileID: 1423415638} + - component: {fileID: 1423415637} m_Layer: 5 - m_Name: VersionText + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &2053860377 +--- !u!224 &1423415636 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2053860376} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1423415635} + 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: 1050865742} - m_RootOrder: 2 + m_Father: {fileID: 1870792378} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -5, y: 5} - m_SizeDelta: {x: 300, y: 10} - m_Pivot: {x: 1, y: 0} ---- !u!114 &2053860378 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2053860376} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 66917f722796445f1a9d5d54218cd973, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!114 &2053860379 + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1423415637 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2053860376} + m_GameObject: {fileID: 1423415635} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -9802,7 +9511,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Version + m_text: Loading... m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -9811,8 +9520,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 2583691263 - m_fontColor: {r: 1, g: 1, b: 1, a: 0.6} + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -9836,7 +9545,7 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_HorizontalAlignment: 4 + m_HorizontalAlignment: 2 m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 @@ -9871,103 +9580,15 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &2053860380 +--- !u!222 &1423415638 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2053860376} + m_GameObject: {fileID: 1423415635} m_CullTransparentMesh: 1 ---- !u!1 &2070597441 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2070597442} - - component: {fileID: 2070597443} - m_Layer: 5 - m_Name: Item - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2070597442 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2070597441} - 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: 1614547399} - - {fileID: 1172248267} - - {fileID: 48218464} - m_Father: {fileID: 130231371} - 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 &2070597443 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2070597441} - 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.8627451, g: 0.8627451, b: 0.8627451, a: 1} - m_PressedColor: {r: 0.7075472, g: 0.7075472, b: 0.7075472, 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: 1614547400} - toggleTransition: 1 - graphic: {fileID: 1172248268} - m_Group: {fileID: 0} - onValueChanged: - m_PersistentCalls: - m_Calls: [] - m_IsOn: 1 ---- !u!1 &2082724704 +--- !u!1 &1446444768 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -9975,131 +9596,57 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2082724705} - - component: {fileID: 2082724709} - - component: {fileID: 2082724708} - - component: {fileID: 2082724707} - - component: {fileID: 2082724706} + - component: {fileID: 1446444769} + - component: {fileID: 1446444771} + - component: {fileID: 1446444770} m_Layer: 5 - m_Name: CopyButton + m_Name: Image (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &2082724705 +--- !u!224 &1446444769 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2082724704} + m_GameObject: {fileID: 1446444768} 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: 629025367} - m_Father: {fileID: 1972349263} - m_RootOrder: 2 + m_Children: [] + m_Father: {fileID: 3495957624811024636} 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_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &2082724706 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2082724704} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &2082724707 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2082724704} - 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: 2082724708} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceExamples - m_MethodName: CopySignature - 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 &2082724708 +--- !u!114 &1446444770 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2082724704} + m_GameObject: {fileID: 1446444768} 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.19, g: 0.19, b: 0.19, 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: 21300000, guid: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} - m_Type: 1 + m_Sprite: {fileID: 21300000, guid: 668a5199388a248cdbcfc5cb42946bde, type: 3} + m_Type: 0 m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 @@ -10108,15 +9655,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &2082724709 +--- !u!222 &1446444771 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2082724704} + m_GameObject: {fileID: 1446444768} m_CullTransparentMesh: 1 ---- !u!1 &2100922579 +--- !u!1 &1477743771 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -10124,90 +9671,133 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2100922580} - - component: {fileID: 2100922583} - - component: {fileID: 2100922582} - - component: {fileID: 2100922581} + - component: {fileID: 1477743772} + - component: {fileID: 1477743774} + - component: {fileID: 1477743773} m_Layer: 5 - m_Name: Viewport + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &2100922580 +--- !u!224 &1477743772 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2100922579} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1477743771} + 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: 873417223} - m_Father: {fileID: 17360257} - m_RootOrder: 0 + m_Children: [] + m_Father: {fileID: 319937704} 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 &2100922581 + m_AnchoredPosition: {x: -10, y: 0} + m_SizeDelta: {x: -40, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1477743773 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2100922579} + m_GameObject: {fileID: 1477743771} 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} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 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 &2100922582 + m_text: + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 + 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: 1 + 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 &1477743774 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2100922579} + m_GameObject: {fileID: 1477743771} m_CullTransparentMesh: 1 ---- !u!114 &2100922583 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2100922579} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!1 &320339275645968252 +--- !u!1 &1492627056 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -10215,67 +9805,133 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 4209220039127894524} - - component: {fileID: 4993712313665796667} - - component: {fileID: 7675607662054216073} + - component: {fileID: 1492627057} + - component: {fileID: 1492627059} + - component: {fileID: 1492627058} m_Layer: 5 - m_Name: LoginState + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &364841223076288887 +--- !u!224 &1492627057 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1185936199800087165} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1492627056} + 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: 3251032449294067148} - m_RootOrder: 0 + m_Father: {fileID: 1129766508066712729} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 10, y: 0} m_SizeDelta: {x: -40, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &380487859157681410 +--- !u!114 &1492627058 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8750106440804939110} + m_GameObject: {fileID: 1492627056} 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} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} - m_RaycastTarget: 1 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 - 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!1 &1039274815797997968 + m_text: Sign In with Google + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &1492627059 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1492627056} + m_CullTransparentMesh: 1 +--- !u!1 &1545678473 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -10283,48 +9939,61 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 4231729613209684367} - - component: {fileID: 7376973567988763871} - - component: {fileID: 8218687474100291355} + - component: {fileID: 1545678474} + - component: {fileID: 1545678478} + - component: {fileID: 1545678477} + - component: {fileID: 1545678476} + - component: {fileID: 1545678475} m_Layer: 5 - m_Name: Image (1) + m_Name: CopyButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1129766508066712729 +--- !u!224 &1545678474 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2433697561466855871} + m_GameObject: {fileID: 1545678473} 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: 1492627057} - - {fileID: 900828005} - m_Father: {fileID: 4209220039127894524} - m_RootOrder: 4 + - {fileID: 2061216282} + m_Father: {fileID: 330825195} 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: 30} + 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 &1181566138228532167 +--- !u!114 &1545678475 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8496890551459878638} + m_GameObject: {fileID: 1545678473} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &1545678476 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1545678473} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: m_Navigation: @@ -10355,65 +10024,3825 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 8046914839405764275} - m_TextViewport: {fileID: 2364319422627657610} - m_TextComponent: {fileID: 4346455832680865383} - m_Placeholder: {fileID: 2369011026816092588} - m_VerticalScrollbar: {fileID: 0} - m_VerticalScrollbarEventHandler: {fileID: 0} - m_LayoutGroup: {fileID: 0} - m_ScrollSensitivity: 1 - m_ContentType: 0 - m_InputType: 0 - m_AsteriskChar: 42 - m_KeyboardType: 0 - m_LineType: 0 - m_HideMobileInput: 0 - m_HideSoftKeyboard: 0 - m_CharacterValidation: 0 - m_RegexValue: - m_GlobalPointSize: 14 - m_CharacterLimit: 0 - m_OnEndEdit: - m_PersistentCalls: - m_Calls: [] - m_OnSubmit: - m_PersistentCalls: - m_Calls: [] - m_OnSelect: - m_PersistentCalls: - m_Calls: [] - m_OnDeselect: + m_TargetGraphic: {fileID: 1545678477} + m_OnClick: m_PersistentCalls: - m_Calls: [] - m_OnTextSelection: + m_Calls: + - m_Target: {fileID: 1865608231} + m_TargetAssemblyTypeName: Sequence.Boilerplates.EcosystemWalletProfile, SequenceBoilerplates + m_MethodName: CopyWalletAddress + 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 &1545678477 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1545678473} + 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.19, g: 0.19, b: 0.19, 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_OnEndTextSelection: + m_Sprite: {fileID: 21300000, guid: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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 &1545678478 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1545678473} + m_CullTransparentMesh: 1 +--- !u!1 &1560497913 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1560497914} + - component: {fileID: 1560497916} + - component: {fileID: 1560497915} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1560497914 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1560497913} + 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: 1280987658} + 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: -10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1560497915 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1560497913} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_OnValueChanged: + m_text: Send + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + 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 &1560497916 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1560497913} + m_CullTransparentMesh: 1 +--- !u!1 &1564534877 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1564534878} + - component: {fileID: 1564534880} + - component: {fileID: 1564534879} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1564534878 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1564534877} + 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: 802456208} + 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: -10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1564534879 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1564534877} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_OnTouchScreenKeyboardStatusChanged: + m_text: Loading... + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + 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 &1564534880 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1564534877} + m_CullTransparentMesh: 1 +--- !u!1 &1614547398 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1614547399} + - component: {fileID: 1614547401} + - component: {fileID: 1614547400} + 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 &1614547399 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1614547398} + 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: 2070597442} + 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 &1614547400 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1614547398} + 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.25490198, g: 0.25490198, b: 0.25490198, 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 &1614547401 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1614547398} + m_CullTransparentMesh: 1 +--- !u!1 &1614894631 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1614894632} + - component: {fileID: 1614894634} + - component: {fileID: 1614894633} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1614894632 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1614894631} + 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: 836095706} + 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: 200, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1614894633 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1614894631} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Send Transactions + 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: 10 + m_fontSizeBase: 10 + m_fontWeight: 400 + m_enableAutoSizing: 0 + 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: 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 &1614894634 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1614894631} + m_CullTransparentMesh: 1 +--- !u!1 &1621712493 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1621712494} + - component: {fileID: 1621712497} + - component: {fileID: 1621712496} + - component: {fileID: 1621712495} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1621712494 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1621712493} + 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: 769043459} + 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 &1621712495 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1621712493} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1621712496 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1621712493} + 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: Enter message to sign... + 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: 4286611584 + m_fontColor: {r: 0.5, g: 0.5, b: 0.5, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 1 + 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 &1621712497 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1621712493} + m_CullTransparentMesh: 1 +--- !u!1 &1629483764 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1629483765} + - component: {fileID: 1629483768} + - component: {fileID: 1629483767} + - component: {fileID: 1629483766} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1629483765 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629483764} + 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: 2016817959} + m_Father: {fileID: 1757522697} + 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: 10, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1629483766 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629483764} + 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: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} + m_HighlightedColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_PressedColor: {r: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} + m_SelectedColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_DisabledColor: {r: 0, g: 0, b: 0, a: 1} + 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: 1321288304} + m_HandleRect: {fileID: 1321288303} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1629483767 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629483764} + 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: 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 &1629483768 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629483764} + m_CullTransparentMesh: 1 +--- !u!1 &1685000284 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1685000285} + - component: {fileID: 1685000291} + - component: {fileID: 1685000290} + - component: {fileID: 1685000289} + - component: {fileID: 1685000288} + - component: {fileID: 1685000287} + - component: {fileID: 1685000286} + m_Layer: 5 + m_Name: TransactionsButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1685000285 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1685000284} + 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: 1305107877} + - {fileID: 108717377} + m_Father: {fileID: 323220476} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 135, y: -80} + m_SizeDelta: {x: 240, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1685000286 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1685000284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e82dd5f4f6624e9caa5b03040ae2e6f2, type: 3} + m_Name: + m_EditorClassIdentifier: + _titleText: {fileID: 0} + _descriptionText: {fileID: 0} + _button: {fileID: 0} +--- !u!114 &1685000287 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1685000284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e82dd5f4f6624e9caa5b03040ae2e6f2, type: 3} + m_Name: + m_EditorClassIdentifier: + _titleText: {fileID: 1305107878} + _descriptionText: {fileID: 108717378} + _button: {fileID: 1685000289} +--- !u!114 &1685000288 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1685000284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 5 + m_Bottom: 5 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1685000289 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1685000284} + 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: 1685000290} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1050865743} + m_TargetAssemblyTypeName: Sequence.Boilerplates.EcosystemFeatureSelection, + SequenceBoilerplates + m_MethodName: OpenTransactions + 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 &1685000290 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1685000284} + 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.101960786, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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: 2 +--- !u!222 &1685000291 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1685000284} + m_CullTransparentMesh: 1 +--- !u!1 &1697771491 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1697771492} + - component: {fileID: 1697771494} + - component: {fileID: 1697771493} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1697771492 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697771491} + 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: 564597530} + 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: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1697771493 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697771491} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_ChildAlignment: 0 + m_Spacing: 2 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1697771494 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1697771491} + 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 &1721989092 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1721989093} + - component: {fileID: 1721989095} + - component: {fileID: 1721989094} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1721989093 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1721989092} + 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: 3495957624811024636} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: -40, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1721989094 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1721989092} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Sign In with Apple + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &1721989095 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1721989092} + m_CullTransparentMesh: 1 +--- !u!1 &1757522696 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1757522697} + - component: {fileID: 1757522700} + - component: {fileID: 1757522699} + - component: {fileID: 1757522698} + m_Layer: 5 + m_Name: Scroll View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1757522697 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1757522696} + 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: 564597530} + - {fileID: 1629483765} + m_Father: {fileID: 683925400} + 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: 210, y: 60} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1757522698 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1757522696} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 1697771492} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 564597530} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1629483766} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1757522699 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1757522696} + 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: 0} + 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 &1757522700 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1757522696} + m_CullTransparentMesh: 1 +--- !u!1 &1762646610 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1762646611} + - component: {fileID: 1762646613} + - component: {fileID: 1762646612} + m_Layer: 5 + m_Name: Description Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1762646611 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1762646610} + 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: 696230464} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 115, y: 3.5} + m_SizeDelta: {x: 210, y: -7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1762646612 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1762646610} + 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: Wallet Profile + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2583691263 + m_fontColor: {r: 1, g: 1, b: 1, a: 0.6} + 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: 8 + m_fontSizeBase: 10 + 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 &1762646613 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1762646610} + m_CullTransparentMesh: 1 +--- !u!1 &1788955834 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1788955835} + - component: {fileID: 1788955837} + - component: {fileID: 1788955836} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1788955835 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788955834} + 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: 1050865742} + 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 &1788955836 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788955834} + 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: 76b048e2d7f8e459ca9b54c935448f66, type: 3} + 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 &1788955837 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788955834} + m_CullTransparentMesh: 1 +--- !u!1 &1853883865 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1853883866} + - component: {fileID: 1853883870} + - component: {fileID: 1853883869} + - component: {fileID: 1853883868} + - component: {fileID: 1853883867} + m_Layer: 5 + m_Name: SessionButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1853883866 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1853883865} + 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: 391644459} + m_Father: {fileID: 2097849100} + 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: -10, y: 0} + m_SizeDelta: {x: 60, y: 20} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1853883867 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1853883865} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &1853883868 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1853883865} + 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: 1853883869} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 2097849102} + m_TargetAssemblyTypeName: Sequence.Boilerplates.TransactionButton, SequenceBoilerplates + m_MethodName: AddSession + 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 &1853883869 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1853883865} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &1853883870 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1853883865} + m_CullTransparentMesh: 1 +--- !u!1 &1865608229 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1865608230} + - component: {fileID: 1865608231} + - component: {fileID: 1865608233} + - component: {fileID: 1865608232} + m_Layer: 5 + m_Name: PlayerProfile + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1865608230 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1865608229} + 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: 1102907216} + - {fileID: 5817571} + - {fileID: 9715030} + - {fileID: 865590364} + - {fileID: 683925400} + - {fileID: 2041315316} + - {fileID: 456269666} + m_Father: {fileID: 1050865742} + 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: 240, y: 295} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1865608231 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1865608229} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 96baada7b6cb742fab4e21a3c52de47b, type: 3} + m_Name: + m_EditorClassIdentifier: + _chain: 421614 + _messageInput: {fileID: 805083870} + _walletText: {fileID: 1407445815} + _signatureText: {fileID: 1477743773} + _signMessageButton: {fileID: 485743483} + _loadingOverlay: {fileID: 456269667} + _messagePopup: {fileID: 2041315317} + _sessionPool: + _amount: 10 + _setAsLastSibling: 1 + _parent: {fileID: 1697771492} + _prefab: {fileID: 7890725239804470961, guid: bfec625d64418404da8f952460922c70, type: 3} +--- !u!114 &1865608232 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1865608229} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eb6fa7d82312143d9b451ac5e7465a38, type: 3} + m_Name: + m_EditorClassIdentifier: + _start: 0.7 + _duration: 0.3 + _animationCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 2 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.77346337 + value: 1.1153979 + inSlope: -0.25566182 + outSlope: -0.25566182 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.7318018 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: -0.17961398 + outSlope: -0.17961398 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.6227655 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!225 &1865608233 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1865608229} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &1870792377 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1870792378} + - component: {fileID: 1870792381} + - component: {fileID: 1870792380} + - component: {fileID: 1870792379} + m_Layer: 5 + m_Name: Loading + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1870792378 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1870792377} + 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: 1423415636} + m_Father: {fileID: 696230464} + 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: -10, y: 0} + m_SizeDelta: {x: 60, y: 20} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1870792379 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1870792377} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &1870792380 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1870792377} + 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.15, g: 0.15, b: 0.15, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &1870792381 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1870792377} + m_CullTransparentMesh: 1 +--- !u!1 &1883453220 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1883453221} + - component: {fileID: 1883453223} + - component: {fileID: 1883453222} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1883453221 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883453220} + 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: 512459741} + 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: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1883453222 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883453220} + 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: 7587ac7b3e6c1471ca5ab6307ab32ec5, 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 &1883453223 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883453220} + m_CullTransparentMesh: 1 +--- !u!1 &1979708984 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1979708985} + - component: {fileID: 1979708988} + - component: {fileID: 1979708987} + - component: {fileID: 1979708986} + m_Layer: 5 + m_Name: Scrollbar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1979708985 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1979708984} + 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: 1267233531} + m_Father: {fileID: 17360257} + 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 &1979708986 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1979708984} + 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: 161099259} + m_HandleRect: {fileID: 161099258} + m_Direction: 2 + m_Value: 0 + m_Size: 0.2 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1979708987 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1979708984} + 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 &1979708988 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1979708984} + m_CullTransparentMesh: 1 +--- !u!1 &1993833654 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1993833655} + - component: {fileID: 1993833657} + - component: {fileID: 1993833656} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1993833655 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993833654} + 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: 485743481} + 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: 7, y: 7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1993833656 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993833654} + 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: 7bff9d6884f5e4bee9b34e722bf48b70, 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 &1993833657 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993833654} + m_CullTransparentMesh: 1 +--- !u!1 &2016817958 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2016817959} + 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 &2016817959 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2016817958} + 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: 1321288303} + m_Father: {fileID: 1629483765} + 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 &2030306414 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2030306415} + - component: {fileID: 2030306417} + - component: {fileID: 2030306416} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2030306415 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2030306414} + 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: 659355502} + 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: -10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2030306416 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2030306414} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Send + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + 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 &2030306417 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2030306414} + m_CullTransparentMesh: 1 +--- !u!1001 &2041315315 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1865608230} + m_Modifications: + - target: {fileID: 607308253010258378, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_Name + value: MessagePopup + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_Pivot.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_SizeDelta.y + value: 30 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchoredPosition.y + value: -5 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} +--- !u!224 &2041315316 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + m_PrefabInstance: {fileID: 2041315315} + m_PrefabAsset: {fileID: 0} +--- !u!114 &2041315317 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 3421921267587625916, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + m_PrefabInstance: {fileID: 2041315315} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ca9893608c30f46418c1a2d78b609df9, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &2053860376 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2053860377} + - component: {fileID: 2053860380} + - component: {fileID: 2053860379} + - component: {fileID: 2053860378} + m_Layer: 5 + m_Name: VersionText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2053860377 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053860376} + 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: 1050865742} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -5, y: 5} + m_SizeDelta: {x: 300, y: 10} + m_Pivot: {x: 1, y: 0} +--- !u!114 &2053860378 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053860376} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66917f722796445f1a9d5d54218cd973, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &2053860379 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053860376} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Version + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2583691263 + m_fontColor: {r: 1, g: 1, b: 1, a: 0.6} + 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 4 + 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 &2053860380 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2053860376} + m_CullTransparentMesh: 1 +--- !u!1 &2061216281 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2061216282} + - component: {fileID: 2061216284} + - component: {fileID: 2061216283} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2061216282 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2061216281} + 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: 1545678474} + 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: 7, y: 7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2061216283 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2061216281} + 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: 7eeaa0f6357c9474abdf30939e119719, 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 &2061216284 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2061216281} + m_CullTransparentMesh: 1 +--- !u!1 &2064835421 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2064835422} + - component: {fileID: 2064835424} + - component: {fileID: 2064835423} + m_Layer: 5 + m_Name: Title Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2064835422 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2064835421} + 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: 1242786027} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 115, y: -3.5} + m_SizeDelta: {x: 210, y: -7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2064835423 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2064835421} + 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: Wallet Profile + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 10 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &2064835424 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2064835421} + m_CullTransparentMesh: 1 +--- !u!1 &2070597441 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2070597442} + - component: {fileID: 2070597443} + m_Layer: 5 + m_Name: Item + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2070597442 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2070597441} + 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: 1614547399} + - {fileID: 1172248267} + - {fileID: 48218464} + m_Father: {fileID: 130231371} + 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 &2070597443 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2070597441} + 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.8627451, g: 0.8627451, b: 0.8627451, a: 1} + m_PressedColor: {r: 0.7075472, g: 0.7075472, b: 0.7075472, 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: 1614547400} + toggleTransition: 1 + graphic: {fileID: 1172248268} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &2097849099 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2097849100} + - component: {fileID: 2097849104} + - component: {fileID: 2097849103} + - component: {fileID: 2097849102} + m_Layer: 5 + m_Name: ImplicitEmitButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2097849100 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2097849099} + 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: 1299434846} + - {fileID: 545395822} + - {fileID: 1853883866} + - {fileID: 1280987658} + - {fileID: 802456208} + m_Father: {fileID: 1146219656} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 130, y: -60} + m_SizeDelta: {x: 230, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2097849102 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2097849099} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5fa388a969190426facba008de2b8c43, type: 3} + m_Name: + m_EditorClassIdentifier: + _chain: 421614 + _transaction: + k__BackingField: 0x33985d320809E26274a72E03268c8a29927Bc6dA + k__BackingField: implicitEmit() + _loadingObject: {fileID: 802456207} + _sessionButtonObject: {fileID: 1853883865} + _transactionButtonObject: {fileID: 1280987657} +--- !u!114 &2097849103 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2097849099} + 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.101960786, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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: 2 +--- !u!222 &2097849104 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2097849099} + m_CullTransparentMesh: 1 +--- !u!1 &2100922579 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2100922580} + - component: {fileID: 2100922583} + - component: {fileID: 2100922582} + - component: {fileID: 2100922581} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2100922580 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100922579} + 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: 873417223} + m_Father: {fileID: 17360257} + 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 &2100922581 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100922579} + 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 &2100922582 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100922579} + m_CullTransparentMesh: 1 +--- !u!114 &2100922583 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100922579} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &2145386559 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2145386560} + - component: {fileID: 2145386562} + - component: {fileID: 2145386561} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2145386560 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2145386559} + 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: 319937704} + 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 &2145386561 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2145386559} + 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.12, g: 0.12, b: 0.12, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &2145386562 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2145386559} + m_CullTransparentMesh: 1 +--- !u!1 &320339275645968252 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4209220039127894524} + - component: {fileID: 4993712313665796667} + - component: {fileID: 7675607662054216073} + m_Layer: 5 + m_Name: LoginState + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &364841223076288887 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1185936199800087165} + 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: 3251032449294067148} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: -40, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &380487859157681410 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8750106440804939110} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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!1 &1039274815797997968 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4231729613209684367} + - component: {fileID: 7376973567988763871} + - component: {fileID: 8218687474100291355} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1129766508066712729 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2433697561466855871} + 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: 1492627057} + - {fileID: 900828005} + m_Father: {fileID: 4209220039127894524} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 105, y: -115} + m_SizeDelta: {x: 210, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1181566138228532167 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8496890551459878638} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, 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: 8046914839405764275} + m_TextViewport: {fileID: 2364319422627657610} + m_TextComponent: {fileID: 4346455832680865383} + m_Placeholder: {fileID: 2369011026816092588} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 0 + m_RegexValue: + m_GlobalPointSize: 14 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!1 &1185936199800087165 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 364841223076288887} + - component: {fileID: 7147867555355416424} + - component: {fileID: 4272771836669574709} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1365941811581567776 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2433697561466855871} + 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: 3025777727642342367} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignInWithGoogle + 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 &1392859846450567624 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7526353788427293348} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: -8, y: -5, z: -8, w: -5} + m_Softness: {x: 0, y: 0} +--- !u!114 &1459061464521247473 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8750106440804939110} + 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: 380487859157681410} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 8496890551459878638} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 8750106440804939110} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + 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 + - m_Target: {fileID: 1181566138228532167} + m_TargetAssemblyTypeName: UnityEngine.UI.Selectable, UnityEngine.UI + m_MethodName: Select + 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!224 &1654620268838434455 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2673375261290894866} + 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: 7691379925437972861} + 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: 7, y: 7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &2198483992803733903 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9144345594371459775} + 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: 5231001844959997297} + - {fileID: 5231001846775536177} + - {fileID: 191605878} + - {fileID: 4209220039127894524} + - {fileID: 8737090446545054563} + - {fileID: 5107492344900098707} + m_Father: {fileID: 1050865742} + 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: 240, y: 420} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2325936309338030303 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8297224220932671038} + 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: 2719765420686600780} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignInWithEmail + 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!224 &2364319422627657610 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7526353788427293348} + 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: 3245547436246206480} + - {fileID: 8577953651209467930} + m_Father: {fileID: 7053000246198018492} + 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: -10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2369011026816092588 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6427513404366440442} + 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: Enter email... + 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: 4286611584 + m_fontColor: {r: 0.5, g: 0.5, b: 0.5, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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: 1 + 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!1 &2433697561466855871 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1129766508066712729} + - component: {fileID: 5022763554724267541} + - component: {fileID: 3025777727642342367} + - component: {fileID: 1365941811581567776} + - component: {fileID: 9122750164851673669} + m_Layer: 5 + m_Name: GoogleButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &2673375261290894866 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1654620268838434455} + - component: {fileID: 5736418155645019230} + - component: {fileID: 4821899330820860530} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2719765420686600780 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8297224220932671038} + 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.26666668, g: 0.06666667, b: 0.88235295, 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_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_CustomCaretColor: 0 - m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} - m_Text: - m_CaretBlinkRate: 0.85 - m_CaretWidth: 1 - m_ReadOnly: 0 - m_RichText: 1 - m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_OnFocusSelectAll: 1 - m_ResetOnDeActivation: 1 - m_RestoreOriginalTextOnEscape: 1 - m_isRichTextEditingAllowed: 0 - m_LineLimit: 0 - m_InputValidator: {fileID: 0} ---- !u!1 &1185936199800087165 + m_Sprite: {fileID: 21300000, guid: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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!1 &2830074820831578477 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -10421,17 +13850,36 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 364841223076288887} - - component: {fileID: 7147867555355416424} - - component: {fileID: 4272771836669574709} + - component: {fileID: 2856355940061643817} m_Layer: 5 - m_Name: Text (TMP) + m_Name: EmailOption m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &1365941811581567776 +--- !u!224 &2856355940061643817 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2830074820831578477} + 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: 3251032449294067148} + - {fileID: 7053000246198018492} + m_Father: {fileID: 4209220039127894524} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 105, y: -80} + m_SizeDelta: {x: 210, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &3025777727642342367 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -10440,203 +13888,156 @@ MonoBehaviour: m_GameObject: {fileID: 2433697561466855871} 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: 3025777727642342367} - m_OnClick: + m_Material: {fileID: 0} + m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, 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_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceExamples - m_MethodName: SignInWithGoogle - 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 &1392859846450567624 -MonoBehaviour: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &3191167764104979517 +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7526353788427293348} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: {x: -8, y: -5, z: -8, w: -5} - m_Softness: {x: 0, y: 0} ---- !u!114 &1459061464521247473 -MonoBehaviour: + m_GameObject: {fileID: 5045421231128479223} + m_CullTransparentMesh: 1 +--- !u!224 &3245547436246206480 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8750106440804939110} - 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: 380487859157681410} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 8496890551459878638} - m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine - m_MethodName: SetActive - m_Mode: 6 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 1 - m_CallState: 2 - - m_Target: {fileID: 8750106440804939110} - m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine - m_MethodName: SetActive - m_Mode: 6 - 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 - - m_Target: {fileID: 1181566138228532167} - m_TargetAssemblyTypeName: UnityEngine.UI.Selectable, UnityEngine.UI - m_MethodName: Select - 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!224 &1654620268838434455 + m_GameObject: {fileID: 6427513404366440442} + 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: 2364319422627657610} + 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!224 &3251032449294067148 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2673375261290894866} - 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: 7691379925437972861} - 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: 7, y: 7} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!224 &2198483992803733903 + m_GameObject: {fileID: 8750106440804939110} + 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: 364841223076288887} + - {fileID: 4231729613209684367} + m_Father: {fileID: 2856355940061643817} + 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!222 &3251968527161606064 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8750106440804939110} + m_CullTransparentMesh: 1 +--- !u!114 &3262654725830805818 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5014169504580503362} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e82dd5f4f6624e9caa5b03040ae2e6f2, type: 3} + m_Name: + m_EditorClassIdentifier: + _titleText: {fileID: 5014169504311983885} + _descriptionText: {fileID: 5014169504110139587} + _button: {fileID: 5014169504580503364} +--- !u!224 &3495957624811024636 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9144345594371459775} + m_GameObject: {fileID: 6879894437146287264} 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: 5231001844959997297} - - {fileID: 5231001846775536177} - - {fileID: 906953579} - - {fileID: 191605878} - - {fileID: 4209220039127894524} - - {fileID: 220577105} - - {fileID: 8737090446545054563} - - {fileID: 5107492344900098707} - m_Father: {fileID: 1050865742} - m_RootOrder: 1 + - {fileID: 1721989093} + - {fileID: 1446444769} + m_Father: {fileID: 4209220039127894524} 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: 240, y: 420} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 105, y: -150} + m_SizeDelta: {x: 210, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &2325936309338030303 +--- !u!114 &3833055132679331405 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8297224220932671038} + m_GameObject: {fileID: 6879894437146287264} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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!114 &4113369433531552208 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6879894437146287264} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} @@ -10670,14 +14071,14 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 2719765420686600780} + m_TargetGraphic: {fileID: 3833055132679331405} m_OnClick: m_PersistentCalls: m_Calls: - m_Target: {fileID: 9144345594371459776} m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, SequenceExamples - m_MethodName: SignInWithEmail + m_MethodName: SignInWithApple m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} @@ -10687,35 +14088,67 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 ---- !u!224 &2364319422627657610 +--- !u!224 &4209220039127894524 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7526353788427293348} + m_GameObject: {fileID: 320339275645968252} 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: 3245547436246206480} - - {fileID: 8577953651209467930} - m_Father: {fileID: 7053000246198018492} - m_RootOrder: 0 + - {fileID: 1115529825} + - {fileID: 722266041} + - {fileID: 467585876} + - {fileID: 2856355940061643817} + - {fileID: 1129766508066712729} + - {fileID: 3495957624811024636} + - {fileID: 512459741} + - {fileID: 203863150} + m_Father: {fileID: 2198483992803733903} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {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: -20, y: -10} + m_AnchoredPosition: {x: 0, y: -40} + m_SizeDelta: {x: -30, y: 235} + m_Pivot: {x: 0.5, y: 1} +--- !u!224 &4231729613209684367 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1039274815797997968} + 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: 3251032449294067148} + 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: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &2369011026816092588 +--- !u!222 &4271752886393600173 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8496890551459878638} + m_CullTransparentMesh: 1 +--- !u!114 &4272771836669574709 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6427513404366440442} + m_GameObject: {fileID: 1185936199800087165} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -10723,23 +14156,23 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Enter email... + m_text: Email address m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4286611584 - m_fontColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -10772,13 +14205,13 @@ MonoBehaviour: m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_enableWordWrapping: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_enableExtraPadding: 1 + m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 m_parseCtrlCharacters: 1 @@ -10795,247 +14228,120 @@ MonoBehaviour: 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!1 &2433697561466855871 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1129766508066712729} - - component: {fileID: 5022763554724267541} - - component: {fileID: 3025777727642342367} - - component: {fileID: 1365941811581567776} - - component: {fileID: 9122750164851673669} - m_Layer: 5 - m_Name: GoogleButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &2673375261290894866 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1654620268838434455} - - component: {fileID: 5736418155645019230} - - component: {fileID: 4821899330820860530} - m_Layer: 5 - m_Name: Image (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &2719765420686600780 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8297224220932671038} - 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.26666668, g: 0.06666667, b: 0.88235295, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} - m_Type: 1 - 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!1 &2830074820831578477 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2856355940061643817} - m_Layer: 5 - m_Name: EmailOption - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2856355940061643817 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2830074820831578477} - 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: 3251032449294067148} - - {fileID: 7053000246198018492} - m_Father: {fileID: 4209220039127894524} - 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: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &3025777727642342367 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &4346455832680865383 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2433697561466855871} + m_GameObject: {fileID: 5045421231128479223} 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} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, 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: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 - 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 &3191167764104979517 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5045421231128479223} - m_CullTransparentMesh: 1 ---- !u!224 &3245547436246206480 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6427513404366440442} - 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: 2364319422627657610} - 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!224 &3251032449294067148 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8750106440804939110} - 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: 364841223076288887} - - {fileID: 4231729613209684367} - m_Father: {fileID: 2856355940061643817} - 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!222 &3251968527161606064 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8750106440804939110} - m_CullTransparentMesh: 1 ---- !u!224 &3495957624811024636 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6879894437146287264} - 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: 1721989093} - - {fileID: 1446444769} - m_Father: {fileID: 4209220039127894524} - m_RootOrder: 5 - 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: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &3833055132679331405 + m_text: "\u200B" + 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: 8 + m_fontSizeBase: 8 + 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: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + 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!114 &4821899330820860530 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6879894437146287264} + m_GameObject: {fileID: 2673375261290894866} 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.19215687, g: 0.19215687, b: 0.19215687, 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: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 + m_Sprite: {fileID: 21300000, guid: 7bff9d6884f5e4bee9b34e722bf48b70, type: 3} + m_Type: 0 m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 @@ -11044,126 +14350,97 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!114 &4113369433531552208 +--- !u!222 &4896115008353292649 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6427513404366440442} + m_CullTransparentMesh: 1 +--- !u!114 &4936300011644007728 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6879894437146287264} + m_GameObject: {fileID: 8297224220932671038} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, 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: 3833055132679331405} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceExamples - m_MethodName: SignInWithApple - 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!224 &4209220039127894524 -RectTransform: + m_ShowMaskGraphic: 1 +--- !u!114 &4993712313665796667 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 320339275645968252} + 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: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &5014169504110139585 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 320339275645968252} - 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: 1115529825} - - {fileID: 722266041} - - {fileID: 467585876} - - {fileID: 2856355940061643817} - - {fileID: 1129766508066712729} - - {fileID: 3495957624811024636} - - {fileID: 512459741} - - {fileID: 203863150} - m_Father: {fileID: 2198483992803733903} - m_RootOrder: 4 - 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: -40} - m_SizeDelta: {x: -30, y: 0} - m_Pivot: {x: 0.5, y: 1} ---- !u!224 &4231729613209684367 + serializedVersion: 6 + m_Component: + - component: {fileID: 5014169504110139586} + - component: {fileID: 5014169504110139588} + - component: {fileID: 5014169504110139587} + m_Layer: 5 + m_Name: Description Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5014169504110139586 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1039274815797997968} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 5014169504110139585} + 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: 3251032449294067148} - m_RootOrder: 1 + m_Father: {fileID: 5014169504580503363} 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: 15, y: 0} - m_SizeDelta: {x: 10, y: 10} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -27.5} + m_SizeDelta: {x: 220, y: 15.000001} m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &4271752886393600173 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8496890551459878638} - m_CullTransparentMesh: 1 ---- !u!114 &4272771836669574709 +--- !u!114 &5014169504110139587 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1185936199800087165} + m_GameObject: {fileID: 5014169504110139585} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -11171,13 +14448,13 @@ MonoBehaviour: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 + m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Email address + m_text: Sign messages & view available sessions. m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -11186,8 +14463,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} + rgba: 2583691263 + m_fontColor: {r: 1, g: 1, b: 1, a: 0.6} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -11210,7 +14487,7 @@ MonoBehaviour: m_enableAutoSizing: 0 m_fontSizeMin: 18 m_fontSizeMax: 72 - m_fontStyle: 1 + m_fontStyle: 0 m_HorizontalAlignment: 1 m_VerticalAlignment: 512 m_textAlignment: 65535 @@ -11246,13 +14523,58 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!114 &4346455832680865383 +--- !u!222 &5014169504110139588 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5014169504110139585} + m_CullTransparentMesh: 1 +--- !u!1 &5014169504311983883 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5014169504311983884} + - component: {fileID: 5014169504311983886} + - component: {fileID: 5014169504311983885} + m_Layer: 5 + m_Name: Title Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5014169504311983884 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5014169504311983883} + 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: 5014169504580503363} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -12.5} + m_SizeDelta: {x: 220, y: 15.000001} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &5014169504311983885 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5045421231128479223} + m_GameObject: {fileID: 5014169504311983883} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -11266,10 +14588,10 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: "\u200B" + m_text: Wallet Profile m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -11294,12 +14616,12 @@ MonoBehaviour: serializedVersion: 2 rgba: 4294967295 m_fontSize: 8 - m_fontSizeBase: 8 + m_fontSizeBase: 10 m_fontWeight: 400 m_enableAutoSizing: 0 m_fontSizeMin: 18 m_fontSizeMax: 72 - m_fontStyle: 0 + m_fontStyle: 1 m_HorizontalAlignment: 1 m_VerticalAlignment: 512 m_textAlignment: 65535 @@ -11309,13 +14631,13 @@ MonoBehaviour: m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_enableWordWrapping: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_enableExtraPadding: 1 + m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 m_parseCtrlCharacters: 1 @@ -11335,83 +14657,193 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!114 &4821899330820860530 +--- !u!222 &5014169504311983886 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5014169504311983883} + m_CullTransparentMesh: 1 +--- !u!1 &5014169504580503362 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5014169504580503363} + - component: {fileID: 5014169504580503366} + - component: {fileID: 5014169504580503365} + - component: {fileID: 5014169504580503364} + - component: {fileID: 5014169504580503368} + - component: {fileID: 3262654725830805818} + - component: {fileID: 5014169504580503369} + m_Layer: 5 + m_Name: ProfileButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5014169504580503363 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5014169504580503362} + 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: 5014169504311983884} + - {fileID: 5014169504110139586} + m_Father: {fileID: 323220476} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 135, y: -35} + m_SizeDelta: {x: 240, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &5014169504580503364 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2673375261290894866} + m_GameObject: {fileID: 5014169504580503362} + 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: 5014169504580503365} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1050865743} + m_TargetAssemblyTypeName: Sequence.Boilerplates.EcosystemFeatureSelection, + SequenceBoilerplates + m_MethodName: OpenProfile + 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 &5014169504580503365 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5014169504580503362} 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_Color: {r: 0.101960786, g: 0.101960786, b: 0.101960786, 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: 7bff9d6884f5e4bee9b34e722bf48b70, type: 3} - m_Type: 0 - m_PreserveAspect: 1 + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &4896115008353292649 + m_PixelsPerUnitMultiplier: 2 +--- !u!222 &5014169504580503366 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6427513404366440442} + m_GameObject: {fileID: 5014169504580503362} m_CullTransparentMesh: 1 ---- !u!114 &4936300011644007728 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8297224220932671038} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &4993712313665796667 +--- !u!114 &5014169504580503368 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 320339275645968252} + m_GameObject: {fileID: 5014169504580503362} 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_Left: 10 + m_Right: 10 + m_Top: 5 + m_Bottom: 5 m_ChildAlignment: 0 - m_Spacing: 5 + m_Spacing: 0 m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 1 m_ChildControlWidth: 1 - m_ChildControlHeight: 0 + m_ChildControlHeight: 1 m_ChildScaleWidth: 0 m_ChildScaleHeight: 0 m_ReverseArrangement: 0 +--- !u!114 &5014169504580503369 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5014169504580503362} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e82dd5f4f6624e9caa5b03040ae2e6f2, type: 3} + m_Name: + m_EditorClassIdentifier: + _titleText: {fileID: 0} + _descriptionText: {fileID: 0} + _button: {fileID: 0} --- !u!222 &5022763554724267541 CanvasRenderer: m_ObjectHideFlags: 0 @@ -11443,6 +14875,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 2198483992803733903} m_Modifications: - target: {fileID: 3094631411173026328, guid: 21aa1af318f304faca1367525db9bc28, type: 3} @@ -11463,7 +14896,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} propertyPath: m_RootOrder - value: 7 + value: 6 objectReference: {fileID: 0} - target: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} propertyPath: m_AnchorMax.x @@ -11546,6 +14979,9 @@ PrefabInstance: value: 1 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 21aa1af318f304faca1367525db9bc28, type: 3} --- !u!224 &5107492344900098707 stripped RectTransform: @@ -11603,7 +15039,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2198483992803733903} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -11739,7 +15174,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2198483992803733903} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1} @@ -11834,7 +15268,6 @@ RectTransform: - {fileID: 2364319422627657610} - {fileID: 7691379925437972861} m_Father: {fileID: 2856355940061643817} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -11930,7 +15363,6 @@ RectTransform: m_Children: - {fileID: 1654620268838434455} m_Father: {fileID: 7053000246198018492} - 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} @@ -12087,7 +15519,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2364319422627657610} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -12119,28 +15550,13 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 2198483992803733903} m_Modifications: - target: {fileID: 607308253010258378, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_Name value: MessagePopup objectReference: {fileID: 0} - - target: {fileID: 607308253010258378, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 1535245597814173636, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} - propertyPath: m_AnchoredPosition.x - value: 10 - objectReference: {fileID: 0} - - target: {fileID: 2058581237705155925, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} - propertyPath: m_AnchoredPosition.x - value: 10 - objectReference: {fileID: 0} - - target: {fileID: 3205133098445542216, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} - propertyPath: m_AnchoredPosition.x - value: -10 - objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_Pivot.x value: 0.5 @@ -12149,10 +15565,6 @@ PrefabInstance: propertyPath: m_Pivot.y value: 1 objectReference: {fileID: 0} - - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} - propertyPath: m_RootOrder - value: 6 - objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_AnchorMax.x value: 1 @@ -12225,11 +15637,10 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 7859111590571459659, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} - propertyPath: m_text - value: - objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} --- !u!224 &8737090446545054563 stripped RectTransform: @@ -12356,7 +15767,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!114 &9144345594371459776 MonoBehaviour: m_ObjectHideFlags: 0 @@ -12373,19 +15784,21 @@ MonoBehaviour: _chain: 421614 _emailLoginButton: {fileID: 1459061464521247473} _emailContinueButton: {fileID: 2325936309338030303} - _signOutButton: {fileID: 906953581} - _signMessageButton: {fileID: 2082724707} _chainDropdown: {fileID: 191605879} _emailInput: {fileID: 1181566138228532167} - _messageInput: {fileID: 541267865} - _walletText: {fileID: 1610280877} - _signatureText: {fileID: 455107487} _loginState: {fileID: 320339275645968252} - _walletState: {fileID: 220577104} _loadingOverlay: {fileID: 1084335994} _messagePopup: {fileID: 8737090446545054564} _sessionPool: _amount: 20 _setAsLastSibling: 1 - _parent: {fileID: 409830143} + _parent: {fileID: 0} _prefab: {fileID: 7890725239804470961, guid: bfec625d64418404da8f952460922c70, type: 3} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 116513913} + - {fileID: 1126746401} + - {fileID: 1050865742} + - {fileID: 628532637} diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo/Resources/Prefabs/Common/MessagePopup.prefab b/Packages/Sequence-Unity/Sequence/Samples~/Demo/Resources/Prefabs/Common/MessagePopup.prefab index fa57cf67..dad53229 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo/Resources/Prefabs/Common/MessagePopup.prefab +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo/Resources/Prefabs/Common/MessagePopup.prefab @@ -37,7 +37,6 @@ RectTransform: - {fileID: 1535245597814173636} - {fileID: 3205133098445542216} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} @@ -150,7 +149,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 7657044420813839511} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -226,7 +224,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3205133098445542216} - 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} @@ -302,11 +299,10 @@ RectTransform: - {fileID: 147866370231799844} - {fileID: 6418605119827442569} m_Father: {fileID: 7657044420813839511} - m_RootOrder: 3 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: 12.5, y: 0} + m_AnchoredPosition: {x: 15, y: 0} m_SizeDelta: {x: 15, y: 15} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &5566617806652957958 @@ -340,7 +336,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1535245597814173636} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -416,7 +411,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2058581237705155925} - 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} @@ -492,7 +486,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2058581237705155925} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -568,7 +561,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 7657044420813839511} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -703,7 +695,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1535245597814173636} - 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} @@ -779,7 +770,6 @@ RectTransform: - {fileID: 5342344470116306133} - {fileID: 2296930642534087635} m_Father: {fileID: 7657044420813839511} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 0, y: 0.5} @@ -819,7 +809,6 @@ RectTransform: m_Children: - {fileID: 6600225623156903514} m_Father: {fileID: 7657044420813839511} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs index 865298c7..5883b759 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs @@ -1,20 +1,59 @@ +using Sequence.EcosystemWallet; using UnityEngine; namespace Sequence.Boilerplates { public class EcosystemFeatureSelection : MonoBehaviour { + [SerializeField] private SequenceEcosystemWalletWindow _login; + [SerializeField] private GameObject _featureSelection; [SerializeField] private EcosystemWalletProfile _profile; [SerializeField] private EcosystemWalletTransactions _transactions; + private IWallet _wallet; + + private void Start() + { + SequenceWallet.Disconnected += OpenLogin; + SequenceWallet.WalletCreated += wallet => + { + _wallet = wallet; + OpenFeatureSelection(); + }; + + _login.gameObject.SetActive(false); + _featureSelection.SetActive(false); + _profile.gameObject.SetActive(false); + _transactions.gameObject.SetActive(false); + + _wallet = SequenceWallet.RecoverFromStorage(); + if (_wallet == null) + OpenLogin(); + else + OpenFeatureSelection(); + } + + public void OpenLogin() + { + _login.Open(); + } + + public void OpenFeatureSelection() + { + _login.gameObject.SetActive(false); + _featureSelection.SetActive(true); + } + public void OpenProfile() { - _profile.Load(null); + _featureSelection.SetActive(false); + _profile.Load(_wallet, OpenFeatureSelection); } public void OpenTransactions() { - _transactions.Load(null); + _featureSelection.SetActive(false); + _transactions.Load(_wallet, OpenFeatureSelection); } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs index 6b817b46..a126bac0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs @@ -1,13 +1,117 @@ +using System; using Sequence.EcosystemWallet; +using TMPro; using UnityEngine; +using UnityEngine.Events; +using UnityEngine.UI; namespace Sequence.Boilerplates { public class EcosystemWalletProfile : MonoBehaviour { - public void Load(IWallet wallet) + [SerializeField] private Chain _chain; + [SerializeField] private TMP_InputField _messageInput; + [SerializeField] private TMP_Text _walletText; + [SerializeField] private TMP_Text _signatureText; + [SerializeField] private Button _signMessageButton; + [SerializeField] private GameObject _loadingOverlay; + [SerializeField] private MessagePopup _messagePopup; + [SerializeField] private GenericObjectPool _sessionPool; + + private IWallet _wallet; + private UnityAction _onClose; + private string _curSignature; + + public void Close() + { + gameObject.SetActive(false); + _onClose?.Invoke(); + } + + public void Load(IWallet wallet, UnityAction onClose) { + _wallet = wallet; + _onClose = onClose; + + _walletText.text = _wallet.Address; + _messageInput.text = string.Empty; + gameObject.SetActive(true); + _messagePopup.gameObject.SetActive(false); + + SetLoading(false); + LoadSessions(); + } + + public async void SignMessage() + { + var message = _messageInput.text; + SetLoading(true); + + try + { + var signature = await _wallet.SignMessage(_chain, message); + ShowSignature(signature.signature); + SetLoading(false); + } + catch (Exception e) + { + ShowError(e.Message); + } + } + + public void CopyWalletAddress() + { + CopyText(_wallet.Address.Value); + } + + public void CopySignature() + { + CopyText(_curSignature); + } + + private void CopyText(string text) + { + if (string.IsNullOrEmpty(text)) + { + _messagePopup.Show("Empty text", true); + return; + } + + GUIUtility.systemCopyBuffer = text; + _messagePopup.Show("Copied"); + } + + public void SignOut() + { + _wallet.Disconnect(); + gameObject.SetActive(false); + } + + private void ShowSignature(string signature) + { + _curSignature = signature; + _signatureText.text = signature; + _signMessageButton.interactable = !string.IsNullOrEmpty(_curSignature); + } + + private void ShowError(string error) + { + Debug.LogError(error); + _messagePopup.Show(error, true); + SetLoading(false); + } + + private void SetLoading(bool value) + { + _loadingOverlay.SetActive(value); + } + + private void LoadSessions() + { + _sessionPool.Cleanup(); + foreach (var wallet in _wallet.GetAllSigners()) + _sessionPool.GetObject().Apply(wallet); } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs index 1b2dfb5d..28b318a7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs @@ -1,5 +1,6 @@ using Sequence.EcosystemWallet; using UnityEngine; +using UnityEngine.Events; namespace Sequence.Boilerplates { @@ -7,8 +8,20 @@ public class EcosystemWalletTransactions : MonoBehaviour { [SerializeField] private TransactionButton[] _transactionButtons; - public void Load(IWallet wallet) + private IWallet _wallet; + private UnityAction _onClose; + + public void Close() { + gameObject.SetActive(false); + _onClose?.Invoke(); + } + + public void Load(IWallet wallet, UnityAction onClose) + { + _wallet = wallet; + _onClose = onClose; + gameObject.SetActive(true); foreach (var button in _transactionButtons) diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index 65271794..25a45612 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -1,14 +1,9 @@ using System; using System.Linq; -using System.Numerics; -using NBitcoin; using Sequence.EcosystemWallet; -using Sequence.EcosystemWallet.Primitives; -using Sequence.Utils; using TMPro; using UnityEngine; using UnityEngine.UI; -using Transaction = Sequence.EcosystemWallet.Transaction; namespace Sequence.Boilerplates { @@ -34,26 +29,18 @@ private enum ExplicitSessionType [Header("Components")] [SerializeField] private Button _emailLoginButton; [SerializeField] private Button _emailContinueButton; - [SerializeField] private Button _signOutButton; - [SerializeField] private Button _signMessageButton; [SerializeField] private TMP_Dropdown _chainDropdown; [SerializeField] private TMP_InputField _emailInput; - [SerializeField] private TMP_InputField _messageInput; - [SerializeField] private TMP_Text _walletText; - [SerializeField] private TMP_Text _signatureText; [SerializeField] private GameObject _loginState; - [SerializeField] private GameObject _walletState; [SerializeField] private GameObject _loadingOverlay; [SerializeField] private MessagePopup _messagePopup; [SerializeField] private GenericObjectPool _sessionPool; - private IWallet _wallet; private IConnect _connect; private ImplicitSessionType _implicitPermissions; private ExplicitSessionType _explicitPermissions; private int _selectedWallet; private string _curEmail; - private string _curSignature; private readonly Chain[] _chains = { @@ -66,6 +53,12 @@ private void Start() { _connect = new SequenceConnect(_ecosystem); _emailInput.onValueChanged.AddListener(VerifyEmailInput); + Open(); + } + + public void Open() + { + gameObject.SetActive(true); _messagePopup.gameObject.SetActive(false); _loadingOverlay.SetActive(false); @@ -73,14 +66,9 @@ private void Start() OnExplicitSessionTypeChanged(0); EnableWalletState(false); EnableEmailButton(true); - ShowSignature(string.Empty); _chainDropdown.ClearOptions(); _chainDropdown.AddOptions(_chains.Select(c => c.ToString()).ToList()); - - _wallet = SequenceWallet.RecoverFromStorage(); - if (_wallet != null) - ShowWallet(true); } public async void SignInWithEmail() @@ -89,8 +77,7 @@ public async void SignInWithEmail() try { - _wallet = await _connect.SignInWithEmail(_curEmail); - ShowWallet(false); + await _connect.SignInWithEmail(_curEmail); } catch (Exception e) { @@ -104,8 +91,7 @@ public async void SignInWithGoogle() try { - _wallet = await _connect.SignInWithGoogle(GetImplicitPermissions()); - ShowWallet(false); + await _connect.SignInWithGoogle(GetImplicitPermissions()); } catch (Exception e) { @@ -119,8 +105,7 @@ public async void SignInWithApple() try { - _wallet = await _connect.SignInWithApple(GetImplicitPermissions()); - ShowWallet(false); + await _connect.SignInWithApple(GetImplicitPermissions()); } catch (Exception e) { @@ -134,8 +119,7 @@ public async void SignInWithPasskey() try { - _wallet = await _connect.SignInWithPasskey(GetImplicitPermissions()); - ShowWallet(false); + await _connect.SignInWithPasskey(GetImplicitPermissions()); } catch (Exception e) { @@ -149,75 +133,13 @@ public async void SignInWithMnemonic() try { - _wallet = await _connect.SignInWithMnemonic(GetImplicitPermissions()); - ShowWallet(false); + await _connect.SignInWithMnemonic(GetImplicitPermissions()); } catch (Exception e) { ShowError(e.Message); } } - - public async void SignMessage() - { - var message = _messageInput.text; - SetLoading(true); - - try - { - var signature = await _wallet.SignMessage(_chain, message); - ShowSignature(signature.signature); - SetLoading(false); - } - catch (Exception e) - { - ShowError(e.Message); - } - } - - public void CopyWalletAddress() - { - CopyText(_wallet.Address.Value); - } - - public void CopySignature() - { - CopyText(_curSignature); - } - - private void CopyText(string text) - { - if (string.IsNullOrEmpty(text)) - { - _messagePopup.Show("Empty text", true); - return; - } - - GUIUtility.systemCopyBuffer = text; - _messagePopup.Show("Copied"); - } - - public async void AddExplicitSession() - { - SetLoading(true); - - try - { - await _wallet.AddSession(GetExplicitPermissions()); - SetLoading(false); - LoadSessions(); - } - catch (Exception e) - { - ShowError(e.Message); - } - } - - public void SignOut() - { - _wallet.Disconnect(); - EnableWalletState(false); - } public void OnChainChanged(int index) { @@ -241,42 +163,9 @@ private void ShowError(string error) SetLoading(false); } - private void ShowSignature(string signature) - { - _curSignature = signature; - _signatureText.text = signature; - _signMessageButton.interactable = !string.IsNullOrEmpty(_curSignature); - } - - private void ShowWallet(bool recovered) - { - _walletText.text = _wallet.Address.Value; - - LoadSessions(); - EnableWalletState(true); - SetLoading(false); - - if (!recovered) - _messagePopup.Show("Session Created."); - } - - private void RemoveSession(Address address) - { - LoadSessions(); - } - - private void LoadSessions() - { - _sessionPool.Cleanup(); - foreach (var wallet in _wallet.GetAllSigners()) - _sessionPool.GetObject().Apply(wallet, RemoveSession); - } - public void EnableWalletState(bool enable) { _loginState.SetActive(!enable); - _walletState.SetActive(enable); - _signOutButton.gameObject.SetActive(enable); var rect = transform as RectTransform; var size = rect.sizeDelta; @@ -290,37 +179,6 @@ public void EnableEmailButton(bool enable) _emailInput.gameObject.SetActive(!enable); } - public async void SendImplicitTransaction() - { - await _wallet.SendTransaction(Chain.TestnetArbitrumSepolia, new ITransaction[] - { - new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "implicitEmit()") - }); - } - - public async void SendExplicitTransaction() - { - await _wallet.SendTransaction(Chain.TestnetArbitrumSepolia, new ITransaction[] - { - new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "explicitEmit()") - }); - } - - public async void SendExplicitTransactionWithUsdc() - { - var txn = new ITransaction[] - { - new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "explicitEmit()") - }; - - var feeOptions = await _wallet.GetFeeOption(Chain.Optimism, txn); - var feeOption = feeOptions.First(o => o.token.symbol == "USDC"); - if (feeOption == null) - throw new Exception($"Fee option 'USDC' not available"); - - await _wallet.SendTransaction(Chain.Optimism, txn, feeOption); - } - private void SetLoading(bool value) { _loadingOverlay.SetActive(value); diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs index 4a05d7c1..898a758b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs @@ -12,18 +12,11 @@ public class SessionWalletTile : MonoBehaviour [SerializeField] private Button _removeButton; private Address _signer; - private Action
_onRemove; - public void Apply(Address signer, Action
onRemove) + public void Apply(Address signer) { _signer = signer; - _onRemove = onRemove; _addressText.text = $"{_signer}"; } - - public void Remove() - { - _onRemove?.Invoke(_signer); - } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index 3fccc32a..eb00777f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -39,7 +39,7 @@ public async Task SignInWithMnemonic(IPermissions permissions = null) private async Task SignIn(IPermissions permissions, string preferredLoginMethod, string email) { - var signer = await _client.CreateNewSession(false, permissions.GetPermissions(), preferredLoginMethod, email); + var signer = await _client.CreateNewSession(false, permissions?.GetPermissions(), preferredLoginMethod, email); return new SequenceWallet(new [] { signer }); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs index 6116f7dc..15742063 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs @@ -9,8 +9,8 @@ namespace Sequence.EcosystemWallet { internal class TransactionService { - private readonly SessionSigner[] _sessionSigners; - private readonly WalletState _state; + private SessionSigner[] _sessionSigners; + private WalletState _state; public TransactionService(SessionSigner[] sessionSigners, WalletState state) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs index e1fc9453..2438c1ba 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs @@ -5,12 +5,17 @@ using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Relayer; using Sequence.Utils; +using Unity.Plastic.Newtonsoft.Json; +using UnityEngine; using UnityEngine.Assertions; namespace Sequence.EcosystemWallet { public class SequenceWallet : IWallet { + public static Action WalletCreated; + public static Action Disconnected; + public Address Address { get; } private readonly WalletState _state; @@ -22,6 +27,8 @@ internal SequenceWallet(SessionSigner[] sessionSigners) _state = new WalletState(Address); _sessionSigners = sessionSigners; + + WalletCreated?.Invoke(this); } public static IWallet RecoverFromStorage() @@ -58,6 +65,7 @@ public void Disconnect() { SessionStorage.Clear(); _sessionSigners = Array.Empty(); + Disconnected?.Invoke(); } public async Task SignMessage(Chain chain, string message) @@ -90,8 +98,10 @@ public async Task GetFeeOption(Chain chain, ITransaction[] transact AssertSessionSigners(); await _state.Update(chain); + Debug.Log($"{JsonConvert.SerializeObject(_state.SessionsTopology.JsonSerialize())}"); var calls = transactions.GetCalls(); + Debug.Log($"_state == null {_state == null}"); var txnService = new TransactionService(_sessionSigners, _state); var transactionData = await txnService.SignAndBuild(chain, calls, false); var relayer = new SequenceRelayer(chain); @@ -145,7 +155,7 @@ public async Task SendTransaction(Chain chain, ITransaction[] transactio if (receipt == null) throw new Exception("receipt is null"); - return receipt.txnReceipt; + return receipt.txnHash; } public async Task SupportsTransaction(Chain chain, ITransaction transaction) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs index 57bbc559..bf9648d6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs @@ -63,21 +63,12 @@ public async Task IsSupportedCall(Call call, Chain chain, SessionsTopology { return true; } - + var supportedPermission = FindSupportedPermission(call, topology); return supportedPermission.Index >= 0; } - var response = await new SequenceEthClient(chain).CallContract(new object[] { - new - { - to = call.to, - data = GetAcceptImplicitRequestFunctionAbi(call) - } - }); - - var expectedResult = GenerateImplicitRequestMagic(ParentAddress, _credentials.attestation); - return response == expectedResult; + return await CheckAcceptImplicitRequest(chain, call); } private (int Index, Permission Permission) FindSupportedPermission(Call call, SessionsTopology topology) @@ -108,12 +99,12 @@ public async Task IsSupportedCall(Call call, Chain chain, SessionsTopology return (permissionIndex, sessionPermissions.permissions[permissionIndex]); } - public SessionCallSignature SignCall(Call call, SessionsTopology topology, BigInteger space, BigInteger nonce) + public SessionCallSignature SignCall(Chain chain, Call call, SessionsTopology topology, BigInteger space, BigInteger nonce) { var pvKey = _credentials.privateKey; var eoaWallet = new EOAWallet(pvKey); - var hashedCall = HashCallWithReplayProtection(call, space, nonce); + var hashedCall = HashCallWithReplayProtection(chain, call, space, nonce); var signedCall = EthSignature.Sign(hashedCall, eoaWallet.privKey); var rsy = RSY.UnpackFrom65(signedCall.HexStringToByteArray()); @@ -144,9 +135,9 @@ public SessionCallSignature SignCall(Call call, SessionsTopology topology, BigIn }; } - private byte[] HashCallWithReplayProtection(Call call, BigInteger space, BigInteger nonce) + private byte[] HashCallWithReplayProtection(Chain chain, Call call, BigInteger space, BigInteger nonce) { - var chainBytes = BigInteger.Parse(Chain.GetChainId()).ByteArrayFromNumber(32); + var chainBytes = BigInteger.Parse(chain.GetChainId()).ByteArrayFromNumber(32); var spaceBytes = space.ByteArrayFromNumber(32); var nonceBytes = nonce.ByteArrayFromNumber(32); var callHashBytes = call.Hash().HexStringToByteArray(); @@ -154,6 +145,28 @@ private byte[] HashCallWithReplayProtection(Call call, BigInteger space, BigInte var concatenated = ByteArrayExtensions.ConcatenateByteArrays(chainBytes, spaceBytes, nonceBytes, callHashBytes); return SequenceCoder.KeccakHash(concatenated); } + + private async Task CheckAcceptImplicitRequest(Chain chain, Call call) + { + try + { + var response = await new SequenceEthClient(chain).CallContract(new object[] + { + new + { + to = call.to, + data = GetAcceptImplicitRequestFunctionAbi(call) + } + }); + + var expectedResult = GenerateImplicitRequestMagic(ParentAddress, _credentials.attestation); + return response == expectedResult; + } + catch (Exception e) + { + return false; + } + } private string GetAcceptImplicitRequestFunctionAbi(Call call) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs index c7656afb..7ab5f6e2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs @@ -2,9 +2,11 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Newtonsoft.Json; using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; +using UnityEngine; using ConfigUpdate = Sequence.EcosystemWallet.KeyMachine.Models.ConfigUpdate; namespace Sequence.EcosystemWallet @@ -16,6 +18,7 @@ internal class SignatureService public SignatureService(SessionSigner[] sessionSigners, SessionsTopology sessions) { + _sessions = sessions; _signerService = new SignerService(sessionSigners, sessions); } @@ -51,7 +54,7 @@ private async Task SignSapient(Chain chain, Envelo var signatures = new SessionCallSignature[signers.Length]; for (var i = 0; i < signers.Length; i++) { - var signature = signers[i].SignCall(calls[i], _sessions, envelope.payload.space, envelope.payload.nonce); + var signature = signers[i].SignCall(chain, calls[i], _sessions, envelope.payload.space, envelope.payload.nonce); signatures[i] = signature; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs index dab5e3f4..04300b63 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs @@ -4,6 +4,8 @@ using System.Threading.Tasks; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; +using Unity.Plastic.Newtonsoft.Json; +using UnityEngine; namespace Sequence.EcosystemWallet { @@ -16,6 +18,9 @@ public SignerService(SessionSigner[] sessionSigners, SessionsTopology sessions) { _sessionSigners = sessionSigners; _sessions = sessions; + Debug.Log($"_sessionSigners == null {_sessionSigners == null}"); + Debug.Log($"_sessions == null {_sessions == null}"); + Debug.Log($"{JsonConvert.SerializeObject(_sessions.JsonSerialize())}"); } public async Task FindSignersForCalls(Chain chain, Call[] calls) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs index f3593af3..dd5a8a19 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs @@ -55,7 +55,7 @@ public async Task Update(Chain chain) Config = config; SessionsTopology = sessionsTopology; - Debug.Log($"Sessions Topology {sessionsTopology.JsonSerialize()}"); + Debug.Log($"Sessions Topology {SessionsTopology.JsonSerialize()}"); await UpdateNonce(chain, 0); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs index 7c80024f..17eeb344 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs @@ -9,6 +9,8 @@ public class MetaTxnReceipt public string revertReason; public int index; public string txnReceipt; + public string txnHash; + public string blockNumber; public MetaTxnReceipt[] receipts; public MetaTxnReceiptLog[] logs; diff --git a/Packages/manifest.json b/Packages/manifest.json index 90acc98f..2188338b 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,18 +1,19 @@ { "dependencies": { "com.unity.2d.sprite": "1.0.0", - "com.unity.collab-proxy": "1.15.18", + "com.unity.ai.navigation": "1.1.5", + "com.unity.collab-proxy": "2.3.1", "com.unity.feature.development": "1.0.1", - "com.unity.ide.rider": "3.0.15", - "com.unity.ide.visualstudio": "2.0.16", + "com.unity.ide.rider": "3.0.28", + "com.unity.ide.visualstudio": "2.0.22", "com.unity.ide.vscode": "1.2.5", - "com.unity.mobile.android-logcat": "1.3.2", + "com.unity.mobile.android-logcat": "1.4.0", "com.unity.project-auditor": "https://github.com/Unity-Technologies/ProjectAuditor.git", "com.unity.test-framework": "1.3.4", "com.unity.textmeshpro": "3.0.6", - "com.unity.timeline": "1.6.4", + "com.unity.timeline": "1.7.6", "com.unity.ugui": "1.0.0", - "com.unity.visualscripting": "1.7.8", + "com.unity.visualscripting": "1.9.2", "xyz.0xsequence.waas-unity": "file:../Packages/Sequence-Unity", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 8026b30e..784daf98 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -6,6 +6,15 @@ "source": "builtin", "dependencies": {} }, + "com.unity.ai.navigation": { + "version": "1.1.5", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.modules.ai": "1.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.asset-store-tools": { "version": "file:com.unity.asset-store-tools", "depth": 0, @@ -13,12 +22,10 @@ "dependencies": {} }, "com.unity.collab-proxy": { - "version": "1.15.18", + "version": "2.3.1", "depth": 0, "source": "registry", - "dependencies": { - "com.unity.services.core": "1.0.1" - }, + "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.editorcoroutines": { @@ -40,17 +47,17 @@ "depth": 0, "source": "builtin", "dependencies": { - "com.unity.ide.visualstudio": "2.0.16", - "com.unity.ide.rider": "3.0.15", + "com.unity.ide.visualstudio": "2.0.22", + "com.unity.ide.rider": "3.0.28", "com.unity.ide.vscode": "1.2.5", "com.unity.editorcoroutines": "1.0.0", - "com.unity.performance.profile-analyzer": "1.1.1", - "com.unity.test-framework": "1.1.31", - "com.unity.testtools.codecoverage": "1.0.1" + "com.unity.performance.profile-analyzer": "1.2.2", + "com.unity.test-framework": "1.1.33", + "com.unity.testtools.codecoverage": "1.2.5" } }, "com.unity.ide.rider": { - "version": "3.0.15", + "version": "3.0.28", "depth": 0, "source": "registry", "dependencies": { @@ -59,7 +66,7 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.16", + "version": "2.0.22", "depth": 0, "source": "registry", "dependencies": { @@ -75,7 +82,7 @@ "url": "https://packages.unity.com" }, "com.unity.mobile.android-logcat": { - "version": "1.3.2", + "version": "1.4.0", "depth": 0, "source": "registry", "dependencies": {}, @@ -96,7 +103,7 @@ "url": "https://packages.unity.com" }, "com.unity.performance.profile-analyzer": { - "version": "1.1.1", + "version": "1.2.2", "depth": 1, "source": "registry", "dependencies": {}, @@ -112,19 +119,8 @@ }, "hash": "d9a78910157f9dffc0a76c70c47fe1149fa5e673" }, - "com.unity.services.core": { - "version": "1.4.0", - "depth": 1, - "source": "registry", - "dependencies": { - "com.unity.modules.androidjni": "1.0.0", - "com.unity.nuget.newtonsoft-json": "3.0.2", - "com.unity.modules.unitywebrequest": "1.0.0" - }, - "url": "https://packages.unity.com" - }, "com.unity.settings-manager": { - "version": "1.0.3", + "version": "2.0.1", "depth": 2, "source": "registry", "dependencies": {}, @@ -142,7 +138,7 @@ "url": "https://packages.unity.com" }, "com.unity.testtools.codecoverage": { - "version": "1.0.1", + "version": "1.2.5", "depth": 1, "source": "registry", "dependencies": { @@ -161,7 +157,7 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.6.4", + "version": "1.7.6", "depth": 0, "source": "registry", "dependencies": { @@ -182,7 +178,7 @@ } }, "com.unity.visualscripting": { - "version": "1.7.8", + "version": "1.9.2", "depth": 0, "source": "registry", "dependencies": { @@ -332,17 +328,6 @@ "version": "1.0.0", "depth": 0, "source": "builtin", - "dependencies": { - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.uielementsnative": "1.0.0" - } - }, - "com.unity.modules.uielementsnative": { - "version": "1.0.0", - "depth": 1, - "source": "builtin", "dependencies": { "com.unity.modules.ui": "1.0.0", "com.unity.modules.imgui": "1.0.0", diff --git a/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json b/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json index ad11087f..3c7b4c18 100644 --- a/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json +++ b/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json @@ -1,6 +1,4 @@ { - "m_Name": "Settings", - "m_Path": "ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json", "m_Dictionary": { "m_DictionaryValues": [] } diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 4cb04600..c47c8be7 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2021.3.6f1 -m_EditorVersionWithRevision: 2021.3.6f1 (7da38d85baf6) +m_EditorVersion: 2022.3.22f1 +m_EditorVersionWithRevision: 2022.3.22f1 (887be4894c44) diff --git a/ProjectSettings/boot.config b/ProjectSettings/boot.config deleted file mode 100644 index e69de29b..00000000 From 80ecff1df7006ee19b0c8e1a25b1e9023a1f1d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 14 Aug 2025 09:19:59 +0200 Subject: [PATCH 144/165] demo ui updates for sending transactions --- .../Sequence/Samples~/Demo V3/DemoV3.unity | 2666 +++++++++++++++-- .../Demo V3/Prefabs/FeeOptionTile.prefab | 419 +++ .../Demo V3/Prefabs/FeeOptionTile.prefab.meta | 7 + .../EcosystemFeatureSelection.cs | 35 +- .../EcosystemWalletTransactions.cs | 4 + .../Scripts/EcosystemWallet/FeeOptionTile.cs | 31 + .../EcosystemWallet/FeeOptionTile.cs.meta | 3 + .../EcosystemWallet/FeeOptionWindow.cs | 34 + .../EcosystemWallet/FeeOptionWindow.cs.meta | 3 + .../EcosystemWallet/TransactionButton.cs | 59 +- .../EcosystemWallet/TransactionResultPopup.cs | 35 + .../TransactionResultPopup.cs.meta | 3 + .../Authentication/EcosystemClient.cs | 9 +- .../EcosystemWallet/Wallet/IWallet.cs | 8 + .../EcosystemWallet/Wallet/SequenceWallet.cs | 7 +- .../EcosystemWallet/Wallet/SessionSigner.cs | 1 - .../EcosystemWallet/Wallet/SignerService.cs | 4 +- .../EcosystemWallet/Wallet/WalletState.cs | 79 +- 18 files changed, 3136 insertions(+), 271 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/FeeOptionTile.prefab create mode 100644 Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/FeeOptionTile.prefab.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionTile.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionTile.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionWindow.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionWindow.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionResultPopup.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionResultPopup.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 8539a989..126177e3 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -180,7 +180,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Wallet Profile + m_text: Wallet profile m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} @@ -678,9 +678,9 @@ RectTransform: m_Children: [] m_Father: {fileID: 683925400} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -155} m_SizeDelta: {x: 210, y: 10} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &56928014 @@ -1444,6 +1444,132 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 157765780} m_CullTransparentMesh: 1 +--- !u!1 &158522430 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 158522431} + - component: {fileID: 158522434} + - component: {fileID: 158522433} + - component: {fileID: 158522432} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &158522431 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158522430} + 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: 167642979} + m_Father: {fileID: 1861070390} + 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: 10, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &158522432 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158522430} + 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: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} + m_HighlightedColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_PressedColor: {r: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} + m_SelectedColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_DisabledColor: {r: 0, g: 0, b: 0, a: 1} + 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: 1785893878} + m_HandleRect: {fileID: 1785893877} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &158522433 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158522430} + 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: 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 &158522434 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158522430} + m_CullTransparentMesh: 1 --- !u!1 &161099257 GameObject: m_ObjectHideFlags: 0 @@ -1519,6 +1645,42 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 161099257} m_CullTransparentMesh: 1 +--- !u!1 &167642978 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 167642979} + 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 &167642979 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 167642978} + 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: 1785893877} + m_Father: {fileID: 158522431} + 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 &191605877 GameObject: m_ObjectHideFlags: 0 @@ -1962,7 +2124,7 @@ RectTransform: m_AnchoredPosition: {x: -10, y: 0} m_SizeDelta: {x: 60, y: 20} m_Pivot: {x: 1, y: 0.5} ---- !u!1 &317570297 +--- !u!1 &230010630 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1970,131 +2132,354 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 317570298} - - component: {fileID: 317570302} - - component: {fileID: 317570301} - - component: {fileID: 317570300} - - component: {fileID: 317570299} + - component: {fileID: 230010631} + - component: {fileID: 230010634} + - component: {fileID: 230010633} + - component: {fileID: 230010632} m_Layer: 5 - m_Name: CopyButton + m_Name: Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &317570298 + m_IsActive: 1 +--- !u!224 &230010631 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317570297} + m_GameObject: {fileID: 230010630} 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: 1016496429} - m_Father: {fileID: 191605878} + m_Children: [] + m_Father: {fileID: 286074021} 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_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 &317570299 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317570297} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &317570300 +--- !u!114 &230010632 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317570297} + m_GameObject: {fileID: 230010630} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Script: {fileID: 11500000, guid: d0b148fe25e99eb48b9724523833bab1, 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: 317570301} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceExamples - m_MethodName: CopyWalletAddress - 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 &317570301 + m_Delegates: + - eventID: 4 + callback: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: SequenceSDK.Samples.SequenceLoginWindow, Sequence.Boilerplates + m_MethodName: EnableEmailButton + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 +--- !u!114 &230010633 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317570297} + m_GameObject: {fileID: 230010630} 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.19, g: 0.19, b: 0.19, a: 1} + m_Color: {r: 0, g: 0, b: 0, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} m_Type: 1 - m_PreserveAspect: 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 &230010634 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 230010630} + m_CullTransparentMesh: 1 +--- !u!1 &286074020 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 286074021} + - component: {fileID: 286074022} + - component: {fileID: 286074024} + - component: {fileID: 286074023} + m_Layer: 5 + m_Name: FeeOptionsWindow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &286074021 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 286074020} + 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: 230010631} + - {fileID: 1902185723} + - {fileID: 1861070390} + - {fileID: 1486293238} + m_Father: {fileID: 1050865742} + 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: 240, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &286074022 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 286074020} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9c2a679cc44642b2b553b06d881c4761, type: 3} + m_Name: + m_EditorClassIdentifier: + _tilePool: + _amount: 10 + _setAsLastSibling: 1 + _parent: {fileID: 1774370118} + _prefab: {fileID: 6048077945414578415, guid: a9fe55a5230314e2d8f553b0fc27300b, type: 3} +--- !u!114 &286074023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 286074020} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eb6fa7d82312143d9b451ac5e7465a38, type: 3} + m_Name: + m_EditorClassIdentifier: + _start: 0.7 + _duration: 0.3 + _animationCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 2 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.77346337 + value: 1.1153979 + inSlope: -0.25566182 + outSlope: -0.25566182 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.7318018 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: -0.17961398 + outSlope: -0.17961398 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.6227655 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!225 &286074024 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 286074020} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!1 &317570297 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 317570298} + - component: {fileID: 317570302} + - component: {fileID: 317570301} + - component: {fileID: 317570300} + - component: {fileID: 317570299} + m_Layer: 5 + m_Name: CopyButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &317570298 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317570297} + 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: 1016496429} + m_Father: {fileID: 191605878} + 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 &317570299 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317570297} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &317570300 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317570297} + 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: 317570301} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: CopyWalletAddress + 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 &317570301 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317570297} + 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.19, g: 0.19, b: 0.19, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -2143,9 +2528,9 @@ RectTransform: - {fileID: 491498808} m_Father: {fileID: 683925400} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -225} m_SizeDelta: {x: 210, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &323220475 @@ -2361,9 +2746,9 @@ RectTransform: - {fileID: 1545678474} m_Father: {fileID: 683925400} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -35} m_SizeDelta: {x: 210, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &390971674 @@ -2634,6 +3019,96 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 391644458} m_CullTransparentMesh: 1 +--- !u!1 &399605434 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 399605435} + - component: {fileID: 399605438} + - component: {fileID: 399605437} + - component: {fileID: 399605436} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &399605435 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 399605434} + 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: 1774370118} + m_Father: {fileID: 1861070390} + 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: -7, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &399605436 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 399605434} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &399605437 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 399605434} + 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.06666667, g: 0.06666667, b: 0.06666667, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &399605438 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 399605434} + m_CullTransparentMesh: 1 --- !u!1 &400068441 GameObject: m_ObjectHideFlags: 0 @@ -3713,9 +4188,9 @@ RectTransform: m_Father: {fileID: 1757522697} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {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: -7, y: 0} m_Pivot: {x: 0, y: 1} --- !u!114 &564597531 MonoBehaviour: @@ -4025,7 +4500,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: -40} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 240} m_Pivot: {x: 0.5, y: 1} --- !u!114 &683925401 MonoBehaviour: @@ -4099,9 +4574,9 @@ RectTransform: m_Children: [] m_Father: {fileID: 683925400} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -65} m_SizeDelta: {x: 210, y: 10} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &689232701 @@ -4237,12 +4712,12 @@ RectTransform: - {fileID: 1329197019} - {fileID: 659355502} - {fileID: 1870792378} - m_Father: {fileID: 1146219656} + m_Father: {fileID: 697728234} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 130, y: -150} - m_SizeDelta: {x: 230, y: 40} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 210, y: 40} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &696230465 MonoBehaviour: @@ -4257,12 +4732,17 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _chain: 10 + _useFeeOptions: 1 + _feeOptionAddress: + - 0x7F5c764cBc14f9669B88837ca1490cCa17c31607 _transaction: k__BackingField: 0x33985d320809E26274a72E03268c8a29927Bc6dA k__BackingField: explicitEmit() _loadingObject: {fileID: 1870792377} _sessionButtonObject: {fileID: 1329197014} _transactionButtonObject: {fileID: 659355501} + _messagePopup: {fileID: 1397315415} + _transactionResult: {fileID: 0} --- !u!114 &696230466 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4301,6 +4781,87 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 696230463} m_CullTransparentMesh: 1 +--- !u!1 &697728233 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 697728234} + - component: {fileID: 697728236} + - component: {fileID: 697728235} + m_Layer: 5 + m_Name: Layout + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &697728234 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 697728233} + 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: 836095706} + - {fileID: 2097849100} + - {fileID: 1242786027} + - {fileID: 696230464} + m_Father: {fileID: 1146219656} + 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: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &697728235 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 697728233} + 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 &697728236 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 697728233} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 15 + m_Right: 15 + m_Top: 5 + m_Bottom: 15 + m_ChildAlignment: 4 + m_Spacing: 5 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 --- !u!1 &699969409 GameObject: m_ObjectHideFlags: 0 @@ -4915,9 +5476,9 @@ RectTransform: - {fileID: 485743481} m_Father: {fileID: 683925400} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -185} m_SizeDelta: {x: 210, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &805083869 @@ -5228,19 +5789,19 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 836095705} - 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: 1614894632} - {fileID: 1310990841} - m_Father: {fileID: 1146219656} + m_Father: {fileID: 697728234} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 130, y: -20} - m_SizeDelta: {x: 230, y: 30} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 210, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &865590363 GameObject: @@ -6313,23 +6874,98 @@ MonoBehaviour: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 988110723} + m_GameObject: {fileID: 988110723} + 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.254717, g: 0.254717, b: 0.254717, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &988110727 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 988110723} + m_CullTransparentMesh: 1 +--- !u!1 &1016496428 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1016496429} + - component: {fileID: 1016496431} + - component: {fileID: 1016496430} + m_Layer: 5 + m_Name: Image (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1016496429 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016496428} + 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: 317570298} + 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: 7, y: 7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1016496430 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016496428} 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.254717, g: 0.254717, b: 0.254717, 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: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 - m_PreserveAspect: 0 + m_Sprite: {fileID: 21300000, guid: 7eeaa0f6357c9474abdf30939e119719, type: 3} + m_Type: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -6337,15 +6973,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &988110727 +--- !u!222 &1016496431 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 988110723} + m_GameObject: {fileID: 1016496428} m_CullTransparentMesh: 1 ---- !u!1 &1016496428 +--- !u!1 &1020405562 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6353,58 +6989,60 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1016496429} - - component: {fileID: 1016496431} - - component: {fileID: 1016496430} + - component: {fileID: 1020405563} + - component: {fileID: 1020405566} + - component: {fileID: 1020405565} + - component: {fileID: 1020405564} m_Layer: 5 - m_Name: Image (1) + m_Name: OpenButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1016496429 +--- !u!224 &1020405563 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 1020405562} + 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: 317570298} + m_Children: + - {fileID: 1107543615} + m_Father: {fileID: 2585977797078727628} 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: 7, y: 7} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -35, y: 0} + m_SizeDelta: {x: 15, y: 15} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1016496430 +--- !u!114 &1020405564 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} + m_GameObject: {fileID: 1020405562} 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_Color: {r: 1, g: 1, b: 1, a: 0.2509804} 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: 7eeaa0f6357c9474abdf30939e119719, type: 3} - m_Type: 0 - m_PreserveAspect: 1 + m_Sprite: {fileID: 21300000, guid: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -6412,14 +7050,70 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1016496431 +--- !u!222 &1020405565 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} + m_GameObject: {fileID: 1020405562} m_CullTransparentMesh: 1 +--- !u!114 &1020405566 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1020405562} + 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: 1020405564} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 6440605247847260042} + m_TargetAssemblyTypeName: Sequence.Boilerplates.TransactionResultPopup, SequenceBoilerplates + m_MethodName: OpenExplorer + 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!1 &1030251668 GameObject: m_ObjectHideFlags: 0 @@ -6595,6 +7289,7 @@ RectTransform: - {fileID: 323220476} - {fileID: 1865608230} - {fileID: 1146219656} + - {fileID: 286074021} - {fileID: 2053860377} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -6619,6 +7314,7 @@ MonoBehaviour: _featureSelection: {fileID: 323220475} _profile: {fileID: 1865608231} _transactions: {fileID: 1146219663} + _feeOptionWindow: {fileID: 286074022} --- !u!1 &1060437061 GameObject: m_ObjectHideFlags: 0 @@ -6938,6 +7634,81 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1102907215} m_CullTransparentMesh: 1 +--- !u!1 &1107543614 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1107543615} + - component: {fileID: 1107543617} + - component: {fileID: 1107543616} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1107543615 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1107543614} + 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: 1020405563} + 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: 10, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1107543616 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1107543614} + 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: 23873c46a7db54a6e89d05a42f7671a3, type: 3} + 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 &1107543617 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1107543614} + m_CullTransparentMesh: 1 --- !u!1 &1115529824 GameObject: m_ObjectHideFlags: 0 @@ -7176,8 +7947,6 @@ GameObject: m_Component: - component: {fileID: 1146219656} - component: {fileID: 1146219663} - - component: {fileID: 1146219662} - - component: {fileID: 1146219661} - component: {fileID: 1146219660} - component: {fileID: 1146219659} - component: {fileID: 1146219658} @@ -7188,7 +7957,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &1146219656 RectTransform: m_ObjectHideFlags: 0 @@ -7201,10 +7970,9 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 836095706} - - {fileID: 2097849100} - - {fileID: 1242786027} - - {fileID: 696230464} + - {fileID: 697728234} + - {fileID: 1397315414} + - {fileID: 2585977797078727628} m_Father: {fileID: 1050865742} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} @@ -7309,46 +8077,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1146219655} m_CullTransparentMesh: 1 ---- !u!114 &1146219661 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1146219655} - 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 &1146219662 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1146219655} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 15 - m_Right: 15 - m_Top: 5 - m_Bottom: 15 - m_ChildAlignment: 4 - m_Spacing: 5 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 1 - m_ChildControlWidth: 0 - m_ChildControlHeight: 0 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 --- !u!114 &1146219663 MonoBehaviour: m_ObjectHideFlags: 0 @@ -7361,6 +8089,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 68370ec9959be4c67ab321f72b847f9d, type: 3} m_Name: m_EditorClassIdentifier: + _messagePopup: {fileID: 1397315415} + _transactionResult: {fileID: 6440605247847260042} _transactionButtons: - {fileID: 2097849102} - {fileID: 1242786028} @@ -7472,9 +8202,9 @@ RectTransform: m_Children: [] m_Father: {fileID: 683925400} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -5} m_SizeDelta: {x: 210, y: 10} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1186454645 @@ -7819,12 +8549,12 @@ RectTransform: - {fileID: 215461110} - {fileID: 965900427} - {fileID: 921594784} - m_Father: {fileID: 1146219656} + m_Father: {fileID: 697728234} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 130, y: -105} - m_SizeDelta: {x: 230, y: 40} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 210, y: 40} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1242786028 MonoBehaviour: @@ -7839,12 +8569,16 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _chain: 421614 + _useFeeOptions: 0 + _feeOptionAddress: [] _transaction: k__BackingField: 0x33985d320809E26274a72E03268c8a29927Bc6dA k__BackingField: explicitEmit() _loadingObject: {fileID: 921594783} _sessionButtonObject: {fileID: 215461105} _transactionButtonObject: {fileID: 965900426} + _messagePopup: {fileID: 1397315415} + _transactionResult: {fileID: 0} --- !u!114 &1242786029 MonoBehaviour: m_ObjectHideFlags: 0 @@ -8063,32 +8797,107 @@ GameObject: m_Component: - component: {fileID: 1267233531} m_Layer: 5 - m_Name: Sliding Area + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1267233531 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1267233530} + 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: 161099258} + m_Father: {fileID: 1979708985} + 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 &1274642101 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1274642102} + - component: {fileID: 1274642104} + - component: {fileID: 1274642103} + m_Layer: 5 + m_Name: Icon m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1267233531 +--- !u!224 &1274642102 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1267233530} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 1274642101} + 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: 161099258} - m_Father: {fileID: 1979708985} + m_Children: [] + m_Father: {fileID: 1486293238} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} + 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: -20, y: -20} + m_SizeDelta: {x: 7, y: 7} m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1274642103 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1274642101} + 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: e0aca7c4ac2ed4cc589962721c508d77, 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 &1274642104 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1274642101} + m_CullTransparentMesh: 1 --- !u!1 &1279357134 GameObject: m_ObjectHideFlags: 0 @@ -8847,7 +9656,7 @@ RectTransform: m_Father: {fileID: 2016817959} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {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} @@ -9245,6 +10054,119 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1374590914} m_CullTransparentMesh: 1 +--- !u!1001 &1397315413 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1146219656} + m_Modifications: + - target: {fileID: 607308253010258378, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_Name + value: MessagePopup + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_Pivot.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_SizeDelta.y + value: 30 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_AnchoredPosition.y + value: -10 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} +--- !u!224 &1397315414 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + m_PrefabInstance: {fileID: 1397315413} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1397315415 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 3421921267587625916, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} + m_PrefabInstance: {fileID: 1397315413} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ca9893608c30f46418c1a2d78b609df9, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1407445813 GameObject: m_ObjectHideFlags: 0 @@ -9795,7 +10717,154 @@ CanvasRenderer: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1477743771} + m_GameObject: {fileID: 1477743771} + m_CullTransparentMesh: 1 +--- !u!1 &1486293237 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1486293238} + - component: {fileID: 1486293242} + - component: {fileID: 1486293241} + - component: {fileID: 1486293240} + - component: {fileID: 1486293239} + m_Layer: 5 + m_Name: CloseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1486293238 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1486293237} + 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: 1274642102} + m_Father: {fileID: 286074021} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -25, y: -22.5} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1486293239 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1486293237} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &1486293240 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1486293237} + 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: 1486293241} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 286074022} + m_TargetAssemblyTypeName: Sequence.Boilerplates.FeeOptionWindow, SequenceBoilerplates + 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 &1486293241 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1486293237} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Type: 1 + 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 &1486293242 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1486293237} m_CullTransparentMesh: 1 --- !u!1 &1492627056 GameObject: @@ -10478,7 +11547,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Send Transactions + m_text: Send transactions m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} @@ -11065,7 +12134,7 @@ RectTransform: 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: 4} m_Pivot: {x: 0, y: 1} --- !u!114 &1697771493 MonoBehaviour: @@ -11276,9 +12345,9 @@ RectTransform: - {fileID: 1629483765} m_Father: {fileID: 683925400} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -110} m_SizeDelta: {x: 210, y: 60} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1757522698 @@ -11483,6 +12552,158 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1762646610} m_CullTransparentMesh: 1 +--- !u!1 &1774370117 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1774370118} + - component: {fileID: 1774370120} + - component: {fileID: 1774370119} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1774370118 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1774370117} + 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: 399605435} + 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: 4} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1774370119 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1774370117} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_ChildAlignment: 0 + m_Spacing: 2 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1774370120 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1774370117} + 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 &1785893876 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1785893877} + - component: {fileID: 1785893879} + - component: {fileID: 1785893878} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1785893877 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1785893876} + 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: 167642979} + 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 &1785893878 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1785893876} + 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 &1785893879 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1785893876} + m_CullTransparentMesh: 1 --- !u!1 &1788955834 GameObject: m_ObjectHideFlags: 0 @@ -11654,42 +12875,150 @@ MonoBehaviour: m_TargetGraphic: {fileID: 1853883869} m_OnClick: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 2097849102} - m_TargetAssemblyTypeName: Sequence.Boilerplates.TransactionButton, SequenceBoilerplates - m_MethodName: AddSession - 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 &1853883869 + m_Calls: + - m_Target: {fileID: 2097849102} + m_TargetAssemblyTypeName: Sequence.Boilerplates.TransactionButton, SequenceBoilerplates + m_MethodName: AddSession + 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 &1853883869 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1853883865} + 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &1853883870 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1853883865} + m_CullTransparentMesh: 1 +--- !u!1 &1861070389 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1861070390} + - component: {fileID: 1861070393} + - component: {fileID: 1861070392} + - component: {fileID: 1861070391} + m_Layer: 5 + m_Name: Scroll View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1861070390 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1861070389} + 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: 399605435} + - {fileID: 158522431} + m_Father: {fileID: 286074021} + 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: -15} + m_SizeDelta: {x: -30, y: -60} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1861070391 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1861070389} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 1774370118} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 399605435} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 158522432} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1861070392 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1853883865} + m_GameObject: {fileID: 1861070389} 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.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 0} 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} m_Type: 1 - m_PreserveAspect: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -11697,13 +13026,13 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1853883870 +--- !u!222 &1861070393 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1853883865} + m_GameObject: {fileID: 1861070389} m_CullTransparentMesh: 1 --- !u!1 &1865608229 GameObject: @@ -11723,7 +13052,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &1865608230 RectTransform: m_ObjectHideFlags: 0 @@ -11998,6 +13327,140 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1883453220} m_CullTransparentMesh: 1 +--- !u!1 &1902185722 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1902185723} + - component: {fileID: 1902185725} + - component: {fileID: 1902185724} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1902185723 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1902185722} + 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: 286074021} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -22.5} + m_SizeDelta: {x: 200, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1902185724 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1902185722} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Select a fee option + 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: 10 + m_fontSizeBase: 10 + m_fontWeight: 400 + m_enableAutoSizing: 0 + 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: 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 &1902185725 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1902185722} + m_CullTransparentMesh: 1 --- !u!1 &1979708984 GameObject: m_ObjectHideFlags: 0 @@ -12961,12 +14424,12 @@ RectTransform: - {fileID: 1853883866} - {fileID: 1280987658} - {fileID: 802456208} - m_Father: {fileID: 1146219656} + m_Father: {fileID: 697728234} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 130, y: -60} - m_SizeDelta: {x: 230, y: 40} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 210, y: 40} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2097849102 MonoBehaviour: @@ -12981,12 +14444,16 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _chain: 421614 + _useFeeOptions: 0 + _feeOptionAddress: [] _transaction: k__BackingField: 0x33985d320809E26274a72E03268c8a29927Bc6dA k__BackingField: implicitEmit() _loadingObject: {fileID: 802456207} _sessionButtonObject: {fileID: 1853883865} _transactionButtonObject: {fileID: 1280987657} + _messagePopup: {fileID: 1397315415} + _transactionResult: {fileID: 0} --- !u!114 &2097849103 MonoBehaviour: m_ObjectHideFlags: 0 @@ -13190,6 +14657,44 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2145386559} m_CullTransparentMesh: 1 +--- !u!224 &253228194782276494 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2223926832334533402} + 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: 6138961496532664846} + 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!224 &317844635314369216 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4925506467824695912} + 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: 2585977797078727628} + 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 &320339275645968252 GameObject: m_ObjectHideFlags: 0 @@ -13257,6 +14762,24 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!1 &584025460085493633 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1313013086623410433} + - component: {fileID: 5016796678149176591} + - component: {fileID: 8968219491834548215} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 --- !u!1 &1039274815797997968 GameObject: m_ObjectHideFlags: 0 @@ -13412,6 +14935,25 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 +--- !u!224 &1313013086623410433 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 584025460085493633} + 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: 7339354311113307155} + 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: 5, y: 5} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1365941811581567776 MonoBehaviour: m_ObjectHideFlags: 0 @@ -13563,6 +15105,53 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 +--- !u!114 &1504067248950163115 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4741696591847788177} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eb6fa7d82312143d9b451ac5e7465a38, type: 3} + m_Name: + m_EditorClassIdentifier: + _start: 0.6 + _duration: 0.25 + _animationCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 2 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 0.77346337 + value: 1.1153979 + inSlope: -0.25566182 + outSlope: -0.25566182 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.7318018 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: -0.17961398 + outSlope: -0.17961398 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.6227655 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 --- !u!224 &1654620268838434455 RectTransform: m_ObjectHideFlags: 0 @@ -13582,6 +15171,24 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 7, y: 7} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1756698344821564430 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6215005358287903880} + - component: {fileID: 9093840791025003869} + - component: {fileID: 8214096761303259157} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 --- !u!224 &2198483992803733903 RectTransform: m_ObjectHideFlags: 0 @@ -13607,6 +15214,24 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 240, y: 420} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &2223926832334533402 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 253228194782276494} + - component: {fileID: 7137886526944159207} + - component: {fileID: 8414745031414707917} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 --- !u!114 &2325936309338030303 MonoBehaviour: m_ObjectHideFlags: 0 @@ -13664,6 +15289,24 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 +--- !u!1 &2341121885572133199 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9133654303007266753} + - component: {fileID: 7845295067376519834} + - component: {fileID: 2643991299739919120} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 --- !u!224 &2364319422627657610 RectTransform: m_ObjectHideFlags: 0 @@ -13794,6 +15437,119 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 +--- !u!224 &2585977797078727628 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4741696591847788177} + 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: 317844635314369216} + - {fileID: 9133654303007266753} + - {fileID: 6138961496532664846} + - {fileID: 1020405563} + - {fileID: 7339354311113307155} + m_Father: {fileID: 1146219656} + 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: -10} + m_SizeDelta: {x: 0, y: 30} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &2643991299739919120 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2341121885572133199} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Message + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + 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: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 1 + 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!1 &2673375261290894866 GameObject: m_ObjectHideFlags: 0 @@ -14001,6 +15757,41 @@ RectTransform: m_AnchoredPosition: {x: 105, y: -150} m_SizeDelta: {x: 210, y: 30} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &3531690967744880414 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6138961496532664846} + m_Layer: 5 + m_Name: SuccessIcon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &3674380687421867411 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7339354311113307155} + - component: {fileID: 4588022191623369554} + - component: {fileID: 7907204604227659519} + - component: {fileID: 4571554418310232038} + m_Layer: 5 + m_Name: CloseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 --- !u!114 &3833055132679331405 MonoBehaviour: m_ObjectHideFlags: 0 @@ -14088,6 +15879,36 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 0 m_CallState: 2 +--- !u!114 &4197624856586093095 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4925506467824695912} + 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: 0.2509804} + 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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!224 &4209220039127894524 RectTransform: m_ObjectHideFlags: 0 @@ -14320,6 +16141,111 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &4571554418310232038 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3674380687421867411} + 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: 0.2509804} + 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + 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!114 &4588022191623369554 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3674380687421867411} + 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: 4571554418310232038} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 6440605247847260042} + m_TargetAssemblyTypeName: Sequence.Boilerplates.TransactionResultPopup, SequenceBoilerplates + m_MethodName: Hide + 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!1 &4741696591847788177 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2585977797078727628} + - component: {fileID: 6440605247847260042} + - component: {fileID: 6440605247847260041} + - component: {fileID: 1504067248950163115} + m_Layer: 5 + m_Name: TransactionResult + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 --- !u!114 &4821899330820860530 MonoBehaviour: m_ObjectHideFlags: 0 @@ -14358,6 +16284,24 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6427513404366440442} m_CullTransparentMesh: 1 +--- !u!1 &4925506467824695912 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 317844635314369216} + - component: {fileID: 8627714443265660474} + - component: {fileID: 4197624856586093095} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 --- !u!114 &4936300011644007728 MonoBehaviour: m_ObjectHideFlags: 0 @@ -14844,6 +16788,14 @@ MonoBehaviour: _titleText: {fileID: 0} _descriptionText: {fileID: 0} _button: {fileID: 0} +--- !u!222 &5016796678149176591 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 584025460085493633} + m_CullTransparentMesh: 1 --- !u!222 &5022763554724267541 CanvasRenderer: m_ObjectHideFlags: 0 @@ -15206,6 +17158,46 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2673375261290894866} m_CullTransparentMesh: 1 +--- !u!224 &6138961496532664846 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3531690967744880414} + 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: 253228194782276494} + - {fileID: 6215005358287903880} + m_Father: {fileID: 2585977797078727628} + 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: 15, y: 0} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &6215005358287903880 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1756698344821564430} + 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: 6138961496532664846} + 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: 10, y: 10} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &6427513404366440442 GameObject: m_ObjectHideFlags: 0 @@ -15225,6 +17217,31 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 +--- !u!225 &6440605247847260041 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4741696591847788177} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &6440605247847260042 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4741696591847788177} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 07347b0867e3462aa3b6de3118f9aff3, type: 3} + m_Name: + m_EditorClassIdentifier: + _messageText: {fileID: 2643991299739919120} --- !u!1 &6879894437146287264 GameObject: m_ObjectHideFlags: 0 @@ -15289,6 +17306,14 @@ MonoBehaviour: m_EffectColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} m_EffectDistance: {x: 1, y: -1} m_UseGraphicAlpha: 1 +--- !u!222 &7137886526944159207 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2223926832334533402} + m_CullTransparentMesh: 1 --- !u!222 &7147867555355416424 CanvasRenderer: m_ObjectHideFlags: 0 @@ -15297,6 +17322,26 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1185936199800087165} m_CullTransparentMesh: 1 +--- !u!224 &7339354311113307155 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3674380687421867411} + 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: 1313013086623410433} + m_Father: {fileID: 2585977797078727628} + 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: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7376973567988763871 CanvasRenderer: m_ObjectHideFlags: 0 @@ -15406,6 +17451,22 @@ MonoBehaviour: m_StringArgument: m_BoolArgument: 1 m_CallState: 2 +--- !u!222 &7845295067376519834 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2341121885572133199} + m_CullTransparentMesh: 1 +--- !u!222 &7907204604227659519 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3674380687421867411} + m_CullTransparentMesh: 1 --- !u!114 &8046914839405764275 MonoBehaviour: m_ObjectHideFlags: 0 @@ -15436,6 +17497,36 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!114 &8214096761303259157 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1756698344821564430} + 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: 8680747023071481ba800566f87003ba, type: 3} + 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!114 &8218687474100291355 MonoBehaviour: m_ObjectHideFlags: 0 @@ -15486,6 +17577,36 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 +--- !u!114 &8414745031414707917 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2223926832334533402} + 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.05882353, g: 0.77254903, b: 0, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + 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!1 &8496890551459878638 GameObject: m_ObjectHideFlags: 0 @@ -15525,6 +17646,14 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8627714443265660474 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4925506467824695912} + m_CullTransparentMesh: 1 --- !u!114 &8630391446351500689 MonoBehaviour: m_ObjectHideFlags: 0 @@ -15677,6 +17806,44 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 +--- !u!114 &8968219491834548215 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 584025460085493633} + 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: 70528f3440ea84f968e5a4ecf4b389a9, type: 3} + 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 &9093840791025003869 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1756698344821564430} + m_CullTransparentMesh: 1 --- !u!114 &9122750164851673669 MonoBehaviour: m_ObjectHideFlags: 0 @@ -15690,6 +17857,25 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_ShowMaskGraphic: 1 +--- !u!224 &9133654303007266753 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2341121885572133199} + 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: 2585977797078727628} + 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: -50, y: 0} + m_Pivot: {x: 0.5, y: 0.5} --- !u!225 &9144345594371459761 CanvasGroup: m_ObjectHideFlags: 0 diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/FeeOptionTile.prefab b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/FeeOptionTile.prefab new file mode 100644 index 00000000..e886ff8d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/FeeOptionTile.prefab @@ -0,0 +1,419 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &488264214438011187 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1062154270139711604} + - component: {fileID: 6048077945414578415} + - component: {fileID: 300926986013208494} + - component: {fileID: 8347417186721211689} + - component: {fileID: 150938095564618391} + m_Layer: 5 + m_Name: FeeOptionTile + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1062154270139711604 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488264214438011187} + 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: 113041410790801271} + - {fileID: 1730389250431061217} + m_Father: {fileID: 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: 200, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &6048077945414578415 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488264214438011187} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8045cb91dd5f4559ad166d6a24366e2d, type: 3} + m_Name: + m_EditorClassIdentifier: + _nameText: {fileID: 4274670708990135750} + _valueText: {fileID: 972850526285019443} +--- !u!114 &300926986013208494 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488264214438011187} + 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: 150938095564618391} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 6048077945414578415} + m_TargetAssemblyTypeName: Sequence.Boilerplates.FeeOptionTile, SequenceBoilerplates + m_MethodName: Select + 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!222 &8347417186721211689 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488264214438011187} + m_CullTransparentMesh: 1 +--- !u!114 &150938095564618391 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488264214438011187} + 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.101960786, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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: 2 +--- !u!1 &4428645227185661108 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 113041410790801271} + - component: {fileID: 9212016898007033605} + - component: {fileID: 4274670708990135750} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &113041410790801271 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4428645227185661108} + 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: 1062154270139711604} + 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!222 &9212016898007033605 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4428645227185661108} + m_CullTransparentMesh: 1 +--- !u!114 &4274670708990135750 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4428645227185661108} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Wallet Profile + 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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!1 &6291137503320472345 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1730389250431061217} + - component: {fileID: 5806813327146978764} + - component: {fileID: 972850526285019443} + m_Layer: 5 + m_Name: TitleText (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1730389250431061217 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6291137503320472345} + 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: 1062154270139711604} + 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!222 &5806813327146978764 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6291137503320472345} + m_CullTransparentMesh: 1 +--- !u!114 &972850526285019443 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6291137503320472345} + 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: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Wallet Profile + 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: 4289901234 + m_fontColor: {r: 0.7, g: 0.7, b: 0.7, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 4 + 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} diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/FeeOptionTile.prefab.meta b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/FeeOptionTile.prefab.meta new file mode 100644 index 00000000..f94e389e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/FeeOptionTile.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a9fe55a5230314e2d8f553b0fc27300b +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs index 5883b759..07a46918 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs @@ -1,25 +1,31 @@ +using System; using Sequence.EcosystemWallet; +using Sequence.Relayer; using UnityEngine; namespace Sequence.Boilerplates { public class EcosystemFeatureSelection : MonoBehaviour { + public static EcosystemFeatureSelection Instance; + [SerializeField] private SequenceEcosystemWalletWindow _login; [SerializeField] private GameObject _featureSelection; [SerializeField] private EcosystemWalletProfile _profile; [SerializeField] private EcosystemWalletTransactions _transactions; + [SerializeField] private FeeOptionWindow _feeOptionWindow; private IWallet _wallet; - + + private void Awake() + { + Instance = this; + } + private void Start() { SequenceWallet.Disconnected += OpenLogin; - SequenceWallet.WalletCreated += wallet => - { - _wallet = wallet; - OpenFeatureSelection(); - }; + SequenceWallet.WalletCreated += UpdateWallet; _login.gameObject.SetActive(false); _featureSelection.SetActive(false); @@ -33,6 +39,18 @@ private void Start() OpenFeatureSelection(); } + private void OnDestroy() + { + SequenceWallet.Disconnected -= OpenLogin; + SequenceWallet.WalletCreated -= UpdateWallet; + } + + private void UpdateWallet(IWallet wallet) + { + _wallet = wallet; + OpenFeatureSelection(); + } + public void OpenLogin() { _login.Open(); @@ -55,5 +73,10 @@ public void OpenTransactions() _featureSelection.SetActive(false); _transactions.Load(_wallet, OpenFeatureSelection); } + + public void OpenFeeOptionWindow(FeeOption[] feeOptions, Action onSelected) + { + _feeOptionWindow.WaitForSelection(feeOptions, onSelected); + } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs index 28b318a7..66389e04 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs @@ -6,6 +6,8 @@ namespace Sequence.Boilerplates { public class EcosystemWalletTransactions : MonoBehaviour { + [SerializeField] private MessagePopup _messagePopup; + [SerializeField] private TransactionResultPopup _transactionResult; [SerializeField] private TransactionButton[] _transactionButtons; private IWallet _wallet; @@ -23,6 +25,8 @@ public void Load(IWallet wallet, UnityAction onClose) _onClose = onClose; gameObject.SetActive(true); + _messagePopup.gameObject.SetActive(false); + _transactionResult.gameObject.SetActive(false); foreach (var button in _transactionButtons) button.Load(wallet); diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionTile.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionTile.cs new file mode 100644 index 00000000..1e5ba217 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionTile.cs @@ -0,0 +1,31 @@ +using System; +using System.Numerics; +using Sequence.Relayer; +using Sequence.Utils; +using TMPro; +using UnityEngine; + +namespace Sequence.Boilerplates +{ + public class FeeOptionTile : MonoBehaviour + { + [SerializeField] private TMP_Text _nameText; + [SerializeField] private TMP_Text _valueText; + + private FeeOption _feeOption; + private Action _onSelected; + + public void Load(FeeOption feeOption, Action onSelected) + { + _feeOption = feeOption; + _onSelected = onSelected; + _nameText.text = feeOption.token.name; + _valueText.text = DecimalNormalizer.ReturnToNormalPrecise(BigInteger.Parse(feeOption.value), feeOption.token.decimals).ToString(); + } + + public void Select() + { + _onSelected?.Invoke(_feeOption); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionTile.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionTile.cs.meta new file mode 100644 index 00000000..887e01f8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionTile.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8045cb91dd5f4559ad166d6a24366e2d +timeCreated: 1755122751 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionWindow.cs new file mode 100644 index 00000000..f47c6cc8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionWindow.cs @@ -0,0 +1,34 @@ +using System; +using Sequence.Relayer; +using UnityEngine; + +namespace Sequence.Boilerplates +{ + public class FeeOptionWindow : MonoBehaviour + { + [SerializeField] private GenericObjectPool _tilePool; + + private Action _onSelected; + + public void WaitForSelection(FeeOption[] feeOptions, Action onSelected) + { + gameObject.SetActive(true); + _onSelected = onSelected; + + _tilePool.Cleanup(); + foreach (var feeOption in feeOptions) + _tilePool.GetObject().Load(feeOption, SelectFee); + } + + public void Close() + { + SelectFee(null); + } + + private void SelectFee(FeeOption feeOption) + { + _onSelected?.Invoke(feeOption); + gameObject.SetActive(false); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionWindow.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionWindow.cs.meta new file mode 100644 index 00000000..aa9f0150 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionWindow.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9c2a679cc44642b2b553b06d881c4761 +timeCreated: 1755122743 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs index f9dda619..fad0806e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs @@ -2,9 +2,12 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Numerics; using System.Threading.Tasks; using Sequence.EcosystemWallet; +using Sequence.Relayer; using UnityEngine; +using UnityEngine.Events; namespace Sequence.Boilerplates { @@ -31,12 +34,16 @@ private enum State [Header("Transactions")] [SerializeField] private Chain _chain = Chain.TestnetArbitrumSepolia; + [SerializeField] private bool _useFeeOptions; + [SerializeField] private string[] _feeOptionAddress; [SerializeField] private SerializableTransaction _transaction; [Header("Components")] [SerializeField] private GameObject _loadingObject; [SerializeField] private GameObject _sessionButtonObject; [SerializeField] private GameObject _transactionButtonObject; + [SerializeField] private MessagePopup _messagePopup; + [SerializeField] private TransactionResultPopup _transactionResult; private IWallet _wallet; @@ -49,18 +56,64 @@ public async void Load(IWallet wallet) public async void AddSession() { SetState(State.Loading); - var permission = new ContractPermission(new Address(_transaction.To), 0, 0);; - await _wallet.AddSession(permission); + + var deadline = new BigInteger(DateTimeOffset.UtcNow.ToUnixTimeSeconds() * 1000 + 1000 * 60 * 5000); + + IPermissions permissions; + if (_useFeeOptions) + { + var feeOptionsPermissions = new Permissions(_chain, + _feeOptionAddress + .Select(address => new ContractPermission(new Address(address), deadline, 0)).ToArray()); + + permissions = new Permissions(_chain, feeOptionsPermissions, + new ContractPermission(new Address(_transaction.To), deadline, 0)); + } + else + permissions = new ContractPermission(_chain, new Address(_transaction.To), deadline, 0); + + await _wallet.AddSession(permissions); await CheckSupportedTransaction(); } public async void SendTransaction() { SetState(State.Loading); - await _wallet.SendTransaction(_chain, _transaction.BuildTransaction()); + + var transaction = _transaction.BuildTransaction(); + + if (_useFeeOptions) + { + var feeOptions = await _wallet.GetFeeOption(_chain, transaction); + EcosystemFeatureSelection.Instance.OpenFeeOptionWindow(feeOptions, async feeOption => + { + if (feeOption != null) + await TrySendTransaction(transaction, feeOption); + + SetState(State.Transaction); + }); + + return; + } + + await TrySendTransaction(_transaction.BuildTransaction()); SetState(State.Transaction); } + private async Task TrySendTransaction(ITransaction transaction, FeeOption feeOption = null) + { + try + { + var txnHash = await _wallet.SendTransaction(_chain, transaction, feeOption); + _transactionResult.Show(_chain, txnHash); + } + catch (Exception e) + { + _messagePopup.Show(e.Message, true); + Debug.LogError($"{e.Message}"); + } + } + private async Task CheckSupportedTransaction() { SetState(State.Loading); diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionResultPopup.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionResultPopup.cs new file mode 100644 index 00000000..c2e79a9e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionResultPopup.cs @@ -0,0 +1,35 @@ +using TMPro; +using UnityEngine; + +namespace Sequence.Boilerplates +{ + [RequireComponent(typeof(ITween))] + public class TransactionResultPopup : MonoBehaviour + { + [SerializeField] private TMP_Text _messageText; + + private ITween _tweenAnimation; + private Chain _chain; + private string _txnHash; + + public void Show(Chain chain, string txnHash) + { + _chain = chain; + _txnHash = txnHash; + _tweenAnimation ??= GetComponent(); + _tweenAnimation.AnimateIn(0.3f); + _messageText.text = txnHash; + } + + public void Hide() + { + _tweenAnimation.AnimateOut(0.3f); + } + + public void OpenExplorer() + { + var explorer = ChainDictionaries.BlockExplorerOf[_chain]; + Application.OpenURL($"{explorer}txn/{_txnHash}"); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionResultPopup.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionResultPopup.cs.meta new file mode 100644 index 00000000..d6678317 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionResultPopup.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 07347b0867e3462aa3b6de3118f9aff3 +timeCreated: 1755155064 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs index abe150a6..3bcec8b3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs @@ -28,11 +28,16 @@ public EcosystemClient(EcosystemType ecosystem) /// public async Task CreateNewSession(bool isExplicit, SessionPermissions permissions, string preferredLoginMethod, string email = null) { - var sessionWallet = new EOAWallet(); - var chainId = string.Empty; if (permissions != null) + { + if (permissions.chainId <= 0) + throw new Exception("Invalid chainId."); + chainId = permissions.chainId.ToString(); + } + + var sessionWallet = new EOAWallet(); var origin = RedirectOrigin.GetOriginString(); var payload = new ConnectArgs diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs index 419d0076..c2fbc00a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs @@ -37,6 +37,14 @@ public interface IWallet /// Task SignMessage(Chain chain, string message); + /// + /// Get fee options for your calls. Only required for mainnets, if you don't have gas sponsorship configured. + /// + /// + /// + /// + Task GetFeeOption(Chain chain, ITransaction transaction); + /// /// Get fee options for your calls. Only required for mainnets, if you don't have gas sponsorship configured. /// diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs index 2438c1ba..def36196 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs @@ -93,15 +93,18 @@ public async Task SignMessage(Chain chain, string message) return response.Data; } + public async Task GetFeeOption(Chain chain, ITransaction transaction) + { + return await GetFeeOption(chain, new [] { transaction }); + } + public async Task GetFeeOption(Chain chain, ITransaction[] transactions) { AssertSessionSigners(); await _state.Update(chain); - Debug.Log($"{JsonConvert.SerializeObject(_state.SessionsTopology.JsonSerialize())}"); var calls = transactions.GetCalls(); - Debug.Log($"_state == null {_state == null}"); var txnService = new TransactionService(_sessionSigners, _state); var transactionData = await txnService.SignAndBuild(chain, calls, false); var relayer = new SequenceRelayer(chain); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs index bf9648d6..a59e87d9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs @@ -42,7 +42,6 @@ public Address IdentitySigner internal SessionSigner(SessionCredentials credentials) { _credentials = credentials; - ParentAddress = credentials.address; Address = new EOAWallet(credentials.privateKey).GetAddress(); Chain = string.IsNullOrEmpty(credentials.chainId) ? Chain.None : ChainDictionaries.ChainById[credentials.chainId]; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs index 04300b63..526a148f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs @@ -18,9 +18,6 @@ public SignerService(SessionSigner[] sessionSigners, SessionsTopology sessions) { _sessionSigners = sessionSigners; _sessions = sessions; - Debug.Log($"_sessionSigners == null {_sessionSigners == null}"); - Debug.Log($"_sessions == null {_sessions == null}"); - Debug.Log($"{JsonConvert.SerializeObject(_sessions.JsonSerialize())}"); } public async Task FindSignersForCalls(Chain chain, Call[] calls) @@ -59,6 +56,7 @@ private async Task FindSignerForEachCall(Chain chain, SessionSi if (supported) { signers.Add(signer); + Debug.Log($"Signer address {signer.Address}"); break; } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs index dd5a8a19..52372a0e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs @@ -2,10 +2,12 @@ using System.Threading.Tasks; using Nethereum.ABI.FunctionEncoding; using Nethereum.ABI.Model; +using Newtonsoft.Json; using Sequence.EcosystemWallet.KeyMachine.Models; using Sequence.EcosystemWallet.Primitives; using Sequence.Provider; using Sequence.Utils; +using Sequence.Utils.SecureStorage; using UnityEngine; using ConfigUpdate = Sequence.EcosystemWallet.KeyMachine.Models.ConfigUpdate; @@ -25,6 +27,7 @@ internal class WalletState public ConfigUpdate[] ConfigUpdates { get; private set; } private readonly KeyMachineApi _keyMachine = new(); + private readonly ISecureStorage _secureStorage = SecureStorageFactory.CreateSecureStorage(); public WalletState(Address address) { @@ -33,37 +36,86 @@ public WalletState(Address address) public async Task Update(Chain chain) { - var deployResponse = await _keyMachine.GetDeployHash(Address); + var deployResponse = await GetDeployHash(Address); DeployHash = deployResponse.deployHash; DeployContext = deployResponse.context; - var configUpdates = await _keyMachine.GetConfigUpdates(Address, deployResponse.deployHash); - var imageHash = configUpdates.updates.Length > 0 ? configUpdates.updates[^1].toImageHash : deployResponse.deployHash; + var configUpdates = await _keyMachine.GetConfigUpdates(Address, DeployHash); + var imageHash = configUpdates.updates.Length > 0 ? configUpdates.updates[^1].toImageHash : DeployHash; - var config = await _keyMachine.GetConfiguration(imageHash); - - Debug.Log($"Config: {config.ToJson()}"); + var config = await GetConfig(imageHash); var signerLeaf = config.topology.FindSignerLeaf(new Address("0x06aa3a8F781F2be39b888Ac8a639c754aEe9dA29")) as SapientSignerLeaf; SessionsImageHash = signerLeaf.imageHash; - var treeReturn = await _keyMachine.GetTree(SessionsImageHash); - var sessionsTopology = SessionsTopology.FromTree(treeReturn.tree.ToString()); + var sessionsTopology = await GetSessionsTopology(SessionsImageHash); ConfigUpdates = configUpdates.updates; ImageHash = imageHash; Config = config; SessionsTopology = sessionsTopology; - Debug.Log($"Sessions Topology {SessionsTopology.JsonSerialize()}"); - await UpdateNonce(chain, 0); + IsDeployed = await CheckDeployed(chain, Address); + } + + private async Task GetDeployHash(Address address) + { + var storageKey = $"sequence-deploy-hash-{address}"; + var cached = _secureStorage.RetrieveString(storageKey); + if (!string.IsNullOrEmpty(cached)) + return JsonConvert.DeserializeObject(cached); + + var deployResponse = await _keyMachine.GetDeployHash(address); + _secureStorage.StoreString(storageKey, JsonConvert.SerializeObject(deployResponse)); + + return deployResponse; + } + + private async Task GetConfig(string imageHash) + { + var storageKey = $"sequence-config-{imageHash}"; + var cached = _secureStorage.RetrieveString(storageKey); + if (!string.IsNullOrEmpty(cached)) + return Primitives.Config.FromJson(cached); + + var config = await _keyMachine.GetConfiguration(imageHash); + _secureStorage.StoreString(storageKey, config.ToJson()); + + return config; + } + + private async Task GetSessionsTopology(string imageHash) + { + var storageKey = $"sequence-sessions-tree-{imageHash}"; + var cached = _secureStorage.RetrieveString(storageKey); + if (!string.IsNullOrEmpty(cached)) + return SessionsTopology.FromTree(cached); + + var treeReturn = await _keyMachine.GetTree(SessionsImageHash); + var tree = treeReturn.tree.ToString(); + var sessionsTopology = SessionsTopology.FromTree(tree); + _secureStorage.StoreString(storageKey, tree); + + return sessionsTopology; + } + + private async Task CheckDeployed(Chain chain, Address address) + { + var storageKey = $"sequence-deployed-{chain.ToString()}-{address}"; + var cached = _secureStorage.RetrieveString(storageKey); + if (!string.IsNullOrEmpty(cached)) + return false; + var ethClient = new SequenceEthClient(chain); - var response = await ethClient.CodeAt(Address, "pending"); - IsDeployed = response != "0x"; + var response = await ethClient.CodeAt(address, "pending"); + var isDeployed = response != "0x"; + + if (isDeployed) + _secureStorage.StoreString(storageKey, "true"); - Debug.Log($"Is deployed: {IsDeployed}"); + return isDeployed; } public async Task UpdateNonce(Chain chain, BigInteger space) @@ -88,7 +140,6 @@ public async Task UpdateNonce(Chain chain, BigInteger space) }); Nonce = response == "0x" ? 0 : response.HexStringToBigInteger(); - Debug.Log($"Nonce: {Nonce}"); } } } \ No newline at end of file From c2b608e79f276c0fcdc535299d2f436d766efdc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 14 Aug 2025 09:44:46 +0200 Subject: [PATCH 145/165] added ref --- .../Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 126177e3..172f7a87 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -4742,7 +4742,7 @@ MonoBehaviour: _sessionButtonObject: {fileID: 1329197014} _transactionButtonObject: {fileID: 659355501} _messagePopup: {fileID: 1397315415} - _transactionResult: {fileID: 0} + _transactionResult: {fileID: 6440605247847260042} --- !u!114 &696230466 MonoBehaviour: m_ObjectHideFlags: 0 @@ -8578,7 +8578,7 @@ MonoBehaviour: _sessionButtonObject: {fileID: 215461105} _transactionButtonObject: {fileID: 965900426} _messagePopup: {fileID: 1397315415} - _transactionResult: {fileID: 0} + _transactionResult: {fileID: 6440605247847260042} --- !u!114 &1242786029 MonoBehaviour: m_ObjectHideFlags: 0 @@ -14453,7 +14453,7 @@ MonoBehaviour: _sessionButtonObject: {fileID: 1853883865} _transactionButtonObject: {fileID: 1280987657} _messagePopup: {fileID: 1397315415} - _transactionResult: {fileID: 0} + _transactionResult: {fileID: 6440605247847260042} --- !u!114 &2097849103 MonoBehaviour: m_ObjectHideFlags: 0 From 297a61347f4c02551756a1dcc923b3007f073a37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 14 Aug 2025 14:17:44 +0200 Subject: [PATCH 146/165] latest changes --- .../Sequence/Samples~/Demo V3/DemoV3.unity | 134 ++++++++-------- .../Demo V3/Prefabs/FeeOptionTile.prefab | 151 +++++++++++++----- .../Scripts/EcosystemWallet/FeeOptionTile.cs | 7 +- .../SequenceEcosystemWalletWindow.cs | 16 -- .../EcosystemWallet/TransactionResultPopup.cs | 2 +- .../Authentication/EcosystemClient.cs | 33 +++- .../LocalhostRedirectHandler.cs | 21 +-- .../RedirectHandler/LocalhostServer.cs | 53 ++++++ .../RedirectHandler/LocalhostServer.cs.meta | 3 + .../Authentication/RedirectOrigin.cs | 11 +- .../Authentication/SequenceConnect.cs | 4 +- .../Permissions/ContractPermission.cs | 9 +- .../EcosystemWallet/Wallet/SequenceWallet.cs | 5 +- .../EcosystemWallet/Wallet/SessionSigner.cs | 8 +- .../Wallet/SignatureService.cs | 2 +- .../EcosystemWallet/Wallet/SignerService.cs | 1 - .../EcosystemWallet/Wallet/WalletState.cs | 40 ++++- .../Ethereum/ABI/Coders/TupleCoder.cs | 12 -- ProjectSettings/EditorSettings.asset | 29 +++- 19 files changed, 359 insertions(+), 182 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostServer.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostServer.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 172f7a87..8a3ea630 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -1716,11 +1716,11 @@ RectTransform: - {fileID: 400068442} - {fileID: 988110724} - {fileID: 317570298} - m_Father: {fileID: 2198483992803733903} + m_Father: {fileID: 4209220039127894524} 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: 5} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 30} m_Pivot: {x: 0.5, y: 0} --- !u!114 &191605879 @@ -1803,7 +1803,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 1} + m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -1864,10 +1864,10 @@ RectTransform: - {fileID: 748463502} m_Father: {fileID: 4209220039127894524} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 105, y: -220} - m_SizeDelta: {x: 210, y: 30} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &203863151 MonoBehaviour: @@ -1921,7 +1921,7 @@ MonoBehaviour: m_PressedTrigger: Pressed m_SelectedTrigger: Selected m_DisabledTrigger: Disabled - m_Interactable: 0 + m_Interactable: 1 m_TargetGraphic: {fileID: 203863153} m_OnClick: m_PersistentCalls: @@ -3473,10 +3473,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 4209220039127894524} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 105, y: -55} - m_SizeDelta: {x: 210, y: 10} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 10} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &467585877 MonoBehaviour: @@ -3906,10 +3906,10 @@ RectTransform: - {fileID: 1883453221} m_Father: {fileID: 4209220039127894524} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 105, y: -185} - m_SizeDelta: {x: 210, y: 30} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &512459742 MonoBehaviour: @@ -3963,7 +3963,7 @@ MonoBehaviour: m_PressedTrigger: Pressed m_SelectedTrigger: Selected m_DisabledTrigger: Disabled - m_Interactable: 0 + m_Interactable: 1 m_TargetGraphic: {fileID: 512459744} m_OnClick: m_PersistentCalls: @@ -4076,7 +4076,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Wallet Profile + m_text: Sponsored, without fee options. m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -4714,9 +4714,9 @@ RectTransform: - {fileID: 1870792378} m_Father: {fileID: 697728234} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -150} m_SizeDelta: {x: 210, y: 40} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &696230465 @@ -4820,7 +4820,7 @@ RectTransform: 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: 185} m_Pivot: {x: 0.5, y: 1} --- !u!114 &697728235 MonoBehaviour: @@ -4919,7 +4919,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Wallet Profile + m_text: explicitEmit() & fee (mainnet) m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -5032,10 +5032,10 @@ RectTransform: - {fileID: 17360257} m_Father: {fileID: 4209220039127894524} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 105, y: -30} - m_SizeDelta: {x: 210, y: 30} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &722266042 MonoBehaviour: @@ -5798,9 +5798,9 @@ RectTransform: - {fileID: 1310990841} m_Father: {fileID: 697728234} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -20} m_SizeDelta: {x: 210, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &865590363 @@ -7741,10 +7741,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 4209220039127894524} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 105, y: -5} - m_SizeDelta: {x: 210, y: 10} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 10} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1115529826 MonoBehaviour: @@ -7957,7 +7957,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &1146219656 RectTransform: m_ObjectHideFlags: 0 @@ -8551,9 +8551,9 @@ RectTransform: - {fileID: 921594784} m_Father: {fileID: 697728234} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -105} m_SizeDelta: {x: 210, y: 40} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1242786028 @@ -9177,7 +9177,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Wallet Profile + m_text: imlpicitEmit() (testnet) m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -9977,7 +9977,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Wallet Profile + m_text: Sponsored, without fee options. m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -12475,7 +12475,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Wallet Profile + m_text: Select a fee option. m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -14224,7 +14224,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Wallet Profile + m_text: explicitEmit() (testnet) m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -14426,9 +14426,9 @@ RectTransform: - {fileID: 802456208} m_Father: {fileID: 697728234} 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_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -60} m_SizeDelta: {x: 210, y: 40} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2097849102 @@ -14814,10 +14814,10 @@ RectTransform: - {fileID: 900828005} m_Father: {fileID: 4209220039127894524} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 105, y: -115} - m_SizeDelta: {x: 210, y: 30} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1181566138228532167 MonoBehaviour: @@ -15203,7 +15203,6 @@ RectTransform: m_Children: - {fileID: 5231001844959997297} - {fileID: 5231001846775536177} - - {fileID: 191605878} - {fileID: 4209220039127894524} - {fileID: 8737090446545054563} - {fileID: 5107492344900098707} @@ -15212,7 +15211,7 @@ RectTransform: 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: 240, y: 420} + m_SizeDelta: {x: 240, y: 325} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &2223926832334533402 GameObject: @@ -15630,10 +15629,10 @@ RectTransform: - {fileID: 7053000246198018492} m_Father: {fileID: 4209220039127894524} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 105, y: -80} - m_SizeDelta: {x: 210, y: 30} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &3025777727642342367 MonoBehaviour: @@ -15752,10 +15751,10 @@ RectTransform: - {fileID: 1446444769} m_Father: {fileID: 4209220039127894524} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 105, y: -150} - m_SizeDelta: {x: 210, y: 30} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &3531690967744880414 GameObject: @@ -15922,6 +15921,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 1115529825} + - {fileID: 191605878} - {fileID: 722266041} - {fileID: 467585876} - {fileID: 2856355940061643817} @@ -15934,7 +15934,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: -40} - m_SizeDelta: {x: -30, y: 235} + m_SizeDelta: {x: -30, y: 0} m_Pivot: {x: 0.5, y: 1} --- !u!224 &4231729613209684367 RectTransform: @@ -17712,11 +17712,11 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_SizeDelta.x - value: -30 + value: 0 objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_SizeDelta.y - value: 20 + value: 30 objectReference: {fileID: 0} - target: {fileID: 7657044420813839511, guid: 966db14eeeb454e9e955ca15d6338762, type: 3} propertyPath: m_LocalPosition.x @@ -17873,8 +17873,8 @@ RectTransform: 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: -50, y: 0} + m_AnchoredPosition: {x: -12.5, y: 0} + m_SizeDelta: {x: -75, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!225 &9144345594371459761 CanvasGroup: @@ -17953,7 +17953,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!114 &9144345594371459776 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/FeeOptionTile.prefab b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/FeeOptionTile.prefab index e886ff8d..f82f575d 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/FeeOptionTile.prefab +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/FeeOptionTile.prefab @@ -32,8 +32,9 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: + - {fileID: 8920924071354788044} - {fileID: 113041410790801271} - - {fileID: 1730389250431061217} + - {fileID: 6552880901462568505} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} @@ -53,8 +54,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 8045cb91dd5f4559ad166d6a24366e2d, type: 3} m_Name: m_EditorClassIdentifier: + _logoImage: {fileID: 288285889312663865} _nameText: {fileID: 4274670708990135750} - _valueText: {fileID: 972850526285019443} + _valueText: {fileID: 6114889452991144139} --- !u!114 &300926986013208494 MonoBehaviour: m_ObjectHideFlags: 0 @@ -149,7 +151,7 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 2 ---- !u!1 &4428645227185661108 +--- !u!1 &2182040293823152227 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -157,23 +159,98 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 113041410790801271} - - component: {fileID: 9212016898007033605} - - component: {fileID: 4274670708990135750} + - component: {fileID: 8920924071354788044} + - component: {fileID: 6526554693281513923} + - component: {fileID: 288285889312663865} m_Layer: 5 - m_Name: TitleText + m_Name: Image m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &113041410790801271 +--- !u!224 &8920924071354788044 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4428645227185661108} + m_GameObject: {fileID: 2182040293823152227} + 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: 1062154270139711604} + 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, y: 0.5} +--- !u!222 &6526554693281513923 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2182040293823152227} + m_CullTransparentMesh: 1 +--- !u!114 &288285889312663865 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2182040293823152227} + 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!1 &2708300152223207940 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6552880901462568505} + - component: {fileID: 1767086920285922199} + - component: {fileID: 6114889452991144139} + m_Layer: 5 + m_Name: TitleText (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6552880901462568505 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2708300152223207940} 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} @@ -182,25 +259,25 @@ RectTransform: m_Father: {fileID: 1062154270139711604} 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_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 15, y: 5} + m_SizeDelta: {x: -50, y: -10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &9212016898007033605 +--- !u!222 &1767086920285922199 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4428645227185661108} + m_GameObject: {fileID: 2708300152223207940} m_CullTransparentMesh: 1 ---- !u!114 &4274670708990135750 +--- !u!114 &6114889452991144139 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4428645227185661108} + m_GameObject: {fileID: 2708300152223207940} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -223,8 +300,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} + rgba: 4291611852 + m_fontColor: {r: 0.8, g: 0.8, b: 0.8, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -247,7 +324,7 @@ MonoBehaviour: m_enableAutoSizing: 0 m_fontSizeMin: 18 m_fontSizeMax: 72 - m_fontStyle: 1 + m_fontStyle: 0 m_HorizontalAlignment: 1 m_VerticalAlignment: 512 m_textAlignment: 65535 @@ -283,7 +360,7 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!1 &6291137503320472345 +--- !u!1 &4428645227185661108 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -291,23 +368,23 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1730389250431061217} - - component: {fileID: 5806813327146978764} - - component: {fileID: 972850526285019443} + - component: {fileID: 113041410790801271} + - component: {fileID: 9212016898007033605} + - component: {fileID: 4274670708990135750} m_Layer: 5 - m_Name: TitleText (1) + m_Name: TitleText m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1730389250431061217 +--- !u!224 &113041410790801271 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6291137503320472345} + m_GameObject: {fileID: 4428645227185661108} 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} @@ -315,26 +392,26 @@ RectTransform: m_Children: [] m_Father: {fileID: 1062154270139711604} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -20, y: -20} + m_AnchoredPosition: {x: 15, y: -5} + m_SizeDelta: {x: -50, y: -10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &5806813327146978764 +--- !u!222 &9212016898007033605 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6291137503320472345} + m_GameObject: {fileID: 4428645227185661108} m_CullTransparentMesh: 1 ---- !u!114 &972850526285019443 +--- !u!114 &4274670708990135750 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6291137503320472345} + m_GameObject: {fileID: 4428645227185661108} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} @@ -357,8 +434,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4289901234 - m_fontColor: {r: 0.7, g: 0.7, b: 0.7, a: 1} + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -381,8 +458,8 @@ MonoBehaviour: m_enableAutoSizing: 0 m_fontSizeMin: 18 m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 4 + m_fontStyle: 1 + m_HorizontalAlignment: 1 m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionTile.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionTile.cs index 1e5ba217..6906660d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionTile.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionTile.cs @@ -4,23 +4,26 @@ using Sequence.Utils; using TMPro; using UnityEngine; +using UnityEngine.UI; namespace Sequence.Boilerplates { public class FeeOptionTile : MonoBehaviour { + [SerializeField] private Image _logoImage; [SerializeField] private TMP_Text _nameText; [SerializeField] private TMP_Text _valueText; private FeeOption _feeOption; private Action _onSelected; - public void Load(FeeOption feeOption, Action onSelected) + public async void Load(FeeOption feeOption, Action onSelected) { _feeOption = feeOption; _onSelected = onSelected; - _nameText.text = feeOption.token.name; + _nameText.text = $"{feeOption.token.name} ({feeOption.token.symbol})"; _valueText.text = DecimalNormalizer.ReturnToNormalPrecise(BigInteger.Parse(feeOption.value), feeOption.token.decimals).ToString(); + _logoImage.sprite = await AssetHandler.GetSpriteAsync(feeOption.token.logoURL); } public void Select() diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index 25a45612..624a91bf 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -64,7 +64,6 @@ public void Open() OnImplicitSessionTypeChanged(0); OnExplicitSessionTypeChanged(0); - EnableWalletState(false); EnableEmailButton(true); _chainDropdown.ClearOptions(); @@ -162,16 +161,6 @@ private void ShowError(string error) _messagePopup.Show(error, true); SetLoading(false); } - - public void EnableWalletState(bool enable) - { - _loginState.SetActive(!enable); - - var rect = transform as RectTransform; - var size = rect.sizeDelta; - size.y = enable ? 420 : 290; - rect.sizeDelta = size; - } public void EnableEmailButton(bool enable) { @@ -201,11 +190,6 @@ private IPermissions GetImplicitPermissions() return GetPermissionsFromSessionType((int)_implicitPermissions); } - private IPermissions GetExplicitPermissions() - { - return GetPermissionsFromSessionType((int)_explicitPermissions + 1); - } - private IPermissions GetPermissionsFromSessionType(int type) { if (type == 0) diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionResultPopup.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionResultPopup.cs index c2e79a9e..48efe90e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionResultPopup.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionResultPopup.cs @@ -29,7 +29,7 @@ public void Hide() public void OpenExplorer() { var explorer = ChainDictionaries.BlockExplorerOf[_chain]; - Application.OpenURL($"{explorer}txn/{_txnHash}"); + Application.OpenURL($"{explorer}tx/{_txnHash}"); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs index 3bcec8b3..e20d7dbc 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs @@ -26,7 +26,7 @@ public EcosystemClient(EcosystemType ecosystem) /// Leave it null to create an implicit session. Otherwise, we create an explicit session. /// /// - public async Task CreateNewSession(bool isExplicit, SessionPermissions permissions, string preferredLoginMethod, string email = null) + public async Task CreateNewSession(bool isExplicit, SessionPermissions permissions, string preferredLoginMethod, string email = null) { var chainId = string.Empty; if (permissions != null) @@ -60,7 +60,11 @@ public async Task CreateNewSession(bool isExplicit, SessionPermis if (!response.Result) throw new Exception("Error during request"); - var credentials = new SessionCredentials( + var isImplicitWithPermissions = !isExplicit && permissions != null; + var credentialsLen = isImplicitWithPermissions ? 2 : 1; + var credentials = new SessionCredentials[credentialsLen]; + + credentials[0] = new SessionCredentials( isExplicit, sessionWallet.GetPrivateKeyAsHex(), response.Data.walletAddress, @@ -71,8 +75,29 @@ public async Task CreateNewSession(bool isExplicit, SessionPermis response.Data.loginMethod, response.Data.email); - SessionStorage.AddSession(credentials); - return new SessionSigner(credentials); + if (isImplicitWithPermissions) + { + credentials[1] = new SessionCredentials( + true, + sessionWallet.GetPrivateKeyAsHex(), + response.Data.walletAddress, + null, + null, + (int)_ecosystem, + chainId, + response.Data.loginMethod, + response.Data.email); + } + + var signers = new SessionSigner[credentials.Length]; + for (var i = 0; i < credentials.Length; i++) + { + var credential = credentials[i]; + signers[i] = new SessionSigner(credential); + SessionStorage.AddSession(credential); + } + + return signers; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs index 1a2de684..62f3af39 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs @@ -1,9 +1,7 @@ using System; -using System.Net; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; -using Sequence.Utils; using UnityEngine; namespace Sequence.EcosystemWallet.Browser @@ -16,19 +14,14 @@ internal class LocalhostRedirectHandler : RedirectHandler try { - var listener = new HttpListener(); - listener.Prefixes.Add(RedirectUrl.AppendTrailingSlashIfNeeded()); - listener.Start(); - - var result = await listener.GetContextAsync(); + var server = GameObject.FindObjectOfType(); + if (!server) + { + server = new GameObject("LocalhostServer").AddComponent(); + } - listener.Stop(); + var queryString = await server.Run(RedirectUrl); - if (result == null) - throw new Exception("Request timed out."); - - var queryString = result.Request.QueryString; - var id = queryString["id"]; if (id != Id) throw new Exception("Incorrect request id"); @@ -39,8 +32,6 @@ internal class LocalhostRedirectHandler : RedirectHandler var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(queryString["payload"])); var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); - Debug.Log($"{responsePayloadJson}"); - return (true, responsePayload); } catch (Exception ex) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostServer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostServer.cs new file mode 100644 index 00000000..71b69f7d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostServer.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet.Browser +{ + public class LocalhostServer : MonoBehaviour + { + private static HttpListener _listener; + + public async Task Run(string url) + { + try + { + if (_listener == null) + { + _listener = new HttpListener + { + Prefixes = { url.AppendTrailingSlashIfNeeded() }, + }; + + _listener.Start(); + } + + var result = await _listener.GetContextAsync(); + + var responseString = "{}"; + var buffer = Encoding.UTF8.GetBytes(responseString); + + result.Response.StatusCode = 200; + result.Response.ContentType = "application/json"; + result.Response.ContentLength64 = buffer.Length; + result.Response.KeepAlive = true; + + await result.Response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + + result.Response.OutputStream.Close(); + result.Response.Close(); + + return result.Request.QueryString; + } + catch (System.Exception e) + { + Debug.LogError(e); + return null; + } + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostServer.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostServer.cs.meta new file mode 100644 index 00000000..a2c4351a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostServer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 49abc1f924914e7ca5f65917c1d0cbe1 +timeCreated: 1755166229 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs index 683c55f0..be9e7552 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs @@ -24,16 +24,7 @@ public static string GetOriginString() #else public static string GetOriginString() { - return $"http://localhost:{GetAvailablePort()}"; - } - - private static int GetAvailablePort() - { - var tcpListener = new TcpListener(IPAddress.Loopback, 4444); - tcpListener.Start(); - var port = ((IPEndPoint)tcpListener.LocalEndpoint).Port; - tcpListener.Stop(); - return port; + return $"http://localhost:4444"; } #endif } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index eb00777f..9d3aed65 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -39,8 +39,8 @@ public async Task SignInWithMnemonic(IPermissions permissions = null) private async Task SignIn(IPermissions permissions, string preferredLoginMethod, string email) { - var signer = await _client.CreateNewSession(false, permissions?.GetPermissions(), preferredLoginMethod, email); - return new SequenceWallet(new [] { signer }); + var signers = await _client.CreateNewSession(false, permissions?.GetPermissions(), preferredLoginMethod, email); + return new SequenceWallet(signers); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs index df2a156e..7d63209d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Numerics; using Sequence.EcosystemWallet.Primitives; @@ -10,6 +11,7 @@ public class ContractPermission : IPermissions private readonly Address _contract; private readonly BigInteger _deadline; private readonly BigInteger _valueLimit; + private readonly List _rules = new(); public ContractPermission(Address contract, BigInteger deadline, BigInteger valueLimit) { @@ -25,10 +27,15 @@ public ContractPermission(Chain chain, Address contract, BigInteger deadline, Bi _deadline = deadline; _valueLimit = valueLimit; } + + public void AddRule(ParameterRule rule) + { + _rules.Add(rule); + } public SessionPermissions GetPermissions() { - var permissions = new[] { new Permission { target = _contract, rules = Array.Empty() } }; + var permissions = new[] { new Permission { target = _contract, rules = _rules.ToArray() } }; return new SessionPermissions { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs index def36196..e6f038ea 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs @@ -57,8 +57,9 @@ public async Task AddSession(IPermissions permissions) var ecosystem = _sessionSigners[0].Ecosystem; var client = new EcosystemClient(ecosystem); - var sessionSigner = await client.CreateNewSession(true, permissions.GetPermissions(), string.Empty); - _sessionSigners = _sessionSigners.AddToArray(sessionSigner); + var sessionSigners = await client.CreateNewSession(true, permissions.GetPermissions(), string.Empty); + foreach (var sessionSigner in sessionSigners) + _sessionSigners = _sessionSigners.AddToArray(sessionSigner); } public void Disconnect() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs index a59e87d9..59343f13 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs @@ -7,7 +7,9 @@ using Sequence.Signer; using Sequence.Utils; using Sequence.Wallet; +using Unity.Plastic.Newtonsoft.Json; using UnityEngine; +using JsonConvert = Newtonsoft.Json.JsonConvert; namespace Sequence.EcosystemWallet { @@ -94,7 +96,7 @@ public async Task IsSupportedCall(Call call, Chain chain, SessionsTopology if (permissionIndex < 0) return (-1, null); - + return (permissionIndex, sessionPermissions.permissions[permissionIndex]); } @@ -119,13 +121,15 @@ public SessionCallSignature SignCall(Chain chain, Call call, SessionsTopology to throw new Exception("Invalid permission"); } + + Debug.Log($"ExplicitSessionCallSignature {permissionIndex}"); return new ExplicitSessionCallSignature { permissionIndex = permissionIndex, sessionSignature = rsy }; } - + Debug.Log($"ImplicitSessionCallSignature"); return new ImplicitSessionCallSignature { attestation = _credentials.attestation, diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs index 7ab5f6e2..5b8f61b3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs @@ -34,7 +34,7 @@ public async Task SignCalls(Chain chain, string imageHash, Envelop var signedEnvelope = envelope.ToSigned(sapientSignature); var rawSignature = SignatureHandler.EncodeSignature(signedEnvelope); - rawSignature.suffix = configUpdates.Select(u => + rawSignature.suffix = configUpdates.Reverse().Select(u => RawSignature.Decode(u.signature.HexStringToByteArray())).ToArray(); return rawSignature; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs index 526a148f..2f63df60 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs @@ -56,7 +56,6 @@ private async Task FindSignerForEachCall(Chain chain, SessionSi if (supported) { signers.Add(signer); - Debug.Log($"Signer address {signer.Address}"); break; } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs index 52372a0e..084b1051 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs @@ -44,8 +44,9 @@ public async Task Update(Chain chain) var imageHash = configUpdates.updates.Length > 0 ? configUpdates.updates[^1].toImageHash : DeployHash; var config = await GetConfig(imageHash); - - var signerLeaf = config.topology.FindSignerLeaf(new Address("0x06aa3a8F781F2be39b888Ac8a639c754aEe9dA29")) as SapientSignerLeaf; + + var sessionsManager = new Address("0x06aa3a8F781F2be39b888Ac8a639c754aEe9dA29"); + var signerLeaf = config.topology.FindSignerLeaf(sessionsManager) as SapientSignerLeaf; SessionsImageHash = signerLeaf.imageHash; var sessionsTopology = await GetSessionsTopology(SessionsImageHash); @@ -101,12 +102,45 @@ private async Task GetSessionsTopology(string imageHash) return sessionsTopology; } + private async Task GetImplementation(Chain chain) + { + var response = await new SequenceEthClient(chain).CallContract(new object[] { + new + { + to = Address, + data = ABI.ABI.Pack("getImplementation()") + } + }); + + var data = response.HexStringToByteArray(); + var addressData = data.Slice(data.Length - 20); + + // If this equals 0x2a4fB19F66F1427A5E363Bf1bB3be27b9A9ACC39, then this is a stage1 wallet + // stage2 wallets need to get their image hashes from the on chain configuration + var address = new Address(addressData.ByteArrayToHexStringWithPrefix()); + + Debug.Log($"Get Implementation {address}"); + } + + private async Task GetOnChainImageHash(Chain chain) + { + var response = await new SequenceEthClient(chain).CallContract(new object[] { + new + { + to = Address, + data = ABI.ABI.Pack("imageHash()") + } + }); + + Debug.Log($"Onchain image hash {response}"); + } + private async Task CheckDeployed(Chain chain, Address address) { var storageKey = $"sequence-deployed-{chain.ToString()}-{address}"; var cached = _secureStorage.RetrieveString(storageKey); if (!string.IsNullOrEmpty(cached)) - return false; + return true; var ethClient = new SequenceEthClient(chain); var response = await ethClient.CodeAt(address, "pending"); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs index 3324bb8a..c79dbca6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs @@ -94,19 +94,15 @@ public string EncodeToString(object value, string[] evmTypes) { //Statics: head(X(i)) = enc(X(i) and tail(X(i)) = "" (the empty string) case ABIType.BOOLEAN: - SequenceLog.Info("object in tuple array: boolean"); head_i = _booleanCoder.EncodeToString(valueTuple[i]); break; case ABIType.NUMBER: - SequenceLog.Info("object in tuple array: number"); head_i = _numberCoder.EncodeToString(valueTuple[i]); break; case ABIType.ADDRESS: - SequenceLog.Info("object in tuple array: address"); head_i = _addressCoder.EncodeToString(valueTuple[i]); break; case ABIType.FIXEDBYTES: - SequenceLog.Info("object in tuple array: static bytes"); head_i = _staticBytesCoder.EncodeToString(valueTuple[i]); break; //Dynamics: head(X(i)) = enc(len( head(X(1)) ... head(X(k)) tail(X(1)) ... tail(X(i-1)) )) tail(X(i)) = enc(X(i)) @@ -115,38 +111,30 @@ public string EncodeToString(object value, string[] evmTypes) tail_i = _fixedBytesCoder.EncodeToString(valueTuple[i]); break; case ABIType.STRING: - SequenceLog.Info("object in tuple array: string"); Encoding utf8 = Encoding.UTF8; head_i = _numberCoder.EncodeToString((object)(headerTotalByteLength + tailLength)); tail_i = _fixedBytesCoder.EncodeToString(utf8.GetBytes((string)valueTuple[i])); break; case ABIType.DYNAMICARRAY: - SequenceLog.Info("object in tuple array: dynamic array"); head_i = _numberCoder.EncodeToString((object)(headerTotalByteLength + tailLength)); - SequenceLog.Info("dynamic array head: " + head_i); //intList.Cast().ToList(); int numberCount = 0; if (valueTuple[i] != null) { numberCount = ((IList)valueTuple[i]).Count; } - SequenceLog.Info("number count:" + numberCount); string numberCountEncoded = _numberCoder.EncodeToString(numberCount); - SequenceLog.Info("dynamic array tail number count: " + numberCountEncoded); tail_i = numberCountEncoded + EncodeToString(valueTuple[i], ArrayUtils.BuildArrayWithRepeatedValue(ABI.GetUnderlyingCollectionTypeName(evmTypes[i]), numberCount)); - SequenceLog.Info("dynamic array tail: " + tail_i); break; case ABIType.FIXEDARRAY: - SequenceLog.Info("object in tuple array: fixed array"); numberCount = ABI.GetInnerValue(evmTypes[i]); head_i = EncodeToString(valueTuple[i], ArrayUtils.BuildArrayWithRepeatedValue(ABI.GetUnderlyingCollectionTypeName(evmTypes[i]), numberCount)); break; case ABIType.TUPLE: - SequenceLog.Info("object in tuple array: tuple"); head_i = _numberCoder.EncodeToString((object)(headerTotalByteLength + tailLength)); tail_i = EncodeToString(valueTuple[i], ABI.GetTupleTypes(evmTypes[i])); break; diff --git a/ProjectSettings/EditorSettings.asset b/ProjectSettings/EditorSettings.asset index 1e44a0a1..e81e9714 100644 --- a/ProjectSettings/EditorSettings.asset +++ b/ProjectSettings/EditorSettings.asset @@ -3,28 +3,45 @@ --- !u!159 &1 EditorSettings: m_ObjectHideFlags: 0 - serializedVersion: 11 - m_ExternalVersionControlSupport: Visible Meta Files + serializedVersion: 12 m_SerializationMode: 2 m_LineEndingsForNewScripts: 0 m_DefaultBehaviorMode: 0 m_PrefabRegularEnvironment: {fileID: 0} m_PrefabUIEnvironment: {fileID: 0} m_SpritePackerMode: 0 + m_SpritePackerCacheSize: 10 m_SpritePackerPaddingPower: 1 + m_Bc7TextureCompressor: 0 m_EtcTextureCompressorBehavior: 1 m_EtcTextureFastCompressor: 1 m_EtcTextureNormalCompressor: 2 m_EtcTextureBestCompressor: 4 m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref m_ProjectGenerationRootNamespace: - m_CollabEditorSettings: - inProgressEnabled: 1 m_EnableTextureStreamingInEditMode: 1 m_EnableTextureStreamingInPlayMode: 1 + m_EnableEditorAsyncCPUTextureLoading: 0 m_AsyncShaderCompilation: 1 + m_PrefabModeAllowAutoSave: 1 m_EnterPlayModeOptionsEnabled: 0 - m_EnterPlayModeOptions: 3 - m_ShowLightmapResolutionOverlay: 1 + m_EnterPlayModeOptions: 0 + m_GameObjectNamingDigits: 1 + m_GameObjectNamingScheme: 0 + m_AssetNamingUsesSpace: 1 + m_InspectorUseIMGUIDefaultInspector: 0 m_UseLegacyProbeSampleCount: 0 m_SerializeInlineMappingsOnOneLine: 1 + m_DisableCookiesInLightmapper: 0 + m_AssetPipelineMode: 1 + m_RefreshImportMode: 0 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 + m_CacheServerEnableAuth: 0 + m_CacheServerEnableTls: 0 + m_CacheServerValidationMode: 2 + m_CacheServerDownloadBatchSize: 128 + m_EnableEnlightenBakedGI: 0 From 90ddd8e330757d8054fc84ca136d81fb35e11e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 14 Aug 2025 21:28:34 +0200 Subject: [PATCH 147/165] chrome tabs plugin, demo scene updates --- Assets/Plugins/Android/AndroidManifest.xml | 12 + .../Plugins/Android/gradleTemplate.properties | 4 +- Assets/Plugins/Android/mainTemplate.gradle | 1 + .../Plugins/Android/ChromeTabsPlugin.java | 67 + .../Android/ChromeTabsPlugin.java.meta | 3 + .../Sequence/Samples~/Demo V3/DemoV3.unity | 3673 ++++++----------- .../Demo V3/Prefabs/SessionWalletTile.prefab | 327 +- .../SequenceEcosystemWalletWindow.cs | 24 +- .../EcosystemWallet/SessionWalletTile.cs | 4 - .../EcosystemWallet/TransactionButton.cs | 39 +- .../RedirectHandler/BrowserRedirectHandler.cs | 2 +- .../DeeplinkRedirectHandler.cs | 2 +- .../RedirectHandler/NativeReceiver.cs | 30 +- .../RedirectHandler/TcpRedirectHandler.cs | 160 - .../TcpRedirectHandler.cs.meta | 3 - .../EcosystemWallet/Wallet/SequenceWallet.cs | 2 - .../EcosystemWallet/Wallet/SessionSigner.cs | 7 +- .../EcosystemWallet/Wallet/SignerService.cs | 2 - .../Relayer/DataTypes/FeeOption.cs | 3 + .../Relayer/DataTypes/FeeOptionsReturn.cs | 3 + .../DataTypes/GetMetaTxnReceiptReturn.cs | 3 + .../Relayer/DataTypes/SendMetaTxnReturn.cs | 3 + .../Sequence/SequenceSDK/Utils/ChromeTabs.cs | 47 + .../SequenceSDK/Utils/ChromeTabs.cs.meta | 3 + ProjectSettings/ProjectSettings.asset | 94 +- 25 files changed, 1474 insertions(+), 3044 deletions(-) create mode 100644 Packages/Sequence-Unity/Plugins/Android/ChromeTabsPlugin.java create mode 100644 Packages/Sequence-Unity/Plugins/Android/ChromeTabsPlugin.java.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/TcpRedirectHandler.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/TcpRedirectHandler.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ChromeTabs.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ChromeTabs.cs.meta diff --git a/Assets/Plugins/Android/AndroidManifest.xml b/Assets/Plugins/Android/AndroidManifest.xml index f5b7100e..e87a1726 100644 --- a/Assets/Plugins/Android/AndroidManifest.xml +++ b/Assets/Plugins/Android/AndroidManifest.xml @@ -15,4 +15,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Assets/Plugins/Android/gradleTemplate.properties b/Assets/Plugins/Android/gradleTemplate.properties index 4092513e..d2decbf3 100644 --- a/Assets/Plugins/Android/gradleTemplate.properties +++ b/Assets/Plugins/Android/gradleTemplate.properties @@ -3,6 +3,4 @@ org.gradle.parallel=true android.enableJetifier=true android.useAndroidX=true unityStreamingAssets=**STREAMING_ASSETS** -**ADDITIONAL_PROPERTIES** - -android.enableR8=**MINIFY_WITH_R_EIGHT** \ No newline at end of file +**ADDITIONAL_PROPERTIES** \ No newline at end of file diff --git a/Assets/Plugins/Android/mainTemplate.gradle b/Assets/Plugins/Android/mainTemplate.gradle index 388db62c..a7953128 100644 --- a/Assets/Plugins/Android/mainTemplate.gradle +++ b/Assets/Plugins/Android/mainTemplate.gradle @@ -4,6 +4,7 @@ apply plugin: 'com.android.library' dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.security:security-crypto:1.1.0-alpha03' + implementation 'androidx.browser:browser:1.7.0' **DEPS**} diff --git a/Packages/Sequence-Unity/Plugins/Android/ChromeTabsPlugin.java b/Packages/Sequence-Unity/Plugins/Android/ChromeTabsPlugin.java new file mode 100644 index 00000000..1d1e0d2d --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Android/ChromeTabsPlugin.java @@ -0,0 +1,67 @@ +package xyz.sequence; + +import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.Intent; +import android.net.Uri; + +import androidx.browser.customtabs.CustomTabColorSchemeParams; +import androidx.browser.customtabs.CustomTabsClient; +import androidx.browser.customtabs.CustomTabsIntent; + +import com.unity3d.player.UnityPlayer; + +public final class ChromeTabsPlugin { + private ChromeTabsPlugin() {} + + public static void openUrl(final String url) { + openUrl(url, 0, false, true); + } + + public static void openUrl(final String url, final int toolbarColor, final boolean enableShare, final boolean showTitle) { + final Activity activity = UnityPlayer.currentActivity; + if (activity == null || url == null) return; + + activity.runOnUiThread(new Runnable() { + @Override public void run() { + try { + CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); + + if (toolbarColor != 0) { + CustomTabColorSchemeParams params = new CustomTabColorSchemeParams.Builder() + .setToolbarColor(toolbarColor) + .build(); + builder.setDefaultColorSchemeParams(params); + } + + builder.setShareState(enableShare ? CustomTabsIntent.SHARE_STATE_ON : CustomTabsIntent.SHARE_STATE_OFF); + builder.setShowTitle(showTitle); + + CustomTabsIntent customTabsIntent = builder.build(); + + // Prefer a browser that supports Custom Tabs. + String pkg = CustomTabsClient.getPackageName(activity, null); + if (pkg != null) { + customTabsIntent.intent.setPackage(pkg); + } + + Uri uri = Uri.parse(url); + customTabsIntent.launchUrl(activity, uri); + } catch (ActivityNotFoundException e) { + // Fallback to a regular VIEW intent if no Custom Tabs capable browser. + try { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + activity.startActivity(intent); + } catch (Exception ignored) {} + } catch (Exception ignored) {} + } + }); + } + + public static boolean isCustomTabsSupported() { + Activity activity = UnityPlayer.currentActivity; + if (activity == null) return false; + String pkg = CustomTabsClient.getPackageName(activity, null); + return pkg != null; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Plugins/Android/ChromeTabsPlugin.java.meta b/Packages/Sequence-Unity/Plugins/Android/ChromeTabsPlugin.java.meta new file mode 100644 index 00000000..9005624e --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Android/ChromeTabsPlugin.java.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9987dabe0f5948329deae34f18ca1649 +timeCreated: 1755194525 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 8a3ea630..a64076dc 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -512,140 +512,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 17360256} m_CullTransparentMesh: 1 ---- !u!1 &48218463 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 48218464} - - component: {fileID: 48218466} - - component: {fileID: 48218465} - 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 &48218464 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 48218463} - 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: 2070597442} - 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 &48218465 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 48218463} - 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: 3b399a2d8fd4949958a248da594a7b27, 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: 0 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - 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: 1 - 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: 1 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &48218466 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 48218463} - m_CullTransparentMesh: 1 --- !u!1 &56928012 GameObject: m_ObjectHideFlags: 0 @@ -1080,10 +946,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 1685000285} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 120, y: -27.5} - m_SizeDelta: {x: 220, y: 15.000001} + 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 &108717378 MonoBehaviour: @@ -1274,7 +1140,7 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &130231370 +--- !u!1 &158522430 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1282,35 +1148,125 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 130231371} + - component: {fileID: 158522431} + - component: {fileID: 158522434} + - component: {fileID: 158522433} + - component: {fileID: 158522432} m_Layer: 5 - m_Name: Content + m_Name: Scrollbar Vertical m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &130231371 +--- !u!224 &158522431 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 130231370} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 158522430} + 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: 2070597442} - m_Father: {fileID: 974586687} + - {fileID: 167642979} + m_Father: {fileID: 1861070390} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} + m_AnchorMin: {x: 1, y: 0} 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 &157765780 + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &158522432 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158522430} + 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: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} + m_HighlightedColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_PressedColor: {r: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} + m_SelectedColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_DisabledColor: {r: 0, g: 0, b: 0, a: 1} + 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: 1785893878} + m_HandleRect: {fileID: 1785893877} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &158522433 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158522430} + 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: 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 &158522434 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158522430} + m_CullTransparentMesh: 1 +--- !u!1 &161099257 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1318,45 +1274,45 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 157765781} - - component: {fileID: 157765783} - - component: {fileID: 157765782} + - component: {fileID: 161099258} + - component: {fileID: 161099260} + - component: {fileID: 161099259} m_Layer: 5 - m_Name: Label + m_Name: Handle m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &157765781 +--- !u!224 &161099258 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 157765780} + m_GameObject: {fileID: 161099257} 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: 191605878} + m_Father: {fileID: 1267233531} 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_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 &157765782 +--- !u!114 &161099259 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 157765780} + m_GameObject: {fileID: 161099257} 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} @@ -1367,84 +1323,25 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - 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: 1 - 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 &157765783 + 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 &161099260 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 157765780} + m_GameObject: {fileID: 161099257} m_CullTransparentMesh: 1 ---- !u!1 &158522430 +--- !u!1 &167642978 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1452,47 +1349,98 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 158522431} - - component: {fileID: 158522434} - - component: {fileID: 158522433} - - component: {fileID: 158522432} + - component: {fileID: 167642979} m_Layer: 5 - m_Name: Scrollbar Vertical + m_Name: Sliding Area m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &158522431 +--- !u!224 &167642979 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 158522430} + m_GameObject: {fileID: 167642978} 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: 167642979} - m_Father: {fileID: 1861070390} + - {fileID: 1785893877} + m_Father: {fileID: 158522431} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} + m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 10, y: 0} - m_Pivot: {x: 1, y: 1} ---- !u!114 &158522432 + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &203863149 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 203863150} + - component: {fileID: 203863154} + - component: {fileID: 203863153} + - component: {fileID: 203863152} + - component: {fileID: 203863151} + m_Layer: 5 + m_Name: MnemonicButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &203863150 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 203863149} + 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: 90459730} + - {fileID: 748463502} + m_Father: {fileID: 4209220039127894524} + 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: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &203863151 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 158522430} + m_GameObject: {fileID: 203863149} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &203863152 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 203863149} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: m_Navigation: @@ -1504,11 +1452,11 @@ MonoBehaviour: m_SelectOnRight: {fileID: 0} m_Transition: 1 m_Colors: - m_NormalColor: {r: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} - m_HighlightedColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} - m_PressedColor: {r: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} - m_SelectedColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} - m_DisabledColor: {r: 0, g: 0, b: 0, a: 1} + 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.8509804} m_ColorMultiplier: 1 m_FadeDuration: 0.1 m_SpriteState: @@ -1523,38 +1471,46 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 1785893878} - m_HandleRect: {fileID: 1785893877} - m_Direction: 2 - m_Value: 0 - m_Size: 1 - m_NumberOfSteps: 0 - m_OnValueChanged: + m_TargetGraphic: {fileID: 203863153} + m_OnClick: m_PersistentCalls: - m_Calls: [] ---- !u!114 &158522433 + m_Calls: + - m_Target: {fileID: 9144345594371459776} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: SignInWithMnemonic + 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 &203863153 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 158522430} + m_GameObject: {fileID: 203863149} 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: 1} + m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, 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_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} m_Type: 1 - m_PreserveAspect: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -1562,15 +1518,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &158522434 +--- !u!222 &203863154 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 158522430} + m_GameObject: {fileID: 203863149} m_CullTransparentMesh: 1 ---- !u!1 &161099257 +--- !u!1 &215461105 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1578,58 +1534,110 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 161099258} - - component: {fileID: 161099260} - - component: {fileID: 161099259} + - component: {fileID: 215461110} + - component: {fileID: 215461109} + - component: {fileID: 215461108} + - component: {fileID: 215461107} + - component: {fileID: 215461106} m_Layer: 5 - m_Name: Handle + m_Name: SessionButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &161099258 -RectTransform: +--- !u!114 &215461106 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 161099257} - 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: 1267233531} - 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 &161099259 + m_GameObject: {fileID: 215461105} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &215461107 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 161099257} + m_GameObject: {fileID: 215461105} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, 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_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: 215461108} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1242786028} + m_TargetAssemblyTypeName: Sequence.Boilerplates.TransactionButton, SequenceBoilerplates + m_MethodName: AddSession + 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 &215461108 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 215461105} + 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.14901961, g: 0.14901961, b: 0.14901961, 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_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} m_Type: 1 - m_PreserveAspect: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -1637,51 +1645,35 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &161099260 +--- !u!222 &215461109 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 161099257} + m_GameObject: {fileID: 215461105} m_CullTransparentMesh: 1 ---- !u!1 &167642978 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 167642979} - 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 &167642979 +--- !u!224 &215461110 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 167642978} + m_GameObject: {fileID: 215461105} 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: 1785893877} - m_Father: {fileID: 158522431} + - {fileID: 1235258472} + m_Father: {fileID: 1242786027} 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 &191605877 + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -10, y: 0} + m_SizeDelta: {x: 60, y: 20} + m_Pivot: {x: 1, y: 0.5} +--- !u!1 &230010630 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1689,121 +1681,79 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 191605878} - - component: {fileID: 191605881} - - component: {fileID: 191605880} - - component: {fileID: 191605879} + - component: {fileID: 230010631} + - component: {fileID: 230010634} + - component: {fileID: 230010633} + - component: {fileID: 230010632} m_Layer: 5 - m_Name: ChainDropdown + m_Name: Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &191605878 +--- !u!224 &230010631 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 191605877} + m_GameObject: {fileID: 230010630} 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: 157765781} - - {fileID: 400068442} - - {fileID: 988110724} - - {fileID: 317570298} - m_Father: {fileID: 4209220039127894524} + m_Children: [] + m_Father: {fileID: 286074021} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 30} - m_Pivot: {x: 0.5, y: 0} ---- !u!114 &191605879 + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &230010632 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 191605877} + m_GameObject: {fileID: 230010630} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} + m_Script: {fileID: 11500000, guid: d0b148fe25e99eb48b9724523833bab1, 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: 191605880} - m_Template: {fileID: 988110724} - m_CaptionText: {fileID: 157765782} - m_CaptionImage: {fileID: 0} - m_Placeholder: {fileID: 0} - m_ItemText: {fileID: 48218465} - m_ItemImage: {fileID: 0} - m_Value: 0 - m_Options: - m_Options: [] - m_OnValueChanged: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceBoilerplates - m_MethodName: OnChainChanged - m_Mode: 0 - 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 - m_AlphaFadeSpeed: 0.15 ---- !u!114 &191605880 + m_Delegates: + - eventID: 4 + callback: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: SequenceSDK.Samples.SequenceLoginWindow, Sequence.Boilerplates + m_MethodName: EnableEmailButton + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 +--- !u!114 &230010633 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 191605877} + m_GameObject: {fileID: 230010630} 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.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 0, g: 0, b: 0, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -1820,15 +1770,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &191605881 +--- !u!222 &230010634 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 191605877} + m_GameObject: {fileID: 230010630} m_CullTransparentMesh: 1 ---- !u!1 &203863149 +--- !u!1 &286074020 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1836,468 +1786,67 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 203863150} - - component: {fileID: 203863154} - - component: {fileID: 203863153} - - component: {fileID: 203863152} - - component: {fileID: 203863151} + - component: {fileID: 286074021} + - component: {fileID: 286074022} + - component: {fileID: 286074024} + - component: {fileID: 286074023} m_Layer: 5 - m_Name: MnemonicButton + m_Name: FeeOptionsWindow m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &203863150 + m_IsActive: 0 +--- !u!224 &286074021 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 203863149} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 286074020} + 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: 90459730} - - {fileID: 748463502} - m_Father: {fileID: 4209220039127894524} + - {fileID: 230010631} + - {fileID: 1902185723} + - {fileID: 1861070390} + - {fileID: 1486293238} + m_Father: {fileID: 1050865742} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 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: 0, y: 30} + m_SizeDelta: {x: 240, y: 200} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &203863151 +--- !u!114 &286074022 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 203863149} + m_GameObject: {fileID: 286074020} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Script: {fileID: 11500000, guid: 9c2a679cc44642b2b553b06d881c4761, type: 3} m_Name: m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &203863152 + _tilePool: + _amount: 10 + _setAsLastSibling: 1 + _parent: {fileID: 1774370118} + _prefab: {fileID: 6048077945414578415, guid: a9fe55a5230314e2d8f553b0fc27300b, type: 3} +--- !u!114 &286074023 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 203863149} + m_GameObject: {fileID: 286074020} 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.8509804} - 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: 203863153} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceExamples - m_MethodName: SignInWithMnemonic - 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 &203863153 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 203863149} - 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 - 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 &203863154 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 203863149} - m_CullTransparentMesh: 1 ---- !u!1 &215461105 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 215461110} - - component: {fileID: 215461109} - - component: {fileID: 215461108} - - component: {fileID: 215461107} - - component: {fileID: 215461106} - m_Layer: 5 - m_Name: SessionButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &215461106 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 215461105} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &215461107 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 215461105} - 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: 215461108} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 1242786028} - m_TargetAssemblyTypeName: Sequence.Boilerplates.TransactionButton, SequenceBoilerplates - m_MethodName: AddSession - 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 &215461108 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 215461105} - 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.19215687, g: 0.19215687, b: 0.19215687, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 - 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 &215461109 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 215461105} - m_CullTransparentMesh: 1 ---- !u!224 &215461110 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 215461105} - 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: 1235258472} - m_Father: {fileID: 1242786027} - 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: -10, y: 0} - m_SizeDelta: {x: 60, y: 20} - m_Pivot: {x: 1, y: 0.5} ---- !u!1 &230010630 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 230010631} - - component: {fileID: 230010634} - - component: {fileID: 230010633} - - component: {fileID: 230010632} - m_Layer: 5 - m_Name: Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &230010631 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 230010630} - 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: 286074021} - 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 &230010632 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 230010630} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d0b148fe25e99eb48b9724523833bab1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Delegates: - - eventID: 4 - callback: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 0} - m_TargetAssemblyTypeName: SequenceSDK.Samples.SequenceLoginWindow, Sequence.Boilerplates - m_MethodName: EnableEmailButton - m_Mode: 6 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 1 - m_CallState: 2 ---- !u!114 &230010633 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 230010630} - 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: 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} - 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 &230010634 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 230010630} - m_CullTransparentMesh: 1 ---- !u!1 &286074020 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 286074021} - - component: {fileID: 286074022} - - component: {fileID: 286074024} - - component: {fileID: 286074023} - m_Layer: 5 - m_Name: FeeOptionsWindow - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &286074021 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 286074020} - 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: 230010631} - - {fileID: 1902185723} - - {fileID: 1861070390} - - {fileID: 1486293238} - m_Father: {fileID: 1050865742} - 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: 240, y: 200} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &286074022 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 286074020} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9c2a679cc44642b2b553b06d881c4761, type: 3} - m_Name: - m_EditorClassIdentifier: - _tilePool: - _amount: 10 - _setAsLastSibling: 1 - _parent: {fileID: 1774370118} - _prefab: {fileID: 6048077945414578415, guid: a9fe55a5230314e2d8f553b0fc27300b, type: 3} ---- !u!114 &286074023 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 286074020} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: eb6fa7d82312143d9b451ac5e7465a38, type: 3} + m_Script: {fileID: 11500000, guid: eb6fa7d82312143d9b451ac5e7465a38, type: 3} m_Name: m_EditorClassIdentifier: _start: 0.7 @@ -2347,154 +1896,6 @@ CanvasGroup: m_Interactable: 1 m_BlocksRaycasts: 1 m_IgnoreParentGroups: 0 ---- !u!1 &317570297 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 317570298} - - component: {fileID: 317570302} - - component: {fileID: 317570301} - - component: {fileID: 317570300} - - component: {fileID: 317570299} - m_Layer: 5 - m_Name: CopyButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &317570298 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317570297} - 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: 1016496429} - m_Father: {fileID: 191605878} - 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 &317570299 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317570297} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &317570300 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317570297} - 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: 317570301} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 9144345594371459776} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, - SequenceExamples - m_MethodName: CopyWalletAddress - 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 &317570301 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317570297} - 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.19, g: 0.19, b: 0.19, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} - m_Type: 1 - 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 &317570302 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317570297} - m_CullTransparentMesh: 1 --- !u!1 &319937703 GameObject: m_ObjectHideFlags: 0 @@ -2554,7 +1955,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &323220476 RectTransform: m_ObjectHideFlags: 0 @@ -2567,6 +1968,7 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: + - {fileID: 723431369} - {fileID: 5014169504580503363} - {fileID: 1685000285} m_Father: {fileID: 1050865742} @@ -2574,7 +1976,7 @@ RectTransform: 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: 270, y: 115} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &323220477 MonoBehaviour: @@ -3063,111 +2465,36 @@ MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 399605434} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &399605437 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 399605434} - 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.06666667, g: 0.06666667, b: 0.06666667, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} - 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 &399605438 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 399605434} - m_CullTransparentMesh: 1 ---- !u!1 &400068441 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 400068442} - - component: {fileID: 400068444} - - component: {fileID: 400068443} - m_Layer: 5 - m_Name: Arrow - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &400068442 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 400068441} - 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: 191605878} - 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 &400068443 + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 399605434} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &399605437 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 400068441} + m_GameObject: {fileID: 399605434} 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_Color: {r: 0.06666667, g: 0.06666667, b: 0.06666667, 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_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 @@ -3176,13 +2503,13 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &400068444 +--- !u!222 &399605438 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 400068441} + m_GameObject: {fileID: 399605434} m_CullTransparentMesh: 1 --- !u!1 &448961315 GameObject: @@ -3994,7 +3321,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -4433,7 +3760,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -4599,7 +3926,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Sessions + m_text: Sessions signers m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} @@ -5089,9 +4416,9 @@ MonoBehaviour: m_Options: - m_Text: None m_Image: {fileID: 0} - - m_Text: Unrestrictive + - m_Text: Explicit (Arb Sepolia) m_Image: {fileID: 0} - - m_Text: Basic Restrictive + - m_Text: Explicit + USDC (OP Mainnet) m_Image: {fileID: 0} m_OnValueChanged: m_PersistentCalls: @@ -5123,7 +4450,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -5148,7 +4475,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 722266040} m_CullTransparentMesh: 1 ---- !u!1 &745017018 +--- !u!1 &723431368 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5156,45 +4483,45 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 745017019} - - component: {fileID: 745017021} - - component: {fileID: 745017020} + - component: {fileID: 723431369} + - component: {fileID: 723431371} + - component: {fileID: 723431370} m_Layer: 5 - m_Name: Image (1) + m_Name: Title Text (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &745017019 +--- !u!224 &723431369 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 745017018} + m_GameObject: {fileID: 723431368} 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: 491498808} + m_Father: {fileID: 323220476} 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: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 7, y: 7} + m_SizeDelta: {x: 210, y: 20} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &745017020 +--- !u!114 &723431370 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 745017018} + m_GameObject: {fileID: 723431368} 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} @@ -5205,25 +4532,84 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 7eeaa0f6357c9474abdf30939e119719, 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 &745017021 + m_text: Demos + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 10 + m_fontSizeBase: 10 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 + 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 &723431371 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 745017018} + m_GameObject: {fileID: 723431368} m_CullTransparentMesh: 1 ---- !u!1 &748463501 +--- !u!1 &745017018 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5231,9 +4617,9 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 748463502} - - component: {fileID: 748463504} - - component: {fileID: 748463503} + - component: {fileID: 745017019} + - component: {fileID: 745017021} + - component: {fileID: 745017020} m_Layer: 5 m_Name: Image (1) m_TagString: Untagged @@ -5241,189 +4627,47 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &748463502 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748463501} - 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: 203863150} - 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: 15, y: 0} - m_SizeDelta: {x: 10, y: 10} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &748463503 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748463501} - 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: 7587ac7b3e6c1471ca5ab6307ab32ec5, 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 &748463504 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 748463501} - m_CullTransparentMesh: 1 ---- !u!1 &769043458 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 769043459} - - component: {fileID: 769043460} - m_Layer: 5 - m_Name: Text Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &769043459 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 769043458} - 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: 1621712494} - - {fileID: 89467941} - m_Father: {fileID: 805083868} - 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: -10} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &769043460 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 769043458} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: {x: -8, y: -5, z: -8, w: -5} - m_Softness: {x: 0, y: 0} ---- !u!1 &802456207 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 802456208} - - component: {fileID: 802456212} - - component: {fileID: 802456211} - - component: {fileID: 802456209} - m_Layer: 5 - m_Name: Loading - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &802456208 +--- !u!224 &745017019 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 802456207} + m_GameObject: {fileID: 745017018} 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: 1564534878} - m_Father: {fileID: 2097849100} + m_Children: [] + m_Father: {fileID: 491498808} 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: -10, y: 0} - m_SizeDelta: {x: 60, y: 20} - m_Pivot: {x: 1, y: 0.5} ---- !u!114 &802456209 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 802456207} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &802456211 + 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: 7, y: 7} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &745017020 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 802456207} + m_GameObject: {fileID: 745017018} 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.15, g: 0.15, b: 0.15, 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: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 + m_Sprite: {fileID: 21300000, guid: 7eeaa0f6357c9474abdf30939e119719, type: 3} + m_Type: 0 m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 @@ -5432,15 +4676,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &802456212 +--- !u!222 &745017021 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 802456207} + m_GameObject: {fileID: 745017018} m_CullTransparentMesh: 1 ---- !u!1 &805083867 +--- !u!1 &748463501 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5448,175 +4692,58 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 805083868} - - component: {fileID: 805083872} - - component: {fileID: 805083871} - - component: {fileID: 805083870} - - component: {fileID: 805083869} + - component: {fileID: 748463502} + - component: {fileID: 748463504} + - component: {fileID: 748463503} m_Layer: 5 - m_Name: MessageInput + m_Name: Image (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &805083868 +--- !u!224 &748463502 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 805083867} + m_GameObject: {fileID: 748463501} 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: 769043459} - - {fileID: 485743481} - m_Father: {fileID: 683925400} + m_Children: [] + m_Father: {fileID: 203863150} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 120, y: -185} - m_SizeDelta: {x: 210, y: 30} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &805083869 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 805083867} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} - m_Name: - m_EditorClassIdentifier: - m_EffectColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} - m_EffectDistance: {x: 1, y: -1} - m_UseGraphicAlpha: 1 ---- !u!114 &805083870 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 805083867} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, 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: 805083871} - m_TextViewport: {fileID: 769043459} - m_TextComponent: {fileID: 89467942} - m_Placeholder: {fileID: 1621712496} - m_VerticalScrollbar: {fileID: 0} - m_VerticalScrollbarEventHandler: {fileID: 0} - m_LayoutGroup: {fileID: 0} - m_ScrollSensitivity: 1 - m_ContentType: 0 - m_InputType: 0 - m_AsteriskChar: 42 - m_KeyboardType: 0 - m_LineType: 0 - m_HideMobileInput: 0 - m_HideSoftKeyboard: 0 - m_CharacterValidation: 0 - m_RegexValue: - m_GlobalPointSize: 14 - m_CharacterLimit: 0 - m_OnEndEdit: - m_PersistentCalls: - m_Calls: [] - m_OnSubmit: - m_PersistentCalls: - m_Calls: [] - m_OnSelect: - m_PersistentCalls: - m_Calls: [] - m_OnDeselect: - m_PersistentCalls: - m_Calls: [] - m_OnTextSelection: - m_PersistentCalls: - m_Calls: [] - m_OnEndTextSelection: - m_PersistentCalls: - m_Calls: [] - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_OnTouchScreenKeyboardStatusChanged: - m_PersistentCalls: - m_Calls: [] - m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_CustomCaretColor: 0 - m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} - m_Text: - m_CaretBlinkRate: 0.85 - m_CaretWidth: 1 - m_ReadOnly: 0 - m_RichText: 1 - m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_OnFocusSelectAll: 1 - m_ResetOnDeActivation: 1 - m_RestoreOriginalTextOnEscape: 1 - m_isRichTextEditingAllowed: 0 - m_LineLimit: 0 - m_InputValidator: {fileID: 0} ---- !u!114 &805083871 +--- !u!114 &748463503 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 805083867} + m_GameObject: {fileID: 748463501} 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: 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: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 - m_PreserveAspect: 0 + m_Sprite: {fileID: 21300000, guid: 7587ac7b3e6c1471ca5ab6307ab32ec5, type: 3} + m_Type: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -5624,15 +4751,67 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &805083872 +--- !u!222 &748463504 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 805083867} + m_GameObject: {fileID: 748463501} m_CullTransparentMesh: 1 ---- !u!1 &812752710 +--- !u!1 &769043458 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 769043459} + - component: {fileID: 769043460} + m_Layer: 5 + m_Name: Text Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &769043459 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 769043458} + 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: 1621712494} + - {fileID: 89467941} + m_Father: {fileID: 805083868} + 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: -10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &769043460 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 769043458} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: -8, y: -5, z: -8, w: -5} + m_Softness: {x: 0, y: 0} +--- !u!1 &802456207 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5640,133 +4819,89 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 812752711} - - component: {fileID: 812752713} - - component: {fileID: 812752712} + - component: {fileID: 802456208} + - component: {fileID: 802456212} + - component: {fileID: 802456211} + - component: {fileID: 802456209} m_Layer: 5 - m_Name: Text (TMP) + m_Name: Loading m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &812752711 +--- !u!224 &802456208 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 812752710} + m_GameObject: {fileID: 802456207} 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: 1329197019} + m_Children: + - {fileID: 1564534878} + m_Father: {fileID: 2097849100} 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: -10, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &812752712 + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -10, y: 0} + m_SizeDelta: {x: 60, y: 20} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &802456209 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 812752710} + m_GameObject: {fileID: 802456207} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &802456211 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 802456207} + 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: 0 + m_Color: {r: 0.15, g: 0.15, b: 0.15, 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: Add Session - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 - m_fontSizeBase: 8 - 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 &812752713 + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 + 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 &802456212 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 812752710} + m_GameObject: {fileID: 802456207} m_CullTransparentMesh: 1 ---- !u!1 &836095705 +--- !u!1 &805083867 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5774,98 +4909,64 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 836095706} + - component: {fileID: 805083868} + - component: {fileID: 805083872} + - component: {fileID: 805083871} + - component: {fileID: 805083870} + - component: {fileID: 805083869} m_Layer: 5 - m_Name: Title + m_Name: MessageInput m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &836095706 +--- !u!224 &805083868 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 836095705} + m_GameObject: {fileID: 805083867} 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: 1614894632} - - {fileID: 1310990841} - m_Father: {fileID: 697728234} + - {fileID: 769043459} + - {fileID: 485743481} + m_Father: {fileID: 683925400} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 120, y: -20} + m_AnchoredPosition: {x: 120, y: -185} m_SizeDelta: {x: 210, y: 30} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &865590363 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 865590364} - - component: {fileID: 865590368} - - component: {fileID: 865590367} - - component: {fileID: 865590366} - - component: {fileID: 865590365} - m_Layer: 5 - m_Name: SignOutButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &865590364 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 865590363} - 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: 1067417227} - m_Father: {fileID: 1865608230} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -50, y: -20} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &865590365 +--- !u!114 &805083869 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 865590363} + m_GameObject: {fileID: 805083867} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} m_Name: m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &865590366 + m_EffectColor: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!114 &805083870 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 865590363} + m_GameObject: {fileID: 805083867} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} m_Name: m_EditorClassIdentifier: m_Navigation: @@ -5896,45 +4997,87 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 865590367} - m_OnClick: + m_TargetGraphic: {fileID: 805083871} + m_TextViewport: {fileID: 769043459} + m_TextComponent: {fileID: 89467942} + m_Placeholder: {fileID: 1621712496} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 0 + m_RegexValue: + m_GlobalPointSize: 14 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 1865608231} - m_TargetAssemblyTypeName: Sequence.Boilerplates.EcosystemWalletProfile, SequenceBoilerplates - m_MethodName: SignOut - 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 &865590367 + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!114 &805083871 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 865590363} + m_GameObject: {fileID: 805083867} 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.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 0, g: 0, b: 0, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} m_Type: 1 - m_PreserveAspect: 1 + m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -5942,51 +5085,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &865590368 +--- !u!222 &805083872 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 865590363} + m_GameObject: {fileID: 805083867} m_CullTransparentMesh: 1 ---- !u!1 &873417222 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 873417223} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &873417223 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 873417222} - 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: 1303578556} - m_Father: {fileID: 2100922580} - 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 &874185234 +--- !u!1 &812752710 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -5994,74 +5101,133 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 874185235} - - component: {fileID: 874185237} - - component: {fileID: 874185236} + - component: {fileID: 812752711} + - component: {fileID: 812752713} + - component: {fileID: 812752712} m_Layer: 5 - m_Name: Background + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &874185235 +--- !u!224 &812752711 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 874185234} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 812752710} + 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: 330825195} + m_Father: {fileID: 1329197019} 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_SizeDelta: {x: -10, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &874185236 +--- !u!114 &812752712 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 874185234} + m_GameObject: {fileID: 812752710} 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} - m_Color: {r: 0.12, g: 0.12, b: 0.12, a: 1} - m_RaycastTarget: 1 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} - 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 &874185237 + m_text: Add Session + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + 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 &812752713 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 874185234} + m_GameObject: {fileID: 812752710} m_CullTransparentMesh: 1 ---- !u!1 &900828004 +--- !u!1 &836095705 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6069,74 +5235,36 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 900828005} - - component: {fileID: 900828007} - - component: {fileID: 900828006} + - component: {fileID: 836095706} m_Layer: 5 - m_Name: Image (1) + m_Name: Title m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &900828005 +--- !u!224 &836095706 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 900828004} + m_GameObject: {fileID: 836095705} 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: 1129766508066712729} + m_Children: + - {fileID: 1614894632} + - {fileID: 1310990841} + m_Father: {fileID: 697728234} 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: 15, y: 0} - m_SizeDelta: {x: 10, y: 10} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &900828006 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 900828004} - 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: d03d44fa67fc3480a9617f6df236254d, 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 &900828007 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 900828004} - m_CullTransparentMesh: 1 ---- !u!1 &917880583 + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -20} + m_SizeDelta: {x: 210, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &865590363 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6144,47 +5272,61 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 917880584} - - component: {fileID: 917880587} - - component: {fileID: 917880586} - - component: {fileID: 917880585} + - component: {fileID: 865590364} + - component: {fileID: 865590368} + - component: {fileID: 865590367} + - component: {fileID: 865590366} + - component: {fileID: 865590365} m_Layer: 5 - m_Name: Scrollbar + m_Name: SignOutButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &917880584 +--- !u!224 &865590364 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 917880583} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 865590363} + 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: 1255006567} - m_Father: {fileID: 988110724} + - {fileID: 1067417227} + m_Father: {fileID: 1865608230} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} + m_AnchorMin: {x: 1, y: 1} 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 &917880585 + m_AnchoredPosition: {x: -50, y: -20} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &865590365 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 917880583} + m_GameObject: {fileID: 865590363} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &865590366 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 865590363} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: m_Navigation: @@ -6215,38 +5357,45 @@ MonoBehaviour: m_SelectedTrigger: Selected m_DisabledTrigger: Disabled m_Interactable: 1 - m_TargetGraphic: {fileID: 1279357136} - m_HandleRect: {fileID: 1279357135} - m_Direction: 2 - m_Value: 0 - m_Size: 0.2 - m_NumberOfSteps: 0 - m_OnValueChanged: + m_TargetGraphic: {fileID: 865590367} + m_OnClick: m_PersistentCalls: - m_Calls: [] ---- !u!114 &917880586 + m_Calls: + - m_Target: {fileID: 1865608231} + m_TargetAssemblyTypeName: Sequence.Boilerplates.EcosystemWalletProfile, SequenceBoilerplates + m_MethodName: SignOut + 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 &865590367 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 917880583} + m_GameObject: {fileID: 865590363} 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_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, 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_Sprite: {fileID: 21300000, guid: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} m_Type: 1 - m_PreserveAspect: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -6254,15 +5403,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &917880587 +--- !u!222 &865590368 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 917880583} + m_GameObject: {fileID: 865590363} m_CullTransparentMesh: 1 ---- !u!1 &921594783 +--- !u!1 &873417222 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6270,89 +5419,35 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 921594784} - - component: {fileID: 921594787} - - component: {fileID: 921594786} - - component: {fileID: 921594785} + - component: {fileID: 873417223} m_Layer: 5 - m_Name: Loading + m_Name: Content m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &921594784 +--- !u!224 &873417223 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 921594783} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 873417222} + 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: 1257239531} - m_Father: {fileID: 1242786027} + - {fileID: 1303578556} + m_Father: {fileID: 2100922580} 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: -10, y: 0} - m_SizeDelta: {x: 60, y: 20} - m_Pivot: {x: 1, y: 0.5} ---- !u!114 &921594785 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 921594783} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &921594786 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 921594783} - 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.15, g: 0.15, b: 0.15, 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: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 - 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 &921594787 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 921594783} - m_CullTransparentMesh: 1 ---- !u!1 &960124012 + 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 &874185234 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6360,133 +5455,74 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 960124013} - - component: {fileID: 960124015} - - component: {fileID: 960124014} + - component: {fileID: 874185235} + - component: {fileID: 874185237} + - component: {fileID: 874185236} m_Layer: 5 - m_Name: Text (TMP) + m_Name: Background m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &960124013 +--- !u!224 &874185235 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 960124012} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 874185234} + 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: 512459741} + m_Father: {fileID: 330825195} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 10, y: 0} - m_SizeDelta: {x: -40, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &960124014 +--- !u!114 &874185236 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 960124012} + m_GameObject: {fileID: 874185234} 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} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 + m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, 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: Use Passkey - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} - m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 - m_fontSizeBase: 8 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - 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 &960124015 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + 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 &874185237 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 960124012} + m_GameObject: {fileID: 874185234} m_CullTransparentMesh: 1 ---- !u!1 &965900426 +--- !u!1 &900828004 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6494,129 +5530,57 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 965900427} - - component: {fileID: 965900431} - - component: {fileID: 965900430} - - component: {fileID: 965900429} - - component: {fileID: 965900428} + - component: {fileID: 900828005} + - component: {fileID: 900828007} + - component: {fileID: 900828006} m_Layer: 5 - m_Name: SendButton + m_Name: Image (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &965900427 +--- !u!224 &900828005 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 965900426} + m_GameObject: {fileID: 900828004} 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: 1060437062} - m_Father: {fileID: 1242786027} + m_Children: [] + m_Father: {fileID: 1129766508066712729} 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: -10, y: 0} - m_SizeDelta: {x: 60, y: 20} - m_Pivot: {x: 1, y: 0.5} ---- !u!114 &965900428 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 965900426} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &965900429 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 965900426} - 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: 965900430} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 1242786028} - m_TargetAssemblyTypeName: Sequence.Boilerplates.TransactionButton, SequenceBoilerplates - m_MethodName: SendTransaction - 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 &965900430 + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 15, y: 0} + m_SizeDelta: {x: 10, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &900828006 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 965900426} + m_GameObject: {fileID: 900828004} 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.19215687, g: 0.19215687, b: 0.19215687, 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: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} - m_Type: 1 + m_Sprite: {fileID: 21300000, guid: d03d44fa67fc3480a9617f6df236254d, type: 3} + m_Type: 0 m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 @@ -6625,15 +5589,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &965900431 +--- !u!222 &900828007 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 965900426} + m_GameObject: {fileID: 900828004} m_CullTransparentMesh: 1 ---- !u!1 &968326747 +--- !u!1 &921594783 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6641,57 +5605,72 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 968326748} - - component: {fileID: 968326750} - - component: {fileID: 968326749} + - component: {fileID: 921594784} + - component: {fileID: 921594787} + - component: {fileID: 921594786} + - component: {fileID: 921594785} m_Layer: 5 - m_Name: Icon + m_Name: Loading m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &968326748 +--- !u!224 &921594784 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 968326747} + m_GameObject: {fileID: 921594783} 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: 1310990841} + m_Children: + - {fileID: 1257239531} + m_Father: {fileID: 1242786027} 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: 7, y: 7} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &968326749 + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -10, y: 0} + m_SizeDelta: {x: 60, y: 20} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &921594785 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 968326747} + m_GameObject: {fileID: 921594783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 +--- !u!114 &921594786 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 921594783} 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_Color: {r: 0.15, g: 0.15, b: 0.15, 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: e0aca7c4ac2ed4cc589962721c508d77, type: 3} - m_Type: 0 + m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} + m_Type: 1 m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 @@ -6700,15 +5679,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &968326750 +--- !u!222 &921594787 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 968326747} + m_GameObject: {fileID: 921594783} m_CullTransparentMesh: 1 ---- !u!1 &974586686 +--- !u!1 &960124012 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6716,89 +5695,133 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 974586687} - - component: {fileID: 974586690} - - component: {fileID: 974586689} - - component: {fileID: 974586688} + - component: {fileID: 960124013} + - component: {fileID: 960124015} + - component: {fileID: 960124014} m_Layer: 5 - m_Name: Viewport + m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &974586687 +--- !u!224 &960124013 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 974586686} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 960124012} + 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: 130231371} - m_Father: {fileID: 988110724} + m_Children: [] + m_Father: {fileID: 512459741} 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 &974586688 + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: -40, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &960124014 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 974586686} + m_GameObject: {fileID: 960124012} 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} m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_RaycastTarget: 0 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 &974586689 + m_text: Use Passkey + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} + m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, 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: 8 + m_fontSizeBase: 8 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + 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 &960124015 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 974586686} + m_GameObject: {fileID: 960124012} m_CullTransparentMesh: 1 ---- !u!114 &974586690 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 974586686} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!1 &988110723 +--- !u!1 &965900426 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6806,82 +5829,121 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 988110724} - - component: {fileID: 988110727} - - component: {fileID: 988110726} - - component: {fileID: 988110725} + - component: {fileID: 965900427} + - component: {fileID: 965900431} + - component: {fileID: 965900430} + - component: {fileID: 965900429} + - component: {fileID: 965900428} m_Layer: 5 - m_Name: Template + m_Name: SendButton m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &988110724 + m_IsActive: 1 +--- !u!224 &965900427 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 988110723} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_GameObject: {fileID: 965900426} + 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: 974586687} - - {fileID: 917880584} - m_Father: {fileID: 191605878} + - {fileID: 1060437062} + m_Father: {fileID: 1242786027} 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 &988110725 + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -10, y: 0} + m_SizeDelta: {x: 60, y: 20} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &965900428 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 988110723} + m_GameObject: {fileID: 965900426} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} m_Name: m_EditorClassIdentifier: - m_Content: {fileID: 130231371} - 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: 974586687} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 917880585} - m_HorizontalScrollbarVisibility: 0 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: 0 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: + m_ShowMaskGraphic: 1 +--- !u!114 &965900429 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 965900426} + 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: 965900430} + m_OnClick: m_PersistentCalls: - m_Calls: [] ---- !u!114 &988110726 + m_Calls: + - m_Target: {fileID: 1242786028} + m_TargetAssemblyTypeName: Sequence.Boilerplates.TransactionButton, SequenceBoilerplates + m_MethodName: SendTransaction + 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 &965900430 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 988110723} + m_GameObject: {fileID: 965900426} 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.254717, g: 0.254717, b: 0.254717, a: 1} + m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -6890,7 +5952,7 @@ MonoBehaviour: m_Calls: [] m_Sprite: {fileID: 21300000, guid: 15c25e22237df4b4896c099c9d0faed7, type: 3} m_Type: 1 - m_PreserveAspect: 0 + m_PreserveAspect: 1 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 @@ -6898,15 +5960,15 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &988110727 +--- !u!222 &965900431 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 988110723} + m_GameObject: {fileID: 965900426} m_CullTransparentMesh: 1 ---- !u!1 &1016496428 +--- !u!1 &968326747 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -6914,42 +5976,42 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1016496429} - - component: {fileID: 1016496431} - - component: {fileID: 1016496430} + - component: {fileID: 968326748} + - component: {fileID: 968326750} + - component: {fileID: 968326749} m_Layer: 5 - m_Name: Image (1) + m_Name: Icon m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &1016496429 +--- !u!224 &968326748 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} + m_GameObject: {fileID: 968326747} 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: 317570298} + m_Father: {fileID: 1310990841} 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: 7, y: 7} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1016496430 +--- !u!114 &968326749 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} + m_GameObject: {fileID: 968326747} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -6963,7 +6025,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 7eeaa0f6357c9474abdf30939e119719, type: 3} + m_Sprite: {fileID: 21300000, guid: e0aca7c4ac2ed4cc589962721c508d77, type: 3} m_Type: 0 m_PreserveAspect: 1 m_FillCenter: 1 @@ -6973,13 +6035,13 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1016496431 +--- !u!222 &968326750 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1016496428} + m_GameObject: {fileID: 968326747} m_CullTransparentMesh: 1 --- !u!1 &1020405562 GameObject: @@ -8095,81 +7157,6 @@ MonoBehaviour: - {fileID: 2097849102} - {fileID: 1242786028} - {fileID: 696230465} ---- !u!1 &1172248266 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1172248267} - - component: {fileID: 1172248269} - - component: {fileID: 1172248268} - 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 &1172248267 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1172248266} - 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: 2070597442} - 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 &1172248268 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1172248266} - 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 &1172248269 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1172248266} - m_CullTransparentMesh: 1 --- !u!1 &1186454643 GameObject: m_ObjectHideFlags: 0 @@ -8610,49 +7597,13 @@ MonoBehaviour: m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 2 --- !u!222 &1242786030 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1242786026} - m_CullTransparentMesh: 1 ---- !u!1 &1255006566 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1255006567} - 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 &1255006567 -RectTransform: +CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1255006566} - 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: 1279357135} - m_Father: {fileID: 917880584} - 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} + m_GameObject: {fileID: 1242786026} + m_CullTransparentMesh: 1 --- !u!1 &1257239530 GameObject: m_ObjectHideFlags: 0 @@ -8898,81 +7849,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1274642101} m_CullTransparentMesh: 1 ---- !u!1 &1279357134 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1279357135} - - component: {fileID: 1279357137} - - component: {fileID: 1279357136} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1279357135 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1279357134} - 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: 1255006567} - 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 &1279357136 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1279357134} - 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 &1279357137 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1279357134} - m_CullTransparentMesh: 1 --- !u!1 &1280987657 GameObject: m_ObjectHideFlags: 0 @@ -9095,7 +7971,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -9373,10 +8249,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 1685000285} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 120, y: -12.5} - m_SizeDelta: {x: 220, y: 15.000001} + 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 &1305107878 MonoBehaviour: @@ -9800,7 +8676,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -11415,81 +10291,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1564534877} m_CullTransparentMesh: 1 ---- !u!1 &1614547398 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1614547399} - - component: {fileID: 1614547401} - - component: {fileID: 1614547400} - 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 &1614547399 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1614547398} - 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: 2070597442} - 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 &1614547400 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1614547398} - 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.25490198, g: 0.25490198, b: 0.25490198, 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 &1614547401 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1614547398} - m_CullTransparentMesh: 1 --- !u!1 &1614894631 GameObject: m_ObjectHideFlags: 0 @@ -11943,10 +10744,10 @@ RectTransform: - {fileID: 108717377} m_Father: {fileID: 323220476} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 135, y: -80} - m_SizeDelta: {x: 240, y: 40} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 210, y: 40} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1685000286 MonoBehaviour: @@ -12074,7 +10875,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} + m_Color: {r: 0.15, g: 0.15, b: 0.15, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -12901,7 +11702,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -14301,93 +13102,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2064835421} m_CullTransparentMesh: 1 ---- !u!1 &2070597441 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2070597442} - - component: {fileID: 2070597443} - m_Layer: 5 - m_Name: Item - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2070597442 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2070597441} - 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: 1614547399} - - {fileID: 1172248267} - - {fileID: 48218464} - m_Father: {fileID: 130231371} - 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 &2070597443 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2070597441} - 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.8627451, g: 0.8627451, b: 0.8627451, a: 1} - m_PressedColor: {r: 0.7075472, g: 0.7075472, b: 0.7075472, 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: 1614547400} - toggleTransition: 1 - graphic: {fileID: 1172248268} - m_Group: {fileID: 0} - onValueChanged: - m_PersistentCalls: - m_Calls: [] - m_IsOn: 1 --- !u!1 &2097849099 GameObject: m_ObjectHideFlags: 0 @@ -14632,7 +13346,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.12, g: 0.12, b: 0.12, a: 1} + m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -14745,7 +13459,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -15211,7 +13925,7 @@ RectTransform: 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: 240, y: 325} + m_SizeDelta: {x: 240, y: 290} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &2223926832334533402 GameObject: @@ -15647,7 +14361,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -15804,7 +14518,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.19215687, g: 0.19215687, b: 0.19215687, a: 1} + m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -15921,7 +14635,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 1115529825} - - {fileID: 191605878} - {fileID: 722266041} - {fileID: 467585876} - {fileID: 2856355940061643817} @@ -16373,10 +15086,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 5014169504580503363} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 120, y: -27.5} - m_SizeDelta: {x: 220, y: 15.000001} + 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 &5014169504110139587 MonoBehaviour: @@ -16507,10 +15220,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 5014169504580503363} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 120, y: -12.5} - m_SizeDelta: {x: 220, y: 15.000001} + 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 &5014169504311983885 MonoBehaviour: @@ -16647,10 +15360,10 @@ RectTransform: - {fileID: 5014169504110139586} m_Father: {fileID: 323220476} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 135, y: -35} - m_SizeDelta: {x: 240, y: 40} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 210, y: 40} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &5014169504580503364 MonoBehaviour: @@ -16722,7 +15435,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} + m_Color: {r: 0.14901961, g: 0.14901961, b: 0.14901961, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -17967,10 +16680,8 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _ecosystem: 1 - _chain: 421614 _emailLoginButton: {fileID: 1459061464521247473} _emailContinueButton: {fileID: 2325936309338030303} - _chainDropdown: {fileID: 191605879} _emailInput: {fileID: 1181566138228532167} _loginState: {fileID: 320339275645968252} _loadingOverlay: {fileID: 1084335994} diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab index 2ab7bde6..c887588a 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab @@ -31,13 +31,12 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 3341521885508034341} - m_RootOrder: 0 + m_Father: {fileID: 7890725239804470962} 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: 102.5, y: -15} + m_SizeDelta: {x: 185, y: 20} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &5002622919313635968 CanvasRenderer: @@ -156,316 +155,6 @@ MonoBehaviour: m_FlexibleWidth: 1 m_FlexibleHeight: -1 m_LayoutPriority: 1 ---- !u!1 &855452429909574649 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3341521885508034341} - - component: {fileID: 5734162964895938067} - m_Layer: 5 - m_Name: Layout - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &3341521885508034341 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 855452429909574649} - 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: 3278267076527203141} - - {fileID: 7890725238531800109} - m_Father: {fileID: 7890725239804470962} - 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: 2.5, y: 0} - m_SizeDelta: {x: -15, y: -10} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &5734162964895938067 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 855452429909574649} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, 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: 0 - m_ChildForceExpandHeight: 1 - m_ChildControlWidth: 1 - m_ChildControlHeight: 1 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 ---- !u!1 &7890725237866539878 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7890725237866539877} - - component: {fileID: 7890725237866539875} - - component: {fileID: 7890725237866539876} - m_Layer: 5 - m_Name: Image (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &7890725237866539877 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7890725237866539878} - 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: 7890725238531800109} - 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: 7, y: 7} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &7890725237866539875 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7890725237866539878} - m_CullTransparentMesh: 1 ---- !u!114 &7890725237866539876 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7890725237866539878} - 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: e0aca7c4ac2ed4cc589962721c508d77, 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!1 &7890725238531800110 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7890725238531800109} - - component: {fileID: 7890725238531800105} - - component: {fileID: 7890725238531800106} - - component: {fileID: 7890725238531800107} - - component: {fileID: 7890725238531800108} - - component: {fileID: 1909815714930344878} - m_Layer: 5 - m_Name: RemoveButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &7890725238531800109 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7890725238531800110} - 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: 7890725237866539877} - m_Father: {fileID: 3341521885508034341} - 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!222 &7890725238531800105 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7890725238531800110} - m_CullTransparentMesh: 1 ---- !u!114 &7890725238531800106 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7890725238531800110} - 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.19, g: 0.19, b: 0.19, 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: 4c67cd52e2ae83940841e6b8477dacb9, type: 3} - m_Type: 1 - 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!114 &7890725238531800107 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7890725238531800110} - 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: 7890725238531800106} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 7890725239804470961} - m_TargetAssemblyTypeName: Sequence.Boilerplates.SessionWalletTile, SequenceBoilerplates - m_MethodName: Remove - 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 &7890725238531800108 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7890725238531800110} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 1 ---- !u!114 &1909815714930344878 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7890725238531800110} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: 20 - m_MinHeight: -1 - m_PreferredWidth: 20 - m_PreferredHeight: -1 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 --- !u!1 &7890725238708147592 GameObject: m_ObjectHideFlags: 0 @@ -497,7 +186,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 7890725239804470962} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -572,9 +260,8 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 7890725238708147591} - - {fileID: 3341521885508034341} + - {fileID: 3278267076527203141} m_Father: {fileID: 0} - 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} @@ -594,4 +281,4 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _addressText: {fileID: 1925516040117653435} - _removeButton: {fileID: 7890725238531800107} + _removeButton: {fileID: 0} diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index 624a91bf..c88df975 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -24,12 +24,10 @@ private enum ExplicitSessionType [Header("Config")] [SerializeField] private EcosystemType _ecosystem; - [SerializeField] private Chain _chain; [Header("Components")] [SerializeField] private Button _emailLoginButton; [SerializeField] private Button _emailContinueButton; - [SerializeField] private TMP_Dropdown _chainDropdown; [SerializeField] private TMP_InputField _emailInput; [SerializeField] private GameObject _loginState; [SerializeField] private GameObject _loadingOverlay; @@ -65,9 +63,6 @@ public void Open() OnImplicitSessionTypeChanged(0); OnExplicitSessionTypeChanged(0); EnableEmailButton(true); - - _chainDropdown.ClearOptions(); - _chainDropdown.AddOptions(_chains.Select(c => c.ToString()).ToList()); } public async void SignInWithEmail() @@ -139,11 +134,6 @@ public async void SignInWithMnemonic() ShowError(e.Message); } } - - public void OnChainChanged(int index) - { - _chain = _chains[index]; - } public void OnImplicitSessionTypeChanged(int index) { @@ -196,12 +186,16 @@ private IPermissions GetPermissionsFromSessionType(int type) return null; var deadline = DateTimeOffset.UtcNow.ToUnixTimeSeconds() * 1000 + 60 * 60 * 24 * 1000; - - var permissions = new Permissions(Chain.Optimism, - new ContractPermission(new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607"), deadline, 0), - new ContractPermission(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), deadline, 0)); - return permissions; + return type switch + { + 1 => new Permissions(Chain.TestnetArbitrumSepolia, + new ContractPermission(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), deadline, 0)), + 2 => new Permissions(Chain.Optimism, + new ContractPermission(new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607"), deadline, 0), + new ContractPermission(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), deadline, 0)), + _ => throw new Exception("invalid session type") + }; } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs index 898a758b..05c51607 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs @@ -1,15 +1,11 @@ -using System; -using Sequence.EcosystemWallet; using TMPro; using UnityEngine; -using UnityEngine.UI; namespace Sequence.Boilerplates { public class SessionWalletTile : MonoBehaviour { [SerializeField] private TMP_Text _addressText; - [SerializeField] private Button _removeButton; private Address _signer; diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs index fad0806e..cd2b7969 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs @@ -72,8 +72,15 @@ public async void AddSession() else permissions = new ContractPermission(_chain, new Address(_transaction.To), deadline, 0); - await _wallet.AddSession(permissions); - await CheckSupportedTransaction(); + try + { + await _wallet.AddSession(permissions); + await CheckSupportedTransaction(); + } + catch (Exception e) + { + ShowError(e.Message); + } } public async void SendTransaction() @@ -84,14 +91,21 @@ public async void SendTransaction() if (_useFeeOptions) { - var feeOptions = await _wallet.GetFeeOption(_chain, transaction); - EcosystemFeatureSelection.Instance.OpenFeeOptionWindow(feeOptions, async feeOption => + try { - if (feeOption != null) - await TrySendTransaction(transaction, feeOption); + var feeOptions = await _wallet.GetFeeOption(_chain, transaction); + EcosystemFeatureSelection.Instance.OpenFeeOptionWindow(feeOptions, async feeOption => + { + if (feeOption != null) + await TrySendTransaction(transaction, feeOption); - SetState(State.Transaction); - }); + SetState(State.Transaction); + }); + } + catch (Exception e) + { + ShowError(e.Message); + } return; } @@ -109,11 +123,16 @@ private async Task TrySendTransaction(ITransaction transaction, FeeOption feeOpt } catch (Exception e) { - _messagePopup.Show(e.Message, true); - Debug.LogError($"{e.Message}"); + ShowError(e.Message); } } + private void ShowError(string message) + { + _messagePopup.Show(message, true); + Debug.LogError($"{message}"); + } + private async Task CheckSupportedTransaction() { SetState(State.Loading); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/BrowserRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/BrowserRedirectHandler.cs index 82195fa8..b2e92940 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/BrowserRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/BrowserRedirectHandler.cs @@ -32,7 +32,7 @@ private class ResponseData var go = new GameObject("SequenceNativeReceiver"); _receiver = go.AddComponent(); - var response = await _receiver.WaitForResponse(JsonConvert.SerializeObject(new {url, action, payload}), RedirectUrl); + var response = await _receiver.WaitForResponse(JsonConvert.SerializeObject(new {url, action, payload})); GameObject.Destroy(_receiver.gameObject); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/DeeplinkRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/DeeplinkRedirectHandler.cs index 5d5d0f6e..aab29393 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/DeeplinkRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/DeeplinkRedirectHandler.cs @@ -16,7 +16,7 @@ internal class DeeplinkRedirectHandler : RedirectHandler var go = new GameObject("SequenceNativeReceiver"); _receiver = go.AddComponent(); - var response = await _receiver.WaitForResponse(ConstructUrl(url, action, payload), RedirectUrl); + var response = await _receiver.WaitForResponse(ConstructUrl(url, action, payload)); GameObject.Destroy(_receiver.gameObject); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/NativeReceiver.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/NativeReceiver.cs index 558831ae..08d011e4 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/NativeReceiver.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/NativeReceiver.cs @@ -1,12 +1,11 @@ -using System; using System.Threading.Tasks; +using Sequence.Utils; using UnityEngine; namespace Sequence.EcosystemWallet.Browser { internal class NativeReceiver : MonoBehaviour { - private string _redirectUrl; private string _response; private void Awake() @@ -21,16 +20,15 @@ private void OnDestroy() public void HandleResponse(string response) { - Debug.Log($"Received response from native plugin: {response}"); + SequenceLog.Info($"Received response from native plugin: {response}"); _response = response; } - public async Task WaitForResponse(string url, string redirectUrl) + public async Task WaitForResponse(string url) { - Debug.Log($"Opening URL {url}"); + SequenceLog.Info($"Opening URL {url}"); - _redirectUrl = redirectUrl.Replace("://", ""); OpenWalletApp(url); while (string.IsNullOrEmpty(_response)) @@ -39,20 +37,20 @@ public async Task WaitForResponse(string url, string redirectUrl) return _response; } -#if !UNITY_EDITOR && (UNITY_WEBGL) +#if !UNITY_EDITOR && (UNITY_WEBGL || UNITY_IOS) [System.Runtime.InteropServices.DllImport("__Internal")] private static extern void OpenWalletApp(string url); -#elif !UNITY_EDITOR && UNITY_IOS - private void OpenWalletApp(string url) +#elif !UNITY_EDITOR && UNITY_ANDROID + private static void OpenWalletApp(string url) { - ASWebAuth_Start(url, _redirectUrl); + if (!ChromeTabs.IsSupported()) + { + SequenceLog.Info("Chrome tabs is not supported."); + return; + } + + ChromeTabs.Open(url); } - - [System.Runtime.InteropServices.DllImport("__Internal")] - private static extern void ASWebAuth_Start(string url, string callbackScheme); - - [System.Runtime.InteropServices.DllImport("__Internal")] - private static extern void ASWebAuth_Cancel(); #else private static void OpenWalletApp(string url) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/TcpRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/TcpRedirectHandler.cs deleted file mode 100644 index d71803f3..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/TcpRedirectHandler.cs +++ /dev/null @@ -1,160 +0,0 @@ -using System; -using System.IO; -using System.Net.Sockets; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Newtonsoft.Json; -using Sequence.Utils; -using UnityEngine; - -namespace Sequence.EcosystemWallet.Browser -{ - public class TcpRedirectHandler : RedirectHandler - { - public static readonly int WindowsIpcPort = 52836; - - private static bool _running; - private static string _response; - - public override async Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) - { - _response = string.Empty; - - PrepareServer("_redirectUrl"); - StartServer(); - - var finalUrl = ConstructUrl(url, action, payload); - Application.OpenURL(finalUrl); - - while (string.IsNullOrEmpty(_response)) - await Task.Delay(100); - - Debug.Log($"Received Response from tcp: {_response}"); - - var data = _response.ExtractQueryAndHashParameters(); - - Debug.Log($"Query Data: {JsonConvert.SerializeObject(data)}"); - - var id = data["id"]; - if (id != Id) - throw new Exception("Invalid request id"); - - if (data.TryGetValue("error", out var error)) - throw new Exception(error); - - var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(Uri.UnescapeDataString(data["payload"]))); - var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); - - return (true, responsePayload); - } - - /// - /// Run a TCP server on Windows standalone to get the auth token from the other instance. - /// IMPORTANT NOTE: Do not add code to this TCP server/client without thinking very carefully; it's easy to get driveby exploited since this is a TCP server any application can talk to. - /// IMPORTANT NOTE: Do not increase the attack surface without careful thought. - /// - private static void StartServer() - { - var syncContext = SynchronizationContext.Current; - var ipcListener = new Thread(() => - { - var socketConnection = new TcpListener(System.Net.IPAddress.Parse("127.0.0.1"), WindowsIpcPort); - socketConnection.Start(); - var bytes = new System.Byte[1024]; - var msg = ""; - - while (true) - { - using (var connectedTcpClient = socketConnection.AcceptTcpClient()) - { - using (NetworkStream stream = connectedTcpClient.GetStream()) - { - int length; - while ((length = stream.Read(bytes, 0, bytes.Length)) != 0) - { - var data = new byte[length]; - System.Array.Copy(bytes, 0, data, 0, length); - // Convert byte array to string message. - string clientMessage = System.Text.Encoding.ASCII.GetString(data); - if (clientMessage.StartsWith("@@@@")) - { - msg = clientMessage.Replace("@@@@", "").Replace("$$$$", ""); - } - else - { - msg += clientMessage.Replace("$$$$", ""); - } - if (msg.Length > 8192) - { - // got some weird garbage, toss it to avoid memory leaks. - msg = ""; - } - if (clientMessage.EndsWith("$$$$")) - { - syncContext.Post((data) => - { - Debug.Log($"{(string)data}"); - _response = (string)data; - }, msg); - } - } - } - } - } - }); - - ipcListener.IsBackground = true; - ipcListener.Start(); - _running = true; - } - - private static void PrepareServer(string redirectUrl) - { - if (_running) - return; - - // Register a Windows URL protocol handler in the Windows Registry. - var scheme = redirectUrl.Replace("://", string.Empty); - var appPath = Path.GetFullPath(Application.dataPath.Replace("_Data", ".exe")); - - string[] commands = new string[]{ - $"add HKEY_CURRENT_USER\\Software\\Classes\\{scheme} /t REG_SZ /d \"URL:Sequence Login for {Application.productName}\" /f", - $"add HKEY_CURRENT_USER\\Software\\Classes\\{scheme} /v \"URL Protocol\" /t REG_SZ /d \"\" /f", - $"add HKEY_CURRENT_USER\\Software\\Classes\\{scheme}\\shell /f", - $"add HKEY_CURRENT_USER\\Software\\Classes\\{scheme}\\shell\\open /f", - $"add HKEY_CURRENT_USER\\Software\\Classes\\{scheme}\\shell\\open\\command /t REG_SZ /d \"\\\"{appPath}\\\" \\\"%1\\\"\" /f", - }; - -#if ENABLE_MONO - foreach(var args in commands) { - var command = new System.Diagnostics.ProcessStartInfo(); - command.FileName = "C:\\Windows\\System32\\reg.exe"; - command.Arguments = args; - command.UseShellExecute = false; - command.CreateNoWindow = true; - System.Diagnostics.Process.Start(command); - } -#elif ENABLE_IL2CPP - try - { - foreach(var args in commands) { - var command = new System.Diagnostics.ProcessStartInfo(); - command.FileName = "C:\\Windows\\System32\\reg.exe"; - command.Arguments = args; - command.UseShellExecute = false; - command.CreateNoWindow = true; - System.Diagnostics.Process.Start(command); - } - } - catch (Exception ex) - { - string message = $"Failed to register URL scheme '{scheme}': {ex.Message}" + "\nSocial sign in is not currently supported on IL2CPP"; - Debug.LogWarning(message); - throw new Exception(message); - } -#endif - - } - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/TcpRedirectHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/TcpRedirectHandler.cs.meta deleted file mode 100644 index 6aa4927b..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/TcpRedirectHandler.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: ad9ab44dc25a48b997d66403ea30eb9f -timeCreated: 1753070976 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs index e6f038ea..add7d88e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs @@ -5,8 +5,6 @@ using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Relayer; using Sequence.Utils; -using Unity.Plastic.Newtonsoft.Json; -using UnityEngine; using UnityEngine.Assertions; namespace Sequence.EcosystemWallet diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs index 59343f13..3df6659c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs @@ -7,9 +7,6 @@ using Sequence.Signer; using Sequence.Utils; using Sequence.Wallet; -using Unity.Plastic.Newtonsoft.Json; -using UnityEngine; -using JsonConvert = Newtonsoft.Json.JsonConvert; namespace Sequence.EcosystemWallet { @@ -121,15 +118,13 @@ public SessionCallSignature SignCall(Chain chain, Call call, SessionsTopology to throw new Exception("Invalid permission"); } - - Debug.Log($"ExplicitSessionCallSignature {permissionIndex}"); return new ExplicitSessionCallSignature { permissionIndex = permissionIndex, sessionSignature = rsy }; } - Debug.Log($"ImplicitSessionCallSignature"); + return new ImplicitSessionCallSignature { attestation = _credentials.attestation, diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs index 2f63df60..dab5e3f4 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs @@ -4,8 +4,6 @@ using System.Threading.Tasks; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; -using Unity.Plastic.Newtonsoft.Json; -using UnityEngine; namespace Sequence.EcosystemWallet { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs index 47978987..523f7a85 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs @@ -1,7 +1,9 @@ using System.Numerics; +using UnityEngine.Scripting; namespace Sequence.Relayer { + [Preserve] public class FeeOption { public FeeToken token; @@ -10,6 +12,7 @@ public class FeeOption public int gasLimit; } + [Preserve] public class FeeToken { public BigInteger chainId; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsReturn.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsReturn.cs index 927707e5..24aaeb4b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsReturn.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsReturn.cs @@ -1,5 +1,8 @@ +using UnityEngine.Scripting; + namespace Sequence.Relayer { + [Preserve] public class FeeOptionsReturn { public FeeOption[] options; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptReturn.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptReturn.cs index 39e29ac4..63806ed7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptReturn.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptReturn.cs @@ -1,5 +1,8 @@ +using UnityEngine.Scripting; + namespace Sequence.Relayer { + [Preserve] public class GetMetaTxnReceiptReturn { public MetaTxnReceipt receipt; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnReturn.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnReturn.cs index 781083ca..52ddfb01 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnReturn.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnReturn.cs @@ -1,5 +1,8 @@ +using UnityEngine.Scripting; + namespace Sequence.Relayer { + [Preserve] public class SendMetaTxnReturn { public bool status; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ChromeTabs.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ChromeTabs.cs new file mode 100644 index 00000000..de4fff84 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ChromeTabs.cs @@ -0,0 +1,47 @@ +using UnityEngine; + +namespace Sequence.Utils +{ + public static class ChromeTabs + { +#if UNITY_ANDROID && !UNITY_EDITOR + private const string PluginClass = "xyz.sequence.ChromeTabsPlugin"; +#endif + /// + /// Open a URL in Chrome Custom Tabs (Android), or Application.OpenURL elsewhere. + /// rgb24 is optional 0xRRGGBB; will be applied as opaque toolbar color. + /// + public static void Open(string url, uint? rgb24 = null, bool enableShare = false, bool showTitle = true) + { +#if UNITY_ANDROID && !UNITY_EDITOR + int colorInt = 0; // 0 = use default theme color in Java + if (rgb24.HasValue) + { + // Convert 0xRRGGBB into Android ARGB (opaque) + colorInt = unchecked((int)(0xFF000000u | rgb24.Value)); + } + + using (var jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) + using (var activity = jc.GetStatic("currentActivity")) + using (var plugin = new AndroidJavaClass(PluginClass)) + { + plugin.CallStatic("openUrl", url, colorInt, enableShare, showTitle); + } +#else + Application.OpenURL(url); +#endif + } + + public static bool IsSupported() + { +#if UNITY_ANDROID && !UNITY_EDITOR + using (var plugin = new AndroidJavaClass(PluginClass)) + { + return plugin.CallStatic("isCustomTabsSupported"); + } +#else + return false; +#endif + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ChromeTabs.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ChromeTabs.cs.meta new file mode 100644 index 00000000..4fba6154 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ChromeTabs.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: eaf144b610614de08b3a96b1facbb100 +timeCreated: 1755194848 \ No newline at end of file diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index af72a470..da52d263 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -3,7 +3,7 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 23 + serializedVersion: 26 productGUID: 4db421e74da5e674e8c4203f416d7f72 AndroidProfiler: 0 AndroidFilterTouchesWhenObscured: 0 @@ -50,14 +50,16 @@ PlayerSettings: defaultScreenHeightWeb: 1080 m_StereoRenderingPath: 0 m_ActiveColorSpace: 0 + unsupportedMSAAFallback: 0 + m_SpriteBatchVertexThreshold: 300 m_MTRendering: 1 mipStripping: 0 numberOfMipsStripped: 0 + numberOfMipsStrippedPerMipmapLimitGroup: {} m_StackTraceTypes: 010000000100000001000000010000000100000001000000 iosShowActivityIndicatorOnLoading: -1 androidShowActivityIndicatorOnLoading: -1 iosUseCustomAppBackgroundBehavior: 0 - iosAllowHTTPDownload: 0 allowedAutorotateToPortrait: 1 allowedAutorotateToPortraitUpsideDown: 1 allowedAutorotateToLandscapeRight: 1 @@ -76,6 +78,7 @@ PlayerSettings: androidMinimumWindowWidth: 400 androidMinimumWindowHeight: 300 androidFullscreenMode: 1 + androidAutoRotationBehavior: 1 defaultIsNativeResolution: 1 macRetinaSupport: 1 runInBackground: 1 @@ -87,6 +90,7 @@ PlayerSettings: hideHomeButton: 0 submitAnalytics: 1 usePlayerLog: 1 + dedicatedServerOptimizations: 0 bakeCollisionMeshes: 0 forceSingleInstance: 0 useFlipModelSwapchain: 1 @@ -121,8 +125,12 @@ PlayerSettings: switchNVNShaderPoolsGranularity: 33554432 switchNVNDefaultPoolsGranularity: 16777216 switchNVNOtherPoolsGranularity: 16777216 + switchGpuScratchPoolGranularity: 2097152 + switchAllowGpuScratchShrinking: 0 switchNVNMaxPublicTextureIDCount: 0 switchNVNMaxPublicSamplerIDCount: 0 + switchNVNGraphicsFirmwareMemory: 32 + switchMaxWorkerMultiple: 8 stadiaPresentMode: 0 stadiaTargetFramerate: 0 vulkanNumSwapchainBuffers: 3 @@ -130,12 +138,9 @@ PlayerSettings: vulkanEnablePreTransform: 1 vulkanEnableLateAcquireNextImage: 0 vulkanEnableCommandBufferRecycling: 1 - m_SupportedAspectRatios: - 4:3: 1 - 5:4: 1 - 16:10: 1 - 16:9: 1 - Others: 1 + loadStoreDebugModeEnabled: 0 + visionOSBundleVersion: 1.0 + tvOSBundleVersion: 1.0 bundleVersion: 0.1 preloadedAssets: [] metroInputSource: 0 @@ -148,8 +153,9 @@ PlayerSettings: isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 + allowHDRDisplaySupport: 0 useHDRDisplay: 0 - D3DHDRBitDepth: 0 + hdrBitDepth: 0 m_ColorGamuts: 00000000 targetPixelDensity: 30 resolutionScalingMode: 0 @@ -162,6 +168,7 @@ PlayerSettings: iPhone: com.HorizonGames.demo-unity-game2 buildNumber: Standalone: 0 + VisionOS: 0 iPhone: 0 tvOS: 0 overrideDefaultApplicationIdentifier: 1 @@ -179,12 +186,15 @@ PlayerSettings: APKExpansionFiles: 0 keepLoadedShadersAlive: 0 StripUnusedMeshComponents: 1 + strictShaderVariantMatching: 0 VertexChannelCompressionMask: 4054 iPhoneSdkVersion: 988 - iOSTargetOSVersionString: 11.0 + iOSTargetOSVersionString: 12.0 tvOSSdkVersion: 0 tvOSRequireExtendedGameController: 0 - tvOSTargetOSVersionString: 11.0 + tvOSTargetOSVersionString: 12.0 + VisionOSSdkVersion: 0 + VisionOSTargetOSVersionString: 1.0 uIPrerenderedIcon: 0 uIRequiresPersistentWiFi: 0 uIRequiresFullScreen: 1 @@ -232,8 +242,10 @@ PlayerSettings: appleDeveloperTeamID: XR9N5MTG4N iOSManualSigningProvisioningProfileID: tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 + VisionOSManualSigningProvisioningProfileType: 0 appleEnableAutomaticSigning: 1 iOSRequireARKit: 0 iOSAutomaticallyDetectAndAddCapabilities: 1 @@ -248,6 +260,7 @@ PlayerSettings: useCustomLauncherGradleManifest: 0 useCustomBaseGradleTemplate: 0 useCustomGradlePropertiesTemplate: 1 + useCustomGradleSettingsTemplate: 0 useCustomProguardFile: 0 AndroidTargetArchitectures: 3 AndroidTargetDevices: 0 @@ -255,6 +268,7 @@ PlayerSettings: androidSplashScreen: {fileID: 0} AndroidKeystoreName: AndroidKeyaliasName: + AndroidEnableArmv9SecurityFeatures: 0 AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 0 AndroidIsGame: 1 @@ -268,7 +282,6 @@ PlayerSettings: banner: {fileID: 0} androidGamepadSupportLevel: 0 chromeosInputEmulation: 1 - AndroidMinifyWithR8: 0 AndroidMinifyRelease: 0 AndroidMinifyDebug: 0 AndroidValidateAppBundleSize: 1 @@ -487,6 +500,7 @@ PlayerSettings: - m_BuildTarget: WebGL m_StaticBatching: 0 m_DynamicBatching: 0 + m_BuildTargetShaderSettings: [] m_BuildTargetGraphicsJobs: - m_BuildTarget: MacStandaloneSupport m_GraphicsJobs: 0 @@ -538,6 +552,8 @@ PlayerSettings: m_Devices: - Oculus - OpenVR + m_DefaultShaderChunkSizeInMB: 16 + m_DefaultShaderChunkCount: 0 openGLRequireES31: 0 openGLRequireES31AEP: 0 openGLRequireES32: 0 @@ -547,6 +563,13 @@ PlayerSettings: iPhone: 1 tvOS: 1 m_BuildTargetGroupLightmapEncodingQuality: + - m_BuildTarget: Android + m_EncodingQuality: 1 + - m_BuildTarget: iPhone + m_EncodingQuality: 1 + - m_BuildTarget: tvOS + m_EncodingQuality: 1 + m_BuildTargetGroupHDRCubemapEncodingQuality: - m_BuildTarget: Android m_EncodingQuality: 1 - m_BuildTarget: iPhone @@ -554,6 +577,7 @@ PlayerSettings: - m_BuildTarget: tvOS m_EncodingQuality: 1 m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetGroupLoadStoreDebugModeSettings: [] m_BuildTargetNormalMapEncoding: - m_BuildTarget: Android m_Encoding: 1 @@ -574,6 +598,7 @@ PlayerSettings: locationUsageDescription: microphoneUsageDescription: bluetoothUsageDescription: + macOSTargetOSVersion: 10.13.0 switchNMETAOverride: switchNetLibKey: switchSocketMemoryPoolSize: 6144 @@ -581,10 +606,11 @@ PlayerSettings: switchSocketConcurrencyLimit: 14 switchScreenResolutionBehavior: 2 switchUseCPUProfiler: 0 - switchUseGOLDLinker: 0 + switchEnableFileSystemTrace: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 switchNSODependencies: + switchCompilerFlags: switchTitleNames_0: switchTitleNames_1: switchTitleNames_2: @@ -658,7 +684,6 @@ PlayerSettings: switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 switchStartupUserAccount: 0 - switchTouchScreenUsage: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 switchApplicationErrorCodeCategory: @@ -700,6 +725,7 @@ PlayerSettings: switchNativeFsCacheSize: 32 switchIsHoldTypeHorizontal: 0 switchSupportedNpadCount: 8 + switchEnableTouchScreen: 1 switchSocketConfigEnabled: 0 switchTcpInitialSendBufferSize: 32 switchTcpInitialReceiveBufferSize: 64 @@ -710,8 +736,8 @@ PlayerSettings: switchSocketBufferEfficiency: 4 switchSocketInitializeEnabled: 1 switchNetworkInterfaceManagerInitializeEnabled: 1 - switchPlayerConnectionEnabled: 1 switchUseNewStyleFilepaths: 0 + switchUseLegacyFmodPriorities: 0 switchUseMicroSleepForYield: 1 switchEnableRamDiskSupport: 0 switchMicroSleepForYieldTime: 25 @@ -799,6 +825,7 @@ PlayerSettings: webGLMemorySize: 16 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 + webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 webGLEmscriptenArgs: @@ -811,8 +838,15 @@ PlayerSettings: webGLLinkerTarget: 1 webGLThreadsSupport: 0 webGLDecompressionFallback: 1 + webGLInitialMemorySize: 32 + webGLMaximumMemorySize: 2048 + webGLMemoryGrowthMode: 2 + webGLMemoryLinearGrowthStep: 16 + webGLMemoryGeometricGrowthStep: 0.2 + webGLMemoryGeometricGrowthCap: 96 + webGLPowerPreference: 2 scriptingDefineSymbols: - Android: SEQUENCE_DEBUG + Android: SEQUENCE_DEBUG;ENABLE_SEQUENCE_ANDROID_SECURE_STORAGE Server: Standalone: UNITY_ASTOOLS_EXPERIMENTAL;SEQUENCE_DEBUG WebGL: VUPLEX_CCU;VUPLEX_STANDALONE;SEQUENCE_DEBUG @@ -823,17 +857,30 @@ PlayerSettings: Android: 1 Standalone: 0 il2cppCompilerConfiguration: {} + il2cppCodeGeneration: {} managedStrippingLevel: + Android: 1 + EmbeddedLinux: 1 + GameCoreScarlett: 1 + GameCoreXboxOne: 1 + Nintendo Switch: 1 + PS4: 1 + PS5: 1 + QNX: 1 + Stadia: 1 + VisionOS: 1 + WebGL: 1 + Windows Store Apps: 1 + XboxOne: 1 iPhone: 3 + tvOS: 1 incrementalIl2cppBuild: {} suppressCommonWarnings: 1 allowUnsafeCode: 0 useDeterministicCompilation: 1 - enableRoslynAnalyzers: 1 additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 1 - assemblyVersionValidation: 0 gcWBarrierValidation: 0 apiCompatibilityLevelPerPlatform: WebGL: 3 @@ -907,8 +954,14 @@ PlayerSettings: luminVersion: m_VersionCode: 1 m_VersionName: + hmiPlayerDataPath: + hmiForceSRGBBlit: 1 + embeddedLinuxEnableGamepadInput: 1 + hmiLogStartupTiming: 0 + hmiCpuConfiguration: apiCompatibilityLevel: 6 activeInputHandler: 0 + windowsGamepadBackendHint: 0 cloudProjectId: framebufferDepthMemorylessMode: 0 qualitySettingsNames: [] @@ -916,6 +969,7 @@ PlayerSettings: organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 0 - playerDataPath: - forceSRGBBlit: 1 + hmiLoadingImage: {fileID: 0} + platformRequiresReadableAssets: 0 virtualTexturingSupportEnabled: 0 + insecureHttpOption: 0 From c8bd95d8026565642f787f349e7005b652d3b424 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 14 Aug 2025 21:40:27 +0200 Subject: [PATCH 148/165] added relayer preserve flags --- Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity | 2 +- .../Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs | 3 +++ .../SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs | 3 +++ .../SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs | 3 +++ .../Sequence/SequenceSDK/Relayer/DataTypes/MetaTxn.cs | 3 +++ .../Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs | 2 ++ .../SequenceSDK/Relayer/DataTypes/MetaTxnReceiptLog.cs | 3 +++ 7 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index a64076dc..4511bdab 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -8053,7 +8053,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: imlpicitEmit() (testnet) + m_text: implicitEmit() (testnet) m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} m_sharedMaterial: {fileID: 1471415949496392458, guid: 3b399a2d8fd4949958a248da594a7b27, type: 2} diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs index 0fa7af86..cce9ee8d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs @@ -1,5 +1,8 @@ +using UnityEngine.Scripting; + namespace Sequence.Relayer { + [Preserve] public class FeeOptionsArgs { public Address wallet; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs index c8b82b02..07ac5e83 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs @@ -1,5 +1,8 @@ +using UnityEngine.Scripting; + namespace Sequence.Relayer { + [Preserve] public class GetMetaTxnReceiptArgs { public string metaTxID; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs index 1c30800b..3976f3a2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs @@ -1,5 +1,8 @@ +using UnityEngine.Scripting; + namespace Sequence.Relayer { + [Preserve] public class IntentPrecondition { public string type; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxn.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxn.cs index ca7d423d..d6d295ff 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxn.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxn.cs @@ -1,5 +1,8 @@ +using UnityEngine.Scripting; + namespace Sequence.Relayer { + [Preserve] public class MetaTxn { public Address walletAddress; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs index 17eeb344..c919fe05 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs @@ -1,7 +1,9 @@ using System; +using UnityEngine.Scripting; namespace Sequence.Relayer { + [Preserve] public class MetaTxnReceipt { public string id; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceiptLog.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceiptLog.cs index e718e8e8..9e02beaa 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceiptLog.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceiptLog.cs @@ -1,5 +1,8 @@ +using UnityEngine.Scripting; + namespace Sequence.Relayer { + [Preserve] public class MetaTxnReceiptLog { public string address; From 19409c62077421c25bed45bd24b6bd783cc55064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 14 Aug 2025 23:26:21 +0200 Subject: [PATCH 149/165] fixed il2cpp stripping issues for ios --- .../IntegrationTests/ConfigTests.cs | 3 +- .../IntegrationTests/DevToolsTest.cs | 3 +- .../EcosystemWallet/TransactionButton.cs | 12 ++- .../KeyMachine/KeyMachineApi.cs | 13 +-- .../KeyMachine/Models/Config.cs | 5 ++ .../Config/AnyAddressSubdigestLeaf.cs | 8 +- .../Primitives/Config/Config.cs | 45 ++++++++--- .../Primitives/Config/NestedLeaf.cs | 10 ++- .../Primitives/Config/SapientSignerLeaf.cs | 10 ++- .../Primitives/Config/SignerLeaf.cs | 9 ++- .../Primitives/Config/SubdigestLeaf.cs | 8 +- .../Primitives/Config/Topology.cs | 80 +++++++++---------- .../Primitives/Sessions/IdentitySignerLeaf.cs | 8 +- .../Sessions/ImplicitBlacklistLeaf.cs | 8 +- .../Wallet/CallContractData.cs | 8 ++ .../Wallet/CallContractData.cs.meta | 3 + .../EcosystemWallet/Wallet/SessionSigner.cs | 8 +- .../EcosystemWallet/Wallet/WalletState.cs | 34 +++++--- 18 files changed, 191 insertions(+), 84 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/CallContractData.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/CallContractData.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs index e6f33aa8..fde078e7 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Numerics; using System.Threading.Tasks; +using Newtonsoft.Json; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; @@ -25,7 +26,7 @@ public Task ConfigNew(Dictionary parameters) checkpointer = checkpointer }; - return Task.FromResult(config.ToJson()); + return Task.FromResult(JsonConvert.SerializeObject(config)); } public Task ConfigEncode(Dictionary parameters) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs index 844de938..4590ebb4 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Threading.Tasks; +using Newtonsoft.Json; namespace Sequence.EcosystemWallet.IntegrationTests { @@ -21,7 +22,7 @@ public Task DevToolsRandomConfig(Dictionary parameters) skewed = skewed }; - return Task.FromResult(DevTools.CreateRandomConfig(maxDepth, options).ToJson()); + return Task.FromResult(JsonConvert.SerializeObject(DevTools.CreateRandomConfig(maxDepth, options))); } public Task DevToolsRandomSessionTopology(Dictionary parameters) diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs index cd2b7969..fbbe04a6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs @@ -136,8 +136,16 @@ private void ShowError(string message) private async Task CheckSupportedTransaction() { SetState(State.Loading); - var supported = await _wallet.SupportsTransaction(_chain, _transaction.BuildTransaction()); - SetState(supported ? State.Transaction : State.Session); + + try + { + var supported = await _wallet.SupportsTransaction(_chain, _transaction.BuildTransaction()); + SetState(supported ? State.Transaction : State.Session); + } + catch (Exception e) + { + ShowError(e.Message); + } } private void SetState(State state) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs index 82a536f2..2b20a986 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs @@ -3,6 +3,7 @@ using Sequence.EcosystemWallet.KeyMachine.Models; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet { @@ -37,18 +38,10 @@ public async Task GetConfigUpdates(string wallet, string fr return await SendRequest("ConfigUpdates", args); } - public async Task GetConfiguration(string imageHash) + public async Task GetConfiguration(string imageHash) { var args = new ConfigArgs(imageHash); - var response = await SendRequest("Config", args); - - var topology = Topology.FromServiceConfigTree(response.config.tree.ToString()); - return new Primitives.Config - { - threshold = new BigInteger(response.config.threshold), - checkpoint = BigInteger.Parse(response.config.checkpoint), - topology = topology, - }; + return await SendRequest("Config", args); } private async Task SendRequest(string endpoint, TArgs args) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs index a75123f7..7075173d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs @@ -1,5 +1,8 @@ +using UnityEngine.Scripting; + namespace Sequence.EcosystemWallet.KeyMachine.Models { + [Preserve] internal struct ConfigArgs { public string imageHash; @@ -10,12 +13,14 @@ public ConfigArgs(string imageHash) } } + [Preserve] internal struct ConfigReturn { public int version; public ConfigContext config; } + [Preserve] internal struct ConfigContext { public string checkpoint; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs index fd88c326..c8beedce 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs @@ -6,11 +6,17 @@ namespace Sequence.EcosystemWallet.Primitives { public class AnyAddressSubdigestLeaf : Leaf { + private struct AnyAddressSubdigestLeafJson + { + public string type; + public string digest; + } + public byte[] digest; public override object Parse() { - return new + return new AnyAddressSubdigestLeafJson { type = AnyAddressSubdigest, digest = digest.ByteArrayToHexStringWithPrefix() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs index 831960d9..44f4d970 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs @@ -2,13 +2,16 @@ using System.Collections.Generic; using System.Numerics; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using Org.BouncyCastle.Utilities.Encoders; using Sequence.ABI; using Sequence.Utils; using UnityEngine; +using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives { + [JsonConverter(typeof(ConfigJsonConverter))] public class Config { public BigInteger threshold; @@ -41,19 +44,6 @@ public byte[] HashConfiguration() return root; } - public string ToJson() - { - var jsonObject = new - { - threshold = threshold.ToString(), - checkpoint = checkpoint.ToString(), - topology = topology?.Parse(), - checkpointer = checkpointer?.Value - }; - - return JsonConvert.SerializeObject(jsonObject); - } - public static Config FromJson(string json) { var input = JsonConvert.DeserializeObject>(json); @@ -74,4 +64,33 @@ public static Config FromJson(string json) }; } } + + [Preserve] + public class ConfigJsonConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, Config value, JsonSerializer serializer) + { + var obj = new JObject + { + ["threshold"] = value.threshold.ToString(), + ["checkpoint"] = value.checkpoint.ToString(), + ["topology"] = JToken.FromObject(value.topology.Parse(), serializer), + ["checkpointer"] = value.checkpointer?.Value + }; + + obj.WriteTo(writer); + } + + public override Config ReadJson(JsonReader reader, Type objectType, Config existingValue, bool hasExistingValue, JsonSerializer serializer) + { + var obj = JObject.Load(reader); + return new Config + { + threshold = BigInteger.Parse((string)obj["threshold"]), + checkpoint = BigInteger.Parse((string)obj["checkpoint"]), + topology = Topology.Decode(obj["topology"].ToString()), + checkpointer = obj["checkpointer"] != null ? new Address((string)obj["checkpointer"]) : null + }; + } + } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs index a177d9b3..32d68ac0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs @@ -9,13 +9,21 @@ namespace Sequence.EcosystemWallet.Primitives { public class NestedLeaf : Leaf { + private struct NestedLeafJson + { + public string type; + public object tree; + public string weight; + public string threshold; + } + public Topology tree; public BigInteger weight; public BigInteger threshold; public override object Parse() { - return new + return new NestedLeafJson { type = Nested, tree = tree.Parse(), diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs index 129cce2e..f02c17c1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs @@ -7,13 +7,21 @@ namespace Sequence.EcosystemWallet.Primitives { public class SapientSignerLeaf : Leaf { + private struct SapientSignerLeafJson + { + public string type; + public string address; + public string weight; + public string imageHash; + } + public Address address; public BigInteger weight; public string imageHash; public override object Parse() { - return new + return new SapientSignerLeafJson { type = SapientSigner, address = address, diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs index b6eb247c..b11c9e19 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs @@ -8,12 +8,19 @@ namespace Sequence.EcosystemWallet.Primitives { public class SignerLeaf : Leaf { + private struct SignerLeafJson + { + public string type; + public string address; + public string weight; + } + public Address address; public BigInteger weight; public override object Parse() { - return new + return new SignerLeafJson { type = Signer, address = address, diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs index b28096a9..ca1b3c26 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs @@ -6,11 +6,17 @@ namespace Sequence.EcosystemWallet.Primitives { public class SubdigestLeaf : Leaf { + private struct SubdigestLeafJson + { + public string type; + public string digest; + } + public byte[] digest; public override object Parse() { - return new + return new SubdigestLeafJson { type = Subdigest, digest = digest.ByteArrayToHexStringWithPrefix() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index af9c06e9..0a3207ac 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -352,53 +352,53 @@ public static Topology FromServiceConfigTree(string input) var obj = JsonConvert.DeserializeObject>(input); if (obj.ContainsKey("weight")) { - if (obj.ContainsKey("address")) - { - if (obj.ContainsKey("imageHash")) - { - return new SapientSignerLeaf - { - address = new Address(obj["address"] as string), - weight = BigInteger.Parse(obj["weight"].ToString()), - imageHash = obj["imageHash"] as string - }.ToTopology(); - } - - return new SignerLeaf - { - address = new Address(obj["address"] as string), - weight = BigInteger.Parse(obj["weight"].ToString()) - }.ToTopology(); - } - - if (obj.ContainsKey("tree")) + if (obj.ContainsKey("address")) + { + if (obj.ContainsKey("imageHash")) + { + return new SapientSignerLeaf { - return new NestedLeaf - { - weight = BigInteger.Parse(obj["weight"].ToString()), - threshold = BigInteger.Parse(obj["threshold"].ToString()), - tree = FromServiceConfigTree(obj["tree"].ToString()) - }.ToTopology(); - } + address = new Address(obj["address"] as string), + weight = BigInteger.Parse(obj["weight"].ToString()), + imageHash = obj["imageHash"] as string + }.ToTopology(); + } + + return new SignerLeaf + { + address = new Address(obj["address"] as string), + weight = BigInteger.Parse(obj["weight"].ToString()) + }.ToTopology(); + } + + if (obj.ContainsKey("tree")) + { + return new NestedLeaf + { + weight = BigInteger.Parse(obj["weight"].ToString()), + threshold = BigInteger.Parse(obj["threshold"].ToString()), + tree = FromServiceConfigTree(obj["tree"].ToString()) + }.ToTopology(); + } } if (obj.ContainsKey("subdigest")) { - var subdigest = obj["subdigest"].ToString().HexStringToByteArray(); - var isAny = obj.ContainsKey("isAnyAddress") && (bool)obj["isAnyAddress"]; + var subdigest = obj["subdigest"].ToString().HexStringToByteArray(); + var isAny = obj.ContainsKey("isAnyAddress") && (bool)obj["isAnyAddress"]; - if (isAny) - { - return new AnyAddressSubdigestLeaf - { - digest = subdigest - }.ToTopology(); - } + if (isAny) + { + return new AnyAddressSubdigestLeaf + { + digest = subdigest + }.ToTopology(); + } - return new SubdigestLeaf - { - digest = subdigest - }.ToTopology(); + return new SubdigestLeaf + { + digest = subdigest + }.ToTopology(); } throw new Exception($"Unknown config tree '{input}'"); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs index e2b92cd6..976a6625 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs @@ -4,11 +4,17 @@ namespace Sequence.EcosystemWallet.Primitives { public class IdentitySignerLeaf : SessionLeaf { + private struct Json + { + public string type; + public string identitySigner; + } + public Address identitySigner; public override object ToJsonObject() { - return new + return new Json { type = IdentitySignerType, identitySigner = identitySigner.Value, diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs index c19cc3f7..c4b96d8e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs @@ -6,11 +6,17 @@ namespace Sequence.EcosystemWallet.Primitives { public class ImplicitBlacklistLeaf : SessionLeaf { + private struct Json + { + public string type; + public string[] blacklist; + } + public Address[] blacklist; public override object ToJsonObject() { - return new + return new Json { type = ImplicitBlacklistType, blacklist = blacklist is { Length: <= 0 } ? diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/CallContractData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/CallContractData.cs new file mode 100644 index 00000000..ca93bcc5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/CallContractData.cs @@ -0,0 +1,8 @@ +namespace Sequence.EcosystemWallet +{ + public struct CallContractData + { + public Address to; + public string data; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/CallContractData.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/CallContractData.cs.meta new file mode 100644 index 00000000..f48eae3e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/CallContractData.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d88ea51b8108492eaca890d21bbb4b3f +timeCreated: 1755204766 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs index 3df6659c..5c07b18b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs @@ -12,6 +12,12 @@ namespace Sequence.EcosystemWallet { internal class SessionSigner { + public struct CallContractData + { + public Address to; + public string data; + } + private static readonly Address ValueTrackingAddress = new ("0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"); public Address ParentAddress { get; } @@ -150,7 +156,7 @@ private async Task CheckAcceptImplicitRequest(Chain chain, Call call) { var response = await new SequenceEthClient(chain).CallContract(new object[] { - new + new CallContractData { to = call.to, data = GetAcceptImplicitRequestFunctionAbi(call) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs index 084b1051..4d48569b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs @@ -65,6 +65,7 @@ private async Task GetDeployHash(Address address) { var storageKey = $"sequence-deploy-hash-{address}"; var cached = _secureStorage.RetrieveString(storageKey); + if (!string.IsNullOrEmpty(cached)) return JsonConvert.DeserializeObject(cached); @@ -76,21 +77,36 @@ private async Task GetDeployHash(Address address) private async Task GetConfig(string imageHash) { - var storageKey = $"sequence-config-{imageHash}"; + var storageKey = $"sequence-config-tree-{imageHash}"; var cached = _secureStorage.RetrieveString(storageKey); + if (!string.IsNullOrEmpty(cached)) - return Primitives.Config.FromJson(cached); + return ConfigFromServiceTree(JsonConvert.DeserializeObject(cached)); - var config = await _keyMachine.GetConfiguration(imageHash); - _secureStorage.StoreString(storageKey, config.ToJson()); + var response = await _keyMachine.GetConfiguration(imageHash); + _secureStorage.StoreString(storageKey, JsonConvert.SerializeObject(response)); - return config; + return ConfigFromServiceTree(response); + } + + private Primitives.Config ConfigFromServiceTree(ConfigReturn configReturn) + { + var tree = configReturn.config.tree.ToString(); + var topology = Topology.FromServiceConfigTree(tree); + + return new Primitives.Config + { + threshold = new BigInteger(configReturn.config.threshold), + checkpoint = BigInteger.Parse(configReturn.config.checkpoint), + topology = topology, + }; } private async Task GetSessionsTopology(string imageHash) { var storageKey = $"sequence-sessions-tree-{imageHash}"; var cached = _secureStorage.RetrieveString(storageKey); + if (!string.IsNullOrEmpty(cached)) return SessionsTopology.FromTree(cached); @@ -105,7 +121,7 @@ private async Task GetSessionsTopology(string imageHash) private async Task GetImplementation(Chain chain) { var response = await new SequenceEthClient(chain).CallContract(new object[] { - new + new CallContractData { to = Address, data = ABI.ABI.Pack("getImplementation()") @@ -125,7 +141,7 @@ private async Task GetImplementation(Chain chain) private async Task GetOnChainImageHash(Chain chain) { var response = await new SequenceEthClient(chain).CallContract(new object[] { - new + new CallContractData { to = Address, data = ABI.ABI.Pack("imageHash()") @@ -166,10 +182,10 @@ public async Task UpdateNonce(Chain chain, BigInteger space) var data = encoder.EncodeRequest(function.Sha3Signature, function.InputParameters, space); var response = await new SequenceEthClient(chain).CallContract(new object[] { - new + new CallContractData { to = Address, - data + data = data } }); From f1b4feb09f0f51580bb0382bcdf45b94514ae41c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 21 Aug 2025 10:38:27 +0200 Subject: [PATCH 150/165] changed session creation args, implicit-only not allowed for passkey login --- .../Authentication/EcosystemClient.cs | 24 ++++++++++++------- .../LocalhostRedirectHandler.cs | 3 +++ .../Authentication/Requests/Connect.cs | 1 + .../Authentication/SequenceConnect.cs | 6 +++-- .../EcosystemWallet/Wallet/SequenceWallet.cs | 5 +++- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs index e20d7dbc..b472ba14 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs @@ -1,13 +1,18 @@ using System; -using System.Numerics; using System.Threading.Tasks; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; using Sequence.Wallet; -using UnityEngine; namespace Sequence.EcosystemWallet { + public enum SessionCreationType + { + CreateNewSession, + IncludeImplicit, + AddExplicit + } + internal class EcosystemClient { private readonly EcosystemType _ecosystem; @@ -20,13 +25,11 @@ public EcosystemClient(EcosystemType ecosystem) /// /// Create an implicit- or explicit session based on a given set of permissions. /// - /// The ecosystem you want to connect with. - /// The chain you want to connect with. - /// Leave it null to create an implicit session. Otherwise, we create an explicit session. + /// Leave it null to create an implicit session. Otherwise, we create an explicit session. /// Leave it null to create an implicit session. Otherwise, we create an explicit session. /// /// - public async Task CreateNewSession(bool isExplicit, SessionPermissions permissions, string preferredLoginMethod, string email = null) + public async Task CreateNewSession(SessionCreationType type, SessionPermissions permissions, string preferredLoginMethod, string email = null) { var chainId = string.Empty; if (permissions != null) @@ -40,16 +43,19 @@ public async Task CreateNewSession(bool isExplicit, SessionPerm var sessionWallet = new EOAWallet(); var origin = RedirectOrigin.GetOriginString(); + var includeImplicitSession = type == SessionCreationType.IncludeImplicit; + var payload = new ConnectArgs { sessionAddress = sessionWallet.GetAddress(), preferredLoginMethod = preferredLoginMethod, email = email, origin = origin, + includeImplicitSession = includeImplicitSession, permissions = permissions }; - var action = isExplicit ? "addExplicitSession" : "addImplicitSession"; + var action = type == SessionCreationType.AddExplicit ? "addExplicitSession" : "createNewSession"; var ecosystemUrl = EcosystemBindings.GetUrl(_ecosystem); var url = $"{ecosystemUrl}/request/connect"; @@ -60,12 +66,12 @@ public async Task CreateNewSession(bool isExplicit, SessionPerm if (!response.Result) throw new Exception("Error during request"); - var isImplicitWithPermissions = !isExplicit && permissions != null; + var isImplicitWithPermissions = includeImplicitSession && permissions != null; var credentialsLen = isImplicitWithPermissions ? 2 : 1; var credentials = new SessionCredentials[credentialsLen]; credentials[0] = new SessionCredentials( - isExplicit, + !includeImplicitSession, sessionWallet.GetPrivateKeyAsHex(), response.Data.walletAddress, response.Data.attestation, diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs index 62f3af39..912e8646 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs @@ -2,6 +2,7 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; +using Sequence.Utils; using UnityEngine; namespace Sequence.EcosystemWallet.Browser @@ -32,6 +33,8 @@ internal class LocalhostRedirectHandler : RedirectHandler var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(queryString["payload"])); var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); + SequenceLog.Info(responsePayloadJson); + return (true, responsePayload); } catch (Exception ex) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs index 2c46b324..80c5015c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs @@ -8,6 +8,7 @@ public struct ConnectArgs public string preferredLoginMethod; public string email; public string origin; + public bool includeImplicitSession; public SessionPermissions permissions; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index 9d3aed65..ed97fb08 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Sequence.EcosystemWallet.Primitives; +using UnityEngine.Assertions; namespace Sequence.EcosystemWallet { @@ -27,8 +28,9 @@ public async Task SignInWithApple(IPermissions permissions = null) return await SignIn(permissions, "apple", null); } - public async Task SignInWithPasskey(IPermissions permissions = null) + public async Task SignInWithPasskey(IPermissions permissions) { + Assert.IsNotNull(permissions, "Permissions cannot be null when you sign in with passkey."); return await SignIn(permissions, "passkey", null); } @@ -39,7 +41,7 @@ public async Task SignInWithMnemonic(IPermissions permissions = null) private async Task SignIn(IPermissions permissions, string preferredLoginMethod, string email) { - var signers = await _client.CreateNewSession(false, permissions?.GetPermissions(), preferredLoginMethod, email); + var signers = await _client.CreateNewSession(SessionCreationType.CreateNewSession, permissions?.GetPermissions(), preferredLoginMethod, email); return new SequenceWallet(signers); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs index add7d88e..2c15779f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs @@ -55,7 +55,9 @@ public async Task AddSession(IPermissions permissions) var ecosystem = _sessionSigners[0].Ecosystem; var client = new EcosystemClient(ecosystem); - var sessionSigners = await client.CreateNewSession(true, permissions.GetPermissions(), string.Empty); + var sessionSigners = await client.CreateNewSession(SessionCreationType.AddExplicit, + permissions.GetPermissions(), string.Empty); + foreach (var sessionSigner in sessionSigners) _sessionSigners = _sessionSigners.AddToArray(sessionSigner); } @@ -181,6 +183,7 @@ public async Task SupportsTransaction(Chain chain, ITransaction[] transact } catch (Exception e) { + SequenceLog.Exception(e); return false; } } From 8ac904657149ee1026a4b4dc3293efde6ab15864 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 21 Aug 2025 16:40:34 +0200 Subject: [PATCH 151/165] connect interface defaults to require permissions during signin --- .../UnitTests/AuthenticationTests.cs | 2 +- .../Authentication/EcosystemClient.cs | 15 ++++++++++--- .../LocalhostRedirectHandler.cs | 2 +- .../RedirectHandler/LocalhostServer.cs | 21 +++++++++++-------- .../Authentication/SequenceConnect.cs | 10 ++++----- .../EcosystemWallet/Wallet/SequenceWallet.cs | 2 +- 6 files changed, 32 insertions(+), 20 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs index de04e665..5eea8401 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs @@ -18,7 +18,7 @@ public void Disconnect() public async Task SignInWithGoogle() { var connect = new SequenceConnect(Ecosystem); - await connect.SignInWithGoogle(); + await connect.SignInWithGoogle(null); } [Test] diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs index b472ba14..28c73c70 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs @@ -25,11 +25,11 @@ public EcosystemClient(EcosystemType ecosystem) /// /// Create an implicit- or explicit session based on a given set of permissions. /// - /// Leave it null to create an implicit session. Otherwise, we create an explicit session. + /// Leave it null to create an implicit session. Otherwise, we create an explicit session. /// Leave it null to create an implicit session. Otherwise, we create an explicit session. /// /// - public async Task CreateNewSession(SessionCreationType type, SessionPermissions permissions, string preferredLoginMethod, string email = null) + public async Task CreateNewSession(bool addExplicit, SessionPermissions permissions, string preferredLoginMethod, string email = null) { var chainId = string.Empty; if (permissions != null) @@ -39,7 +39,8 @@ public async Task CreateNewSession(SessionCreationType type, Se chainId = permissions.chainId.ToString(); } - + + var type = DetermineSessionCreationType(addExplicit, permissions); var sessionWallet = new EOAWallet(); var origin = RedirectOrigin.GetOriginString(); @@ -105,5 +106,13 @@ public async Task CreateNewSession(SessionCreationType type, Se return signers; } + + private SessionCreationType DetermineSessionCreationType(bool addExplicit, SessionPermissions permissions) + { + if (addExplicit) + return SessionCreationType.AddExplicit; + + return permissions == null ? SessionCreationType.IncludeImplicit : SessionCreationType.CreateNewSession; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs index 912e8646..a26e7ec6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs @@ -25,7 +25,7 @@ internal class LocalhostRedirectHandler : RedirectHandler var id = queryString["id"]; if (id != Id) - throw new Exception("Incorrect request id"); + throw new Exception($"Incoming request id '{id}' does not match id '{Id}'"); if (queryString["error"] != null) throw new Exception($"Error during request: {queryString["error"]}"); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostServer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostServer.cs index 71b69f7d..84975e07 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostServer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostServer.cs @@ -26,22 +26,25 @@ public async Task Run(string url) _listener.Start(); } - var result = await _listener.GetContextAsync(); + + HttpListenerContext context = null; + while (context == null || !context.Request.RawUrl.Contains("?id")) + context = await _listener.GetContextAsync(); var responseString = "{}"; var buffer = Encoding.UTF8.GetBytes(responseString); - result.Response.StatusCode = 200; - result.Response.ContentType = "application/json"; - result.Response.ContentLength64 = buffer.Length; - result.Response.KeepAlive = true; + context.Response.StatusCode = 200; + context.Response.ContentType = "application/json"; + context.Response.ContentLength64 = buffer.Length; + context.Response.KeepAlive = true; - await result.Response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + await context.Response.OutputStream.WriteAsync(buffer, 0, buffer.Length); - result.Response.OutputStream.Close(); - result.Response.Close(); + context.Response.OutputStream.Close(); + context.Response.Close(); - return result.Request.QueryString; + return context.Request.QueryString; } catch (System.Exception e) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index ed97fb08..3fbd828f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -13,17 +13,17 @@ public SequenceConnect(EcosystemType ecosystem) _client = new EcosystemClient(ecosystem); } - public async Task SignInWithEmail(string email, IPermissions permissions = null) + public async Task SignInWithEmail(string email, IPermissions permissions) { return await SignIn(permissions, "email", email); } - public async Task SignInWithGoogle(IPermissions permissions = null) + public async Task SignInWithGoogle(IPermissions permissions) { return await SignIn(permissions, "google", null); } - public async Task SignInWithApple(IPermissions permissions = null) + public async Task SignInWithApple(IPermissions permissions) { return await SignIn(permissions, "apple", null); } @@ -34,14 +34,14 @@ public async Task SignInWithPasskey(IPermissions permissions) return await SignIn(permissions, "passkey", null); } - public async Task SignInWithMnemonic(IPermissions permissions = null) + public async Task SignInWithMnemonic(IPermissions permissions) { return await SignIn(permissions, "mnemonic", null); } private async Task SignIn(IPermissions permissions, string preferredLoginMethod, string email) { - var signers = await _client.CreateNewSession(SessionCreationType.CreateNewSession, permissions?.GetPermissions(), preferredLoginMethod, email); + var signers = await _client.CreateNewSession(false, permissions?.GetPermissions(), preferredLoginMethod, email); return new SequenceWallet(signers); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs index 2c15779f..df03a928 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs @@ -55,7 +55,7 @@ public async Task AddSession(IPermissions permissions) var ecosystem = _sessionSigners[0].Ecosystem; var client = new EcosystemClient(ecosystem); - var sessionSigners = await client.CreateNewSession(SessionCreationType.AddExplicit, + var sessionSigners = await client.CreateNewSession(true, permissions.GetPermissions(), string.Empty); foreach (var sessionSigner in sessionSigners) From f9dc54add6e7a54a2db93da5d4db8cd44929ac90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 4 Sep 2025 08:57:15 +0200 Subject: [PATCH 152/165] added request to send transaction via wallet app --- .../Sequence/Samples~/Demo V3/DemoV3.unity | 3 ++ .../EcosystemWallet/TransactionButton.cs | 10 ++++- .../Authentication/EcosystemClient.cs | 43 +++++++++++-------- .../Requests/TransactionRequest.cs | 25 +++++++++++ .../Requests/TransactionRequest.cs.meta | 3 ++ .../EcosystemWallet/Wallet/IWallet.cs | 8 ++++ .../EcosystemWallet/Wallet/SequenceWallet.cs | 30 ++++++++++++- .../EcosystemWallet/Wallet/SignerService.cs | 9 +++- 8 files changed, 109 insertions(+), 22 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/TransactionRequest.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/TransactionRequest.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index 4511bdab..cd4b3c79 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -4059,6 +4059,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _chain: 10 + _allowTransactionThroughEcosystem: 0 _useFeeOptions: 1 _feeOptionAddress: - 0x7F5c764cBc14f9669B88837ca1490cCa17c31607 @@ -7556,6 +7557,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _chain: 421614 + _allowTransactionThroughEcosystem: 1 _useFeeOptions: 0 _feeOptionAddress: [] _transaction: @@ -13158,6 +13160,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _chain: 421614 + _allowTransactionThroughEcosystem: 0 _useFeeOptions: 0 _feeOptionAddress: [] _transaction: diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs index fbbe04a6..4c481cd5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs @@ -34,6 +34,7 @@ private enum State [Header("Transactions")] [SerializeField] private Chain _chain = Chain.TestnetArbitrumSepolia; + [SerializeField] private bool _allowTransactionThroughEcosystem; [SerializeField] private bool _useFeeOptions; [SerializeField] private string[] _feeOptionAddress; [SerializeField] private SerializableTransaction _transaction; @@ -118,7 +119,12 @@ private async Task TrySendTransaction(ITransaction transaction, FeeOption feeOpt { try { - var txnHash = await _wallet.SendTransaction(_chain, transaction, feeOption); + string txnHash; + if (_allowTransactionThroughEcosystem) + txnHash = await _wallet.SendTransactionThroughEcosystem(_chain, transaction); + else + txnHash = await _wallet.SendTransaction(_chain, transaction, feeOption); + _transactionResult.Show(_chain, txnHash); } catch (Exception e) @@ -140,6 +146,8 @@ private async Task CheckSupportedTransaction() try { var supported = await _wallet.SupportsTransaction(_chain, _transaction.BuildTransaction()); + supported |= _allowTransactionThroughEcosystem; + SetState(supported ? State.Transaction : State.Session); } catch (Exception e) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs index 28c73c70..f6efbb49 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs @@ -57,16 +57,9 @@ public async Task CreateNewSession(bool addExplicit, SessionPer }; var action = type == SessionCreationType.AddExplicit ? "addExplicitSession" : "createNewSession"; - var ecosystemUrl = EcosystemBindings.GetUrl(_ecosystem); - var url = $"{ecosystemUrl}/request/connect"; - - var handler = RedirectFactory.CreateHandler(); - handler.SetRedirectUrl(origin); - var response = await handler.WaitForResponse(url, action, payload); - if (!response.Result) - throw new Exception("Error during request"); - + var response = await SendRequest("connect", action, payload); + var isImplicitWithPermissions = includeImplicitSession && permissions != null; var credentialsLen = isImplicitWithPermissions ? 2 : 1; var credentials = new SessionCredentials[credentialsLen]; @@ -74,26 +67,26 @@ public async Task CreateNewSession(bool addExplicit, SessionPer credentials[0] = new SessionCredentials( !includeImplicitSession, sessionWallet.GetPrivateKeyAsHex(), - response.Data.walletAddress, - response.Data.attestation, - response.Data.signature, + response.walletAddress, + response.attestation, + response.signature, (int)_ecosystem, chainId, - response.Data.loginMethod, - response.Data.email); + response.loginMethod, + response.email); if (isImplicitWithPermissions) { credentials[1] = new SessionCredentials( true, sessionWallet.GetPrivateKeyAsHex(), - response.Data.walletAddress, + response.walletAddress, null, null, (int)_ecosystem, chainId, - response.Data.loginMethod, - response.Data.email); + response.loginMethod, + response.email); } var signers = new SessionSigner[credentials.Length]; @@ -107,6 +100,22 @@ public async Task CreateNewSession(bool addExplicit, SessionPer return signers; } + public async Task SendRequest(string path, string action, TArgs args) + { + var origin = RedirectOrigin.GetOriginString(); + var ecosystemUrl = EcosystemBindings.GetUrl(_ecosystem); + var url = $"{ecosystemUrl}/request/{path}"; + + var handler = RedirectFactory.CreateHandler(); + handler.SetRedirectUrl(origin); + + var response = await handler.WaitForResponse(url, action, args); + if (!response.Result) + throw new Exception("Error during request"); + + return response.Data; + } + private SessionCreationType DetermineSessionCreationType(bool addExplicit, SessionPermissions permissions) { if (addExplicit) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/TransactionRequest.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/TransactionRequest.cs new file mode 100644 index 00000000..6939a604 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/TransactionRequest.cs @@ -0,0 +1,25 @@ +using System.Numerics; + +namespace Sequence.EcosystemWallet +{ + public struct SendWalletTransactionArgs + { + public BigInteger chainId; + public Address address; + public TransactionRequest transactionRequest; + } + + public struct TransactionRequest + { + public Address to; + public BigInteger value; + public BigInteger gasLimit; + public string data; + } + + public struct SendWalletTransactionResponse + { + public string transactionHash; + public string walletAddress; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/TransactionRequest.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/TransactionRequest.cs.meta new file mode 100644 index 00000000..2dad52b8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/TransactionRequest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: dbcc082827d948e5b8fd84b9e94f3a78 +timeCreated: 1756966964 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs index c2fbc00a..f79deed9 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs @@ -70,6 +70,14 @@ public interface IWallet /// /// Task SendTransaction(Chain chain, ITransaction[] transactions, FeeOption feeOption = null); + + /// + /// Send a transaction by opening the ecosystems wallet app. + /// + /// + /// + /// + Task SendTransactionThroughEcosystem(Chain chain, ITransaction transaction); /// /// Checks whether this wallet is capable of signing the given calls. diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs index df03a928..10558a2d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Numerics; using System.Threading.Tasks; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives.Common; @@ -139,10 +140,10 @@ public async Task SendTransaction(Chain chain, ITransaction[] transactio calls = calls.Unshift(feeOptionCall); } - + var txnService = new TransactionService(_sessionSigners, _state); var transactionData = await txnService.SignAndBuild(chain, calls, true); - + var relayer = new SequenceRelayer(chain); var hash = await relayer.Relay(transactionData.To, transactionData.Data); @@ -188,6 +189,31 @@ public async Task SupportsTransaction(Chain chain, ITransaction[] transact } } + public async Task SendTransactionThroughEcosystem(Chain chain, ITransaction transaction) + { + var chainId = BigInteger.Parse(ChainDictionaries.ChainIdOf[chain]); + var call = transaction.GetCall(); + + var args = new SendWalletTransactionArgs + { + chainId = chainId, + address = Address, + transactionRequest = new TransactionRequest + { + to = call.to, + value = call.value, + gasLimit = call.gasLimit, + data = call.data.ByteArrayToHexStringWithPrefix() + } + }; + + var client = new EcosystemClient(EcosystemType.Sequence); + var response = await client.SendRequest("transaction", + "sendWalletTransaction", args); + + return response.transactionHash; + } + private void AssertSessionSigners() { if (_sessionSigners.Length == 0) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs index dab5e3f4..c4ca107e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs @@ -7,6 +7,11 @@ namespace Sequence.EcosystemWallet { + public class SignerException : Exception + { + public SignerException(string message) : base(message) { } + } + internal class SignerService { private readonly SessionSigner[] _sessionSigners; @@ -33,12 +38,12 @@ public async Task FindSignersForCalls(Chain chain, Call[] calls var availableSigners = ArrayUtils.CombineArrays(validImplicitSigners, validExplicitSigners); if (availableSigners.Length == 0) - throw new Exception("no valid signers found"); + throw new SignerException("no valid signers found"); var supportedSignersForCalls = await FindSignerForEachCall(chain, availableSigners, calls); if (supportedSignersForCalls.Length != calls.Length) - throw new Exception("Unable to find a signer for one of the given calls."); + throw new SignerException("Unable to find a signer for one of the given calls."); return supportedSignersForCalls; } From 1f6c7a61225b788d1ad683ffbdcc237933c1f116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 4 Sep 2025 09:37:25 +0200 Subject: [PATCH 153/165] using wallet app url from SequenceConfig --- .../UnitTests/AuthenticationTests.cs | 3 +-- .../UnitTests/RawTransactionTests.cs | 2 -- .../SequenceEcosystemWalletWindow.cs | 5 +---- .../SequenceSDK/Config/SequenceConfig.cs | 12 ++++++++--- .../Authentication/EcosystemBindings.cs | 18 ----------------- .../Authentication/EcosystemBindings.cs.meta | 3 --- .../Authentication/EcosystemClient.cs | 20 ++++++++++++------- .../Authentication/EcosystemType.cs | 8 -------- .../Authentication/EcosystemType.cs.meta | 3 --- .../Authentication/SequenceConnect.cs | 7 +------ .../Storage/SessionCredentials.cs | 14 ++++++------- .../EcosystemWallet/Wallet/SequenceWallet.cs | 20 +++++-------------- .../EcosystemWallet/Wallet/SessionSigner.cs | 2 -- 13 files changed, 37 insertions(+), 80 deletions(-) delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs.meta delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs delete mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs index 5eea8401..dd7082fa 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs @@ -6,7 +6,6 @@ namespace Sequence.EcosystemWallet.UnitTests public class AuthenticationTests { private static readonly Chain Chain = Chain.TestnetArbitrumSepolia; - private static readonly EcosystemType Ecosystem = EcosystemType.Sequence; [Test] public void Disconnect() @@ -17,7 +16,7 @@ public void Disconnect() [Test] public async Task SignInWithGoogle() { - var connect = new SequenceConnect(Ecosystem); + var connect = new SequenceConnect(); await connect.SignInWithGoogle(null); } diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs index b80a42a3..bc489a02 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs @@ -10,8 +10,6 @@ namespace Sequence.EcosystemWallet.UnitTests { public class RawTransactionTests { - private static readonly EcosystemType Ecosystem = EcosystemType.Sequence; - private static readonly ITransaction[] ImplicitCalls = new [] { new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "implicitEmit()") diff --git a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs index c88df975..30f52a35 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -22,9 +22,6 @@ private enum ExplicitSessionType BasicRestrictive } - [Header("Config")] - [SerializeField] private EcosystemType _ecosystem; - [Header("Components")] [SerializeField] private Button _emailLoginButton; [SerializeField] private Button _emailContinueButton; @@ -49,7 +46,7 @@ private enum ExplicitSessionType private void Start() { - _connect = new SequenceConnect(_ecosystem); + _connect = new SequenceConnect(); _emailInput.onValueChanged.AddListener(VerifyEmailInput); Open(); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Config/SequenceConfig.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Config/SequenceConfig.cs index 6cbb8c14..179b7b86 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Config/SequenceConfig.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Config/SequenceConfig.cs @@ -11,6 +11,13 @@ namespace Sequence.Config [CreateAssetMenu(fileName = "SequenceConfig", menuName = "Sequence/SequenceConfig", order = 1)] public class SequenceConfig : ScriptableObject { + [Header("General Settings")] + public string BuilderAPIKey; + + [Header("Ecosystem Wallet")] + public string WalletAppUrl; + + [Header("Embedded Wallet")] [Header("Social Sign In Configuration - Standalone, Android & Web Platforms")] public string UrlScheme; public string GoogleClientId; @@ -26,13 +33,12 @@ public class SequenceConfig : ScriptableObject [Header("WaaS Configuration")] public string WaaSConfigKey; - [FormerlySerializedAs("EnableAccountOverride")] public bool EnableMultipleAccountsPerEmail = false; public string WaaSVersion { get; private set; } - [Header("Sequence SDK Configuration")] - public string BuilderAPIKey; + [Header("Sequence SDK Configuration")] public bool StoreSessionPrivateKeyInSecureStorage = false; public bool EditorStoreSessionPrivateKeyInSecureStorage = false; + [FormerlySerializedAs("EnableAccountOverride")] public bool EnableMultipleAccountsPerEmail = false; private static Dictionary _configs = new Dictionary(); public static SequenceConfig GetConfig(SequenceService sequenceService = SequenceService.Unspecified) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs deleted file mode 100644 index b553d8ae..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Collections.Generic; - -namespace Sequence.EcosystemWallet -{ - internal static class EcosystemBindings - { - private static Dictionary UrlBindings = new () - { - { EcosystemType.Dev, "http://localhost:5173/" }, - { EcosystemType.Sequence, "https://v3.sequence-dev.app" } - }; - - public static string GetUrl(EcosystemType ecosystem) - { - return UrlBindings[ecosystem]; - } - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs.meta deleted file mode 100644 index 1dfdb795..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemBindings.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 29d630bf49cb45be8a2ea0f6f988902a -timeCreated: 1753427240 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs index f6efbb49..1afd81df 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs @@ -1,7 +1,9 @@ using System; using System.Threading.Tasks; +using Sequence.Config; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; using Sequence.Wallet; namespace Sequence.EcosystemWallet @@ -15,11 +17,12 @@ public enum SessionCreationType internal class EcosystemClient { - private readonly EcosystemType _ecosystem; + private readonly string _walletUrl; - public EcosystemClient(EcosystemType ecosystem) + public EcosystemClient() { - _ecosystem = ecosystem; + _walletUrl = SequenceConfig.GetConfig().WalletAppUrl; + _walletUrl = _walletUrl.RemoveTrailingSlash(); } /// @@ -70,7 +73,7 @@ public async Task CreateNewSession(bool addExplicit, SessionPer response.walletAddress, response.attestation, response.signature, - (int)_ecosystem, + _walletUrl, chainId, response.loginMethod, response.email); @@ -83,7 +86,7 @@ public async Task CreateNewSession(bool addExplicit, SessionPer response.walletAddress, null, null, - (int)_ecosystem, + _walletUrl, chainId, response.loginMethod, response.email); @@ -103,8 +106,11 @@ public async Task CreateNewSession(bool addExplicit, SessionPer public async Task SendRequest(string path, string action, TArgs args) { var origin = RedirectOrigin.GetOriginString(); - var ecosystemUrl = EcosystemBindings.GetUrl(_ecosystem); - var url = $"{ecosystemUrl}/request/{path}"; + + var walletUrl = SequenceConfig.GetConfig().WalletAppUrl; + walletUrl = walletUrl.RemoveTrailingSlash(); + + var url = $"{walletUrl}/request/{path}"; var handler = RedirectFactory.CreateHandler(); handler.SetRedirectUrl(origin); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs deleted file mode 100644 index 5a3f047a..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Sequence.EcosystemWallet -{ - public enum EcosystemType - { - Dev = 0, - Sequence = 1 - } -} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs.meta deleted file mode 100644 index f9c5706f..00000000 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemType.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 3135174bc3c7451eadd5356a1e0b206c -timeCreated: 1753427200 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs index 3fbd828f..2806de96 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -6,12 +6,7 @@ namespace Sequence.EcosystemWallet { public class SequenceConnect : IConnect { - private readonly EcosystemClient _client; - - public SequenceConnect(EcosystemType ecosystem) - { - _client = new EcosystemClient(ecosystem); - } + private readonly EcosystemClient _client = new(); public async Task SignInWithEmail(string email, IPermissions permissions) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs index 23dd2363..e5010fb7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs @@ -17,20 +17,20 @@ internal class SessionCredentials public Address sessionAddress; public Attestation attestation; public RSY signature; - public int ecosystemId; + public string walletUrl; public string chainId; public string loginMethod; public string email; public SessionCredentials(bool isExplicit, string privateKey, Address address, Attestation attestation, RSY signature, - int ecosystemId, string chainId, string loginMethod, string email) + string walletUrl, string chainId, string loginMethod, string email) { this.isExplicit = isExplicit; this.privateKey = privateKey; this.address = address; this.attestation = attestation; this.signature = signature; - this.ecosystemId = ecosystemId; + this.walletUrl = walletUrl; this.chainId = chainId; this.loginMethod = loginMethod; this.email = email; @@ -55,8 +55,8 @@ public override void WriteJson(JsonWriter writer, SessionCredentials value, Json writer.WritePropertyName("address"); serializer.Serialize(writer, value.address); - writer.WritePropertyName("ecosystemId"); - writer.WriteValue(value.ecosystemId); + writer.WritePropertyName("walletUrl"); + writer.WriteValue(value.walletUrl); writer.WritePropertyName("chainId"); writer.WriteValue(value.chainId.ToString()); @@ -98,12 +98,12 @@ public override SessionCredentials ReadJson(JsonReader reader, Type objectType, var attestation = obj["attestation"]?.ToObject(serializer); var signature = obj["signature"]?.ToObject(serializer); - var ecosystemId = obj["ecosystemId"]?.ToObject() ?? -1; + var walletUrl = obj["walletUrl"]?.ToString(); var chainId = obj["chainId"]?.ToString(); var loginMethod = obj["loginMethod"]?.ToString(); var email = obj["email"]?.ToString(); - return new SessionCredentials(isExplicit, privateKey, address, attestation, signature, ecosystemId, chainId, loginMethod, email); + return new SessionCredentials(isExplicit, privateKey, address, attestation, signature, walletUrl, chainId, loginMethod, email); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs index 10558a2d..9e6112ce 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Numerics; using System.Threading.Tasks; +using Sequence.Config; using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Relayer; @@ -53,8 +54,7 @@ public async Task AddSession(IPermissions permissions) AssertSessionSigners(); Assert.IsNotNull(permissions); - var ecosystem = _sessionSigners[0].Ecosystem; - var client = new EcosystemClient(ecosystem); + var client = new EcosystemClient(); var sessionSigners = await client.CreateNewSession(true, permissions.GetPermissions(), string.Empty); @@ -80,19 +80,9 @@ public async Task SignMessage(Chain chain, string message) chainId = new BigInt((int)chain), message = message }; - - var ecosystem = _sessionSigners[0].Ecosystem; - var url = $"{EcosystemBindings.GetUrl(ecosystem)}/request/sign"; - - var handler = RedirectFactory.CreateHandler(); - handler.SetRedirectUrl(RedirectOrigin.GetOriginString()); - - var response = await handler.WaitForResponse(url, "signMessage", args); - - if (!response.Result) - throw new Exception("Failed to sign message"); - return response.Data; + var client = new EcosystemClient(); + return await client.SendRequest("sign", "signMessage", args); } public async Task GetFeeOption(Chain chain, ITransaction transaction) @@ -207,7 +197,7 @@ public async Task SendTransactionThroughEcosystem(Chain chain, ITransact } }; - var client = new EcosystemClient(EcosystemType.Sequence); + var client = new EcosystemClient(); var response = await client.SendRequest("transaction", "sendWalletTransaction", args); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs index 5c07b18b..ad1556be 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs @@ -23,7 +23,6 @@ public struct CallContractData public Address ParentAddress { get; } public Address Address { get; } public Chain Chain { get; } - public EcosystemType Ecosystem { get; } public bool IsExplicit { get; } public Address IdentitySigner @@ -50,7 +49,6 @@ internal SessionSigner(SessionCredentials credentials) ParentAddress = credentials.address; Address = new EOAWallet(credentials.privateKey).GetAddress(); Chain = string.IsNullOrEmpty(credentials.chainId) ? Chain.None : ChainDictionaries.ChainById[credentials.chainId]; - Ecosystem = (EcosystemType)credentials.ecosystemId; IsExplicit = credentials.isExplicit; } From 311c19cdb3872fbf62d665cd5e0575c9bd1b4c62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 25 Sep 2025 13:00:18 +0200 Subject: [PATCH 154/165] updates to new create session payload args --- .../IntegrationTests/SessionsTest.cs | 2 +- .../Sequence/Samples~/Demo V3/DemoV3.unity | 3 +-- .../Authentication/EcosystemClient.cs | 24 ++++++++++--------- .../Authentication/Requests/Connect.cs | 5 ++-- .../Storage/SessionCredentials.cs | 16 ++++++------- .../Permissions/ContractPermission.cs | 1 - .../Permissions/Permissions.cs | 1 - .../Primitives/Config/Topology.cs | 5 ++++ .../Permission/SessionPermissions.cs | 10 ++++---- .../Primitives/Sessions/SessionsTopology.cs | 12 +++++----- .../EcosystemWallet/Wallet/WalletState.cs | 2 +- .../Utils/Networking/HttpClient.cs | 2 +- .../Utils/UnityWebRequestExtensions.cs | 2 +- Packages/Sequence-Unity/package.json | 2 +- 14 files changed, 45 insertions(+), 42 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs index 50ac9450..f2f57499 100644 --- a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs @@ -64,7 +64,7 @@ public Task SessionExplicitAdd(Dictionary parameters) var sessionTopology = SessionsTopology.FromJson(sessionTopologyJson); var existingPermission = sessionTopology.FindLeaf(leaf => - leaf.permissions.signer.Equals(explicitSession.signer)); + leaf.permissions.sessionAddress.Equals(explicitSession.sessionAddress)); if (existingPermission != null) throw new Exception("Session already exists."); diff --git a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity index cd4b3c79..74c96d50 100644 --- a/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -7557,7 +7557,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _chain: 421614 - _allowTransactionThroughEcosystem: 1 + _allowTransactionThroughEcosystem: 0 _useFeeOptions: 0 _feeOptionAddress: [] _transaction: @@ -16682,7 +16682,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a76f3494846944de2a0d1694eeb60856, type: 3} m_Name: m_EditorClassIdentifier: - _ecosystem: 1 _emailLoginButton: {fileID: 1459061464521247473} _emailContinueButton: {fileID: 2325936309338030303} _emailInput: {fileID: 1181566138228532167} diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs index 1afd81df..3880f82c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs @@ -29,41 +29,43 @@ public EcosystemClient() /// Create an implicit- or explicit session based on a given set of permissions. /// /// Leave it null to create an implicit session. Otherwise, we create an explicit session. - /// Leave it null to create an implicit session. Otherwise, we create an explicit session. + /// Leave it null to create an implicit session. Otherwise, we create an explicit session. /// /// - public async Task CreateNewSession(bool addExplicit, SessionPermissions permissions, string preferredLoginMethod, string email = null) + public async Task CreateNewSession(bool addExplicit, SessionPermissions session, string preferredLoginMethod, string email = null) { var chainId = string.Empty; - if (permissions != null) + if (session != null) { - if (permissions.chainId <= 0) + if (session.chainId <= 0) throw new Exception("Invalid chainId."); - chainId = permissions.chainId.ToString(); + chainId = session.chainId.ToString(); } - var type = DetermineSessionCreationType(addExplicit, permissions); + var type = DetermineSessionCreationType(addExplicit, session); var sessionWallet = new EOAWallet(); + + if (session != null) + session.sessionAddress = sessionWallet.GetAddress(); var origin = RedirectOrigin.GetOriginString(); var includeImplicitSession = type == SessionCreationType.IncludeImplicit; var payload = new ConnectArgs { - sessionAddress = sessionWallet.GetAddress(), preferredLoginMethod = preferredLoginMethod, email = email, origin = origin, includeImplicitSession = includeImplicitSession, - permissions = permissions + session = session }; var action = type == SessionCreationType.AddExplicit ? "addExplicitSession" : "createNewSession"; var response = await SendRequest("connect", action, payload); - var isImplicitWithPermissions = includeImplicitSession && permissions != null; + var isImplicitWithPermissions = includeImplicitSession && session != null; var credentialsLen = isImplicitWithPermissions ? 2 : 1; var credentials = new SessionCredentials[credentialsLen]; @@ -76,7 +78,7 @@ public async Task CreateNewSession(bool addExplicit, SessionPer _walletUrl, chainId, response.loginMethod, - response.email); + response.userEmail); if (isImplicitWithPermissions) { @@ -89,7 +91,7 @@ public async Task CreateNewSession(bool addExplicit, SessionPer _walletUrl, chainId, response.loginMethod, - response.email); + response.userEmail); } var signers = new SessionSigner[credentials.Length]; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs index 80c5015c..8f3c2bc1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs @@ -4,18 +4,17 @@ namespace Sequence.EcosystemWallet { public struct ConnectArgs { - public Address sessionAddress; public string preferredLoginMethod; public string email; public string origin; public bool includeImplicitSession; - public SessionPermissions permissions; + public SessionPermissions session; } public struct ConnectResponse { public Address walletAddress; - public string email; + public string userEmail; public string loginMethod; public Attestation attestation; public RSY signature; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs index e5010fb7..da463a43 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs @@ -20,10 +20,10 @@ internal class SessionCredentials public string walletUrl; public string chainId; public string loginMethod; - public string email; + public string userEmail; public SessionCredentials(bool isExplicit, string privateKey, Address address, Attestation attestation, RSY signature, - string walletUrl, string chainId, string loginMethod, string email) + string walletUrl, string chainId, string loginMethod, string userEmail) { this.isExplicit = isExplicit; this.privateKey = privateKey; @@ -33,7 +33,7 @@ public SessionCredentials(bool isExplicit, string privateKey, Address address, A this.walletUrl = walletUrl; this.chainId = chainId; this.loginMethod = loginMethod; - this.email = email; + this.userEmail = userEmail; sessionAddress = new EOAWallet(privateKey).GetAddress(); } @@ -79,10 +79,10 @@ public override void WriteJson(JsonWriter writer, SessionCredentials value, Json serializer.Serialize(writer, value.loginMethod); } - if (value.email != null) + if (value.userEmail != null) { - writer.WritePropertyName("email"); - serializer.Serialize(writer, value.email); + writer.WritePropertyName("userEmail"); + serializer.Serialize(writer, value.userEmail); } writer.WriteEndObject(); @@ -101,9 +101,9 @@ public override SessionCredentials ReadJson(JsonReader reader, Type objectType, var walletUrl = obj["walletUrl"]?.ToString(); var chainId = obj["chainId"]?.ToString(); var loginMethod = obj["loginMethod"]?.ToString(); - var email = obj["email"]?.ToString(); + var userEmail = obj["userEmail"]?.ToString(); - return new SessionCredentials(isExplicit, privateKey, address, attestation, signature, walletUrl, chainId, loginMethod, email); + return new SessionCredentials(isExplicit, privateKey, address, attestation, signature, walletUrl, chainId, loginMethod, userEmail); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs index 7d63209d..12929543 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs @@ -42,7 +42,6 @@ public SessionPermissions GetPermissions() chainId = _chain.IsActive() ? _chain.AsBigInteger() : 0, deadline = _deadline, valueLimit = _valueLimit, - signer = new Address("0x1234567890123456789012345678901234567890"), permissions = permissions }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs index 93ed7cff..2db27deb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs @@ -39,7 +39,6 @@ public SessionPermissions GetPermissions() chainId = _chain.AsBigInteger(), deadline = deadline, valueLimit = valueLimit, - signer = new Address("0x1234567890123456789012345678901234567890"), permissions = allPermissions.ToArray() }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index 0a3207ac..d08e41cf 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -81,6 +81,11 @@ public Leaf FindSignerLeaf(Address address) if (IsLeaf()) { + if (Leaf is NestedLeaf nestedLeaf) + { + return nestedLeaf.tree.FindSignerLeaf(address); + } + if (Leaf is SignerLeaf signerLeaf) { if (signerLeaf.address.Equals(address)) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs index 826c4ad9..217881cb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs @@ -11,8 +11,8 @@ namespace Sequence.EcosystemWallet.Primitives [Serializable] public class SessionPermissions { + public Address sessionAddress; public BigInteger chainId; - public Address signer; public BigInteger valueLimit; public BigInteger deadline; public Permission[] permissions; @@ -22,7 +22,7 @@ public object ToJson() return new { chainId = chainId, - signer = signer, + sessionAddress = sessionAddress, valueLimit = valueLimit, deadline = deadline, permissions = permissions.Select(permission => permission.ToJson()).ToArray() @@ -36,7 +36,7 @@ public byte[] Encode() } List result = new(); - result.AddRange(signer.ToString().HexStringToByteArray().PadLeft(20)); + result.AddRange(sessionAddress.ToString().HexStringToByteArray().PadLeft(20)); result.AddRange(chainId.ByteArrayFromNumber().PadLeft(32)); result.AddRange(valueLimit.ByteArrayFromNumber(32)); result.AddRange(deadline.ByteArrayFromNumber(8)); @@ -71,7 +71,7 @@ public static SessionPermissions Decode(byte[] data) } return new SessionPermissions { - signer = signer, + sessionAddress = signer, chainId = chainId, valueLimit = valueLimit, deadline = deadline, @@ -84,7 +84,7 @@ public static SessionPermissions FromJson(string json) var data = JsonConvert.DeserializeObject>(json); return new SessionPermissions { - signer = new Address((string)data["signer"]), + sessionAddress = new Address((string)data["signer"]), valueLimit = BigInteger.Parse((string)data["valueLimit"]), deadline = BigInteger.Parse((string)data["deadline"]), permissions = JsonConvert.DeserializeObject(data["permissions"].ToString()) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index 4b781354..97857f17 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -80,7 +80,7 @@ public SessionsTopology Minimise(Address[] explicitSigners, Address[] implicitSi if (Leaf is PermissionLeaf permissionLeaf) { - if (explicitSigners.Contains(permissionLeaf.permissions.signer)) + if (explicitSigners.Contains(permissionLeaf.permissions.sessionAddress)) return this; return new SessionNodeLeaf @@ -117,7 +117,7 @@ public bool IsComplete() public SessionsTopology AddExplicitSession(SessionPermissions session) { var existingPermission = this.FindLeaf(leaf => - leaf.permissions.signer.Equals(session.signer)); + leaf.permissions.sessionAddress.Equals(session.sessionAddress)); if (existingPermission != null) throw new Exception("Session already exists."); @@ -132,7 +132,7 @@ public SessionsTopology AddExplicitSession(SessionPermissions session) public SessionsTopology RemoveExplicitSession(Address address) { if (this.IsLeaf() && Leaf is PermissionLeaf permissionLeaf) - return permissionLeaf.permissions.signer.Equals(address) ? null : this; + return permissionLeaf.permissions.sessionAddress.Equals(address) ? null : this; if (this.IsBranch()) { @@ -181,7 +181,7 @@ public SessionPermissions GetPermissions(Address signer) return null; } - if (this.IsLeaf() && Leaf is PermissionLeaf permissionLeaf && permissionLeaf.permissions.signer.Equals(signer)) + if (this.IsLeaf() && Leaf is PermissionLeaf permissionLeaf && permissionLeaf.permissions.sessionAddress.Equals(signer)) return permissionLeaf.permissions; return null; @@ -195,7 +195,7 @@ public Address[] GetExplicitSigners() public Address[] GetExplicitSigners(Address[] current) { if (this.IsLeaf() && Leaf is PermissionLeaf permissionLeaf) - return current.AddToArray(permissionLeaf.permissions.signer); + return current.AddToArray(permissionLeaf.permissions.sessionAddress); if (this.IsBranch()) { @@ -335,7 +335,7 @@ public static SessionsTopology FromJson(string json) { permissions = new() { - signer = new Address((string)data["signer"]), + sessionAddress = new Address((string)data["sessionAddress"]), valueLimit = BigInteger.Parse((string)data["valueLimit"]), deadline = BigInteger.Parse((string)data["deadline"]), permissions = JsonConvert.DeserializeObject>(data["permissions"].ToString()) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs index 4d48569b..14100cda 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs @@ -45,7 +45,7 @@ public async Task Update(Chain chain) var config = await GetConfig(imageHash); - var sessionsManager = new Address("0x06aa3a8F781F2be39b888Ac8a639c754aEe9dA29"); + var sessionsManager = new Address("0x0000000000CC58810c33F3a0D78aA1Ed80FaDcD8"); var signerLeaf = config.topology.FindSignerLeaf(sessionsManager) as SapientSignerLeaf; SessionsImageHash = signerLeaf.imageHash; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs index 2f0e057b..ecc4f3be 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs @@ -51,7 +51,7 @@ public async Task SendPostRequest(string path, TArg var results = request.downloadHandler.data; var responseJson = Encoding.UTF8.GetString(results); - SequenceLog.Info($"<< {responseJson}"); + SequenceLog.Info($"<< {request.responseCode} {responseJson}"); return JsonConvert.DeserializeObject(responseJson, _serializerSettings); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UnityWebRequestExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UnityWebRequestExtensions.cs index 0538361c..9c336550 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UnityWebRequestExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UnityWebRequestExtensions.cs @@ -21,7 +21,7 @@ public static TaskAwaiter GetAwaiter(this UnityWebRequestAsyncOperation webReqOp webReqOp.completed += obj => { { - if (webReqOp.webRequest.responseCode != 200) + if (webReqOp.webRequest.responseCode >= 300) { tcs.SetException(new FileLoadException(webReqOp.webRequest.error)); } diff --git a/Packages/Sequence-Unity/package.json b/Packages/Sequence-Unity/package.json index e177015f..9e341a06 100644 --- a/Packages/Sequence-Unity/package.json +++ b/Packages/Sequence-Unity/package.json @@ -1,6 +1,6 @@ { "name": "xyz.0xsequence.waas-unity", - "version": "5.0.0", + "version": "5.0.2", "displayName": "Sequence Embedded Wallet SDK", "description": "A Unity SDK for Sequence APIs", "unity": "2021.3", From beb0bff9d1b6700870b9005c722c919732e8ae00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 25 Sep 2025 13:33:15 +0200 Subject: [PATCH 155/165] added rc3 extension --- .../Authentication/EcosystemClient.cs | 11 +++++-- .../Authentication/Requests/Connect.cs | 29 ++++++++++++++++++- .../EcosystemWallet/Wallet/Extensions.cs | 15 ++++++++++ .../EcosystemWallet/Wallet/Extensions.cs.meta | 3 ++ .../Wallet/SignatureService.cs | 2 +- .../EcosystemWallet/Wallet/WalletState.cs | 5 ++-- 6 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs index 3880f82c..503693b8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs @@ -45,9 +45,14 @@ public async Task CreateNewSession(bool addExplicit, SessionPer var type = DetermineSessionCreationType(addExplicit, session); var sessionWallet = new EOAWallet(); - + var sessionAddress = sessionWallet.GetAddress(); + if (session != null) - session.sessionAddress = sessionWallet.GetAddress(); + session.sessionAddress = sessionAddress; + + var sessionArgs = session == null ? + new SessionArgs(sessionAddress) : + new ExplicitSessionArgs(session); var origin = RedirectOrigin.GetOriginString(); var includeImplicitSession = type == SessionCreationType.IncludeImplicit; @@ -58,7 +63,7 @@ public async Task CreateNewSession(bool addExplicit, SessionPer email = email, origin = origin, includeImplicitSession = includeImplicitSession, - session = session + session = sessionArgs }; var action = type == SessionCreationType.AddExplicit ? "addExplicitSession" : "createNewSession"; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs index 8f3c2bc1..07b73ecd 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs @@ -1,3 +1,4 @@ +using System.Numerics; using Sequence.EcosystemWallet.Primitives; namespace Sequence.EcosystemWallet @@ -8,7 +9,7 @@ public struct ConnectArgs public string email; public string origin; public bool includeImplicitSession; - public SessionPermissions session; + public SessionArgs session; } public struct ConnectResponse @@ -19,4 +20,30 @@ public struct ConnectResponse public Attestation attestation; public RSY signature; } + + public class SessionArgs + { + public Address sessionAddress; + + public SessionArgs(Address sessionAddress) + { + this.sessionAddress = sessionAddress; + } + } + + public class ExplicitSessionArgs : SessionArgs + { + public BigInteger chainId; + public BigInteger valueLimit; + public BigInteger deadline; + public Permission[] permissions; + + public ExplicitSessionArgs(SessionPermissions sessionPermissions) : base(sessionPermissions.sessionAddress) + { + chainId = sessionPermissions.chainId; + valueLimit = sessionPermissions.valueLimit; + deadline = sessionPermissions.deadline; + permissions = sessionPermissions.permissions; + } + } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs new file mode 100644 index 00000000..8e973a9d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs @@ -0,0 +1,15 @@ +namespace Sequence.EcosystemWallet +{ + public struct Extensions + { + public Address Sessions; + } + + public static class ExtensionsFactory + { + public static Extensions Rc3 = new Extensions + { + Sessions = new Address("0x0000000000CC58810c33F3a0D78aA1Ed80FaDcD8") + }; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs.meta new file mode 100644 index 00000000..8e9f025c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 451be1999ea94d08b1327c97789ac586 +timeCreated: 1758798900 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs index 5b8f61b3..7581b97a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs @@ -75,7 +75,7 @@ private async Task SignSapient(Chain chain, Envelo return new SignatureOfSapientSignerLeaf { curType = SignatureOfSapientSignerLeaf.Type.sapient, - address = new Address("0x06aa3a8F781F2be39b888Ac8a639c754aEe9dA29"), // Session manager address + address = ExtensionsFactory.Rc3.Sessions, data = sessionSignatures }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs index 14100cda..847494e1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs @@ -44,9 +44,8 @@ public async Task Update(Chain chain) var imageHash = configUpdates.updates.Length > 0 ? configUpdates.updates[^1].toImageHash : DeployHash; var config = await GetConfig(imageHash); - - var sessionsManager = new Address("0x0000000000CC58810c33F3a0D78aA1Ed80FaDcD8"); - var signerLeaf = config.topology.FindSignerLeaf(sessionsManager) as SapientSignerLeaf; + + var signerLeaf = config.topology.FindSignerLeaf(ExtensionsFactory.Rc3.Sessions) as SapientSignerLeaf; SessionsImageHash = signerLeaf.imageHash; var sessionsTopology = await GetSessionsTopology(SessionsImageHash); From 4d3276786115be8e06ea7f2db3230378e2c4008f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 26 Sep 2025 17:24:20 +0200 Subject: [PATCH 156/165] testing guard signer --- .../UnitTests/TypedDataToSignTests.cs | 2 +- .../Authentication/EcosystemClient.cs | 10 +- .../Authentication/Requests/Connect.cs | 13 ++ .../SequenceSDK/EcosystemWallet/Guard.meta | 3 + .../EcosystemWallet/Guard/GuardService.cs | 26 ++++ .../Guard/GuardService.cs.meta | 3 + .../EcosystemWallet/Guard/GuardSigner.cs | 138 ++++++++++++++++++ .../EcosystemWallet/Guard/GuardSigner.cs.meta | 3 + .../EcosystemWallet/Guard/GuardStorage.cs | 28 ++++ .../Guard/GuardStorage.cs.meta | 3 + .../EcosystemWallet/Guard/Requests.meta | 3 + .../Guard/Requests/SignWith.cs | 53 +++++++ .../Guard/Requests/SignWith.cs.meta | 3 + .../Primitives/Config/Topology.cs | 2 + .../Primitives/Payload/TypedDataToSign.cs | 8 +- .../Transactions/Envelope/Signature.cs | 3 +- .../EcosystemWallet/Wallet/Extensions.cs | 6 +- .../Wallet/SignatureService.cs | 11 +- .../EcosystemWallet/Wallet/WalletState.cs | 9 +- 19 files changed, 318 insertions(+), 9 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardService.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardService.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardStorage.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardStorage.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/Requests.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/Requests/SignWith.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/Requests/SignWith.cs.meta diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs index 25281e9f..1bebe82f 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs @@ -217,7 +217,7 @@ public void TestCreateFromCallsPayload() public void TestGetSignedPayload() { TypedDataToSign toSign = new TypedDataToSign(new Address("0x4caf9086ccf2e486f331Bde537A559d9Be7D2fc4"), - Chain.LocalChain, + (int)Chain.LocalChain, new Parented(_otherAddressArray, new ConfigUpdate("0x6810c263f45be5dc8e8e6ffd2ab9bd6f152412edb66111b6f56e39a42c694405"))); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs index 503693b8..5235d6e1 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs @@ -32,7 +32,8 @@ public EcosystemClient() /// Leave it null to create an implicit session. Otherwise, we create an explicit session. /// /// - public async Task CreateNewSession(bool addExplicit, SessionPermissions session, string preferredLoginMethod, string email = null) + public async Task CreateNewSession(bool addExplicit, SessionPermissions session, + string preferredLoginMethod, string email = null) { var chainId = string.Empty; if (session != null) @@ -73,11 +74,16 @@ public async Task CreateNewSession(bool addExplicit, SessionPer var isImplicitWithPermissions = includeImplicitSession && session != null; var credentialsLen = isImplicitWithPermissions ? 2 : 1; var credentials = new SessionCredentials[credentialsLen]; + + var walletAddress = response.walletAddress; + var guardConfig = response.guard; + if (guardConfig != null) + new GuardStorage().SaveConfig(walletAddress, guardConfig); credentials[0] = new SessionCredentials( !includeImplicitSession, sessionWallet.GetPrivateKeyAsHex(), - response.walletAddress, + walletAddress, response.attestation, response.signature, _walletUrl, diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs index 07b73ecd..9af3cd17 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs @@ -15,12 +15,25 @@ public struct ConnectArgs public struct ConnectResponse { public Address walletAddress; + public GuardConfig guard; public string userEmail; public string loginMethod; public Attestation attestation; public RSY signature; } + public class GuardConfig + { + public string url; + public ModuleAddresses moduleAddresses; + } + + public class ModuleAddresses + { + public bool isMap; + public string[][] data; + } + public class SessionArgs { public Address sessionAddress; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard.meta new file mode 100644 index 00000000..e0d28aa1 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8913dc91d7424986a0f10e19b2cec832 +timeCreated: 1758801396 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardService.cs new file mode 100644 index 00000000..91245d77 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardService.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet +{ + public class GuardService + { + private readonly HttpClient _client; + + public GuardService(string url) + { + _client = new HttpClient(url); + } + + public async Task SignWith(SignWithArgs args) + { + return await SendRequest("SignWith", args); + } + + private async Task SendRequest(string endpoint, TArgs args) + { + var path = $"rpc/Guard/{endpoint}"; + return await _client.SendPostRequest(path, args); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardService.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardService.cs.meta new file mode 100644 index 00000000..1d5b254f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardService.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c85437e9ecce48e88001d191cf459bc8 +timeCreated: 1758867355 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs new file mode 100644 index 00000000..7a6ab89a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs @@ -0,0 +1,138 @@ +using System; +using System.Numerics; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Sequence.EcosystemWallet.Envelope; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet +{ + public class GuardSigner + { + private readonly Address _address; + private readonly GuardConfig _config; + private readonly GuardService _service; + + public GuardSigner(Address address, GuardConfig config) + { + Debug.Log($"Guard config {JsonConvert.SerializeObject(config)}"); + _address = address; + _config = config; + _service = new GuardService(config.url); + } + + public async Task SignEnvelope(SignedEnvelope envelope) + { + var unparentedPayload = new Parented(Array.Empty
(), envelope.payload); + + var payloadType = ToGuardPayloadType(); + var payload = ToGuardPayload(envelope.chainId, unparentedPayload); + + var signatures = envelope.signatures; + var guardSignatures = new GuardSignatureArgs[signatures.Length]; + for (var i = 0; i < signatures.Length; i++) + guardSignatures[i] = ToGuardSignature(signatures[i]); + + var rsy = await SignPayload(envelope.wallet, envelope.chainId, payloadType, + payload.Digest, payload.Message, guardSignatures); + + return new Signature + { + address = _address, + signature = new SignatureOfSignerLeafHash + { + rsy = rsy + } + }; + } + + private async Task SignPayload(Address wallet, BigInteger chainId, GuardPayloadType payloadType, + byte[] digest, byte[] message, GuardSignatureArgs[] signatures) + { + var response = await _service.SignWith(new SignWithArgs + { + signer = _address, + request = new SignRequest + { + chainId = chainId, + msg = digest.ByteArrayToHexStringWithPrefix(), + wallet = wallet, + payloadType = payloadType, + payloadData = message.ByteArrayToHexStringWithPrefix(), + signatures = signatures + } + }); + + return RSY.FromString(response.sig); + } + + private GuardPayloadType ToGuardPayloadType() + { + return GuardPayloadType.Calls; + } + + private (byte[] Message, byte[] Digest) ToGuardPayload(BigInteger chainId, Parented payload) + { + var isImplicit = false; + if (isImplicit) + { + return ( + Message: null, + Digest: null); + } + + var typedData = new TypedDataToSign(_address, chainId, payload); + return ( + Message: JsonConvert.SerializeObject(typedData).ToByteArray(), + Digest: typedData.GetSignPayload()); + } + + private GuardSignatureArgs ToGuardSignature(EnvelopeSignature signature) + { + if (signature is SapientSignature sapientSignature) + { + return new GuardSignatureArgs + { + type = GuardSignatureType.Sapient, + address = sapientSignature.signature.address, + imageHash = sapientSignature.imageHash, + data = sapientSignature.signature.data.ByteArrayToHexStringWithPrefix() + }; + } + + if (signature is Signature { signature: SignatureOfSignerLeafErc1271 erc1271 }) + { + return new GuardSignatureArgs + { + type = GuardSignatureType.Erc1271, + address = erc1271.address, + data = erc1271.data.ByteArrayToHexStringWithPrefix() + }; + } + + if (signature is Signature { signature: SignatureOfSignerLeafEthSign ethSign } ethSignSig) + { + return new GuardSignatureArgs + { + type = GuardSignatureType.EthSign, + address = ethSignSig.address, + data = ethSign.rsy.Pack().ByteArrayToHexStringWithPrefix() + }; + } + + if (signature is Signature { signature: SignatureOfSignerLeafEthSign hash } hashSig) + { + return new GuardSignatureArgs + { + type = GuardSignatureType.Hash, + address = hashSig.address, + data = hash.rsy.Pack().ByteArrayToHexStringWithPrefix() + }; + } + + throw new System.Exception("Unknown signature type"); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs.meta new file mode 100644 index 00000000..ffd6058a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4a41e77e682942dfa71751de3b6ced0e +timeCreated: 1758801252 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardStorage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardStorage.cs new file mode 100644 index 00000000..adf16e6d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardStorage.cs @@ -0,0 +1,28 @@ +using Newtonsoft.Json; +using Sequence.Utils.SecureStorage; + +namespace Sequence.EcosystemWallet +{ + public class GuardStorage + { + private readonly ISecureStorage _storage = SecureStorageFactory.CreateSecureStorage(); + + public GuardConfig GetConfig(Address address) + { + var json = _storage.RetrieveString(BuildStorageKey(address)); + return string.IsNullOrEmpty(json) ? null : + JsonConvert.DeserializeObject(json); + } + + public void SaveConfig(Address address, GuardConfig config) + { + var json = JsonConvert.SerializeObject(config); + _storage.StoreString(BuildStorageKey(address), json); + } + + private string BuildStorageKey(Address address) + { + return $"sequence-guard-config-{address}"; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardStorage.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardStorage.cs.meta new file mode 100644 index 00000000..81dca932 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardStorage.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7b577ff6a71e4ac493289f9d2ee0278b +timeCreated: 1758885866 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/Requests.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/Requests.meta new file mode 100644 index 00000000..396f4a8d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/Requests.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8d1a77ecac1b4aa4bfc800a32a6500fd +timeCreated: 1758866724 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/Requests/SignWith.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/Requests/SignWith.cs new file mode 100644 index 00000000..ffe7467c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/Requests/SignWith.cs @@ -0,0 +1,53 @@ +using System.Numerics; +using Newtonsoft.Json; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet +{ + [JsonConverter(typeof(EnumConverter))] + public enum GuardPayloadType + { + Calls, + Message, + ConfigUpdate, + SessionImplicitAuthorize + } + + [JsonConverter(typeof(EnumConverter))] + public enum GuardSignatureType { + Hash, + Sapient, + EthSign, + Erc1271, + } + + public struct SignWithArgs + { + public Address signer; + public SignRequest request; + } + + public struct SignWithResponse + { + public string sig; + } + + public struct SignRequest + { + public BigInteger chainId; + public string msg; + public string auxData; + public string wallet; + public GuardPayloadType payloadType; + public string payloadData; + public GuardSignatureArgs[] signatures; + } + + public struct GuardSignatureArgs + { + public Address address; + public GuardSignatureType type; + public string imageHash; + public string data; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/Requests/SignWith.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/Requests/SignWith.cs.meta new file mode 100644 index 00000000..312900f6 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/Requests/SignWith.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ce4308af173c479aa4e5ba16c20ac705 +timeCreated: 1758866947 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs index d08e41cf..2dacdf4b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -4,6 +4,7 @@ using Newtonsoft.Json; using Sequence.ABI; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -90,6 +91,7 @@ public Leaf FindSignerLeaf(Address address) { if (signerLeaf.address.Equals(address)) { + Debug.Log($"return signer leaf {signerLeaf.address}"); return signerLeaf; } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs index a7054f29..4f46849c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Numerics; using System.Text; using Newtonsoft.Json; using Sequence.ABI; @@ -212,10 +213,13 @@ public TypedDataToSign(Domain domain, Dictionary types, str } } - public TypedDataToSign(Address wallet, Chain chain, Parented payload) + public TypedDataToSign(Address wallet, Chain chainId, Parented payload) : this(wallet, + BigInteger.Parse(ChainDictionaries.ChainIdOf[chainId]), payload) { } + + public TypedDataToSign(Address wallet, BigInteger chainId, Parented payload) { _payload = payload; - this.domain = new Domain("Sequence Wallet", "3", chain, wallet); + this.domain = new Domain("Sequence Wallet", "3", chainId, wallet); switch (payload.payload.type) { case PayloadType.Call: diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Signature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Signature.cs index 5a4b4d41..48ba51d0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Signature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Signature.cs @@ -4,9 +4,10 @@ namespace Sequence.EcosystemWallet.Envelope { public class Signature : EnvelopeSignature { + public override string type { get; } + public Address address; public SignatureOfSignerLeaf signature; - public override string type { get; } public override byte[] Encode(Leaf leaf) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs index 8e973a9d..cebda415 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs @@ -3,13 +3,17 @@ namespace Sequence.EcosystemWallet public struct Extensions { public Address Sessions; + public Address Guard; } public static class ExtensionsFactory { + public static Extensions Current => Rc3; + public static Extensions Rc3 = new Extensions { - Sessions = new Address("0x0000000000CC58810c33F3a0D78aA1Ed80FaDcD8") + Sessions = new Address("0x0000000000CC58810c33F3a0D78aA1Ed80FaDcD8"), + Guard = new Address("0x18002Fc09deF9A47437cc64e270843dE094f5984") }; } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs index 7581b97a..61654019 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs @@ -32,6 +32,15 @@ public async Task SignCalls(Chain chain, string imageHash, Envelop }; var signedEnvelope = envelope.ToSigned(sapientSignature); + + var guardConfig = new GuardStorage().GetConfig(envelope.wallet); + if (guardConfig != null) + { + var guardSigner = new GuardSigner(ExtensionsFactory.Current.Guard, guardConfig); + var guardSignature = await guardSigner.SignEnvelope(signedEnvelope); + signedEnvelope.signatures = signedEnvelope.signatures.AddToArray(guardSignature); + } + var rawSignature = SignatureHandler.EncodeSignature(signedEnvelope); rawSignature.suffix = configUpdates.Reverse().Select(u => @@ -75,7 +84,7 @@ private async Task SignSapient(Chain chain, Envelo return new SignatureOfSapientSignerLeaf { curType = SignatureOfSapientSignerLeaf.Type.sapient, - address = ExtensionsFactory.Rc3.Sessions, + address = ExtensionsFactory.Current.Sessions, data = sessionSignatures }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs index 847494e1..83c30d1a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs @@ -1,3 +1,4 @@ +using System; using System.Numerics; using System.Threading.Tasks; using Nethereum.ABI.FunctionEncoding; @@ -45,7 +46,13 @@ public async Task Update(Chain chain) var config = await GetConfig(imageHash); - var signerLeaf = config.topology.FindSignerLeaf(ExtensionsFactory.Rc3.Sessions) as SapientSignerLeaf; + Debug.Log($"Config {JsonConvert.SerializeObject(config)}"); + + var signerAddress = ExtensionsFactory.Current.Sessions; + var signerLeaf = config.topology.FindSignerLeaf(signerAddress) as SapientSignerLeaf; + if (signerLeaf == null) + throw new Exception($"Could not find signer {signerAddress}"); + SessionsImageHash = signerLeaf.imageHash; var sessionsTopology = await GetSessionsTopology(SessionsImageHash); From debc4baf025fc76d50b8b199b0cd03f6826a769e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 29 Sep 2025 13:06:04 +0200 Subject: [PATCH 157/165] guard signer uses attestation --- .../EcosystemWallet/Guard/GuardSigner.cs | 38 +++++++++--------- .../Primitives/Payload/Domain.cs | 40 +++++++++++++++++++ .../EcosystemWallet/Wallet/SessionSigner.cs | 1 + .../Wallet/SignatureService.cs | 22 ++++++---- .../EcosystemWallet/Wallet/WalletState.cs | 2 - 5 files changed, 73 insertions(+), 30 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs index 7a6ab89a..d2db4184 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs @@ -5,22 +5,19 @@ using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet { public class GuardSigner { - private readonly Address _address; - private readonly GuardConfig _config; + private readonly Address _guardSigner = ExtensionsFactory.Current.Guard; private readonly GuardService _service; + private readonly Attestation _attestation; - public GuardSigner(Address address, GuardConfig config) + public GuardSigner(GuardConfig config, Attestation attestation) { - Debug.Log($"Guard config {JsonConvert.SerializeObject(config)}"); - _address = address; - _config = config; _service = new GuardService(config.url); + _attestation = attestation; } public async Task SignEnvelope(SignedEnvelope envelope) @@ -28,7 +25,7 @@ public async Task SignEnvelope(SignedEnvelope envelope) var unparentedPayload = new Parented(Array.Empty
(), envelope.payload); var payloadType = ToGuardPayloadType(); - var payload = ToGuardPayload(envelope.chainId, unparentedPayload); + var payload = ToGuardPayload(envelope.wallet, envelope.chainId, unparentedPayload); var signatures = envelope.signatures; var guardSignatures = new GuardSignatureArgs[signatures.Length]; @@ -40,7 +37,7 @@ public async Task SignEnvelope(SignedEnvelope envelope) return new Signature { - address = _address, + address = _guardSigner, signature = new SignatureOfSignerLeafHash { rsy = rsy @@ -51,9 +48,9 @@ public async Task SignEnvelope(SignedEnvelope envelope) private async Task SignPayload(Address wallet, BigInteger chainId, GuardPayloadType payloadType, byte[] digest, byte[] message, GuardSignatureArgs[] signatures) { - var response = await _service.SignWith(new SignWithArgs + var args = new SignWithArgs { - signer = _address, + signer = _guardSigner, request = new SignRequest { chainId = chainId, @@ -63,9 +60,10 @@ private async Task SignPayload(Address wallet, BigInteger chainId, GuardPay payloadData = message.ByteArrayToHexStringWithPrefix(), signatures = signatures } - }); - - return RSY.FromString(response.sig); + }; + + var response = await _service.SignWith(args); + return RSY.UnpackFrom65(response.sig.HexStringToByteArray()); } private GuardPayloadType ToGuardPayloadType() @@ -73,17 +71,17 @@ private GuardPayloadType ToGuardPayloadType() return GuardPayloadType.Calls; } - private (byte[] Message, byte[] Digest) ToGuardPayload(BigInteger chainId, Parented payload) + private (byte[] Message, byte[] Digest) ToGuardPayload(Address wallet, BigInteger chainId, Parented payload) { - var isImplicit = false; - if (isImplicit) + if (_attestation != null) { return ( - Message: null, - Digest: null); + Message: JsonConvert.SerializeObject(_attestation.ToJson()).ToByteArray(), + Digest: _attestation.Encode()); } - var typedData = new TypedDataToSign(_address, chainId, payload); + var typedData = new TypedDataToSign(wallet, chainId, payload); + return ( Message: JsonConvert.SerializeObject(typedData).ToByteArray(), Digest: typedData.GetSignPayload()); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs index 13439e4d..97a6309c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs @@ -1,11 +1,15 @@ using System; using System.Numerics; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using Sequence.ABI; using Sequence.Utils; +using UnityEngine.Scripting; namespace Sequence.EcosystemWallet.Primitives { [Serializable] + [JsonConverter(typeof(DomainConverter))] public class Domain { public string name; @@ -98,4 +102,40 @@ public bool HasSalt() return salt?.Data != null && salt.Data.Length > 0; } } + + [Preserve] + internal class DomainConverter : JsonConverter + { + public override void WriteJson(JsonWriter writer, Domain value, JsonSerializer serializer) + { + var jsonObject = new JObject + { + ["name"] = value.name, + ["version"] = value.version, + ["chainId"] = ulong.Parse(value.chainId.ToString()), + ["verifyingContract"] = value.verifyingContract.ToString(), + }; + + if (value.salt != null) + { + jsonObject["salt"] = value.salt.Data.ByteArrayToHexStringWithPrefix(); + } + + jsonObject.WriteTo(writer); + } + + public override Domain ReadJson(JsonReader reader, Type objectType, Domain existingValue, bool hasExistingValue, + JsonSerializer serializer) + { + var jsonObject = JObject.Load(reader); + + BigInteger chainId = jsonObject["chainId"]?.Value() ?? 0; + string name = jsonObject["name"]?.Value(); + string version = jsonObject["version"]?.Value(); + Address verifyingContract = new Address(jsonObject["verifyingContract"]?.Value()); + string salt = new Address(jsonObject["salt"]?.Value()); + + return new Domain(name, version, chainId, verifyingContract, null); + } + } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs index ad1556be..67b8c05e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs @@ -24,6 +24,7 @@ public struct CallContractData public Address Address { get; } public Chain Chain { get; } public bool IsExplicit { get; } + public Attestation Attestation => _credentials.attestation; public Address IdentitySigner { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs index 61654019..e52bd559 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs @@ -2,11 +2,9 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Newtonsoft.Json; using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; -using UnityEngine; using ConfigUpdate = Sequence.EcosystemWallet.KeyMachine.Models.ConfigUpdate; namespace Sequence.EcosystemWallet @@ -15,6 +13,7 @@ internal class SignatureService { private readonly SessionsTopology _sessions; private readonly SignerService _signerService; + private SessionSigner[] _currentSigners; public SignatureService(SessionSigner[] sessionSigners, SessionsTopology sessions) { @@ -36,7 +35,14 @@ public async Task SignCalls(Chain chain, string imageHash, Envelop var guardConfig = new GuardStorage().GetConfig(envelope.wallet); if (guardConfig != null) { - var guardSigner = new GuardSigner(ExtensionsFactory.Current.Guard, guardConfig); + Attestation attestation = null; + foreach (var signer in _currentSigners) + { + if (!signer.IsExplicit) + attestation = signer.Attestation; + } + + var guardSigner = new GuardSigner(guardConfig, attestation); var guardSignature = await guardSigner.SignEnvelope(signedEnvelope); signedEnvelope.signatures = signedEnvelope.signatures.AddToArray(guardSignature); } @@ -58,16 +64,16 @@ private async Task SignSapient(Chain chain, Envelo var implicitSigners = new List
(); var explicitSigners = new List
(); - var signers = await _signerService.FindSignersForCalls(chain, calls); + _currentSigners = await _signerService.FindSignersForCalls(chain, calls); - var signatures = new SessionCallSignature[signers.Length]; - for (var i = 0; i < signers.Length; i++) + var signatures = new SessionCallSignature[_currentSigners.Length]; + for (var i = 0; i < _currentSigners.Length; i++) { - var signature = signers[i].SignCall(chain, calls[i], _sessions, envelope.payload.space, envelope.payload.nonce); + var signature = _currentSigners[i].SignCall(chain, calls[i], _sessions, envelope.payload.space, envelope.payload.nonce); signatures[i] = signature; } - foreach (var signer in signers) + foreach (var signer in _currentSigners) { if (signer.IsExplicit) explicitSigners.Add(signer.Address); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs index 83c30d1a..89d93e59 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs @@ -46,8 +46,6 @@ public async Task Update(Chain chain) var config = await GetConfig(imageHash); - Debug.Log($"Config {JsonConvert.SerializeObject(config)}"); - var signerAddress = ExtensionsFactory.Current.Sessions; var signerLeaf = config.topology.FindSignerLeaf(signerAddress) as SapientSignerLeaf; if (signerLeaf == null) From 51b7428f916f7cb91b15f6ef81c10056f8d0b45b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 1 Oct 2025 13:28:30 +0200 Subject: [PATCH 158/165] latest updates --- .../UnitTests/AuthenticationTests.cs | 49 ++++++++++- .../UnitTests/NethereumConversionTests.cs | 18 +++- .../EcosystemWallet/Guard/GuardSigner.cs | 34 +++---- .../Primitives/Signature/RSY.cs | 8 +- .../Transactions/TransactionService.cs | 17 ++-- .../EcosystemWallet/Wallet/Extensions.cs | 12 ++- .../EcosystemWallet/Wallet/SessionSigner.cs | 33 ++++++- .../Wallet/SignatureService.cs | 13 ++- .../EcosystemWallet/Wallet/WalletState.cs | 88 +++++++++++-------- .../SequenceSDK/Relayer/SequenceRelayer.cs | 2 +- 10 files changed, 192 insertions(+), 82 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs index dd7082fa..c9edfe1c 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs @@ -1,5 +1,10 @@ +using System; +using System.Numerics; using System.Threading.Tasks; using NUnit.Framework; +using Sequence.EcosystemWallet.Primitives; +using Sequence.EcosystemWallet.Primitives.Common; +using Sequence.Utils; namespace Sequence.EcosystemWallet.UnitTests { @@ -14,10 +19,50 @@ public void Disconnect() } [Test] - public async Task SignInWithGoogle() + public async Task CreateSessionForExplicitEmit() { + var deadline = new BigInteger(DateTimeOffset.UtcNow.ToUnixTimeSeconds() + 1000 * 60); + var permissions = new ContractPermission(Chain, new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), + deadline, 0); + var connect = new SequenceConnect(); - await connect.SignInWithGoogle(null); + await connect.SignInWithGoogle(permissions); + } + + [Test] + public async Task CreateSessionForSafeMint() + { + var deadline = new BigInteger(DateTimeOffset.UtcNow.ToUnixTimeSeconds() + 1000 * 60); + var permissions = new ContractPermission(Chain, new Address("0xd25b37e2fb07f85e9eca9d40fe3bcf60ba2dc57b"), + deadline, 0); + + permissions.AddRule(new ParameterRule + { + cumulative = false, + mask = "0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff".HexStringToByteArray(), + offset = new BigInt(4), + operation = (int)ParameterOperation.equal, + value = "0x000000000000000000000000bd7f38b943452e0c14d7ba92b9b504a9c9fc3518".HexStringToByteArray(), + }); + + var connect = new SequenceConnect(); + await connect.SignInWithGoogle(permissions); + } + + [Test] + public async Task CallExplicitEmit() + { + var wallet = SequenceWallet.RecoverFromStorage(); + await wallet.SendTransaction(Chain.TestnetArbitrumSepolia, + new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "explicitEmit()")); + } + + [Test] + public async Task CallSafeMint() + { + var wallet = SequenceWallet.RecoverFromStorage(); + await wallet.SendTransaction(Chain.TestnetArbitrumSepolia, + new Transaction(new Address("0xd25b37e2fb07f85e9eca9d40fe3bcf60ba2dc57b"), 0, "safeMint(address)", wallet.Address)); } [Test] diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs index ceddd7f3..313216c2 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; +using System.Text; using NUnit.Framework; using Sequence.ABI; using Sequence.EcosystemWallet.Primitives; @@ -21,12 +22,27 @@ public class NethereumConversionTests new Address("0x6aa42b1d0f63dae3a5bf785101c2d2bf26679463") }; + [TestCase("0x7b22646f6d61696e223a7b226e616d65223a2253657175656e63652057616c6c6574222c2276657273696f6e223a2233222c22636861696e4964223a3432313631342c22766572696679696e67436f6e7472616374223a22307862643766333862393433343532653063313464376261393262396235303461396339666333353138227d2c226d657373616765223a7b2263616c6c73223a5b7b22746f223a22307844323562333745326642303766383545396563413964343046453342634636304241326463353762222c2276616c7565223a2230222c2264617461223a223078343064303937633330303030303030303030303030303030303030303030303062643766333862393433343532653063313464376261393262396235303461396339666333353138222c226761734c696d6974223a2230222c2264656c656761746543616c6c223a66616c73652c226f6e6c7946616c6c6261636b223a66616c73652c226265686176696f724f6e4572726f72223a2231227d5d2c227370616365223a2230222c226e6f6e6365223a223136222c2277616c6c657473223a5b5d7d2c227072696d61727954797065223a2243616c6c73222c227479706573223a7b2243616c6c73223a5b7b226e616d65223a2263616c6c73222c2274797065223a2243616c6c5b5d227d2c7b226e616d65223a227370616365222c2274797065223a2275696e74323536227d2c7b226e616d65223a226e6f6e6365222c2274797065223a2275696e74323536227d2c7b226e616d65223a2277616c6c657473222c2274797065223a22616464726573735b5d227d5d2c2243616c6c223a5b7b226e616d65223a22746f222c2274797065223a2261646472657373227d2c7b226e616d65223a2276616c7565222c2274797065223a2275696e74323536227d2c7b226e616d65223a2264617461222c2274797065223a226279746573227d2c7b226e616d65223a226761734c696d6974222c2274797065223a2275696e74323536227d2c7b226e616d65223a2264656c656761746543616c6c222c2274797065223a22626f6f6c227d2c7b226e616d65223a226f6e6c7946616c6c6261636b222c2274797065223a22626f6f6c227d2c7b226e616d65223a226265686176696f724f6e4572726f72222c2274797065223a2275696e74323536227d5d7d7d")] + public void DecodePayload(string payload) + { + var json = UTF8Encoding.UTF8.GetString(payload.HexStringToByteArray()); + Debug.Log(json); + } + + [TestCase("0x061902118a261c1c227f653f26b468615afa440c6f7063760129687799953e775d96612db72c0800ae6fe69bf4a0bc458e843cf638f723a226e589d38a6da244956b941a4cf531d3779b3ff6a0f5a6cdead3578634c1d625a56500004101adb1fd39133e9191cfa66b191fa626bfa19c2abac25221649ec040de3bebad8f64d48e0e9b9d14f55ec267ea5ad22fe4a642a1d111335d2da34721bf39c75e58416062ff00003a30bf3a81c77c768d877d9cb46558300d6bae59d96b273a5bb7bd6d0dfddb574e5b650000151118002fc09def9a47437cc64e270843de094f598430ec392c0ac580a8ce28adb765a25fabb17ccc651b7c73f8f14b2d7fb63d2f8bed")] + [TestCase("0x060c0201b3dbccd2784bf59c7556334ae64e218ee26d33f74d45c2fcac36f6cd40928b6e708898cd5cecd9955c2e519c8016bdb027e0af3f127743dd65f72eaa0dd06f3111301d73c0b825fad1c357f71deb9a9fb25022c33f65000041010561398216aabd75798fc5c816197228bbc044c8f008472fbe5545e018da185f82770de0730e6aed7dfcf9fec27c3c9f42c937009954184c8eba813bf21d0e26416062ff00003a30c709bf58e602374f1b3ee95a065b9412ca01d93a5916409e377c3ed3316e8b6b650000151118002fc09def9a47437cc64e270843de094f5984303e54bf05a9620f3d8416a229c9fd457f7c07db8282d71015599cccc4d43df683")] + public void DecodeSignatureFromConfigUpdate(string signature) + { + var sig = RawSignature.Decode(signature.HexStringToByteArray()); + Debug.Log(sig.Encode().ByteArrayToHexString()); + } + [Test] public void TestConversionToNethereumWithCallsPayload() { // Arrange Address fromWallet = new Address("0xd0B2e0C7b8a2D267733B573Bdc87cC73f551b8A4"); - Chain chain = Chain.LocalChain; + BigInteger chain = new BigInteger((int)Chain.LocalChain); Parented parented = new Parented(_testAddressArray, new Calls(BigInteger.Parse("1266736520029721018202413622017"), BigInteger.Parse("55846603721928660"), diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs index d2db4184..8cb577fe 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs @@ -1,10 +1,14 @@ using System; +using System.Collections.Generic; using System.Numerics; +using System.Text; using System.Threading.Tasks; +using Nethereum.Hex.HexConvertors.Extensions; using Newtonsoft.Json; using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet { @@ -12,27 +16,30 @@ public class GuardSigner { private readonly Address _guardSigner = ExtensionsFactory.Current.Guard; private readonly GuardService _service; - private readonly Attestation _attestation; - public GuardSigner(GuardConfig config, Attestation attestation) + public GuardSigner(GuardConfig config) { _service = new GuardService(config.url); - _attestation = attestation; } public async Task SignEnvelope(SignedEnvelope envelope) { var unparentedPayload = new Parented(Array.Empty
(), envelope.payload); - var payloadType = ToGuardPayloadType(); var payload = ToGuardPayload(envelope.wallet, envelope.chainId, unparentedPayload); var signatures = envelope.signatures; var guardSignatures = new GuardSignatureArgs[signatures.Length]; for (var i = 0; i < signatures.Length; i++) + { guardSignatures[i] = ToGuardSignature(signatures[i]); + Debug.Log($"Guard sig {JsonConvert.SerializeObject(guardSignatures[i])}"); + } + + Debug.Log($"Nethereum TypedData Raw {Encoding.UTF8.GetString(payload.Message)}"); + Debug.Log($"Nethereum TypedData Hashed {payload.Digest.ByteArrayToHexStringWithPrefix()}"); - var rsy = await SignPayload(envelope.wallet, envelope.chainId, payloadType, + var rsy = await SignPayload(envelope.wallet, envelope.chainId, payload.Digest, payload.Message, guardSignatures); return new Signature @@ -45,7 +52,7 @@ public async Task SignEnvelope(SignedEnvelope envelope) }; } - private async Task SignPayload(Address wallet, BigInteger chainId, GuardPayloadType payloadType, + private async Task SignPayload(Address wallet, BigInteger chainId, byte[] digest, byte[] message, GuardSignatureArgs[] signatures) { var args = new SignWithArgs @@ -56,7 +63,7 @@ private async Task SignPayload(Address wallet, BigInteger chainId, GuardPay chainId = chainId, msg = digest.ByteArrayToHexStringWithPrefix(), wallet = wallet, - payloadType = payloadType, + payloadType = GuardPayloadType.Calls, payloadData = message.ByteArrayToHexStringWithPrefix(), signatures = signatures } @@ -66,22 +73,9 @@ private async Task SignPayload(Address wallet, BigInteger chainId, GuardPay return RSY.UnpackFrom65(response.sig.HexStringToByteArray()); } - private GuardPayloadType ToGuardPayloadType() - { - return GuardPayloadType.Calls; - } - private (byte[] Message, byte[] Digest) ToGuardPayload(Address wallet, BigInteger chainId, Parented payload) { - if (_attestation != null) - { - return ( - Message: JsonConvert.SerializeObject(_attestation.ToJson()).ToByteArray(), - Digest: _attestation.Encode()); - } - var typedData = new TypedDataToSign(wallet, chainId, payload); - return ( Message: JsonConvert.SerializeObject(typedData).ToByteArray(), Digest: typedData.GetSignPayload()); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs index 23f016d5..eed10928 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs @@ -15,11 +15,11 @@ public class RSY public byte[] Pack() { - if (yParity != 0 && yParity != 1 && yParity != 27 && yParity != 28) - throw new ArgumentException("yParity must be 0, 1, 27, or 28."); + if (yParity != 0 && yParity != 1) + throw new ArgumentException("yParity must be 0, 1"); - var rBytes = r.Value.ByteArrayFromNumber(r.Value.MinBytesFor()).PadLeft(32); - var sBytes = s.Value.ByteArrayFromNumber(s.Value.MinBytesFor()).PadLeft(32); + var rBytes = r.Value.ByteArrayFromNumber(32); + var sBytes = s.Value.ByteArrayFromNumber(32); if (yParity % 2 == 1) sBytes[0] |= 0x80; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs index 15742063..5fe229eb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs @@ -4,6 +4,7 @@ using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Utils; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet { @@ -28,6 +29,9 @@ public TransactionService(SessionSigner[] sessionSigners, WalletState state) var signatureService = new SignatureService(_sessionSigners, _state.SessionsTopology); var signature = await signatureService.SignCalls(chain, _state.SessionsImageHash, envelope, _state.ConfigUpdates); + + Debug.Log($"Raw signature {signature.ToJson()}"); + Debug.Log($"Encoded signature {signature.Encode().ByteArrayToHexString()}"); var callsData = ABI.ABI.Pack("execute(bytes,bytes)", envelope.payload.Encode(), @@ -40,16 +44,17 @@ public TransactionService(SessionSigner[] sessionSigners, WalletState state) // Not relevant for signing calls for getting fee options // If the wallet was not yet deployed onchain, let's make a deploy transaction first - + + var deployContext = _state.DeployContext; var deployTransaction = Erc6492Helper.Deploy(_state.DeployHash, new Erc6492Helper.Context { - creationCode = _state.DeployContext.walletCreationCode, - factory = _state.DeployContext.factory, - stage1 = _state.DeployContext.mainModule, - stage2 = _state.DeployContext.mainModuleUpgradable + creationCode = deployContext.walletCreationCode, + factory = deployContext.factory, + stage1 = deployContext.mainModule, + stage2 = deployContext.mainModuleUpgradable }); - return (new Address(_state.DeployContext.guestModule), new Calls(0, 0, new Call[] + return (new Address(deployContext.guestModule), new Calls(0, 0, new Call[] { new (deployTransaction.To, 0, deployTransaction.Data.HexStringToByteArray()), new (_state.Address, 0, callsData.HexStringToByteArray()) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs index cebda415..4773b571 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs @@ -2,18 +2,26 @@ namespace Sequence.EcosystemWallet { public struct Extensions { + public Address Factory; + public Address Stage1; + public Address Stage2; + public string CreationCode; public Address Sessions; public Address Guard; } public static class ExtensionsFactory { - public static Extensions Current => Rc3; - public static Extensions Rc3 = new Extensions { + Factory = new Address("0x00000000000018A77519fcCCa060c2537c9D6d3F"), + Stage1 = new Address("0x00000000000084fA81809Dd337311297C5594d62"), + Stage2 = new Address("0x7438718F9E4b9B834e305A620EEeCf2B9E6eBE79"), + CreationCode = "0x6041600e3d396021805130553df33d3d36153402601f57363d3d373d363d30545af43d82803e903d91601f57fd5bf3", Sessions = new Address("0x0000000000CC58810c33F3a0D78aA1Ed80FaDcD8"), Guard = new Address("0x18002Fc09deF9A47437cc64e270843dE094f5984") }; + + public static Extensions Current => Rc3; } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs index 67b8c05e..aa71b246 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs @@ -1,12 +1,15 @@ using System; using System.Numerics; using System.Threading.Tasks; +using Nethereum.ABI.FunctionEncoding; +using Nethereum.ABI.Model; using Sequence.ABI; using Sequence.EcosystemWallet.Primitives; using Sequence.Provider; using Sequence.Signer; using Sequence.Utils; using Sequence.Wallet; +using UnityEngine; namespace Sequence.EcosystemWallet { @@ -59,7 +62,7 @@ public async Task IsSupportedCall(Call call, Chain chain, SessionsTopology { if (Chain != chain) return false; - + if (call.data.Length > 4 && ByteArrayExtensions.Slice(call.data, 0, 4).ByteArrayToHexStringWithPrefix() == ABI.ABI.FunctionSelector("incrementUsageLimit((bytes32,uint256)[])")) @@ -197,5 +200,33 @@ private string GenerateImplicitRequestMagic(Address address, Attestation attesta attestation.issuerHash.Data)) .ByteArrayToHexStringWithPrefix(); } + + private async Task GetCurrentUsageLimit(Chain chain) + { + var response = await new SequenceEthClient(chain).CallContract(new object[] { + new CallContractData + { + to = ExtensionsFactory.Current.Sessions, + data = ABI.ABI.Pack("getLimitUsage(address,bytes32)", + ParentAddress, + new FixedByte(32, GetValueUsageHash(Address, "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"))) + } + }); + + var usageLimit = ABI.ABI.Decode(response, "uint256"); + + Debug.Log($"GetCurrentUsageLimit: {usageLimit}"); + } + + private byte[] GetValueUsageHash(Address signerAddress, string valueTrackingAddress) + { + var encoder = new ParametersEncoder(); + var encoded = encoder.EncodeParameters( + new Parameter[] { new Parameter("address"), new Parameter("address") }, + new object[] { signerAddress.Value, valueTrackingAddress } + ); + + return SequenceCoder.KeccakHash(encoded); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs index e52bd559..f03cd71b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs @@ -5,6 +5,7 @@ using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; +using UnityEngine; using ConfigUpdate = Sequence.EcosystemWallet.KeyMachine.Models.ConfigUpdate; namespace Sequence.EcosystemWallet @@ -35,14 +36,7 @@ public async Task SignCalls(Chain chain, string imageHash, Envelop var guardConfig = new GuardStorage().GetConfig(envelope.wallet); if (guardConfig != null) { - Attestation attestation = null; - foreach (var signer in _currentSigners) - { - if (!signer.IsExplicit) - attestation = signer.Attestation; - } - - var guardSigner = new GuardSigner(guardConfig, attestation); + var guardSigner = new GuardSigner(guardConfig); var guardSignature = await guardSigner.SignEnvelope(signedEnvelope); signedEnvelope.signatures = signedEnvelope.signatures.AddToArray(guardSignature); } @@ -51,6 +45,9 @@ public async Task SignCalls(Chain chain, string imageHash, Envelop rawSignature.suffix = configUpdates.Reverse().Select(u => RawSignature.Decode(u.signature.HexStringToByteArray())).ToArray(); + + foreach (var s in rawSignature.suffix) + Debug.Log($"suffix {s.Encode().ByteArrayToHexString()}"); return rawSignature; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs index 89d93e59..b89a47e0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs @@ -1,9 +1,12 @@ using System; using System.Numerics; +using System.Runtime.CompilerServices; using System.Threading.Tasks; using Nethereum.ABI.FunctionEncoding; using Nethereum.ABI.Model; +using Nethereum.Util; using Newtonsoft.Json; +using Sequence.ABI; using Sequence.EcosystemWallet.KeyMachine.Models; using Sequence.EcosystemWallet.Primitives; using Sequence.Provider; @@ -29,6 +32,7 @@ internal class WalletState private readonly KeyMachineApi _keyMachine = new(); private readonly ISecureStorage _secureStorage = SecureStorageFactory.CreateSecureStorage(); + private readonly bool _enableStorage; public WalletState(Address address) { @@ -37,15 +41,32 @@ public WalletState(Address address) public async Task Update(Chain chain) { - var deployResponse = await GetDeployHash(Address); - DeployHash = deployResponse.deployHash; - DeployContext = deployResponse.context; + IsDeployed = await CheckDeployed(chain, Address); - var configUpdates = await _keyMachine.GetConfigUpdates(Address, DeployHash); - var imageHash = configUpdates.updates.Length > 0 ? configUpdates.updates[^1].toImageHash : DeployHash; + var implementation = await GetImplementation(chain); + + string imageHash; + if (IsDeployed && implementation.Equals(ExtensionsFactory.Current.Stage2)) + { + imageHash = await GetOnChainImageHash(chain); + Debug.Log($"onchain image hash {imageHash}"); + } + else + { + var deployResponse = await GetDeployHash(Address); + + DeployHash = deployResponse.deployHash; + DeployContext = deployResponse.context; + + imageHash = DeployHash; + } + var configUpdates = await _keyMachine.GetConfigUpdates(Address, imageHash); + if (configUpdates.updates.Length > 0) + imageHash = configUpdates.updates[^1].toImageHash; + var config = await GetConfig(imageHash); - + var signerAddress = ExtensionsFactory.Current.Sessions; var signerLeaf = config.topology.FindSignerLeaf(signerAddress) as SapientSignerLeaf; if (signerLeaf == null) @@ -53,22 +74,25 @@ public async Task Update(Chain chain) SessionsImageHash = signerLeaf.imageHash; + Debug.Log($"Config image hash {imageHash}"); + Debug.Log($"SessionsImageHash {SessionsImageHash}"); + Debug.Log($"{JsonConvert.SerializeObject(config.topology.Parse())}"); + var sessionsTopology = await GetSessionsTopology(SessionsImageHash); + Debug.Log($"sessionsTopology {sessionsTopology.JsonSerialize()}"); ConfigUpdates = configUpdates.updates; ImageHash = imageHash; Config = config; SessionsTopology = sessionsTopology; - - await UpdateNonce(chain, 0); - IsDeployed = await CheckDeployed(chain, Address); + await UpdateNonce(chain, 0); } private async Task GetDeployHash(Address address) { var storageKey = $"sequence-deploy-hash-{address}"; - var cached = _secureStorage.RetrieveString(storageKey); + var cached = RetrieveString(storageKey); if (!string.IsNullOrEmpty(cached)) return JsonConvert.DeserializeObject(cached); @@ -81,8 +105,9 @@ private async Task GetDeployHash(Address address) private async Task GetConfig(string imageHash) { + Debug.Log($"Get config for image hash {imageHash}"); var storageKey = $"sequence-config-tree-{imageHash}"; - var cached = _secureStorage.RetrieveString(storageKey); + var cached = RetrieveString(storageKey); if (!string.IsNullOrEmpty(cached)) return ConfigFromServiceTree(JsonConvert.DeserializeObject(cached)); @@ -109,12 +134,12 @@ private Primitives.Config ConfigFromServiceTree(ConfigReturn configReturn) private async Task GetSessionsTopology(string imageHash) { var storageKey = $"sequence-sessions-tree-{imageHash}"; - var cached = _secureStorage.RetrieveString(storageKey); + var cached = RetrieveString(storageKey); if (!string.IsNullOrEmpty(cached)) return SessionsTopology.FromTree(cached); - var treeReturn = await _keyMachine.GetTree(SessionsImageHash); + var treeReturn = await _keyMachine.GetTree(imageHash); var tree = treeReturn.tree.ToString(); var sessionsTopology = SessionsTopology.FromTree(tree); _secureStorage.StoreString(storageKey, tree); @@ -122,7 +147,7 @@ private async Task GetSessionsTopology(string imageHash) return sessionsTopology; } - private async Task GetImplementation(Chain chain) + private async Task
GetImplementation(Chain chain) { var response = await new SequenceEthClient(chain).CallContract(new object[] { new CallContractData @@ -135,30 +160,25 @@ private async Task GetImplementation(Chain chain) var data = response.HexStringToByteArray(); var addressData = data.Slice(data.Length - 20); - // If this equals 0x2a4fB19F66F1427A5E363Bf1bB3be27b9A9ACC39, then this is a stage1 wallet - // stage2 wallets need to get their image hashes from the on chain configuration - var address = new Address(addressData.ByteArrayToHexStringWithPrefix()); - - Debug.Log($"Get Implementation {address}"); + var addressStr = addressData.ByteArrayToHexStringWithPrefix(); + return addressStr.IsAddress() ? new Address(addressStr) : null; } - private async Task GetOnChainImageHash(Chain chain) + private async Task GetOnChainImageHash(Chain chain) { - var response = await new SequenceEthClient(chain).CallContract(new object[] { + return await new SequenceEthClient(chain).CallContract(new object[] { new CallContractData { to = Address, data = ABI.ABI.Pack("imageHash()") } }); - - Debug.Log($"Onchain image hash {response}"); } private async Task CheckDeployed(Chain chain, Address address) { var storageKey = $"sequence-deployed-{chain.ToString()}-{address}"; - var cached = _secureStorage.RetrieveString(storageKey); + var cached = RetrieveString(storageKey); if (!string.IsNullOrEmpty(cached)) return true; @@ -172,28 +192,22 @@ private async Task CheckDeployed(Chain chain, Address address) return isDeployed; } - public async Task UpdateNonce(Chain chain, BigInteger space) + private async Task UpdateNonce(Chain chain, BigInteger space) { - var function = new FunctionABI("readNonce", false) - { - InputParameters = new[] - { - new Parameter("uint256", "_space") - } - }; - - var encoder = new FunctionCallEncoder(); - var data = encoder.EncodeRequest(function.Sha3Signature, function.InputParameters, space); - var response = await new SequenceEthClient(chain).CallContract(new object[] { new CallContractData { to = Address, - data = data + data = ABI.ABI.Pack("readNonce(uint256)", space) } }); Nonce = response == "0x" ? 0 : response.HexStringToBigInteger(); } + + private string RetrieveString(string key) + { + return _enableStorage ? _secureStorage.RetrieveString(key) : null; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs index f9aa87f8..a80ec27f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs @@ -18,7 +18,7 @@ public SequenceRelayer(Chain chain) { Chain.Optimism => "v3-optimism", Chain.ArbitrumOne => "dev-arbitrum", - Chain.TestnetArbitrumSepolia => "dev-arbitrum-sepolia", + Chain.TestnetArbitrumSepolia => "v3-arbitrum-sepolia", _ => throw new NotSupportedException($"Chain {chain} not supported.") }; From 1797a9fe7bfb16f5c22856fd23f048727104eda1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 1 Oct 2025 22:04:17 +0200 Subject: [PATCH 159/165] filter out identity signers, added callIdx --- .../UnitTests/AuthenticationTests.cs | 4 ++-- .../UnitTests/NethereumConversionTests.cs | 3 ++- .../EcosystemWallet/Guard/GuardSigner.cs | 10 --------- .../Primitives/Config/SignerLeaf.cs | 3 ++- .../Primitives/Payload/TypedDataToSign.cs | 2 +- .../Sessions/ExplicitSessionCallSignature.cs | 5 ----- .../Sessions/ImplicitSessionCallSignature.cs | 5 ----- .../Sessions/SessionCallSignature.cs | 9 ++++---- .../Primitives/Sessions/SessionsTopology.cs | 18 ++++++++++++--- .../Primitives/Signature/ChainedSignature.cs | 3 +-- .../Primitives/Signature/RawSignature.cs | 4 ++-- .../Signature/SignatureOfSignerLeafHash.cs | 1 - .../Signature/SignedSapientSignerLeaf.cs | 22 ++++++++++++++++++- .../Primitives/Signature/SignedSignerLeaf.cs | 22 +++++++++++++++++++ .../Transactions/Envelope/Envelope.cs | 11 ++++++++++ .../Transactions/TransactionService.cs | 4 +--- .../EcosystemWallet/Wallet/SequenceWallet.cs | 2 -- .../EcosystemWallet/Wallet/SessionSigner.cs | 9 ++++---- .../Wallet/SignatureService.cs | 8 ++----- 19 files changed, 91 insertions(+), 54 deletions(-) diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs index c9edfe1c..5548cbaa 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs @@ -53,7 +53,7 @@ public async Task CreateSessionForSafeMint() public async Task CallExplicitEmit() { var wallet = SequenceWallet.RecoverFromStorage(); - await wallet.SendTransaction(Chain.TestnetArbitrumSepolia, + await wallet.SendTransaction(Chain, new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "explicitEmit()")); } @@ -61,7 +61,7 @@ await wallet.SendTransaction(Chain.TestnetArbitrumSepolia, public async Task CallSafeMint() { var wallet = SequenceWallet.RecoverFromStorage(); - await wallet.SendTransaction(Chain.TestnetArbitrumSepolia, + await wallet.SendTransaction(Chain, new Transaction(new Address("0xd25b37e2fb07f85e9eca9d40fe3bcf60ba2dc57b"), 0, "safeMint(address)", wallet.Address)); } diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs index 313216c2..518bc860 100644 --- a/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs @@ -22,7 +22,8 @@ public class NethereumConversionTests new Address("0x6aa42b1d0f63dae3a5bf785101c2d2bf26679463") }; - [TestCase("0x7b22646f6d61696e223a7b226e616d65223a2253657175656e63652057616c6c6574222c2276657273696f6e223a2233222c22636861696e4964223a3432313631342c22766572696679696e67436f6e7472616374223a22307862643766333862393433343532653063313464376261393262396235303461396339666333353138227d2c226d657373616765223a7b2263616c6c73223a5b7b22746f223a22307844323562333745326642303766383545396563413964343046453342634636304241326463353762222c2276616c7565223a2230222c2264617461223a223078343064303937633330303030303030303030303030303030303030303030303062643766333862393433343532653063313464376261393262396235303461396339666333353138222c226761734c696d6974223a2230222c2264656c656761746543616c6c223a66616c73652c226f6e6c7946616c6c6261636b223a66616c73652c226265686176696f724f6e4572726f72223a2231227d5d2c227370616365223a2230222c226e6f6e6365223a223136222c2277616c6c657473223a5b5d7d2c227072696d61727954797065223a2243616c6c73222c227479706573223a7b2243616c6c73223a5b7b226e616d65223a2263616c6c73222c2274797065223a2243616c6c5b5d227d2c7b226e616d65223a227370616365222c2274797065223a2275696e74323536227d2c7b226e616d65223a226e6f6e6365222c2274797065223a2275696e74323536227d2c7b226e616d65223a2277616c6c657473222c2274797065223a22616464726573735b5d227d5d2c2243616c6c223a5b7b226e616d65223a22746f222c2274797065223a2261646472657373227d2c7b226e616d65223a2276616c7565222c2274797065223a2275696e74323536227d2c7b226e616d65223a2264617461222c2274797065223a226279746573227d2c7b226e616d65223a226761734c696d6974222c2274797065223a2275696e74323536227d2c7b226e616d65223a2264656c656761746543616c6c222c2274797065223a22626f6f6c227d2c7b226e616d65223a226f6e6c7946616c6c6261636b222c2274797065223a22626f6f6c227d2c7b226e616d65223a226265686176696f724f6e4572726f72222c2274797065223a2275696e74323536227d5d7d7d")] + [TestCase("0x7b22646f6d61696e223a7b226e616d65223a2253657175656e63652057616c6c6574222c2276657273696f6e223a2233222c22636861696e4964223a3432313631342c22766572696679696e67436f6e7472616374223a22307862643766333862393433343532653063313464376261393262396235303461396339666333353138227d2c227479706573223a7b2243616c6c73223a5b7b226e616d65223a2263616c6c73222c2274797065223a2243616c6c5b5d227d2c7b226e616d65223a227370616365222c2274797065223a2275696e74323536227d2c7b226e616d65223a226e6f6e6365222c2274797065223a2275696e74323536227d2c7b226e616d65223a2277616c6c657473222c2274797065223a22616464726573735b5d227d5d2c2243616c6c223a5b7b226e616d65223a22746f222c2274797065223a2261646472657373227d2c7b226e616d65223a2276616c7565222c2274797065223a2275696e74323536227d2c7b226e616d65223a2264617461222c2274797065223a226279746573227d2c7b226e616d65223a226761734c696d6974222c2274797065223a2275696e74323536227d2c7b226e616d65223a2264656c656761746543616c6c222c2274797065223a22626f6f6c227d2c7b226e616d65223a226f6e6c7946616c6c6261636b222c2274797065223a22626f6f6c227d2c7b226e616d65223a226265686176696f724f6e4572726f72222c2274797065223a2275696e74323536227d5d7d2c227072696d61727954797065223a2243616c6c73222c226d657373616765223a7b227370616365223a2230222c226e6f6e6365223a223139222c2277616c6c657473223a5b5d2c2263616c6c73223a5b7b226761734c696d6974223a302c2264656c656761746543616c6c223a66616c73652c2264617461223a2230783063303334306663222c226f6e6c7946616c6c6261636b223a66616c73652c22746f223a22307833333938356433323038303945323632373461373245303332363863386132393932374263366441222c2276616c7565223a302c226265686176696f724f6e4572726f72223a317d5d7d7d")] + [TestCase("0x7b22646f6d61696e223a7b226e616d65223a2253657175656e63652057616c6c6574222c2276657273696f6e223a2233222c22636861696e4964223a3432313631342c22766572696679696e67436f6e7472616374223a22307862643766333862393433343532653063313464376261393262396235303461396339666333353138227d2c226d657373616765223a7b2263616c6c73223a5b7b22746f223a22307830303030303030303030434335383831306333334633613044373861413145643830466144634438222c2276616c7565223a2230222c2264617461223a223078343264653134313830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030316566333838663933306436663664306163376365383861363962363231653363663062303434643836383164616338613663646239643335303832343936396334306430393763333030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030222c226761734c696d6974223a2230222c2264656c656761746543616c6c223a66616c73652c226f6e6c7946616c6c6261636b223a66616c73652c226265686176696f724f6e4572726f72223a2231227d2c7b22746f223a22307844323562333745326642303766383545396563413964343046453342634636304241326463353762222c2276616c7565223a2230222c2264617461223a223078343064303937633330303030303030303030303030303030303030303030303062643766333862393433343532653063313464376261393262396235303461396339666333353138222c226761734c696d6974223a2230222c2264656c656761746543616c6c223a66616c73652c226f6e6c7946616c6c6261636b223a66616c73652c226265686176696f724f6e4572726f72223a2231227d5d2c227370616365223a2230222c226e6f6e6365223a223139222c2277616c6c657473223a5b5d7d2c227072696d61727954797065223a2243616c6c73222c227479706573223a7b2243616c6c73223a5b7b226e616d65223a2263616c6c73222c2274797065223a2243616c6c5b5d227d2c7b226e616d65223a227370616365222c2274797065223a2275696e74323536227d2c7b226e616d65223a226e6f6e6365222c2274797065223a2275696e74323536227d2c7b226e616d65223a2277616c6c657473222c2274797065223a22616464726573735b5d227d5d2c2243616c6c223a5b7b226e616d65223a22746f222c2274797065223a2261646472657373227d2c7b226e616d65223a2276616c7565222c2274797065223a2275696e74323536227d2c7b226e616d65223a2264617461222c2274797065223a226279746573227d2c7b226e616d65223a226761734c696d6974222c2274797065223a2275696e74323536227d2c7b226e616d65223a2264656c656761746543616c6c222c2274797065223a22626f6f6c227d2c7b226e616d65223a226f6e6c7946616c6c6261636b222c2274797065223a22626f6f6c227d2c7b226e616d65223a226265686176696f724f6e4572726f72222c2274797065223a2275696e74323536227d5d7d7d")] public void DecodePayload(string payload) { var json = UTF8Encoding.UTF8.GetString(payload.HexStringToByteArray()); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs index 8cb577fe..bb07ff7c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs @@ -1,14 +1,10 @@ using System; -using System.Collections.Generic; using System.Numerics; -using System.Text; using System.Threading.Tasks; -using Nethereum.Hex.HexConvertors.Extensions; using Newtonsoft.Json; using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet { @@ -31,13 +27,7 @@ public async Task SignEnvelope(SignedEnvelope envelope) var signatures = envelope.signatures; var guardSignatures = new GuardSignatureArgs[signatures.Length]; for (var i = 0; i < signatures.Length; i++) - { guardSignatures[i] = ToGuardSignature(signatures[i]); - Debug.Log($"Guard sig {JsonConvert.SerializeObject(guardSignatures[i])}"); - } - - Debug.Log($"Nethereum TypedData Raw {Encoding.UTF8.GetString(payload.Message)}"); - Debug.Log($"Nethereum TypedData Hashed {payload.Digest.ByteArrayToHexStringWithPrefix()}"); var rsy = await SignPayload(envelope.wallet, envelope.chainId, payload.Digest, payload.Message, guardSignatures); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs index b11c9e19..2981a8a8 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs @@ -3,6 +3,7 @@ using System.Text; using Sequence.ABI; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { @@ -23,7 +24,7 @@ public override object Parse() return new SignerLeafJson { type = Signer, - address = address, + address = address ?? string.Empty, weight = weight.ToString() }; } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs index 4f46849c..19ebe96e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -231,7 +231,7 @@ public TypedDataToSign(Address wallet, BigInteger chainId, Parented payload) { ["space"] = callPayload.space.ToString(), ["nonce"] = callPayload.nonce.ToString(), - ["wallets"] = payload.parentWallets + ["wallets"] = payload.parentWallets ?? Array.Empty
() }; int callsLength = callPayload.calls.Length; EncodeSapient.EncodedCall[] encoded = new EncodeSapient.EncodedCall[callsLength]; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ExplicitSessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ExplicitSessionCallSignature.cs index e7ab589d..5cd20810 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ExplicitSessionCallSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ExplicitSessionCallSignature.cs @@ -6,10 +6,5 @@ public class ExplicitSessionCallSignature : SessionCallSignature { public BigInteger permissionIndex; public RSY sessionSignature; - - public override byte[] Encode() - { - throw new System.NotImplementedException(); - } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitSessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitSessionCallSignature.cs index 2e5b0ba2..073cdc16 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitSessionCallSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitSessionCallSignature.cs @@ -5,10 +5,5 @@ public class ImplicitSessionCallSignature : SessionCallSignature public Attestation attestation; public RSY identitySignature; public RSY sessionSignature; - - public override byte[] Encode() - { - throw new System.NotImplementedException(); - } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs index 93fe8ba0..ebbf62d4 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs @@ -9,8 +9,6 @@ namespace Sequence.EcosystemWallet.Primitives { public abstract class SessionCallSignature { - public abstract byte[] Encode(); - public static SessionCallSignature FromJson(string json) { var data = JsonConvert.DeserializeObject>(json); @@ -44,7 +42,8 @@ public static byte[] EncodeSignatures(SessionCallSignature[] signatures, Session if (!sessionsTopology.IsComplete()) throw new Exception("Incomplete topology"); - sessionsTopology = sessionsTopology.Minimise(explicitSigners, implicitSigners); + var identitySigner = sessionsTopology.GetIdentitySigner(); + sessionsTopology = sessionsTopology.Minimise(explicitSigners, implicitSigners, identitySigner); var encodedTopology = sessionsTopology.Encode(); if (encodedTopology.Length.MinBytesFor() > 3) @@ -52,7 +51,7 @@ public static byte[] EncodeSignatures(SessionCallSignature[] signatures, Session parts.Add(encodedTopology.Length.ByteArrayFromNumber(3)); parts.Add(encodedTopology); - + var attestationMap = new Dictionary(); var encodedAttestations = new List(); @@ -107,7 +106,7 @@ public static byte[] EncodeSignatures(SessionCallSignature[] signatures, Session throw new Exception("Invalid call signature"); } } - + return ByteArrayExtensions.ConcatenateByteArrays(parts.ToArray()); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs index 97857f17..e7b96a2c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -52,14 +52,15 @@ public string ImageHash() ///
/// The list of explicit signers to consider. /// The list of implicit signers to consider. + /// The list of implicit signers to consider. /// New reference to the compromised topology. /// - public SessionsTopology Minimise(Address[] explicitSigners, Address[] implicitSigners) + public SessionsTopology Minimise(Address[] explicitSigners, Address[] implicitSigners, Address identitySigner) { if (this.IsBranch()) { var branchList = ((SessionsTopology[])Branch.Children) - .Select(branch => (ITopology)branch.Minimise(explicitSigners, implicitSigners)) + .Select(branch => (ITopology)branch.Minimise(explicitSigners, implicitSigners, identitySigner)) .ToArray(); if (branchList.All(b => b.Node is SessionNodeLeaf)) @@ -102,7 +103,18 @@ public SessionsTopology Minimise(Address[] explicitSigners, Address[] implicitSi return this; } - if (Leaf is IdentitySignerLeaf || Node is SessionNodeLeaf) + if (Leaf is IdentitySignerLeaf identitySignerLeaf) + { + if (identitySignerLeaf.identitySigner.Equals(identitySigner)) + return this; + + return new SessionNodeLeaf + { + Value = this.Hash(true).HexStringToByteArray() + }.ToTopology(); + } + + if (Node is SessionNodeLeaf) return this; throw new Exception("Invalid topology"); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs index 3e6acde0..cbe76681 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; using Sequence.Utils; namespace Sequence.EcosystemWallet.Primitives @@ -27,7 +26,7 @@ public byte[] Encode() } byte[] output = new byte[] { flag }; - + if (sigForCheckpointer.configuration.checkpointer != null) { var checkpointer = sigForCheckpointer.configuration.checkpointer.Value.HexStringToByteArray().PadLeft(20); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs index bb85e273..48e9a359 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -100,7 +100,7 @@ public byte[] Encode(bool skipCheckpointerData = false, bool skipCheckpointerAdd var checkpointBytes = configuration.checkpoint.ByteArrayFromNumber(bytesForCheckpoint); output = ByteArrayExtensions.ConcatenateByteArrays(output, checkpointBytes); - + var thresholdBytes = configuration.threshold.ByteArrayFromNumber(bytesForThreshold); output = ByteArrayExtensions.ConcatenateByteArrays(output, thresholdBytes); @@ -186,7 +186,7 @@ public static RawSignature Decode(byte[] erc6492Signature) return new RawSignature { noChainId = subsignatures[0].noChainId, - checkpointerData = null, + checkpointerData = subsignatures[0].checkpointerData, configuration = subsignatures[0].configuration, suffix = subsignatures.GetRange(1, subsignatures.Count - 1).ToArray(), erc6492 = erc6492 diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs index d290c8ce..0d7c524e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs @@ -1,6 +1,5 @@ using System; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs index 4fd2eed3..7f20de31 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs @@ -1,12 +1,32 @@ using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet.Primitives { public class SignedSapientSignerLeaf : SapientSignerLeaf { + private struct SignedSapientSignerLeafJson + { + public string type; + public string address; + public string weight; + public string imageHash; + public string signature; + } + public SignatureOfLeaf signature; + public override object Parse() + { + return new SignedSapientSignerLeafJson + { + type = "signed-sapient-signer", + address = address, + weight = weight.ToString(), + imageHash = imageHash, + signature = signature.Encode(this).ByteArrayToHexStringWithPrefix() + }; + } + public override byte[] Encode(bool noChainId, byte[] checkpointerData) { return signature.Encode(this); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs index 792f5a27..bf840b8e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs @@ -1,9 +1,31 @@ +using Sequence.Utils; +using UnityEngine; + namespace Sequence.EcosystemWallet.Primitives { public class SignedSignerLeaf : SignerLeaf { + private struct SignedSignerLeafJson + { + public string type; + public string address; + public string weight; + public string signature; + } + public SignatureOfLeaf signature; + public override object Parse() + { + return new SignedSignerLeafJson + { + type = "signed-signer", + address = address ?? string.Empty, + weight = weight.ToString(), + signature = signature.Encode(this).ByteArrayToHexStringWithPrefix(), + }; + } + public override byte[] Encode(bool noChainId, byte[] checkpointerData) { return signature.Encode(this); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Envelope.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Envelope.cs index ad524ef5..27930867 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Envelope.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Envelope.cs @@ -21,5 +21,16 @@ public SignedEnvelope ToSigned(EnvelopeSignature signature) signatures = new[] { signature }, }; } + + public bool ReachedThreshold() + { + var result = WeightOf(); + return result.weight >= result.maxWeight; + } + + public WeightCalculator.WeightResult WeightOf() + { + return WeightCalculator.GetWeight(configuration, (_) => false); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs index 5fe229eb..e927f84d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; +using Sequence.EcosystemWallet.Primitives.Common; using Sequence.EcosystemWallet.Utils; using Sequence.Utils; using UnityEngine; @@ -29,9 +30,6 @@ public TransactionService(SessionSigner[] sessionSigners, WalletState state) var signatureService = new SignatureService(_sessionSigners, _state.SessionsTopology); var signature = await signatureService.SignCalls(chain, _state.SessionsImageHash, envelope, _state.ConfigUpdates); - - Debug.Log($"Raw signature {signature.ToJson()}"); - Debug.Log($"Encoded signature {signature.Encode().ByteArrayToHexString()}"); var callsData = ABI.ABI.Pack("execute(bytes,bytes)", envelope.payload.Encode(), diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs index 9e6112ce..7db4f37f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs @@ -2,8 +2,6 @@ using System.Linq; using System.Numerics; using System.Threading.Tasks; -using Sequence.Config; -using Sequence.EcosystemWallet.Browser; using Sequence.EcosystemWallet.Primitives.Common; using Sequence.Relayer; using Sequence.Utils; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs index aa71b246..186980d3 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs @@ -105,12 +105,12 @@ public async Task IsSupportedCall(Call call, Chain chain, SessionsTopology return (permissionIndex, sessionPermissions.permissions[permissionIndex]); } - public SessionCallSignature SignCall(Chain chain, Call call, SessionsTopology topology, BigInteger space, BigInteger nonce) + public SessionCallSignature SignCall(Chain chain, Call call, int callIdx, SessionsTopology topology, BigInteger space, BigInteger nonce) { var pvKey = _credentials.privateKey; var eoaWallet = new EOAWallet(pvKey); - var hashedCall = HashCallWithReplayProtection(chain, call, space, nonce); + var hashedCall = HashCallWithReplayProtection(chain, call, callIdx, space, nonce); var signedCall = EthSignature.Sign(hashedCall, eoaWallet.privKey); var rsy = RSY.UnpackFrom65(signedCall.HexStringToByteArray()); @@ -141,14 +141,15 @@ public SessionCallSignature SignCall(Chain chain, Call call, SessionsTopology to }; } - private byte[] HashCallWithReplayProtection(Chain chain, Call call, BigInteger space, BigInteger nonce) + private byte[] HashCallWithReplayProtection(Chain chain, Call call, BigInteger callIdx, BigInteger space, BigInteger nonce) { var chainBytes = BigInteger.Parse(chain.GetChainId()).ByteArrayFromNumber(32); var spaceBytes = space.ByteArrayFromNumber(32); var nonceBytes = nonce.ByteArrayFromNumber(32); + var callIdxBytes = callIdx.ByteArrayFromNumber(32); var callHashBytes = call.Hash().HexStringToByteArray(); - var concatenated = ByteArrayExtensions.ConcatenateByteArrays(chainBytes, spaceBytes, nonceBytes, callHashBytes); + var concatenated = ByteArrayExtensions.ConcatenateByteArrays(chainBytes, spaceBytes, nonceBytes, callIdxBytes, callHashBytes); return SequenceCoder.KeccakHash(concatenated); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs index f03cd71b..cb08f26f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs @@ -5,7 +5,6 @@ using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.Utils; -using UnityEngine; using ConfigUpdate = Sequence.EcosystemWallet.KeyMachine.Models.ConfigUpdate; namespace Sequence.EcosystemWallet @@ -34,7 +33,7 @@ public async Task SignCalls(Chain chain, string imageHash, Envelop var signedEnvelope = envelope.ToSigned(sapientSignature); var guardConfig = new GuardStorage().GetConfig(envelope.wallet); - if (guardConfig != null) + if (signedEnvelope.ReachedThreshold() && guardConfig != null) { var guardSigner = new GuardSigner(guardConfig); var guardSignature = await guardSigner.SignEnvelope(signedEnvelope); @@ -46,9 +45,6 @@ public async Task SignCalls(Chain chain, string imageHash, Envelop rawSignature.suffix = configUpdates.Reverse().Select(u => RawSignature.Decode(u.signature.HexStringToByteArray())).ToArray(); - foreach (var s in rawSignature.suffix) - Debug.Log($"suffix {s.Encode().ByteArrayToHexString()}"); - return rawSignature; } @@ -66,7 +62,7 @@ private async Task SignSapient(Chain chain, Envelo var signatures = new SessionCallSignature[_currentSigners.Length]; for (var i = 0; i < _currentSigners.Length; i++) { - var signature = _currentSigners[i].SignCall(chain, calls[i], _sessions, envelope.payload.space, envelope.payload.nonce); + var signature = _currentSigners[i].SignCall(chain, calls[i], i, _sessions, envelope.payload.space, envelope.payload.nonce); signatures[i] = signature; } From 243310357f00fc64e509e7d163a69c8486e8bf32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Wed, 1 Oct 2025 22:08:10 +0200 Subject: [PATCH 160/165] re-enabled storage in wallet state --- .../EcosystemWallet/Wallet/WalletState.cs | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs index b89a47e0..8ebbe2bb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs @@ -1,18 +1,12 @@ using System; using System.Numerics; -using System.Runtime.CompilerServices; using System.Threading.Tasks; -using Nethereum.ABI.FunctionEncoding; -using Nethereum.ABI.Model; -using Nethereum.Util; using Newtonsoft.Json; -using Sequence.ABI; using Sequence.EcosystemWallet.KeyMachine.Models; using Sequence.EcosystemWallet.Primitives; using Sequence.Provider; using Sequence.Utils; using Sequence.Utils.SecureStorage; -using UnityEngine; using ConfigUpdate = Sequence.EcosystemWallet.KeyMachine.Models.ConfigUpdate; namespace Sequence.EcosystemWallet @@ -32,7 +26,7 @@ internal class WalletState private readonly KeyMachineApi _keyMachine = new(); private readonly ISecureStorage _secureStorage = SecureStorageFactory.CreateSecureStorage(); - private readonly bool _enableStorage; + private readonly bool _enableStorage = true; public WalletState(Address address) { @@ -49,7 +43,6 @@ public async Task Update(Chain chain) if (IsDeployed && implementation.Equals(ExtensionsFactory.Current.Stage2)) { imageHash = await GetOnChainImageHash(chain); - Debug.Log($"onchain image hash {imageHash}"); } else { @@ -74,12 +67,7 @@ public async Task Update(Chain chain) SessionsImageHash = signerLeaf.imageHash; - Debug.Log($"Config image hash {imageHash}"); - Debug.Log($"SessionsImageHash {SessionsImageHash}"); - Debug.Log($"{JsonConvert.SerializeObject(config.topology.Parse())}"); - var sessionsTopology = await GetSessionsTopology(SessionsImageHash); - Debug.Log($"sessionsTopology {sessionsTopology.JsonSerialize()}"); ConfigUpdates = configUpdates.updates; ImageHash = imageHash; @@ -105,7 +93,6 @@ private async Task GetDeployHash(Address address) private async Task GetConfig(string imageHash) { - Debug.Log($"Get config for image hash {imageHash}"); var storageKey = $"sequence-config-tree-{imageHash}"; var cached = RetrieveString(storageKey); From 76cd5c54f8cb78590230fccb4198cc5b16edda50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 2 Oct 2025 09:26:03 +0200 Subject: [PATCH 161/165] fixed null address during GetImplementation --- .../SequenceSDK/EcosystemWallet/Wallet/WalletState.cs | 5 ++++- .../Sequence/SequenceSDK/Relayer/SequenceRelayer.cs | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs index 8ebbe2bb..751529b2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs @@ -40,7 +40,7 @@ public async Task Update(Chain chain) var implementation = await GetImplementation(chain); string imageHash; - if (IsDeployed && implementation.Equals(ExtensionsFactory.Current.Stage2)) + if (IsDeployed && implementation != null && implementation.Equals(ExtensionsFactory.Current.Stage2)) { imageHash = await GetOnChainImageHash(chain); } @@ -145,6 +145,9 @@ private async Task
GetImplementation(Chain chain) }); var data = response.HexStringToByteArray(); + if (data == null || data.Length < 20) + return null; + var addressData = data.Slice(data.Length - 20); var addressStr = addressData.ByteArrayToHexStringWithPrefix(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs index a80ec27f..f6466cb0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs @@ -17,7 +17,7 @@ public SequenceRelayer(Chain chain) var name = chain switch { Chain.Optimism => "v3-optimism", - Chain.ArbitrumOne => "dev-arbitrum", + Chain.ArbitrumOne => "v3-arbitrum", Chain.TestnetArbitrumSepolia => "v3-arbitrum-sepolia", _ => throw new NotSupportedException($"Chain {chain} not supported.") }; From 0381924fb1e8d16094c8dd921eb61b2a4e29bbc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 2 Oct 2025 09:30:15 +0200 Subject: [PATCH 162/165] use the url scheme from the config by default, generate it as a fallback --- Packages/Sequence-Unity/Editor/CheckUrlScheme.cs | 9 ++++++++- .../SequenceSDK/Authentication/OpenIdAuthenticator.cs | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs b/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs index b872fa57..7f82723f 100644 --- a/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs +++ b/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs @@ -20,7 +20,7 @@ public class CheckUrlScheme : IPreprocessBuildWithReport private static string _plistPath; private static string _pathToBuiltProject; - private static string _urlScheme => UrlSchemeFactory.CreateFromAppIdentifier(); + private static string _urlScheme => GetUrlScheme(); [PostProcessBuild] public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProject) @@ -184,5 +184,12 @@ private void CreateBasicManifest(string path) File.WriteAllText(path, manifestContent); } + + // Check if a custom url scheme is defined in the config file. If not, generate a scheme from the app identifier. + private static string GetUrlScheme() + { + var configUrlScheme = SequenceConfig.GetConfig().UrlScheme; + return string.IsNullOrEmpty(configUrlScheme) ? UrlSchemeFactory.CreateFromAppIdentifier() : configUrlScheme; + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Authentication/OpenIdAuthenticator.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Authentication/OpenIdAuthenticator.cs index 6ee0f293..7b5acc2f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Authentication/OpenIdAuthenticator.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Authentication/OpenIdAuthenticator.cs @@ -46,7 +46,7 @@ public OpenIdAuthenticator(string nonce = null) { SequenceConfig config = SequenceConfig.GetConfig(SequenceService.None); - _urlScheme = UrlSchemeFactory.CreateFromAppIdentifier(); + _urlScheme = string.IsNullOrEmpty(config.UrlScheme) ? UrlSchemeFactory.CreateFromAppIdentifier() : config.UrlScheme; SetClientIds(config); #if UNITY_EDITOR From ad1a976ddf1d6fbd18c3524165ad3c8673572ff2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Thu, 16 Oct 2025 22:24:46 +0200 Subject: [PATCH 163/165] updates for increment --- .../Transactions/TransactionService.cs | 57 ++++++++++++++++--- .../EcosystemWallet/Wallet/SequenceWallet.cs | 6 +- .../EcosystemWallet/Wallet/SessionSigner.cs | 46 +++++++++++---- .../SequenceSDK/Relayer/SequenceRelayer.cs | 11 +--- 4 files changed, 91 insertions(+), 29 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs index e927f84d..43955aaa 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs @@ -1,11 +1,12 @@ +using System; +using System.Collections.Generic; using System.Numerics; using System.Threading.Tasks; +using Sequence.ABI; using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; -using Sequence.EcosystemWallet.Primitives.Common; using Sequence.EcosystemWallet.Utils; using Sequence.Utils; -using UnityEngine; namespace Sequence.EcosystemWallet { @@ -22,12 +23,12 @@ public TransactionService(SessionSigner[] sessionSigners, WalletState state) public async Task<(Address To, string Data)> SignAndBuild(Chain chain, Call[] calls, bool checkDeployed) { - var preparedIncrement = PrepareIncrement(null, 0, null); + var preparedIncrement = await PrepareIncrement(null, chain, calls); if (preparedIncrement != null) - calls.AddToArray(preparedIncrement); + calls = calls.Unshift(preparedIncrement); var envelope = PrepareTransaction(chain, calls); - + var signatureService = new SignatureService(_sessionSigners, _state.SessionsTopology); var signature = await signatureService.SignCalls(chain, _state.SessionsImageHash, envelope, _state.ConfigUpdates); @@ -59,10 +60,50 @@ public TransactionService(SessionSigner[] sessionSigners, WalletState state) }).Encode().ByteArrayToHexStringWithPrefix()); } - private Call PrepareIncrement(Address wallet, BigInteger chainId, Calls calls) + private async Task PrepareIncrement(Address wallet, Chain chain, Call[] calls) { - // TODO: Integrate increments - return null; + var signers = await new SignerService(_sessionSigners, _state.SessionsTopology).FindSignersForCalls( + chain, calls); + + var signersToCallsMap = new Dictionary>(); + for (var i = 0; i < signers.Length; i++) + { + var signer = signers[i]; + if (signersToCallsMap.ContainsKey(signer)) + signersToCallsMap[signer].Add(calls[i]); + else + signersToCallsMap[signer] = new List { calls[i] }; + } + + var increments = new List(); + foreach (var kvPair in signersToCallsMap) + { + var increment = kvPair.Key.PrepareIncrements(kvPair.Value.ToArray()); + if (increment != null) + increments.Add(increment); + } + + if (increments.Count == 0) + return null; + + for (var i = 0; i < calls.Length; i++) + { + if (!signers[i].IsExplicit) + continue; + + signers[i].PrepareIncrements(calls); + } + + var args = new List>(); + for (var i = 0; i < increments.Count; i++) + { + args.Add(new Tuple( + new FixedByte(32, increments[i].UsageHash.HexStringToByteArray()), + increments[i].UsageAmount)); + } + + var incrementData = ABI.ABI.Pack("incrementUsageLimit((bytes32,uint256)[])", args); + return new Call(ExtensionsFactory.Current.Sessions, 0, incrementData.HexStringToByteArray()); } private Envelope PrepareTransaction(Chain chain, Call[] calls) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs index 7db4f37f..8b5ed4f0 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs @@ -120,9 +120,11 @@ public async Task SendTransaction(Chain chain, ITransaction[] transactio if (feeOption != null) { + var feeAddress = feeOption.token.contractAddress; + var isNative = feeAddress == null || feeAddress.Equals(Address.ZeroAddress); + var feeOptionService = new FeeOptionService(feeOption); - var isNativeTokenOption = feeOption.token.contractAddress.Equals(Address.ZeroAddress); - var feeOptionCall = isNativeTokenOption + var feeOptionCall = isNative ? feeOptionService.BuildCallForNativeTokenOption() : feeOptionService.BuildCallForCustomTokenOption(); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs index 186980d3..1211bb27 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs @@ -13,6 +13,12 @@ namespace Sequence.EcosystemWallet { + internal class UsageLimit + { + public string UsageHash; + public BigInteger UsageAmount; + } + internal class SessionSigner { public struct CallContractData @@ -63,12 +69,8 @@ public async Task IsSupportedCall(Call call, Chain chain, SessionsTopology if (Chain != chain) return false; - if (call.data.Length > 4 && - ByteArrayExtensions.Slice(call.data, 0, 4).ByteArrayToHexStringWithPrefix() == - ABI.ABI.FunctionSelector("incrementUsageLimit((bytes32,uint256)[])")) - { + if (CheckCallForIncrementUsageLimit(call)) return true; - } var supportedPermission = FindSupportedPermission(call, topology); return supportedPermission.Index >= 0; @@ -118,8 +120,7 @@ public SessionCallSignature SignCall(Chain chain, Call call, int callIdx, Sessio if (IsExplicit) { var permissionIndex = 0; - if (!(call.data.Length > 4 && call.data.Slice(4).ByteArrayToHexStringWithPrefix() == - ABI.ABI.FunctionSelector("incrementUsageLimit"))) + if (!CheckCallForIncrementUsageLimit(call)) { permissionIndex = FindSupportedPermission(call, topology).Index; if (permissionIndex == -1) @@ -141,6 +142,31 @@ public SessionCallSignature SignCall(Chain chain, Call call, int callIdx, Sessio }; } + public UsageLimit PrepareIncrements(Call[] calls) + { + BigInteger valueUsed = 0; + foreach (var call in calls) + { + valueUsed += call.value; + } + + if (valueUsed == 0) + return null; + + return new UsageLimit + { + UsageHash = GetValueUsageHash().ByteArrayToHexStringWithPrefix(), + UsageAmount = valueUsed + }; + } + + private bool CheckCallForIncrementUsageLimit(Call call) + { + return call.data.Length > 4 && + ByteArrayExtensions.Slice(call.data, 0, 4).ByteArrayToHexStringWithPrefix() == + ABI.ABI.FunctionSelector("incrementUsageLimit((bytes32,uint256)[])"); + } + private byte[] HashCallWithReplayProtection(Chain chain, Call call, BigInteger callIdx, BigInteger space, BigInteger nonce) { var chainBytes = BigInteger.Parse(chain.GetChainId()).ByteArrayFromNumber(32); @@ -210,7 +236,7 @@ private async Task GetCurrentUsageLimit(Chain chain) to = ExtensionsFactory.Current.Sessions, data = ABI.ABI.Pack("getLimitUsage(address,bytes32)", ParentAddress, - new FixedByte(32, GetValueUsageHash(Address, "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"))) + new FixedByte(32, GetValueUsageHash())) } }); @@ -219,12 +245,12 @@ private async Task GetCurrentUsageLimit(Chain chain) Debug.Log($"GetCurrentUsageLimit: {usageLimit}"); } - private byte[] GetValueUsageHash(Address signerAddress, string valueTrackingAddress) + private byte[] GetValueUsageHash() { var encoder = new ParametersEncoder(); var encoded = encoder.EncodeParameters( new Parameter[] { new Parameter("address"), new Parameter("address") }, - new object[] { signerAddress.Value, valueTrackingAddress } + new object[] { Address.Value, "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" } ); return SequenceCoder.KeccakHash(encoded); diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs index f6466cb0..b317c195 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs @@ -14,15 +14,8 @@ public class SequenceRelayer : IRelayer public SequenceRelayer(Chain chain) { - var name = chain switch - { - Chain.Optimism => "v3-optimism", - Chain.ArbitrumOne => "v3-arbitrum", - Chain.TestnetArbitrumSepolia => "v3-arbitrum-sepolia", - _ => throw new NotSupportedException($"Chain {chain} not supported.") - }; - - var relayerUrl = $"https://{name}-relayer.sequence.app/rpc/Relayer"; + var path = ChainDictionaries.PathOf[chain]; + var relayerUrl = $"https://dev-{path}-relayer.sequence.app/rpc/Relayer"; _httpClient = new HttpClient(relayerUrl); } From 11eacf8bd4e0dc89640b5244c50c397fb01c9041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Fri, 17 Oct 2025 14:57:51 +0200 Subject: [PATCH 164/165] fixes for native token fee options --- .../Transactions/TransactionService.cs | 17 +++++++------ .../EcosystemWallet/Wallet/SessionSigner.cs | 24 ++++++++++++++----- .../Ethereum/ABI/Coders/TupleCoder.cs | 12 ++++++---- 3 files changed, 34 insertions(+), 19 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs index 43955aaa..74c2ee35 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs @@ -2,11 +2,14 @@ using System.Collections.Generic; using System.Numerics; using System.Threading.Tasks; +using Nethereum.ABI.FunctionEncoding; +using Nethereum.ABI.Model; using Sequence.ABI; using Sequence.EcosystemWallet.Envelope; using Sequence.EcosystemWallet.Primitives; using Sequence.EcosystemWallet.Utils; using Sequence.Utils; +using UnityEngine; namespace Sequence.EcosystemWallet { @@ -78,7 +81,11 @@ private async Task PrepareIncrement(Address wallet, Chain chain, Call[] ca var increments = new List(); foreach (var kvPair in signersToCallsMap) { - var increment = kvPair.Key.PrepareIncrements(kvPair.Value.ToArray()); + if (!kvPair.Key.IsExplicit) + continue; + + var increment = await kvPair.Key.PrepareIncrements(chain, kvPair.Value.ToArray(), _state.SessionsTopology); + Debug.Log($"Increment {increment?.UsageHash}, {increment?.UsageAmount}"); if (increment != null) increments.Add(increment); } @@ -86,14 +93,6 @@ private async Task PrepareIncrement(Address wallet, Chain chain, Call[] ca if (increments.Count == 0) return null; - for (var i = 0; i < calls.Length; i++) - { - if (!signers[i].IsExplicit) - continue; - - signers[i].PrepareIncrements(calls); - } - var args = new List>(); for (var i = 0; i < increments.Count; i++) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs index 1211bb27..974e0a81 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs @@ -104,6 +104,7 @@ public async Task IsSupportedCall(Call call, Chain chain, SessionsTopology if (permissionIndex < 0) return (-1, null); + Debug.Log($"permissionIndex {permissionIndex}"); return (permissionIndex, sessionPermissions.permissions[permissionIndex]); } @@ -142,26 +143,35 @@ public SessionCallSignature SignCall(Chain chain, Call call, int callIdx, Sessio }; } - public UsageLimit PrepareIncrements(Call[] calls) + public async Task PrepareIncrements(Chain chain, Call[] calls, SessionsTopology topology) { - BigInteger valueUsed = 0; + var usageValueHash = GetValueUsageHash(); + var currentUsage = await GetCurrentUsageLimit(chain, usageValueHash); + + BigInteger valueUsed = currentUsage; foreach (var call in calls) { + var permission = FindSupportedPermission(call, topology); + if (permission.Index < 0) + continue; + valueUsed += call.value; } + return null; if (valueUsed == 0) return null; return new UsageLimit { - UsageHash = GetValueUsageHash().ByteArrayToHexStringWithPrefix(), + UsageHash = usageValueHash.ByteArrayToHexStringWithPrefix(), UsageAmount = valueUsed }; } private bool CheckCallForIncrementUsageLimit(Call call) { + Debug.Log($"{ABI.ABI.FunctionSelector("incrementUsageLimit((bytes32,uint256)[])")}"); return call.data.Length > 4 && ByteArrayExtensions.Slice(call.data, 0, 4).ByteArrayToHexStringWithPrefix() == ABI.ABI.FunctionSelector("incrementUsageLimit((bytes32,uint256)[])"); @@ -228,7 +238,7 @@ private string GenerateImplicitRequestMagic(Address address, Attestation attesta .ByteArrayToHexStringWithPrefix(); } - private async Task GetCurrentUsageLimit(Chain chain) + private async Task GetCurrentUsageLimit(Chain chain, byte[] valueUsageHash) { var response = await new SequenceEthClient(chain).CallContract(new object[] { new CallContractData @@ -236,13 +246,15 @@ private async Task GetCurrentUsageLimit(Chain chain) to = ExtensionsFactory.Current.Sessions, data = ABI.ABI.Pack("getLimitUsage(address,bytes32)", ParentAddress, - new FixedByte(32, GetValueUsageHash())) + new FixedByte(32, valueUsageHash)) } }); var usageLimit = ABI.ABI.Decode(response, "uint256"); Debug.Log($"GetCurrentUsageLimit: {usageLimit}"); + + return usageLimit; } private byte[] GetValueUsageHash() @@ -252,7 +264,7 @@ private byte[] GetValueUsageHash() new Parameter[] { new Parameter("address"), new Parameter("address") }, new object[] { Address.Value, "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" } ); - + return SequenceCoder.KeccakHash(encoded); } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs index c79dbca6..fe94d543 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs @@ -43,7 +43,7 @@ public byte[] Encode(object value) throw new System.NotImplementedException(); } - public string EncodeToString(object value, string[] evmTypes) + public string EncodeToString(object value, string[] evmTypes, bool parentIsArray = false) { if (evmTypes == null) { @@ -126,17 +126,21 @@ public string EncodeToString(object value, string[] evmTypes) string numberCountEncoded = _numberCoder.EncodeToString(numberCount); tail_i = numberCountEncoded + EncodeToString(valueTuple[i], - ArrayUtils.BuildArrayWithRepeatedValue(ABI.GetUnderlyingCollectionTypeName(evmTypes[i]), numberCount)); + ArrayUtils.BuildArrayWithRepeatedValue(ABI.GetUnderlyingCollectionTypeName(evmTypes[i]), numberCount),true); + + Debug.Log($"DYNAMICARRAY tail_i {tail_i} head_i {head_i}"); break; case ABIType.FIXEDARRAY: numberCount = ABI.GetInnerValue(evmTypes[i]); head_i = EncodeToString(valueTuple[i], - ArrayUtils.BuildArrayWithRepeatedValue(ABI.GetUnderlyingCollectionTypeName(evmTypes[i]), numberCount)); + ArrayUtils.BuildArrayWithRepeatedValue(ABI.GetUnderlyingCollectionTypeName(evmTypes[i]), numberCount), true); break; case ABIType.TUPLE: - head_i = _numberCoder.EncodeToString((object)(headerTotalByteLength + tailLength)); + head_i = parentIsArray ? "" : _numberCoder.EncodeToString((object)(headerTotalByteLength + tailLength)); tail_i = EncodeToString(valueTuple[i], ABI.GetTupleTypes(evmTypes[i])); + + Debug.Log($"TUPLE tail_i {tail_i} head_i {head_i}"); break; case ABIType.NONE: throw new ArgumentException( From 18632731f1df4d35e0666481d258a9e0a37a0d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gr=C3=BCning?= Date: Mon, 20 Oct 2025 14:33:47 +0200 Subject: [PATCH 165/165] reverting some logs --- .../SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs | 1 - .../Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs | 4 ---- 2 files changed, 5 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs index 974e0a81..d126c800 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs @@ -158,7 +158,6 @@ public async Task PrepareIncrements(Chain chain, Call[] calls, Sessi valueUsed += call.value; } - return null; if (valueUsed == 0) return null; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs index fe94d543..69ded30f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/TupleCoder.cs @@ -128,8 +128,6 @@ public string EncodeToString(object value, string[] evmTypes, bool parentIsArray tail_i = numberCountEncoded + EncodeToString(valueTuple[i], ArrayUtils.BuildArrayWithRepeatedValue(ABI.GetUnderlyingCollectionTypeName(evmTypes[i]), numberCount),true); - Debug.Log($"DYNAMICARRAY tail_i {tail_i} head_i {head_i}"); - break; case ABIType.FIXEDARRAY: numberCount = ABI.GetInnerValue(evmTypes[i]); @@ -139,8 +137,6 @@ public string EncodeToString(object value, string[] evmTypes, bool parentIsArray case ABIType.TUPLE: head_i = parentIsArray ? "" : _numberCoder.EncodeToString((object)(headerTotalByteLength + tailLength)); tail_i = EncodeToString(valueTuple[i], ABI.GetTupleTypes(evmTypes[i])); - - Debug.Log($"TUPLE tail_i {tail_i} head_i {head_i}"); break; case ABIType.NONE: throw new ArgumentException(