11using System ;
22using System . Threading . Tasks ;
3- using MetaMask . Unity ;
43using Nethereum . JsonRpc . Client ;
54using Nethereum . Signer ;
6- using Nethereum . Web3 . Accounts ;
7- using Thirdweb . AccountAbstraction ;
8- using WalletConnectSharp . Unity ;
5+ using Newtonsoft . Json ;
6+ using Thirdweb . Wallets ;
97
108namespace Thirdweb
119{
1210 public class ThirdwebInterceptor : RequestInterceptor
1311 {
14- private readonly WalletProvider _walletProvider ;
15- private readonly Account _localAccount ;
16- private readonly SmartWallet _smartWallet ;
12+ private readonly IThirdwebWallet _thirdwebWallet ;
1713
18- public ThirdwebInterceptor ( ThirdwebSession thirdwebSession )
14+ public ThirdwebInterceptor ( IThirdwebWallet thirdwebWallet )
1915 {
20- _walletProvider = thirdwebSession . WalletProvider ;
21- _localAccount = thirdwebSession . LocalAccount ;
22- _smartWallet = thirdwebSession . SmartWallet ;
16+ _thirdwebWallet = thirdwebWallet ;
2317 }
2418
2519 public override async Task < object > InterceptSendRequestAsync < T > ( Func < RpcRequest , string , Task < T > > interceptedSendRequestAsync , RpcRequest request , string route = null )
2620 {
21+ UnityEngine . Debug . Log ( $ "{ request . Method } Request Intercepted: { JsonConvert . SerializeObject ( request . RawParameters ) } ") ;
22+
2723 if ( request . Method == "eth_accounts" )
2824 {
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 ( ) )
3133 {
3234 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 ) ) ;
4637 case WalletProvider . SmartWallet :
47- address = _smartWallet . Accounts [ 0 ] ;
48- break ;
38+ return await signerWeb3 . Client . SendRequestAsync < T > ( "personal_sign" , null , request . RawParameters ) ;
4939 default :
50- throw new Exception ( "No Account Connected!" ) ;
40+ break ;
5141 }
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 ) ;
6342 }
6443 else if ( request . Method == "eth_signTypedData_v4" )
6544 {
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 ( ) )
6848 {
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 ;
7055 }
7156 }
7257
@@ -80,49 +65,40 @@ public override async Task<object> InterceptSendRequestAsync<T>(
8065 params object [ ] paramList
8166 )
8267 {
68+ UnityEngine . Debug . Log ( $ "{ method } Request Intercepted: { JsonConvert . SerializeObject ( paramList ) } ") ;
69+
8370 if ( method == "eth_accounts" )
8471 {
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 ( ) )
8780 {
8881 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 ) ) ;
10284 case WalletProvider . SmartWallet :
103- address = _smartWallet . Accounts [ 0 ] ;
104- break ;
85+ return await signerWeb3 . Client . SendRequestAsync < T > ( "personal_sign" , null , paramList ) ;
10586 default :
106- throw new Exception ( "No Account Connected!" ) ;
87+ break ;
10788 }
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 ) ;
11989 }
12090 else if ( method == "eth_signTypedData_v4" )
12191 {
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 ( ) )
12495 {
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 ;
126102 }
127103 }
128104
0 commit comments