@yerofey/cryptowallet-cli 1.2.12 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -23,7 +23,7 @@ $ cw
23
23
  # generate random ERC-like wallet with desired prefix
24
24
  $ cw -p aaa
25
25
 
26
- # generate random BTC wallet (default format: bech32 - bc1...)
26
+ # generate random BTC wallet (default format: bech32 - "bc1q...")
27
27
  $ cw -c BTC
28
28
 
29
29
  # generate random BTC wallet with desired prefix (case sensitive)
@@ -32,10 +32,10 @@ $ cw -c BTC -p ABC
32
32
  # generate random BTC wallet with desired prefix (case insensitive)
33
33
  $ cw -c BTC -P abc
34
34
 
35
- # generate BTC legacy wallet (1...)
35
+ # generate BTC legacy wallet ("1...")
36
36
  $ cw -c BTC -f legacy
37
37
 
38
- # generate BTC segwit wallet (3...)
38
+ # generate BTC segwit wallet ("3...")
39
39
  $ cw -c BTC -f segwit
40
40
 
41
41
  # generate BTC bech32 wallet from mnemonic string
@@ -95,13 +95,15 @@ $ cw -l
95
95
  * `-l` or `--list`: List all supported cryptocurrencies
96
96
  * `-m` or `--mnemonic`: Use a bip39 mnemonic phrase (if is set) to generate wallet, or leave it empty to generate new one
97
97
  * `-n` or `--number`: Specify number of wallets to display (works for HD wallets only, like BTC/LTC/DOGE)
98
- * `-p` or `--prefix`: Specify desired prefix of an wallet address (case sensitive)
99
- * `-P` or `--prefix-ignorecase`: Specify desired prefix of an wallet address (case insensitive)
98
+ * `-p` or `--prefix`: Specify desired prefix of an wallet address (**case-sensitive**)
99
+ * `-P` or `--prefix-ignorecase`: Specify desired prefix of an wallet address (**case-insensitive**)
100
+ * `-s` or `--suffix`: Specify desired suffix of an wallet address (**case-sensitive**)
101
+ * `-S` or `--suffix-ignorecase`: Specify desired suffix of an wallet address (**case-insensitive**)
100
102
  * `-v` or `--version`: Display the version of CW tool
101
103
 
102
104
  ## Highlights
103
- - 24 blockchains supported
104
- - Generate wallet with desired prefix
105
+ - 24+ blockchains supported
106
+ - Generate wallet with desired prefix/suffix
105
107
  - Generate wallet from mnemonic
106
108
  - Generate just a mnemonic
107
109
  - Works fully offline
