diff --git a/.gitignore b/.gitignore index ed8edee24..66b8acd00 100644 --- a/.gitignore +++ b/.gitignore @@ -122,5 +122,4 @@ Assets/SequenceSDK/WaaS/Tests/Resources/ # Foundry /testchain/lib -/testchain/artifacts/* diff --git a/Assets/Plugins/Android/AndroidManifest.xml b/Assets/Plugins/Android/AndroidManifest.xml index be55bd8f1..e87a17267 100644 --- a/Assets/Plugins/Android/AndroidManifest.xml +++ b/Assets/Plugins/Android/AndroidManifest.xml @@ -1,24 +1,30 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Assets/Plugins/Android/gradleTemplate.properties b/Assets/Plugins/Android/gradleTemplate.properties index 4092513ed..d2decbf3a 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 388db62c1..a7953128d 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/Assets/SequenceSDK/EcosystemWallet.meta b/Assets/SequenceSDK/EcosystemWallet.meta new file mode 100644 index 000000000..7482c3a91 --- /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 000000000..d476b25fc --- /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/AddressTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/AddressTests.cs new file mode 100644 index 000000000..c95902f3a --- /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 000000000..132c902e6 --- /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/ConfigTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs new file mode 100644 index 000000000..fde078e73 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/ConfigTests.cs @@ -0,0 +1,54 @@ +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"]; + + 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 = BigInteger.Parse(checkpoint), + topology = Topology.FromLeaves(Topology.ParseContentToLeafs(content)), + checkpointer = checkpointer + }; + + return Task.FromResult(JsonConvert.SerializeObject(config)); + } + + public Task ConfigEncode(Dictionary parameters) + { + 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 = Primitives.Config.FromJson(input); + var imageHash = config.HashConfiguration().ByteArrayToHexStringWithPrefix(); + return Task.FromResult(imageHash); + } + } +} \ 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 000000000..0c901dada --- /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 000000000..4590ebb4b --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Newtonsoft.Json; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public class DevToolsTest + { + public Task DevToolsRandomConfig(Dictionary parameters) + { + 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 + }; + + return Task.FromResult(JsonConvert.SerializeObject(DevTools.CreateRandomConfig(maxDepth, options))); + } + + public Task DevToolsRandomSessionTopology(Dictionary parameters) + { + 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/DevToolsTest.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/DevToolsTest.cs.meta new file mode 100644 index 000000000..3a0c6a188 --- /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/PasskeysTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PasskeysTests.cs new file mode 100644 index 000000000..908a29124 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PasskeysTests.cs @@ -0,0 +1,60 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Sequence.EcosystemWallet.Primitives.Passkeys; +using UnityEngine; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public class PasskeysTests + { + public Task EncodeSignature(Dictionary parameters) + { + 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) + { + throw new System.NotImplementedException(); + } + + public Task ComputeRoot(Dictionary parameters) + { + 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) + { + 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 000000000..126bdc2a7 --- /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/PayloadTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs new file mode 100644 index 000000000..9145e145c --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/PayloadTests.cs @@ -0,0 +1,95 @@ +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 = parameters.TryGetValue("wallet", out var walletValue) && walletValue is string walletStr + ? new Address(walletStr) + : null; + string result = DoConvertToPacked(inputPayload, wallet); + return result; + } + + private string DoConvertToPacked(string payload, Address wallet) + { + Parented decodedPayload = Decode(payload); + + if (decodedPayload.payload.isCalls) + { + byte[] packed = ((Calls)decodedPayload.payload).Encode(wallet); + string packedHex = packed.ByteArrayToHexStringWithPrefix(); + return packedHex; + } + + 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"]); + string chainId = (string)parameters["chainId"]; + string result = DoHash(inputPayload, wallet, chainId); + return result; + } + + 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 + { + 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"); + } + + return decodedPayload; + } + } +} \ 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 000000000..b020aeed3 --- /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 000000000..16dba55c3 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md @@ -0,0 +1,11 @@ +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 diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/README.md.meta new file mode 100644 index 000000000..92af114eb --- /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/RecoveryTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs new file mode 100644 index 000000000..d39c112d6 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/RecoveryTests.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +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(); + var topology = RecoveryTopology.FromLeaves(leaves); + + return Task.FromResult(topology.Hash(true)); + } + + public Task Encode(Dictionary parameters) + { + 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) + { + 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) + { + var encodedStr = (string)parameters["encoded"]; + var encoded = encodedStr.HexStringToByteArray(); + var decoded = RecoveryTopology.Decode(encoded); + + return Task.FromResult(decoded.Hash(true)); + } + } +} \ 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 000000000..dcccc8f2e --- /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.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server.meta new file mode 100644 index 000000000..f218a4565 --- /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 000000000..11ead337f --- /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 000000000..df4822dc6 --- /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 000000000..327412c8a --- /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 000000000..d70441e0f --- /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 000000000..08677f374 --- /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 000000000..2b3c37d84 --- /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 000000000..f2236d582 --- /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 000000000..a6f0bb2c2 --- /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 000000000..621c8b83a --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/Server/Server.cs @@ -0,0 +1,334 @@ +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 + ["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), + // 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), + ["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), + // 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( + 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($"Processing request: method={method} id={id} payload={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($"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($"Error response: {(debug ? JsonConvert.SerializeObject(error) : error.error.message)}"); + } + return error; + } + + try + { + Dictionary methodParams; + 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"); + } + + var result = await Methods[method](methodParams); + JsonRpcSuccessResponse response = new JsonRpcSuccessResponse(result, id); + if (!silent) + { + Debug.Log($"Response details for Method={method}: " + JsonConvert.SerializeObject(response, Formatting.Indented) + $", Params used = {JsonConvert.SerializeObject(methodParams)}"); + } + return response; + } + catch (Exception ex) + { + JsonRpcErrorResponse error = new JsonRpcErrorResponse(new JsonRpcErrorResponse.Error(-32000, $"Unknown error: {ex.Message}"), id); + if (!silent) + { + Debug.LogError($"Error response: {(debug ? JsonConvert.SerializeObject(error) : error.error.message)} {ex.StackTrace}"); + } + 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 000000000..da70dbee3 --- /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/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs new file mode 100644 index 000000000..f2f574990 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs @@ -0,0 +1,115 @@ +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; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public class SessionsTest + { + public Task SessionEmpty(Dictionary parameters) + { + var identitySigner = (string)parameters["identitySigner"]; + var topology = SessionsUtils.CreateSessionsTopologyWithSingleIdentity(identitySigner); + + return Task.FromResult(topology.JsonSerialize()); + } + + public Task SessionEncodeTopology(Dictionary parameters) + { + var topologyJson = parameters["sessionTopology"].ToString(); + var topology = SessionsTopology.FromJson(topologyJson); + var encoded = topology.Encode().ByteArrayToHexStringWithPrefix(); + + return Task.FromResult(encoded); + } + + public Task SessionEncodeCallSignatures(Dictionary parameters) + { + var sessionTopologyJson = parameters["sessionTopology"].ToString(); + + 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(); + + 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) + { + var sessionTopologyJson = parameters["sessionTopology"].ToString(); + var topology = SessionsTopology.FromJson(sessionTopologyJson); + + return Task.FromResult(topology.ImageHash()); + } + + public Task SessionExplicitAdd(Dictionary parameters) + { + var explicitSessionJson = parameters["explicitSession"].ToString(); + var sessionTopologyJson = parameters["sessionTopology"].ToString(); + + var explicitSession = SessionPermissions.FromJson(explicitSessionJson); + var sessionTopology = SessionsTopology.FromJson(sessionTopologyJson); + + var existingPermission = sessionTopology.FindLeaf(leaf => + leaf.permissions.sessionAddress.Equals(explicitSession.sessionAddress)); + + if (existingPermission != null) + throw new Exception("Session already exists."); + + var newTopology = sessionTopology.AddExplicitSession(explicitSession); + 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"]); + var sessionTopology = SessionsTopology.FromJson(parameters["sessionTopology"].ToString()); + var newTopology = sessionTopology.RemoveExplicitSession(explicitSessionAddress); + + return Task.FromResult(newTopology.JsonSerialize()); + } + + public Task SessionImplicitAddBlacklistAddress(Dictionary parameters) + { + 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()); + } + + /// + /// This test is not yet used during the tests with forge. + /// + /// + /// + public Task SessionImplicitRemoveBlacklistAddress(Dictionary parameters) + { + 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/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs.meta b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SessionsTest.cs.meta new file mode 100644 index 000000000..bae40abc1 --- /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 diff --git a/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs new file mode 100644 index 000000000..c3e1690a8 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/IntegrationTests/SignatureTests.cs @@ -0,0 +1,46 @@ +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; +using UnityEngine; + +namespace Sequence.EcosystemWallet.IntegrationTests +{ + public class SignatureTests + { + public Task SignatureEncode(Dictionary parameters) + { + var input = parameters["input"].ToString(); + var signatures = parameters["signatures"].ToString(); + 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, noChainId, checkpointerData)); + } + + public Task SignatureDecode(Dictionary parameters) + { + var encodedSignature = parameters["signature"].ToString().HexStringToByteArray(); + var signature = RawSignature.Decode(encodedSignature); + + return Task.FromResult(signature.ToJson()); + } + + public Task SignatureConcat(Dictionary parameters) + { + 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()); + } + } +} \ 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 000000000..3813916d6 --- /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/SequenceEcosystemWalletTests.asmdef b/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef new file mode 100644 index 000000000..e6937e589 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef @@ -0,0 +1,33 @@ +{ + "name": "SequenceEcosystemWalletTests", + "rootNamespace": "Sequence.EcosystemWallet.Tests", + "references": [ + "GUID:68e161619428e430bba22d7d0a9548ab", + "GUID:f7fd4ba36aabd1d499450c174865e70b", + "GUID:8cb4ab25ee18e4b4da9647cf481addbb", + "GUID:f78a27d6a73d94c4baf04337e0add4dc", + "GUID:6055be8ebefd69e48b49212b09b47b2f", + "GUID:a35e3a53d4439435f8b36ed2c6158cd8", + "GUID:403077141e1554429a890cbc129df651", + "GUID:b4f9c0f8f363f439b9e337f79050f189", + "GUID:0acc523941302664db1f4e527237feb3", + "GUID:27619889b8ba8c24980f49ee34dbb44a", + "GUID:94b67778c44684afdab21990eebf60aa" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "Newtonsoft.Json.dll", + "Nethereum.ABI.dll" + ], + "autoReferenced": true, + "defineConstraints": [ + "UNITY_INCLUDE_TESTS" + ], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef.meta b/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef.meta new file mode 100644 index 000000000..e5de612bf --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/SequenceEcosystemWalletTests.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d506ba740fcbc4d988cc4753228a08f2 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests.meta new file mode 100644 index 000000000..75475be30 --- /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/AuthenticationTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs new file mode 100644 index 000000000..5548cbaa9 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/AuthenticationTests.cs @@ -0,0 +1,82 @@ +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 +{ + public class AuthenticationTests + { + private static readonly Chain Chain = Chain.TestnetArbitrumSepolia; + + [Test] + public void Disconnect() + { + SequenceWallet.RecoverFromStorage().Disconnect(); + } + + [Test] + 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(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, + new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "explicitEmit()")); + } + + [Test] + public async Task CallSafeMint() + { + var wallet = SequenceWallet.RecoverFromStorage(); + await wallet.SendTransaction(Chain, + new Transaction(new Address("0xd25b37e2fb07f85e9eca9d40fe3bcf60ba2dc57b"), 0, "safeMint(address)", wallet.Address)); + } + + [Test] + public async Task AddUnrestrictiveExplicitSession() + { + var wallet = SequenceWallet.RecoverFromStorage(); + await wallet.AddSession(new ContractPermission(Chain, new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, 0)); + } + + [Test] + public async Task AddRestrictiveExplicitSession() + { + var wallet = SequenceWallet.RecoverFromStorage(); + await wallet.AddSession(new ContractPermission(Chain, new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, 0)); + } + } +} \ 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 000000000..87a8b46f3 --- /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/CallsPackingTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/CallsPackingTests.cs new file mode 100644 index 000000000..ee19b2ed8 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/CallsPackingTests.cs @@ -0,0 +1,57 @@ +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 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.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(new Address("0x5615deb798bb3e4dfa0139dfa1b3d433cc23b72f")); + 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 000000000..89a69f00d --- /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/ConfigSignatureTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs new file mode 100644 index 000000000..86530efc0 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs @@ -0,0 +1,90 @@ +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; +using UnityEngine; + +namespace Sequence.EcosystemWallet.UnitTests +{ + public class ConfigSignatureTests + { + [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>(json); + var input = parameters["input"].ToString(); + var config = Primitives.Config.FromJson(input); + + var signatures = parameters["signatures"].ToString(); + 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, noChainId, checkpointerData); + 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); + } + + [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>(json); + + 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()}"); + + 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/UnitTests/ConfigSignatureTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/ConfigSignatureTests.cs.meta new file mode 100644 index 000000000..35e923873 --- /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/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs new file mode 100644 index 000000000..518bc860c --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/NethereumConversionTests.cs @@ -0,0 +1,443 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using System.Text; +using NUnit.Framework; +using Sequence.ABI; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; +using UnityEngine; +using Nethereum.ABI.EIP712; + +namespace Sequence.EcosystemWallet.UnitTests +{ + // AI generated, but can be useful for debugging + public class NethereumConversionTests + { + private Address[] _testAddressArray = new Address[] + { + new Address("0x04b8b03dba0d960415ce5177accf9d399ed852eb"), + new Address("0xb4cb75becc7d6c25a8815d3a31d997105772d12b"), + new Address("0x6aa42b1d0f63dae3a5bf785101c2d2bf26679463") + }; + + [TestCase("0x7b22646f6d61696e223a7b226e616d65223a2253657175656e63652057616c6c6574222c2276657273696f6e223a2233222c22636861696e4964223a3432313631342c22766572696679696e67436f6e7472616374223a22307862643766333862393433343532653063313464376261393262396235303461396339666333353138227d2c227479706573223a7b2243616c6c73223a5b7b226e616d65223a2263616c6c73222c2274797065223a2243616c6c5b5d227d2c7b226e616d65223a227370616365222c2274797065223a2275696e74323536227d2c7b226e616d65223a226e6f6e6365222c2274797065223a2275696e74323536227d2c7b226e616d65223a2277616c6c657473222c2274797065223a22616464726573735b5d227d5d2c2243616c6c223a5b7b226e616d65223a22746f222c2274797065223a2261646472657373227d2c7b226e616d65223a2276616c7565222c2274797065223a2275696e74323536227d2c7b226e616d65223a2264617461222c2274797065223a226279746573227d2c7b226e616d65223a226761734c696d6974222c2274797065223a2275696e74323536227d2c7b226e616d65223a2264656c656761746543616c6c222c2274797065223a22626f6f6c227d2c7b226e616d65223a226f6e6c7946616c6c6261636b222c2274797065223a22626f6f6c227d2c7b226e616d65223a226265686176696f724f6e4572726f72222c2274797065223a2275696e74323536227d5d7d2c227072696d61727954797065223a2243616c6c73222c226d657373616765223a7b227370616365223a2230222c226e6f6e6365223a223139222c2277616c6c657473223a5b5d2c2263616c6c73223a5b7b226761734c696d6974223a302c2264656c656761746543616c6c223a66616c73652c2264617461223a2230783063303334306663222c226f6e6c7946616c6c6261636b223a66616c73652c22746f223a22307833333938356433323038303945323632373461373245303332363863386132393932374263366441222c2276616c7565223a302c226265686176696f724f6e4572726f72223a317d5d7d7d")] + [TestCase("0x7b22646f6d61696e223a7b226e616d65223a2253657175656e63652057616c6c6574222c2276657273696f6e223a2233222c22636861696e4964223a3432313631342c22766572696679696e67436f6e7472616374223a22307862643766333862393433343532653063313464376261393262396235303461396339666333353138227d2c226d657373616765223a7b2263616c6c73223a5b7b22746f223a22307830303030303030303030434335383831306333334633613044373861413145643830466144634438222c2276616c7565223a2230222c2264617461223a223078343264653134313830303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303230303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030316566333838663933306436663664306163376365383861363962363231653363663062303434643836383164616338613663646239643335303832343936396334306430393763333030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030222c226761734c696d6974223a2230222c2264656c656761746543616c6c223a66616c73652c226f6e6c7946616c6c6261636b223a66616c73652c226265686176696f724f6e4572726f72223a2231227d2c7b22746f223a22307844323562333745326642303766383545396563413964343046453342634636304241326463353762222c2276616c7565223a2230222c2264617461223a223078343064303937633330303030303030303030303030303030303030303030303062643766333862393433343532653063313464376261393262396235303461396339666333353138222c226761734c696d6974223a2230222c2264656c656761746543616c6c223a66616c73652c226f6e6c7946616c6c6261636b223a66616c73652c226265686176696f724f6e4572726f72223a2231227d5d2c227370616365223a2230222c226e6f6e6365223a223139222c2277616c6c657473223a5b5d7d2c227072696d61727954797065223a2243616c6c73222c227479706573223a7b2243616c6c73223a5b7b226e616d65223a2263616c6c73222c2274797065223a2243616c6c5b5d227d2c7b226e616d65223a227370616365222c2274797065223a2275696e74323536227d2c7b226e616d65223a226e6f6e6365222c2274797065223a2275696e74323536227d2c7b226e616d65223a2277616c6c657473222c2274797065223a22616464726573735b5d227d5d2c2243616c6c223a5b7b226e616d65223a22746f222c2274797065223a2261646472657373227d2c7b226e616d65223a2276616c7565222c2274797065223a2275696e74323536227d2c7b226e616d65223a2264617461222c2274797065223a226279746573227d2c7b226e616d65223a226761734c696d6974222c2274797065223a2275696e74323536227d2c7b226e616d65223a2264656c656761746543616c6c222c2274797065223a22626f6f6c227d2c7b226e616d65223a226f6e6c7946616c6c6261636b222c2274797065223a22626f6f6c227d2c7b226e616d65223a226265686176696f724f6e4572726f72222c2274797065223a2275696e74323536227d5d7d7d")] + 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"); + BigInteger chain = new BigInteger((int)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 the converter class directly + private TypedData CallConvertToNethereumTypedDataWithoutSalt(TypedDataToSign instance) + { + var converter = new ConvertTypedDataToSignToNethereum(instance); + return converter.ConvertToNethereumTypedDataWithoutSalt(); + } + + private TypedData CallConvertToNethereumTypedDataWithSalt(TypedDataToSign instance) + { + var converter = new ConvertTypedDataToSignToNethereum(instance); + return converter.ConvertToNethereumTypedDataWithSalt(); + } + + private MemberValue[] CallConvertMessageForNethereum(TypedDataToSign instance) + { + var converter = new ConvertTypedDataToSignToNethereum(instance); + return converter.ConvertMessageForNethereum(); + } + + // 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 000000000..c190cc295 --- /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/Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs new file mode 100644 index 000000000..2dce7d815 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/PasskeysUnitTests.cs @@ -0,0 +1,72 @@ +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\":\"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) + { + 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\":\"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) + { + 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}"); + } + } +} \ 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 000000000..c77239a3c --- /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/RawTransactionTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs new file mode 100644 index 000000000..bc489a02d --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs @@ -0,0 +1,72 @@ +using System; +using System.Linq; +using System.Numerics; +using System.Threading.Tasks; +using NUnit.Framework; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.UnitTests +{ + public class RawTransactionTests + { + private static readonly ITransaction[] ImplicitCalls = new [] + { + new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "implicitEmit()") + }; + + private static readonly ITransaction[] ExplicitCalls = new [] + { + new Transaction(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), 0, "explicitEmit()") + }; + + private static IWallet Wallet => SequenceWallet.RecoverFromStorage(); + + [Test] + public async Task AddPermissionForUsdcTransfer() + { + var deadline = new BigInteger(DateTimeOffset.UtcNow.ToUnixTimeSeconds() * 1000 + 1000 * 60 * 5000); + + var permissions = new Permissions(Chain.Optimism, + new ContractPermission(new Address("0x7F5c764cBc14f9669B88837ca1490cCa17c31607"), deadline, 1000000), + new ContractPermission(new Address("0x33985d320809E26274a72E03268c8a29927Bc6dA"), deadline, 0)); + + await Wallet.AddSession(permissions); + } + + [Test] + public async Task SendExplicitTransactionWithFeeOption() + { + 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(Chain.TestnetArbitrumSepolia, ImplicitCalls); + } + + [Test] + public async Task SendExplicitTransaction() + { + await Wallet.SendTransaction(Chain.TestnetArbitrumSepolia, ExplicitCalls); + } + + [Test] + public async Task GetFeeOptionsForImplicitCalls() + { + await Wallet.GetFeeOption(Chain.Optimism, ImplicitCalls); + } + + [Test] + public async Task GetFeeOptionsForExplicitCalls() + { + await Wallet.GetFeeOption(Chain.Optimism, ExplicitCalls); + } + } +} \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs.meta new file mode 100644 index 000000000..45fe7bb9e --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/RawTransactionTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 58a0fcc5a82c4662b74858c8630cf708 +timeCreated: 1754511079 \ 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 000000000..58c4bbbbd --- /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 000000000..9d711ffb0 --- /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/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs new file mode 100644 index 000000000..397a85fd4 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SessionsUnitTests.cs @@ -0,0 +1,113 @@ +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +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()); + } + + [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 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) + { + 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("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) + { + var input = JsonConvert.DeserializeObject>(inputJson); + 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); + var encodedSignatures = SessionCallSignature.EncodeSignatures(signatures, sessionsTopology, explicitSigners, implicitSigners); + + 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}"); + } + + [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); + Debug.Log($"Sequence Address: {address}"); + } + } +} \ 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 000000000..dd24de757 --- /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/UnitTests/SolidityDecodedTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs new file mode 100644 index 000000000..fb5330910 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/SolidityDecodedTests.cs @@ -0,0 +1,215 @@ +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 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() + { + 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 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() + { + 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 000000000..2007acbe3 --- /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/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs new file mode 100644 index 000000000..1bebe82f4 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs @@ -0,0 +1,231 @@ +using System.Collections.Generic; +using System.Numerics; +using NUnit.Framework; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +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() + { + 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); + } + + [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); + } + + [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); + } + + 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"), + (int)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/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs.meta b/Assets/SequenceSDK/EcosystemWallet/UnitTests/TypedDataToSignTests.cs.meta new file mode 100644 index 000000000..bbccdefa3 --- /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/Assets/SequenceSDK/EcosystemWallet/Utils.meta b/Assets/SequenceSDK/EcosystemWallet/Utils.meta new file mode 100644 index 000000000..7390b3ec1 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/Utils.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9f231ef218604f2bbd211b7963016a43 +timeCreated: 1750151204 \ No newline at end of file diff --git a/Assets/SequenceSDK/EcosystemWallet/Utils/DevTools.cs b/Assets/SequenceSDK/EcosystemWallet/Utils/DevTools.cs new file mode 100644 index 000000000..90bc6f329 --- /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 000000000..5fc6eedf7 --- /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/Utils/IntegrationTestParamsUtils.cs b/Assets/SequenceSDK/EcosystemWallet/Utils/IntegrationTestParamsUtils.cs new file mode 100644 index 000000000..95cf2c75f --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/Utils/IntegrationTestParamsUtils.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +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 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/Utils/IntegrationTestParamsUtils.cs.meta b/Assets/SequenceSDK/EcosystemWallet/Utils/IntegrationTestParamsUtils.cs.meta new file mode 100644 index 000000000..66d67d292 --- /dev/null +++ b/Assets/SequenceSDK/EcosystemWallet/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/Utils/SessionsUtils.cs b/Assets/SequenceSDK/EcosystemWallet/Utils/SessionsUtils.cs new file mode 100644 index 000000000..c5b80f5d4 --- /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 000000000..a32b96739 --- /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/Assets/SequenceSDK/Ethereum/Tests/DecodeABITests.cs b/Assets/SequenceSDK/Ethereum/Tests/DecodeABITests.cs index d05d8e006..4f99b3c27 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/Assets/SequenceSDK/Ethereum/Tests/OwnableTests.cs b/Assets/SequenceSDK/Ethereum/Tests/OwnableTests.cs index cc978b4ac..076e6b185 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) { diff --git a/Assets/SequenceSDK/WaaS/Tests/HttpClientTests.cs b/Assets/SequenceSDK/WaaS/Tests/HttpClientTests.cs deleted file mode 100644 index 2e3cd13ae..000000000 --- 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 0c17261cd..000000000 --- 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 c65b7ac65..d4d2cc237 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/Assets/StreamingAssets.meta b/Assets/StreamingAssets.meta new file mode 100644 index 000000000..80da033af --- /dev/null +++ b/Assets/StreamingAssets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fe779403b5ad2472aa19fc66bb32bf19 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WebGLTemplates/SequenceReactV3.meta b/Assets/WebGLTemplates/SequenceReactV3.meta new file mode 100644 index 000000000..8d27c1b67 --- /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 000000000..fa6c989d3 --- /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 000000000..be02735b4 --- /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 000000000..234683cd7 --- /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 000000000..0cab71274 --- /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 000000000..9c3de2677 --- /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 000000000..1daa49288 --- /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 000000000..ea2545031 --- /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 000000000..ef1a991f5 --- /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 000000000..3a1432c15 --- /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 000000000..1984c4279 --- /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 000000000..83a9a28c0 --- /dev/null +++ b/Assets/WebGLTemplates/SequenceReactV3/src/App.tsx @@ -0,0 +1,175 @@ +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"; + +let walletWindow: Window | null = null; +let authInput: AuthInput | null = null; + +interface AuthInput { + url: string; + action: string; + payload: string; +} + +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; + authInput = JSON.parse(inputJson) as AuthInput; + + const sessionId = generateId(); + walletWindow = window.open( + `${authInput?.url}?dappOrigin=${window.location.origin}&sessionId=${sessionId}`, + "Wallet", + 'width=600,height=600,left=300,top=300'); + + 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 = 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 = () => { + 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"; + } + + const generateId = (): string => { + return `${Date.now().toString(36)}-${Math.random() + .toString(36) + .substring(2, 9)}`; + } + + 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 000000000..a5553bd73 --- /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 000000000..6db435b1d --- /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 000000000..5403cc133 --- /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 000000000..3d7150da8 --- /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 000000000..008b5f2f2 --- /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 000000000..11f02fe2a --- /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 000000000..45d930194 --- /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 000000000..cb0d143c7 --- /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 000000000..111958687 --- /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 000000000..97ede7ee6 --- /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 000000000..2333985a5 --- /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 000000000..2531e09e9 --- /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 000000000..9888903cb --- /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/Makefile b/Makefile index 30b6c404b..8f27417fb 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/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs b/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs index 0032a83a1..7f82723fc 100644 --- a/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs +++ b/Packages/Sequence-Unity/Editor/CheckUrlScheme.cs @@ -7,6 +7,8 @@ using UnityEditor.Callbacks; using UnityEngine; using System.Collections.Generic; +using System.Xml; +using Sequence.Utils; #if UNITY_IOS || UNITY_STANDALONE_OSX using UnityEditor.iOS.Xcode; #endif @@ -16,14 +18,15 @@ namespace Sequence.Editor public class CheckUrlScheme : IPreprocessBuildWithReport { private static string _plistPath; - private static string _urlScheme; + private static string _pathToBuiltProject; + + private static string _urlScheme => GetUrlScheme(); [PostProcessBuild] public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProject) { - SequenceConfig config = SequenceConfig.GetConfig(SequenceService.None); - _urlScheme = config.UrlScheme; - + _pathToBuiltProject = pathToBuiltProject; + if (string.IsNullOrWhiteSpace(_urlScheme)) { Debug.LogWarning(SequenceConfig.MissingConfigError("Url Scheme").Message); @@ -46,80 +49,147 @@ public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProj private static void CheckPlistUrlScheme() { -#if UNITY_STANDALONE_OSX - PlistDocument plist = new PlistDocument(); +#if UNITY_IOS || UNITY_STANDALONE_OSX + var 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; - } - } - } + 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); + +#if UNITY_IOS + // 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 + #endif } public int callbackOrder => 0; public void OnPreprocessBuild(BuildReport report) { - SequenceConfig config = SequenceConfig.GetConfig(); - _urlScheme = config.UrlScheme; +#if UNITY_ANDROID + 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); + } + + // 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/Editor/Editor/SignInWithApplePostprocessor.cs b/Packages/Sequence-Unity/Editor/Editor/SignInWithApplePostprocessor.cs index 11e18e231..d9d8d184e 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/Editor/Sequence.Editor.asmdef b/Packages/Sequence-Unity/Editor/Sequence.Editor.asmdef index 76bbe3537..c4a04ed6a 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/Plugins/Android.meta b/Packages/Sequence-Unity/Plugins/Android.meta new file mode 100644 index 000000000..4a5d54824 --- /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/ChromeTabsPlugin.java b/Packages/Sequence-Unity/Plugins/Android/ChromeTabsPlugin.java new file mode 100644 index 000000000..1d1e0d2d8 --- /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 000000000..9005624e6 --- /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/Plugins/Android/DeeplinkHandler.java b/Packages/Sequence-Unity/Plugins/Android/DeeplinkHandler.java new file mode 100644 index 000000000..1b284f422 --- /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 000000000..6509ef007 --- /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/MacOS/libKeychainAccess.dylib b/Packages/Sequence-Unity/Plugins/MacOS/libKeychainAccess.dylib index d72dc8079..c992c8d1a 100755 Binary files a/Packages/Sequence-Unity/Plugins/MacOS/libKeychainAccess.dylib and b/Packages/Sequence-Unity/Plugins/MacOS/libKeychainAccess.dylib differ diff --git a/Packages/Sequence-Unity/Plugins/Nethereum.meta b/Packages/Sequence-Unity/Plugins/Nethereum.meta new file mode 100644 index 000000000..072a0135e --- /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/Nethereum.ABI.dll b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.ABI.dll new file mode 100644 index 000000000..b35d3fc61 Binary files /dev/null and b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.ABI.dll differ diff --git a/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.ABI.dll.meta b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.ABI.dll.meta new file mode 100644 index 000000000..38f6bea72 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Nethereum/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/Nethereum.Hex.dll b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Hex.dll new file mode 100644 index 000000000..1f9df2c4c Binary files /dev/null and b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Hex.dll differ diff --git a/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Hex.dll.meta b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Hex.dll.meta new file mode 100644 index 000000000..8fb790eaa --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Nethereum/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/Nethereum.RLP.dll b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.RLP.dll new file mode 100644 index 000000000..dda28ac62 Binary files /dev/null and b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.RLP.dll differ diff --git a/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.RLP.dll.meta b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.RLP.dll.meta new file mode 100644 index 000000000..a3d62c747 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Nethereum/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/Nethereum.Util.dll b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Util.dll new file mode 100644 index 000000000..74a48a3a5 Binary files /dev/null and b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Util.dll differ diff --git a/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Util.dll.meta b/Packages/Sequence-Unity/Plugins/Nethereum/Nethereum.Util.dll.meta new file mode 100644 index 000000000..82b504233 --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/Nethereum/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/Plugins/Nethereum/README.md b/Packages/Sequence-Unity/Plugins/Nethereum/README.md new file mode 100644 index 000000000..2744fb5f7 --- /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 000000000..3affc7bba --- /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 diff --git a/Packages/Sequence-Unity/Plugins/Web/SocialSignIn.jslib b/Packages/Sequence-Unity/Plugins/Web/SocialSignIn.jslib index ff2a90155..3ee180607 100644 --- a/Packages/Sequence-Unity/Plugins/Web/SocialSignIn.jslib +++ b/Packages/Sequence-Unity/Plugins/Web/SocialSignIn.jslib @@ -4,4 +4,14 @@ mergeInto(LibraryManager.library, { window.dispatchReactUnityEvent("GoogleSignIn", UTF8ToString(googleClientId), UTF8ToString(nonce)); }, + OpenWalletApp: function(url) { + 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/Plugins/iOS/ASWebAuth.mm b/Packages/Sequence-Unity/Plugins/iOS/ASWebAuth.mm new file mode 100644 index 000000000..72cb3b237 --- /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 000000000..ec134da89 --- /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/Plugins/iOS/NativeBrowserPlugin.mm b/Packages/Sequence-Unity/Plugins/iOS/NativeBrowserPlugin.mm new file mode 100644 index 000000000..b60b19f5b --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/iOS/NativeBrowserPlugin.mm @@ -0,0 +1,88 @@ +#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]; + + if (@available(iOS 11.0, *)) { + safariVC.dismissButtonStyle = SFSafariViewControllerDismissButtonStyleCancel; + } + + if (@available(iOS 13.0, *)) { + safariVC.modalInPresentation = YES; + } + + 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/NativeBrowserPlugin.mm.meta b/Packages/Sequence-Unity/Plugins/iOS/NativeBrowserPlugin.mm.meta new file mode 100644 index 000000000..dcaa03b8c --- /dev/null +++ b/Packages/Sequence-Unity/Plugins/iOS/NativeBrowserPlugin.mm.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 81a8fa9064fa4d219e7986b00d8a55c1 +timeCreated: 1752664568 \ No newline at end of file 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 000000000..3c44fab52 --- /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 000000000..74c96d507 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity @@ -0,0 +1,16703 @@ +%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.49641263, b: 0.57481724, 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: 3 + 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 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &5817570 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5817571} + - component: {fileID: 5817573} + - component: {fileID: 5817572} + m_Layer: 5 + m_Name: TitleText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5817571 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 1865608230} + 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!114 &5817572 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5817570} + 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: 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 &5817573 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5817570} + m_CullTransparentMesh: 1 +--- !u!1 &9715029 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9715030} + - component: {fileID: 9715034} + - component: {fileID: 9715033} + - component: {fileID: 9715032} + - component: {fileID: 9715031} + m_Layer: 5 + m_Name: CloseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &9715030 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 1030251669} + 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_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &9715031 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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 &9715032 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9715029} + 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: 9715033} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1865608231} + m_TargetAssemblyTypeName: Sequence.Boilerplates.EcosystemWalletProfile, 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 &9715033 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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.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 &9715034 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9715029} + 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_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 &56928012 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 56928013} + - component: {fileID: 56928015} + - component: {fileID: 56928014} + 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 &56928013 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 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: -155} + m_SizeDelta: {x: 210, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &56928014 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 56928012} + 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 &56928015 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 56928012} + m_CullTransparentMesh: 1 +--- !u!1 &89467940 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 89467941} + - component: {fileID: 89467943} + - component: {fileID: 89467942} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &89467941 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: [] + 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 &89467942 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 89467940} + 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 &89467943 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 89467940} + 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_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 &108717376 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 108717377} + - component: {fileID: 108717379} + - component: {fileID: 108717378} + 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 &108717377 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 1685000285} + 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 &108717378 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 108717376} + 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: 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: 108717376} + 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_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: 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 &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 + 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} + 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 &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 &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: 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: 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.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: 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.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: 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_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 &319937703 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 319937704} + m_Layer: 5 + m_Name: SignatureLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &319937704 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: + - {fileID: 2145386560} + - {fileID: 1477743772} + - {fileID: 491498808} + 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: -225} + m_SizeDelta: {x: 210, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !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: 1 +--- !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: 723431369} + - {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: 0, y: 0} + 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: 323220475} + 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 &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: 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 &323220480 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 323220475} + m_CullTransparentMesh: 1 +--- !u!114 &323220481 +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: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + 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: 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} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 330825195} + m_Layer: 5 + m_Name: WalletLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &330825195 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: + - {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: 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 +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_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 &391644458 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 391644459} + - component: {fileID: 391644461} + - component: {fileID: 391644460} + 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 &391644459 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: [] + 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: -10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &391644460 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 391644458} + 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 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 &391644461 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + 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 &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_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!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 + 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_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 &485743480 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 485743481} + - component: {fileID: 485743485} + - component: {fileID: 485743484} + - component: {fileID: 485743483} + - component: {fileID: 485743482} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &485743481 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: + - {fileID: 1993833655} + m_Father: {fileID: 805083868} + 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 &485743482 +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: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + 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 &485743485 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 485743480} + m_CullTransparentMesh: 1 +--- !u!1 &491498807 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 491498808} + - component: {fileID: 491498812} + - component: {fileID: 491498811} + - component: {fileID: 491498810} + - component: {fileID: 491498809} + m_Layer: 5 + m_Name: CopyButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &491498808 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 745017019} + m_Father: {fileID: 319937704} + 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 &491498809 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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 &491498810 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 491498807} + 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: 491498811} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1865608229} + m_TargetAssemblyTypeName: Sequence.Boilerplates.SequenceEcosystemWalletWindow, + SequenceExamples + m_MethodName: + 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 &491498811 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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.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 &491498812 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 491498807} + 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_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: 1 + 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.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: 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 &545395821 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 545395822} + - component: {fileID: 545395824} + - component: {fileID: 545395823} + 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 &545395822 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 2097849100} + 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 &545395823 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 545395821} + 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: Sponsored, without fee options. + 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 &545395824 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 545395821} + m_CullTransparentMesh: 1 +--- !u!1 &564597529 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - 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!224 &564597530 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -7, 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 + 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} + 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &659355501 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 659355502} + - component: {fileID: 659355506} + - component: {fileID: 659355505} + - component: {fileID: 659355504} + - component: {fileID: 659355503} + m_Layer: 5 + m_Name: SendButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &659355502 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: + - {fileID: 2030306415} + 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 &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: 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: 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: 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 &659355506 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 659355501} + m_CullTransparentMesh: 1 +--- !u!1 &683925399 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 683925400} + - component: {fileID: 683925401} + - component: {fileID: 683925402} + m_Layer: 5 + m_Name: Layout + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &683925400 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: + - {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, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -40} + m_SizeDelta: {x: 0, y: 240} + 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: 683925399} + 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: 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: 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} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 689232700} + - component: {fileID: 689232702} + - component: {fileID: 689232701} + 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 &689232700 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 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: -65} + m_SizeDelta: {x: 210, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &689232701 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 689232699} + 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 signers + 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 &689232702 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 689232699} + m_CullTransparentMesh: 1 +--- !u!1 &696230463 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 696230464} + - component: {fileID: 696230467} + - component: {fileID: 696230466} + - component: {fileID: 696230465} + m_Layer: 5 + m_Name: ExplicitEmitWithFeeButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &696230464 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 699969410} + - {fileID: 1762646611} + - {fileID: 1329197019} + - {fileID: 659355502} + - {fileID: 1870792378} + 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: 120, y: -150} + m_SizeDelta: {x: 210, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &696230465 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 696230463} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5fa388a969190426facba008de2b8c43, type: 3} + m_Name: + m_EditorClassIdentifier: + _chain: 10 + _allowTransactionThroughEcosystem: 0 + _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: 6440605247847260042} +--- !u!114 &696230466 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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.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 &696230467 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + 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: 185} + 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 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 699969410} + - component: {fileID: 699969412} + - component: {fileID: 699969411} + 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 &699969410 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 696230464} + 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 &699969411 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 699969409} + 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: explicitEmit() & fee (mainnet) + 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: 699969409} + 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_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: Explicit (Arb Sepolia) + m_Image: {fileID: 0} + - m_Text: Explicit + USDC (OP Mainnet) + 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 +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.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: 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 &723431368 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 723431369} + - component: {fileID: 723431371} + - component: {fileID: 723431370} + m_Layer: 5 + m_Name: Title Text (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &723431369 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 323220476} + 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: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &723431370 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 723431368} + 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: 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: 723431368} + m_CullTransparentMesh: 1 +--- !u!1 &745017018 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 745017019} + - component: {fileID: 745017021} + - component: {fileID: 745017020} + 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 &745017019 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: [] + m_Father: {fileID: 491498808} + 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 &745017020 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 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: 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: 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 +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: 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.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 &802456212 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 802456207} + m_CullTransparentMesh: 1 +--- !u!1 &805083867 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 805083868} + - component: {fileID: 805083872} + - component: {fileID: 805083871} + - component: {fileID: 805083870} + - component: {fileID: 805083869} + m_Layer: 5 + m_Name: MessageInput + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &805083868 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 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: -185} + m_SizeDelta: {x: 210, y: 30} + 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 +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: 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 &805083872 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 805083867} + m_CullTransparentMesh: 1 +--- !u!1 &812752710 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 812752711} + - component: {fileID: 812752713} + - component: {fileID: 812752712} + 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 &812752711 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 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: -10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &812752712 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 812752710} + 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 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: 812752710} + m_CullTransparentMesh: 1 +--- !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: 697728234} + 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_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 +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: 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: + 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: 865590367} + m_OnClick: + 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 +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: 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 &865590368 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 865590363} + 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 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 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: 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: 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: 874185234} + 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_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 &921594783 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 921594784} + - component: {fileID: 921594787} + - component: {fileID: 921594786} + - component: {fileID: 921594785} + m_Layer: 5 + m_Name: Loading + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + 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: 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: 1257239531} + 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!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 +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_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 &965900426 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 965900427} + - component: {fileID: 965900431} + - component: {fileID: 965900430} + - component: {fileID: 965900429} + - component: {fileID: 965900428} + m_Layer: 5 + m_Name: SendButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + 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: 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: 1060437062} + 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!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 +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: 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: 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 &965900431 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 965900426} + m_CullTransparentMesh: 1 +--- !u!1 &968326747 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 968326748} + - component: {fileID: 968326750} + - component: {fileID: 968326749} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &968326748 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 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 &968326749 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 968326747} + 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 &968326750 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 968326747} + m_CullTransparentMesh: 1 +--- !u!1 &1020405562 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1020405563} + - component: {fileID: 1020405566} + - component: {fileID: 1020405565} + - component: {fileID: 1020405564} + m_Layer: 5 + m_Name: OpenButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1020405563 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: + - {fileID: 1107543615} + 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: -35, y: 0} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1020405564 +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: 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!222 &1020405565 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1030251669} + - component: {fileID: 1030251671} + - component: {fileID: 1030251670} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1030251669 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: [] + m_Father: {fileID: 9715030} + 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 &1030251670 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1030251668} + 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 &1030251671 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1030251668} + 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} + - component: {fileID: 1050865743} + 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: 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: 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_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: 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: 286074021} + - {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} + _feeOptionWindow: {fileID: 286074022} +--- !u!1 &1060437061 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1060437062} + - component: {fileID: 1060437064} + - component: {fileID: 1060437063} + 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 &1060437062 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 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: -10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1060437063 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1060437061} + 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 &1060437064 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1060437061} + m_CullTransparentMesh: 1 +--- !u!1 &1067417226 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1067417227} + - component: {fileID: 1067417229} + - component: {fileID: 1067417228} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1067417227 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 865590364} + 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 &1067417228 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1067417226} + 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 &1067417229 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1067417226} + m_CullTransparentMesh: 1 +--- !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} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1102907216} + - component: {fileID: 1102907219} + - component: {fileID: 1102907218} + - component: {fileID: 1102907217} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1102907216 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 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 &1102907217 +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: 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, 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 &1102907219 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + 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 + 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_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 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: 1115529824} + m_CullTransparentMesh: 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_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} + 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} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1146219656} + - component: {fileID: 1146219663} + - component: {fileID: 1146219660} + - component: {fileID: 1146219659} + - component: {fileID: 1146219658} + - component: {fileID: 1146219657} + m_Layer: 5 + m_Name: Transactions + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + 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: 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: 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} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 240, y: 185} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1146219657 +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: 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: 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: 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: 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 &1146219660 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146219655} + m_CullTransparentMesh: 1 +--- !u!114 &1146219663 +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: 68370ec9959be4c67ab321f72b847f9d, type: 3} + m_Name: + m_EditorClassIdentifier: + _messagePopup: {fileID: 1397315415} + _transactionResult: {fileID: 6440605247847260042} + _transactionButtons: + - {fileID: 2097849102} + - {fileID: 1242786028} + - {fileID: 696230465} +--- !u!1 &1186454643 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1186454644} + - component: {fileID: 1186454646} + - component: {fileID: 1186454645} + 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 &1186454644 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 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: -5} + m_SizeDelta: {x: 210, y: 10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1186454645 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1186454643} + 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 &1186454646 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1186454643} + m_CullTransparentMesh: 1 +--- !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_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 &1235258471 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1235258472} + - component: {fileID: 1235258474} + - component: {fileID: 1235258473} + 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 &1235258472 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 215461110} + 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 &1235258473 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1235258471} + 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 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: 1235258471} + m_CullTransparentMesh: 1 +--- !u!1 &1242786026 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1242786027} + - component: {fileID: 1242786030} + - component: {fileID: 1242786029} + - component: {fileID: 1242786028} + m_Layer: 5 + m_Name: ExplicitEmitButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1242786027 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 2064835422} + - {fileID: 1374590915} + - {fileID: 215461110} + - {fileID: 965900427} + - {fileID: 921594784} + 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: 120, y: -105} + m_SizeDelta: {x: 210, 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: 1242786026} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5fa388a969190426facba008de2b8c43, type: 3} + m_Name: + m_EditorClassIdentifier: + _chain: 421614 + _allowTransactionThroughEcosystem: 0 + _useFeeOptions: 0 + _feeOptionAddress: [] + _transaction: + k__BackingField: 0x33985d320809E26274a72E03268c8a29927Bc6dA + k__BackingField: explicitEmit() + _loadingObject: {fileID: 921594783} + _sessionButtonObject: {fileID: 215461105} + _transactionButtonObject: {fileID: 965900426} + _messagePopup: {fileID: 1397315415} + _transactionResult: {fileID: 6440605247847260042} +--- !u!114 &1242786029 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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.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 &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 &1257239530 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1257239531} + - component: {fileID: 1257239533} + - component: {fileID: 1257239532} + 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 &1257239531 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 921594784} + 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 &1257239532 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1257239530} + 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: 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 &1257239533 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1257239530} + 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_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 &1274642102 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: [] + m_Father: {fileID: 1486293238} + 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 &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 &1280987657 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1280987658} + - component: {fileID: 1280987662} + - component: {fileID: 1280987661} + - component: {fileID: 1280987660} + - component: {fileID: 1280987659} + m_Layer: 5 + m_Name: SendButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1280987658 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: + - {fileID: 1560497914} + 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 &1280987659 +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: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + 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_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.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: 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: implicitEmit() (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: 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 &1299434848 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1299434845} + m_CullTransparentMesh: 1 +--- !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_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 &1305107876 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1305107877} + - component: {fileID: 1305107879} + - component: {fileID: 1305107878} + 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 &1305107877 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 1685000285} + 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 &1305107878 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1305107876} + 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: 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: 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 &1305107879 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1305107876} + m_CullTransparentMesh: 1 +--- !u!1 &1310990840 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1310990841} + - component: {fileID: 1310990845} + - component: {fileID: 1310990844} + - component: {fileID: 1310990843} + - component: {fileID: 1310990842} + m_Layer: 5 + m_Name: CloseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1310990841 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: + - {fileID: 968326748} + m_Father: {fileID: 836095706} + 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: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1310990842 +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: 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: 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 &1310990845 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1310990840} + m_CullTransparentMesh: 1 +--- !u!1 &1321288302 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1321288303} + - component: {fileID: 1321288305} + - component: {fileID: 1321288304} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1321288303 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 2016817959} + 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 &1321288304 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1321288302} + 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 &1321288305 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1321288302} + m_CullTransparentMesh: 1 +--- !u!1 &1329197014 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1329197019} + - component: {fileID: 1329197018} + - component: {fileID: 1329197017} + - component: {fileID: 1329197016} + - component: {fileID: 1329197015} + m_Layer: 5 + m_Name: SessionButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1329197015 +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: 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: 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: 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: 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 &1329197018 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1329197014} + m_CullTransparentMesh: 1 +--- !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} + 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_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 &1374590914 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1374590915} + - component: {fileID: 1374590917} + - component: {fileID: 1374590916} + 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 &1374590915 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: [] + m_Father: {fileID: 1242786027} + 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 &1374590916 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1374590914} + 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: Sponsored, without fee options. + 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: 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 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1407445814} + - component: {fileID: 1407445816} + - component: {fileID: 1407445815} + 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 &1407445814 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 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: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1407445815 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1407445813} + 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 &1407445816 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1407445813} + 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_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 &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: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1423415636 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 1870792378} + 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 &1423415637 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1423415635} + 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: 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 &1423415638 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1423415635} + m_CullTransparentMesh: 1 +--- !u!1 &1446444768 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1446444769} + - component: {fileID: 1446444771} + - component: {fileID: 1446444770} + 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 &1446444769 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 3495957624811024636} + 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 &1446444770 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 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 &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 &1477743771 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1477743772} + - component: {fileID: 1477743774} + - component: {fileID: 1477743773} + 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 &1477743772 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: [] + 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: -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: 1477743771} + 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 &1477743774 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: + 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_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_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} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1545678474} + - component: {fileID: 1545678478} + - component: {fileID: 1545678477} + - component: {fileID: 1545678476} + - component: {fileID: 1545678475} + m_Layer: 5 + m_Name: CopyButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1545678474 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 2061216282} + m_Father: {fileID: 330825195} + 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 &1545678475 +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: 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: + 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: 1545678477} + m_OnClick: + m_PersistentCalls: + 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_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_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_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 &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: 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: + 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.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: 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: 4} + 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: 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 +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: Select a fee option. + 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 &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 + 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.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: 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: 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: 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 &1861070393 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1861070389} + 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: 0 +--- !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 &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 + 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: explicitEmit() (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: 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 &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: 697728234} + 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: -60} + m_SizeDelta: {x: 210, 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 + _allowTransactionThroughEcosystem: 0 + _useFeeOptions: 0 + _feeOptionAddress: [] + _transaction: + k__BackingField: 0x33985d320809E26274a72E03268c8a29927Bc6dA + k__BackingField: implicitEmit() + _loadingObject: {fileID: 802456207} + _sessionButtonObject: {fileID: 1853883865} + _transactionButtonObject: {fileID: 1280987657} + _messagePopup: {fileID: 1397315415} + _transactionResult: {fileID: 6440605247847260042} +--- !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.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: 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!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 + 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.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: 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 &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 + 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: 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: + 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!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 + 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!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 + 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!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 + 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: 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: 290} + 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 + 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!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 + 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!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 + 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_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 +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.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: 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_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_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: 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_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 &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 + 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.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: 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!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 + 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_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_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!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 + 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!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 + 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!1 &5014169504110139585 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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: 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: 5014169504580503363} + 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 &5014169504110139587 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5014169504110139585} + 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: Sign messages & view available 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: 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 &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: 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: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5014169504311983883} + 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 &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: 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: + 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: 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: 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: 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 &5014169504580503366 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5014169504580503362} + m_CullTransparentMesh: 1 +--- !u!114 &5014169504580503368 +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: 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 &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 &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 + 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: + serializedVersion: 3 + 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: 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 &5107492344900098707 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 4890380321044959821, guid: 21aa1af318f304faca1367525db9bc28, type: 3} + m_PrefabInstance: {fileID: 5107492344900098706} + m_PrefabAsset: {fileID: 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_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_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!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 &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 + 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!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 + 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!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!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_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!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 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + 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 + 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 &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 &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_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!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 + 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 &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 + 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 &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 + 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_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 &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 + 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: + 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: 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 &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 &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 + 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!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: -12.5, y: 0} + m_SizeDelta: {x: -75, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !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} + _loginState: {fileID: 320339275645968252} + _loadingOverlay: {fileID: 1084335994} + _messagePopup: {fileID: 8737090446545054564} + _sessionPool: + _amount: 20 + _setAsLastSibling: 1 + _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 V3/DemoV3.unity.meta b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/DemoV3.unity.meta new file mode 100644 index 000000000..d1d46568a --- /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/Samples~/Demo V3/Prefabs.meta b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs.meta new file mode 100644 index 000000000..1a888f51c --- /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/FeeOptionTile.prefab b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/FeeOptionTile.prefab new file mode 100644 index 000000000..f82f575dc --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/FeeOptionTile.prefab @@ -0,0 +1,496 @@ +%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: 8920924071354788044} + - {fileID: 113041410790801271} + - {fileID: 6552880901462568505} + 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: + _logoImage: {fileID: 288285889312663865} + _nameText: {fileID: 4274670708990135750} + _valueText: {fileID: 6114889452991144139} +--- !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 &2182040293823152227 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8920924071354788044} + - component: {fileID: 6526554693281513923} + - component: {fileID: 288285889312663865} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8920924071354788044 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + 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} + 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: 0.5} + m_AnchoredPosition: {x: 15, y: 5} + m_SizeDelta: {x: -50, y: -10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1767086920285922199 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2708300152223207940} + m_CullTransparentMesh: 1 +--- !u!114 &6114889452991144139 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2708300152223207940} + 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: 4291611852 + m_fontColor: {r: 0.8, g: 0.8, b: 0.8, 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: 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 &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.5} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 15, y: -5} + m_SizeDelta: {x: -50, y: -10} + 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} 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 000000000..f94e389ee --- /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/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab new file mode 100644 index 000000000..c887588a9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/Samples~/Demo V3/Prefabs/SessionWalletTile.prefab @@ -0,0 +1,284 @@ +%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: 7890725239804470962} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 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: + 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 &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_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: 3278267076527203141} + 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: 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: 0} 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 000000000..da5b8686d --- /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/Samples~/Demo/Resources/Prefabs/Common/MessagePopup.prefab b/Packages/Sequence-Unity/Sequence/Samples~/Demo/Resources/Prefabs/Common/MessagePopup.prefab index fa57cf675..dad53229e 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/Common/VersionText.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/Common/VersionText.cs index ec4255224..988b288b4 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/Common/VersionText.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/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/SequenceBoilerplates/Scripts/EcosystemWallet.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet.meta new file mode 100644 index 000000000..40861bcbc --- /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/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs new file mode 100644 index 000000000..07a469182 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs @@ -0,0 +1,82 @@ +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 += UpdateWallet; + + _login.gameObject.SetActive(false); + _featureSelection.SetActive(false); + _profile.gameObject.SetActive(false); + _transactions.gameObject.SetActive(false); + + _wallet = SequenceWallet.RecoverFromStorage(); + if (_wallet == null) + OpenLogin(); + else + OpenFeatureSelection(); + } + + private void OnDestroy() + { + SequenceWallet.Disconnected -= OpenLogin; + SequenceWallet.WalletCreated -= UpdateWallet; + } + + private void UpdateWallet(IWallet wallet) + { + _wallet = wallet; + OpenFeatureSelection(); + } + + public void OpenLogin() + { + _login.Open(); + } + + public void OpenFeatureSelection() + { + _login.gameObject.SetActive(false); + _featureSelection.SetActive(true); + } + + public void OpenProfile() + { + _featureSelection.SetActive(false); + _profile.Load(_wallet, OpenFeatureSelection); + } + + 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/EcosystemFeatureSelection.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemFeatureSelection.cs.meta new file mode 100644 index 000000000..9f725f485 --- /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 000000000..a126bac0d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs @@ -0,0 +1,117 @@ +using System; +using Sequence.EcosystemWallet; +using TMPro; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.UI; + +namespace Sequence.Boilerplates +{ + public class EcosystemWalletProfile : MonoBehaviour + { + [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/EcosystemWalletProfile.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletProfile.cs.meta new file mode 100644 index 000000000..6dd604100 --- /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 000000000..66389e043 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs @@ -0,0 +1,35 @@ +using Sequence.EcosystemWallet; +using UnityEngine; +using UnityEngine.Events; + +namespace Sequence.Boilerplates +{ + public class EcosystemWalletTransactions : MonoBehaviour + { + [SerializeField] private MessagePopup _messagePopup; + [SerializeField] private TransactionResultPopup _transactionResult; + [SerializeField] private TransactionButton[] _transactionButtons; + + 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); + _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/EcosystemWalletTransactions.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/EcosystemWalletTransactions.cs.meta new file mode 100644 index 000000000..5ac4b5c15 --- /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/FeeOptionTile.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionTile.cs new file mode 100644 index 000000000..6906660d5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/FeeOptionTile.cs @@ -0,0 +1,34 @@ +using System; +using System.Numerics; +using Sequence.Relayer; +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 async void Load(FeeOption feeOption, Action onSelected) + { + _feeOption = feeOption; + _onSelected = onSelected; + _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() + { + _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 000000000..887e01f8a --- /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 000000000..f47c6cc82 --- /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 000000000..aa9f01504 --- /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/SequenceEcosystemWalletWindow.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs new file mode 100644 index 000000000..30f52a357 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs @@ -0,0 +1,198 @@ +using System; +using System.Linq; +using Sequence.EcosystemWallet; +using TMPro; +using UnityEngine; +using UnityEngine.UI; + +namespace Sequence.Boilerplates +{ + public class SequenceEcosystemWalletWindow : MonoBehaviour + { + private enum ImplicitSessionType + { + None, + Unrestrictive, + BasicRestrictive + } + + private enum ExplicitSessionType + { + Unrestrictive, + BasicRestrictive + } + + [Header("Components")] + [SerializeField] private Button _emailLoginButton; + [SerializeField] private Button _emailContinueButton; + [SerializeField] private TMP_InputField _emailInput; + [SerializeField] private GameObject _loginState; + [SerializeField] private GameObject _loadingOverlay; + [SerializeField] private MessagePopup _messagePopup; + [SerializeField] private GenericObjectPool _sessionPool; + + private IConnect _connect; + private ImplicitSessionType _implicitPermissions; + private ExplicitSessionType _explicitPermissions; + private int _selectedWallet; + private string _curEmail; + + private readonly Chain[] _chains = + { + Chain.TestnetArbitrumSepolia, + Chain.ArbitrumOne, + Chain.Optimism, + }; + + private void Start() + { + _connect = new SequenceConnect(); + _emailInput.onValueChanged.AddListener(VerifyEmailInput); + Open(); + } + + public void Open() + { + gameObject.SetActive(true); + _messagePopup.gameObject.SetActive(false); + _loadingOverlay.SetActive(false); + + OnImplicitSessionTypeChanged(0); + OnExplicitSessionTypeChanged(0); + EnableEmailButton(true); + } + + public async void SignInWithEmail() + { + SetLoading(true); + + try + { + await _connect.SignInWithEmail(_curEmail); + } + catch (Exception e) + { + ShowError(e.Message); + } + } + + public async void SignInWithGoogle() + { + SetLoading(true); + + try + { + await _connect.SignInWithGoogle(GetImplicitPermissions()); + } + catch (Exception e) + { + ShowError(e.Message); + } + } + + public async void SignInWithApple() + { + SetLoading(true); + + try + { + await _connect.SignInWithApple(GetImplicitPermissions()); + } + catch (Exception e) + { + ShowError(e.Message); + } + } + + public async void SignInWithPasskey() + { + SetLoading(true); + + try + { + await _connect.SignInWithPasskey(GetImplicitPermissions()); + } + catch (Exception e) + { + ShowError(e.Message); + } + } + + public async void SignInWithMnemonic() + { + SetLoading(true); + + try + { + await _connect.SignInWithMnemonic(GetImplicitPermissions()); + } + catch (Exception e) + { + ShowError(e.Message); + } + } + + public void OnImplicitSessionTypeChanged(int index) + { + _implicitPermissions = (ImplicitSessionType)index; + } + + public void OnExplicitSessionTypeChanged(int index) + { + _explicitPermissions = (ExplicitSessionType)index; + } + + private void ShowError(string error) + { + Debug.LogError(error); + _messagePopup.Show(error, true); + SetLoading(false); + } + + 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; + } + + private IPermissions GetImplicitPermissions() + { + return GetPermissionsFromSessionType((int)_implicitPermissions); + } + + private IPermissions GetPermissionsFromSessionType(int type) + { + if (type == 0) + return null; + + var deadline = DateTimeOffset.UtcNow.ToUnixTimeSeconds() * 1000 + 60 * 60 * 24 * 1000; + + 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/SequenceEcosystemWalletWindow.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SequenceEcosystemWalletWindow.cs.meta new file mode 100644 index 000000000..ccef2fa00 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/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/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs new file mode 100644 index 000000000..05c516077 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/SessionWalletTile.cs @@ -0,0 +1,18 @@ +using TMPro; +using UnityEngine; + +namespace Sequence.Boilerplates +{ + public class SessionWalletTile : MonoBehaviour + { + [SerializeField] private TMP_Text _addressText; + + private Address _signer; + + public void Apply(Address signer) + { + _signer = signer; + _addressText.text = $"{_signer}"; + } + } +} 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 000000000..fb1a39d2e --- /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/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs new file mode 100644 index 000000000..4c481cd5e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionButton.cs @@ -0,0 +1,166 @@ +using System; +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 +{ + 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 bool _allowTransactionThroughEcosystem; + [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; + + public async void Load(IWallet wallet) + { + _wallet = wallet; + await CheckSupportedTransaction(); + } + + public async void AddSession() + { + SetState(State.Loading); + + 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); + + try + { + await _wallet.AddSession(permissions); + await CheckSupportedTransaction(); + } + catch (Exception e) + { + ShowError(e.Message); + } + } + + public async void SendTransaction() + { + SetState(State.Loading); + + var transaction = _transaction.BuildTransaction(); + + if (_useFeeOptions) + { + try + { + var feeOptions = await _wallet.GetFeeOption(_chain, transaction); + EcosystemFeatureSelection.Instance.OpenFeeOptionWindow(feeOptions, async feeOption => + { + if (feeOption != null) + await TrySendTransaction(transaction, feeOption); + + SetState(State.Transaction); + }); + } + catch (Exception e) + { + ShowError(e.Message); + } + + return; + } + + await TrySendTransaction(_transaction.BuildTransaction()); + SetState(State.Transaction); + } + + private async Task TrySendTransaction(ITransaction transaction, FeeOption feeOption = null) + { + try + { + 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) + { + ShowError(e.Message); + } + } + + private void ShowError(string message) + { + _messagePopup.Show(message, true); + Debug.LogError($"{message}"); + } + + private async Task CheckSupportedTransaction() + { + SetState(State.Loading); + + try + { + var supported = await _wallet.SupportsTransaction(_chain, _transaction.BuildTransaction()); + supported |= _allowTransactionThroughEcosystem; + + SetState(supported ? State.Transaction : State.Session); + } + catch (Exception e) + { + ShowError(e.Message); + } + } + + 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 000000000..510de5a57 --- /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/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionResultPopup.cs b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/Scripts/EcosystemWallet/TransactionResultPopup.cs new file mode 100644 index 000000000..48efe90e4 --- /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}tx/{_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 000000000..d6678317f --- /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/SequenceBoilerplates/SequenceBoilerplates.asmdef b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceBoilerplates.asmdef index dfeb1ff8b..cf4a66dfb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceBoilerplates.asmdef +++ b/Packages/Sequence-Unity/Sequence/SequenceBoilerplates/SequenceBoilerplates.asmdef @@ -10,7 +10,9 @@ "GUID:b4f9c0f8f363f439b9e337f79050f189", "GUID:403077141e1554429a890cbc129df651", "GUID:a67bc3d548bec4971b914c7b64c9e959", - "GUID:19b9eb7db56cc47349571a4fbb0dd677" + "GUID:19b9eb7db56cc47349571a4fbb0dd677", + "GUID:8cb4ab25ee18e4b4da9647cf481addbb", + "GUID:94b67778c44684afdab21990eebf60aa" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Authentication/OpenIdAuthenticator.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Authentication/OpenIdAuthenticator.cs index 4ac8edbac..7b5acc2f2 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 = string.IsNullOrEmpty(config.UrlScheme) ? UrlSchemeFactory.CreateFromAppIdentifier() : config.UrlScheme; SetClientIds(config); #if UNITY_EDITOR diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Config/SequenceConfig.asmdef b/Packages/Sequence-Unity/Sequence/SequenceSDK/Config/SequenceConfig.asmdef index d2bfce6d2..0735f0d50 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/Config/SequenceConfig.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Config/SequenceConfig.cs index 6cbb8c141..179b7b866 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.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet.meta new file mode 100644 index 000000000..1a010495e --- /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/AUTHENTICATION.md b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/AUTHENTICATION.md new file mode 100644 index 000000000..9c5ae45cc --- /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 000000000..7969329eb --- /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/Authentication.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication.meta new file mode 100644 index 000000000..78d8bd324 --- /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/EcosystemClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs new file mode 100644 index 000000000..5235d6e13 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs @@ -0,0 +1,146 @@ +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 +{ + public enum SessionCreationType + { + CreateNewSession, + IncludeImplicit, + AddExplicit + } + + internal class EcosystemClient + { + private readonly string _walletUrl; + + public EcosystemClient() + { + _walletUrl = SequenceConfig.GetConfig().WalletAppUrl; + _walletUrl = _walletUrl.RemoveTrailingSlash(); + } + + /// + /// 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. + /// + /// + public async Task CreateNewSession(bool addExplicit, SessionPermissions session, + string preferredLoginMethod, string email = null) + { + var chainId = string.Empty; + if (session != null) + { + if (session.chainId <= 0) + throw new Exception("Invalid chainId."); + + chainId = session.chainId.ToString(); + } + + var type = DetermineSessionCreationType(addExplicit, session); + var sessionWallet = new EOAWallet(); + var sessionAddress = sessionWallet.GetAddress(); + + if (session != null) + session.sessionAddress = sessionAddress; + + var sessionArgs = session == null ? + new SessionArgs(sessionAddress) : + new ExplicitSessionArgs(session); + + var origin = RedirectOrigin.GetOriginString(); + var includeImplicitSession = type == SessionCreationType.IncludeImplicit; + + var payload = new ConnectArgs + { + preferredLoginMethod = preferredLoginMethod, + email = email, + origin = origin, + includeImplicitSession = includeImplicitSession, + session = sessionArgs + }; + + var action = type == SessionCreationType.AddExplicit ? "addExplicitSession" : "createNewSession"; + + var response = await SendRequest("connect", action, payload); + + 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(), + walletAddress, + response.attestation, + response.signature, + _walletUrl, + chainId, + response.loginMethod, + response.userEmail); + + if (isImplicitWithPermissions) + { + credentials[1] = new SessionCredentials( + true, + sessionWallet.GetPrivateKeyAsHex(), + response.walletAddress, + null, + null, + _walletUrl, + chainId, + response.loginMethod, + response.userEmail); + } + + 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; + } + + public async Task SendRequest(string path, string action, TArgs args) + { + var origin = RedirectOrigin.GetOriginString(); + + var walletUrl = SequenceConfig.GetConfig().WalletAppUrl; + walletUrl = walletUrl.RemoveTrailingSlash(); + + var url = $"{walletUrl}/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) + 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/EcosystemClient.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/EcosystemClient.cs.meta new file mode 100644 index 000000000..61248915d --- /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/IConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs new file mode 100644 index 000000000..4a66f3617 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/IConnect.cs @@ -0,0 +1,43 @@ +using System.Threading.Tasks; + +namespace Sequence.EcosystemWallet +{ + public interface IConnect + { + /// + /// Sign in using email through an external browser. + /// + /// + /// + /// + Task SignInWithEmail(string email, IPermissions permissions = null); + + /// + /// Sign in with Google through an external browser. + /// + /// + /// + Task SignInWithGoogle(IPermissions permissions = null); + + /// + /// Sign in with Apple through an external browser. + /// + /// + /// + Task SignInWithApple(IPermissions permissions = null); + + /// + /// Sign in with a passkey through an external browser. + /// + /// + /// + Task SignInWithPasskey(IPermissions permissions = null); + + /// + /// Sign in using a mnemonic through an external browser. + /// + /// + /// + Task SignInWithMnemonic(IPermissions 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 000000000..8784497e4 --- /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/RedirectHandler.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler.meta new file mode 100644 index 000000000..f1c55197f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler.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/Authentication/RedirectHandler/BrowserRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/BrowserRedirectHandler.cs new file mode 100644 index 000000000..b2e92940b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/BrowserRedirectHandler.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +using UnityEngine; + +namespace Sequence.EcosystemWallet.Browser +{ + internal class BrowserRedirectHandler : RedirectHandler + { + 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 override async Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) + { + try + { + var go = new GameObject("SequenceNativeReceiver"); + _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); + + var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(data.payload)); + var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); + + return (true, responsePayload); + } + catch (Exception ex) + { + Debug.LogException(ex); + return (false, default); + } + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/BrowserRedirectHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/BrowserRedirectHandler.cs.meta new file mode 100644 index 000000000..3c0841204 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/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/Authentication/RedirectHandler/DeeplinkRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/DeeplinkRedirectHandler.cs new file mode 100644 index 000000000..aab293938 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/DeeplinkRedirectHandler.cs @@ -0,0 +1,41 @@ +using System; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet.Browser +{ + internal class DeeplinkRedirectHandler : RedirectHandler + { + private NativeReceiver _receiver; + + public override async Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) + { + var go = new GameObject("SequenceNativeReceiver"); + _receiver = go.AddComponent(); + + var response = await _receiver.WaitForResponse(ConstructUrl(url, action, payload)); + + GameObject.Destroy(_receiver.gameObject); + + if (!response.Contains(RedirectUrl)) + throw new Exception(response); + + var data = response.ExtractQueryAndHashParameters(); + + 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); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/DeeplinkRedirectHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/DeeplinkRedirectHandler.cs.meta new file mode 100644 index 000000000..059b72af9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/DeeplinkRedirectHandler.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/Authentication/RedirectHandler/LocalhostRedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs new file mode 100644 index 000000000..a26e7ec60 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs @@ -0,0 +1,47 @@ +using System; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet.Browser +{ + internal class LocalhostRedirectHandler : RedirectHandler + { + public override async Task<(bool Result, TResponse Data)> WaitForResponse(string url, string action, TPayload payload) + { + Application.OpenURL(ConstructUrl(url, action, payload)); + + try + { + var server = GameObject.FindObjectOfType(); + if (!server) + { + server = new GameObject("LocalhostServer").AddComponent(); + } + + var queryString = await server.Run(RedirectUrl); + + var id = queryString["id"]; + if (id != 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"]}"); + + var responsePayloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(queryString["payload"])); + var responsePayload = JsonConvert.DeserializeObject(responsePayloadJson); + + SequenceLog.Info(responsePayloadJson); + + return (true, responsePayload); + } + catch (Exception ex) + { + Debug.LogException(ex); + return (false, default); + } + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs.meta new file mode 100644 index 000000000..d4bcbfc07 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostRedirectHandler.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 43a2986b9f524e6fb8c55a73b781ed0a +timeCreated: 1752157929 \ No newline at end of file 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 000000000..84975e070 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/LocalhostServer.cs @@ -0,0 +1,56 @@ +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(); + } + + + HttpListenerContext context = null; + while (context == null || !context.Request.RawUrl.Contains("?id")) + context = await _listener.GetContextAsync(); + + var responseString = "{}"; + var buffer = Encoding.UTF8.GetBytes(responseString); + + context.Response.StatusCode = 200; + context.Response.ContentType = "application/json"; + context.Response.ContentLength64 = buffer.Length; + context.Response.KeepAlive = true; + + await context.Response.OutputStream.WriteAsync(buffer, 0, buffer.Length); + + context.Response.OutputStream.Close(); + context.Response.Close(); + + return context.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 000000000..a2c4351a3 --- /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/RedirectHandler/NativeReceiver.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/NativeReceiver.cs new file mode 100644 index 000000000..08d011e4a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/NativeReceiver.cs @@ -0,0 +1,61 @@ +using System.Threading.Tasks; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet.Browser +{ + internal class NativeReceiver : MonoBehaviour + { + private string _response; + + private void Awake() + { + Application.deepLinkActivated += HandleResponse; + } + + private void OnDestroy() + { + Application.deepLinkActivated -= HandleResponse; + } + + public void HandleResponse(string response) + { + SequenceLog.Info($"Received response from native plugin: {response}"); + + _response = response; + } + + public async Task WaitForResponse(string url) + { + SequenceLog.Info($"Opening URL {url}"); + + OpenWalletApp(url); + + while (string.IsNullOrEmpty(_response)) + await Task.Yield(); + + return _response; + } + +#if !UNITY_EDITOR && (UNITY_WEBGL || UNITY_IOS) + [System.Runtime.InteropServices.DllImport("__Internal")] + private static extern void OpenWalletApp(string url); +#elif !UNITY_EDITOR && UNITY_ANDROID + private static void OpenWalletApp(string url) + { + if (!ChromeTabs.IsSupported()) + { + SequenceLog.Info("Chrome tabs is not supported."); + return; + } + + ChromeTabs.Open(url); + } +#else + 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/Authentication/RedirectHandler/NativeReceiver.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/NativeReceiver.cs.meta new file mode 100644 index 000000000..ddedc757d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/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/Authentication/RedirectHandler/RedirectFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectFactory.cs new file mode 100644 index 000000000..1171c3236 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectFactory.cs @@ -0,0 +1,16 @@ +namespace Sequence.EcosystemWallet.Browser +{ + internal static class RedirectFactory + { + public static RedirectHandler CreateHandler() + { +#if !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID || UNITY_STANDALONE_OSX) + return new DeeplinkRedirectHandler(); +#elif !UNITY_EDITOR && UNITY_WEBGL + return new BrowserRedirectHandler(); +#else + return new LocalhostRedirectHandler(); +#endif + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectFactory.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectFactory.cs.meta new file mode 100644 index 000000000..c4455a798 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectFactory.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/Authentication/RedirectHandler/RedirectHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectHandler.cs new file mode 100644 index 000000000..eec25a7dd --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectHandler.cs @@ -0,0 +1,27 @@ +using System; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; + +namespace Sequence.EcosystemWallet.Browser +{ + 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}&mode=redirect&redirectUrl={RedirectUrl}"; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectHandler.cs.meta new file mode 100644 index 000000000..dd87d68d0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/RedirectHandler.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/Authentication/RedirectHandler/WindowsRedirectCheck.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/WindowsRedirectCheck.cs new file mode 100644 index 000000000..6abfcccc9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/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/Authentication/RedirectHandler/WindowsRedirectCheck.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectHandler/WindowsRedirectCheck.cs.meta new file mode 100644 index 000000000..f58c7ce9e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/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/EcosystemWallet/Authentication/RedirectOrigin.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs new file mode 100644 index 000000000..be9e7552f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/RedirectOrigin.cs @@ -0,0 +1,31 @@ +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet +{ + public static class RedirectOrigin + { +#if !UNITY_EDITOR && UNITY_WEBGL + [DllImport("__Internal")] + private static extern System.IntPtr GetPageOrigin(); + + public static string GetOriginString() + { + return Marshal.PtrToStringAnsi(GetPageOrigin()); + } +#elif !UNITY_EDITOR && (UNITY_IOS || UNITY_ANDROID || UNITY_STANDALONE_OSX) + public static string GetOriginString() + { + return $"{UrlSchemeFactory.CreateFromAppIdentifier()}://"; + } +#else + public static string GetOriginString() + { + return $"http://localhost:4444"; + } +#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 000000000..415b5b322 --- /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/Requests.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests.meta new file mode 100644 index 000000000..beef7a9f2 --- /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 000000000..9af3cd179 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs @@ -0,0 +1,62 @@ +using System.Numerics; +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet +{ + public struct ConnectArgs + { + public string preferredLoginMethod; + public string email; + public string origin; + public bool includeImplicitSession; + public SessionArgs session; + } + + 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; + + 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/Authentication/Requests/Connect.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/Connect.cs.meta new file mode 100644 index 000000000..94abdde31 --- /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 000000000..c7817d2b4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/SignMessage.cs @@ -0,0 +1,19 @@ +using Sequence.EcosystemWallet.Primitives.Common; + +namespace Sequence.EcosystemWallet +{ + + 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 000000000..b849daa1b --- /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/Requests/TransactionRequest.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Requests/TransactionRequest.cs new file mode 100644 index 000000000..6939a6048 --- /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 000000000..2dad52b86 --- /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/Authentication/SequenceConnect.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs new file mode 100644 index 000000000..2806de960 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs @@ -0,0 +1,43 @@ +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Primitives; +using UnityEngine.Assertions; + +namespace Sequence.EcosystemWallet +{ + public class SequenceConnect : IConnect + { + private readonly EcosystemClient _client = new(); + + public async Task SignInWithEmail(string email, IPermissions permissions) + { + return await SignIn(permissions, "email", email); + } + + public async Task SignInWithGoogle(IPermissions permissions) + { + return await SignIn(permissions, "google", null); + } + + public async Task SignInWithApple(IPermissions permissions) + { + return await SignIn(permissions, "apple", 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); + } + + 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(false, permissions?.GetPermissions(), preferredLoginMethod, email); + return new SequenceWallet(signers); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.cs.meta new file mode 100644 index 000000000..a96430aff --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/SequenceConnect.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/Authentication/Storage.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage.meta new file mode 100644 index 000000000..5124fda41 --- /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/SessionCredentials.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs new file mode 100644 index 000000000..da463a43f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs @@ -0,0 +1,109 @@ +using System; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Wallet; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet +{ + [Preserve] + [JsonConverter(typeof(SessionCredentialsConverter))] + internal class SessionCredentials + { + public bool isExplicit; + public string privateKey; + public Address address; + public Address sessionAddress; + public Attestation attestation; + public RSY signature; + public string walletUrl; + public string chainId; + public string loginMethod; + public string userEmail; + + public SessionCredentials(bool isExplicit, string privateKey, Address address, Attestation attestation, RSY signature, + string walletUrl, string chainId, string loginMethod, string userEmail) + { + this.isExplicit = isExplicit; + this.privateKey = privateKey; + this.address = address; + this.attestation = attestation; + this.signature = signature; + this.walletUrl = walletUrl; + this.chainId = chainId; + this.loginMethod = loginMethod; + this.userEmail = userEmail; + + sessionAddress = new EOAWallet(privateKey).GetAddress(); + } + } + + [Preserve] + internal class SessionCredentialsConverter : JsonConverter + { + 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); + + writer.WritePropertyName("address"); + serializer.Serialize(writer, value.address); + + writer.WritePropertyName("walletUrl"); + writer.WriteValue(value.walletUrl); + + 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.userEmail != null) + { + writer.WritePropertyName("userEmail"); + serializer.Serialize(writer, value.userEmail); + } + + writer.WriteEndObject(); + } + + public override SessionCredentials ReadJson(JsonReader reader, Type objectType, SessionCredentials existingValue, bool hasExistingValue, JsonSerializer serializer) + { + JObject obj = JObject.Load(reader); + + 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); + + var walletUrl = obj["walletUrl"]?.ToString(); + var chainId = obj["chainId"]?.ToString(); + var loginMethod = obj["loginMethod"]?.ToString(); + var userEmail = obj["userEmail"]?.ToString(); + + 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/Authentication/Storage/SessionCredentials.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.cs.meta new file mode 100644 index 000000000..7b7f3ca60 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionCredentials.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 000000000..b24f650f7 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs @@ -0,0 +1,43 @@ +using System; +using Newtonsoft.Json; +using Sequence.Utils; +using Sequence.Utils.SecureStorage; +using UnityEngine; + +namespace Sequence.EcosystemWallet +{ + 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 static readonly ISecureStorage Storage = SecureStorageFactory.CreateSecureStorage(); + + public static void Clear() + { + Storage.StoreString(WalletAddressKey, string.Empty); + Storage.StoreString(SessionsKey, string.Empty); + } + + public static void AddSession(SessionCredentials session) + { + var sessions = GetSessions(); + var newSessions = sessions.AddToArray(session); + StoreSessions(newSessions); + } + + public static SessionCredentials[] GetSessions() + { + 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/Storage/SessionStorage.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Authentication/Storage/SessionStorage.cs.meta new file mode 100644 index 000000000..0de0de5e4 --- /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/Guard.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard.meta new file mode 100644 index 000000000..e0d28aa1c --- /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 000000000..91245d770 --- /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 000000000..1d5b254f9 --- /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 000000000..bb07ff7c6 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Guard/GuardSigner.cs @@ -0,0 +1,120 @@ +using System; +using System.Numerics; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Sequence.EcosystemWallet.Envelope; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet +{ + public class GuardSigner + { + private readonly Address _guardSigner = ExtensionsFactory.Current.Guard; + private readonly GuardService _service; + + public GuardSigner(GuardConfig config) + { + _service = new GuardService(config.url); + } + + public async Task SignEnvelope(SignedEnvelope envelope) + { + var unparentedPayload = new Parented(Array.Empty
(), envelope.payload); + + 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]); + + var rsy = await SignPayload(envelope.wallet, envelope.chainId, + payload.Digest, payload.Message, guardSignatures); + + return new Signature + { + address = _guardSigner, + signature = new SignatureOfSignerLeafHash + { + rsy = rsy + } + }; + } + + private async Task SignPayload(Address wallet, BigInteger chainId, + byte[] digest, byte[] message, GuardSignatureArgs[] signatures) + { + var args = new SignWithArgs + { + signer = _guardSigner, + request = new SignRequest + { + chainId = chainId, + msg = digest.ByteArrayToHexStringWithPrefix(), + wallet = wallet, + payloadType = GuardPayloadType.Calls, + payloadData = message.ByteArrayToHexStringWithPrefix(), + signatures = signatures + } + }; + + var response = await _service.SignWith(args); + return RSY.UnpackFrom65(response.sig.HexStringToByteArray()); + } + + private (byte[] Message, byte[] Digest) ToGuardPayload(Address wallet, BigInteger chainId, Parented payload) + { + var typedData = new TypedDataToSign(wallet, 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 000000000..ffd6058a4 --- /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 000000000..adf16e6d0 --- /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 000000000..81dca9325 --- /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 000000000..396f4a8da --- /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 000000000..ffe7467c1 --- /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 000000000..312900f69 --- /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/KeyMachine.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine.meta new file mode 100644 index 000000000..9237b8f94 --- /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 000000000..2b20a9868 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs @@ -0,0 +1,52 @@ +using System.Numerics; +using System.Threading.Tasks; +using Sequence.EcosystemWallet.KeyMachine.Models; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; +using UnityEngine; + +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 GetDeployHash(Address walletAddress) + { + var args = new DeployHashArgs(walletAddress); + return await SendRequest("DeployHash", args); + } + + public async Task GetTree(string imageHash) + { + var args = new TreeArgs(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); + return await SendRequest("Config", args); + } + + 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/KeyMachineApi.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/KeyMachineApi.cs.meta new file mode 100644 index 000000000..693f8315a --- /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 000000000..2b45d1988 --- /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 000000000..7075173d4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs @@ -0,0 +1,30 @@ +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.KeyMachine.Models +{ + [Preserve] + internal struct ConfigArgs + { + public string imageHash; + + public ConfigArgs(string imageHash) + { + this.imageHash = imageHash; + } + } + + [Preserve] + internal struct ConfigReturn + { + public int version; + public ConfigContext config; + } + + [Preserve] + 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/Config.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Config.cs.meta new file mode 100644 index 000000000..e1c3920f8 --- /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/ConfigUpdates.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/ConfigUpdates.cs new file mode 100644 index 000000000..13cba8525 --- /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 000000000..10cc759df --- /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/KeyMachine/Models/DeployHash.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs new file mode 100644 index 000000000..de34eb12f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/DeployHash.cs @@ -0,0 +1,28 @@ +namespace Sequence.EcosystemWallet.KeyMachine.Models +{ + internal struct DeployHashArgs + { + public Address wallet; + + public DeployHashArgs(Address wallet) + { + this.wallet = wallet; + } + } + + internal struct DeployHashReturn + { + public string deployHash; + public DeployHashContext context; + } + + internal struct DeployHashContext + { + public int version; + public Address factory; + public string guestModule; + public Address mainModule; + public Address mainModuleUpgradable; + public string walletCreationCode; + } +} \ 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 000000000..d8ccaa02b --- /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/KeyMachine/Models/Tree.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/KeyMachine/Models/Tree.cs new file mode 100644 index 000000000..fdd37373e --- /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 000000000..5887f5e03 --- /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.md b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/PRIMITIVES.md new file mode 100644 index 000000000..b522c68af --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/PRIMITIVES.md @@ -0,0 +1,97 @@ +# 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 +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 + +--- + +### Payload + +TBD + +### Config Topology + +TBD + +### Session Topology + +TBD + +### Recovery + +TBD + +### Passkeys + +TBD + +### Address + +## Testing Infrastructure + +--- + +### Integration Tests + +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 + +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/PRIMITIVES.md.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/PRIMITIVES.md.meta new file mode 100644 index 000000000..14b162bc3 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/PRIMITIVES.md.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 632a7a4e646a4038952a74800254ef65 +timeCreated: 1751384228 \ No newline at end of file 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 000000000..48a19885e --- /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/ContractPermission.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs new file mode 100644 index 000000000..129295434 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/ContractPermission.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +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; + private readonly List _rules = new(); + + 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; + _contract = contract; + _deadline = deadline; + _valueLimit = valueLimit; + } + + public void AddRule(ParameterRule rule) + { + _rules.Add(rule); + } + + public SessionPermissions GetPermissions() + { + var permissions = new[] { new Permission { target = _contract, rules = _rules.ToArray() } }; + + return new SessionPermissions + { + chainId = _chain.IsActive() ? _chain.AsBigInteger() : 0, + deadline = _deadline, + valueLimit = _valueLimit, + 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 000000000..6682cc91f --- /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/IPermissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissions.cs new file mode 100644 index 000000000..7225a6745 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissions.cs @@ -0,0 +1,9 @@ +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet +{ + public interface IPermissions + { + SessionPermissions GetPermissions(); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissions.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissions.cs.meta new file mode 100644 index 000000000..fcc8d6cde --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/IPermissions.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/Permissions/Permissions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs new file mode 100644 index 000000000..2db27deba --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Permissions/Permissions.cs @@ -0,0 +1,46 @@ +using System.Collections.Generic; +using System.Numerics; +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet +{ + public class Permissions : IPermissions + { + private readonly Chain _chain; + private readonly IPermissions[] _permissions; + + public Permissions(Chain chain, params IPermissions[] permissions) + { + _chain = chain; + _permissions = permissions; + } + + public SessionPermissions GetPermissions() + { + BigInteger deadline = 0; + BigInteger valueLimit = 0; + + var allPermissions = new List(); + + foreach (var currentPermissions in _permissions) + { + var permissions = currentPermissions.GetPermissions(); + + if (permissions.deadline > deadline) + deadline = permissions.deadline; + + valueLimit += permissions.valueLimit; + + allPermissions.AddRange(permissions.permissions); + } + + return new SessionPermissions + { + chainId = _chain.AsBigInteger(), + deadline = deadline, + valueLimit = valueLimit, + 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 000000000..de742a162 --- /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/Primitives.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives.meta new file mode 100644 index 000000000..6951ccb00 --- /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/Address.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address.meta new file mode 100644 index 000000000..6380783f1 --- /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 000000000..ca9a64095 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Address/AddressFactory.cs @@ -0,0 +1,35 @@ +using Sequence.ABI; +using Sequence.Utils; + +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); + } + + 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() ?? DefaultCreationCode, + 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 000000000..1fa1ca6cf --- /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/EcosystemWallet/Primitives/Attestation.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation.meta new file mode 100644 index 000000000..c07e565d7 --- /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 000000000..11b06b1a9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/Attestation.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Numerics; +using Newtonsoft.Json; +using Sequence.ABI; +using Sequence.EcosystemWallet.Primitives.Common; +using Sequence.Utils; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Preserve] + public class Attestation + { + public static readonly byte[] ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX = + SequenceCoder.KeccakHash("acceptImplicitRequest".ToByteArray()); + + public Address approvedSigner; + public Bytes identityType; + public Bytes issuerHash; + public Bytes audienceHash; + public Bytes applicationData; + public 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"); + } + } + + 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.Data.Length.ByteArrayFromNumber(3); + + return ByteArrayExtensions.ConcatenateByteArrays(approvedSignerBytes, identityTypeBytes, issuerHashBytes, + audienceHashBytes, applicationDataLengthBytes, applicationData, authDataBytes); + } + + public byte[] Hash() + { + byte[] encoded = Encode(); + return SequenceCoder.KeccakHash(encoded); + } + + public object ToJson() + { + return new + { + approvedSigner = approvedSigner.Value, + identityType = identityType.Data.ByteArrayToHexStringWithPrefix(), + issuerHash = issuerHash.Data.ByteArrayToHexStringWithPrefix(), + audienceHash = audienceHash.Data.ByteArrayToHexStringWithPrefix(), + applicationData = applicationData.Data.ByteArrayToHexStringWithPrefix(), + authData = new + { + redirectUrl = authData.redirectUrl, + issuedAt = authData.issuedAt.ToString() + } + }; + } + + public byte[] GenerateImplicitRequestMagic(Address wallet) + { + byte[] walletBytes = wallet.Value.HexStringToByteArray(20); + return ByteArrayExtensions.ConcatenateByteArrays(ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX, walletBytes, + audienceHash.Data, issuerHash.Data); + } + } +} \ 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 000000000..fe608cf75 --- /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 000000000..89098318a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Attestation/AuthData.cs @@ -0,0 +1,29 @@ +using System; +using Sequence.EcosystemWallet.Primitives.Common; +using Sequence.Utils; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Preserve] + [Serializable] + public class AuthData + { + public string redirectUrl; + public BigInt issuedAt; + + [Preserve] + public AuthData(string redirectUrl, BigInt 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, issuedAt.Value.ByteArrayFromNumber(8)); + } + } +} \ 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 000000000..9e0cff55d --- /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 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 000000000..e0acb6725 --- /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 000000000..d70d29a84 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/BigInt.cs @@ -0,0 +1,59 @@ +using System; +using System.Numerics; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Primitives.Common +{ + [Preserve] + [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); + } + + [Preserve] + 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 000000000..13fdac34c --- /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 000000000..b86339ea6 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Common/Bytes.cs @@ -0,0 +1,56 @@ +using System; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Primitives.Common +{ + [Preserve] + [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); + } + + [Preserve] + 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 000000000..65619ad49 --- /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/Config.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config.meta new file mode 100644 index 000000000..68a8541b6 --- /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/AnyAddressSubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs new file mode 100644 index 000000000..c8beedce9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs @@ -0,0 +1,38 @@ +using System.Text; +using Sequence.ABI; +using Sequence.Utils; + +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 AnyAddressSubdigestLeafJson + { + type = AnyAddressSubdigest, + digest = digest.ByteArrayToHexStringWithPrefix() + }; + } + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + var flag = Topology.FlagSignatureAnyAddressSubdigest << 4; + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), 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/AnyAddressSubdigestLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/AnyAddressSubdigestLeaf.cs.meta new file mode 100644 index 000000000..0cd8ace73 --- /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 000000000..44f4d9705 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs @@ -0,0 +1,96 @@ +using System; +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; + public BigInteger checkpoint; + public Topology topology; + public Address checkpointer; + + 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(threshold.MinBytesFor()).PadLeft(32); + root = SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(root, thresholdBytes)); + + 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)); + + return root; + } + + public static Config FromJson(string json) + { + var input = JsonConvert.DeserializeObject>(json); + + var threshold = input["threshold"].ToString(); + var checkpoint = input["checkpoint"].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), + checkpoint = BigInteger.Parse(checkpoint), + checkpointer = checkpointer, + topology = Topology.Decode(topology) + }; + } + } + + [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/Config.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Config.cs.meta new file mode 100644 index 000000000..36dea36c0 --- /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/Leaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs new file mode 100644 index 000000000..ba75baf19 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs @@ -0,0 +1,23 @@ +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 UnrecoveredSigner = "unrecovered-signer"; + 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/Leaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Leaf.cs.meta new file mode 100644 index 000000000..e292686c0 --- /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/NestedLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs new file mode 100644 index 000000000..32d68ac01 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs @@ -0,0 +1,77 @@ +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 + { + 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 NestedLeafJson + { + 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(weight.MinBytesFor()); + 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(threshold.MinBytesFor()).PadLeft(2); + else + throw new Exception("Threshold too large"); + + if (nested.Length > 0xFFFFFF) + throw new Exception("Nested tree too large"); + + return ByteArrayExtensions.ConcatenateByteArrays( + flag.ByteArrayFromNumber(flag.MinBytesFor()), + weightBytes, + thresholdBytes, + nested.Length.ByteArrayFromNumber(nested.Length.MinBytesFor()).PadLeft(3), + nested); + } + + public override byte[] HashConfiguration() + { + byte[] prefix = Encoding.UTF8.GetBytes("Sequence nested config:\n"); + byte[] treeHash = tree.HashConfiguration(); + byte[] threshold = this.threshold.ByteArrayFromNumber(32); + byte[] weight = this.weight.ByteArrayFromNumber(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/NestedLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NestedLeaf.cs.meta new file mode 100644 index 000000000..35050505e --- /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 000000000..a2305bcfc --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs @@ -0,0 +1,14 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public 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/Node.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Node.cs.meta new file mode 100644 index 000000000..0dde34773 --- /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 000000000..5bd625744 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/NodeLeaf.cs @@ -0,0 +1,32 @@ +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class NodeLeaf : Leaf + { + public byte[] Value; + + public static implicit operator byte[](NodeLeaf leaf) + { + return leaf.Value; + } + + public override object Parse() + { + return Value.ByteArrayToHexStringWithPrefix(); + } + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + 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 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 000000000..91c970afb --- /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/SapientSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSigner.cs new file mode 100644 index 000000000..ba4a700d7 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSigner.cs @@ -0,0 +1,8 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public 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 000000000..e3a8d21f3 --- /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/SapientSignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs new file mode 100644 index 000000000..f02c17c15 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs @@ -0,0 +1,54 @@ +using System.Numerics; +using System.Text; +using Sequence.ABI; +using Sequence.Utils; + +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 SapientSignerLeafJson + { + type = SapientSigner, + address = address, + weight = weight.ToString(), + imageHash = imageHash + }; + } + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + var flag = Topology.FlagNode << 4; + 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(this.weight.MinBytesFor()).PadLeft(32); + byte[] imageHash = this.imageHash.HexStringToByteArray().PadLeft(32); + + 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/Config/SapientSignerLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SapientSignerLeaf.cs.meta new file mode 100644 index 000000000..132581ce5 --- /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/Signer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs new file mode 100644 index 000000000..4620c4b44 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Signer.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + public 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 is SignerLeaf signerLeaf) + { + if (signerLeaf.weight > 0) + { + signers.Add(signerLeaf.address); + } + } + else if (top.Leaf is SapientSignerLeaf sapientSignerLeaf) + { + sapientSigners.Add(new SapientSigner + { + address = sapientSignerLeaf.address, + imageHash = sapientSignerLeaf.imageHash + }); + } + else if (top.Leaf is NodeLeaf) + { + isComplete = false; + } + else if (top.Leaf is NestedLeaf nestedLeaf) + { + 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 000000000..294f2f97d --- /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/SignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs new file mode 100644 index 000000000..2981a8a8f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs @@ -0,0 +1,57 @@ +using System; +using System.Numerics; +using System.Text; +using Sequence.ABI; +using Sequence.Utils; +using UnityEngine; + +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 SignerLeafJson + { + type = Signer, + address = address ?? string.Empty, + weight = weight.ToString() + }; + } + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + var flag = Topology.FlagAddress << 4; + var weightBytes = Array.Empty(); + + if (weight > 0 && weight <= 15) + flag |= (int)weight; + else if (weight <= 255) + weightBytes = weight.ByteArrayFromNumber(flag.MinBytesFor()); + else + throw new ArgumentException("Weight too large"); + + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), weightBytes, + address.Value.HexStringToByteArray().PadLeft(20)); + } + + public override byte[] HashConfiguration() + { + byte[] prefix = Encoding.UTF8.GetBytes("Sequence signer:\n"); + byte[] address = this.address.Value.HexStringToByteArray(); + byte[] weight = this.weight.ByteArrayFromNumber(this.weight.MinBytesFor()).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/SignerLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SignerLeaf.cs.meta new file mode 100644 index 000000000..bba132e0e --- /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/Config/SubdigestLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs new file mode 100644 index 000000000..ca1b3c26c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs @@ -0,0 +1,38 @@ +using System.Text; +using Sequence.ABI; +using Sequence.Utils; + +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 SubdigestLeafJson + { + type = Subdigest, + digest = digest.ByteArrayToHexStringWithPrefix() + }; + } + + public override byte[] Encode(bool noChainId, byte[] checkpointerData) + { + var flag = Topology.FlagSubdigest << 4; + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), digest); + } + + 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/SubdigestLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/SubdigestLeaf.cs.meta new file mode 100644 index 000000000..82722bbe9 --- /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 000000000..2dacdf4bd --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs @@ -0,0 +1,414 @@ +using System; +using System.Numerics; +using System.Collections.Generic; +using Newtonsoft.Json; +using Sequence.ABI; +using Sequence.Utils; +using UnityEngine; + +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; + + public Topology(Leaf leaf) + { + this.Leaf = leaf; + } + + 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 leaves[0].ToTopology(); + + if (leaves.Count == 2) + { + return new Topology(new Node( + leaves[0].ToTopology(), + leaves[1].ToTopology() + )); + } + + 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; + } + + 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); + } + + if (IsLeaf()) + { + if (Leaf is NestedLeaf nestedLeaf) + { + return nestedLeaf.tree.FindSignerLeaf(address); + } + + if (Leaf is SignerLeaf signerLeaf) + { + if (signerLeaf.address.Equals(address)) + { + Debug.Log($"return signer leaf {signerLeaf.address}"); + return signerLeaf; + } + } + else if (Leaf is SapientSignerLeaf sapientSignerLeaf) + { + if (sapientSignerLeaf.address.Equals(address)) + { + return sapientSignerLeaf; + } + } + } + + return null; + } + + public object Parse() + { + if (IsNode()) + { + return new object[] + { + Node.left.Parse(), + Node.right.Parse() + }; + } + + return Leaf.Parse(); + } + + public static Topology Decode(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(Decode(list[0].ToString()), Decode(list[1].ToString()))); + } + + if (input.StartsWith("0x")) + { + return new NodeLeaf + { + Value = input.HexStringToByteArray() + }.ToTopology(); + } + + var data = JsonConvert.DeserializeObject>(input); + string type = (string)data["type"]; + + switch (type) + { + case Leaf.Signer: + return new SignerLeaf + { + address = new Address((string)data["address"]), + weight = BigInteger.Parse((string)data["weight"]) + }.ToTopology(); + case Leaf.SapientSigner: + return new SapientSignerLeaf + { + address = new Address((string)data["address"]), + weight = BigInteger.Parse((string)data["weight"]), + imageHash = (string)data["imageHash"] + }.ToTopology(); + case Leaf.Subdigest: + return new SubdigestLeaf + { + digest = ((string)data["digest"]).HexStringToByteArray() + }.ToTopology(); + case Leaf.AnyAddressSubdigest: + return new AnyAddressSubdigestLeaf + { + digest = ((string)data["digest"]).HexStringToByteArray() + }.ToTopology(); + case Leaf.Nested: + return new NestedLeaf + { + tree = Decode(data["tree"].ToString()), + weight = BigInteger.Parse((string)data["weight"]), + threshold = BigInteger.Parse((string)data["threshold"]) + }.ToTopology(); + default: + throw new Exception($"Invalid type {type} in topology JSON"); + } + } + + public byte[] HashConfiguration() + { + if (IsNode()) + { + byte[] leftHash = Node.left.HashConfiguration(); + byte[] rightHash = Node.right.HashConfiguration(); + return SequenceCoder.KeccakHash(ByteArrayExtensions.ConcatenateByteArrays(leftHash, rightHash)); + } + + return Leaf.HashConfiguration(); + } + + public byte[] Encode(bool noChainId = true, byte[] checkpointerData = null) + { + if (IsNode()) + { + var encoded0 = Node.left.Encode(noChainId, checkpointerData); + var encoded1 = Node.right.Encode(noChainId, checkpointerData); + + var isBranching = Node.right.IsNode(); + if (!isBranching) + return ByteArrayExtensions.ConcatenateByteArrays(encoded0, encoded1); + + var encoded1Size = encoded1.Length.MinBytesFor(); + if (encoded1Size > 15) + throw new Exception("Branch too large"); + + var flag = (FlagBranch << 4) | encoded1Size; + + return ByteArrayExtensions.ConcatenateByteArrays(encoded0, + 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 == Leaf.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 == Leaf.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 == Leaf.AnyAddressSubdigest) + { + var parts = firstElement.Split(':'); + string digest = parts[1]; + + leaves.Add(new AnyAddressSubdigestLeaf + { + digest = digest.HexStringToByteArray() + }); + + elements = elements.Substring(firstElement.Length).TrimStart(); + } + else if (firstElementType == Leaf.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 == Leaf.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 == Leaf.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) + throw new Exception($"Topology.FromLeaves resulted in an empty list of leafs: {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/EcosystemWallet/Primitives/Config/Topology.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Topology.cs.meta new file mode 100644 index 000000000..06d9aeed2 --- /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 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 000000000..655efe16e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/WeightCalculator.cs @@ -0,0 +1,87 @@ +using System; +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class WeightCalculator + { + public struct WeightResult + { + public BigInteger weight; + public BigInteger maxWeight; + } + + public static WeightResult GetWeight(Topology 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(Config configuration, Func canSign) + { + if (configuration?.topology == null) + { + return new WeightResult { weight = 0, maxWeight = 0 }; + } + + return GetWeight(configuration.topology, canSign); + } + + private static WeightResult GetWeightForLeaf(Leaf 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 }; + } + // 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 NestedLeaf 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 000000000..08dda4bd7 --- /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 new file mode 100644 index 000000000..a203fd60e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Config/Weigth.cs @@ -0,0 +1,82 @@ +using System; +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class Weigth + { + public BigInteger weight; + public BigInteger maxWeight; + + public static Weigth GetWeight(Topology 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(Config configuration, Func canSign) + { + if (configuration?.topology == null) + { + return new Weigth { weight = 0, maxWeight = 0 }; + } + + 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(Leaf 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 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 NestedLeaf 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 000000000..940804a64 --- /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 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 000000000..fa82e83f2 --- /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 000000000..2644352b3 --- /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/Network.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Network.meta new file mode 100644 index 000000000..778bf4f55 --- /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 000000000..f3af50c76 --- /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 000000000..fc563e17a --- /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 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 000000000..4d6508641 --- /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 000000000..d54d4b557 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/DecodedSignature.cs @@ -0,0 +1,153 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Sequence.Utils; +using UnityEngine; + +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() + { + clientDataJson = clientDataJson.Replace("\n", "").Replace(" ", ""); + 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 { new [] { flags } }; + + if (embedMetadata) + { + if (!publicKey.metadata.IsValid) + throw new Exception("Metadata is not present in the public key"); + + result.Add(publicKey.metadata.Encode()); + } + + result.Add(authDataSize.ByteArrayFromNumber(bytesAuthDataSize)); + result.Add(authenticatorData); + + var clientDataBytes = Encoding.UTF8.GetBytes(clientDataJson); + result.Add(clientDataBytes.Length.ByteArrayFromNumber(bytesClientDataJSONSize)); + result.Add(clientDataBytes); + + result.Add(challengeIndex.ByteArrayFromNumber(bytesChallengeIndex)); + result.Add(typeIndex.ByteArrayFromNumber(bytesTypeIndex)); + + result.Add(r.PadLeft(32)); + result.Add(s.PadLeft(32)); + + result.Add(publicKey.x.HexStringToByteArray()); + result.Add(publicKey.y.HexStringToByteArray()); + + return ByteArrayExtensions.ConcatenateByteArrays(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).Replace("\\", ""); + + 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 000000000..3507a2bab --- /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 000000000..109caec80 --- /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 000000000..26a722201 --- /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 000000000..8758a9888 --- /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 000000000..626318fd0 --- /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 000000000..f787604f9 --- /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 000000000..ea06874ad --- /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 000000000..4452f9659 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Passkeys/PublicKey.cs @@ -0,0 +1,30 @@ +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(); + } + } +} \ 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 000000000..a10a9d58a --- /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/Payload.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload.meta new file mode 100644 index 000000000..2ea5fc0c2 --- /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/Payload/BehaviourOnError.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/BehaviourOnError.cs new file mode 100644 index 000000000..10bcf775c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/BehaviourOnError.cs @@ -0,0 +1,13 @@ +using Newtonsoft.Json; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + [JsonConverter(typeof(EnumConverter))] + public enum BehaviourOnError + { + ignore = 0x00, + revert = 0x01, + abort = 0x02 + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/BehaviourOnError.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/BehaviourOnError.cs.meta new file mode 100644 index 000000000..9d04ed96a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/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/Payload/Call.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs new file mode 100644 index 000000000..f4eb8b9aa --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs @@ -0,0 +1,109 @@ +using System; +using System.Numerics; +using Newtonsoft.Json; +using Sequence.ABI; +using Sequence.Utils; +using UnityEngine.Scripting; +using StringExtensions = Sequence.Utils.StringExtensions; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + public 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; + public BigInteger gasLimit; + public bool delegateCall; + public bool onlyFallback; + public BehaviourOnError behaviorOnError = BehaviourOnError.revert; + + [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; + this.value = value; + this.data = data; + this.gasLimit = gasLimit; + this.delegateCall = delegateCall; + this.onlyFallback = onlyFallback; + this.behaviorOnError = behaviorOnError; + } + + public override bool Equals(object obj) + { + if (obj == null || !(obj is Call)) + { + return false; + } + + Call call = (Call)obj; + 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 && + dataEqual && + gasLimit == call.gasLimit && + delegateCall == call.delegateCall && + onlyFallback == call.onlyFallback && + 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); + byte[] toHash = new AddressCoder().Encode(to); + byte[] valueHash = new NumberCoder().Encode(value); + byte[] dataHash = SequenceCoder.KeccakHash(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(); + } + + public byte[] HashStruct() + { + return Hash().HexStringToByteArray(); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Call.cs.meta new file mode 100644 index 000000000..4514005a9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/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/Payload/CallDecoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallDecoder.cs new file mode 100644 index 000000000..e0be812bd --- /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 000000000..de3a0df1c --- /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/CallEncoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallEncoder.cs new file mode 100644 index 000000000..b1cfc8886 --- /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 000000000..21e7e1f1a --- /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 new file mode 100644 index 000000000..bbb2d0089 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using Sequence.ABI; +using Sequence.Utils; +using UnityEngine.Scripting; + +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; + + 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; + } + + 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); + byte[] nonceEncoded = new NumberCoder().Encode(nonce); + byte[] callsEncoded = new byte[] { }; + if (calls != null) + { + foreach (var call in calls) + { + callsEncoded = ByteArrayExtensions.ConcatenateByteArrays(callsEncoded, call.HashStruct()); + } + } + callsEncoded = SequenceCoder.KeccakHash(callsEncoded); + byte[] encoded = ByteArrayExtensions.ConcatenateByteArrays( + spaceEncoded, + nonceEncoded, + callsEncoded + ); + 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) + { + CallsEncoder encoder = new CallsEncoder(self, this); + return encoder.Encode(); + } + + public static Calls Decode(byte[] packed, Address self = null) + { + CallsDecoder decoder = new CallsDecoder(packed); + return decoder.Decode(self); + } + + 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/Calls.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Calls.cs.meta new file mode 100644 index 000000000..4953efcd8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/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/Payload/CallsDecoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsDecoder.cs new file mode 100644 index 000000000..970818c25 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsDecoder.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Numerics; +using Sequence.Utils; + +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 000000000..6c4e10ffe --- /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 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 000000000..bf715a403 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/CallsEncoder.cs @@ -0,0 +1,158 @@ +using System; +using System.Numerics; +using Sequence.Utils; +using UnityEngine; + +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 000000000..fb31ea557 --- /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 diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs new file mode 100644 index 000000000..2c2ff280f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Sequence.ABI; +using Sequence.Utils; +using UnityEngine.Scripting; + +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; + + [Preserve] + public ConfigUpdate(string imageHash) + { + this.imageHash = imageHash; + } + + public override byte[] GetEIP712EncodeData() + { + byte[] encoded = SequenceCoder.KeccakHash(imageHash.HexStringToByteArray()); + 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()); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConfigUpdate.cs.meta new file mode 100644 index 000000000..4c3c760bc --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/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/Payload/ConvertTypedDataToSignToNethereum.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/ConvertTypedDataToSignToNethereum.cs new file mode 100644 index 000000000..75b1e6670 --- /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 +{ + public 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."); + } + } + + public 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 + }; + } + + public 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; + } + + public 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 000000000..1f716d0cf --- /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/Digest.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs new file mode 100644 index 000000000..8d85fa94b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs @@ -0,0 +1,38 @@ +using System; +using Sequence.ABI; +using Sequence.Utils; +using UnityEngine.Scripting; +using System.Linq; + +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; + } + + public override byte[] GetEIP712EncodeData() + { + byte[] encoded = SequenceCoder.KeccakHash(digest.HexStringToByteArray()); + 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()); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Digest.cs.meta new file mode 100644 index 000000000..a1d8523e5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/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/Payload/Domain.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs new file mode 100644 index 000000000..97a6309cc --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs @@ -0,0 +1,141 @@ +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; + public string version; + 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 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) + { + 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; + } + } + + public byte[] GetDomainSeparator() + { + string encodeType = + "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)"; + byte[] typeHash = SequenceCoder.KeccakHashASCII(encodeType).HexStringToByteArray(); + 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 FixedBytesCoder().Encode(new byte[32]); + byte[] encoded = ByteArrayExtensions.ConcatenateByteArrays(typeHash, nameHash, versionHash, + chainIdHash, verifyingContractHash, saltHash); + return encoded; + } + + 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/Primitives/Payload/Domain.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Domain.cs.meta new file mode 100644 index 000000000..2d9ac3c97 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/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/Payload/EncodeSapient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs new file mode 100644 index 000000000..28da1cca8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs @@ -0,0 +1,61 @@ +using System; +using System.Numerics; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + public 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; + + 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; + } + + 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/EncodeSapient.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/EncodeSapient.cs.meta new file mode 100644 index 000000000..c8e95cbd2 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/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/Payload/Message.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs new file mode 100644 index 000000000..ee733a59d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Sequence.ABI; +using Sequence.Utils; +using UnityEngine.Scripting; + +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; + + [Preserve] + public Message(byte[] message) + { + this.message = message; + } + + public override byte[] GetEIP712EncodeData() + { + byte[] encoded = SequenceCoder.KeccakHash(message); + 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()); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Message.cs.meta new file mode 100644 index 000000000..ae1eb06e8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/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/Payload/NamedType.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs new file mode 100644 index 000000000..f17670d43 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs @@ -0,0 +1,34 @@ +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; + } + + 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); + } + + public override string ToString() + { + return $"{type} {name}"; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/NamedType.cs.meta new file mode 100644 index 000000000..8c1f60055 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/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/Payload/Parent.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parent.cs new file mode 100644 index 000000000..9058e16e4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/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/Payload/Parent.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parent.cs.meta new file mode 100644 index 000000000..f363ab104 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/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/Parented.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs new file mode 100644 index 000000000..c28a14e0d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs @@ -0,0 +1,160 @@ +using System; +using System.Linq; +using System.Numerics; +using Sequence.ABI; +using Sequence.Utils; +using UnityEngine.Scripting; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + public class Parented + { + public Payload payload; + public Address[] parentWallets; + + [Preserve] + 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 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() + { + byte[] payloadEncoded = payload.GetEIP712EncodeData(); + byte[] parentWalletsEncoded = new byte[] { }; + if (parentWallets != null) + { + foreach (var parentWallet in parentWallets) + { + parentWalletsEncoded = + ByteArrayExtensions.ConcatenateByteArrays(parentWalletsEncoded, new AddressCoder().Encode(parentWallet)); + } + } + + string asHex = parentWalletsEncoded.ByteArrayToHexStringWithPrefix(); + + parentWalletsEncoded = SequenceCoder.KeccakHash(parentWalletsEncoded); + + asHex = parentWalletsEncoded.ByteArrayToHexStringWithPrefix(); + + 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; + } + + 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) + { + 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/Parented.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs.meta new file mode 100644 index 000000000..bc4abf119 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Parented.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bc8759a1ecbb4aaa84fb89ba442ae246 +timeCreated: 1747170242 \ 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 new file mode 100644 index 000000000..c84baa8f7 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Payload.cs @@ -0,0 +1,17 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public abstract class Payload + { + public abstract PayloadType type { get; } + 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; + + 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/Payload.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/Payload.cs.meta new file mode 100644 index 000000000..b61356b08 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/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/Payload/PayloadType.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/PayloadType.cs new file mode 100644 index 000000000..566057c26 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/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# + public 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/PayloadType.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/PayloadType.cs.meta new file mode 100644 index 000000000..2396444df --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/PayloadType.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 811448a2c4d14b6baa0afa89d826bc5a +timeCreated: 1746042803 \ 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 new file mode 100644 index 000000000..c4873b24e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs @@ -0,0 +1,103 @@ +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) + { + solidityEncodedPayload = solidityEncodedPayload.Replace("0x", "").Substring(64); + object[] decoded = ABI.ABI.Decode(solidityEncodedPayload, DecodedAbi); + return new SolidityDecoded( + kind : ToKind((BigInteger)decoded[0]), + noChainId : (bool)decoded[1], + calls : ToCalls((object[])decoded[2]), + space : (BigInteger)decoded[3], + nonce : (BigInteger)decoded[4], + 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() + ); + } + + public enum Kind + { + Transaction = 0x00, + Message = 0x01, + 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/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/SolidityDecoded.cs.meta new file mode 100644 index 000000000..e261d8efc --- /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/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs new file mode 100644 index 000000000..19ebe96eb --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs @@ -0,0 +1,305 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Numerics; +using System.Text; +using Newtonsoft.Json; +using Sequence.ABI; +using Sequence.Utils; +using UnityEngine.Scripting; +using Nethereum.ABI.EIP712; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class TypedDataToSign + { + public Domain domain; + public Dictionary types; + public string primaryType; + public Dictionary message; + + 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 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; + } + } + else + { + return false; + } + } + } + else + { + return false; + } + + 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) + { + this.domain = domain; + 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."); + } + } + + 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", chainId, wallet); + switch (payload.payload.type) + { + case PayloadType.Call: + { + types = Calls.Types; + + Calls callPayload = (Calls)payload.payload; + message = new Dictionary + { + ["space"] = callPayload.space.ToString(), + ["nonce"] = callPayload.nonce.ToString(), + ["wallets"] = payload.parentWallets ?? Array.Empty
() + }; + 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(call); + } + message.Add("calls", encoded); + primaryType = "Calls"; + break; + } + case PayloadType.Message: + { + types = Message.Types; + + var messagePayload = (Message)payload.payload; + message = new Dictionary + { + ["message"] = messagePayload.message.ByteArrayToHexStringWithPrefix(), + ["wallets"] = payload.parentWallets + }; + primaryType = "Message"; + break; + } + case PayloadType.ConfigUpdate: + { + types = ConfigUpdate.Types; + + 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}"); + } + } + + // 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() + { + var eip712TypedDataEncoder = new Eip712TypedDataEncoder(); + + bool hasSalt = domain.HasSalt(); + byte[] encodedTypedData; + ConvertTypedDataToSignToNethereum converter = new ConvertTypedDataToSignToNethereum(this); + if (hasSalt) + { + TypedData nethereumTypedDataWithSalt = + converter.ConvertToNethereumTypedDataWithSalt(); + encodedTypedData = eip712TypedDataEncoder.EncodeTypedData(nethereumTypedDataWithSalt); + } + else + { + TypedData nethereumTypedData = + converter.ConvertToNethereumTypedDataWithoutSalt(); + encodedTypedData = eip712TypedDataEncoder.EncodeTypedData(nethereumTypedData); + } + + return SequenceCoder.KeccakHash(encodedTypedData); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs.meta new file mode 100644 index 000000000..e21b281dd --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Payload/TypedDataToSign.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: dc45828618204d9cb5ebe558ea42b2ea +timeCreated: 1746041921 \ No newline at end of file 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 000000000..6d4b7164f --- /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 000000000..dcbfc5506 --- /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 : int + { + 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/ParameterOperation.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterOperation.cs.meta new file mode 100644 index 000000000..161a0753e --- /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 000000000..f01fc7e93 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/ParameterRule.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using Newtonsoft.Json; +using Sequence.EcosystemWallet.Primitives.Common; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + public class ParameterRule + { + 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; + public int operation; + public Bytes value; + public BigInt offset; + public Bytes mask; + + public object ToJson() + { + return new + { + cumulative = cumulative, + operation = (int)operation, + value = value, + offset = offset, + mask = mask + }; + } + + public byte[] Encode() + { + byte operationCumulative = (byte)(((byte)operation << 1) | (cumulative ? 1 : 0)); + List result = new() { operationCumulative }; + result.AddRange(value.Data.PadLeft(32)); + result.AddRange(offset.Value.ToByteArray().PadLeft(32)); + result.AddRange(mask.Data.PadLeft(32)); + return result.ToArray(); + } + + public static ParameterRule FromJson(string json) + { + var data = JsonConvert.DeserializeObject>(json); + return new() + { + cumulative = (bool)data["cumulative"], + operation = Convert.ToInt32(data["operation"]), + value = data["value"].ToString().HexStringToByteArray(), + offset = BigInteger.Parse(data["offset"].ToString()), + mask = data["mask"].ToString().HexStringToByteArray() + }; + } + + 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 = (int)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 000000000..07da28f06 --- /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 000000000..4729fb2cb --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/Permission.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +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 object ToJson() + { + return new + { + target = target.Value, + rules = rules.Select(rule => rule.ToJson()).ToArray(), + }; + } + + 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 FromJson(string json) + { + var data = JsonConvert.DeserializeObject>(json); + return new() + { + target = new Address((string)data["target"]), + rules = JsonConvert.DeserializeObject>(data["rules"].ToString()) + .Select(r => ParameterRule.FromJson(r.ToString())) + .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 000000000..641d631b2 --- /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 000000000..217881cbe --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using Newtonsoft.Json; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet.Primitives +{ + [Serializable] + public class SessionPermissions + { + public Address sessionAddress; + public BigInteger chainId; + public BigInteger valueLimit; + public BigInteger deadline; + public Permission[] permissions; + + public object ToJson() + { + return new + { + chainId = chainId, + sessionAddress = sessionAddress, + valueLimit = valueLimit, + deadline = deadline, + permissions = permissions.Select(permission => permission.ToJson()).ToArray() + }; + } + + public byte[] Encode() + { + if (permissions.Length > Permission.MAX_PERMISSIONS_COUNT) { + throw new Exception("Too many permissions"); + } + + List result = new(); + result.AddRange(sessionAddress.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); + + 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 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, pointer); + permissions[i] = permission; + pointer += consumed; + } + + return new SessionPermissions { + sessionAddress = signer, + chainId = chainId, + valueLimit = valueLimit, + deadline = deadline, + permissions = permissions + }; + } + + public static SessionPermissions FromJson(string json) + { + var data = JsonConvert.DeserializeObject>(json); + return new SessionPermissions + { + sessionAddress = 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/Permission/SessionPermissions.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Permission/SessionPermissions.cs.meta new file mode 100644 index 000000000..0843d6b58 --- /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 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 000000000..ffa98350c --- /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/BranchParser.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/BranchParser.cs new file mode 100644 index 000000000..0ef8b9d8c --- /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 000000000..dd7082d60 --- /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 new file mode 100644 index 000000000..49b6074e2 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs @@ -0,0 +1,36 @@ +using System; +using Sequence.Utils; + +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 }; + } + + 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/RecoveryBranch.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryBranch.cs.meta new file mode 100644 index 000000000..05b4e7839 --- /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 000000000..caa0ac756 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryLeaf.cs @@ -0,0 +1,65 @@ +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; + + public object ToJsonObject() + { + return new + { + signer = signer.Value, + requiredDeltaTime = requiredDeltaTime.ToString(), + minTimestamp = minTimestamp.ToString() + }; + } + + public byte[] Encode() + { + return ByteArrayExtensions.ConcatenateByteArrays( + RecoveryTopology.FlagLeaf.ByteArrayFromNumber(1), + signer.Value.HexStringToByteArray(20), + requiredDeltaTime.ByteArrayFromNumber(3), + minTimestamp.ByteArrayFromNumber(8)); + } + + public byte[] EncodeRaw() + { + return ByteArrayExtensions.ConcatenateByteArrays( + HashPrefix, + signer.Value.HexStringToByteArray(20), + requiredDeltaTime.ByteArrayFromNumber(32), + minTimestamp.ByteArrayFromNumber(32)); + } + + 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.ToLower()), + 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 000000000..f26ff69a1 --- /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/Recovery/RecoveryNode.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryNode.cs new file mode 100644 index 000000000..9c2dadd54 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryNode.cs @@ -0,0 +1,21 @@ +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 ByteArrayExtensions.ConcatenateByteArrays( + RecoveryTopology.FlagNode.ByteArrayFromNumber(1), + 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 000000000..7fdb1e78f --- /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 new file mode 100644 index 000000000..0c22df9b8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Recovery/RecoveryTopology.cs @@ -0,0 +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(true).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(true).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 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 000000000..539a167bd --- /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.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions.meta new file mode 100644 index 000000000..342b6895d --- /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/ExplicitSessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ExplicitSessionCallSignature.cs new file mode 100644 index 000000000..5cd20810f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ExplicitSessionCallSignature.cs @@ -0,0 +1,10 @@ +using System.Numerics; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class ExplicitSessionCallSignature : SessionCallSignature + { + public BigInteger permissionIndex; + public RSY sessionSignature; + } +} \ 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 000000000..43485f29a --- /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/IdentitySignerLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs new file mode 100644 index 000000000..976a6625a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs @@ -0,0 +1,38 @@ +using Sequence.Utils; + +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 Json + { + type = IdentitySignerType, + identitySigner = identitySigner.Value, + }; + } + + public override byte[] Encode() + { + var flag = SessionsTopology.FlagIdentitySigner << 4; + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), + identitySigner.Value.HexStringToByteArray()); + } + + public override byte[] EncodeRaw() + { + 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/IdentitySignerLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/IdentitySignerLeaf.cs.meta new file mode 100644 index 000000000..88fa29ed4 --- /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 000000000..c4b96d8e0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs @@ -0,0 +1,64 @@ +using System; +using System.Linq; +using Sequence.Utils; + +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 Json + { + type = ImplicitBlacklistType, + blacklist = blacklist is { Length: <= 0 } ? + blacklist.Select(a => a.Value).ToArray() : + Array.Empty() + }; + } + + public override byte[] Encode() + { + var encoded = EncodeBlacklist(); + + 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); + } + + public override byte[] EncodeRaw() + { + return ByteArrayExtensions.ConcatenateByteArrays( + SessionsTopology.FlagBlacklist.ByteArrayFromNumber(1), + EncodeBlacklist()); + } + + 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/ImplicitBlacklistLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitBlacklistLeaf.cs.meta new file mode 100644 index 000000000..874f123c5 --- /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/ImplicitSessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitSessionCallSignature.cs new file mode 100644 index 000000000..073cdc16e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/ImplicitSessionCallSignature.cs @@ -0,0 +1,9 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public class ImplicitSessionCallSignature : SessionCallSignature + { + public Attestation attestation; + public RSY identitySignature; + public RSY sessionSignature; + } +} \ 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 000000000..f25c1190e --- /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/PermissionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs new file mode 100644 index 000000000..4f23107b8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs @@ -0,0 +1,25 @@ +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class PermissionLeaf : SessionLeaf + { + public SessionPermissions permissions; + + public override object ToJsonObject() + { + return permissions.ToJson(); + } + + public override byte[] Encode() + { + var flag = SessionsTopology.FlagPermissions << 4; + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), permissions.Encode()); + } + + public override byte[] EncodeRaw() + { + 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/PermissionLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/PermissionLeaf.cs.meta new file mode 100644 index 000000000..c2a49c104 --- /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 000000000..acef81643 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionBranch.cs @@ -0,0 +1,55 @@ +using System; +using System.Linq; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + 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) + { + if (children.Length < 2) + throw new Exception("Session Branch has less than 2 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); + } + } +} \ 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 000000000..20221a048 --- /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/SessionCallSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs new file mode 100644 index 000000000..ebbf62d4d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionCallSignature.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using Newtonsoft.Json; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public abstract class SessionCallSignature + { + public static SessionCallSignature FromJson(string json) + { + var data = JsonConvert.DeserializeObject>(json); + if (data.TryGetValue("identitySignature", out var identitySignature)) + { + return new ImplicitSessionCallSignature + { + attestation = JsonConvert.DeserializeObject(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 = RSY.FromString((string)data["sessionSignature"]), + }; + } + + throw new Exception("Invalid signature"); + } + + public static byte[] EncodeSignatures(SessionCallSignature[] signatures, SessionsTopology sessionsTopology, + Address[] explicitSigners, Address[] implicitSigners) + { + var parts = new List(); + + if (!sessionsTopology.IsComplete()) + throw new Exception("Incomplete topology"); + + var identitySigner = sessionsTopology.GetIdentitySigner(); + sessionsTopology = sessionsTopology.Minimise(explicitSigners, implicitSigners, identitySigner); + + 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 = JsonConvert.SerializeObject(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 = JsonConvert.SerializeObject(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 000000000..fb101ce91 --- /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/SessionLeaf.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs new file mode 100644 index 000000000..5ce1b72d5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs @@ -0,0 +1,18 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public abstract class SessionLeaf : ILeaf + { + public const string ImplicitBlacklistType = "implicit-blacklist"; + public const string IdentitySignerType = "identity-signer"; + public const string SessionPermissionsType = "session-permissions"; + + public abstract object ToJsonObject(); + public abstract byte[] Encode(); + public abstract byte[] EncodeRaw(); + + 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.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionLeaf.cs.meta new file mode 100644 index 000000000..7b721da34 --- /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 000000000..d2fda51e3 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs @@ -0,0 +1,30 @@ +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class SessionNodeLeaf : INode + { + public byte[] Value { get; set; } + + public object ToJsonObject() + { + return Value.ByteArrayToHexStringWithPrefix(); + } + + public byte[] Encode() + { + var flag = SessionsTopology.FlagNode << 4; + return ByteArrayExtensions.ConcatenateByteArrays(flag.ByteArrayFromNumber(flag.MinBytesFor()), Value); + } + + 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/SessionNodeLeaf.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionNodeLeaf.cs.meta new file mode 100644 index 000000000..0b30b2a1e --- /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 000000000..e7b96a2ca --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopology.cs @@ -0,0 +1,376 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using JetBrains.Annotations; +using Newtonsoft.Json; +using Sequence.ABI; +using Sequence.Utils; +using UnityEngine; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class SessionsTopology : ITopology + { + 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 IBranch Branch { get; } + public ILeaf Leaf { get; } + public INode Node { get; } + + public SessionsTopology(SessionBranch branch) + { + this.Branch = branch; + } + + public SessionsTopology(SessionLeaf leaf) + { + this.Leaf = leaf; + } + + public SessionsTopology(SessionNodeLeaf node) + { + this.Node = node; + } + + public string JsonSerialize() + { + return JsonConvert.SerializeObject(this.ToJsonObject()); + } + + public string ImageHash() + { + return this.Hash(true); + } + + /// + /// Optimise the configuration tree by rolling unused signers into nodes. + /// + /// 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, Address identitySigner) + { + if (this.IsBranch()) + { + var branchList = ((SessionsTopology[])Branch.Children) + .Select(branch => (ITopology)branch.Minimise(explicitSigners, implicitSigners, identitySigner)) + .ToArray(); + + if (branchList.All(b => b.Node is SessionNodeLeaf)) + { + var nodeBytes = branchList + .Select(node => (node.Node as SessionNodeLeaf)?.Value) + .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.sessionAddress)) + return this; + + return new SessionNodeLeaf + { + Value = this.Hash(true).HexStringToByteArray() + }.ToTopology(); + } + + if (Leaf is ImplicitBlacklistLeaf) + { + if (implicitSigners.Length == 0) + { + return new SessionNodeLeaf + { + Value = this.Hash(true).HexStringToByteArray() + }.ToTopology(); + } + + return this; + } + + 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"); + } + + public bool IsComplete() + { + return this.FindLeaf(_ => true) != null && + this.FindLeaf(_ => true) != null; + } + + public SessionsTopology AddExplicitSession(SessionPermissions session) + { + var existingPermission = this.FindLeaf(leaf => + leaf.permissions.sessionAddress.Equals(session.sessionAddress)); + + if (existingPermission != null) + throw new Exception("Session already exists."); + + return SessionsTopologyUtils.BalanceSessionsTopology(MergeSessionsTopologies(this, new PermissionLeaf + { + permissions = session + }.ToTopology())); + } + + [CanBeNull] + public SessionsTopology RemoveExplicitSession(Address address) + { + if (this.IsLeaf() && Leaf is PermissionLeaf permissionLeaf) + return permissionLeaf.permissions.sessionAddress.Equals(address) ? null : this; + + if (this.IsBranch()) + { + var newChildren = new List(); + foreach (var child in (SessionsTopology[])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 Address GetIdentitySigner() + { + return this.FindLeaf()?.identitySigner; + } + + public Address[] GetImplicitBlacklist() + { + return this.FindLeaf().blacklist; + } + + public SessionPermissions GetPermissions(Address signer) + { + 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.sessionAddress.Equals(signer)) + return permissionLeaf.permissions; + + return null; + } + + public Address[] GetExplicitSigners() + { + return GetExplicitSigners(Array.Empty
()); + } + + public Address[] GetExplicitSigners(Address[] current) + { + if (this.IsLeaf() && Leaf is PermissionLeaf permissionLeaf) + return current.AddToArray(permissionLeaf.permissions.sessionAddress); + + 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(); + 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.OrderBy(h => h.Value.HexStringToByteArray(), new ByteArrayComparer()).ToArray(); + } + + public void RemoveFromImplicitBlacklist(Address address) + { + var leaf = this.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 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("[")) + { + 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 + { + permissions = new() + { + sessionAddress = new Address((string)data["sessionAddress"]), + 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: + var identitySigner = data["identitySigner"].ToString(); + return new IdentitySignerLeaf + { + identitySigner = new Address(identitySigner) + }.ToTopology(); + case SessionLeaf.ImplicitBlacklistType: + var blacklistJson = data["blacklist"].ToString(); + var blacklist = JsonConvert.DeserializeObject(blacklistJson); + return new ImplicitBlacklistLeaf + { + blacklist = blacklist.Select(b => new Address(b)).ToArray() + }.ToTopology(); + default: + throw new Exception("Invalid topology."); + } + } + } +} \ 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 000000000..bc5022d33 --- /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 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 000000000..5bef49366 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Sessions/SessionsTopologyUtils.cs @@ -0,0 +1,62 @@ +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.Leaf != null) + return new [] { topology }; + + 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 as SessionsTopology)); + + 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 000000000..ff52edc82 --- /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/EcosystemWallet/Primitives/Signature.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature.meta new file mode 100644 index 000000000..ede69d2df --- /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/ChainedSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs new file mode 100644 index 000000000..cbe76681b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/ChainedSignature.cs @@ -0,0 +1,60 @@ +using System; +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) + { + 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, + checkpointerDataSize.ByteArrayFromNumber(3), + sigForCheckpointer.checkpointerData ?? new byte[0]); + } + + 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"); + + var encodedSize = encoded.Length.ByteArrayFromNumber(3); + output = ByteArrayExtensions.ConcatenateByteArrays(output, encodedSize, encoded); + } + + 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 000000000..0e794478e --- /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/Erc6492.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/Erc6492.cs new file mode 100644 index 000000000..a9577806e --- /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 000000000..426074a6d --- /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/RSY.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs new file mode 100644 index 000000000..eed109283 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs @@ -0,0 +1,94 @@ +using System; +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; + public BigInt s; + public int yParity; + + public byte[] Pack() + { + if (yParity != 0 && yParity != 1) + throw new ArgumentException("yParity must be 0, 1"); + + var rBytes = r.Value.ByteArrayFromNumber(32); + var sBytes = s.Value.ByteArrayFromNumber(32); + + if (yParity % 2 == 1) + sBytes[0] |= 0x80; + + 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(':'); + 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) + throw new ArgumentException($"RSY must be exactly 64 bytes ({rsy.Length})"); + + 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 new RSY + { + r = r, + s = s, + yParity = yParity, + }; + } + + 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) + 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/RSY.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RSY.cs.meta new file mode 100644 index 000000000..4aa553acf --- /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/RawSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs new file mode 100644 index 000000000..48e9a3599 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs @@ -0,0 +1,224 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Sequence.EcosystemWallet.Utils; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class RawSignature + { + public bool noChainId = true; + public byte[] checkpointerData; + public Config configuration; + public RawSignature[] suffix; + public Erc6492 erc6492; + + public string ToJson() + { + var jsonObject = new Dictionary(); + + jsonObject.Add("noChainId", noChainId); + + if (checkpointerData != null) + jsonObject.Add("checkpointerData", checkpointerData.ByteArrayToHexStringWithPrefix()); + + jsonObject.Add("configuration", new + { + 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); + } + + 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 = null + }; + + var chained = new List { head }; + chained.AddRange(suffix); + + var chainedSignature = new ChainedSignature(chained.ToArray()); + var chainedEncoded = chainedSignature.Encode(); + + return erc6492 != null ? Erc6492Helper.Wrap(chainedEncoded, erc6492.to, erc6492.data) : chainedEncoded; + } + + byte flag = 0; + if (noChainId) + flag |= 0x02; + + int bytesForCheckpoint = configuration.checkpoint.MinBytesFor(); + if (bytesForCheckpoint > 7) + throw new Exception("Checkpoint too large"); + + flag |= (byte)(bytesForCheckpoint << 2); + + 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 (configuration.checkpointer != null && !skipCheckpointerAddress) + { + flag |= 0x40; + } + + byte[] output = new byte[] { flag }; + + if (configuration.checkpointer != null && !skipCheckpointerAddress) + { + var checkpointerBytes = configuration.checkpointer.Value.HexStringToByteArray(); + output = ByteArrayExtensions.ConcatenateByteArrays(output, checkpointerBytes.PadLeft(20)); + + if (!skipCheckpointerData) + { + int checkpointerDataSize = checkpointerData?.Length ?? 0; + if (checkpointerDataSize > 16777215) + throw new Exception("Checkpointer data too large"); + + output = ByteArrayExtensions.ConcatenateByteArrays(output, checkpointerDataSize.ByteArrayFromNumber(3), checkpointerData ?? Array.Empty()); + } + } + + var checkpointBytes = configuration.checkpoint.ByteArrayFromNumber(bytesForCheckpoint); + output = ByteArrayExtensions.ConcatenateByteArrays(output, checkpointBytes); + + var thresholdBytes = configuration.threshold.ByteArrayFromNumber(bytesForThreshold); + output = ByteArrayExtensions.ConcatenateByteArrays(output, thresholdBytes); + + var topologyBytes = configuration.topology.Encode(noChainId, checkpointerData); + output = ByteArrayExtensions.ConcatenateByteArrays(output, topologyBytes); + + return erc6492 != null ? Erc6492Helper.Wrap(output, erc6492.to, erc6492.data) : output; + } + + public static RawSignature Decode(byte[] erc6492Signature) + { + 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) + { + AssertBytes("checkpointer address", index, 20, signature.Length); + + 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)]; + index += dataSize; + } + + int checkpointSize = (flag & 0x1C) >> 2; + + 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 ((flag & 0x01) == 0x01) + { + var subsignatures = new List(); + + while (index < signature.Length) + { + AssertBytes("chained subsignature size", index, 3, signature.Length); + + int subSize = signature[index..(index + 3)].ToInteger(); + index += 3; + + AssertBytes("chained subsignature", index, subSize, signature.Length); + + 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 = subsignatures[0].checkpointerData, + configuration = subsignatures[0].configuration, + suffix = subsignatures.GetRange(1, subsignatures.Count - 1).ToArray(), + 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"); + + 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 + }; + } + + 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/RawSignature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/RawSignature.cs.meta new file mode 100644 index 000000000..a6fbe6cf1 --- /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/SignatureHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs new file mode 100644 index 000000000..dd9e838e9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs @@ -0,0 +1,106 @@ +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, + 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, + 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(SignedEnvelope 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 = topology, + } + }; + } + + public static EnvelopeSignature SignatureForLeaf(SignedEnvelope 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/SignatureHandler.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs.meta new file mode 100644 index 000000000..4618e1ca3 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureHandler.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7268a3747990492eae4a959ca3595c06 +timeCreated: 1747224287 \ No newline at end of file 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 000000000..cfbedeb10 --- /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 000000000..cebb8b59e --- /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 new file mode 100644 index 000000000..ae05a7fb0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSapientSignerLeaf.cs @@ -0,0 +1,54 @@ +using System; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class SignatureOfSapientSignerLeaf : SignatureOfLeaf + { + 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 SapientSignerLeaf signerLeaf) + throw new Exception(); + + var weight = signerLeaf.weight; + var weightBytes = Array.Empty(); + + var flag = (type == "sapient" ? + Topology.FlagSignatureSapient : + Topology.FlagSignatureSapientCompact) + << 4; + + var bytesForSignatureSize = data.Length.MinBytesFor(); + if (bytesForSignatureSize > 3) + throw new Exception("Signature too large"); + + flag |= bytesForSignatureSize << 2; + + if (weight <= 3 && weight > 0) + flag |= (int)weight; + else if (weight <= 255) + weightBytes = weight.ByteArrayFromNumber(weight.MinBytesFor()); + else + throw new Exception("Weight too large"); + + return ByteArrayExtensions.ConcatenateByteArrays( + flag.ByteArrayFromNumber(flag.MinBytesFor()), + weightBytes, + address.Value.HexStringToByteArray(20), + data.Length.ByteArrayFromNumber(bytesForSignatureSize), + data); + } + } +} \ 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 000000000..7c8042a09 --- /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 000000000..bb2274f92 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeaf.cs @@ -0,0 +1,7 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public abstract class SignatureOfSignerLeaf : SignatureOfLeaf + { + + } +} \ 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 000000000..1a37c8035 --- /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 000000000..70f7bbd3b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafErc1271.cs @@ -0,0 +1,42 @@ +using System; +using System.Linq; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + public class SignatureOfSignerLeafErc1271 : SignatureOfSignerLeaf + { + 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(signerLeaf.weight.MinBytesFor()); + else + throw new Exception("Weight too large"); + + return ByteArrayExtensions.ConcatenateByteArrays( + flag.ByteArrayFromNumber(flag.MinBytesFor()), + weightBytes, + address.Value.HexStringToByteArray(20), + data.Length.ByteArrayFromNumber(sizeLen), + 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 000000000..af151d1a8 --- /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 000000000..6fe42349f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs @@ -0,0 +1,31 @@ +using System; +using System.Linq; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + 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) + 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(flag.MinBytesFor()); + else + throw new Exception("Weight too large"); + + 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/SignatureOfSignerLeafEthSign.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafEthSign.cs.meta new file mode 100644 index 000000000..e4eb5ef6f --- /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 000000000..0d7c524ed --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs @@ -0,0 +1,32 @@ +using System; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Primitives +{ + 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($"Leaf type is not supported: {leaf.GetType()}"); + + var weight = signerLeaf.weight; + var weightBytes = Array.Empty(); + + var flag = Topology.FlagSignatureHash << 4; + + if (weight <= 15 && weight > 0) + flag |= (int)weight; + else if (weight <= 255) + weightBytes = weight.ByteArrayFromNumber(weight.MinBytesFor()); + else + throw new Exception("Weight too large"); + + 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.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignatureOfSignerLeafHash.cs.meta new file mode 100644 index 000000000..53a1d0202 --- /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 000000000..7f20de312 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSapientSignerLeaf.cs @@ -0,0 +1,35 @@ +using Sequence.Utils; + +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); + } + } +} \ 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 000000000..e2cd134bb --- /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 000000000..bf840b8ec --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Signature/SignedSignerLeaf.cs @@ -0,0 +1,34 @@ +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); + } + } +} \ 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 000000000..9a0313efb --- /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 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 000000000..b96dcb6f9 --- /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/BranchExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/BranchExtensions.cs new file mode 100644 index 000000000..af41f3c2d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/BranchExtensions.cs @@ -0,0 +1,12 @@ +using System.Linq; + +namespace Sequence.EcosystemWallet.Primitives +{ + public static class BranchExtensions + { + public static object ToJsonObject(this IBranch branch) + { + return branch.Children.Select(child => child.ToJsonObject()).ToArray(); + } + } +} \ 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 000000000..4e2d4dfcb --- /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 new file mode 100644 index 000000000..2137c31da --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/IBranch.cs @@ -0,0 +1,9 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public interface IBranch + { + ITopology[] Children { get; } + + 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 000000000..443aa8884 --- /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 000000000..77df26489 --- /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 ToJsonObject(); + 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 000000000..4ca9aea32 --- /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 000000000..4dee0fe1b --- /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 ToJsonObject(); + 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 000000000..406d1ba9d --- /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 000000000..d022a4e52 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/ITopology.cs @@ -0,0 +1,9 @@ +namespace Sequence.EcosystemWallet.Primitives +{ + public interface ITopology + { + IBranch Branch { get; } + ILeaf Leaf { get; } + INode Node { get; } + } +} \ 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 000000000..3656c48ba --- /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 000000000..7369fb267 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Primitives/Topology/TopologyExtensions.cs @@ -0,0 +1,103 @@ +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 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()) + { + 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) where T : ILeaf + { + return topology.FindLeaf(_ => true); + } + + 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 000000000..30c91b3cc --- /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 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 000000000..5781bad8a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/SequenceEcosystemWallet.asmdef @@ -0,0 +1,19 @@ +{ + "name": "SequenceEcosystemWallet", + "rootNamespace": "Sequence.EcosystemWallet", + "references": [ + "GUID:a35e3a53d4439435f8b36ed2c6158cd8", + "GUID:b4f9c0f8f363f439b9e337f79050f189", + "GUID:f7fd4ba36aabd1d499450c174865e70b", + "GUID:94b67778c44684afdab21990eebf60aa" + ], + "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 000000000..839e232d6 --- /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: 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 000000000..661321e04 --- /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 000000000..f12701340 --- /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 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 000000000..7937a9c95 --- /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/Envelope.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope.meta new file mode 100644 index 000000000..85d566e5d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2a77ab90a77d4051a70f71e43db08c6a +timeCreated: 1750960956 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Envelope.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Envelope.cs new file mode 100644 index 000000000..279308675 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Envelope.cs @@ -0,0 +1,36 @@ +using System.Numerics; +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.Envelope +{ + public class Envelope where T : Payload + { + public Address wallet; + 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 }, + }; + } + + 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/Envelope/Envelope.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Envelope.cs.meta new file mode 100644 index 000000000..78ec18226 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/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/Transactions/Envelope/EnvelopeSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/EnvelopeSignature.cs new file mode 100644 index 000000000..4f9a49913 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/EnvelopeSignature.cs @@ -0,0 +1,6 @@ +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.Envelope +{ + public abstract class EnvelopeSignature : SignatureOfLeaf { } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/EnvelopeSignature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/EnvelopeSignature.cs.meta new file mode 100644 index 000000000..866d7aaee --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/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/Transactions/Envelope/SapientSignature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SapientSignature.cs new file mode 100644 index 000000000..1ddc2439d --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SapientSignature.cs @@ -0,0 +1,22 @@ +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +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) + { + 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/Transactions/Envelope/SapientSignature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SapientSignature.cs.meta new file mode 100644 index 000000000..bee377e49 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/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/Transactions/Envelope/Signature.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Signature.cs new file mode 100644 index 000000000..48ba51d00 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Signature.cs @@ -0,0 +1,17 @@ +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.Envelope +{ + public class Signature : EnvelopeSignature + { + public override string type { get; } + + public Address address; + public SignatureOfSignerLeaf signature; + + public override byte[] Encode(Leaf leaf) + { + return signature.Encode(leaf); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Signature.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/Signature.cs.meta new file mode 100644 index 000000000..0abf4ef51 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/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/Transactions/Envelope/SignedEnvelope.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SignedEnvelope.cs new file mode 100644 index 000000000..5b047f0d8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SignedEnvelope.cs @@ -0,0 +1,9 @@ +using Sequence.EcosystemWallet.Primitives; + +namespace Sequence.EcosystemWallet.Envelope +{ + public class SignedEnvelope : Envelope where T : Payload + { + public EnvelopeSignature[] signatures; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SignedEnvelope.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SignedEnvelope.cs.meta new file mode 100644 index 000000000..75f2ca7d1 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/Envelope/SignedEnvelope.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/Transactions/FeeOptionService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/FeeOptionService.cs new file mode 100644 index 000000000..78f7af73f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/FeeOptionService.cs @@ -0,0 +1,49 @@ +using System.Numerics; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Relayer; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet +{ + internal class FeeOptionService + { + private static readonly Address ValueForwarder = new ("0xABAAd93EeE2a569cF0632f39B10A9f5D734777ca"); + + 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( + ValueForwarder, + 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/Transactions/FeeOptionService.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/FeeOptionService.cs.meta new file mode 100644 index 000000000..95f56a03a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/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/Transactions/ITransaction.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/ITransaction.cs new file mode 100644 index 000000000..3a5b91ade --- /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 000000000..51ab3888b --- /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 000000000..cecc1c587 --- /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 000000000..7ac628f88 --- /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 000000000..71ca8eb7a --- /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 000000000..62bc591a8 --- /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 000000000..a77f14e34 --- /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 000000000..abed1a494 --- /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 diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs new file mode 100644 index 000000000..e927f84d4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs @@ -0,0 +1,79 @@ +using System.Numerics; +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; + +namespace Sequence.EcosystemWallet +{ + internal class TransactionService + { + private SessionSigner[] _sessionSigners; + private WalletState _state; + + public TransactionService(SessionSigner[] sessionSigners, WalletState state) + { + _sessionSigners = sessionSigners; + _state = state; + } + + public async Task<(Address To, string Data)> 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 (_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 deployContext = _state.DeployContext; + var deployTransaction = Erc6492Helper.Deploy(_state.DeployHash, new Erc6492Helper.Context + { + creationCode = deployContext.walletCreationCode, + factory = deployContext.factory, + stage1 = deployContext.mainModule, + stage2 = deployContext.mainModuleUpgradable + }); + + return (new Address(deployContext.guestModule), 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 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/Transactions/TransactionService.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/TransactionService.cs.meta new file mode 100644 index 000000000..975343aa4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Transactions/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/Utils.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils.meta new file mode 100644 index 000000000..77eac38f6 --- /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/CryptoHelpers.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/CryptoHelpers.cs new file mode 100644 index 000000000..a39bdca28 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/CryptoHelpers.cs @@ -0,0 +1,103 @@ +using System; +using System.Linq; +using System.Text; +using Org.BouncyCastle.Crypto.Digests; +using NBitcoin.Secp256k1; +using Nethereum.Util; +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/Utils/CryptoHelpers.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/CryptoHelpers.cs.meta new file mode 100644 index 000000000..1145ead60 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/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/Utils/Erc6492Helper.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs new file mode 100644 index 000000000..79459ce09 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/Erc6492Helper.cs @@ -0,0 +1,85 @@ +using System; +using System.Threading.Tasks; +using Nethereum.ABI; +using Nethereum.ABI.FunctionEncoding; +using Nethereum.ABI.Model; +using Nethereum.Hex.HexConvertors.Extensions; +using Sequence.ABI; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +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 (Address 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) + { + return ABI.ABI.Pack("deploy(address,bytes32)", stage1, new FixedByte(32, deployHash.HexStringToByteArray())); + } + + 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), + new ABIValue("bytes", signature) + ); + + return HexUtils.Concat(encoded.ByteArrayToHexString(), MagicBytes).HexStringToByteArray(); + } + + 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) + { + var raw = signature[..^magicLength]; + + try + { + var decoder = new ParameterDecoder(); + var parameters = new Parameter[] + { + new ("address", 1), + new ("bytes", 2), + new ("bytes", 3), + }; + + var decoded = decoder.DecodeDefaultData(raw, parameters); + + 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 Erc6492(new Address(to), data)); + } + catch + { + return (signature, null); + } + } + + return (signature, null); + } + } +} \ 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 000000000..d6a3a8a1e --- /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/EcosystemWallet/Utils/SignatureUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs new file mode 100644 index 000000000..31b921a32 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Utils/SignatureUtils.cs @@ -0,0 +1,372 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet.Utils +{ + public static class SignatureUtils + { + public static string EncodeSignatureFromInput(string input, string signatures, bool noChainId, byte[] checkpointerData) + { + 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": + case "sapient_compact": + throw new Exception($"Incorrect type {candidate.Type} for leaf {leaf.GetType()}"); + 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": + 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() + }; + case "eth_sign": + case "hash": + case "erc1271": + throw new Exception($"Incorrect type {candidate.Type} for leaf {leaf.GetType()}"); + 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(); + 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 rsy = RSY.Unpack(signature[index..(index + 64)]); + index += 64; + + leafs.Add(new Topology(new SignedSignerLeaf + { + weight = new BigInteger(weight), + signature = new SignatureOfSignerLeafHash + { + rsy = rsy + } + })); + + 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 SignedSignerLeaf + { + 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 rsy = RSY.Unpack(signature[index..(index + 64)]); + index += 64; + + leafs.Add(new Topology(new SignedSignerLeaf + { + weight = new BigInteger(weight), + signature = new SignatureOfSignerLeafEthSign + { + rsy = rsy + } + })); + + 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 SignedSapientSignerLeaf + { + 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 000000000..2eac66577 --- /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/EcosystemWallet/Wallet.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet.meta new file mode 100644 index 000000000..d8779a9dc --- /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/Wallet/CallContractData.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/CallContractData.cs new file mode 100644 index 000000000..ca93bcc59 --- /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 000000000..f48eae3ea --- /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/Extensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs new file mode 100644 index 000000000..4773b5713 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs @@ -0,0 +1,27 @@ +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 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/Extensions.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/Extensions.cs.meta new file mode 100644 index 000000000..8e9f025cb --- /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/IWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs new file mode 100644 index 000000000..f79deed98 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs @@ -0,0 +1,98 @@ +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Relayer; + +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(IPermissions 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. + /// The message you want to sign. + /// + 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. + /// + /// + /// + /// + Task GetFeeOption(Chain chain, ITransaction[] transactions); + + /// + /// Send a single transaction. + /// + /// + /// + /// + /// + Task SendTransaction(Chain chain, ITransaction transaction, FeeOption feeOption = null); + + /// + /// Send a transaction. + /// + /// + /// + /// + /// + 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. + /// + /// + /// + /// 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 SupportsTransaction(Chain chain, ITransaction[] transactions); + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/IWallet.cs.meta new file mode 100644 index 000000000..6975ca7dd --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/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/Wallet/SequenceWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs new file mode 100644 index 000000000..7db4f37fa --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs @@ -0,0 +1,211 @@ +using System; +using System.Linq; +using System.Numerics; +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Primitives.Common; +using Sequence.Relayer; +using Sequence.Utils; +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; + private SessionSigner[] _sessionSigners; + + internal SequenceWallet(SessionSigner[] sessionSigners) + { + Address = sessionSigners[0].ParentAddress; + + _state = new WalletState(Address); + _sessionSigners = sessionSigners; + + WalletCreated?.Invoke(this); + } + + 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]); + + return new SequenceWallet(sessionWallets); + } + + public Address[] GetAllSigners() + { + return _sessionSigners.Select(x => x.Address).ToArray(); + } + + public async Task AddSession(IPermissions permissions) + { + AssertSessionSigners(); + Assert.IsNotNull(permissions); + + var client = new EcosystemClient(); + + var sessionSigners = await client.CreateNewSession(true, + permissions.GetPermissions(), string.Empty); + + foreach (var sessionSigner in sessionSigners) + _sessionSigners = _sessionSigners.AddToArray(sessionSigner); + } + + public void Disconnect() + { + SessionStorage.Clear(); + _sessionSigners = Array.Empty(); + Disconnected?.Invoke(); + } + + public async Task SignMessage(Chain chain, string message) + { + AssertSessionSigners(); + + var args = new SignMessageArgs + { + address = Address, + chainId = new BigInt((int)chain), + message = message + }; + + var client = new EcosystemClient(); + return await client.SendRequest("sign", "signMessage", args); + } + + 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); + + var calls = transactions.GetCalls(); + 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); + var response = await relayer.GetFeeOptions(args); + + 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) + { + AssertSessionSigners(); + + await _state.Update(chain); + + var calls = transactions.GetCalls(); + + if (feeOption != null) + { + var feeOptionService = new FeeOptionService(feeOption); + var isNativeTokenOption = feeOption.token.contractAddress.Equals(Address.ZeroAddress); + var feeOptionCall = isNativeTokenOption + ? feeOptionService.BuildCallForNativeTokenOption() + : feeOptionService.BuildCallForCustomTokenOption(); + + 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); + + 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.txnHash; + } + + public async Task SupportsTransaction(Chain chain, ITransaction transaction) + { + return await SupportsTransaction(chain, new[] { transaction }); + } + + public async Task SupportsTransaction(Chain chain, ITransaction[] transactions) + { + AssertSessionSigners(); + + try + { + await _state.Update(chain); + + var calls = transactions.GetCalls(); + var signerService = new SignerService(_sessionSigners, _state.SessionsTopology); + var signers = await signerService.FindSignersForCalls(chain, calls); + + return signers.Length == calls.Length; + } + catch (Exception e) + { + SequenceLog.Exception(e); + return false; + } + } + + 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(); + var response = await client.SendRequest("transaction", + "sendWalletTransaction", args); + + return response.transactionHash; + } + + 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/Wallet/SequenceWallet.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.cs.meta new file mode 100644 index 000000000..74e8c4e1b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SequenceWallet.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/Wallet/SessionSigner.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs new file mode 100644 index 000000000..186980d35 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs @@ -0,0 +1,233 @@ +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 +{ + internal class SessionSigner + { + public struct CallContractData + { + public Address to; + public string data; + } + + private static readonly Address ValueTrackingAddress = new ("0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"); + + public Address ParentAddress { get; } + public Address Address { get; } + public Chain Chain { get; } + public bool IsExplicit { get; } + public Attestation Attestation => _credentials.attestation; + + public Address IdentitySigner + { + get + { + if (IsExplicit) + throw new Exception("no identity signer for explicit sessions"); + + 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); + } + } + + private readonly SessionCredentials _credentials; + + 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]; + IsExplicit = credentials.isExplicit; + } + + public async Task IsSupportedCall(Call call, Chain chain, SessionsTopology topology) + { + 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)[])")) + { + return true; + } + + var supportedPermission = FindSupportedPermission(call, topology); + return supportedPermission.Index >= 0; + } + + return await CheckAcceptImplicitRequest(chain, call); + } + + private (int Index, Permission Permission) FindSupportedPermission(Call call, SessionsTopology topology) + { + var sessionPermissions = topology.GetPermissions(Address); + if (sessionPermissions == null || ChainDictionaries.ChainById[sessionPermissions.chainId.ToString()] != Chain) + return (-1, null); + + // TODO: Read current usage limit, use ValueTrackingAddress + var exceededLimit = call.value > 0 && call.value > sessionPermissions.valueLimit; + if (exceededLimit) + return (-1, null); + + var permissionIndex = -1; + for (var i = 0; i < sessionPermissions.permissions.Length; i++) + { + var permission = sessionPermissions.permissions[i]; + if (!permission.target.Equals(call.to)) + continue; + + permissionIndex = i; + break; + } + + if (permissionIndex < 0) + return (-1, null); + + return (permissionIndex, sessionPermissions.permissions[permissionIndex]); + } + + 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, callIdx, space, nonce); + var signedCall = EthSignature.Sign(hashedCall, eoaWallet.privKey); + + var rsy = RSY.UnpackFrom65(signedCall.HexStringToByteArray()); + + if (IsExplicit) + { + var permissionIndex = 0; + if (!(call.data.Length > 4 && call.data.Slice(4).ByteArrayToHexStringWithPrefix() == + ABI.ABI.FunctionSelector("incrementUsageLimit"))) + { + permissionIndex = FindSupportedPermission(call, topology).Index; + if (permissionIndex == -1) + throw new Exception("Invalid permission"); + } + + return new ExplicitSessionCallSignature + { + permissionIndex = permissionIndex, + sessionSignature = rsy + }; + } + + return new ImplicitSessionCallSignature + { + attestation = _credentials.attestation, + identitySignature = _credentials.signature, + sessionSignature = rsy + }; + } + + 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, callIdxBytes, callHashBytes); + return SequenceCoder.KeccakHash(concatenated); + } + + private async Task CheckAcceptImplicitRequest(Chain chain, Call call) + { + try + { + var response = await new SequenceEthClient(chain).CallContract(new object[] + { + new CallContractData + { + 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) + { + 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(); + } + + 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/SessionSigner.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.cs.meta new file mode 100644 index 000000000..ffb61a286 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SessionSigner.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/Wallet/SignatureService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs new file mode 100644 index 000000000..cb08f26f7 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs @@ -0,0 +1,91 @@ +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; + private SessionSigner[] _currentSigners; + + public SignatureService(SessionSigner[] sessionSigners, SessionsTopology sessions) + { + _sessions = 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 guardConfig = new GuardStorage().GetConfig(envelope.wallet); + if (signedEnvelope.ReachedThreshold() && guardConfig != null) + { + var guardSigner = new GuardSigner(guardConfig); + var guardSignature = await guardSigner.SignEnvelope(signedEnvelope); + signedEnvelope.signatures = signedEnvelope.signatures.AddToArray(guardSignature); + } + + var rawSignature = SignatureHandler.EncodeSignature(signedEnvelope); + + rawSignature.suffix = configUpdates.Reverse().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
(); + + _currentSigners = await _signerService.FindSignersForCalls(chain, calls); + + var signatures = new SessionCallSignature[_currentSigners.Length]; + for (var i = 0; i < _currentSigners.Length; i++) + { + var signature = _currentSigners[i].SignCall(chain, calls[i], i, _sessions, envelope.payload.space, envelope.payload.nonce); + signatures[i] = signature; + } + + foreach (var signer in _currentSigners) + { + 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 = ExtensionsFactory.Current.Sessions, + data = sessionSignatures + }; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignatureService.cs.meta new file mode 100644 index 000000000..e8f64fe63 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/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/Wallet/SignerService.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs new file mode 100644 index 000000000..c4ca107e9 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Utils; + +namespace Sequence.EcosystemWallet +{ + public class SignerException : Exception + { + public SignerException(string message) : base(message) { } + } + + 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 SignerException("no valid signers found"); + + var supportedSignersForCalls = await FindSignerForEachCall(chain, availableSigners, calls); + + if (supportedSignersForCalls.Length != calls.Length) + throw new SignerException("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/Wallet/SignerService.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/SignerService.cs.meta new file mode 100644 index 000000000..763065573 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/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/Wallet/WalletState.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs new file mode 100644 index 000000000..751529b2c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs @@ -0,0 +1,203 @@ +using System; +using System.Numerics; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Sequence.EcosystemWallet.KeyMachine.Models; +using Sequence.EcosystemWallet.Primitives; +using Sequence.Provider; +using Sequence.Utils; +using Sequence.Utils.SecureStorage; +using ConfigUpdate = Sequence.EcosystemWallet.KeyMachine.Models.ConfigUpdate; + +namespace Sequence.EcosystemWallet +{ + 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; } + 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; } + public ConfigUpdate[] ConfigUpdates { get; private set; } + + private readonly KeyMachineApi _keyMachine = new(); + private readonly ISecureStorage _secureStorage = SecureStorageFactory.CreateSecureStorage(); + private readonly bool _enableStorage = true; + + public WalletState(Address address) + { + Address = address; + } + + public async Task Update(Chain chain) + { + IsDeployed = await CheckDeployed(chain, Address); + + var implementation = await GetImplementation(chain); + + string imageHash; + if (IsDeployed && implementation != null && implementation.Equals(ExtensionsFactory.Current.Stage2)) + { + imageHash = await GetOnChainImageHash(chain); + } + 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) + throw new Exception($"Could not find signer {signerAddress}"); + + SessionsImageHash = signerLeaf.imageHash; + + var sessionsTopology = await GetSessionsTopology(SessionsImageHash); + + ConfigUpdates = configUpdates.updates; + ImageHash = imageHash; + Config = config; + SessionsTopology = sessionsTopology; + + await UpdateNonce(chain, 0); + } + + private async Task GetDeployHash(Address address) + { + var storageKey = $"sequence-deploy-hash-{address}"; + var cached = 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-tree-{imageHash}"; + var cached = RetrieveString(storageKey); + + if (!string.IsNullOrEmpty(cached)) + return ConfigFromServiceTree(JsonConvert.DeserializeObject(cached)); + + var response = await _keyMachine.GetConfiguration(imageHash); + _secureStorage.StoreString(storageKey, JsonConvert.SerializeObject(response)); + + 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 = RetrieveString(storageKey); + + if (!string.IsNullOrEmpty(cached)) + return SessionsTopology.FromTree(cached); + + var treeReturn = await _keyMachine.GetTree(imageHash); + var tree = treeReturn.tree.ToString(); + var sessionsTopology = SessionsTopology.FromTree(tree); + _secureStorage.StoreString(storageKey, tree); + + return sessionsTopology; + } + + private async Task
GetImplementation(Chain chain) + { + var response = await new SequenceEthClient(chain).CallContract(new object[] { + new CallContractData + { + to = Address, + data = ABI.ABI.Pack("getImplementation()") + } + }); + + var data = response.HexStringToByteArray(); + if (data == null || data.Length < 20) + return null; + + var addressData = data.Slice(data.Length - 20); + + var addressStr = addressData.ByteArrayToHexStringWithPrefix(); + return addressStr.IsAddress() ? new Address(addressStr) : null; + } + + private async Task GetOnChainImageHash(Chain chain) + { + return await new SequenceEthClient(chain).CallContract(new object[] { + new CallContractData + { + to = Address, + data = ABI.ABI.Pack("imageHash()") + } + }); + } + + private async Task CheckDeployed(Chain chain, Address address) + { + var storageKey = $"sequence-deployed-{chain.ToString()}-{address}"; + var cached = RetrieveString(storageKey); + if (!string.IsNullOrEmpty(cached)) + return true; + + var ethClient = new SequenceEthClient(chain); + var response = await ethClient.CodeAt(address, "pending"); + var isDeployed = response != "0x"; + + if (isDeployed) + _secureStorage.StoreString(storageKey, "true"); + + return isDeployed; + } + + private async Task UpdateNonce(Chain chain, BigInteger space) + { + var response = await new SequenceEthClient(chain).CallContract(new object[] { + new CallContractData + { + to = Address, + 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/EcosystemWallet/Wallet/WalletState.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/WalletState.cs.meta new file mode 100644 index 000000000..286bf8d88 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EcosystemWallet/Wallet/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/EmbeddedWallet/EOAWalletLinker.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/EOAWalletLinker.cs index 4ea958256..282a16609 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/EOAWalletLinker.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/EOAWalletLinker.cs @@ -31,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(), @@ -58,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(), @@ -83,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 f35b968ca..000000000 --- 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 06782aa61..000000000 --- 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 2a59f9194..000000000 --- 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 82efed48e..656f56002 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 b21b33412..9e43030cf 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/EmbeddedWallet/SequenceWalletToEOAWalletAdapter.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/SequenceWalletToEOAWalletAdapter.cs index 1c69d0731..c53fea8df 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/ABI/ABI.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/ABI.cs index aebb902c3..c80235691 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(']'); } /// @@ -350,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/Coders/AddressCoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/AddressCoder.cs index 6b4a8b984..6893f2dec 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) 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 0d8d9bb84..ab22f925b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/BytesCoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/BytesCoder.cs @@ -86,13 +86,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/ABI/Coders/FixedBytesCoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/FixedBytesCoder.cs index 4be08e4dc..d52070cf6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/FixedBytesCoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/FixedBytesCoder.cs @@ -60,20 +60,25 @@ public byte[] Encode(object value) /// The encoded string representation. public string EncodeToString(object value) { - try + if (value is byte[] valueBytes) + { + return EncodeBytesToString(valueBytes); + } + + if (value is FixedByte valueFixedBytes) { - 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 EncodeFixedBytesToString(valueFixedBytes); + } - valueStr = valueStr.PadRight(totalLength, '0'); + throw new ArgumentException( + $"Encountered unexpected value type: {value.GetType().Name}. Expected {nameof(FixedByte)} or byte[]."); + } - string encodedStr = numberOfBytesStr + valueStr; - return encodedStr; + private string EncodeBytesToString(byte[] value) + { + try + { + return DoEncodeAsString(value, value.Length); } catch (Exception ex) { @@ -81,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/NumberCoder.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/NumberCoder.cs index 152b4727d..469819463 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/NumberCoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/NumberCoder.cs @@ -58,12 +58,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) @@ -170,11 +184,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; } @@ -219,7 +233,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) 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 3db29353a..9e56a7e48 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/StaticBytesCoder.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Coders/StaticBytesCoder.cs @@ -62,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; } 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 47e87bdec..c79dbca62 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 @@ -93,60 +94,47 @@ 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)) case ABIType.BYTES: - SequenceLog.Info("object in tuple array: bytes"); head_i = _numberCoder.EncodeToString((object)(headerTotalByteLength + tailLength)); 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/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/FunctionAbi.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/FunctionAbi.cs index 052c9d7a4..53fdc450d 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/Ethereum/ABI/Types/ABIDataTypes.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ABI/Types/ABIDataTypes.cs index bf55a624e..9ce84099b 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) { diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs index 162a4419f..8a03dc769 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; @@ -16,10 +17,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; } @@ -41,7 +54,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() diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Chain.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Chain.cs index 7ac498819..8f65c36cb 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Chain.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Chain.cs @@ -68,6 +68,8 @@ public enum Chain TestnetIncentiv = 11690, TestnetIncentivV2 = 28802, + 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/ChainId.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/ChainId.cs index 706cb04fa..643357ece 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 || diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Contract/Contract.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Contract/Contract.cs index 0299e06e0..6d83d503a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Contract/Contract.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Contract/Contract.cs @@ -164,6 +164,7 @@ private object[] CreateParams(string functionName, params object[] args) }; return toSendParams; } + private string GetData(string functionName, params object[] args) { string data; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Provider/HttpRpcClient.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Provider/HttpRpcClient.cs index dd57fc7e7..224d93509 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/Ethereum/Wallet/EOAWallet.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Wallet/EOAWallet.cs index e47837d40..046323e1d 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); @@ -258,6 +265,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 08b7a4a71..f2e51e1ae 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/Relayer/DataTypes.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes.meta new file mode 100644 index 000000000..f0eef46f7 --- /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 000000000..523f7a85c --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs @@ -0,0 +1,27 @@ +using System.Numerics; +using UnityEngine.Scripting; + +namespace Sequence.Relayer +{ + [Preserve] + public class FeeOption + { + public FeeToken token; + public string to; + public string value; + public int gasLimit; + } + + [Preserve] + 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/DataTypes/FeeOption.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOption.cs.meta new file mode 100644 index 000000000..0f07491c0 --- /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 000000000..cce9ee8da --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsArgs.cs @@ -0,0 +1,21 @@ +using UnityEngine.Scripting; + +namespace Sequence.Relayer +{ + [Preserve] + public class FeeOptionsArgs + { + public Address wallet; + public string to; + public string data; + public bool simulate; + + public FeeOptionsArgs(Address wallet, string to, string 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 000000000..662bbea9d --- /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 000000000..24aaeb4b3 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/FeeOptionsReturn.cs @@ -0,0 +1,12 @@ +using UnityEngine.Scripting; + +namespace Sequence.Relayer +{ + [Preserve] + 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 000000000..18b4e69c7 --- /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/DataTypes/GetMetaTxnReceiptArgs.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs new file mode 100644 index 000000000..07ac5e830 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptArgs.cs @@ -0,0 +1,10 @@ +using UnityEngine.Scripting; + +namespace Sequence.Relayer +{ + [Preserve] + public class GetMetaTxnReceiptArgs + { + public string metaTxID; + } +} \ 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 000000000..dff708038 --- /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 000000000..63806ed7e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/GetMetaTxnReceiptReturn.cs @@ -0,0 +1,10 @@ +using UnityEngine.Scripting; + +namespace Sequence.Relayer +{ + [Preserve] + 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 000000000..509eab776 --- /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/IntentPrecondition.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs new file mode 100644 index 000000000..3976f3a27 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/IntentPrecondition.cs @@ -0,0 +1,12 @@ +using UnityEngine.Scripting; + +namespace Sequence.Relayer +{ + [Preserve] + 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 000000000..b64f60686 --- /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 000000000..d6d295ff5 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxn.cs @@ -0,0 +1,19 @@ +using UnityEngine.Scripting; + +namespace Sequence.Relayer +{ + [Preserve] + 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 000000000..835a49cfa --- /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/MetaTxnReceipt.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs new file mode 100644 index 000000000..c919fe050 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceipt.cs @@ -0,0 +1,35 @@ +using System; +using UnityEngine.Scripting; + +namespace Sequence.Relayer +{ + [Preserve] + public class MetaTxnReceipt + { + public string id; + public string status; + public string revertReason; + public int index; + public string txnReceipt; + public string txnHash; + public string blockNumber; + 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 000000000..af647066d --- /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 000000000..9e02beaa8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/MetaTxnReceiptLog.cs @@ -0,0 +1,12 @@ +using UnityEngine.Scripting; + +namespace Sequence.Relayer +{ + [Preserve] + 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 000000000..b72d4d4dc --- /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 new file mode 100644 index 000000000..4d6eed29a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/OperationStatus.cs @@ -0,0 +1,10 @@ +namespace Sequence.Relayer +{ + public enum OperationStatus + { + Unknown, + Pending, + Confirmed, + Failed + } +} \ 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 000000000..28b39e3ad --- /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 000000000..9a3d0ded3 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnArgs.cs @@ -0,0 +1,61 @@ +using System; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using UnityEngine.Scripting; + +namespace Sequence.Relayer +{ + [JsonConverter(typeof(SessionCredentialsConverter))] + 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; + } + } + + [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/DataTypes/SendMetaTxnArgs.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnArgs.cs.meta new file mode 100644 index 000000000..faa7bca94 --- /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 000000000..52ddfb01b --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/DataTypes/SendMetaTxnReturn.cs @@ -0,0 +1,11 @@ +using UnityEngine.Scripting; + +namespace Sequence.Relayer +{ + [Preserve] + 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 000000000..da601b48f --- /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 new file mode 100644 index 000000000..343ec80e8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs @@ -0,0 +1,12 @@ +using System.Threading.Tasks; + +namespace Sequence.Relayer +{ + public interface IRelayer + { + Task Relay(Address to, string data, string quote = null, IntentPrecondition[] preconditions = null); + 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/IRelayer.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/IRelayer.cs.meta new file mode 100644 index 000000000..75bcf9d4d --- /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/SequenceRelayer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs new file mode 100644 index 000000000..f6466cb08 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Numerics; +using System.Threading.Tasks; +using Sequence.Config; +using Sequence.Utils; + +namespace Sequence.Relayer +{ + public class SequenceRelayer : IRelayer + { + private readonly IHttpClient _httpClient; + private readonly Dictionary _headers = new(); + + 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"; + _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 GetFeeOptions(FeeOptionsArgs args) + { + return await _httpClient.SendPostRequest("FeeOptions", args, _headers); + } + + public async Task GetMetaTxnReceipt(string metaTxID) + { + var args = new GetMetaTxnReceiptArgs { metaTxID = metaTxID.EnsureHexPrefix() }; + return await _httpClient.SendPostRequest("GetMetaTxnReceipt", args, _headers); + } + + public async Task SendMetaTxn(SendMetaTxnArgs args) + { + return await _httpClient.SendPostRequest("SendMetaTxn", args, _headers); + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.cs.meta new file mode 100644 index 000000000..bf33d2be0 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Relayer/SequenceRelayer.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/ArrayUtils.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ArrayUtils.cs index 19f43068d..adcd69b6e 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) @@ -85,6 +93,25 @@ 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[] 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; @@ -114,5 +141,33 @@ 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; + } + + 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 diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/BigIntegerExtensions.cs index 5235c2770..5e9444ea4 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,13 @@ public static string BigIntegerToHexString(this BigInteger value) } return "0x" + result; } + + public static int MinimumBytesNeeded(this BigInteger value) + { + if (value == 0) return 1; + + byte[] bytes = value.ByteArrayFromNumber(); + return bytes.Length; + } } } 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 000000000..004bcb0f3 --- /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 000000000..28c8a25a7 --- /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 diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs index df18baf8b..bc64acc6c 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/ByteArrayExtensions.cs @@ -1,4 +1,6 @@ using System; +using System.Linq; +using System.Numerics; using System.Text; using UnityEngine; @@ -31,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); @@ -78,5 +102,91 @@ public static byte[] BuildArrayWithRepeatedValue(byte[] value, int repetitions) return result; } + + public static byte[] PadLeft(this byte[] input, int totalSize) + { + if (input.Length > totalSize) + { + return input; + } + + byte[] result = new byte[totalSize]; + Buffer.BlockCopy(input, 0, result, totalSize - input.Length, input.Length); + 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) + 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 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."); + + var hex = value.BigIntegerToHexString().WithoutHexPrefix(); + return (int)Math.Ceiling(hex.Length / 2.0); + } + + 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; + } + + 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 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 000000000..de4fff84a --- /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 000000000..4fba6154f --- /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/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs new file mode 100644 index 000000000..07e9c2ac8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/DictionaryExtensions.cs @@ -0,0 +1,40 @@ +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 000000000..0ef341079 --- /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 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 000000000..4bdbe241c --- /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 000000000..569e25110 --- /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 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 000000000..8d93385e7 --- /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 000000000..ec9b652c6 --- /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 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 000000000..a0c27c1f3 --- /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 608d215d0..ecc4f3be7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/EmbeddedWallet/HttpClient.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/Networking/HttpClient.cs @@ -3,143 +3,41 @@ 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) + + public async Task SendPostRequest(string path, TArgs args, Dictionary headers = 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) - { - 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; + var newRequest = BuildRequest(path, UnityWebRequest.kHttpVerbPOST, args, headers); + var request = newRequest.Item1; + var curlRequest = newRequest.Item2; + var url = newRequest.Item3; SequenceLog.Info($">> {curlRequest}"); - + try { await request.SendWebRequest(); @@ -149,42 +47,13 @@ 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 - { - 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($"<< {request.responseCode} {responseJson}"); + + return JsonConvert.DeserializeObject(responseJson, _serializerSettings); } catch (HttpRequestException e) { @@ -214,7 +83,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 { @@ -240,24 +109,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) { - SequenceLog.Error("Error getting time shift: " + e.Message); - return TimeSpan.Zero; + throw new Exception(e.Message); } finally { @@ -265,26 +143,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; + } + + 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]); + } + } - return ""; + 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 000000000..b647a8892 --- /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 000000000..0fa90d8c0 --- /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 000000000..594d64d40 --- /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 diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/WindowsProtectedDataStorage.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/SecureStorage/WindowsProtectedDataStorage.cs index 39b2c9a63..e36e9558c 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(); + } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/StringExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/StringExtensions.cs index a5e8d36d8..85be6cb8a 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) { @@ -200,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(); + } } } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UnityWebRequestExtensions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UnityWebRequestExtensions.cs index 0538361c7..9c336550d 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/Sequence/SequenceSDK/Utils/UrlSchemeFactory.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Utils/UrlSchemeFactory.cs new file mode 100644 index 000000000..449967771 --- /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 000000000..6c28ac59e --- /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 diff --git a/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3.meta b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3.meta new file mode 100644 index 000000000..416fa5f14 --- /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 000000000..fa6c989d3 --- /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 000000000..546d16296 --- /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 000000000..556c3e2c8 --- /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 000000000..0cab71274 --- /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 000000000..467605200 --- /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 000000000..1daa49288 --- /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 000000000..2f534f576 --- /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 000000000..b09ff60f8 --- /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 000000000..3a1432c15 --- /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 000000000..86a2ce84b --- /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 000000000..83a9a28c0 --- /dev/null +++ b/Packages/Sequence-Unity/WebGLTemplates/SequenceReactV3/src/App.tsx @@ -0,0 +1,175 @@ +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"; + +let walletWindow: Window | null = null; +let authInput: AuthInput | null = null; + +interface AuthInput { + url: string; + action: string; + payload: string; +} + +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; + authInput = JSON.parse(inputJson) as AuthInput; + + const sessionId = generateId(); + walletWindow = window.open( + `${authInput?.url}?dappOrigin=${window.location.origin}&sessionId=${sessionId}`, + "Wallet", + 'width=600,height=600,left=300,top=300'); + + 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 = 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 = () => { + 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"; + } + + const generateId = (): string => { + return `${Date.now().toString(36)}-${Math.random() + .toString(36) + .substring(2, 9)}`; + } + + 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 000000000..3ea5354ae --- /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 000000000..6db435b1d --- /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 000000000..e4650d70f --- /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 000000000..3d7150da8 --- /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 000000000..1d9f072b2 --- /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 000000000..11f02fe2a --- /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 000000000..04d4bf870 --- /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 000000000..cb0d143c7 --- /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 000000000..985e664e8 --- /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 000000000..97ede7ee6 --- /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 000000000..12714d965 --- /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 000000000..2531e09e9 --- /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 000000000..d35d9c169 --- /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/Packages/Sequence-Unity/package.json b/Packages/Sequence-Unity/package.json index bea685608..9e341a06f 100644 --- a/Packages/Sequence-Unity/package.json +++ b/Packages/Sequence-Unity/package.json @@ -1,6 +1,6 @@ { "name": "xyz.0xsequence.waas-unity", - "version": "4.5.2", + "version": "5.0.2", "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.", diff --git a/Packages/manifest.json b/Packages/manifest.json index 90acc98f5..2188338b0 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 8026b30e1..784daf987 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/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index e7a363ea7..ea3ab68ab 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -5,10 +5,10 @@ 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 m_configObjects: {} diff --git a/ProjectSettings/EditorSettings.asset b/ProjectSettings/EditorSettings.asset index 1e44a0a11..e81e9714f 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 diff --git a/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json b/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json index ad11087f4..3c7b4c18b 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/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 845d7c007..da52d263a 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -3,12 +3,12 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 23 + serializedVersion: 26 productGUID: 4db421e74da5e674e8c4203f416d7f72 AndroidProfiler: 0 AndroidFilterTouchesWhenObscured: 0 AndroidEnableSustainedPerformanceMode: 0 - defaultScreenOrientation: 2 + defaultScreenOrientation: 0 targetDevice: 2 useOnDemandResources: 0 accelerometerFrequency: 60 @@ -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 @@ -159,12 +165,13 @@ 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 + VisionOS: 0 iPhone: 0 tvOS: 0 - overrideDefaultApplicationIdentifier: 0 + overrideDefaultApplicationIdentifier: 1 AndroidBundleVersionCode: 1 AndroidMinSdkVersion: 22 AndroidTargetSdkVersion: 34 @@ -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 @@ -222,8 +232,7 @@ PlayerSettings: iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] iOSURLSchemes: [] - macOSURLSchemes: - - sdk-powered-by-sequence + macOSURLSchemes: [] iOSBackgroundModes: 0 iOSMetalForceHardShadows: 0 metalEditorSupport: 1 @@ -233,8 +242,10 @@ PlayerSettings: appleDeveloperTeamID: XR9N5MTG4N iOSManualSigningProvisioningProfileID: tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 + VisionOSManualSigningProvisioningProfileType: 0 appleEnableAutomaticSigning: 1 iOSRequireARKit: 0 iOSAutomaticallyDetectAndAddCapabilities: 1 @@ -249,6 +260,7 @@ PlayerSettings: useCustomLauncherGradleManifest: 0 useCustomBaseGradleTemplate: 0 useCustomGradlePropertiesTemplate: 1 + useCustomGradleSettingsTemplate: 0 useCustomProguardFile: 0 AndroidTargetArchitectures: 3 AndroidTargetDevices: 0 @@ -256,6 +268,7 @@ PlayerSettings: androidSplashScreen: {fileID: 0} AndroidKeystoreName: AndroidKeyaliasName: + AndroidEnableArmv9SecurityFeatures: 0 AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 0 AndroidIsGame: 1 @@ -269,7 +282,6 @@ PlayerSettings: banner: {fileID: 0} androidGamepadSupportLevel: 0 chromeosInputEmulation: 1 - AndroidMinifyWithR8: 0 AndroidMinifyRelease: 0 AndroidMinifyDebug: 0 AndroidValidateAppBundleSize: 1 @@ -488,6 +500,7 @@ PlayerSettings: - m_BuildTarget: WebGL m_StaticBatching: 0 m_DynamicBatching: 0 + m_BuildTargetShaderSettings: [] m_BuildTargetGraphicsJobs: - m_BuildTarget: MacStandaloneSupport m_GraphicsJobs: 0 @@ -539,6 +552,8 @@ PlayerSettings: m_Devices: - Oculus - OpenVR + m_DefaultShaderChunkSizeInMB: 16 + m_DefaultShaderChunkCount: 0 openGLRequireES31: 0 openGLRequireES31AEP: 0 openGLRequireES32: 0 @@ -548,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 @@ -555,6 +577,7 @@ PlayerSettings: - m_BuildTarget: tvOS m_EncodingQuality: 1 m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetGroupLoadStoreDebugModeSettings: [] m_BuildTargetNormalMapEncoding: - m_BuildTarget: Android m_Encoding: 1 @@ -575,6 +598,7 @@ PlayerSettings: locationUsageDescription: microphoneUsageDescription: bluetoothUsageDescription: + macOSTargetOSVersion: 10.13.0 switchNMETAOverride: switchNetLibKey: switchSocketMemoryPoolSize: 6144 @@ -582,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: @@ -659,7 +684,6 @@ PlayerSettings: switchReleaseVersion: 0 switchDisplayVersion: 1.0.0 switchStartupUserAccount: 0 - switchTouchScreenUsage: 0 switchSupportedLanguagesMask: 0 switchLogoType: 0 switchApplicationErrorCodeCategory: @@ -701,6 +725,7 @@ PlayerSettings: switchNativeFsCacheSize: 32 switchIsHoldTypeHorizontal: 0 switchSupportedNpadCount: 8 + switchEnableTouchScreen: 1 switchSocketConfigEnabled: 0 switchTcpInitialSendBufferSize: 32 switchTcpInitialReceiveBufferSize: 64 @@ -711,8 +736,8 @@ PlayerSettings: switchSocketBufferEfficiency: 4 switchSocketInitializeEnabled: 1 switchNetworkInterfaceManagerInitializeEnabled: 1 - switchPlayerConnectionEnabled: 1 switchUseNewStyleFilepaths: 0 + switchUseLegacyFmodPriorities: 0 switchUseMicroSleepForYield: 1 switchEnableRamDiskSupport: 0 switchMicroSleepForYieldTime: 25 @@ -800,11 +825,12 @@ PlayerSettings: webGLMemorySize: 16 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 + webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 webGLEmscriptenArgs: webGLModulesDirectory: - webGLTemplate: PROJECT:SequenceReact + webGLTemplate: PROJECT:SequenceReactV3 webGLAnalyzeBuildSize: 0 webGLUseEmbeddedResources: 0 webGLCompressionFormat: 1 @@ -812,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 @@ -824,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 @@ -908,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: [] @@ -917,6 +969,7 @@ PlayerSettings: organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 0 - playerDataPath: - forceSRGBBlit: 1 + hmiLoadingImage: {fileID: 0} + platformRequiresReadableAssets: 0 virtualTexturingSupportEnabled: 0 + insecureHttpOption: 0 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 4cb046008..c47c8be78 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 e69de29bb..000000000 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 000000000..0b37f0d81 --- /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 000000000..46acc8953 --- /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 000000000..022b7f05d --- /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 000000000..5ff39d542 --- /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 000000000..abb5ae4aa --- /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 000000000..d474e2c69 --- /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 000000000..ff2437785 --- /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 000000000..d3cdbb3a7 --- /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 000000000..a37a94a09 --- /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 000000000..077e8b6e5 --- /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 000000000..2bedf7e67 --- /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 000000000..4f7b2025b --- /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 000000000..494d29ae9 --- /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 000000000..0b2e94b7d --- /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 000000000..98cefb3ec --- /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 000000000..bd60f26ad --- /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 000000000..52c5d42f0 --- /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 000000000..a70a7ec51 --- /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 000000000..21f29083b --- /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 000000000..74458299e --- /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 000000000..244d5ed1b --- /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 000000000..cbcdb348d --- /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 000000000..7c0dd6fb5 --- /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 000000000..7a10bb21a --- /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 000000000..47444ac14 --- /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 000000000..67c6ae2aa --- /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 000000000..84e5efaf2 --- /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 000000000..b09eb6a61 --- /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 000000000..42081ac1c --- /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 000000000..74a3ef146 --- /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 000000000..7a12c1835 --- /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 000000000..e33742ae8 --- /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 000000000..90b8b5b76 --- /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 000000000..155c61e92 --- /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 000000000..ba3eab8b6 --- /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 000000000..f30ebdd86 --- /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 000000000..9de8dfa98 --- /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 000000000..fbcb55e57 --- /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 000000000..31c4e1edd --- /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 000000000..ed7ebb3b4 --- /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 000000000..3c9018741 --- /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 000000000..3a72a8efe --- /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 000000000..c194495c2 --- /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 000000000..64b0e5dc7 --- /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 000000000..238bd3930 --- /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 000000000..5d634112d --- /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 34e50c9a0..4d8eb5451 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 d1d06427b..65aea4285 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 000000000..e5699ebd1 --- /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 44f34ea1b..000000000 --- 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==