5
import 'package:cw_core/crypto_currency.dart';
6
import 'package:cw_core/erc20_token.dart';
7
8
-const BEFORE_REGEX = '(^|\s)';
9
-const AFTER_REGEX = '(\$|\s)';
10
-
8
class AddressValidator extends TextValidator {
9
AddressValidator({required CryptoCurrency type})
10
: super(
19
length: getLength(type));
20
21
static String getPattern(CryptoCurrency type) {
25
- var pattern = "";
22
if (type is Erc20Token) {
27
- pattern = '0x[0-9a-zA-Z]';
23
+ return '0x[0-9a-zA-Z]';
24
}
25
switch (type) {
26
case CryptoCurrency.xmr:
31
- pattern = '4[0-9a-zA-Z]{94}|8[0-9a-zA-Z]{94}|[0-9a-zA-Z]{106}';
27
+ return '^4[0-9a-zA-Z]{94}\$|^8[0-9a-zA-Z]{94}\$|^[0-9a-zA-Z]{106}\$';
28
case CryptoCurrency.ada:
33
- pattern = '[0-9a-zA-Z]{59}|[0-9a-zA-Z]{92}|[0-9a-zA-Z]{104}'
34
- '|[0-9a-zA-Z]{105}|addr1[0-9a-zA-Z]{98}';
29
+ return '^[0-9a-zA-Z]{59}\$|^[0-9a-zA-Z]{92}\$|^[0-9a-zA-Z]{104}\$'
30
+ '|^[0-9a-zA-Z]{105}\$|^addr1[0-9a-zA-Z]{98}\$';
31
case CryptoCurrency.btc:
36
- pattern =
37
- '${P2pkhAddress.regex.pattern}|${P2shAddress.regex.pattern}|${P2wpkhAddress.regex.pattern}|${P2trAddress.regex.pattern}|${P2wshAddress.regex.pattern}|${SilentPaymentAddress.regex.pattern}';
32
+ return '^${P2pkhAddress.regex.pattern}\$|^${P2shAddress.regex.pattern}\$|^${P2wpkhAddress.regex.pattern}\$|${P2trAddress.regex.pattern}\$|^${P2wshAddress.regex.pattern}\$|^${SilentPaymentAddress.regex.pattern}\$';
33
case CryptoCurrency.nano:
39
- pattern = '[0-9a-zA-Z_]';
34
+ return '[0-9a-zA-Z_]';
35
case CryptoCurrency.banano:
41
- pattern = '[0-9a-zA-Z_]';
36
+ return '[0-9a-zA-Z_]';
37
case CryptoCurrency.usdc:
38
case CryptoCurrency.usdcpoly:
39
case CryptoCurrency.usdtPoly:
69
case CryptoCurrency.dydx:
70
case CryptoCurrency.steth:
71
case CryptoCurrency.shib:
77
- pattern = '0x[0-9a-zA-Z]';
72
+ return '0x[0-9a-zA-Z]';
73
case CryptoCurrency.xrp:
79
- pattern = '[0-9a-zA-Z]{34}|X[0-9a-zA-Z]{46}';
74
+ return '^[0-9a-zA-Z]{34}\$|^X[0-9a-zA-Z]{46}\$';
75
case CryptoCurrency.xhv:
81
- pattern = 'hvx|hvi|hvs[0-9a-zA-Z]';
76
+ return '^hvx|hvi|hvs[0-9a-zA-Z]';
77
case CryptoCurrency.xag:
78
case CryptoCurrency.xau:
79
case CryptoCurrency.xaud:
95
case CryptoCurrency.dash:
96
case CryptoCurrency.eos:
97
case CryptoCurrency.wow:
103
- pattern = '[0-9a-zA-Z]';
98
+ return '[0-9a-zA-Z]';
99
case CryptoCurrency.bch:
105
- pattern =
106
- '(?!bitcoincash:)[0-9a-zA-Z]*|(?!bitcoincash:)q|p[0-9a-zA-Z]{41}|(?!bitcoincash:)q|p[0-9a-zA-Z]{42}|bitcoincash:q|p[0-9a-zA-Z]{41}|bitcoincash:q|p[0-9a-zA-Z]{42}';
100
+ return '^(?!bitcoincash:)[0-9a-zA-Z]*\$|^(?!bitcoincash:)q|p[0-9a-zA-Z]{41}\$|^(?!bitcoincash:)q|p[0-9a-zA-Z]{42}\$|^bitcoincash:q|p[0-9a-zA-Z]{41}\$|^bitcoincash:q|p[0-9a-zA-Z]{42}\$';
101
case CryptoCurrency.bnb:
108
- pattern = '[0-9a-zA-Z]';
102
+ return '[0-9a-zA-Z]';
103
case CryptoCurrency.ltc:
110
- pattern = '(?!(ltc|LTC)1)[0-9a-zA-Z]*|(LTC1[A-Z0-9]*)|(ltc1[a-z0-9]*)';
104
+ return '^(?!(ltc|LTC)1)[0-9a-zA-Z]*\$|(^LTC1[A-Z0-9]*\$)|(^ltc1[a-z0-9]*\$)';
105
case CryptoCurrency.hbar:
112
- pattern = '[0-9a-zA-Z.]';
106
+ return '[0-9a-zA-Z.]';
107
case CryptoCurrency.zaddr:
114
- pattern = 'zs[0-9a-zA-Z]{75}';
108
+ return '^zs[0-9a-zA-Z]{75}';
109
case CryptoCurrency.zec:
116
- pattern = 't1[0-9a-zA-Z]{33}|t3[0-9a-zA-Z]{33}';
110
+ return '^t1[0-9a-zA-Z]{33}\$|^t3[0-9a-zA-Z]{33}\$';
111
case CryptoCurrency.dcr:
118
- pattern = 'D[ksecS]([0-9a-zA-Z])+';
112
+ return 'D[ksecS]([0-9a-zA-Z])+';
113
case CryptoCurrency.rvn:
120
- pattern = '[Rr]([1-9a-km-zA-HJ-NP-Z]){33}';
114
+ return '[Rr]([1-9a-km-zA-HJ-NP-Z]){33}';
115
case CryptoCurrency.near:
122
- pattern = '[0-9a-f]{64}';
116
+ return '[0-9a-f]{64}';
117
case CryptoCurrency.rune:
124
- pattern = 'thor1[0-9a-z]{38}';
118
+ return 'thor1[0-9a-z]{38}';
119
case CryptoCurrency.scrt:
126
- pattern = 'secret1[0-9a-z]{38}';
120
+ return 'secret1[0-9a-z]{38}';
121
case CryptoCurrency.stx:
128
- pattern = 'S[MP][0-9a-zA-Z]+';
122
+ return 'S[MP][0-9a-zA-Z]+';
123
case CryptoCurrency.kmd:
130
- pattern = 'R[0-9a-zA-Z]{33}';
124
+ return 'R[0-9a-zA-Z]{33}';
125
case CryptoCurrency.pivx:
132
- pattern = 'D([1-9a-km-zA-HJ-NP-Z]){33}';
126
+ return 'D([1-9a-km-zA-HJ-NP-Z]){33}';
127
case CryptoCurrency.btcln:
134
- pattern = '(lnbc|LNBC)([0-9]{1,}[a-zA-Z0-9]+)';
128
+ return '^(lnbc|LNBC)([0-9]{1,}[a-zA-Z0-9]+)';
129
default:
136
- pattern = '[0-9a-zA-Z]';
130
+ return '[0-9a-zA-Z]';
131
}
138
-
139
- return '$BEFORE_REGEX$pattern$AFTER_REGEX';
132
}
133
134
static List<int>? getLength(CryptoCurrency type) {
269
}
270
271
static String? getAddressFromStringPattern(CryptoCurrency type) {
280
- String? pattern = null;
281
-
272
switch (type) {
273
case CryptoCurrency.xmr:
274
case CryptoCurrency.wow:
285
- pattern = '4[0-9a-zA-Z]{94}'
286
- '|8[0-9a-zA-Z]{94}'
287
- '|[0-9a-zA-Z]{106}';
275
+ return '([^0-9a-zA-Z]|^)4[0-9a-zA-Z]{94}([^0-9a-zA-Z]|\$)'
276
+ '|([^0-9a-zA-Z]|^)8[0-9a-zA-Z]{94}([^0-9a-zA-Z]|\$)'
277
+ '|([^0-9a-zA-Z]|^)[0-9a-zA-Z]{106}([^0-9a-zA-Z]|\$)';
278
case CryptoCurrency.btc:
289
- pattern =
290
- '${P2pkhAddress.regex.pattern}|${P2shAddress.regex.pattern}|${P2wpkhAddress.regex.pattern}|${P2trAddress.regex.pattern}|${P2wshAddress.regex.pattern}|${SilentPaymentAddress.regex.pattern}';
279
+ return '([^0-9a-zA-Z]|^)([1mn][a-km-zA-HJ-NP-Z1-9]{25,34})([^0-9a-zA-Z]|\$)' //P2pkhAddress type
280
+ '|([^0-9a-zA-Z]|^)([23][a-km-zA-HJ-NP-Z1-9]{25,34})([^0-9a-zA-Z]|\$)' //P2shAddress type
281
+ '|([^0-9a-zA-Z]|^)((bc|tb)1q[ac-hj-np-z02-9]{25,39})([^0-9a-zA-Z]|\$)' //P2wpkhAddress type
282
+ '|([^0-9a-zA-Z]|^)((bc|tb)1q[ac-hj-np-z02-9]{40,80})([^0-9a-zA-Z]|\$)' //P2wshAddress type
283
+ '|([^0-9a-zA-Z]|^)((bc|tb)1p([ac-hj-np-z02-9]{39}|[ac-hj-np-z02-9]{59}|[ac-hj-np-z02-9]{8,89}))([^0-9a-zA-Z]|\$)' //P2trAddress type
284
+ '|${SilentPaymentAddress.regex.pattern}\$';
285
+
286
case CryptoCurrency.ltc:
292
- pattern = '^L[a-zA-Z0-9]{26,33}'
293
- '|[LM][a-km-zA-HJ-NP-Z1-9]{26,33}'
294
- '|ltc[a-zA-Z0-9]{26,45}';
287
+ return '([^0-9a-zA-Z]|^)^L[a-zA-Z0-9]{26,33}([^0-9a-zA-Z]|\$)'
288
+ '|([^0-9a-zA-Z]|^)[LM][a-km-zA-HJ-NP-Z1-9]{26,33}([^0-9a-zA-Z]|\$)'
289
+ '|([^0-9a-zA-Z]|^)ltc[a-zA-Z0-9]{26,45}([^0-9a-zA-Z]|\$)';
290
case CryptoCurrency.eth:
296
- pattern = '0x[0-9a-zA-Z]{42}';
291
+ return '0x[0-9a-zA-Z]{42}';
292
case CryptoCurrency.maticpoly:
298
- pattern = '0x[0-9a-zA-Z]{42}';
293
+ return '0x[0-9a-zA-Z]{42}';
294
case CryptoCurrency.nano:
300
- pattern = 'nano_[0-9a-zA-Z]{60}';
295
+ return 'nano_[0-9a-zA-Z]{60}';
296
case CryptoCurrency.banano:
302
- pattern = 'ban_[0-9a-zA-Z]{60}';
297
+ return 'ban_[0-9a-zA-Z]{60}';
298
case CryptoCurrency.bch:
304
- pattern = '(bitcoincash:)?q[0-9a-zA-Z]{41,42}';
299
+ return 'bitcoincash:q[0-9a-zA-Z]{41}([^0-9a-zA-Z]|\$)'
300
+ '|bitcoincash:q[0-9a-zA-Z]{42}([^0-9a-zA-Z]|\$)'
301
+ '|([^0-9a-zA-Z]|^)q[0-9a-zA-Z]{41}([^0-9a-zA-Z]|\$)'
302
+ '|([^0-9a-zA-Z]|^)q[0-9a-zA-Z]{42}([^0-9a-zA-Z]|\$)';
303
case CryptoCurrency.sol:
306
- pattern = '[1-9A-HJ-NP-Za-km-z]{43,44}';
304
+ return '([^0-9a-zA-Z]|^)[1-9A-HJ-NP-Za-km-z]{43,44}([^0-9a-zA-Z]|\$)';
305
case CryptoCurrency.trx:
308
- pattern = '(T|t)[1-9A-HJ-NP-Za-km-z]{33}';
306
+ return '(T|t)[1-9A-HJ-NP-Za-km-z]{33}';
307
default:
308
if (type.tag == CryptoCurrency.eth.title) {
311
- pattern = '0x[0-9a-zA-Z]{42}';
309
+ return '0x[0-9a-zA-Z]{42}';
310
}
311
if (type.tag == CryptoCurrency.maticpoly.tag) {
314
- pattern = '0x[0-9a-zA-Z]{42}';
312
+ return '0x[0-9a-zA-Z]{42}';
313
}
314
if (type.tag == CryptoCurrency.sol.title) {
317
- pattern = '[1-9A-HJ-NP-Za-km-z]{43,44}';
315
+ return '([^0-9a-zA-Z]|^)[1-9A-HJ-NP-Za-km-z]{43,44}([^0-9a-zA-Z]|\$)';
316
}
317
if (type.tag == CryptoCurrency.trx.title) {
320
- pattern = '(T|t)[1-9A-HJ-NP-Za-km-z]{33}';
318
+ return '(T|t)[1-9A-HJ-NP-Za-km-z]{33}';
319
}
322
- }
320
324
- if (pattern != null) {
325
- return "$BEFORE_REGEX$pattern$AFTER_REGEX";
321
+ return null;
322
}
327
-
328
- return null;
323
}
324
}