dev
dart 389 lines 15.1 KB
Raw
1 import 'package:cake_wallet/core/universal_address_detector.dart';
2 import 'package:cw_core/crypto_currency.dart';
3 import 'package:cw_core/wallet_type.dart';
4 import 'package:flutter_test/flutter_test.dart';
5
6 void main() {
7 group('UniversalAddressDetector', () {
8 group('Bitcoin Address Detection', () {
9 test('detects Bitcoin P2PKH address', () {
10 const address = '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa';
11 final result = UniversalAddressDetector.detectAddress(address);
12
13 expect(result.isValid, true);
14 expect(result.detectedCurrency, CryptoCurrency.btc);
15 expect(result.detectedWalletType, WalletType.bitcoin);
16 expect(result.address, address);
17 });
18
19 test('detects Bitcoin P2SH address', () {
20 const address = '3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy';
21 final result = UniversalAddressDetector.detectAddress(address);
22
23 expect(result.isValid, true);
24 expect(result.detectedCurrency, CryptoCurrency.btc);
25 expect(result.detectedWalletType, WalletType.bitcoin);
26 expect(result.address, address);
27 });
28
29 test('detects Bitcoin Bech32 address', () {
30 const address = 'bc1q56x5hha4mm35wmnqmj8ajkgxykf9cnjmrv3tmj';
31 final result = UniversalAddressDetector.detectAddress(address);
32
33 expect(result.isValid, true);
34 expect(result.detectedCurrency, CryptoCurrency.btc);
35 expect(result.detectedWalletType, WalletType.bitcoin);
36 expect(result.address, address);
37 });
38
39 test('detects Bitcoin URI with amount', () {
40 const uri = 'bitcoin:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa?amount=0.001';
41 final result = UniversalAddressDetector.detectAddress(uri);
42
43 expect(result.isValid, true);
44 expect(result.detectedCurrency, CryptoCurrency.btc);
45 expect(result.detectedWalletType, WalletType.bitcoin);
46 expect(result.address, '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa');
47 expect(result.amount, '0.001');
48 });
49
50 test('detects Lightning invoice', () {
51 const invoice =
52 'lnbc1u1p3zj7j8pp5vkwxc4vxfzgzxcjzk5ksp0l7jgrgzmqxqmexxp8e8gfqk6s0knnqdlc35hsggzypnxw7xxxnrvd3hscqzpgxqrrsssp5txs5g8vkdmdtnm8g5v9m3u094nnxkl0jjf38jj5xn2pptxlqkwn7gpgfkt7q6z0frcj7vjy4mv7659hccln2e0gzt4ufnsukxcnknh7e58kwnr8pk6kgv6vrghcpld2z5n';
53 final result = UniversalAddressDetector.detectAddress(invoice);
54
55 expect(result.isValid, true);
56 expect(result.detectedCurrency, CryptoCurrency.btcln);
57 expect(result.detectedWalletType, WalletType.bitcoin);
58 expect(result.address, invoice);
59 });
60
61 test('detects Lightning address', () {
62 const address = 'alice@lightning.com';
63 final result = UniversalAddressDetector.detectAddress(address);
64
65 expect(result.isValid, true);
66 expect(result.detectedCurrency, CryptoCurrency.btcln);
67 expect(result.detectedWalletType, WalletType.bitcoin);
68 expect(result.address, address);
69 });
70
71 test('detects LNURL format', () {
72 const address = 'LNURL1DP68GURN8GHJ7UM9WFMXCCRVFH8RHYEE5QDKURZQDF8JUK6RKCE0E';
73 final result = UniversalAddressDetector.detectAddress(address);
74
75 expect(result.isValid, true);
76 expect(result.detectedCurrency, CryptoCurrency.btcln);
77 expect(result.detectedWalletType, WalletType.bitcoin);
78 expect(result.address, address);
79 });
80 });
81
82 group('Monero Address Detection', () {
83 test('detects Monero address', () {
84 const address =
85 '48HHtdQvxyH5jwX5N6fAQD6rxx7EQT7GKZvsixtgJRkRaD8wHqwKp6eGSuStiUN5MHXR19vF3W4Jc7MumryYTTH7LGTfanS';
86 final result = UniversalAddressDetector.detectAddress(address);
87
88 expect(result.isValid, true);
89 expect(result.detectedCurrency, CryptoCurrency.xmr);
90 expect(result.detectedWalletType, WalletType.monero);
91 expect(result.address, address);
92 });
93
94 test('detects Monero integrated address', () {
95 const address =
96 '88HHtdQvxyH5jwX5N6fAQD6rxx7EQT7GKZvsixtgJRkRaD8wHqwKp6eGSuStiUN5MHXR19vF3W4Jc7MumryYTTH7LGTfanS';
97 final result = UniversalAddressDetector.detectAddress(address);
98
99 expect(result.isValid, true);
100 expect(result.detectedCurrency, CryptoCurrency.xmr);
101 expect(result.detectedWalletType, WalletType.monero);
102 expect(result.address, address);
103 });
104 });
105
106 group('Ethereum Address Detection', () {
107 test('detects Ethereum address', () {
108 const address = '0xAE3A8C650CDFad88e87621F8371642bd4B578601';
109 final result = UniversalAddressDetector.detectAddress(address);
110
111 expect(result.isValid, true);
112 expect(result.detectedCurrency, CryptoCurrency.eth);
113 expect(result.detectedWalletType, WalletType.ethereum);
114 expect(result.address, address);
115 });
116
117 test('detects Ethereum URI', () {
118 const uri = 'ethereum:0x742d35Cc6634C0532925a3b8D4C9db96C4b4d8b6?value=1000000000000000000';
119 final result = UniversalAddressDetector.detectAddress(uri);
120
121 expect(result.isValid, true);
122 expect(result.detectedCurrency, CryptoCurrency.eth);
123 expect(result.detectedWalletType, WalletType.ethereum);
124 expect(result.address, '0x742d35Cc6634C0532925a3b8D4C9db96C4b4d8b6');
125 expect(result.amount, '1');
126 });
127 });
128
129 group('Litecoin Address Detection', () {
130 test('detects Litecoin Bech32 address', () {
131 const address = 'ltc1qk4ewr0fjgltsvwymfz7az66q2w73qj0z06cj36';
132 final result = UniversalAddressDetector.detectAddress(address);
133
134 expect(result.isValid, true);
135 expect(result.detectedCurrency, CryptoCurrency.ltc);
136 expect(result.detectedWalletType, WalletType.litecoin);
137 expect(result.address, address);
138 });
139 });
140
141 group('Bitcoin Cash Address Detection', () {
142 test('detects Bitcoin Cash address', () {
143 const address = 'bitcoincash:qqdjjymdpfmqzq69t4vdcxsmrzmlzlwgaucwm878p5';
144 final result = UniversalAddressDetector.detectAddress(address);
145
146 expect(result.isValid, true);
147 expect(result.detectedCurrency, CryptoCurrency.bch);
148 expect(result.detectedWalletType, WalletType.bitcoinCash);
149 expect(result.address, 'qqdjjymdpfmqzq69t4vdcxsmrzmlzlwgaucwm878p5');
150 });
151
152 test('detects Bitcoin Cash address without prefix', () {
153 const address = 'qqdjjymdpfmqzq69t4vdcxsmrzmlzlwgaucwm878p5';
154 final result = UniversalAddressDetector.detectAddress(address);
155
156 expect(result.isValid, true);
157 expect(result.detectedCurrency, CryptoCurrency.bch);
158 expect(result.detectedWalletType, WalletType.bitcoinCash);
159 expect(result.address, address);
160 });
161 });
162
163 group('Nano Address Detection', () {
164 test('detects Nano address', () {
165 const address = 'nano_3gsnr4a3ku3k9hjczobbr5fhhz94c66yczxbpjukeyy3edpxiyp1tqi8angm';
166 final result = UniversalAddressDetector.detectAddress(address);
167
168 expect(result.isValid, true);
169 expect(result.detectedCurrency, CryptoCurrency.nano);
170 expect(result.detectedWalletType, WalletType.nano);
171 expect(result.address, address);
172 });
173 });
174
175 group('Solana Address Detection', () {
176 test('detects Solana address', () {
177 const address = '7TSTXnQZxQDA4JoNqs4DqVqE7oNWk2kmHkMT6DD6vw2S';
178 final result = UniversalAddressDetector.detectAddress(address);
179
180 expect(result.isValid, true);
181 expect(result.detectedCurrency, CryptoCurrency.sol);
182 expect(result.detectedWalletType, WalletType.solana);
183 expect(result.address, address);
184 });
185 });
186
187 group('Tron Address Detection', () {
188 test('detects Tron address', () {
189 const address = 'TF7yQKp7pwLBSXBXthcrXMqTyjtvkJK28V';
190 final result = UniversalAddressDetector.detectAddress(address);
191
192 expect(result.isValid, true);
193 expect(result.detectedCurrency, CryptoCurrency.trx);
194 expect(result.detectedWalletType, WalletType.tron);
195 expect(result.address, address);
196 });
197 });
198
199 group("Zcash Address Detection", () {
200 test("detects Zcash transparent address", () {
201 const address = "t1V9mnyk5Z5cTNMCkLbaDwSskgJZucTLdgW";
202 final result = UniversalAddressDetector.detectAddress(address);
203
204 expect(result.isValid, true);
205 expect(result.detectedCurrency, CryptoCurrency.zec);
206 expect(result.detectedWalletType, WalletType.zcash);
207 expect(result.address, address);
208 });
209
210 test("detects Zcash shielded address", () {
211 const address =
212 "zsab12cd34efab12cd34efab12cd34efab12cd34efab12cd34efab12cd34efab12cd34efgh56kl";
213 final result = UniversalAddressDetector.detectAddress(address);
214
215 expect(result.isValid, true);
216 expect(result.detectedCurrency, CryptoCurrency.zec);
217 expect(result.detectedWalletType, WalletType.zcash);
218 });
219
220 test("detects Zcash unified address", () {
221 const address =
222 "u1z9y8x7w6v5z9y8x7w6v5z9y8x7w6v5z9y8x7w6v5z9y8x7w6v5z9y8x7w6v5z9y8x7w6v5z9y8x7w6v5z9y8x7w6v5z9y8x7w6v5";
223 final result = UniversalAddressDetector.detectAddress(address);
224
225 expect(result.isValid, true);
226 expect(result.detectedCurrency, CryptoCurrency.zec);
227 expect(result.detectedWalletType, WalletType.zcash);
228 });
229 });
230
231 group('Wownero Address Detection', () {
232 test('detects Wownero address', () {
233 const address =
234 'WW3uV9iygJjefkU5bmzeoCFkqZEwg1xC92BKcUFJMcSVF1HQoK4ehDTJScTU28CYvJaZ9sZt5xH8qF1n6vXqXE9G2KMC9JsKh';
235 final result = UniversalAddressDetector.detectAddress(address);
236
237 expect(result.isValid, true);
238 expect(result.detectedCurrency, CryptoCurrency.wow);
239 expect(result.detectedWalletType, WalletType.wownero);
240 expect(result.address, address);
241 });
242 });
243
244 group('Zano Address Detection', () {
245 test('detects Zano address', () {
246 const address =
247 'ZxDREZKHjUAUkRpWrHV9AjJHe12RhtoY9TjUUx2EznNNdwJK9yiHEhuQkqGYnyDXRnFC3Uehu6kLGZmiQab8fWoQ1JrLsuJ1i';
248 final result = UniversalAddressDetector.detectAddress(address);
249
250 expect(result.isValid, true);
251 expect(result.detectedCurrency, CryptoCurrency.zano);
252 expect(result.detectedWalletType, WalletType.zano);
253 expect(result.address, address);
254 });
255
256 test('detects Zano alias', () {
257 const address = '@testuser';
258 final result = UniversalAddressDetector.detectAddress(address);
259
260 expect(result.isValid, true);
261 expect(result.detectedCurrency, CryptoCurrency.zano);
262 expect(result.detectedWalletType, WalletType.zano);
263 expect(result.address, address);
264 });
265 });
266
267 group('Decred Address Detection', () {
268 test('detects Decred address', () {
269 const address = 'DsW4ZtRV1DcPCuKXVVtGnCy3AtAZHg5N8nR';
270 final result = UniversalAddressDetector.detectAddress(address);
271
272 expect(result.isValid, true);
273 expect(result.detectedCurrency, CryptoCurrency.dcr);
274 expect(result.detectedWalletType, WalletType.decred);
275 expect(result.address, address);
276 });
277 });
278
279 group('Invalid Address Detection', () {
280 test('handles empty input', () {
281 const address = '';
282 final result = UniversalAddressDetector.detectAddress(address);
283
284 expect(result.isValid, false);
285 expect(result.errorMessage, 'Empty input provided');
286 });
287
288 test('handles whitespace only', () {
289 const address = ' ';
290 final result = UniversalAddressDetector.detectAddress(address);
291
292 expect(result.isValid, false);
293 expect(result.errorMessage, 'Empty input provided');
294 });
295
296 test('handles random text', () {
297 const address = 'this_is_not_an_address_123';
298 final result = UniversalAddressDetector.detectAddress(address);
299
300 expect(result.isValid, false);
301 expect(result.errorMessage, 'Unable to detect valid cryptocurrency address');
302 });
303 });
304
305 group("EVM chainId URI Detection", () {
306 const recipient = "0x742d35Cc6634C0532925a3b8D4C9db96C4b4d8b6";
307 const contract = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
308
309 test("detects the polygon network from an ERC-681 chainId", () {
310 const uri = "ethereum:$recipient@137?value=1.0e18";
311 final result = UniversalAddressDetector.detectAddress(uri);
312
313 expect(result.isValid, true);
314 expect(result.detectedWalletType, WalletType.polygon);
315 expect(result.chainId, 137);
316 expect(result.address, recipient);
317 expect(result.amount, "1");
318 });
319
320 test("detects the base network from an ERC-681 chainId", () {
321 const uri = "ethereum:$recipient@8453";
322 final result = UniversalAddressDetector.detectAddress(uri);
323
324 expect(result.isValid, true);
325 expect(result.detectedWalletType, WalletType.base);
326 expect(result.chainId, 8453);
327 expect(result.address, recipient);
328 });
329
330 test("extracts the recipient from an ERC-681 token transfer URI", () {
331 const uri = "ethereum:$contract@1/transfer?address=$recipient&uint256=1000000";
332 final result = UniversalAddressDetector.detectAddress(uri);
333
334 expect(result.isValid, true);
335 expect(result.detectedWalletType, WalletType.ethereum);
336 expect(result.chainId, 1);
337 expect(result.address, recipient);
338 });
339
340 test("preserves an unsupported chainId so routing can reject it", () {
341 const uri = "ethereum:$recipient@999999";
342 final result = UniversalAddressDetector.detectAddress(uri);
343
344 expect(result.isValid, true);
345 expect(result.detectedWalletType, WalletType.ethereum);
346 expect(result.chainId, 999999);
347 expect(result.address, recipient);
348 });
349 });
350
351 group("Token URI Detection", () {
352 test("detects a Solana pay URI with an spl-token param", () {
353 const address = "4Nd1mYvNQyJ8BDVXLgkvSGpVdQMZ3hxwVFkfwXNq6Wgk";
354 const uri =
355 "solana:$address?amount=1.5&spl-token=Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB";
356 final result = UniversalAddressDetector.detectAddress(uri);
357
358 expect(result.isValid, true);
359 expect(result.detectedCurrency, CryptoCurrency.sol);
360 expect(result.detectedWalletType, WalletType.solana);
361 expect(result.address, address);
362 expect(result.amount, "1.5");
363 });
364
365 test("detects a Tron URI with a token param", () {
366 const address = "TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL";
367 const uri = "tron:$address?amount=2&token=TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
368 final result = UniversalAddressDetector.detectAddress(uri);
369
370 expect(result.isValid, true);
371 expect(result.detectedCurrency, CryptoCurrency.trx);
372 expect(result.detectedWalletType, WalletType.tron);
373 expect(result.address, address);
374 expect(result.amount, "2");
375 });
376
377 test("detects a bare Solana URI without params", () {
378 const address = "4Nd1mYvNQyJ8BDVXLgkvSGpVdQMZ3hxwVFkfwXNq6Wgk";
379 const uri = "solana:$address";
380 final result = UniversalAddressDetector.detectAddress(uri);
381
382 expect(result.isValid, true);
383 expect(result.detectedWalletType, WalletType.solana);
384 expect(result.address, address);
385 expect(result.amount, "");
386 });
387 });
388 });
389 }