|
| 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 | +} |
0 commit comments