diff --git a/Assets/MirageSDK/Examples/Scripts/WearableNFTExample/WearableNFTExample.cs b/Assets/MirageSDK/Examples/Scripts/WearableNFTExample/WearableNFTExample.cs index abe08542..cf05267e 100644 --- a/Assets/MirageSDK/Examples/Scripts/WearableNFTExample/WearableNFTExample.cs +++ b/Assets/MirageSDK/Examples/Scripts/WearableNFTExample/WearableNFTExample.cs @@ -85,11 +85,8 @@ private IContract private IContract _gameItemContract; //you can find the source in the mirage-smart-contract-example repo in contracts/GameItem.sol - private Web3 _web3; - private void Awake() { - _web3 = new Web3(_providerInfo.HttpProviderURL); SubscribeButtonLinks(); } @@ -131,7 +128,7 @@ public override void SetUseCaseBodyActive(bool isActive) var sdkInstance = MirageSDKFactory.GetMirageSDKInstance(_providerInfo.HttpProviderURL); _gameCharacterContract = sdkInstance.GetContract(_gameCharacterContractInfo); - + _gameItemContract = sdkInstance.GetContract(_gameItemContractInfo); _ethHandler = sdkInstance.Eth; } diff --git a/Assets/MirageSDK/Plugins/WalletConnect.VersionShared/Infrastructure/IWalletConnectCommunicator.cs b/Assets/MirageSDK/Plugins/WalletConnect.VersionShared/Infrastructure/IWalletConnectCommunicator.cs index 3c87bef4..92ec9563 100644 --- a/Assets/MirageSDK/Plugins/WalletConnect.VersionShared/Infrastructure/IWalletConnectCommunicator.cs +++ b/Assets/MirageSDK/Plugins/WalletConnect.VersionShared/Infrastructure/IWalletConnectCommunicator.cs @@ -20,7 +20,7 @@ public interface IWalletConnectCommunicator UniTask EthChainId(); string GetDefaultAccount(string network); - UniTask Send(TRequest data) + UniTask Send(TRequest request) where TRequest : IIdentifiable where TResponse : IErrorHolder; } diff --git a/Assets/MirageSDK/Plugins/WalletConnect.VersionShared/Models/JsonRpcRequest.cs b/Assets/MirageSDK/Plugins/WalletConnect.VersionShared/Models/JsonRpcRequest.cs index 29803d90..bd7d845e 100644 --- a/Assets/MirageSDK/Plugins/WalletConnect.VersionShared/Models/JsonRpcRequest.cs +++ b/Assets/MirageSDK/Plugins/WalletConnect.VersionShared/Models/JsonRpcRequest.cs @@ -30,5 +30,11 @@ public JsonRpcRequest() [JsonIgnore] public string Event => Method; + + public override string ToString() + { + var jsonStr = JsonConvert.SerializeObject(this); + return jsonStr; + } } } \ No newline at end of file diff --git a/Assets/MirageSDK/Plugins/WalletConnect.VersionShared/Models/JsonRpcResponse.cs b/Assets/MirageSDK/Plugins/WalletConnect.VersionShared/Models/JsonRpcResponse.cs index d3c3f96a..d4cc9e68 100644 --- a/Assets/MirageSDK/Plugins/WalletConnect.VersionShared/Models/JsonRpcResponse.cs +++ b/Assets/MirageSDK/Plugins/WalletConnect.VersionShared/Models/JsonRpcResponse.cs @@ -29,6 +29,12 @@ public class JsonRpcResponse : IEventSource, IErrorHolder [JsonIgnore] public string Event => "response:" + ID; + public override string ToString() + { + var jsonStr = JsonConvert.SerializeObject(this); + return jsonStr; + } + public class JsonRpcError { [JsonProperty("code")] diff --git a/Assets/MirageSDK/Plugins/WalletConnectSharp.Core/Events/EventDelegator.cs b/Assets/MirageSDK/Plugins/WalletConnectSharp.Core/Events/EventDelegator.cs index f1884570..a75f4993 100644 --- a/Assets/MirageSDK/Plugins/WalletConnectSharp.Core/Events/EventDelegator.cs +++ b/Assets/MirageSDK/Plugins/WalletConnectSharp.Core/Events/EventDelegator.cs @@ -9,11 +9,6 @@ public class EventDelegator : IDisposable { private readonly Dictionary> _listeners = new Dictionary>(); - public void ListenForGenericResponse(object id, EventHandler> callback) - { - ListenForGeneric("response:" + id, callback); - } - public void ListenForResponse(object id, EventHandler> callback) { ListenFor("response:" + id, callback); @@ -54,11 +49,6 @@ private void SubscribeProvider(string eventId, IEventProvider provider) listProvider.Add(provider); } - public bool Trigger(string topic, T obj) - { - return Trigger(topic, JsonConvert.SerializeObject(obj)); - } - public bool Trigger(string topic, string json) { if (!_listeners.ContainsKey(topic)) diff --git a/Assets/MirageSDK/Plugins/WalletConnectSharp.Core/Models/NetworkMessage.cs b/Assets/MirageSDK/Plugins/WalletConnectSharp.Core/Models/NetworkMessage.cs index 9cabede6..de692992 100644 --- a/Assets/MirageSDK/Plugins/WalletConnectSharp.Core/Models/NetworkMessage.cs +++ b/Assets/MirageSDK/Plugins/WalletConnectSharp.Core/Models/NetworkMessage.cs @@ -15,5 +15,10 @@ public class NetworkMessage [JsonProperty("silent")] public bool Silent; + + public override string ToString() + { + return JsonConvert.SerializeObject(this); + } } } \ No newline at end of file diff --git a/Assets/MirageSDK/Plugins/WalletConnectSharp.Core/WalletConnectSession.cs b/Assets/MirageSDK/Plugins/WalletConnectSharp.Core/WalletConnectSession.cs index fc670114..db9645a2 100644 --- a/Assets/MirageSDK/Plugins/WalletConnectSharp.Core/WalletConnectSession.cs +++ b/Assets/MirageSDK/Plugins/WalletConnectSharp.Core/WalletConnectSession.cs @@ -339,7 +339,7 @@ public async UniTask EthSendRawTransaction(string data, Encoding message return response.Result; } - public async UniTask Send(TRequest data) + public async UniTask Send(TRequest request) where TRequest : IIdentifiable where TResponse : IErrorHolder { @@ -358,10 +358,9 @@ void HandleSendResponse(object sender, JsonRpcResponseEvent @event) } } - EventDelegator.ListenForResponse(data.ID, HandleSendResponse); - - await SendRequest(data); - + EventDelegator.ListenForResponse(request.ID, HandleSendResponse); + + await SendRequest(request); OnSend?.Invoke(); return await eventCompleted.Task; diff --git a/Assets/MirageSDK/Plugins/WalletConnectSharp.Unity/Network/Client/Implementation/WebSocket.cs b/Assets/MirageSDK/Plugins/WalletConnectSharp.Unity/Network/Client/Implementation/WebSocket.cs index 71d82d2d..277d8678 100644 --- a/Assets/MirageSDK/Plugins/WalletConnectSharp.Unity/Network/Client/Implementation/WebSocket.cs +++ b/Assets/MirageSDK/Plugins/WalletConnectSharp.Unity/Network/Client/Implementation/WebSocket.cs @@ -192,6 +192,7 @@ private async UniTask SendMessage(List> queue, WebSocketMessa } } + if (!sending) { // Lock with a timeout, just in case. @@ -209,18 +210,24 @@ await _socket.CloseAsync(WebSocketCloseStatus.InternalServerError, string.Empty, var t = _socket.SendAsync(buffer, messageType, true, _cancellationToken); t.Wait(_cancellationToken); } + catch (Exception ex) + { + Debug.LogError("Socket SendAsync exception: " + ex.Message + " StackTrace: " + ex.StackTrace); + } finally { Monitor.Exit(_socket); } // Note that we've finished sending. + lock (_lock) { _isSending = false; } // Handle any queued messages. + await HandleQueue(queue, messageType); } else @@ -258,16 +265,22 @@ private async UniTask HandleQueue(List> queue, WebSocketMessa public void DispatchMessageQueue() { // lock mutex, copy queue content and clear the queue. - _messageListMutex.WaitOne(); - var messageListCopy = new List(); - messageListCopy.AddRange(_messageList); - _messageList.Clear(); - // release mutex to allow the websocket to add new messages - _messageListMutex.ReleaseMutex(); - - foreach (var bytes in messageListCopy) + List messageListCopy = null; + if (_messageList.Count > 0) { - OnMessage?.Invoke(bytes); + _messageListMutex.WaitOne(); + messageListCopy = new List(_messageList); + _messageList.Clear(); + // release mutex to allow the websocket to add new messages + _messageListMutex.ReleaseMutex(); + } + + if (messageListCopy != null) + { + foreach (var bytes in messageListCopy) + { + OnMessage?.Invoke(bytes); + } } } @@ -321,7 +334,7 @@ public async UniTask Receive() } catch (Exception e) { - Debug.LogException(e); + Debug.LogError($"WebSocket Receive exception: {e.Message} {e.StackTrace}"); _tokenSource.Cancel(); } finally diff --git a/Assets/MirageSDK/Plugins/WalletConnectSharp.Unity/Network/NativeWebSocketTransport.cs b/Assets/MirageSDK/Plugins/WalletConnectSharp.Unity/Network/NativeWebSocketTransport.cs index 3c8bbcd0..d7018cd3 100644 --- a/Assets/MirageSDK/Plugins/WalletConnectSharp.Unity/Network/NativeWebSocketTransport.cs +++ b/Assets/MirageSDK/Plugins/WalletConnectSharp.Unity/Network/NativeWebSocketTransport.cs @@ -32,12 +32,12 @@ public class NativeWebSocketTransport : ITransport public void Update() { - #if !UNITY_WEBGL || UNITY_EDITOR + #if !UNITY_WEBGL || UNITY_EDITOR if (_client?.State == WebSocketState.Open) { _client.DispatchMessageQueue(); } - #endif + #endif } public async UniTask OnApplicationPause(bool pauseStatus) @@ -117,7 +117,6 @@ public async UniTask SendMessage(NetworkMessage message) else { var finalJson = JsonConvert.SerializeObject(message); - await _client.SendText(finalJson); } } diff --git a/Assets/MirageSDK/Plugins/WalletConnectSharp.Unity/WalletConnect.cs b/Assets/MirageSDK/Plugins/WalletConnectSharp.Unity/WalletConnect.cs index 0cb8513e..2c3adbf8 100644 --- a/Assets/MirageSDK/Plugins/WalletConnectSharp.Unity/WalletConnect.cs +++ b/Assets/MirageSDK/Plugins/WalletConnectSharp.Unity/WalletConnect.cs @@ -169,7 +169,6 @@ public async UniTask OnApplicationPause(bool pauseStatus) public async UniTask Connect() { - TeardownEvents(); var savedSession = SessionSaveHandler.GetSavedSession(); Logger.AddLog(PackageInfo.Version); @@ -291,12 +290,12 @@ public string GetDefaultAccount(string network = null) return _session.GetDefaultAccount(network); } - public UniTask Send(TRequest data) + public UniTask Send(TRequest request) where TRequest : IIdentifiable where TResponse : IErrorHolder { CheckIfSessionCreated(); - return _session.Send(data); + return _session.Send(request); } public UniTask GenericRequest(GenericJsonRpcRequest genericRequest) @@ -465,6 +464,7 @@ private void HandleSessionCreated() private async UniTask CompleteConnect() { SetupDefaultWallet().Forget(); + TeardownEvents(); SetupEvents(); var tries = 0; diff --git a/Assets/MirageSDK/Runtime/Core/Implementation/ContractEventSubscriber.cs b/Assets/MirageSDK/Runtime/Core/Implementation/ContractEventSubscriber.cs index 00b63002..4e90041f 100644 --- a/Assets/MirageSDK/Runtime/Core/Implementation/ContractEventSubscriber.cs +++ b/Assets/MirageSDK/Runtime/Core/Implementation/ContractEventSubscriber.cs @@ -71,12 +71,14 @@ public async UniTask ListenForEvents() Update().Forget(); + var connectTask = _transport.Connect().AsTask(); await connectTask; + if (connectTask.IsFaulted) { - Debug.LogError(connectTask.Exception); + Debug.LogError("ContractEventSubscribed " + connectTask.Exception); } Debug.Log("Listen for events socket connected"); diff --git a/Assets/MirageSDK/Runtime/SilentSigning/Implementation/SilentSigningProtocol.cs b/Assets/MirageSDK/Runtime/SilentSigning/Implementation/SilentSigningProtocol.cs index f2802220..78af1487 100644 --- a/Assets/MirageSDK/Runtime/SilentSigning/Implementation/SilentSigningProtocol.cs +++ b/Assets/MirageSDK/Runtime/SilentSigning/Implementation/SilentSigningProtocol.cs @@ -13,7 +13,9 @@ namespace MirageSDK.SilentSigning.Implementation public class SilentSigningProtocol : ISilentSigningHandler { public ISilentSigningSessionHandler SessionHandler { get; } - private WalletConnectSharp.Unity.WalletConnect WalletConnect => ConnectProvider.GetConnect(); + + private WalletConnectSharp.Unity.WalletConnect WalletConnect => + ConnectProvider.GetConnect(); private bool _skipNextDeepLink; @@ -28,6 +30,7 @@ public async UniTask RequestSilentSign(long timestamp, long chainId = 1) var data = new SilentSigningConnectionRequest(timestamp, chainId); var requestSilentSign = await WalletConnect.Send(data); + if (!requestSilentSign.IsError) { SessionHandler.SaveSilentSession(requestSilentSign.Result); @@ -44,7 +47,8 @@ public UniTask DisconnectSilentSign() return WalletConnect.Send(data); } - public async UniTask SendSilentTransaction(string from, string to, string data = null, string value = null, + public async UniTask SendSilentTransaction(string from, string to, string data = null, + string value = null, string gas = null, string gasPrice = null, string nonce = null) { diff --git a/Assets/MirageSDK/Runtime/Utils/EventAwaiter.cs b/Assets/MirageSDK/Runtime/Utils/EventAwaiter.cs index 405f0705..0d3e8a96 100644 --- a/Assets/MirageSDK/Runtime/Utils/EventAwaiter.cs +++ b/Assets/MirageSDK/Runtime/Utils/EventAwaiter.cs @@ -3,6 +3,7 @@ using MirageSDK.Core.Infrastructure; using MirageSDK.Data; using Cysharp.Threading.Tasks; +using UnityEngine; namespace MirageSDK.Utils { @@ -44,6 +45,7 @@ public async UniTask StartWaiting(EventFilterRequest filtersRequest) { _receiveEventCompletionSource = new UniTaskCompletionSource(); _eventSubscriber.ListenForEvents().Forget(); + await _eventSubscriber.SocketOpeningTask; try @@ -56,6 +58,7 @@ public async UniTask StartWaiting(EventFilterRequest filtersRequest) } catch (Exception e) { + Debug.LogError("EventAwaiter exception: " + e.Message); _receiveEventCompletionSource.TrySetException(e); } }