WalletConnect / WalletConnectUnity

[DEPRECATED] WalletConnect v2 and Modal for Unity 🎮
MIT License
137 stars 48 forks source link

JsonSerializationException when click on any wallet button #135

Closed PavelMo4alov closed 9 months ago

PavelMo4alov commented 9 months ago

Describe the bug An exception happened after select any wallet from list on iOS device

To Reproduce Steps to reproduce the behavior:

  1. Build project with scene WalletConnectModal Sample.unity to iOS
  2. Build xCode project
  3. Run on iPhone or on macbook (the same behavior)
  4. Select Ethereum network
  5. Click Continue
  6. List of wallets appears
  7. Click to MetaMask
  8. Empty window and exception in logs [JsonRpcProvider] Got payload {"id":1702024657448220,"jsonrpc":"2.0","error":{"code":-2146233088,"message":"Unable to find a constructor to use for type WalletConnectSharp.Network.Models.JsonRpcPayload. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'method', line 1, position 10.","data":null}}

Expected behavior Opening the wallet app like MetaMask or another

Screenshots photo_2023-12-08 16 09 26

Environment

Is this happening in Unity Editor or on a player like Android, iOS, Windows? iOS device: iPhone 13 pro, MacBook Pro M1 16 2021

Wallets used for testing Metamask, Bitget, Rainbow

Additional context Logs from xCode:

[Relayer] Checking for established connection [Relayer] Sending request through provider [JsonRpcProvider] Checking if connected [JsonRpcProvider] Sending request irn_subscribe with data {"method":"irn_subscribe","params":{"topic":"3b28c3b366551a700e9c34dd419db8a98877df06c085013f61907be4ce3c92a7"},"id":1702024657448220,"jsonrpc":"2.0"} [WebSocketConnection-8af0166b-9198-4ff3-b4bb-73543957ac0c] Sending request {"method":"irn_subscribe","params":{"topic":"3b28c3b366551a700e9c34dd419db8a98877df06c085013f61907be4ce3c92a7"},"id":1702024657448220,"jsonrpc":"2.0"} [JsonRpcProvider] Got payload {"method":"irn_subscribe","params":{"topic":"3b28c3b366551a700e9c34dd419db8a98877df06c085013f61907be4ce3c92a7"},"id":1702024657448220,"jsonrpc":"2.0"} [JsonRpcProvider] Got payload {"id":1702024657448220,"jsonrpc":"2.0","error":{"code":-2146233088,"message":"Unable to find a constructor to use for type WalletConnectSharp.Network.Models.JsonRpcPayload. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'method', line 1, position 10.","data":null}} [WebSocketConnection-8af0166b-9198-4ff3-b4bb-73543957ac0c] Got payload: [JsonRpcProvider] Got payload {"id":1702024657448220,"jsonrpc":"2.0","result":"35f38d35d547595e618714621f0b8a715f2e6db9c8cf61e99e3e8352d686f895"}

JsonSerializationException: Unable to find a constructor to use for type WalletConnectSharp.Network.Models.JsonRpcPayload. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'id', line 1, position 6. at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewObject (Newtonsoft.Json.JsonReader reader, Newtonsoft.Json.Serialization.JsonObjectContract objectContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, Newtonsoft.Json.Serialization.JsonProperty containerProperty, System.String id, System.Boolean& createdFromNonDefaultCreator) [0x00000] in <00000000000000000000000000000000>:0 at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject (Newtonsoft.Json.JsonReader reader, System.Type objectType, Newtonsoft.Json.Serialization.JsonContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, System.Object existingValue) [0x00000] in <00000000000000000000000000000000>:0 at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize (Newtonsoft.Json.JsonReader reader, System.Type objectType, System.Boolean checkAdditionalContent) [0x00000] in <00000000000000000000000000000000>:0 at Newtonsoft.Json.JsonSerializer.DeserializeInternal (Newtonsoft.Json.JsonReader reader, System.Type objectType) [0x00000] in <00000000000000000000000000000000>:0 at Newtonsoft.Json.JsonConvert.DeserializeObject (System.String value, System.Type type, Newtonsoft.Json.JsonSerializerSettings settings) [0x00000] in <00000000000000000000000000000000>:0 at Newtonsoft.Json.JsonConvert.DeserializeObject[T] (System.String value, Newtonsoft.Json.JsonSerializerSettings settings) [0x00000] in <00000000000000000000000000000000>:0 at WalletConnectSharp.Network.JsonRpcProvider.OnPayload (System.Object sender, System.String json) [0x00000] in <00000000000000000000000000000000>:0 at NativeWebSocket.WebSocket.DispatchMessageQueue () [0x00000] in <00000000000000000000000000000000>:0 at WalletConnectUnity.Core.UnityEventsDispatcher+d__14.MoveNext () [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) [0x00000] in <00000000000000000000000000000000>:0

