|
11 | 11 | using Newtonsoft.Json.Linq;
|
12 | 12 | using Nethereum.Hex.HexTypes;
|
13 | 13 | using System.Linq;
|
| 14 | +using Newtonsoft.Json; |
14 | 15 |
|
15 | 16 | namespace Thirdweb
|
16 | 17 | {
|
@@ -510,54 +511,90 @@ public async Task<string> SignTypedDataV4<T, TDomain>(T data, TypedData<TDomain>
|
510 | 511 | if (!await IsConnected())
|
511 | 512 | throw new Exception("No account connected!");
|
512 | 513 |
|
513 |
| - if (ThirdwebManager.Instance.SDK.session.ActiveWallet.GetLocalAccount() != null) |
| 514 | + if (Utils.IsWebGLBuild()) |
514 | 515 | {
|
515 |
| - var signer = new Eip712TypedDataSigner(); |
516 |
| - var key = new EthECKey(ThirdwebManager.Instance.SDK.session.ActiveWallet.GetLocalAccount().PrivateKey); |
517 |
| - return signer.SignTypedDataV4(data, typedData, key); |
| 516 | + var domainType = typedData.Domain.GetType(); |
| 517 | + var domain = new |
| 518 | + { |
| 519 | + name = domainType.GetProperty("Name").GetValue(typedData.Domain).ToString(), |
| 520 | + version = domainType.GetProperty("Version").GetValue(typedData.Domain).ToString(), |
| 521 | + chainId = domainType.GetProperty("ChainId").GetValue(typedData.Domain).ToString(), |
| 522 | + verifyingContract = domainType.GetProperty("VerifyingContract").GetValue(typedData.Domain).ToString() |
| 523 | + }; |
| 524 | + |
| 525 | + var types = new Dictionary<string, object>(); |
| 526 | + foreach (var type in typedData.Types) |
| 527 | + { |
| 528 | + if (type.Key.Contains("EIP712Domain")) |
| 529 | + continue; |
| 530 | + |
| 531 | + types.Add(type.Key, type.Value); |
| 532 | + } |
| 533 | + |
| 534 | + var message = new Dictionary<string, object>(); |
| 535 | + foreach (var member in data.GetType().GetProperties()) |
| 536 | + { |
| 537 | + string n = char.ToLower(member.Name[0]) + member.Name.Substring(1); |
| 538 | + object v = member.GetValue(data); |
| 539 | + // hexify bytes to avoid base64 json serialization, mostly useful for bytes32 uid |
| 540 | + if (member.PropertyType == typeof(byte[])) |
| 541 | + v = Utils.ToBytes32HexString((byte[])v); |
| 542 | + message.Add(n, v); |
| 543 | + } |
| 544 | + var result = await Bridge.InvokeRoute<JToken>(getRoute("signTypedData"), Utils.ToJsonStringArray(domain, types, message)); |
| 545 | + return result["signature"].Value<string>(); |
518 | 546 | }
|
519 | 547 | else
|
520 | 548 | {
|
521 |
| - var json = typedData.ToJson(data); |
522 |
| - var jsonObject = JObject.Parse(json); |
523 |
| - |
524 |
| - var uidToken = jsonObject.SelectToken("$.message.uid"); |
525 |
| - if (uidToken != null) |
| 549 | + if (ThirdwebManager.Instance.SDK.session.ActiveWallet.GetLocalAccount() != null) |
526 | 550 | {
|
527 |
| - var uidBase64 = uidToken.Value<string>(); |
528 |
| - var uidBytes = Convert.FromBase64String(uidBase64); |
529 |
| - var uidHex = uidBytes.ByteArrayToHexString(); |
530 |
| - uidToken.Replace(uidHex); |
| 551 | + var signer = new Eip712TypedDataSigner(); |
| 552 | + var key = new EthECKey(ThirdwebManager.Instance.SDK.session.ActiveWallet.GetLocalAccount().PrivateKey); |
| 553 | + return signer.SignTypedDataV4(data, typedData, key); |
531 | 554 | }
|
532 |
| - |
533 |
| - if (ThirdwebManager.Instance.SDK.session.ActiveWallet.GetProvider() == WalletProvider.SmartWallet) |
| 555 | + else |
534 | 556 | {
|
535 |
| - // Smart accounts |
536 |
| - var hashToken = jsonObject.SelectToken("$.message.message"); |
537 |
| - if (hashToken != null) |
| 557 | + var json = typedData.ToJson(data); |
| 558 | + var jsonObject = JObject.Parse(json); |
| 559 | + |
| 560 | + var uidToken = jsonObject.SelectToken("$.message.uid"); |
| 561 | + if (uidToken != null) |
538 | 562 | {
|
539 |
| - var hashBase64 = hashToken.Value<string>(); |
540 |
| - var hashBytes = Convert.FromBase64String(hashBase64); |
541 |
| - var hashHex = hashBytes.ByteArrayToHexString(); |
542 |
| - hashToken.Replace(hashHex); |
| 563 | + var uidBase64 = uidToken.Value<string>(); |
| 564 | + var uidBytes = Convert.FromBase64String(uidBase64); |
| 565 | + var uidHex = uidBytes.ByteArrayToHexString(); |
| 566 | + uidToken.Replace(uidHex); |
543 | 567 | }
|
544 |
| - } |
545 | 568 |
|
546 |
| - var messageObject = jsonObject.GetValue("message") as JObject; |
547 |
| - foreach (var property in messageObject.Properties()) |
548 |
| - { |
549 |
| - if (property.Value.Type == JTokenType.Array) |
| 569 | + if (ThirdwebManager.Instance.SDK.session.ActiveWallet.GetProvider() == WalletProvider.SmartWallet) |
550 | 570 | {
|
551 |
| - continue; |
| 571 | + // Smart accounts |
| 572 | + var hashToken = jsonObject.SelectToken("$.message.message"); |
| 573 | + if (hashToken != null) |
| 574 | + { |
| 575 | + var hashBase64 = hashToken.Value<string>(); |
| 576 | + var hashBytes = Convert.FromBase64String(hashBase64); |
| 577 | + var hashHex = hashBytes.ByteArrayToHexString(); |
| 578 | + hashToken.Replace(hashHex); |
| 579 | + } |
552 | 580 | }
|
553 |
| - else |
| 581 | + |
| 582 | + var messageObject = jsonObject.GetValue("message") as JObject; |
| 583 | + foreach (var property in messageObject.Properties()) |
554 | 584 | {
|
555 |
| - property.Value = property.Value.ToString(); |
| 585 | + if (property.Value.Type == JTokenType.Array) |
| 586 | + { |
| 587 | + continue; |
| 588 | + } |
| 589 | + else |
| 590 | + { |
| 591 | + property.Value = property.Value.ToString(); |
| 592 | + } |
556 | 593 | }
|
557 |
| - } |
558 | 594 |
|
559 |
| - string safeJson = jsonObject.ToString(); |
560 |
| - return await ThirdwebManager.Instance.SDK.session.Request<string>("eth_signTypedData_v4", await GetSignerAddress(), safeJson); |
| 595 | + string safeJson = jsonObject.ToString(); |
| 596 | + return await ThirdwebManager.Instance.SDK.session.Request<string>("eth_signTypedData_v4", await GetSignerAddress(), safeJson); |
| 597 | + } |
561 | 598 | }
|
562 | 599 | }
|
563 | 600 |
|
|
0 commit comments