package/cli.js CHANGED
@@ -14,6 +14,8 @@ program.option('-m, --mnemonic [mnemonic]', 'Generate wallet from mnemonic strin
14
14
  program.option('-n, --number <number>', 'Number of wallets to generate (if supported)');
15
15
  program.option('-p, --prefix <prefix>', 'Desired wallet prefix (case sensitive)');
16
16
  program.option('-P, --prefix-ignorecase <prefix>', 'Desired wallet prefix (case insensitive)');
17
+ program.option('-s, --suffix <suffix>', 'Desired wallet suffix (case sensitive)');
18
+ program.option('-S, --suffix-ignorecase <suffix>', 'Desired wallet suffix (case insensitive)');
17
19
  program.option('-v, --version', 'Display cryptowallet version');
18
20
  program.parse();
19
21
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yerofey/cryptowallet-cli",
3
- "version": "1.2.12",
3
+ "version": "1.3.0",
4
4
  "homepage": "https://github.com/yerofey/cryptowallet-cli",
5
5
  "author": "Yerofey S. <pm@yerofey.dev> (https://github.com/yerofey)",
6
6
  "bin": {
package/src/CW.js CHANGED
@@ -10,7 +10,9 @@ class CW {
10
10
  mnemonic: '',
11
11
  number: 1,
12
12
  prefix: options.prefixIgnorecase || '',
13
- prefixIgnoreCase: options.prefixIgnorecase !== undefined
13
+ prefixIgnoreCase: options.prefixIgnorecase !== undefined,
14
+ suffix: options.suffixIgnorecase || '',
15
+ suffixIgnoreCase: options.suffixIgnorecase !== undefined,
14
16
  }
15
17
 
16
18
  for (const key of Object.keys(defaultValues)) {
package/src/Method.js CHANGED
@@ -53,6 +53,10 @@ class Method {
53
53
  log(`😢 ${chalk.yellow('Sorry, ' + coinFullName + ' does not support prefix yet...')}`);
54
54
  }
55
55
 
56
+ if (cw.options.suffix && !cw.suffixFound) {
57
+ log(`😢 ${chalk.yellow('Sorry, ' + coinFullName + ' does not support suffix yet...')}`);
58
+ }
59
+
56
60
  if (cw.options.mnemonic != '' && cw.wallet.mnemonic == undefined) {
57
61
  log(`😢 ${chalk.yellow('Sorry, ' + coinFullName + ' does not support mnemonic yet...')}`);
58
62
  }
@@ -62,9 +66,19 @@ class Method {
62
66
  return;
63
67
  }
64
68
 
65
- log(`✨ ${chalk.green('Done!')} ${chalk.blueBright('Here is your brand new ' + coinFullName + ' wallet' + (cw.prefixFound ? ' with "' + cw.options.prefix + '" prefix' : '') + ':')}\n`);
66
-
67
- if (cw.wallet.addresses !== undefined) { // multiple addresses wallet
69
+ // prefix, suffix
70
+ if (cw.prefixFound && cw.suffixFound) {
71
+ log(`✨ ${chalk.green('Done!')} ${chalk.blueBright('Here is your brand new ' + coinFullName + ' wallet with "' + cw.options.prefix + '" prefix and "' + cw.options.suffix + '" suffix:')}\n`);
72
+ } else if (cw.prefixFound) {
73
+ log(`✨ ${chalk.green('Done!')} ${chalk.blueBright('Here is your brand new ' + coinFullName + ' wallet with "' + cw.options.prefix + '" prefix:')}\n`);
74
+ } else if (cw.suffixFound) {
75
+ log(`✨ ${chalk.green('Done!')} ${chalk.blueBright('Here is your brand new ' + coinFullName + ' wallet with "' + cw.options.suffix + '" suffix:')}\n`);
76
+ } else {
77
+ log(`✨ ${chalk.green('Done!')} ${chalk.blueBright('Here is your brand new ' + coinFullName + ' wallet:')}\n`);
78
+ }
79
+
80
+ // result
81
+ if (cw.wallet.addresses !== undefined) {
68
82
  if (cw.wallet.privateExtendedKey) {
69
83
  log(`🔐 ${cw.wallet.privateExtendedKey}`);
70
84
  }
@@ -77,9 +91,21 @@ class Method {
77
91
  if (cw.wallet.addresses.length > 1) {
78
92
  log(`🆔 ${item.index}`);
79
93
  }
80
- if (cw.prefixFound && cw.prefixFoundInWallets.includes(item.address)) {
94
+
95
+ if (cw.prefixFound && cw.prefixFoundInWallets.includes(item.address) && cw.suffixFound && cw.suffixFoundInWallets.includes(item.address)) {
96
+ // highlight found prefix
97
+ // log(`👛 ${item.address}`);
98
+ const addressCutPrefixLength = cw.row.startsWith.length + cw.options.prefix.length;
99
+ const addressFirstPart = item.address.slice(cw.row.startsWith.length, addressCutPrefixLength);
100
+ const addressLastPart = item.address.slice(item.address.length - cw.options.suffix.length);
101
+ log(`👛 ${cw.row.startsWith}${chalk.magenta(addressFirstPart)}${item.address.substring(cw.row.startsWith.length + addressFirstPart.length, item.address.length - addressLastPart.length)}${chalk.magenta(addressLastPart)}`);
102
+ } else if (cw.prefixFound && cw.prefixFoundInWallets.includes(item.address)) {
103
+ // highlight found prefix
81
104
  const addressCutLength = cw.row.startsWith.length + cw.options.prefix.length;
82
105
  log(`👛 ${cw.row.startsWith}${chalk.magenta(item.address.slice(cw.row.startsWith.length, addressCutLength))}${item.address.slice(addressCutLength)}`);
106
+ } else if (cw.suffixFound && cw.suffixFoundInWallets.includes(item.address)) {
107
+ // highlight found suffix
108
+ log(`👛 ${item.address.slice(0, item.address.length - cw.options.suffix.length)}${chalk.magenta(item.address.slice(item.address.length - cw.options.suffix.length))}`);
83
109
  } else {
84
110
  log(`👛 ${item.address}`);
85
111
  }
@@ -90,17 +116,6 @@ class Method {
90
116
  log();
91
117
  log(`🗂 wallet address path: ${cw.row.path}'/0'/0/ID`);
92
118
  }
93
- } else { // single address wallet
94
- if (cw.prefixFound) {
95
- const addressCutLength = cw.row.startsWith.length + cw.options.prefix.length;
96
- log(`👛 ${cw.row.startsWith}${chalk.magenta(cw.wallet.address.slice(cw.row.startsWith.length, addressCutLength))}${cw.wallet.address.slice(addressCutLength)}`);
97
- } else {
98
- log(`👛 ${cw.wallet.address}`);
99
- }
100
- log(`🔑 ${cw.wallet.privateKey}`);
101
- if (cw.wallet.mnemonic) {
102
- log(`📄 ${cw.wallet.mnemonic}`);
103
- }
104
119
  }
105
120
 
106
121
  if (cw.row.formats !== undefined || cw.row.network == 'EVM' || cw.row.apps || cw.wallet.tested !== undefined) {
package/src/Wallet.js CHANGED
@@ -11,34 +11,79 @@ class Wallet {
11
11
  const row = cw.row;
12
12
  const options = cw.options;
13
13
 
14
- const prefixBadSymbolsArray = (options.prefix != '' ? options.prefix.split('').filter(char => !RegExp(row.prefixTest, 'g').test(char)) : []);
14
+ const badSymbolsArray = (options.prefix != '' ? options.prefix.split('').filter(char => !RegExp(row.prefixTest, 'g').test(char)) : []);
15
15
  let wallet = {};
16
16
  let prefixFound = false;
17
17
  let prefixFoundInWallets = [];
18
+ let suffixFound = false;
19
+ let suffixFoundInWallets = [];
20
+ let onlyPrefix = false;
21
+ let onlySuffix = false;
22
+ let onlyBoth = false;
18
23
 
19
- if (options.prefix && row.flags.includes('p')) {
20
- if (prefixBadSymbolsArray.length === 0) {
21
- if (options.prefix.length > 1 || 'rareSymbols' in row && RegExp(row.rareSymbols, 'g').test(options.prefix)) {
22
- log(`⏳ Generating wallet with "${options.prefix}" prefix, this might take a while...`);
24
+ const prefixFoundInAddress = (address, isIgnoringCase, prefix, symbol) => (!isIgnoringCase && address.startsWith(symbol + '' + prefix) || isIgnoringCase && (address).toUpperCase().startsWith((symbol + '' + prefix).toUpperCase()));
25
+ const suffixFoundInAddress = (address, isIgnoringCase, suffix) => (!isIgnoringCase && address.endsWith(suffix) || isIgnoringCase && (address).toUpperCase().endsWith(suffix));
26
+
27
+ if (options.prefix && row.flags.includes('p') || options.suffix && row.flags.includes('s')) {
28
+ if (badSymbolsArray.length === 0) {
29
+ if (options.prefix && options.suffix) {
30
+ // prefix & suffix
31
+ log(`⏳ Generating wallet with "${options.prefix}" prefix and "${options.suffix}" suffix, this for sure will take a while...`);
32
+ onlyBoth = true;
33
+ } else {
34
+ // prefix
35
+ if (options.prefix.length > 0 || 'rareSymbols' in row && RegExp(row.rareSymbols, 'g').test(options.prefix)) {
36
+ log(`⏳ Generating wallet with "${options.prefix}" prefix, this might take a while...`);
37
+ onlyPrefix = true;
38
+ }
39
+ // suffix
40
+ if (options.suffix.length > 0 || 'rareSymbols' in row && RegExp(row.rareSymbols, 'g').test(options.suffix)) {
41
+ log(`⏳ Generating wallet with "${options.suffix}" suffix, this might take a while...`);
42
+ onlySuffix = true;
43
+ }
23
44
  }
45
+
24
46
  const startsWithSymbols = row.startsWith.split('|');
25
47
  loop:
26
48
  while (true) {
27
49
  wallet = await this.createWallet();
28
50
  for (let firstSymbol of startsWithSymbols) {
29
- if (wallet.address !== undefined) {
30
- if (!options.prefixIgnoreCase && wallet.address.startsWith(firstSymbol + '' + options.prefix) || options.prefixIgnoreCase && (wallet.address).toUpperCase().startsWith((firstSymbol + '' + options.prefix).toUpperCase())) {
51
+ if (wallet.address !== undefined) { // one address
52
+ if (onlyPrefix && prefixFoundInAddress(wallet.address, options.prefixIgnoreCase, options.prefix, firstSymbol)) {
31
53
  prefixFound = true;
32
54
  break loop;
33
55
  }
34
- } else if (wallet.addresses !== undefined) {
56
+
57
+ if (onlySuffix && suffixFoundInAddress(wallet.address, options.suffixIgnoreCase, options.suffix)) {
58
+ suffixFound = true;
59
+ break loop;
60
+ }
61
+
62
+ if (onlyBoth && prefixFoundInAddress(wallet.address, options.prefixIgnoreCase, options.prefix, firstSymbol) && suffixFoundInAddress(wallet.address, options.suffixIgnoreCase, options.suffix)) {
63
+ prefixFound = true;
64
+ suffixFound = true;
65
+ break loop;
66
+ }
67
+ } else if (wallet.addresses !== undefined) { // multiple addresses
35
68
  for (let item of wallet.addresses) {
36
- if (!options.prefixIgnoreCase && (item.address).startsWith(firstSymbol + '' + options.prefix) || options.prefixIgnoreCase && (item.address).toUpperCase().startsWith((firstSymbol + '' + options.prefix).toUpperCase())) {
69
+ if (onlyPrefix && prefixFoundInAddress(item.address, options.prefixIgnoreCase, options.prefix, firstSymbol)) {
37
70
  prefixFound = true;
38
71
  prefixFoundInWallets.push(item.address);
39
72
  }
73
+
74
+ if (onlySuffix && suffixFoundInAddress(item.address, options.suffixIgnoreCase, options.suffix)) {
75
+ suffixFound = true;
76
+ suffixFoundInWallets.push(item.address);
77
+ }
78
+
79
+ if (onlyBoth && prefixFoundInAddress(item.address, options.prefixIgnoreCase, options.prefix, firstSymbol) && suffixFoundInAddress(item.address, options.suffixIgnoreCase, options.suffix)) {
80
+ prefixFound = true;
81
+ prefixFoundInWallets.push(item.address);
82
+ suffixFound = true;
83
+ suffixFoundInWallets.push(item.address);
84
+ }
40
85
  }
41
- if (prefixFound) {
86
+ if (onlyPrefix && prefixFound || onlySuffix && suffixFound || onlyBoth && prefixFound && suffixFound) {
42
87
  break loop;
43
88
  }
44
89
  } else {
@@ -48,12 +93,13 @@ class Wallet {
48
93
  }
49
94
  }
50
95
  } else {
51
- let prefixBadSymbolsString = '';
52
- for (const symbol of prefixBadSymbolsArray) {
53
- prefixBadSymbolsString += '"' + symbol + '", ';
96
+ let badSymbolsString = '';
97
+ for (const symbol of badSymbolsArray) {
98
+ badSymbolsString += '"' + symbol + '", ';
54
99
  }
55
100
 
56
- log(chalk.red('⛔️ Error: prefix contains non-supported characters (' + prefixBadSymbolsString.substr(0, prefixBadSymbolsString.length - 2) + ')!'));
101
+ // TODO: add prefix/suffix own message log
102
+ log(chalk.red('⛔️ Error: prefix or suffix contains non-supported characters (' + badSymbolsString.substr(0, badSymbolsString.length - 2) + ')!'));
57
103
  process.exit(1);
58
104
  }
59
105
  } else {
@@ -63,7 +109,9 @@ class Wallet {
63
109
  return {
64
110
  wallet,
65
111
  prefixFound,
66
- prefixFoundInWallets
112
+ prefixFoundInWallets,
113
+ suffixFound,
114
+ suffixFoundInWallets,
67
115
  };
68
116
  }
69
117
 
@@ -80,7 +128,7 @@ class Wallet {
80
128
 
81
129
  if (row.length == 0) {
82
130
  return {
83
- error: 'coin not found'
131
+ error: 'coin not found',
84
132
  }
85
133
  }
86
134
 
@@ -92,8 +140,11 @@ class Wallet {
92
140
 
93
141
  result = Object.assign(result, {
94
142
  format,
95
- address: wallet.publicAddress,
96
- privateKey: wallet.privateWif,
143
+ addresses: [{
144
+ index: 0,
145
+ address: wallet.publicAddress,
146
+ privateKey: wallet.privateWif,
147
+ }]
97
148
  });
98
149
  } else if (coin == 'BTC') {
99
150
  const bip39 = require('bip39');
@@ -175,6 +226,7 @@ class Wallet {
175
226
  if (number == 1) {
176
227
  const privateKey = bCrypto.getPrivateKeyFromMnemonic(mnemonic, true, 0);
177
228
  addresses.push({
229
+ index: 0,
178
230
  address: bCrypto.getAddressFromPrivateKey(privateKey, 'bnb'),
179
231
  privateKey
180
232
  });
@@ -202,7 +254,7 @@ class Wallet {
202
254
 
203
255
  if (mnemonicString != '' && !bip39.validateMnemonic(mnemonicString)) {
204
256
  return {
205
- error: 'mnemonic is not valid'
257
+ error: 'mnemonic is not valid',
206
258
  }
207
259
  }
208
260
 
@@ -214,8 +266,9 @@ class Wallet {
214
266
  const account = Account.fromPrivate('0x' + privateKey);
215
267
 
216
268
  addresses.push({
269
+ index: 0,
217
270
  address: account.address,
218
- privateKey
271
+ privateKey,
219
272
  });
220
273
  } else {
221
274
  // TODO: add variable for accountId
@@ -229,7 +282,7 @@ class Wallet {
229
282
  addresses.push({
230
283
  index: walletId,
231
284
  address: walletAddress,
232
- privateKey
285
+ privateKey,
233
286
  });
234
287
  }
235
288
  }
@@ -237,7 +290,7 @@ class Wallet {
237
290
  Object.assign(result, {
238
291
  format: row.format || '',
239
292
  addresses,
240
- mnemonic
293
+ mnemonic,
241
294
  });
242
295
  } else if (coin == 'ONE') {
243
296
  const bip39 = require('bip39');
@@ -256,9 +309,12 @@ class Wallet {
256
309
  const account = wallet.getAccount(publicKey);
257
310
 
258
311
  Object.assign(result, {
259
- address: account.bech32Address,
260
- privateKey: account.privateKey,
261
- mnemonic
312
+ addresses: [{
313
+ index: 0,
314
+ address: account.bech32Address,
315
+ privateKey: account.privateKey,
316
+ }],
317
+ mnemonic,
262
318
  });
263
319
  } else if (coin == 'TRX') {
264
320
  const tronWeb = require('tronweb');
@@ -267,8 +323,11 @@ class Wallet {
267
323
  const wallet = await tronWeb.createAccount();
268
324
 
269
325
  Object.assign(result, {
270
- address: wallet.address.base58,
271
- privateKey: wallet.privateKey
326
+ addresses: [{
327
+ index: 0,
328
+ address: wallet.address.base58,
329
+ privateKey: wallet.privateKey
330
+ }],
272
331
  });
273
332
  } catch (error) {
274
333
  return {
@@ -280,8 +339,11 @@ class Wallet {
280
339
  const wallet = tezos.generateKeysNoSeed();
281
340
 
282
341
  Object.assign(result, {
283
- address: wallet.pkh,
284
- privateKey: wallet.sk
342
+ addresses: [{
343
+ index: 0,
344
+ address: wallet.pkh,
345
+ privateKey: wallet.sk,
346
+ }],
285
347
  });
286
348
  } else {
287
349
  return {
@@ -291,7 +353,7 @@ class Wallet {
291
353
 
292
354
  if (row.tested !== undefined && row.tested == false) {
293
355
  Object.assign(result, {
294
- tested: false
356
+ tested: false,
295
357
  });
296
358
  }
297
359
 
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }
@@ -15,7 +15,8 @@
15
15
  "f",
16
16
  "m",
17
17
  "n",
18
- "p"
18
+ "p",
19
+ "s"
19
20
  ]
20
21
  },
21
22
  "BEP20": {
@@ -32,7 +33,8 @@
32
33
  "f",
33
34
  "m",
34
35
  "n",
35
- "p"
36
+ "p",
37
+ "s"
36
38
  ]
37
39
  },
38
40
  "ERC20": {
@@ -49,7 +51,8 @@
49
51
  "f",
50
52
  "m",
51
53
  "n",
52
- "p"
54
+ "p",
55
+ "s"
53
56
  ]
54
57
  }
55
58
  }
@@ -17,7 +17,8 @@
17
17
  "g",
18
18
  "m",
19
19
  "n",
20
- "p"
20
+ "p",
21
+ "s"
21
22
  ]
22
23
  },
23
24
  "legacy": {
@@ -32,7 +33,8 @@
32
33
  "g",
33
34
  "m",
34
35
  "n",
35
- "p"
36
+ "p",
37
+ "s"
36
38
  ]
37
39
  },
38
40
  "segwit": {
@@ -47,7 +49,8 @@
47
49
  "g",
48
50
  "m",
49
51
  "n",
50
- "p"
52
+ "p",
53
+ "s"
51
54
  ]
52
55
  }
53
56
  }
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }
@@ -14,7 +14,8 @@
14
14
  "g",
15
15
  "m",
16
16
  "n",
17
- "p"
17
+ "p",
18
+ "s"
18
19
  ]
19
20
  },
20
21
  "legacy": {
@@ -29,7 +30,8 @@
29
30
  "g",
30
31
  "m",
31
32
  "n",
32
- "p"
33
+ "p",
34
+ "s"
33
35
  ]
34
36
  },
35
37
  "segwit": {
@@ -44,7 +46,8 @@
44
46
  "g",
45
47
  "m",
46
48
  "n",
47
- "p"
49
+ "p",
50
+ "s"
48
51
  ]
49
52
  }
50
53
  }
@@ -11,6 +11,7 @@
11
11
  "flags": [
12
12
  "m",
13
13
  "n",
14
- "p"
14
+ "p",
15
+ "s"
15
16
  ]
16
17
  }
@@ -14,7 +14,8 @@
14
14
  "flags": [
15
15
  "m",
16
16
  "n",
17
- "p"
17
+ "p",
18
+ "s"
18
19
  ]
19
20
  }
20
21
  }
@@ -10,6 +10,7 @@
10
10
  "flags": [
11
11
  "m",
12
12
  "n",
13
- "p"
13
+ "p",
14
+ "s"
14
15
  ]
15
16
  }
@@ -17,7 +17,8 @@
17
17
  "g",
18
18
  "m",
19
19
  "n",
20
- "p"
20
+ "p",
21
+ "s"
21
22
  ]
22
23
  },
23
24
  "legacy": {
@@ -32,7 +33,8 @@
32
33
  "g",
33
34
  "m",
34
35
  "n",
35
- "p"
36
+ "p",
37
+ "s"
36
38
  ]
37
39
  },
38
40
  "segwit": {
@@ -47,7 +49,8 @@
47
49
  "g",
48
50
  "m",
49
51
  "n",
50
- "p"
52
+ "p",
53
+ "s"
51
54
  ]
52
55
  }
53
56
  }
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }
@@ -9,6 +9,7 @@
9
9
  ],
10
10
  "flags": [
11
11
  "m",
12
- "p"
12
+ "p",
13
+ "s"
13
14
  ]
14
15
  }
@@ -10,6 +10,7 @@
10
10
  "flags": [
11
11
  "m",
12
12
  "n",
13
- "p"
13
+ "p",
14
+ "s"
14
15
  ]
15
16
  }
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }
@@ -8,6 +8,7 @@
8
8
  "trustwallet"
9
9
  ],
10
10
  "flags": [
11
- "p"
11
+ "p",
12
+ "s"
12
13
  ]
13
14
  }
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }
@@ -4,6 +4,7 @@
4
4
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
5
5
  "rareSymbols": "[1-9]",
6
6
  "flags": [
7
- "p"
7
+ "p",
8
+ "s"
8
9
  ]
9
10
  }
@@ -5,6 +5,7 @@
5
5
  "prefixTest": "(?![0OI])[1-9a-zA-Z]",
6
6
  "rareSymbols": "[1-9]",
7
7
  "flags": [
8
- "p"
8
+ "p",
9
+ "s"
9
10
  ]
10
11
  }