multichain-address-validator 0.0.1

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.
Files changed (131) hide show
  1. package/.editorconfig +10 -0
  2. package/.travis.yml +11 -0
  3. package/.vscode/launch.json +23 -0
  4. package/LICENSE +21 -0
  5. package/README.md +87 -0
  6. package/config/esbuild.inject.js +1 -0
  7. package/config/esbuild.ts +14 -0
  8. package/dist/chain-validators.d.ts +2 -0
  9. package/dist/chain-validators.js +98 -0
  10. package/dist/crypto/base32.d.ts +5 -0
  11. package/dist/crypto/base32.js +64 -0
  12. package/dist/crypto/base58.d.ts +4 -0
  13. package/dist/crypto/base58.js +42 -0
  14. package/dist/crypto/bech32.d.ts +17 -0
  15. package/dist/crypto/bech32.js +124 -0
  16. package/dist/crypto/biginteger.d.ts +57 -0
  17. package/dist/crypto/biginteger.js +1311 -0
  18. package/dist/crypto/blake256.d.ts +22 -0
  19. package/dist/crypto/blake256.js +169 -0
  20. package/dist/crypto/blake2b.d.ts +13 -0
  21. package/dist/crypto/blake2b.js +242 -0
  22. package/dist/crypto/cnBase58.d.ts +7 -0
  23. package/dist/crypto/cnBase58.js +209 -0
  24. package/dist/crypto/segwit_addr.d.ts +12 -0
  25. package/dist/crypto/segwit_addr.js +102 -0
  26. package/dist/crypto/utils.d.ts +26 -0
  27. package/dist/crypto/utils.js +123 -0
  28. package/dist/helpers.d.ts +2 -0
  29. package/dist/helpers.js +5 -0
  30. package/dist/multichain-address-validator.bundle.min.js +17 -0
  31. package/dist/multichain-address-validator.d.ts +2 -0
  32. package/dist/multichain-address-validator.js +8 -0
  33. package/dist/types.d.ts +15 -0
  34. package/dist/types.js +5 -0
  35. package/dist/validators/algorand_validator.d.ts +5 -0
  36. package/dist/validators/algorand_validator.js +23 -0
  37. package/dist/validators/base58_validator.d.ts +4 -0
  38. package/dist/validators/base58_validator.js +31 -0
  39. package/dist/validators/bch_validator.d.ts +13 -0
  40. package/dist/validators/bch_validator.js +50 -0
  41. package/dist/validators/bip173_validator.d.ts +7 -0
  42. package/dist/validators/bip173_validator.js +12 -0
  43. package/dist/validators/bitcoin_validator.d.ts +12 -0
  44. package/dist/validators/bitcoin_validator.js +68 -0
  45. package/dist/validators/cardano_validator.d.ts +5 -0
  46. package/dist/validators/cardano_validator.js +41 -0
  47. package/dist/validators/eos_validator.d.ts +5 -0
  48. package/dist/validators/eos_validator.js +10 -0
  49. package/dist/validators/ethereum_validator.d.ts +6 -0
  50. package/dist/validators/ethereum_validator.js +30 -0
  51. package/dist/validators/index.d.ts +16 -0
  52. package/dist/validators/index.js +16 -0
  53. package/dist/validators/monero_validator.d.ts +5 -0
  54. package/dist/validators/monero_validator.js +58 -0
  55. package/dist/validators/nano_validator.d.ts +6 -0
  56. package/dist/validators/nano_validator.js +23 -0
  57. package/dist/validators/nem_validator.d.ts +5 -0
  58. package/dist/validators/nem_validator.js +14 -0
  59. package/dist/validators/polkadot_validator.d.ts +5 -0
  60. package/dist/validators/polkadot_validator.js +49 -0
  61. package/dist/validators/ripple_validator.d.ts +10 -0
  62. package/dist/validators/ripple_validator.js +26 -0
  63. package/dist/validators/sia_validator.d.ts +5 -0
  64. package/dist/validators/sia_validator.js +27 -0
  65. package/dist/validators/solana_validator.d.ts +5 -0
  66. package/dist/validators/solana_validator.js +10 -0
  67. package/dist/validators/tezos_validator.d.ts +5 -0
  68. package/dist/validators/tezos_validator.js +30 -0
  69. package/dist/validators/tron_validator.d.ts +8 -0
  70. package/dist/validators/tron_validator.js +45 -0
  71. package/dist/validators/xlm_validator.d.ts +6 -0
  72. package/dist/validators/xlm_validator.js +32 -0
  73. package/index.html +12 -0
  74. package/package.json +353 -0
  75. package/src/chain-validators.ts +131 -0
  76. package/src/crypto/base32.ts +66 -0
  77. package/src/crypto/base58.ts +46 -0
  78. package/src/crypto/bech32.js +132 -0
  79. package/src/crypto/biginteger.js +1426 -0
  80. package/src/crypto/blake256.js +186 -0
  81. package/src/crypto/blake2b.js +276 -0
  82. package/src/crypto/cnBase58.js +226 -0
  83. package/src/crypto/segwit_addr.js +112 -0
  84. package/src/crypto/utils.ts +133 -0
  85. package/src/helpers.ts +7 -0
  86. package/src/multichain-address-validator.ts +11 -0
  87. package/src/types.ts +18 -0
  88. package/src/validators/algorand_validator.ts +28 -0
  89. package/src/validators/base58_validator.ts +32 -0
  90. package/src/validators/bch_validator.ts +66 -0
  91. package/src/validators/bip173_validator.ts +19 -0
  92. package/src/validators/bitcoin_validator.ts +94 -0
  93. package/src/validators/cardano_validator.ts +50 -0
  94. package/src/validators/eos_validator.ts +13 -0
  95. package/src/validators/ethereum_validator.ts +37 -0
  96. package/src/validators/index.ts +16 -0
  97. package/src/validators/monero_validator.ts +72 -0
  98. package/src/validators/nano_validator.ts +32 -0
  99. package/src/validators/nem_validator.ts +18 -0
  100. package/src/validators/polkadot_validator.ts +57 -0
  101. package/src/validators/ripple_validator.ts +36 -0
  102. package/src/validators/sia_validator.ts +33 -0
  103. package/src/validators/solana_validator.ts +12 -0
  104. package/src/validators/tezos_validator.ts +36 -0
  105. package/src/validators/tron_validator.ts +59 -0
  106. package/src/validators/xlm_validator.ts +42 -0
  107. package/test/addresses/addresses.ts +45 -0
  108. package/test/addresses/algorand.json +6 -0
  109. package/test/addresses/bch-testnet.json +4 -0
  110. package/test/addresses/bch.json +12 -0
  111. package/test/addresses/btc-testnet.json +6 -0
  112. package/test/addresses/btc.json +14 -0
  113. package/test/addresses/cardano.json +8 -0
  114. package/test/addresses/doge.json +7 -0
  115. package/test/addresses/eos.json +6 -0
  116. package/test/addresses/evm.json +21 -0
  117. package/test/addresses/invalid.json +15 -0
  118. package/test/addresses/ltc-testnet.json +7 -0
  119. package/test/addresses/ltc.json +9 -0
  120. package/test/addresses/monero.json +7 -0
  121. package/test/addresses/nano.json +12 -0
  122. package/test/addresses/nem.json +4 -0
  123. package/test/addresses/polkadot.json +8 -0
  124. package/test/addresses/ripple.json +11 -0
  125. package/test/addresses/sia.json +6 -0
  126. package/test/addresses/solana.json +8 -0
  127. package/test/addresses/tezos.json +9 -0
  128. package/test/addresses/tron.json +6 -0
  129. package/test/addresses/xlm.json +12 -0
  130. package/test/multichain-address-validator.test.ts +1589 -0
  131. package/tsconfig.json +23 -0
