Skip to content

Commit 7900941

Browse files
committed
Thirdweb.Wallets + IThirdwebWallet refactor
1 parent 7597770 commit 7900941

22 files changed

+653
-243
lines changed

Assets/Thirdweb/Core/Scripts/AccountAbstraction/Core/SmartWallet.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,13 @@ public class SmartWallet
3939
public List<string> Accounts { get; internal set; }
4040
public string PersonalAddress { get; internal set; }
4141
public Web3 PersonalWeb3 { get; internal set; }
42-
public WalletProvider PersonalWalletProvider { get; internal set; }
4342
public ThirdwebSDK.SmartWalletConfig Config { get; internal set; }
4443

4544
private bool _initialized;
4645
private bool _deployed;
4746

48-
public SmartWallet(Web3 personalWeb3, WalletProvider personalWalletProvider, ThirdwebSDK.SmartWalletConfig config)
47+
public SmartWallet(Web3 personalWeb3, ThirdwebSDK.SmartWalletConfig config)
4948
{
50-
PersonalWalletProvider = personalWalletProvider;
5149
PersonalWeb3 = personalWeb3;
5250
Config = new ThirdwebSDK.SmartWalletConfig()
5351
{

Assets/Thirdweb/Core/Scripts/AccountAbstraction/Core/UserOpUtils.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@ public static async Task<byte[]> HashAndSignUserOp(this EntryPointContract.UserO
1414
entryPoint,
1515
new EntryPointContract.GetUserOpHashFunction() { UserOp = userOp }
1616
);
17-
if (ThirdwebManager.Instance.SDK.session.SmartWallet.PersonalWalletProvider == WalletProvider.LocalWallet)
17+
18+
var smartWallet = ThirdwebManager.Instance.SDK.session.ActiveWallet;
19+
if (smartWallet.GetSignerProvider() == WalletProvider.LocalWallet)
1820
{
19-
return new EthereumMessageSigner().Sign(userOpHash.ReturnValue1, new EthECKey(ThirdwebManager.Instance.SDK.session.LocalAccount.PrivateKey)).HexStringToByteArray();
21+
var localWallet = smartWallet.GetLocalAccount();
22+
return new EthereumMessageSigner().Sign(userOpHash.ReturnValue1, new EthECKey(localWallet.PrivateKey)).HexStringToByteArray();
2023
}
2124
else
2225
{

Assets/Thirdweb/Core/Scripts/ThirdwebInterceptor.cs

Lines changed: 51 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,57 @@
11
using System;
22
using System.Threading.Tasks;
3-
using MetaMask.Unity;
43
using Nethereum.JsonRpc.Client;
54
using Nethereum.Signer;
6-
using Nethereum.Web3.Accounts;
7-
using Thirdweb.AccountAbstraction;
8-
using WalletConnectSharp.Unity;
5+
using Newtonsoft.Json;
6+
using Thirdweb.Wallets;
97

108
namespace 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

Comments
 (0)