Fix regex pattern (#1695)
* fix: regex pattern * fix: extracting regex
Rafael committed
Sep 26, 2024 at 01:49 UTC
e9b5b184283a880d10878994c692583636a1fceb
1 file changed
+60
-55
lib/core/address_validator.dart
+60
-55
@@ -5,6 +5,9 @@ import 'package:cake_wallet/solana/solana.dart';
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
+
11
class AddressValidator extends TextValidator {
12
AddressValidator({required CryptoCurrency type})
13
: super(
@@ -19,21 +22,23 @@ class AddressValidator extends TextValidator {
22
length: getLength(type));
23
24
static String getPattern(CryptoCurrency type) {
25
+ var pattern = "";
26
if (type is Erc20Token) {
23
- return '0x[0-9a-zA-Z]';
27
+ pattern = '0x[0-9a-zA-Z]+';
28
}
29
switch (type) {
30
case CryptoCurrency.xmr:
27
- return '^4[0-9a-zA-Z]{94}\$|^8[0-9a-zA-Z]{94}\$|^[0-9a-zA-Z]{106}\$';
31
+ pattern = '4[0-9a-zA-Z]{94}|8[0-9a-zA-Z]{94}|[0-9a-zA-Z]{106}';
32
case CryptoCurrency.ada:
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}\$';
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}';
35
case CryptoCurrency.btc:
32
- return '^${P2pkhAddress.regex.pattern}\$|^${P2shAddress.regex.pattern}\$|^${P2wpkhAddress.regex.pattern}\$|${P2trAddress.regex.pattern}\$|^${P2wshAddress.regex.pattern}\$|^${SilentPaymentAddress.regex.pattern}\$';
36
+ pattern =
37
+ '${P2pkhAddress.regex.pattern}|${P2shAddress.regex.pattern}|${P2wpkhAddress.regex.pattern}|${P2trAddress.regex.pattern}|${P2wshAddress.regex.pattern}|${SilentPaymentAddress.regex.pattern}';
38
case CryptoCurrency.nano:
34
- return '[0-9a-zA-Z_]';
39
+ pattern = '[0-9a-zA-Z_]+';
40
case CryptoCurrency.banano:
36
- return '[0-9a-zA-Z_]';
41
+ pattern = '[0-9a-zA-Z_]+';
42
case CryptoCurrency.usdc:
43
case CryptoCurrency.usdcpoly:
44
case CryptoCurrency.usdtPoly:
@@ -69,11 +74,11 @@ class AddressValidator extends TextValidator {
74
case CryptoCurrency.dydx:
75
case CryptoCurrency.steth:
76
case CryptoCurrency.shib:
72
- return '0x[0-9a-zA-Z]';
77
+ pattern = '0x[0-9a-zA-Z]+';
78
case CryptoCurrency.xrp:
74
- return '^[0-9a-zA-Z]{34}\$|^X[0-9a-zA-Z]{46}\$';
79
+ pattern = '[0-9a-zA-Z]{34}|X[0-9a-zA-Z]{46}';
80
case CryptoCurrency.xhv:
76
- return '^hvx|hvi|hvs[0-9a-zA-Z]';
81
+ pattern = 'hvx|hvi|hvs[0-9a-zA-Z]+';
82
case CryptoCurrency.xag:
83
case CryptoCurrency.xau:
84
case CryptoCurrency.xaud:
@@ -95,40 +100,43 @@ class AddressValidator extends TextValidator {
100
case CryptoCurrency.dash:
101
case CryptoCurrency.eos:
102
case CryptoCurrency.wow:
98
- return '[0-9a-zA-Z]';
103
+ pattern = '[0-9a-zA-Z]+';
104
case CryptoCurrency.bch:
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}\$';
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}';
107
case CryptoCurrency.bnb:
102
- return '[0-9a-zA-Z]';
108
+ pattern = '[0-9a-zA-Z]+';
109
case CryptoCurrency.ltc:
104
- return '^(?!(ltc|LTC)1)[0-9a-zA-Z]*\$|(^LTC1[A-Z0-9]*\$)|(^ltc1[a-z0-9]*\$)';
110
+ pattern = '((?!(ltc|LTC)1)[0-9a-zA-Z]*)|(LTC1[A-Z0-9]*)|(ltc1[a-z0-9]*)';
111
case CryptoCurrency.hbar:
106
- return '[0-9a-zA-Z.]';
112
+ pattern = '[0-9a-zA-Z.]+';
113
case CryptoCurrency.zaddr:
108
- return '^zs[0-9a-zA-Z]{75}';
114
+ pattern = 'zs[0-9a-zA-Z]{75}';
115
case CryptoCurrency.zec:
110
- return '^t1[0-9a-zA-Z]{33}\$|^t3[0-9a-zA-Z]{33}\$';
116
+ pattern = 't1[0-9a-zA-Z]{33}|t3[0-9a-zA-Z]{33}';
117
case CryptoCurrency.dcr:
112
- return 'D[ksecS]([0-9a-zA-Z])+';
118
+ pattern = 'D[ksecS]([0-9a-zA-Z])+';
119
case CryptoCurrency.rvn:
114
- return '[Rr]([1-9a-km-zA-HJ-NP-Z]){33}';
120
+ pattern = '[Rr]([1-9a-km-zA-HJ-NP-Z]){33}';
121
case CryptoCurrency.near:
116
- return '[0-9a-f]{64}';
122
+ pattern = '[0-9a-f]{64}';
123
case CryptoCurrency.rune:
118
- return 'thor1[0-9a-z]{38}';
124
+ pattern = 'thor1[0-9a-z]{38}';
125
case CryptoCurrency.scrt:
120
- return 'secret1[0-9a-z]{38}';
126
+ pattern = 'secret1[0-9a-z]{38}';
127
case CryptoCurrency.stx:
122
- return 'S[MP][0-9a-zA-Z]+';
128
+ pattern = 'S[MP][0-9a-zA-Z]+';
129
case CryptoCurrency.kmd:
124
- return 'R[0-9a-zA-Z]{33}';
130
+ pattern = 'R[0-9a-zA-Z]{33}';
131
case CryptoCurrency.pivx:
126
- return 'D([1-9a-km-zA-HJ-NP-Z]){33}';
132
+ pattern = 'D([1-9a-km-zA-HJ-NP-Z]){33}';
133
case CryptoCurrency.btcln:
128
- return '^(lnbc|LNBC)([0-9]{1,}[a-zA-Z0-9]+)';
134
+ pattern = '(lnbc|LNBC)([0-9]{1,}[a-zA-Z0-9]+)';
135
default:
130
- return '[0-9a-zA-Z]';
136
+ pattern = '[0-9a-zA-Z]+';
137
}
138
+
139
+ return '$BEFORE_REGEX($pattern)$AFTER_REGEX';
140
}
141
142
static List<int>? getLength(CryptoCurrency type) {
@@ -269,56 +277,53 @@ class AddressValidator extends TextValidator {
277
}
278
279
static String? getAddressFromStringPattern(CryptoCurrency type) {
280
+ String? pattern = null;
281
+
282
switch (type) {
283
case CryptoCurrency.xmr:
284
case CryptoCurrency.wow:
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]|\$)';
285
+ pattern = '(4[0-9a-zA-Z]{94})'
286
+ '|(8[0-9a-zA-Z]{94})'
287
+ '|([0-9a-zA-Z]{106})';
288
case CryptoCurrency.btc:
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
-
289
+ pattern =
290
+ '${P2pkhAddress.regex.pattern}|${P2shAddress.regex.pattern}|${P2wpkhAddress.regex.pattern}|${P2trAddress.regex.pattern}|${P2wshAddress.regex.pattern}|${SilentPaymentAddress.regex.pattern}';
291
case CryptoCurrency.ltc:
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]|\$)';
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})';
295
case CryptoCurrency.eth:
291
- return '0x[0-9a-zA-Z]{42}';
296
case CryptoCurrency.maticpoly:
293
- return '0x[0-9a-zA-Z]{42}';
297
+ pattern = '0x[0-9a-zA-Z]+';
298
case CryptoCurrency.nano:
295
- return 'nano_[0-9a-zA-Z]{60}';
299
+ pattern = 'nano_[0-9a-zA-Z]{60}';
300
case CryptoCurrency.banano:
297
- return 'ban_[0-9a-zA-Z]{60}';
301
+ pattern = 'ban_[0-9a-zA-Z]{60}';
302
case CryptoCurrency.bch:
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
+ pattern = '(bitcoincash:)?q[0-9a-zA-Z]{41,42}';
304
case CryptoCurrency.sol:
304
- return '([^0-9a-zA-Z]|^)[1-9A-HJ-NP-Za-km-z]{43,44}([^0-9a-zA-Z]|\$)';
305
+ pattern = '[1-9A-HJ-NP-Za-km-z]+';
306
case CryptoCurrency.trx:
306
- return '(T|t)[1-9A-HJ-NP-Za-km-z]{33}';
307
+ pattern = '(T|t)[1-9A-HJ-NP-Za-km-z]{33}';
308
default:
309
if (type.tag == CryptoCurrency.eth.title) {
309
- return '0x[0-9a-zA-Z]{42}';
310
+ pattern = '0x[0-9a-zA-Z]{42}';
311
}
312
if (type.tag == CryptoCurrency.maticpoly.tag) {
312
- return '0x[0-9a-zA-Z]{42}';
313
+ pattern = '0x[0-9a-zA-Z]{42}';
314
}
315
if (type.tag == CryptoCurrency.sol.title) {
315
- return '([^0-9a-zA-Z]|^)[1-9A-HJ-NP-Za-km-z]{43,44}([^0-9a-zA-Z]|\$)';
316
+ pattern = '[1-9A-HJ-NP-Za-km-z]{43,44}';
317
}
318
if (type.tag == CryptoCurrency.trx.title) {
318
- return '(T|t)[1-9A-HJ-NP-Za-km-z]{33}';
319
+ pattern = '(T|t)[1-9A-HJ-NP-Za-km-z]{33}';
320
}
321
+ }
322
321
- return null;
323
+ if (pattern != null) {
324
+ return "$BEFORE_REGEX($pattern)$AFTER_REGEX";
325
}
326
+
327
+ return null;
328
}
329
}