skibitsky commented 9 months ago

Hey @PavelMo4alov,

Thank you for opening the issues and providing all the details 🙏

Do you have Managed Stripping Level set to Minimal in iOS Player settings?

PavelMo4alov commented 9 months ago

Oh my apologies, it is very obviously. I have to change the level and rebuild the project. Thank you!

skibitsky commented 9 months ago

No problem! We should do a better job of explaining how to solve this exception. Let's keep this issue open until I update the exception handling.

PavelMo4alov commented 9 months ago

Connection with BitKeep (Bitget wallet) and Exodus works fine:

  1. Connect window appears IMG_4360
  2. I approved the connection
  3. Go back to unity app, the connection is succeeded

But MetaMast works incorrect. There is not connect window after opened by deeplink. I tried to reinstall MetaMask - without success. IMG_4359

MetaMask version v7.12.1 (1221)

Logs from xCode: > [Relayer] Checking for established connection > > [Relayer] Sending request through provider > > [JsonRpcProvider] Checking if connected > > [JsonRpcProvider] Sending request irn_subscribe with data {"method":"irn_subscribe","params":{"topic":"d9dec936a2f0de84a81f32998ec10e8c65fcfaf666f31fc41608d07f964bb083"},"id":1702032354883217,"jsonrpc":"2.0"} > > [WebSocketConnection-d21f7ba2-4468-4636-a3ca-de75f0e65422] Sending request {"method":"irn_subscribe","params":{"topic":"d9dec936a2f0de84a81f32998ec10e8c65fcfaf666f31fc41608d07f964bb083"},"id":1702032354883217,"jsonrpc":"2.0"} > > [JsonRpcProvider] Got payload {"method":"irn_subscribe","params":{"topic":"d9dec936a2f0de84a81f32998ec10e8c65fcfaf666f31fc41608d07f964bb083"},"id":1702032354883217,"jsonrpc":"2.0"} > > [JsonRpcProvider] Payload has ID 1702032354883217 > > [JsonRpcProvider] Awaiting request result > > [WebSocketConnection-d21f7ba2-4468-4636-a3ca-de75f0e65422] Got payload: > {"id":1702032354883217,"jsonrpc":"2.0","result":"8f4d4f7b50db01f65c5ca9cdfa7dcd7aedb9aa2920f739e7789526ee1d79785d"} > > [JsonRpcProvider] Got payload {"id":1702032354883217,"jsonrpc":"2.0","result":"8f4d4f7b50db01f65c5ca9cdfa7dcd7aedb9aa2920f739e7789526ee1d79785d"} > > [JsonRpcProvider] Payload has ID 1702032354883217 > > Triggering event for ID 1702032354883217 > Created pairing for new topic: d9dec936a2f0de84a81f32998ec10e8c65fcfaf666f31fc41608d07f964bb083 > > Created public key pair > > [TestUnity-engine] Sending request JSON {"relays":[{"protocol":"irn"}],"requiredNamespaces":{"eip155":{"chains":["eip155:1"],"methods":["eth_sendTransaction","personal_sign"],"events":["chainChanged","accountsChanged"]}},"optionalNamespaces":{},"sessionProperties":null,"proposer":{"publicKey":"3efaa20a9df1cf180bc7ab0177f20d62dcbf911a42c84869a69950e03ffde944","metadata":{"name":"TestUnity","description":"","url":"","icons":[],"redirect":{"native":"","universal":""},"verifyUrl":""}}} to topic > > {"method":"wc_sessionPropose","params":{"relays":[{"protocol":"irn"}],"requiredNamespaces":{"eip155":{"chains":["eip155:1"],"methods":["eth_sendTransaction","personal_sign"],"events":["chainChanged","accountsChanged"]}},"optionalNamespaces":{},"sessionProperties":null,"proposer":{"publicKey":"3efaa20a9df1cf180bc7ab0177f20d62dcbf911a42c84869a69950e03ffde944","metadata":{"name":"TestUnity","description":"","url":"","icons":[],"redirect":{"native":"","universal":""},"verifyUrl":""}}},"id":1702032355067968,"jsonrpc":"2.0"} > > [Relayer] Checking for established connection > > [Relayer] Sending request through provider > > [JsonRpcProvider] Checking if connected > > [JsonRpcProvider] Sending request irn_publish with data {"method":"irn_publish","params":{"topic":"d9dec936a2f0de84a81f32998ec10e8c65fcfaf666f31fc41608d07f964bb083","message":"AArZn4/DstF3/bV6iya2KTlOFDbO0sP5EHmIAWjuW9pX/D99A/2KuKWjckiRQF+q9xRLxAv9e2gTH/4hl9YgEi56LuQj5I6IJvTiPRgb0pF+xpTSYk/FTA3CqsQYBENgVOGRuEcck17i8R6fBmFVzHJjsVSdm0WWYnFdO4j7tuote07Nt4UbHQilx9dzr04jNfCGkmL5+TwX9daDGtIg+iTeO9naK2waOU0qZQ9N5SsB7YKYF9rJJtG8EDzY6998rHTIqA4yp1FV7yENJZzmjDLblbDqlf6/R+dbIvRfszSvK0+PKK/sMt/tO8tj8P+tmNwigBVC0FSDdUi1s2oD6dkh5TozVK42/Nd1MFK/vXkkIRyEAwPtD9t4lZnw2PhCOFyjWoh7eDD7KEvZGGEqt6dgvxT9biF8ZBnWrxiSxTmnyxAfbtIcyJQHBYwKnVCXzUkw05zdkHxKZK/llY6KPljDZmbrhh1OwGBl5xf1yA5Me//u4mYfEGiFWCMjjcLBDEKtjpNXBs3C71qo+c2CaKrLs0wCo7EvqF5PP3c0UGts5OPMn3rxW30qTOAC5Gbism6QcgvVbF7+TmnqAcnXW1WX0gzMgj1a0R0Q/xie7RP+bet5HIWoCp4Yuv4X0743mV2ZFu9HApNqNDckVs5cT5NLe/SKMNFXH3+JM3bZrvKDAqC4U7GYRsLOxxRkjTKfVuOK/GMkq+cIkpJ98yTZ8dVw7gyztidoCg==","ttl":300,"tag":1100},"id":1702032355089624,"jsonrpc":"2.0"} > > [WebSocketConnection-d21f7ba2-4468-4636-a3ca-de75f0e65422] Sending request {"method":"irn_publish","params":{"topic":"d9dec936a2f0de84a81f32998ec10e8c65fcfaf666f31fc41608d07f964bb083","message":"AArZn4/DstF3/bV6iya2KTlOFDbO0sP5EHmIAWjuW9pX/D99A/2KuKWjckiRQF+q9xRLxAv9e2gTH/4hl9YgEi56LuQj5I6IJvTiPRgb0pF+xpTSYk/FTA3CqsQYBENgVOGRuEcck17i8R6fBmFVzHJjsVSdm0WWYnFdO4j7tuote07Nt4UbHQilx9dzr04jNfCGkmL5+TwX9daDGtIg+iTeO9naK2waOU0qZQ9N5SsB7YKYF9rJJtG8EDzY6998rHTIqA4yp1FV7yENJZzmjDLblbDqlf6/R+dbIvRfszSvK0+PKK/sMt/tO8tj8P+tmNwigBVC0FSDdUi1s2oD6dkh5TozVK42/Nd1MFK/vXkkIRyEAwPtD9t4lZnw2PhCOFyjWoh7eDD7KEvZGGEqt6dgvxT9biF8ZBnWrxiSxTmnyxAfbtIcyJQHBYwKnVCXzUkw05zdkHxKZK/llY6KPljDZmbrhh1OwGBl5xf1yA5Me//u4mYfEGiFWCMjjcLBDEKtjpNXBs3C71qo+c2CaKrLs0wCo7EvqF5PP3c0UGts5OPMn3rxW30qTOAC5Gbism6QcgvVbF7+TmnqAcnXW1WX0gzMgj1a0R0Q/xie7RP+bet5HIWoCp4Yuv4X0743mV2ZFu9HApNqNDckVs5cT5NLe/SKMNFXH3+JM3bZrvKDAqC4U7GYRsLOxxRkjTKfVuOK/GMkq+cIkpJ98yTZ8dVw7gyztidoCg==","ttl":300,"tag":1100},"id":1702032355089624,"jsonrpc":"2.0"} > > [JsonRpcProvider] Got payload {"method":"irn_publish","params":{"topic":"d9dec936a2f0de84a81f32998ec10e8c65fcfaf666f31fc41608d07f964bb083","message":"AArZn4/DstF3/bV6iya2KTlOFDbO0sP5EHmIAWjuW9pX/D99A/2KuKWjckiRQF+q9xRLxAv9e2gTH/4hl9YgEi56LuQj5I6IJvTiPRgb0pF+xpTSYk/FTA3CqsQYBENgVOGRuEcck17i8R6fBmFVzHJjsVSdm0WWYnFdO4j7tuote07Nt4UbHQilx9dzr04jNfCGkmL5+TwX9daDGtIg+iTeO9naK2waOU0qZQ9N5SsB7YKYF9rJJtG8EDzY6998rHTIqA4yp1FV7yENJZzmjDLblbDqlf6/R+dbIvRfszSvK0+PKK/sMt/tO8tj8P+tmNwigBVC0FSDdUi1s2oD6dkh5TozVK42/Nd1MFK/vXkkIRyEAwPtD9t4lZnw2PhCOFyjWoh7eDD7KEvZGGEqt6dgvxT9biF8ZBnWrxiSxTmnyxAfbtIcyJQHBYwKnVCXzUkw05zdkHxKZK/llY6KPljDZmbrhh1OwGBl5xf1yA5Me//u4mYfEGiFWCMjjcLBDEKtjpNXBs3C71qo+c2CaKrLs0wCo7EvqF5PP3c0UGts5OPMn3rxW30qTOAC5Gbism6QcgvVbF7+TmnqAcnXW1WX0gzMgj1a0R0Q/xie7RP+bet5HIWoCp4Yuv4X0743mV2ZFu9HApNqNDckVs5cT5NLe/SKMNFXH3+JM3bZrvKDAqC4U7GYRsLOxxRkjTKfVuOK/GMkq+cIkpJ98yTZ8dVw7gyztidoCg==","ttl":300,"tag":1100},"id":1702032355089624,"jsonrpc":"2.0"} > > > [JsonRpcProvider] Payload has ID 1702032355089624 > > [JsonRpcProvider] Awaiting request result > > [TestUnity-engine] Got back 1702032355067968 as request pending id > > [WebSocketConnection-d21f7ba2-4468-4636-a3ca-de75f0e65422] Got payload: > {"id":1702032355089624,"jsonrpc":"2.0","result":true} > > [JsonRpcProvider] Got payload {"id":1702032355089624,"jsonrpc":"2.0","result":true} > [JsonRpcProvider] Payload has ID 1702032355089624 > > Triggering event for ID 1702032355089624 > > [Linker] OnPublisherPublishedMessage. Topic: d9dec936a2f0de84a81f32998ec10e8c65fcfaf666f31fc41608d07f964bb083. Topics in counter: 0 > > [Linker] Opening URL metamask://wc?uri=wc%3Ad9dec936a2f0de84a81f32998ec10e8c65fcfaf666f31fc41608d07f964bb083%402%3FsymKey%3D04d518440403f191ec092fee7ba2d15bec0a6a7332860b6f5338d482d5085542%26relay-protocol%3Dirn > > -> applicationWillResignActive() > -> applicationDidEnterBackground() > WARNING -> applicationDidReceiveMemoryWarning() > -> applicationWillEnterForeground() > -> applicationDidBecomeActive() > > [WebSocketConnection-d21f7ba2-4468-4636-a3ca-de75f0e65422] Got payload: > {"id":435720284528385,"jsonrpc":"2.0","method":"irn_subscription","params":{"id":"8f4d4f7b50db01f65c5ca9cdfa7dcd7aedb9aa2920f739e7789526ee1d79785d","data":{"topic":"d9dec936a2f0de84a81f32998ec10e8c65fcfaf666f31fc41608d07f964bb083","message":"AOE4wBoDmpLkjhXeDBMnnmPjpAz+sPjroCE+542dRamD4k7ENlAJo3X9m23e6ISdfhB6D1DKOqtzLu7kY7WDzdZLJU/9m/fxpgIZuOY26v75r+aGii2CSeDw0DSTYcgmZZPjd0ePW1egm13M6c6O2jbvWBN2U/LtAhpPONA=","publishedAt":1702032361438,"tag":1101}}} > > [JsonRpcProvider] Got payload {"id":435720284528385,"jsonrpc":"2.0","method":"irn_subscription","params":{"id":"8f4d4f7b50db01f65c5ca9cdfa7dcd7aedb9aa2920f739e7789526ee1d79785d","data":{"topic":"d9dec936a2f0de84a81f32998ec10e8c65fcfaf666f31fc41608d07f964bb083","message":"AOE4wBoDmpLkjhXeDBMnnmPjpAz+sPjroCE+542dRamD4k7ENlAJo3X9m23e6ISdfhB6D1DKOqtzLu7kY7WDzdZLJU/9m/fxpgIZuOY26v75r+aGii2CSeDw0DSTYcgmZZPjd0ePW1egm13M6c6O2jbvWBN2U/LtAhpPONA=","publishedAt":1702032361438,"tag":1101}}} > > [JsonRpcProvider] Payload has ID 435720284528385 > > [TestUnity-engine] Got session propose response with id 1702032355067968 > > [TestUnity-engine] response was error > > [TestUnity-engine] Got session_connect event for rpc response > > [TestUnity-engine] Got session_connect error User disapproved requested notification types

Native iOS project works fine

skibitsky commented 9 months ago

Have you modified any scripts provided with the sample?

PavelMo4alov commented 9 months ago

No, I did not modify any sources. I have resolved the issue and now MetaMask works fine 🎉 It is necessary to fill more than only Application Id and Name in WalletConnectProjectConfig.

Solution I got values from swift sample and use it.

Also I found very good docs, it also contains Unity section.

Please add information to docs about necessary filling params, because bot only Id and Name are required.

Screenshot 2023-12-08 at 20 49 10

Thank you very much, your solution for Unity is very good, and I am very happy to share my issues for better product quality 😉

skibitsky commented 9 months ago

Hello,

Sorry for the delay. I have confirmed with the team, and indeed, the documentation wasn't accurate. All Metadata fields, except for Redirect, are required for full compatibility.

I have opened a PR to update the documentation.

Thank you for your cooperation 🙏