@@ -0,0 +1,30 @@
1
+ import base58 from '../crypto/base58.js';
2
+ import cryptoUtils from '../crypto/utils.js';
3
+ import { getAddress } from '../helpers.js';
4
+ const prefix = new Uint8Array([6, 161, 159]);
5
+ function decodeRaw(buffer) {
6
+ let payload = buffer.slice(0, -4);
7
+ let checksum = buffer.slice(-4);
8
+ let newChecksum = cryptoUtils.hexStr2byteArray(cryptoUtils.sha256x2(cryptoUtils.byteArray2hexStr(payload)));
9
+ if (checksum[0] ^ newChecksum[0] |
10
+ checksum[1] ^ newChecksum[1] |
11
+ checksum[2] ^ newChecksum[2] |
12
+ checksum[3] ^ newChecksum[3])
13
+ return;
14
+ return payload;
15
+ }
16
+ export default {
17
+ isValidAddress(address) {
18
+ try {
19
+ let buffer = base58.decode(getAddress(address));
20
+ let payload = decodeRaw(buffer);
21
+ if (!payload)
22
+ return false;
23
+ payload.slice(prefix.length);
24
+ return true;
25
+ }
26
+ catch (e) {
27
+ return false;
28
+ }
29
+ }
30
+ };
@@ -0,0 +1,8 @@
1
+ import { Address } from '../types.js';
2
+ interface TronValidatorOpts {
3
+ addressTypes: string[];
4
+ }
5
+ declare const _default: (opts?: TronValidatorOpts) => {
6
+ isValidAddress: (address: Address) => boolean;
7
+ };
8
+ export default _default;
@@ -0,0 +1,45 @@
1
+ import cryptoUtils from '../crypto/utils.js';
2
+ import { getAddress } from '../helpers.js';
3
+ function decodeBase58Address(base58String) {
4
+ if (typeof (base58String) !== 'string') {
5
+ return false;
6
+ }
7
+ if (base58String.length !== 34) {
8
+ return false;
9
+ }
10
+ let address;
11
+ try {
12
+ address = cryptoUtils.base58(base58String);
13
+ }
14
+ catch (e) {
15
+ return false;
16
+ }
17
+ const len = address.length;
18
+ const offset = len - 4;
19
+ const checkSum = address.slice(offset);
20
+ address = address.slice(0, offset);
21
+ const hash0 = cryptoUtils.sha256(cryptoUtils.byteArray2hexStr(address));
22
+ const hash1 = cryptoUtils.hexStr2byteArray(cryptoUtils.sha256(hash0));
23
+ const checkSum1 = hash1.slice(0, 4);
24
+ if (checkSum[0] === checkSum1[0] && checkSum[1] === checkSum1[1] && checkSum[2]
25
+ === checkSum1[2] && checkSum[3] === checkSum1[3]) {
26
+ return address;
27
+ }
28
+ return false;
29
+ }
30
+ const DefaultTronValidatorOpts = {
31
+ addressTypes: ['65']
32
+ };
33
+ export default (opts) => ({
34
+ isValidAddress: function (address) {
35
+ const _opts = { ...DefaultTronValidatorOpts, ...opts };
36
+ const addr = decodeBase58Address(getAddress(address));
37
+ if (!addr) {
38
+ return false;
39
+ }
40
+ if (addr.length !== 21) {
41
+ return false;
42
+ }
43
+ return _opts.addressTypes.includes(addr[0].toString());
44
+ }
45
+ });
@@ -0,0 +1,6 @@
1
+ import { Address } from '../types.js';
2
+ declare const _default: {
3
+ isValidAddress(address: Address): any;
4
+ verifyChecksum: (address: string) => boolean;
5
+ };
6
+ export default _default;
@@ -0,0 +1,32 @@
1
+ import baseX from 'base-x';
2
+ import crc from 'crc';
3
+ import cryptoUtils from '../crypto/utils.js';
4
+ import { getAddress } from '../helpers.js';
5
+ const ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
6
+ const base32 = baseX(ALPHABET);
7
+ const regexp = new RegExp('^[' + ALPHABET + ']{56}$');
8
+ const ed25519PublicKeyVersionByte = (6 << 3);
9
+ function swap16(number) {
10
+ const lower = number & 0xFF;
11
+ const upper = (number >> 8) & 0xFF;
12
+ return (lower << 8) | upper;
13
+ }
14
+ export default {
15
+ isValidAddress(address) {
16
+ const addr = getAddress(address);
17
+ if (regexp.test(addr)) {
18
+ return this.verifyChecksum(addr);
19
+ }
20
+ return false;
21
+ },
22
+ verifyChecksum: function (address) {
23
+ // based on https://github.com/stellar/js-stellar-base/blob/master/src/strkey.js#L126
24
+ var bytes = base32.decode(address);
25
+ if (bytes[0] !== ed25519PublicKeyVersionByte) {
26
+ return false;
27
+ }
28
+ const computedChecksum = cryptoUtils.numberToHex(swap16(crc.crc16xmodem(bytes.slice(0, -2))), 4);
29
+ const checksum = cryptoUtils.toHex(bytes.slice(-2));
30
+ return computedChecksum === checksum;
31
+ }
32
+ };
package/index.html ADDED
@@ -0,0 +1,12 @@
1
+ <html>
2
+ <body>
3
+ <script src="./dist/multichain-address-validator.bundle.min.js"></script>
4
+ <script type="module">
5
+ const valid = MCAV.validate('1KFzzGtDdnq5hrwxXGjwVnKzRbvf8WVxck', 'BTC');
6
+ if (valid)
7
+ console.log('This is a valid address');
8
+ else
9
+ console.log('Address INVALID');
10
+ </script>
11
+ </body>
12
+ </html>
package/package.json ADDED
@@ -0,0 +1,353 @@
1
+ {
2
+ "name": "multichain-address-validator",
3
+ "description": "Multichain address validator for Bitcoin and other blockchains.",
4
+ "keywords": [
5
+ "0x",
6
+ "zrx",
7
+ "Aave Coin",
8
+ "aave",
9
+ "Algorand",
10
+ "algo",
11
+ "Apecoin",
12
+ "ape",
13
+ "API3",
14
+ "api3",
15
+ "Aragon",
16
+ "ant",
17
+ "Arbitrum",
18
+ "arb",
19
+ "Augur",
20
+ "rep",
21
+ "AugurV2",
22
+ "repv2",
23
+ "AuroraCoin",
24
+ "aur",
25
+ "Avalanche",
26
+ "avax",
27
+ "Axie Infinity",
28
+ "axs",
29
+ "Bancor",
30
+ "bnt",
31
+ "Band Protocol",
32
+ "band",
33
+ "Bankex",
34
+ "bkx",
35
+ "Basic Attention Token",
36
+ "bat",
37
+ "BeaverCoin",
38
+ "bvc",
39
+ "Biconomy",
40
+ "bico",
41
+ "Binance",
42
+ "bnb",
43
+ "BioCoin",
44
+ "bio",
45
+ "Bitcoin",
46
+ "btc",
47
+ "Bitcoin SV",
48
+ "bsv",
49
+ "BitcoinCash",
50
+ "bch",
51
+ "BitcoinGold",
52
+ "btg",
53
+ "BitcoinPrivate",
54
+ "btcp",
55
+ "BitcoinZ",
56
+ "btcz",
57
+ "BlockTrade",
58
+ "btt",
59
+ "Blur",
60
+ "blur",
61
+ "Bonk",
62
+ "bonk",
63
+ "BTU Protocol",
64
+ "btu",
65
+ "Callisto",
66
+ "clo",
67
+ "Cardano",
68
+ "ada",
69
+ "Celo",
70
+ "celo",
71
+ "Chainlink",
72
+ "link",
73
+ "Chiliz",
74
+ "chz",
75
+ "Civic",
76
+ "cvc",
77
+ "Compound",
78
+ "comp",
79
+ "Cred",
80
+ "lba",
81
+ "Crypto.com Coin",
82
+ "cro",
83
+ "Curve DAO",
84
+ "crv",
85
+ "CUSD",
86
+ "cusd",
87
+ "Dash",
88
+ "dash",
89
+ "Decentraland",
90
+ "mana",
91
+ "Decred",
92
+ "dcr",
93
+ "DigiByte",
94
+ "dgb",
95
+ "District0x",
96
+ "dnt",
97
+ "DogeCoin",
98
+ "doge",
99
+ "Enjin Coin",
100
+ "enj",
101
+ "EOS",
102
+ "eos",
103
+ "Ethereum",
104
+ "eth",
105
+ "Ethereum Name Service",
106
+ "ens",
107
+ "EthereumClassic",
108
+ "etc",
109
+ "EthereumPow",
110
+ "ethw",
111
+ "EtherZero",
112
+ "etz",
113
+ "Expanse",
114
+ "exp",
115
+ "Fetch.ai",
116
+ "fet",
117
+ "FirmaChain",
118
+ "fct",
119
+ "Flare",
120
+ "flr",
121
+ "FreiCoin",
122
+ "frc",
123
+ "GameCredits",
124
+ "game",
125
+ "GarliCoin",
126
+ "grlc",
127
+ "Gnosis",
128
+ "gno",
129
+ "Golem",
130
+ "glm",
131
+ "Golem (GNT)",
132
+ "gnt",
133
+ "Hashflow",
134
+ "hft",
135
+ "HedgeTrade",
136
+ "hedg",
137
+ "Hush",
138
+ "hush",
139
+ "HyperSpace",
140
+ "xsc",
141
+ "iExec RLC",
142
+ "rlc",
143
+ "Illuvium",
144
+ "ilv",
145
+ "Immutable",
146
+ "imx",
147
+ "Injective",
148
+ "inj",
149
+ "Komodo",
150
+ "kmd",
151
+ "LBRY Credits",
152
+ "lbc",
153
+ "Lido DAO Token",
154
+ "ldo",
155
+ "LiteCoin",
156
+ "ltc",
157
+ "loki",
158
+ "loki",
159
+ "Loom Network",
160
+ "loom",
161
+ "Magic",
162
+ "magic",
163
+ "Maker",
164
+ "mkr",
165
+ "Marlin",
166
+ "pond",
167
+ "Mask Network",
168
+ "mask",
169
+ "Matchpool",
170
+ "gup",
171
+ "Matic",
172
+ "matic",
173
+ "MegaCoin",
174
+ "mec",
175
+ "Melon",
176
+ "mln",
177
+ "Metal",
178
+ "mtl",
179
+ "Monero",
180
+ "xmr",
181
+ "Multi-collateral DAI",
182
+ "dai",
183
+ "NameCoin",
184
+ "nmc",
185
+ "Nano",
186
+ "nano",
187
+ "Nem",
188
+ "xem",
189
+ "Neo",
190
+ "neo",
191
+ "NeoGas",
192
+ "gas",
193
+ "Numeraire",
194
+ "nmr",
195
+ "Ocean Protocol",
196
+ "ocean",
197
+ "Odyssey",
198
+ "ocn",
199
+ "OmiseGO",
200
+ "omg",
201
+ "Onyx Protocol",
202
+ "xcn",
203
+ "Optimism",
204
+ "op",
205
+ "Origin Protocol",
206
+ "ogn",
207
+ "Paxos",
208
+ "pax",
209
+ "PayPal USD",
210
+ "pyusd",
211
+ "PeerCoin",
212
+ "ppc",
213
+ "PIVX",
214
+ "pivx",
215
+ "Polkadot",
216
+ "dot",
217
+ "Polymath",
218
+ "poly",
219
+ "PrimeCoin",
220
+ "xpm",
221
+ "ProtoShares",
222
+ "pts",
223
+ "Qtum",
224
+ "qtum",
225
+ "Quant",
226
+ "qnt",
227
+ "Quantum Resistant Ledger",
228
+ "qrl",
229
+ "RaiBlocks",
230
+ "xrb",
231
+ "Ripio Credit Network",
232
+ "rcn",
233
+ "Ripple",
234
+ "xrp",
235
+ "Salt",
236
+ "salt",
237
+ "Serve",
238
+ "serv",
239
+ "Siacoin",
240
+ "sc",
241
+ "Skale",
242
+ "skl",
243
+ "SnowGem",
244
+ "sng",
245
+ "Solana",
246
+ "sol",
247
+ "SolarCoin",
248
+ "slr",
249
+ "SOLVE",
250
+ "solve",
251
+ "Spendcoin",
252
+ "spnd",
253
+ "Status",
254
+ "snt",
255
+ "Stellar",
256
+ "xlm",
257
+ "Storj",
258
+ "storj",
259
+ "Storm",
260
+ "storm",
261
+ "StormX",
262
+ "stmx",
263
+ "SuperVerse",
264
+ "super",
265
+ "Swarm City",
266
+ "swt",
267
+ "Synthetix Network",
268
+ "snx",
269
+ "Tap",
270
+ "xtp",
271
+ "Tellor",
272
+ "trb",
273
+ "TEMCO",
274
+ "temco",
275
+ "TenX",
276
+ "pay",
277
+ "Tether",
278
+ "usdt",
279
+ "Tezos",
280
+ "xtz",
281
+ "The Graph",
282
+ "grt",
283
+ "The Sandbox",
284
+ "sand",
285
+ "Tron",
286
+ "trx",
287
+ "TrueUSD",
288
+ "tusd",
289
+ "Unifi Protocol DAO",
290
+ "unfi",
291
+ "Uniswap Coin",
292
+ "uni",
293
+ "USD Coin",
294
+ "usdc",
295
+ "VeChain",
296
+ "vet",
297
+ "VertCoin",
298
+ "vtc",
299
+ "Viberate",
300
+ "vib",
301
+ "VoteCoin",
302
+ "vot",
303
+ "Vulcan Forged PYR",
304
+ "pyr",
305
+ "Waves",
306
+ "waves",
307
+ "Wings",
308
+ "wings",
309
+ "Yearn.finance",
310
+ "yfi",
311
+ "ZCash",
312
+ "zec",
313
+ "ZClassic",
314
+ "zcl",
315
+ "ZenCash",
316
+ "zen"
317
+ ],
318
+ "version": "0.0.1",
319
+ "author": "Chris <chris.tsim@gmail.com>",
320
+ "homepage": "https://github.com/christsim/multichain-address-validator",
321
+ "license": "MIT",
322
+ "repository": {
323
+ "type": "git",
324
+ "url": "https://github.com/christsim/multichain-address-validator.git"
325
+ },
326
+ "main": "dist/multichain-address-validator.js",
327
+ "type": "module",
328
+ "engines": {
329
+ "node": ">=16.0.0"
330
+ },
331
+ "engineStrict": true,
332
+ "scripts": {
333
+ "build": "tsc",
334
+ "bundle": "tsx config/esbuild.ts",
335
+ "test": "mocha --import=tsx test/**.test.ts",
336
+ "start": "npm run build && npm run bundle && npm test"
337
+ },
338
+ "dependencies": {
339
+ "@noble/hashes": "^1.4.0",
340
+ "base-x": "^4.0.0",
341
+ "buffer": "^6.0.3",
342
+ "cbor-js": "^0.1.0",
343
+ "crc": "^4.3.2",
344
+ "lodash.isequal": "^4.5.0"
345
+ },
346
+ "devDependencies": {
347
+ "chai": "^4.4.1",
348
+ "esbuild": "^0.23.0",
349
+ "mocha": "^10.2.0",
350
+ "tsx": "^4.16.2",
351
+ "typescript": "^5.5.4"
352
+ }
353
+ }
@@ -0,0 +1,131 @@
1
+ import {Chain, NetworkType, Validator} from './types.js'
2
+
3
+ import {
4
+ AlgorandValidator,
5
+ BCHValidator,
6
+ BTCValidator,
7
+ CardanoValidator,
8
+ EOSValidator,
9
+ ETHValidator,
10
+ MoneroValidator,
11
+ NanoValidator,
12
+ NemValidator,
13
+ PolkadotValidator,
14
+ RippleValidator,
15
+ SiaValidator,
16
+ SolanaValidator,
17
+ TezosValidator,
18
+ TronValidator,
19
+ XLMValidator,
20
+ } from './validators/index.js'
21
+
22
+
23
+ type ChainValidators = Record<string, {
24
+ alternatives?: string[],
25
+ validator: Validator | {
26
+ mainnet: Validator,
27
+ testnet: Validator,
28
+ },
29
+ }>
30
+
31
+ const chainValidators: ChainValidators = {
32
+ algorand: {validator: AlgorandValidator},
33
+ bitcoin: {
34
+ alternatives: ['btc', 'omni'],
35
+ validator: {
36
+ mainnet: BTCValidator({
37
+ addressTypes: ['00', '05'],
38
+ bech32Hrp: ['bc'],
39
+ }),
40
+ testnet: BTCValidator({
41
+ addressTypes: ['6f', 'c4', '3c', '26'],
42
+ bech32Hrp: ['tb'],
43
+ }),
44
+ },
45
+ },
46
+ 'bitcoincash': {
47
+ alternatives: ['bch', 'bitcoin-cash', 'bitcoin cash'],
48
+ validator: {
49
+ mainnet: BCHValidator({
50
+ addressTypes: ['00', '05'],
51
+ bech32Hrp: ['bc'],
52
+ networkType: NetworkType.MainNet,
53
+ }),
54
+ testnet: BCHValidator({
55
+ addressTypes: ['6f', 'c4', '3c', '26'],
56
+ bech32Hrp: ['tb'],
57
+ networkType: NetworkType.TestNet,
58
+ }),
59
+ }
60
+ },
61
+ cardano: {
62
+ alternatives: ['ada'],
63
+ validator: CardanoValidator,
64
+ },
65
+ doge: {
66
+ alternatives: ['dogecoin'],
67
+ validator: {
68
+ mainnet: BTCValidator({addressTypes: ['1e', '16']}),
69
+ testnet: BTCValidator({addressTypes: ['71', 'c4']}),
70
+ }
71
+ },
72
+ eos: {validator: EOSValidator},
73
+ ethereum: {
74
+ alternatives: ['eth', 'erc20', 'flare', 'avalanche', 'avalanche-c', 'bsc', 'bnb', 'binance'],
75
+ validator: ETHValidator
76
+ },
77
+ litecoin: {
78
+ alternatives: ['ltc'],
79
+ validator: {
80
+ mainnet: BTCValidator({
81
+ addressTypes: ['30', '05', '32'],
82
+ bech32Hrp: ['ltc'],
83
+ }),
84
+ testnet: BTCValidator({
85
+ addressTypes: ['6f', 'c4', '3a'],
86
+ bech32Hrp: ['tltc']
87
+ })
88
+ }
89
+ },
90
+ monero: {
91
+ validator: {
92
+ mainnet: MoneroValidator(NetworkType.MainNet),
93
+ testnet: MoneroValidator(NetworkType.TestNet),
94
+ }
95
+ },
96
+ nem: {validator: NemValidator},
97
+ nano: {validator: NanoValidator},
98
+ polkadot: {validator: PolkadotValidator},
99
+ ripple: {
100
+ alternatives: ['xrp'],
101
+ validator: RippleValidator,
102
+ },
103
+ sia: {validator: SiaValidator},
104
+ solana: {
105
+ alternatives: ['spl'],
106
+ validator: SolanaValidator,
107
+ },
108
+ tron: {
109
+ alternatives: ['trc20'],
110
+ validator: TronValidator(),
111
+ },
112
+ tezos: {validator: TezosValidator},
113
+ xlm: {
114
+ alternatives: ['stellar'],
115
+ validator: XLMValidator,
116
+ },
117
+ }
118
+
119
+ export function getValidatorForChain(chain: Chain): Validator | undefined {
120
+ const chainName = (chain as any).chain || chain
121
+ const networkType = (chain as any).networkType || NetworkType.MainNet
122
+
123
+ const key = Object.keys(chainValidators).find(key =>
124
+ key.toUpperCase() === chainName.toUpperCase() || chainValidators[key]
125
+ ?.alternatives
126
+ ?.map(alternative => alternative.toUpperCase())
127
+ ?.includes(chainName.toUpperCase())
128
+ )
129
+
130
+ return chainValidators[key]?.validator[networkType] || chainValidators[key]?.validator
131
+ }
@@ -0,0 +1,66 @@
1
+ const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
2
+
3
+ /**
4
+ * Encode a string to base32
5
+ */
6
+ const b32encode = function(s: string) {
7
+ const parts = [];
8
+ let quanta = Math.floor((s.length / 5));
9
+ const leftover = s.length % 5;
10
+
11
+ if (leftover != 0) {
12
+ for (let i = 0; i < (5 - leftover); i++) {
13
+ s += '\x00';
14
+ }
15
+ quanta += 1;
16
+ }
17
+
18
+ for (let i = 0; i < quanta; i++) {
19
+ parts.push(alphabet.charAt(s.charCodeAt(i * 5) >> 3));
20
+ parts.push(alphabet.charAt(((s.charCodeAt(i * 5) & 0x07) << 2) | (s.charCodeAt(i * 5 + 1) >> 6)));
21
+ parts.push(alphabet.charAt(((s.charCodeAt(i * 5 + 1) & 0x3F) >> 1)));
22
+ parts.push(alphabet.charAt(((s.charCodeAt(i * 5 + 1) & 0x01) << 4) | (s.charCodeAt(i * 5 + 2) >> 4)));
23
+ parts.push(alphabet.charAt(((s.charCodeAt(i * 5 + 2) & 0x0F) << 1) | (s.charCodeAt(i * 5 + 3) >> 7)));
24
+ parts.push(alphabet.charAt(((s.charCodeAt(i * 5 + 3) & 0x7F) >> 2)));
25
+ parts.push(alphabet.charAt(((s.charCodeAt(i * 5 + 3) & 0x03) << 3) | (s.charCodeAt(i * 5 + 4) >> 5)));
26
+ parts.push(alphabet.charAt(((s.charCodeAt(i * 5 + 4) & 0x1F))));
27
+ }
28
+
29
+ let replace = 0;
30
+ if (leftover == 1) replace = 6;
31
+ else if (leftover == 2) replace = 4;
32
+ else if (leftover == 3) replace = 3;
33
+ else if (leftover == 4) replace = 1;
34
+
35
+ for (let i = 0; i < replace; i++) parts.pop();
36
+ for (let i = 0; i < replace; i++) parts.push("=");
37
+
38
+ return parts.join("");
39
+ }
40
+
41
+ /**
42
+ * Decode a base32 string.
43
+ * This is made specifically for our use, deals only with proper strings
44
+ */
45
+ const b32decode = function(s: string) {
46
+ const r = new ArrayBuffer(s.length * 5 / 8);
47
+ const b = new Uint8Array(r);
48
+ for (let j = 0; j < s.length / 8; j++) {
49
+ const v = [0, 0, 0, 0, 0, 0, 0, 0];
50
+ for (let i = 0; i < 8; ++i) {
51
+ v[i] = alphabet.indexOf(s[j * 8 + i]);
52
+ }
53
+ const i = 0;
54
+ b[j * 5 + 0] = (v[i + 0] << 3) | (v[i + 1] >> 2);
55
+ b[j * 5 + 1] = ((v[i + 1] & 0x3) << 6) | (v[i + 2] << 1) | (v[i + 3] >> 4);
56
+ b[j * 5 + 2] = ((v[i + 3] & 0xf) << 4) | (v[i + 4] >> 1);
57
+ b[j * 5 + 3] = ((v[i + 4] & 0x1) << 7) | (v[i + 5] << 2) | (v[i + 6] >> 3);
58
+ b[j * 5 + 4] = ((v[i + 6] & 0x7) << 5) | (v[i + 7]);
59
+ }
60
+ return b;
61
+ }
62
+
63
+ export default {
64
+ b32decode,
65
+ b32encode
66
+ };