From 9bd787641a6aee8064a6abed652dceb67a68b840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gru=CC=88ning?= Date: Fri, 14 Feb 2025 10:07:44 +0100 Subject: [PATCH 1/8] Terminal started adding SubscribeEvents, SubscribeReceipts, SubscribeBalanceUpdates to Indexer --- .../SequenceSDK/Indexer/ChainIndexer.cs | 15 ++++++++++++++ .../Indexer/DataTypes/EventFilter.cs | 11 ++++++++++ .../Indexer/DataTypes/EventFilter.cs.meta | 3 +++ .../DataTypes/SubscribeBalanceUpdatesArgs.cs | 13 ++++++++++++ .../SubscribeBalanceUpdatesArgs.cs.meta | 3 +++ .../SubscribeBalanceUpdatesReturn.cs | 8 ++++++++ .../SubscribeBalanceUpdatesReturn.cs.meta | 3 +++ .../Indexer/DataTypes/SubscribeEventsArgs.cs | 13 ++++++++++++ .../DataTypes/SubscribeEventsArgs.cs.meta | 3 +++ .../DataTypes/SubscribeEventsReturn.cs | 8 ++++++++ .../DataTypes/SubscribeEventsReturn.cs.meta | 3 +++ .../DataTypes/SubscribeReceiptsArgs.cs | 13 ++++++++++++ .../DataTypes/SubscribeReceiptsArgs.cs.meta | 3 +++ .../DataTypes/SubscribeReceiptsReturn.cs | 8 ++++++++ .../DataTypes/SubscribeReceiptsReturn.cs.meta | 3 +++ .../Indexer/DataTypes/TransactionFilter.cs | 12 +++++++++++ .../DataTypes/TransactionFilter.cs.meta | 3 +++ .../Indexer/DataTypes/WebRPCStreamOptions.cs | 20 +++++++++++++++++++ .../DataTypes/WebRPCStreamOptions.cs.meta | 11 ++++++++++ .../SequenceSDK/Indexer/HttpHandler.cs | 2 +- .../Sequence/SequenceSDK/Indexer/IIndexer.cs | 18 +++++++++++++++++ .../Sequence/SequenceSDK/Indexer/Indexer.cs | 18 +++++++++++++++++ 22 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventFilter.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventFilter.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesArgs.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesArgs.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesReturn.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesReturn.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsArgs.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsArgs.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsReturn.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsReturn.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsArgs.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsArgs.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsReturn.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsReturn.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/TransactionFilter.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/TransactionFilter.cs.meta create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/WebRPCStreamOptions.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/WebRPCStreamOptions.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs index 90833e09b..118019d98 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs @@ -148,5 +148,20 @@ public Task GetTransactionHistory(GetTransactionHis { return Indexer.GetTransactionHistory(ChainId, args, 0, _customHttpHandler, this); } + + public Task SubscribeReceipts(SubscribeReceiptsArgs args, WebRPCStreamOptions options) + { + return Indexer.SubscribeReceipts(ChainId, args, options, 0, _customHttpHandler, this); + } + + public Task SubscribeEvents(SubscribeEventsArgs args, WebRPCStreamOptions options) + { + return Indexer.SubscribeEvents(ChainId, args, options, 0, _customHttpHandler, this); + } + + public Task SubscribeBalanceUpdates(SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options) + { + return Indexer.SubscribeBalanceUpdates(ChainId, args, options, 0, _customHttpHandler, this); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventFilter.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventFilter.cs new file mode 100644 index 000000000..4e8ddb075 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventFilter.cs @@ -0,0 +1,11 @@ +namespace Sequence +{ + [System.Serializable] + public class EventFilter + { + public string[] events; + public string[] contractAddresses; + public string[] accounts; + public string[] tokenIDs; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventFilter.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventFilter.cs.meta new file mode 100644 index 000000000..e53010796 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventFilter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d0ae9c58dff243c9b734ebad0df6e7f4 +timeCreated: 1739521000 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesArgs.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesArgs.cs new file mode 100644 index 000000000..4ff9a3c79 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesArgs.cs @@ -0,0 +1,13 @@ +namespace Sequence +{ + [System.Serializable] + public class SubscribeBalanceUpdatesArgs + { + public string contractAddress; + + public SubscribeBalanceUpdatesArgs(string contractAddress) + { + this.contractAddress = contractAddress; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesArgs.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesArgs.cs.meta new file mode 100644 index 000000000..8d5a2091a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesArgs.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f1132eb6ed56492882726a81a4dd9563 +timeCreated: 1739521133 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesReturn.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesReturn.cs new file mode 100644 index 000000000..aa81aa96e --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesReturn.cs @@ -0,0 +1,8 @@ +namespace Sequence +{ + [System.Serializable] + public class SubscribeBalanceUpdatesReturn + { + public TokenBalance balance; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesReturn.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesReturn.cs.meta new file mode 100644 index 000000000..a47780145 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeBalanceUpdatesReturn.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d9f796ff4af64caba1a2f177482ef754 +timeCreated: 1739523574 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsArgs.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsArgs.cs new file mode 100644 index 000000000..19cf401c7 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsArgs.cs @@ -0,0 +1,13 @@ +namespace Sequence +{ + [System.Serializable] + public class SubscribeEventsArgs + { + public EventFilter filter; + + public SubscribeEventsArgs(EventFilter filter) + { + this.filter = filter; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsArgs.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsArgs.cs.meta new file mode 100644 index 000000000..8ccc0fc03 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsArgs.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6f26c5e9d9854c6a930b8f5a77127787 +timeCreated: 1739521203 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsReturn.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsReturn.cs new file mode 100644 index 000000000..c927e1a6f --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsReturn.cs @@ -0,0 +1,8 @@ +namespace Sequence +{ + [System.Serializable] + public class SubscribeEventsReturn + { + public EventLog log; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsReturn.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsReturn.cs.meta new file mode 100644 index 000000000..a562845a2 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeEventsReturn.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6a2c967a0b6f430bb2b93fe2577fbc21 +timeCreated: 1739523529 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsArgs.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsArgs.cs new file mode 100644 index 000000000..023af78de --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsArgs.cs @@ -0,0 +1,13 @@ +namespace Sequence +{ + [System.Serializable] + public class SubscribeReceiptsArgs + { + public TransactionFilter filter; + + public SubscribeReceiptsArgs(TransactionFilter filter) + { + this.filter = filter; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsArgs.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsArgs.cs.meta new file mode 100644 index 000000000..751784d25 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsArgs.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cd83b02ca83d49e59536e0916b7627d0 +timeCreated: 1739521261 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsReturn.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsReturn.cs new file mode 100644 index 000000000..3a8ace886 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsReturn.cs @@ -0,0 +1,8 @@ +namespace Sequence +{ + [System.Serializable] + public class SubscribeReceiptsReturn + { + public TransactionReceipt receipt; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsReturn.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsReturn.cs.meta new file mode 100644 index 000000000..e5499c15a --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/SubscribeReceiptsReturn.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b95cc9bfddb648a48bfa08a95608a1ef +timeCreated: 1739523428 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/TransactionFilter.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/TransactionFilter.cs new file mode 100644 index 000000000..5c1e7a9b4 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/TransactionFilter.cs @@ -0,0 +1,12 @@ +namespace Sequence +{ + [System.Serializable] + public class TransactionFilter + { + public string txnHash; + public string from; + public string to; + public string contractAddress; + public string @event; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/TransactionFilter.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/TransactionFilter.cs.meta new file mode 100644 index 000000000..881c7f0f2 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/TransactionFilter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 50810c603001415092f746d50330144a +timeCreated: 1739520881 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/WebRPCStreamOptions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/WebRPCStreamOptions.cs new file mode 100644 index 000000000..3ed9d58ca --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/WebRPCStreamOptions.cs @@ -0,0 +1,20 @@ +using System; + +namespace Sequence +{ + public class WebRPCStreamOptions + { + public Action onMessage; + public Action onError; + public Action onOpen; + public Action onClose; + + public WebRPCStreamOptions(Action onMessage, Action onError, Action onOpen = null, Action onClose = null) + { + this.onMessage = onMessage; + this.onError = onError; + this.onOpen = onOpen; + this.onClose = onClose; + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/WebRPCStreamOptions.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/WebRPCStreamOptions.cs.meta new file mode 100644 index 000000000..caf9789f8 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/WebRPCStreamOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bd39d5ed33c649d08e29d33a47e0e13b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs index bb2b03305..4e5f37409 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs @@ -36,7 +36,7 @@ public async Task HttpPost(string chainID, string endPoint, object args, req.SetRequestHeader("X-Access-Key", _builderApiKey); req.method = UnityWebRequest.kHttpVerbPOST; req.timeout = 10; // Request will timeout after 10 seconds - + string curlRequest = $"curl -X POST -H \"Content-Type: application/json\" -H \"Accept: application/json\" -H \"X-Access-Key: {req.GetRequestHeader("X-Access-Key")}\" -d '{requestJson}' {Url(chainID, endPoint)}"; try diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs index abfd88bb5..6bdf6705f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs @@ -93,5 +93,23 @@ public Task> GetTokenBalancesOrganizedInDic /// /// If the network request fails public Task GetTransactionHistory(GetTransactionHistoryArgs args); + + /// + /// Retrieve transaction history + /// + /// If the network request fails + public Task SubscribeReceipts(); + + /// + /// Retrieve transaction history + /// + /// If the network request fails + public Task SubscribeEvents(); + + /// + /// Retrieve transaction history + /// + /// If the network request fails + public Task SubscribeBalanceUpdates(); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs index 668ff6610..9169082d5 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs @@ -321,6 +321,24 @@ public static async Task GetTransactionHistory(stri var responseBody = await HttpPost(chainID, "GetTransactionHistory", args, retries, httpHandler, caller); return BuildResponse(responseBody); } + + public static async Task SubscribeReceipts(string chainID, SubscribeReceiptsArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) + { + var responseBody = await HttpPost(chainID, "SubscribeReceipts", args, retries, httpHandler, caller); + return false; + } + + public static async Task SubscribeEvents(string chainID, SubscribeEventsArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) + { + var responseBody = await HttpPost(chainID, "SubscribeEvents", args, retries, httpHandler, caller); + return false; + } + + public static async Task SubscribeBalanceUpdates(string chainID, SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) + { + var responseBody = await HttpPost(chainID, "SubscribeBalanceUpdates", args, retries, httpHandler, caller); + return false; + } [Obsolete] private static async Task HttpPost(BigInteger chainID, string endPoint, object args, int retries = 0) From 659082a257809046f9e29903dcd9a00a60ddf8aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gru=CC=88ning?= Date: Fri, 14 Feb 2025 10:20:19 +0100 Subject: [PATCH 2/8] added summaries for indexer event functions --- .../SequenceSDK/Indexer/ChainIndexer.cs | 6 ++--- .../Sequence/SequenceSDK/Indexer/IIndexer.cs | 21 +++++++++------- .../Sequence/SequenceSDK/Indexer/Indexer.cs | 24 ++++++++++++------- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs index 118019d98..b03dab989 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs @@ -149,17 +149,17 @@ public Task GetTransactionHistory(GetTransactionHis return Indexer.GetTransactionHistory(ChainId, args, 0, _customHttpHandler, this); } - public Task SubscribeReceipts(SubscribeReceiptsArgs args, WebRPCStreamOptions options) + public Task SubscribeReceipts(SubscribeReceiptsArgs args, WebRPCStreamOptions options) { return Indexer.SubscribeReceipts(ChainId, args, options, 0, _customHttpHandler, this); } - public Task SubscribeEvents(SubscribeEventsArgs args, WebRPCStreamOptions options) + public Task SubscribeEvents(SubscribeEventsArgs args, WebRPCStreamOptions options) { return Indexer.SubscribeEvents(ChainId, args, options, 0, _customHttpHandler, this); } - public Task SubscribeBalanceUpdates(SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options) + public Task SubscribeBalanceUpdates(SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options) { return Indexer.SubscribeBalanceUpdates(ChainId, args, options, 0, _customHttpHandler, this); } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs index 6bdf6705f..2f59c1d4f 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs @@ -95,21 +95,24 @@ public Task> GetTokenBalancesOrganizedInDic public Task GetTransactionHistory(GetTransactionHistoryArgs args); /// - /// Retrieve transaction history + /// Subscribe to receipt events. /// - /// If the network request fails - public Task SubscribeReceipts(); + /// Specify the account or event you want to receive events from by defining a filter. + /// Actions triggered whenever a message or error event is received. + public Task SubscribeReceipts(SubscribeReceiptsArgs args, WebRPCStreamOptions options); /// - /// Retrieve transaction history + /// Subscribe to smart contract events. /// - /// If the network request fails - public Task SubscribeEvents(); + /// Specify the accounts or contracts you want to receive events from by defining a filter. + /// Actions triggered whenever a message or error event is received. + public Task SubscribeEvents(SubscribeEventsArgs args, WebRPCStreamOptions options); /// - /// Retrieve transaction history + /// Subscribe to balance update events for a given contract address. /// - /// If the network request fails - public Task SubscribeBalanceUpdates(); + /// Define the contract address you want to receive events from. + /// Actions triggered whenever a message or error event is received. + public Task SubscribeBalanceUpdates(SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs index 9169082d5..242ab434e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs @@ -322,22 +322,28 @@ public static async Task GetTransactionHistory(stri return BuildResponse(responseBody); } - public static async Task SubscribeReceipts(string chainID, SubscribeReceiptsArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) + /// + /// Subscribe to receipt events. + /// + public static async Task SubscribeReceipts(string chainID, SubscribeReceiptsArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) { - var responseBody = await HttpPost(chainID, "SubscribeReceipts", args, retries, httpHandler, caller); - return false; + await HttpPost(chainID, "SubscribeReceipts", args, retries, httpHandler, caller); } - public static async Task SubscribeEvents(string chainID, SubscribeEventsArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) + /// + /// Subscribe to smart contract events. + /// + public static async Task SubscribeEvents(string chainID, SubscribeEventsArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) { - var responseBody = await HttpPost(chainID, "SubscribeEvents", args, retries, httpHandler, caller); - return false; + await HttpPost(chainID, "SubscribeEvents", args, retries, httpHandler, caller); } - public static async Task SubscribeBalanceUpdates(string chainID, SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) + /// + /// Subscribe to balance update events for a given contract address. + /// + public static async Task SubscribeBalanceUpdates(string chainID, SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) { - var responseBody = await HttpPost(chainID, "SubscribeBalanceUpdates", args, retries, httpHandler, caller); - return false; + await HttpPost(chainID, "SubscribeBalanceUpdates", args, retries, httpHandler, caller); } [Obsolete] From 2cbff563ce0ff03f0c362d6b98d7dc4c6b75b483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gru=CC=88ning?= Date: Fri, 14 Feb 2025 11:20:15 +0100 Subject: [PATCH 3/8] added tests for indexer event streams --- .../Indexer/Tests/ChainIndexerTests.cs | 67 +++++++++++++++++++ .../Indexer/Tests/MockHttpHandler.cs | 5 ++ .../Scripts/UI/SequenceSampleUI.cs | 1 + .../SequenceSDK/Indexer/ChainIndexer.cs | 12 ++-- .../SequenceSDK/Indexer/HttpHandler.cs | 26 ++++++- .../SequenceSDK/Indexer/IHttpHandler.cs | 1 + .../Sequence/SequenceSDK/Indexer/IIndexer.cs | 6 +- .../Sequence/SequenceSDK/Indexer/Indexer.cs | 12 ++-- 8 files changed, 114 insertions(+), 16 deletions(-) diff --git a/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs b/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs index 91069ded9..9e856fdd7 100644 --- a/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs +++ b/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs @@ -299,5 +299,72 @@ public async Task TestRequestDecodingErrorHandling(bool logError) Assert.IsTrue(errorEventFired); } + + [TestCase] + public void TestSubscribeReceipts() + { + var indexer = new ChainIndexer(Chain.TestnetArbitrumSepolia); + var streamOptions = new WebRPCStreamOptions( + OnSubscribeReceiptsMessageReceived, + OnWebRPCErrorReceived); + + var filter = new TransactionFilter + { + contractAddress = "0x4ab3b16e9d3328f6d8025e71cefc64305ae4fe9c" + }; + + indexer.SubscribeReceipts(new SubscribeReceiptsArgs(filter), streamOptions); + } + + [TestCase] + public void TestSubscribeEvents() + { + var indexer = new ChainIndexer(Chain.TestnetArbitrumSepolia); + var streamOptions = new WebRPCStreamOptions( + OnSubscribeEventsMessageReceived, + OnWebRPCErrorReceived); + + var eventFilter = new EventFilter + { + accounts = Array.Empty(), + contractAddresses = new[] {"0x4ab3b16e9d3328f6d8025e71cefc64305ae4fe9c"}, + tokenIDs = new[] {"0"}, + events = new[] {"Transfer(address from, address to, uint256 value)"} + }; + + indexer.SubscribeEvents(new SubscribeEventsArgs(eventFilter), streamOptions); + } + + [TestCase] + public void TestSubscribeBalanceUpdates() + { + var indexer = new ChainIndexer(Chain.TestnetArbitrumSepolia); + var streamOptions = new WebRPCStreamOptions( + OnSubscribeEventsMessageReceived, + OnWebRPCErrorReceived); + + var contractAddress = "0x4ab3b16e9d3328f6d8025e71cefc64305ae4fe9c"; + indexer.SubscribeBalanceUpdates(new SubscribeBalanceUpdatesArgs(contractAddress), streamOptions); + } + + private void OnSubscribeReceiptsMessageReceived(SubscribeReceiptsReturn @event) + { + Debug.Log($"Receipt Event Received, hash: {@event.receipt.transactionHash}"); + } + + private void OnSubscribeEventsMessageReceived(SubscribeEventsReturn @event) + { + Debug.Log($"Contract Event Received, address: {@event.log.contractAddress}"); + } + + private void OnSubscribeEventsMessageReceived(SubscribeBalanceUpdatesReturn @event) + { + Debug.Log($"Balance Update Received, balance: {@event.balance.balance}"); + } + + private void OnWebRPCErrorReceived(WebRPCError error) + { + Debug.LogError($"OnWebRPCErrorReceived: {error.msg}"); + } } } \ No newline at end of file diff --git a/Assets/SequenceSDK/Indexer/Tests/MockHttpHandler.cs b/Assets/SequenceSDK/Indexer/Tests/MockHttpHandler.cs index 27799234c..4a12d7e1e 100644 --- a/Assets/SequenceSDK/Indexer/Tests/MockHttpHandler.cs +++ b/Assets/SequenceSDK/Indexer/Tests/MockHttpHandler.cs @@ -26,5 +26,10 @@ public Task HttpPost(string chainID, string endPoint, object args, int r } return Task.FromResult(_response); } + + public void HttpStream(string chainID, string endPoint, object args, WebRPCStreamOptions options, int retries = 0) + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/SequenceSampleUI.cs b/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/SequenceSampleUI.cs index 62ef082df..c87cc1a33 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/SequenceSampleUI.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceFrontend/Scripts/UI/SequenceSampleUI.cs @@ -1,3 +1,4 @@ +using System; using Sequence.EmbeddedWallet; using UnityEngine; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs index b03dab989..4d4123d94 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs @@ -149,19 +149,19 @@ public Task GetTransactionHistory(GetTransactionHis return Indexer.GetTransactionHistory(ChainId, args, 0, _customHttpHandler, this); } - public Task SubscribeReceipts(SubscribeReceiptsArgs args, WebRPCStreamOptions options) + public void SubscribeReceipts(SubscribeReceiptsArgs args, WebRPCStreamOptions options) { - return Indexer.SubscribeReceipts(ChainId, args, options, 0, _customHttpHandler, this); + Indexer.SubscribeReceipts(ChainId, args, options, 0, _customHttpHandler, this); } - public Task SubscribeEvents(SubscribeEventsArgs args, WebRPCStreamOptions options) + public void SubscribeEvents(SubscribeEventsArgs args, WebRPCStreamOptions options) { - return Indexer.SubscribeEvents(ChainId, args, options, 0, _customHttpHandler, this); + Indexer.SubscribeEvents(ChainId, args, options, 0, _customHttpHandler, this); } - public Task SubscribeBalanceUpdates(SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options) + public void SubscribeBalanceUpdates(SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options) { - return Indexer.SubscribeBalanceUpdates(ChainId, args, options, 0, _customHttpHandler, this); + Indexer.SubscribeBalanceUpdates(ChainId, args, options, 0, _customHttpHandler, this); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs index 4e5f37409..72a2fda00 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs @@ -4,7 +4,6 @@ using System.Net.Http; using System.Threading.Tasks; using Newtonsoft.Json; -using Sequence.Config; using Sequence.Utils; using UnityEngine; using UnityEngine.Networking; @@ -39,6 +38,8 @@ public async Task HttpPost(string chainID, string endPoint, object args, string curlRequest = $"curl -X POST -H \"Content-Type: application/json\" -H \"Accept: application/json\" -H \"X-Access-Key: {req.GetRequestHeader("X-Access-Key")}\" -d '{requestJson}' {Url(chainID, endPoint)}"; + + Debug.Log($"{curlRequest}"); try { await req.SendWebRequest(); @@ -51,6 +52,7 @@ public async Task HttpPost(string chainID, string endPoint, object args, } string returnText = req.downloadHandler.text; + Debug.Log(returnText); req.Dispose(); return returnText; } @@ -104,6 +106,18 @@ public async Task HttpPost(string chainID, string endPoint, object args, return ""; } + public async void HttpStream(string chainID, string endPoint, object args, WebRPCStreamOptions options, int retries = 0) + { + var requestJson = JsonConvert.SerializeObject(args, serializerSettings); + using var req = UnityWebRequest.Put(Url(chainID, endPoint), requestJson); + req.SetRequestHeader("Content-Type", "application/json"); + req.SetRequestHeader("X-Access-Key", _builderApiKey); + req.downloadHandler = new DownloadHandlerStream(); + req.method = UnityWebRequest.kHttpVerbPOST; + + await req.SendWebRequest(); + } + private async Task RetryHttpPost(string chainID, string endPoint, object args, float waitInSeconds, int retries) { await AsyncExtensions.DelayTask(waitInSeconds); @@ -132,4 +146,14 @@ private string HostName(string chainID) return $"https://{indexerName}-indexer.sequence.app"; } } + + public class DownloadHandlerStream : DownloadHandlerScript + { + protected override bool ReceiveData(byte[] data, int dataLength) + { + Debug.Log($"Received Stream Data"); + + return true; + } + } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IHttpHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IHttpHandler.cs index 2ff5c8f7f..0ff5e402a 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IHttpHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IHttpHandler.cs @@ -9,5 +9,6 @@ public interface IHttpHandler /// /// public Task HttpPost(string chainID, string endPoint, object args, int retries = 0); + public void HttpStream(string chainID, string endPoint, object args, WebRPCStreamOptions options, int retries = 0); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs index 2f59c1d4f..7a873f02e 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs @@ -99,20 +99,20 @@ public Task> GetTokenBalancesOrganizedInDic /// /// Specify the account or event you want to receive events from by defining a filter. /// Actions triggered whenever a message or error event is received. - public Task SubscribeReceipts(SubscribeReceiptsArgs args, WebRPCStreamOptions options); + public void SubscribeReceipts(SubscribeReceiptsArgs args, WebRPCStreamOptions options); /// /// Subscribe to smart contract events. /// /// Specify the accounts or contracts you want to receive events from by defining a filter. /// Actions triggered whenever a message or error event is received. - public Task SubscribeEvents(SubscribeEventsArgs args, WebRPCStreamOptions options); + public void SubscribeEvents(SubscribeEventsArgs args, WebRPCStreamOptions options); /// /// Subscribe to balance update events for a given contract address. /// /// Define the contract address you want to receive events from. /// Actions triggered whenever a message or error event is received. - public Task SubscribeBalanceUpdates(SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options); + public void SubscribeBalanceUpdates(SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs index 242ab434e..0b24d6114 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs @@ -325,25 +325,25 @@ public static async Task GetTransactionHistory(stri /// /// Subscribe to receipt events. /// - public static async Task SubscribeReceipts(string chainID, SubscribeReceiptsArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) + public static void SubscribeReceipts(string chainID, SubscribeReceiptsArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) { - await HttpPost(chainID, "SubscribeReceipts", args, retries, httpHandler, caller); + new HttpHandler(_builderApiKey, caller).HttpStream(chainID, "SubscribeReceipts", args, options); } /// /// Subscribe to smart contract events. /// - public static async Task SubscribeEvents(string chainID, SubscribeEventsArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) + public static void SubscribeEvents(string chainID, SubscribeEventsArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) { - await HttpPost(chainID, "SubscribeEvents", args, retries, httpHandler, caller); + new HttpHandler(_builderApiKey, caller).HttpStream(chainID, "SubscribeEvents", args, options); } /// /// Subscribe to balance update events for a given contract address. /// - public static async Task SubscribeBalanceUpdates(string chainID, SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) + public static void SubscribeBalanceUpdates(string chainID, SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) { - await HttpPost(chainID, "SubscribeBalanceUpdates", args, retries, httpHandler, caller); + new HttpHandler(_builderApiKey, caller).HttpStream(chainID, "SubscribeBalanceUpdates", args, options); } [Obsolete] From 03a6543a34c2d7c12910dd336af789e550e9c7df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gru=CC=88ning?= Date: Fri, 14 Feb 2025 11:52:15 +0100 Subject: [PATCH 4/8] fixed DownloadHandlerStream, refined test logs --- .../Indexer/Tests/ChainIndexerTests.cs | 6 +-- .../Provider/DataTypes/TransactionReceipt.cs | 3 +- .../Indexer/DataTypes/WebRPCStreamOptions.cs | 6 +-- .../Indexer/DownloadHandlerStream.cs | 53 +++++++++++++++++++ .../Indexer/DownloadHandlerStream.cs.meta | 3 ++ .../SequenceSDK/Indexer/HttpHandler.cs | 15 ++---- 6 files changed, 64 insertions(+), 22 deletions(-) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DownloadHandlerStream.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DownloadHandlerStream.cs.meta diff --git a/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs b/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs index 9e856fdd7..7e1aacc88 100644 --- a/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs +++ b/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs @@ -349,17 +349,17 @@ public void TestSubscribeBalanceUpdates() private void OnSubscribeReceiptsMessageReceived(SubscribeReceiptsReturn @event) { - Debug.Log($"Receipt Event Received, hash: {@event.receipt.transactionHash}"); + Debug.Log($"Receipt Event Received - hash: {@event.receipt.txnHash}"); } private void OnSubscribeEventsMessageReceived(SubscribeEventsReturn @event) { - Debug.Log($"Contract Event Received, address: {@event.log.contractAddress}"); + Debug.Log($"Contract Event Received - {@event.log.type} {@event.log.contractType}: {@event.log.txnHash}"); } private void OnSubscribeEventsMessageReceived(SubscribeBalanceUpdatesReturn @event) { - Debug.Log($"Balance Update Received, balance: {@event.balance.balance}"); + Debug.Log($"Balance Update Received - {@event.balance.accountAddress} owns {@event.balance.balance}"); } private void OnWebRPCErrorReceived(WebRPCError error) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Provider/DataTypes/TransactionReceipt.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Provider/DataTypes/TransactionReceipt.cs index 08d757668..08832b9c7 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Provider/DataTypes/TransactionReceipt.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Provider/DataTypes/TransactionReceipt.cs @@ -6,6 +6,7 @@ namespace Sequence [System.Serializable] public class TransactionReceipt { + public string txnHash; public string transactionHash; public string transactionIndex; public string blockHash; @@ -22,6 +23,4 @@ public class TransactionReceipt public string root; public string status; } - - } diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/WebRPCStreamOptions.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/WebRPCStreamOptions.cs index 3ed9d58ca..a9470280b 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/WebRPCStreamOptions.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/WebRPCStreamOptions.cs @@ -6,15 +6,11 @@ public class WebRPCStreamOptions { public Action onMessage; public Action onError; - public Action onOpen; - public Action onClose; - public WebRPCStreamOptions(Action onMessage, Action onError, Action onOpen = null, Action onClose = null) + public WebRPCStreamOptions(Action onMessage, Action onError) { this.onMessage = onMessage; this.onError = onError; - this.onOpen = onOpen; - this.onClose = onClose; } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DownloadHandlerStream.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DownloadHandlerStream.cs new file mode 100644 index 000000000..4d1d98697 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DownloadHandlerStream.cs @@ -0,0 +1,53 @@ +using System; +using System.Text; +using Newtonsoft.Json; +using UnityEngine; +using UnityEngine.Networking; + +namespace Sequence +{ + public class DownloadHandlerStream : DownloadHandlerScript + { + private readonly WebRPCStreamOptions _options; + + public DownloadHandlerStream(WebRPCStreamOptions options) + { + _options = options; + } + + protected override bool ReceiveData(byte[] data, int dataLength) + { + // Stream returns a ping of size 1 + if (dataLength <= 1) + return true; + + try + { + // One event can include multiple JSON objects, seperated by a line break + var input = Encoding.UTF8.GetString(data); + var jsonParts = input.Split(Environment.NewLine.ToCharArray()); + + foreach (var part in jsonParts) + { + if (!part.StartsWith('{')) + continue; + + var streamData = JsonConvert.DeserializeObject(part); + _options.onMessage?.Invoke(streamData); + } + + return true; + } + catch (Exception e) + { + _options.onError?.Invoke(new WebRPCError + { + msg = e.Message + }); + + Debug.LogException(e); + return false; + } + } + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DownloadHandlerStream.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DownloadHandlerStream.cs.meta new file mode 100644 index 000000000..d253d8421 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DownloadHandlerStream.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a894555997aa4908a1c7b761f2c025d2 +timeCreated: 1739529322 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs index 72a2fda00..07c756b4d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs @@ -2,6 +2,7 @@ using System.IO; using System.Net; using System.Net.Http; +using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using Sequence.Utils; @@ -112,7 +113,7 @@ public async void HttpStream(string chainID, string endPoint, object args, We using var req = UnityWebRequest.Put(Url(chainID, endPoint), requestJson); req.SetRequestHeader("Content-Type", "application/json"); req.SetRequestHeader("X-Access-Key", _builderApiKey); - req.downloadHandler = new DownloadHandlerStream(); + req.downloadHandler = new DownloadHandlerStream(options); req.method = UnityWebRequest.kHttpVerbPOST; await req.SendWebRequest(); @@ -146,14 +147,4 @@ private string HostName(string chainID) return $"https://{indexerName}-indexer.sequence.app"; } } - - public class DownloadHandlerStream : DownloadHandlerScript - { - protected override bool ReceiveData(byte[] data, int dataLength) - { - Debug.Log($"Received Stream Data"); - - return true; - } - } -} \ No newline at end of file +} From e0f3c21263613b25299e416df25b79b2a20f20f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gru=CC=88ning?= Date: Fri, 14 Feb 2025 11:53:55 +0100 Subject: [PATCH 5/8] version increment --- Packages/Sequence-Unity/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/Sequence-Unity/package.json b/Packages/Sequence-Unity/package.json index 184b694ab..1f18690d3 100644 --- a/Packages/Sequence-Unity/package.json +++ b/Packages/Sequence-Unity/package.json @@ -1,6 +1,6 @@ { "name": "xyz.0xsequence.waas-unity", - "version": "3.18.1", + "version": "3.19.0", "displayName": "Sequence Embedded Wallet SDK", "description": "A Unity SDK for the Sequence WaaS API", "unity": "2021.3", From 0f45731fb5b0c0bdb29b3b3eea7d00bd3ea3fa6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gru=CC=88ning?= Date: Fri, 14 Feb 2025 12:22:03 +0100 Subject: [PATCH 6/8] logic to abort all running streams --- .../Indexer/Tests/ChainIndexerTests.cs | 6 ++++++ .../SequenceSDK/Indexer/Tests/MockHttpHandler.cs | 5 +++++ .../Sequence/SequenceSDK/Indexer/ChainIndexer.cs | 11 ++++++++--- .../SequenceSDK/Indexer/DownloadHandlerStream.cs | 2 ++ .../Sequence/SequenceSDK/Indexer/HttpHandler.cs | 16 +++++++++++++++- .../Sequence/SequenceSDK/Indexer/IHttpHandler.cs | 1 + .../Sequence/SequenceSDK/Indexer/IIndexer.cs | 5 +++++ .../Sequence/SequenceSDK/Indexer/Indexer.cs | 14 +++++++++++--- 8 files changed, 53 insertions(+), 7 deletions(-) diff --git a/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs b/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs index 7e1aacc88..786f5efb2 100644 --- a/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs +++ b/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs @@ -346,6 +346,12 @@ public void TestSubscribeBalanceUpdates() var contractAddress = "0x4ab3b16e9d3328f6d8025e71cefc64305ae4fe9c"; indexer.SubscribeBalanceUpdates(new SubscribeBalanceUpdatesArgs(contractAddress), streamOptions); } + + [TestCase] + public void TestAbortStreams() + { + new ChainIndexer(Chain.TestnetArbitrumSepolia).AbortStreams(); + } private void OnSubscribeReceiptsMessageReceived(SubscribeReceiptsReturn @event) { diff --git a/Assets/SequenceSDK/Indexer/Tests/MockHttpHandler.cs b/Assets/SequenceSDK/Indexer/Tests/MockHttpHandler.cs index 4a12d7e1e..de11a112f 100644 --- a/Assets/SequenceSDK/Indexer/Tests/MockHttpHandler.cs +++ b/Assets/SequenceSDK/Indexer/Tests/MockHttpHandler.cs @@ -31,5 +31,10 @@ public void HttpStream(string chainID, string endPoint, object args, WebRPCSt { throw new NotImplementedException(); } + + public void AbortStreams() + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs index 4d4123d94..844c9b0ba 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/ChainIndexer.cs @@ -151,17 +151,22 @@ public Task GetTransactionHistory(GetTransactionHis public void SubscribeReceipts(SubscribeReceiptsArgs args, WebRPCStreamOptions options) { - Indexer.SubscribeReceipts(ChainId, args, options, 0, _customHttpHandler, this); + Indexer.SubscribeReceipts(ChainId, args, options, this); } public void SubscribeEvents(SubscribeEventsArgs args, WebRPCStreamOptions options) { - Indexer.SubscribeEvents(ChainId, args, options, 0, _customHttpHandler, this); + Indexer.SubscribeEvents(ChainId, args, options, this); } public void SubscribeBalanceUpdates(SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options) { - Indexer.SubscribeBalanceUpdates(ChainId, args, options, 0, _customHttpHandler, this); + Indexer.SubscribeBalanceUpdates(ChainId, args, options, this); + } + + public void AbortStreams() + { + Indexer.AbortStreams(this); } } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DownloadHandlerStream.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DownloadHandlerStream.cs index 4d1d98697..8e242dbd2 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DownloadHandlerStream.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DownloadHandlerStream.cs @@ -17,6 +17,8 @@ public DownloadHandlerStream(WebRPCStreamOptions options) protected override bool ReceiveData(byte[] data, int dataLength) { + CompleteContent(); + // Stream returns a ping of size 1 if (dataLength <= 1) return true; diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs index 07c756b4d..acca96977 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/HttpHandler.cs @@ -1,8 +1,8 @@ using System; +using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Http; -using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using Sequence.Utils; @@ -13,6 +13,8 @@ namespace Sequence { public class HttpHandler : IHttpHandler { + private static List _streams = new(); + private string _builderApiKey; private IIndexer _caller; @@ -116,7 +118,19 @@ public async void HttpStream(string chainID, string endPoint, object args, We req.downloadHandler = new DownloadHandlerStream(options); req.method = UnityWebRequest.kHttpVerbPOST; + _streams.Add(req); await req.SendWebRequest(); + + if (_streams.Contains(req)) + _streams.Remove(req); + } + + public void AbortStreams() + { + foreach (var stream in _streams) + stream.Abort(); + + _streams.Clear(); } private async Task RetryHttpPost(string chainID, string endPoint, object args, float waitInSeconds, int retries) diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IHttpHandler.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IHttpHandler.cs index 0ff5e402a..b718b0e3d 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IHttpHandler.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IHttpHandler.cs @@ -10,5 +10,6 @@ public interface IHttpHandler /// public Task HttpPost(string chainID, string endPoint, object args, int retries = 0); public void HttpStream(string chainID, string endPoint, object args, WebRPCStreamOptions options, int retries = 0); + public void AbortStreams(); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs index 7a873f02e..7f9477189 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/IIndexer.cs @@ -114,5 +114,10 @@ public Task> GetTokenBalancesOrganizedInDic /// Define the contract address you want to receive events from. /// Actions triggered whenever a message or error event is received. public void SubscribeBalanceUpdates(SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options); + + /// + /// Aborts all running streams. + /// + public void AbortStreams(); } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs index 0b24d6114..6a5413c79 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs @@ -325,7 +325,7 @@ public static async Task GetTransactionHistory(stri /// /// Subscribe to receipt events. /// - public static void SubscribeReceipts(string chainID, SubscribeReceiptsArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) + public static void SubscribeReceipts(string chainID, SubscribeReceiptsArgs args, WebRPCStreamOptions options, IIndexer caller) { new HttpHandler(_builderApiKey, caller).HttpStream(chainID, "SubscribeReceipts", args, options); } @@ -333,7 +333,7 @@ public static void SubscribeReceipts(string chainID, SubscribeReceiptsArgs args, /// /// Subscribe to smart contract events. /// - public static void SubscribeEvents(string chainID, SubscribeEventsArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) + public static void SubscribeEvents(string chainID, SubscribeEventsArgs args, WebRPCStreamOptions options, IIndexer caller) { new HttpHandler(_builderApiKey, caller).HttpStream(chainID, "SubscribeEvents", args, options); } @@ -341,10 +341,18 @@ public static void SubscribeEvents(string chainID, SubscribeEventsArgs args, Web /// /// Subscribe to balance update events for a given contract address. /// - public static void SubscribeBalanceUpdates(string chainID, SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options, int retries = 0, IHttpHandler httpHandler = null, IIndexer caller = null) + public static void SubscribeBalanceUpdates(string chainID, SubscribeBalanceUpdatesArgs args, WebRPCStreamOptions options, IIndexer caller) { new HttpHandler(_builderApiKey, caller).HttpStream(chainID, "SubscribeBalanceUpdates", args, options); } + + /// + /// Subscribe to balance update events for a given contract address. + /// + public static void AbortStreams(IIndexer caller) + { + new HttpHandler(_builderApiKey, caller).AbortStreams(); + } [Obsolete] private static async Task HttpPost(BigInteger chainID, string endPoint, object args, int retries = 0) From de08da71446691eb9c2d166d0607adb3be45a2c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andy=20Gru=CC=88ning?= Date: Fri, 14 Feb 2025 14:45:06 +0100 Subject: [PATCH 7/8] added EventDecoded data type --- .../SequenceSDK/Indexer/DataTypes/EventDecoded.cs | 12 ++++++++++++ .../Indexer/DataTypes/EventDecoded.cs.meta | 3 +++ .../SequenceSDK/Indexer/DataTypes/EventLog.cs | 1 + .../Sequence/SequenceSDK/Indexer/Indexer.cs | 1 + 4 files changed, 17 insertions(+) create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventDecoded.cs create mode 100644 Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventDecoded.cs.meta diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventDecoded.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventDecoded.cs new file mode 100644 index 000000000..c321a7f30 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventDecoded.cs @@ -0,0 +1,12 @@ +namespace Sequence +{ + [System.Serializable] + public class EventDecoded + { + public string topicHash; + public string eventSig; + public string[] types; + public string[] names; + public string[] values; + } +} \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventDecoded.cs.meta b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventDecoded.cs.meta new file mode 100644 index 000000000..a6a4f5744 --- /dev/null +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventDecoded.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 54a3a34fc2c64f73b619ef8e7d85158e +timeCreated: 1739540532 \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventLog.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventLog.cs index 4b050c72b..d4aec35ba 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventLog.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/DataTypes/EventLog.cs @@ -17,5 +17,6 @@ public class EventLog public EventLogDataType logDataType; public string ts; public string logData; + public EventDecoded @event; } } \ No newline at end of file diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs index 6a5413c79..1a58302fa 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Indexer/Indexer.cs @@ -41,6 +41,7 @@ public enum EventLogType public enum EventLogDataType { UNKNOWN, + EVENT, TOKEN_TRANSFER, SEQUENCE_TXN, NATIVE_TOKEN_TRANSFER From 567a431afd70fedd62b886167f52f1a045ef809e Mon Sep 17 00:00:00 2001 From: Quinn Purdy Date: Fri, 14 Feb 2025 09:39:55 -0500 Subject: [PATCH 8/8] Added end-to-end tests that confirm we receive the events --- .../Indexer/Tests/ChainIndexerTests.cs | 144 ++++++++++++++++++ .../Indexer/Tests/SequenceIndexerTests.asmdef | 5 +- .../SequenceSDK/Ethereum/Address/Address.cs | 15 ++ 3 files changed, 163 insertions(+), 1 deletion(-) diff --git a/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs b/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs index 786f5efb2..1c05c4bfb 100644 --- a/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs +++ b/Assets/SequenceSDK/Indexer/Tests/ChainIndexerTests.cs @@ -5,9 +5,14 @@ using System.Threading.Tasks; using NUnit.Framework; using Sequence; +using Sequence.Contracts; +using Sequence.EmbeddedWallet; +using Sequence.EmbeddedWallet.Tests; using Sequence.Utils; using UnityEngine; using UnityEngine.TestTools; +using EOAWallet = Sequence.Wallet.EOAWallet; +using Transaction = System.Transactions.Transaction; namespace Sequence.Indexer.Tests { @@ -315,6 +320,72 @@ public void TestSubscribeReceipts() indexer.SubscribeReceipts(new SubscribeReceiptsArgs(filter), streamOptions); } + + [Test] + public async Task TestReceiptSubscriptionReceived() + { + Chain chain = Chain.ArbitrumNova; + bool receiptReceived = false; + IIndexer indexer = new ChainIndexer(chain); + ERC1155 universallyMintable = new ERC1155("0x0ee3af1874789245467e7482f042ced9c5171073"); + var streamOptions = new WebRPCStreamOptions( + (@return => + { + Assert.IsNotNull(@return); + Assert.IsNotNull(@return.receipt); + receiptReceived = true; + }), + OnWebRPCErrorReceived); + + + var filter = new TransactionFilter() + { + contractAddress = universallyMintable.Contract.GetAddress() + }; + indexer.SubscribeReceipts(new SubscribeReceiptsArgs(filter), streamOptions); + + await DoMintTransaction(chain); + + while (!receiptReceived) + { + await Task.Yield(); + } + } + + private async Task DoMintTransaction(Chain chain) + { + var tcs = new TaskCompletionSource(); + EndToEndTestHarness testHarness = new EndToEndTestHarness(); + EOAWallet toWallet = new EOAWallet(); + string toAddress = toWallet.GetAddress().Value; + + testHarness.Login(async wallet => + { + try + { + ERC1155 erc1155 = new ERC1155("0x0ee3af1874789245467e7482f042ced9c5171073"); + + TransactionReturn transactionReturn = await wallet.SendTransaction(chain, + new EmbeddedWallet.Transaction[] + { + new RawTransaction(erc1155.Mint(toAddress, 1, 1)), + }); + Assert.IsNotNull(transactionReturn); + Assert.IsTrue(transactionReturn is SuccessfulTransactionReturn); + + tcs.TrySetResult(true); + } + catch (System.Exception e) + { + tcs.TrySetException(e); + } + }, (error, method, email, methods) => + { + tcs.TrySetException(new Exception(error)); + }); + + await tcs.Task; + } [TestCase] public void TestSubscribeEvents() @@ -334,6 +405,42 @@ public void TestSubscribeEvents() indexer.SubscribeEvents(new SubscribeEventsArgs(eventFilter), streamOptions); } + + [Test] + public async Task TestEventSubscriptionReceived() + { + Chain chain = Chain.ArbitrumNova; + bool eventReceived = false; + IIndexer indexer = new ChainIndexer(chain); + ERC1155 universallyMintable = new ERC1155("0x0ee3af1874789245467e7482f042ced9c5171073"); + var streamOptions = new WebRPCStreamOptions( + (@return => + { + Assert.IsNotNull(@return); + Assert.IsNotNull(@return.log); + Assert.AreEqual(universallyMintable.Contract.GetAddress().Value, @return.log.contractAddress); + eventReceived = true; + }), + OnWebRPCErrorReceived); + + + var eventFilter = new EventFilter + { + accounts = Array.Empty(), + contractAddresses = new[] {universallyMintable.Contract.GetAddress().Value}, + tokenIDs = new[] {"1"}, + events = new[] {"TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value)"} + }; + + indexer.SubscribeEvents(new SubscribeEventsArgs(eventFilter), streamOptions); + + await DoMintTransaction(chain); + + while (!eventReceived) + { + await Task.Yield(); + } + } [TestCase] public void TestSubscribeBalanceUpdates() @@ -347,11 +454,48 @@ public void TestSubscribeBalanceUpdates() indexer.SubscribeBalanceUpdates(new SubscribeBalanceUpdatesArgs(contractAddress), streamOptions); } + [Test] + public async Task TestBalanceUpdateSubscriptionReceived() + { + Chain chain = Chain.ArbitrumNova; + bool eventReceived = false; + IIndexer indexer = new ChainIndexer(chain); + var streamOptions = new WebRPCStreamOptions( + (@return => + { + Assert.IsNotNull(@return); + Assert.IsNotNull(@return.balance); + if (!@return.balance.accountAddress.IsZeroAddress()) + { + Assert.AreEqual(BigInteger.One, @return.balance.balance); + } + eventReceived = true; + }), + OnWebRPCErrorReceived); + + ERC1155 universallyMintable = new ERC1155("0x0ee3af1874789245467e7482f042ced9c5171073"); + + indexer.SubscribeBalanceUpdates(new SubscribeBalanceUpdatesArgs(universallyMintable.Contract.GetAddress()), streamOptions); + + await DoMintTransaction(chain); + + while (!eventReceived) + { + await Task.Yield(); + } + } + [TestCase] public void TestAbortStreams() { new ChainIndexer(Chain.TestnetArbitrumSepolia).AbortStreams(); } + + [TearDown] + public void UnsubscribeFromEvents() + { + new ChainIndexer(Chain.ArbitrumNova).AbortStreams(); + } private void OnSubscribeReceiptsMessageReceived(SubscribeReceiptsReturn @event) { diff --git a/Assets/SequenceSDK/Indexer/Tests/SequenceIndexerTests.asmdef b/Assets/SequenceSDK/Indexer/Tests/SequenceIndexerTests.asmdef index f7c1efa2a..a434fd936 100644 --- a/Assets/SequenceSDK/Indexer/Tests/SequenceIndexerTests.asmdef +++ b/Assets/SequenceSDK/Indexer/Tests/SequenceIndexerTests.asmdef @@ -7,7 +7,10 @@ "GUID:0acc523941302664db1f4e527237feb3", "GUID:a35e3a53d4439435f8b36ed2c6158cd8", "GUID:b4f9c0f8f363f439b9e337f79050f189", - "GUID:403077141e1554429a890cbc129df651" + "GUID:403077141e1554429a890cbc129df651", + "GUID:040286810a82b46ed9acd6d70bfbbfd4", + "SequenceEmbeddedWallet", + "SequenceAuthentication" ], "includePlatforms": [ "Editor" diff --git a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs index 3c58abb74..82f2b9dc6 100644 --- a/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs +++ b/Packages/Sequence-Unity/Sequence/SequenceSDK/Ethereum/Address/Address.cs @@ -82,4 +82,19 @@ public override bool CanConvert(Type objectType) return true; } } + + public static class AddressExtensions + { + public static bool IsZeroAddress(this Address address) + { + return IsZeroAddress(address.Value); + } + + public static bool IsZeroAddress(this string address) + { + string toCheck = address.WithoutHexPrefix(); + toCheck = toCheck.Replace("0", ""); + return toCheck.Length == 0; + } + } } \ No newline at end of file