1
1
using System ;
2
2
using System . Threading . Tasks ;
3
- using MetaMask . Unity ;
4
3
using Nethereum . JsonRpc . Client ;
5
4
using Nethereum . Signer ;
6
- using Nethereum . Web3 . Accounts ;
7
- using Thirdweb . AccountAbstraction ;
8
- using WalletConnectSharp . Unity ;
5
+ using Newtonsoft . Json ;
6
+ using Thirdweb . Wallets ;
9
7
10
8
namespace Thirdweb
11
9
{
12
10
public class ThirdwebInterceptor : RequestInterceptor
13
11
{
14
- private readonly WalletProvider _walletProvider ;
15
- private readonly Account _localAccount ;
16
- private readonly SmartWallet _smartWallet ;
12
+ private readonly IThirdwebWallet _thirdwebWallet ;
17
13
18
- public ThirdwebInterceptor ( ThirdwebSession thirdwebSession )
14
+ public ThirdwebInterceptor ( IThirdwebWallet thirdwebWallet )
19
15
{
20
- _walletProvider = thirdwebSession . WalletProvider ;
21
- _localAccount = thirdwebSession . LocalAccount ;
22
- _smartWallet = thirdwebSession . SmartWallet ;
16
+ _thirdwebWallet = thirdwebWallet ;
23
17
}
24
18
25
19
public override async Task < object > InterceptSendRequestAsync < T > ( Func < RpcRequest , string , Task < T > > interceptedSendRequestAsync , RpcRequest request , string route = null )
26
20
{
21
+ UnityEngine . Debug . Log ( $ "{ request . Method } Request Intercepted: { JsonConvert . SerializeObject ( request . RawParameters ) } ") ;
22
+
27
23
if ( request . Method == "eth_accounts" )
28
24
{
29
- string address = "" ;
30
- switch ( _walletProvider )
25
+ var addy = await _thirdwebWallet . GetAddress ( ) ;
26
+ return new string [ ] { addy } ;
27
+ }
28
+ else if ( request . Method == "personal_sign" )
29
+ {
30
+ var signerWeb3 = await _thirdwebWallet . GetSignerWeb3 ( ) ;
31
+
32
+ switch ( _thirdwebWallet . GetProvider ( ) )
31
33
{
32
34
case WalletProvider . LocalWallet :
33
- if ( _localAccount == null )
34
- throw new Exception ( "No Account Connected!" ) ;
35
- address = _localAccount . Address ;
36
- break ;
37
- case WalletProvider . WalletConnectV1 :
38
- address = WalletConnect . Instance . Session . Accounts [ 0 ] ;
39
- break ;
40
- case WalletProvider . MagicLink :
41
- address = await MagicUnity . Instance . GetAddress ( ) ;
42
- break ;
43
- case WalletProvider . Metamask :
44
- address = MetaMaskUnity . Instance . Wallet . SelectedAddress ;
45
- break ;
35
+ var message = request . RawParameters [ 0 ] . ToString ( ) ;
36
+ return new EthereumMessageSigner ( ) . EncodeUTF8AndSign ( message , new EthECKey ( _thirdwebWallet . GetLocalAccount ( ) . PrivateKey ) ) ;
46
37
case WalletProvider . SmartWallet :
47
- address = _smartWallet . Accounts [ 0 ] ;
48
- break ;
38
+ return await signerWeb3 . Client . SendRequestAsync < T > ( "personal_sign" , null , request . RawParameters ) ;
49
39
default :
50
- throw new Exception ( "No Account Connected!" ) ;
40
+ break ;
51
41
}
52
- return new string [ ] { Nethereum . Util . AddressUtil . Current . ConvertToChecksumAddress ( address ) } ;
53
- }
54
- else if ( request . Method == "personal_sign" )
55
- {
56
- var message = request . RawParameters [ 0 ] . ToString ( ) ;
57
- var address = request . RawParameters [ 1 ] . ToString ( ) ;
58
-
59
- if ( _walletProvider == WalletProvider . LocalWallet )
60
- return new EthereumMessageSigner ( ) . EncodeUTF8AndSign ( message , new EthECKey ( _localAccount . PrivateKey ) ) ;
61
- else if ( _walletProvider == WalletProvider . SmartWallet )
62
- return await _smartWallet . PersonalWeb3 . Client . SendRequestAsync < T > ( "personal_sign" , null , message , address ) ;
63
42
}
64
43
else if ( request . Method == "eth_signTypedData_v4" )
65
44
{
66
- // Should only happen with non Local Wallet personal wallet
67
- if ( _walletProvider == WalletProvider . SmartWallet )
45
+ var signerWeb3 = await _thirdwebWallet . GetSignerWeb3 ( ) ;
46
+
47
+ switch ( _thirdwebWallet . GetProvider ( ) )
68
48
{
69
- return await _smartWallet . PersonalWeb3 . Client . SendRequestAsync < T > ( "eth_signTypedData_v4" , null , request . RawParameters [ 0 ] , request . RawParameters [ 1 ] ) ;
49
+ case WalletProvider . LocalWallet :
50
+ throw new Exception ( "Please use Wallet.SignTypedDataV4 instead when using Local Wallet as the signer." ) ;
51
+ case WalletProvider . SmartWallet :
52
+ return await signerWeb3 . Client . SendRequestAsync < T > ( "eth_signTypedData_v4" , null , request . RawParameters ) ;
53
+ default :
54
+ break ;
70
55
}
71
56
}
72
57
@@ -80,49 +65,40 @@ public override async Task<object> InterceptSendRequestAsync<T>(
80
65
params object [ ] paramList
81
66
)
82
67
{
68
+ UnityEngine . Debug . Log ( $ "{ method } Request Intercepted: { JsonConvert . SerializeObject ( paramList ) } ") ;
69
+
83
70
if ( method == "eth_accounts" )
84
71
{
85
- string address = "" ;
86
- switch ( _walletProvider )
72
+ var addy = await _thirdwebWallet . GetAddress ( ) ;
73
+ return new string [ ] { addy } ;
74
+ }
75
+ else if ( method == "personal_sign" )
76
+ {
77
+ var signerWeb3 = await _thirdwebWallet . GetSignerWeb3 ( ) ;
78
+
79
+ switch ( _thirdwebWallet . GetProvider ( ) )
87
80
{
88
81
case WalletProvider . LocalWallet :
89
- if ( _localAccount == null )
90
- throw new Exception ( "No Account Connected!" ) ;
91
- address = _localAccount . Address ;
92
- break ;
93
- case WalletProvider . WalletConnectV1 :
94
- address = WalletConnect . Instance . Session . Accounts [ 0 ] ;
95
- break ;
96
- case WalletProvider . MagicLink :
97
- address = await MagicUnity . Instance . GetAddress ( ) ;
98
- break ;
99
- case WalletProvider . Metamask :
100
- address = MetaMaskUnity . Instance . Wallet . SelectedAddress ;
101
- break ;
82
+ var message = paramList [ 0 ] . ToString ( ) ;
83
+ return new EthereumMessageSigner ( ) . EncodeUTF8AndSign ( message , new EthECKey ( _thirdwebWallet . GetLocalAccount ( ) . PrivateKey ) ) ;
102
84
case WalletProvider . SmartWallet :
103
- address = _smartWallet . Accounts [ 0 ] ;
104
- break ;
85
+ return await signerWeb3 . Client . SendRequestAsync < T > ( "personal_sign" , null , paramList ) ;
105
86
default :
106
- throw new Exception ( "No Account Connected!" ) ;
87
+ break ;
107
88
}
108
- return new string [ ] { Nethereum . Util . AddressUtil . Current . ConvertToChecksumAddress ( address ) } ;
109
- }
110
- else if ( method == "personal_sign" )
111
- {
112
- var message = paramList [ 0 ] . ToString ( ) ;
113
- var address = paramList [ 1 ] . ToString ( ) ;
114
-
115
- if ( _walletProvider == WalletProvider . LocalWallet )
116
- return new EthereumMessageSigner ( ) . EncodeUTF8AndSign ( message , new EthECKey ( _localAccount . PrivateKey ) ) ;
117
- else if ( _walletProvider == WalletProvider . SmartWallet )
118
- return await _smartWallet . PersonalWeb3 . Client . SendRequestAsync < T > ( "personal_sign" , null , message , address ) ;
119
89
}
120
90
else if ( method == "eth_signTypedData_v4" )
121
91
{
122
- // Should only happen with non Local Wallet personal wallet
123
- if ( _walletProvider == WalletProvider . SmartWallet )
92
+ var signerWeb3 = await _thirdwebWallet . GetSignerWeb3 ( ) ;
93
+
94
+ switch ( _thirdwebWallet . GetProvider ( ) )
124
95
{
125
- return await _smartWallet . PersonalWeb3 . Client . SendRequestAsync < T > ( "eth_signTypedData_v4" , null , paramList [ 0 ] , paramList [ 1 ] ) ;
96
+ case WalletProvider . LocalWallet :
97
+ throw new Exception ( "Please use Wallet.SignTypedDataV4 instead when using Local Wallet as the signer." ) ;
98
+ case WalletProvider . SmartWallet :
99
+ return await signerWeb3 . Client . SendRequestAsync < T > ( "eth_signTypedData_v4" , null , paramList ) ;
100
+ default :
101
+ break ;
126
102
}
127
103
}
128
104
0 commit comments