Skip to content

Commit 2ff1a05

Browse files
authored
wallet tests (#11)
1 parent 83c9d89 commit 2ff1a05

File tree

4 files changed

+152
-6
lines changed

4 files changed

+152
-6
lines changed

Thirdweb.Tests/Thirdweb.Contracts.Tests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ private async Task<ThirdwebWallet> GetWallet()
124124
var smartAccount = new SmartAccount(client, personalAccount: privateKeyAccount, factoryAddress: "0xbf1C9aA4B1A085f7DA890a44E82B0A1289A40052", gasless: true, chainId: 421614);
125125
await privateKeyAccount.Connect();
126126
await smartAccount.Connect();
127-
Assert.Equal("0x9E5A4528f0f646E5D5bc074DF40bDeA224A6fa3E", await smartAccount.GetAddress());
128127
var wallet = new ThirdwebWallet();
129128
await wallet.Initialize(new List<IThirdwebAccount> { privateKeyAccount, smartAccount });
130129
wallet.SetActive(await smartAccount.GetAddress());
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
using Nethereum.Hex.HexTypes;
2+
using Nethereum.RPC.Eth.DTOs;
3+
4+
namespace Thirdweb.Tests;
5+
6+
public class WalletTests : BaseTests
7+
{
8+
public WalletTests(ITestOutputHelper output)
9+
: base(output) { }
10+
11+
private async Task<ThirdwebWallet> GetWallet()
12+
{
13+
var client = new ThirdwebClient(secretKey: _secretKey);
14+
var privateKeyAccount = new PrivateKeyAccount(client, _testPrivateKey);
15+
var smartAccount = new SmartAccount(client, personalAccount: privateKeyAccount, factoryAddress: "0xbf1C9aA4B1A085f7DA890a44E82B0A1289A40052", gasless: true, chainId: 421614);
16+
await privateKeyAccount.Connect();
17+
await smartAccount.Connect();
18+
var wallet = new ThirdwebWallet();
19+
await wallet.Initialize(new List<IThirdwebAccount> { privateKeyAccount, smartAccount });
20+
wallet.SetActive(await smartAccount.GetAddress());
21+
return wallet;
22+
}
23+
24+
[Fact]
25+
public async Task Initialization_Success()
26+
{
27+
var wallet = await GetWallet();
28+
Assert.NotNull(wallet.ActiveAccount);
29+
Assert.Equal(2, wallet.Accounts.Count);
30+
}
31+
32+
[Fact]
33+
public async Task Initialization_NoAccounts()
34+
{
35+
var wallet = new ThirdwebWallet();
36+
var ex = await Assert.ThrowsAsync<ArgumentException>(async () => await wallet.Initialize(new List<IThirdwebAccount>()));
37+
Assert.Equal("At least one account must be provided.", ex.Message);
38+
}
39+
40+
[Fact]
41+
public async Task Initialization_OneDisconnectedAccount()
42+
{
43+
var client = new ThirdwebClient(secretKey: _secretKey);
44+
var privateKeyAccount = new PrivateKeyAccount(client, _testPrivateKey);
45+
var smartAccount = new SmartAccount(client, personalAccount: privateKeyAccount, factoryAddress: "0xbf1C9aA4B1A085f7DA890a44E82B0A1289A40052", gasless: true, chainId: 421614);
46+
await privateKeyAccount.Connect();
47+
var wallet = new ThirdwebWallet();
48+
var ex = await Assert.ThrowsAsync<InvalidOperationException>(async () => await wallet.Initialize(new List<IThirdwebAccount> { privateKeyAccount, smartAccount }));
49+
Assert.Equal("Account at index 1 is not connected.", ex.Message);
50+
}
51+
52+
[Fact]
53+
public async Task SetActive_Success()
54+
{
55+
var wallet = await GetWallet();
56+
wallet.SetActive(wallet.Accounts.Keys.Last());
57+
Assert.Equal(wallet.Accounts.Keys.Last(), await wallet.GetAddress());
58+
}
59+
60+
[Fact]
61+
public async Task SetActive_NotFound()
62+
{
63+
var wallet = await GetWallet();
64+
var ex = Assert.Throws<ArgumentException>(() => wallet.SetActive(Constants.ADDRESS_ZERO));
65+
Assert.Equal($"Account with address {Constants.ADDRESS_ZERO} not found.", ex.Message);
66+
}
67+
68+
[Fact]
69+
public async Task GetAddress()
70+
{
71+
var wallet = await GetWallet();
72+
Assert.Equal(await wallet.ActiveAccount.GetAddress(), await wallet.GetAddress());
73+
}
74+
75+
[Fact]
76+
public async Task EthSign()
77+
{
78+
var wallet = await GetWallet();
79+
var message = "Hello, world!";
80+
var signature = await wallet.EthSign(message);
81+
Assert.NotNull(signature);
82+
}
83+
84+
[Fact]
85+
public async Task PersonalSign()
86+
{
87+
var wallet = await GetWallet();
88+
var message = "Hello, world!";
89+
var signature = await wallet.PersonalSign(message);
90+
Assert.NotNull(signature);
91+
}
92+
93+
[Fact]
94+
public async Task SignTypedDataV4()
95+
{
96+
var wallet = await GetWallet();
97+
var json =
98+
"{\"types\":{\"EIP712Domain\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\"}],\"Person\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"wallet\",\"type\":\"address\"}],\"Mail\":[{\"name\":\"from\",\"type\":\"Person\"},{\"name\":\"to\",\"type\":\"Person\"},{\"name\":\"contents\",\"type\":\"string\"}]},\"primaryType\":\"Mail\",\"domain\":{\"name\":\"Ether Mail\",\"version\":\"1\",\"chainId\":1,\"verifyingContract\":\"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC\"},\"message\":{\"from\":{\"name\":\"Cow\",\"wallet\":\"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826\"},\"to\":{\"name\":\"Bob\",\"wallet\":\"0xbBbBBBBbbBBBbbbBbbBbbBBbBbbBbBbBbBbbBBbB\"},\"contents\":\"Hello, Bob!\"}}";
99+
var signature = await wallet.SignTypedDataV4(json);
100+
Assert.NotNull(signature);
101+
}
102+
103+
[Fact]
104+
public async Task SignTypedDataV4_Typed()
105+
{
106+
var wallet = await GetWallet();
107+
var typedData = EIP712.GetTypedDefinition_SmartAccount_AccountMessage("Account", "1", 421614, await wallet.GetAddress());
108+
var accountMessage = new AccountAbstraction.AccountMessage { Message = System.Text.Encoding.UTF8.GetBytes("Hello, world!") };
109+
var signature = await wallet.SignTypedDataV4(accountMessage, typedData);
110+
Assert.NotNull(signature);
111+
}
112+
113+
[Fact]
114+
public async Task SignTransaction()
115+
{
116+
var wallet = await GetWallet();
117+
var transaction = new TransactionInput
118+
{
119+
To = await wallet.GetAddress(),
120+
Data = "0x",
121+
Value = new HexBigInteger(0),
122+
Gas = new HexBigInteger(21000),
123+
GasPrice = new HexBigInteger(10000000000),
124+
Nonce = new HexBigInteger(9999999999999),
125+
};
126+
var rpc = ThirdwebRPC.GetRpcInstance(new ThirdwebClient(secretKey: _secretKey), 421614);
127+
var signature = await wallet.SignTransaction(transaction, 421614);
128+
Assert.NotNull(signature);
129+
}
130+
131+
[Fact]
132+
public async Task IsConnected()
133+
{
134+
var wallet = await GetWallet();
135+
Assert.True(await wallet.IsConnected());
136+
foreach (var account in wallet.Accounts.Values)
137+
{
138+
Assert.True(await account.IsConnected());
139+
}
140+
141+
await wallet.DisconnectAll();
142+
Assert.False(await wallet.IsConnected());
143+
foreach (var account in wallet.Accounts.Values)
144+
{
145+
Assert.False(await account.IsConnected());
146+
}
147+
}
148+
}

Thirdweb/Thirdweb.Wallets/SmartAccount/SmartAccount.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ public Task<string> SignTypedDataV4(string json)
342342
public Task<string> SignTypedDataV4<T, TDomain>(T data, TypedData<TDomain> typedData)
343343
where TDomain : IDomain
344344
{
345-
throw new NotImplementedException();
345+
return _personalAccount.SignTypedDataV4(data, typedData);
346346
}
347347

348348
public Task<string> SignTransaction(TransactionInput transaction, BigInteger chainId)
@@ -357,7 +357,8 @@ public Task<bool> IsConnected()
357357

358358
public Task Disconnect()
359359
{
360-
return _personalAccount.Disconnect();
360+
_accountContract = null;
361+
return Task.CompletedTask;
361362
}
362363
}
363364
}

Thirdweb/Thirdweb.Wallets/ThirdwebWallet.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,12 @@ public async Task<bool> IsConnected()
8484
return await ActiveAccount.IsConnected();
8585
}
8686

87-
public async Task Disconnect()
87+
public async Task DisconnectAll()
8888
{
8989
foreach (var account in Accounts.Values)
9090
{
9191
await account.Disconnect();
9292
}
93-
94-
ActiveAccount = null;
9593
}
9694
}
9795
}

0 commit comments

Comments
 (0)