multichain-address-validator 0.0.1 → 0.7.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 (43) hide show
  1. package/README.md +1 -1
  2. package/dist/chain-validators.d.ts +1 -1
  3. package/dist/chain-validators.js +20 -2
  4. package/dist/multichain-address-validator.d.ts +2 -1
  5. package/dist/multichain-address-validator.js +3 -3
  6. package/dist/validators/hedera_validator.d.ts +5 -0
  7. package/dist/validators/hedera_validator.js +8 -0
  8. package/dist/validators/index.d.ts +2 -0
  9. package/dist/validators/index.js +2 -0
  10. package/dist/validators/move_validator.d.ts +5 -0
  11. package/dist/validators/move_validator.js +8 -0
  12. package/dist/validators/ripple_validator.js +5 -1
  13. package/dist/validators/xlm_validator.d.ts +2 -1
  14. package/dist/validators/xlm_validator.js +11 -5
  15. package/package-lock.json +1295 -0
  16. package/package.json +4 -6
  17. package/src/chain-validators.ts +23 -2
  18. package/src/multichain-address-validator.ts +6 -4
  19. package/src/validators/hedera_validator.ts +10 -0
  20. package/src/validators/index.ts +2 -0
  21. package/src/validators/move_validator.ts +11 -0
  22. package/src/validators/ripple_validator.ts +6 -2
  23. package/src/validators/xlm_validator.ts +13 -5
  24. package/test/addresses/addresses.ts +10 -0
  25. package/test/addresses/aptos.json +6 -0
  26. package/test/addresses/bch.json +0 -5
  27. package/test/addresses/btc-testnet.json +5 -0
  28. package/test/addresses/btc.json +5 -5
  29. package/test/addresses/doge-testnet.json +3 -0
  30. package/test/addresses/doge.json +0 -1
  31. package/test/addresses/evm.json +0 -1
  32. package/test/addresses/hbar.json +11 -0
  33. package/test/addresses/monero-testnet.json +5 -0
  34. package/test/addresses/ripple.json +4 -0
  35. package/test/addresses/sia.json +0 -1
  36. package/test/addresses/sui.json +6 -0
  37. package/test/addresses/xlm.json +5 -1
  38. package/test/multichain-address-validator.test.ts +28 -1438
  39. package/tsconfig.json +1 -1
  40. package/config/esbuild.inject.js +0 -1
  41. package/config/esbuild.ts +0 -14
  42. package/dist/multichain-address-validator.bundle.min.js +0 -17
  43. package/test/addresses/invalid.json +0 -15
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "multichain-address-validator",
3
3
  "description": "Multichain address validator for Bitcoin and other blockchains.",
4
+ "version": "0.7.1",
4
5
  "keywords": [
5
6
  "0x",
6
7
  "zrx",
@@ -315,8 +316,7 @@
315
316
  "ZenCash",
316
317
  "zen"
317
318
  ],
318
- "version": "0.0.1",
319
- "author": "Chris <chris.tsim@gmail.com>",
319
+ "author": "Chris <28301107+christsim@users.noreply.github.com>",
320
320
  "homepage": "https://github.com/christsim/multichain-address-validator",
321
321
  "license": "MIT",
322
322
  "repository": {
@@ -326,14 +326,13 @@
326
326
  "main": "dist/multichain-address-validator.js",
327
327
  "type": "module",
328
328
  "engines": {
329
- "node": ">=16.0.0"
329
+ "node": ">=18.0.0"
330
330
  },
331
331
  "engineStrict": true,
332
332
  "scripts": {
333
333
  "build": "tsc",
334
- "bundle": "tsx config/esbuild.ts",
335
334
  "test": "mocha --import=tsx test/**.test.ts",
336
- "start": "npm run build && npm run bundle && npm test"
335
+ "start": "npm run build && npm test"
337
336
  },
338
337
  "dependencies": {
339
338
  "@noble/hashes": "^1.4.0",
@@ -345,7 +344,6 @@
345
344
  },
346
345
  "devDependencies": {
347
346
  "chai": "^4.4.1",
348
- "esbuild": "^0.23.0",
349
347
  "mocha": "^10.2.0",
350
348
  "tsx": "^4.16.2",
351
349
  "typescript": "^5.5.4"
@@ -1,4 +1,5 @@
1
- import {Chain, NetworkType, Validator} from './types.js'
1
+ import type {Chain, Validator} from './types.js'
2
+ import { NetworkType } from './types.js'
2
3
 
3
4
  import {
4
5
  AlgorandValidator,
@@ -7,7 +8,9 @@ import {
7
8
  CardanoValidator,
8
9
  EOSValidator,
9
10
  ETHValidator,
11
+ HederaValidator,
10
12
  MoneroValidator,
13
+ MoveValidator,
11
14
  NanoValidator,
12
15
  NemValidator,
13
16
  PolkadotValidator,
@@ -30,6 +33,7 @@ type ChainValidators = Record<string, {
30
33
 
31
34
  const chainValidators: ChainValidators = {
32
35
  algorand: {validator: AlgorandValidator},
36
+ aptos: {validator: MoveValidator},
33
37
  bitcoin: {
34
38
  alternatives: ['btc', 'omni'],
35
39
  validator: {
@@ -71,9 +75,25 @@ const chainValidators: ChainValidators = {
71
75
  },
72
76
  eos: {validator: EOSValidator},
73
77
  ethereum: {
74
- alternatives: ['eth', 'erc20', 'flare', 'avalanche', 'avalanche-c', 'bsc', 'bnb', 'binance'],
78
+ alternatives: [
79
+ 'arbitrum',
80
+ 'avalanche',
81
+ 'avalanche-c',
82
+ 'base',
83
+ 'binance',
84
+ 'bnb',
85
+ 'bsc',
86
+ 'eth',
87
+ 'erc20',
88
+ 'flare',
89
+ 'sonic',
90
+ ],
75
91
  validator: ETHValidator
76
92
  },
93
+ hedera: {
94
+ alternatives: ['hbar'],
95
+ validator: HederaValidator
96
+ },
77
97
  litecoin: {
78
98
  alternatives: ['ltc'],
79
99
  validator: {
@@ -105,6 +125,7 @@ const chainValidators: ChainValidators = {
105
125
  alternatives: ['spl'],
106
126
  validator: SolanaValidator,
107
127
  },
128
+ sui: {validator: MoveValidator},
108
129
  tron: {
109
130
  alternatives: ['trc20'],
110
131
  validator: TronValidator(),
@@ -1,11 +1,13 @@
1
- import {Address, Chain} from './types.js'
1
+ import {Address, Chain, NetworkType} from './types.js'
2
2
  import {getValidatorForChain} from './chain-validators.js'
3
3
 
4
4
  export function validate(address: Address, chain: Chain) {
5
5
  const validator = getValidatorForChain(chain)
6
- if (validator) {
7
- return validator.isValidAddress(address);
6
+ if (!validator) {
7
+ throw new Error(`Missing validator for chain: ${chain}`);
8
8
  }
9
9
 
10
- throw new Error(`Missing validator for chain: ${chain}`);
10
+ return validator.isValidAddress(address);
11
11
  }
12
+
13
+ export type { Address, Chain, NetworkType }
@@ -0,0 +1,10 @@
1
+ import type {Address} from '../types.js'
2
+ import {getAddress} from '../helpers.js'
3
+
4
+ export default {
5
+ isValidAddress(address: Address) {
6
+ // Regex to validate the format "shard.realm.account"
7
+ const regex = /^\d+\.\d+\.\d+$/;
8
+ return regex.test(getAddress(address));
9
+ }
10
+ };
@@ -4,7 +4,9 @@ export {default as BTCValidator} from "./bitcoin_validator.js"
4
4
  export {default as CardanoValidator} from "./cardano_validator.js"
5
5
  export {default as EOSValidator} from "./eos_validator.js"
6
6
  export {default as ETHValidator} from "./ethereum_validator.js"
7
+ export {default as HederaValidator} from "./hedera_validator.js"
7
8
  export {default as MoneroValidator} from "./monero_validator.js"
9
+ export {default as MoveValidator} from "./move_validator.js"
8
10
  export {default as NemValidator} from "./nem_validator.js"
9
11
  export {default as NanoValidator} from "./nano_validator.js"
10
12
  export {default as PolkadotValidator} from "./polkadot_validator.js"
@@ -0,0 +1,11 @@
1
+ import type { Address} from '../types.js'
2
+ import {getAddress} from '../helpers.js'
3
+
4
+ const regexp = new RegExp('^0x[0-9a-fA-F]{64}$');
5
+
6
+ export default {
7
+ isValidAddress(address: Address) {
8
+ const addr = getAddress(address)
9
+ return regexp.test(addr)
10
+ },
11
+ };
@@ -22,8 +22,12 @@ export default {
22
22
  return validAddress && this.verifyMemo(destinationTag)
23
23
  },
24
24
 
25
- verifyMemo(destinationTag: string | null) {
26
- return !destinationTag || /[0-9]+/.test(destinationTag)
25
+ verifyMemo(destinationTag: string | null): boolean {
26
+ if (!destinationTag) return true; // Optional
27
+
28
+ const tagNumber = Number(destinationTag);
29
+ // A destination tag is a 32-bit unsigned integer.
30
+ return /^[0-9]+$/.test(destinationTag) && tagNumber >= 0 && tagNumber <= 4294967295;
27
31
  },
28
32
 
29
33
  verifyChecksum: function (address: string) {
@@ -18,13 +18,21 @@ function swap16(number: number) {
18
18
  }
19
19
 
20
20
  export default {
21
- isValidAddress(address: Address) {
21
+ isValidAddress: function (address: Address) {
22
22
  const addr = getAddress(address)
23
- if (regexp.test(addr)) {
24
- return this.verifyChecksum(addr);
25
- }
23
+ const destinationTag = (address as any).destinationTag
24
+
25
+ const validAddress = regexp.test(addr) && this.verifyChecksum(addr);
26
+
27
+ return validAddress && this.verifyMemo(destinationTag)
28
+ },
29
+
30
+ verifyMemo(memo: string | null): boolean {
31
+ if (!memo) return true; // Optional
26
32
 
27
- return false;
33
+ // Ensure it's a valid UTF-8 string and does not exceed 28 bytes
34
+ const encoder = new TextEncoder();
35
+ return encoder.encode(memo).length <= 28;
28
36
  },
29
37
 
30
38
  verifyChecksum: function (address: string) {
@@ -1,26 +1,32 @@
1
1
  import algorand from './algorand.json'
2
+ import aptos from './aptos.json'
2
3
  import bch from './bch.json'
3
4
  import bchTestnet from './bch-testnet.json'
4
5
  import btc from './btc.json'
5
6
  import btcTestnet from './btc-testnet.json'
6
7
  import cardano from './cardano.json'
7
8
  import doge from './doge.json'
9
+ import dogeTestnet from './doge-testnet.json'
8
10
  import eos from './eos.json'
9
11
  import evm from './evm.json'
12
+ import hbar from './hbar.json'
10
13
  import ltc from './ltc.json'
11
14
  import ltcTestnet from './ltc-testnet.json'
12
15
  import monero from './monero.json'
16
+ import moneroTestnet from './monero-testnet.json'
13
17
  import nem from './nem.json'
14
18
  import nano from './nano.json'
15
19
  import polkadot from './polkadot.json'
16
20
  import ripple from './ripple.json'
17
21
  import sia from './sia.json'
18
22
  import solana from './solana.json'
23
+ import sui from './sui.json'
19
24
  import tezos from './tezos.json'
20
25
  import tron from './tron.json'
21
26
  import xlm from './xlm.json'
22
27
 
23
28
  export default {
29
+ aptos,
24
30
  algorand,
25
31
  bch,
26
32
  'bch-testnet': bchTestnet,
@@ -28,16 +34,20 @@ export default {
28
34
  'btc-testnet': btcTestnet,
29
35
  cardano,
30
36
  doge,
37
+ 'doge-testnet': dogeTestnet,
31
38
  eos,
32
39
  evm,
40
+ hbar,
33
41
  ltc,
34
42
  'ltc-testnet': ltcTestnet,
35
43
  monero,
44
+ 'monero-testnet': moneroTestnet,
36
45
  nem,
37
46
  nano,
38
47
  polkadot,
39
48
  ripple,
40
49
  sia,
50
+ sui,
41
51
  solana,
42
52
  tezos,
43
53
  tron,
@@ -0,0 +1,6 @@
1
+ [
2
+ "0xaabf25b0c115130a4ad88bfa08627c5a103b7851e90869c23fadaf0512dd5133",
3
+ "0xdce6ab89a1d26c99491a70fd4a2536d065925114deee916a1ae7d35007f4dedf",
4
+ "0xd05448f15a03f25b2816c4538b72bd54752ba7522d4831a4c9ea5a613becb47a",
5
+ "0x39f521d22f611a4dec2f790fef2e4f8d1f96550509e85beccf8acec52c1a7219"
6
+ ]
@@ -1,11 +1,6 @@
1
1
  [
2
2
  "12KYrjTdVGjFMtaxERSk3gphreJ5US8aUP",
3
3
  "12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
4
- "12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
5
- "12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
6
- "12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
7
- "12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
8
- "12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
9
4
  "1oNLrsHnBcR6dpaBpwz3LSwutbUNkNSjs",
10
5
  "3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt",
11
6
  "bitcoincash:qq4v32mtagxac29my6gwj6fd4tmqg8rysu23dax807"
@@ -1,6 +1,11 @@
1
1
  [
2
2
  "mzBc4XEFSdzCDcTxAgf6EZXgsZWpztRhef",
3
3
  "GSa5espVLNseXEfKt46zEdS6jrPkmFghBU",
4
+ "mptPo5AvLzJXi4T82vR6g82fT5uJ6HsQCu",
5
+ "mzBc4XEFSdzCDcTxAgf6EZXgsZWpztRhef",
6
+ "2MxKEf2su6FGAUfCEAHreGFQvEYrfYNHvL7",
7
+ "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7",
8
+ "GSa5espVLNseXEfKt46zEdS6jrPkmFghBU",
4
9
  "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7",
5
10
  "tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy"
6
11
  ]
@@ -1,14 +1,14 @@
1
1
  [
2
2
  "12KYrjTdVGjFMtaxERSk3gphreJ5US8aUP",
3
3
  "12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
4
- "12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
5
- "12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
6
- "12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
7
- "12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
8
- "12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y",
9
4
  "15uwigGExiNQxTNr1QSZYPXJMp9Px2YnVU",
10
5
  "3FyVFsEyyBPzHjD3qUEgX7Jsn4tcHNZFkn",
11
6
  "38mKdURe1zcQyrFqRLzR8PRao3iLGEPVsU",
12
7
  "BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4",
8
+ "1oNLrsHnBcR6dpaBpwz3LSwutbUNkNSjs",
9
+ "1HVDCg2KrPBH1Mg5SK9fGjAR9KVqyMMdBC",
10
+ "1SQHtwR5oJRKLfiWQ2APsAd9miUc4k2ez",
11
+ "116CGDLddrZhMrTwhCVJXtXQpxygTT1kHd",
12
+ "3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt",
13
13
  "bc1q2t63ewm3mvh0ztmnmezxm7s0tefknenxlrlwrk"
14
14
  ]
@@ -0,0 +1,3 @@
1
+ [
2
+ "2MxKEf2su6FGAUfCEAHreGFQvEYrfYNHvL7"
3
+ ]
@@ -2,6 +2,5 @@
2
2
  "DPpJVPpvPNP6i6tMj4rTycAGh8wReTqaSU",
3
3
  "DNzLUN6MyYVS5zf4Xc2yK69V3dXs6Mxia5",
4
4
  "DPS6iZj7roHquvwRYXNBua9QtKPzigUUhM",
5
- "DPS6iZj7roHquvwRYXNBua9QtKPzigUUhM",
6
5
  "A7JjzK9k9x5b2MkkQzqt91WZsuu7wTu6iS"
7
6
  ]
@@ -10,7 +10,6 @@
10
10
  "0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359",
11
11
  "0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB",
12
12
  "0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb",
13
-
14
13
  "0xE37c0D48d68da5c5b14E5c1a9f1CFE802776D9FF",
15
14
  "0xa00354276d2fC74ee91e37D085d35748613f4748",
16
15
  "0xAff4d6793F584a473348EbA058deb8caad77a288",
@@ -0,0 +1,11 @@
1
+ [
2
+ "0.0.12345",
3
+ "0.0.987654321",
4
+ "0.1.54321",
5
+ "1.0.123",
6
+ "2.3.45678",
7
+ "0.2.789",
8
+ "0.2.789",
9
+ "0.0.1",
10
+ "10.5.987"
11
+ ]
@@ -0,0 +1,5 @@
1
+ [
2
+ "A2be3UvzMtkJtxRYgcCbQt2y7Rp2eLVGqNTWfZeankrWimSMM4y7uMP6B9oAZaHsXTj8KFSerkSkkVRuEuEca9QM8VhxCNU",
3
+ "9uXRFi4PZMqhsnthBF6bGdfVnBSZtfKkR7Td8qPM7jUKZeTfR1tLhCoTLqYNE12xuiQg3aWGiLw83bWsqwTRLaM4Jk47xYM",
4
+ "9tFTaQM39JXhULZsHauPHhjFrjcGSGXoijEPYoRgAky9Veck2mFp3EifQ2tKHmEHuuUoFfgYRNR2bVaborz5oi8JA8xkqjY"
5
+ ]
@@ -3,6 +3,10 @@
3
3
  "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn",
4
4
  "r3kmLJN5D28dHuH8vZNUZpMC43pEHpaocV",
5
5
  "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
6
+ {
7
+ "address": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
8
+ "destinationTag": 4294967295
9
+ },
6
10
  "rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN",
7
11
  {
8
12
  "address": "rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN",
@@ -1,5 +1,4 @@
1
1
  [
2
- "a9b01c85163638682b170d82de02b8bb99ba86092e9ab1b0d25111284fe618e93456915820f1",
3
2
  "a9b01c85163638682b170d82de02b8bb99ba86092e9ab1b0d25111284fe618e93456915820f1",
4
3
  "ab0c327982abfcc6055a6c9551589167d8a73501aca8769f106371fbc937ad100c955c3b7ba9",
5
4
  "ffe1308c044ade30392a0cdc1fd5a4dbe94f9616a95faf888ed36123d9e711557aa497530373"
@@ -0,0 +1,6 @@
1
+ [
2
+ "0xaabf25b0c115130a4ad88bfa08627c5a103b7851e90869c23fadaf0512dd5133",
3
+ "0xdce6ab89a1d26c99491a70fd4a2536d065925114deee916a1ae7d35007f4dedf",
4
+ "0xd05448f15a03f25b2816c4538b72bd54752ba7522d4831a4c9ea5a613becb47a",
5
+ "0x39f521d22f611a4dec2f790fef2e4f8d1f96550509e85beccf8acec52c1a7219"
6
+ ]
@@ -8,5 +8,9 @@
8
8
  "GAJHORKJKDDEPYCD6URDFODV7CVLJ5AAOJKR6PG2VQOLWFQOF3X7XLOG",
9
9
  "GACXQEAXYBEZLBMQ2XETOBRO4P66FZAJENDHOQRYPUIXZIIXLKMZEXBJ",
10
10
  "GDD3XRXU3G4DXHVRUDH7LJM4CD4PDZTVP4QHOO4Q6DELKXUATR657OZV",
11
- "GDTYVCTAUQVPKEDZIBWEJGKBQHB4UGGXI2SXXUEW7LXMD4B7MK37CWLJ"
11
+ "GDTYVCTAUQVPKEDZIBWEJGKBQHB4UGGXI2SXXUEW7LXMD4B7MK37CWLJ",
12
+ {
13
+ "address": "GDTYVCTAUQVPKEDZIBWEJGKBQHB4UGGXI2SXXUEW7LXMD4B7MK37CWLJ",
14
+ "destinationTag": "3fdsfsdfasdfdsfgasdgfdsfgas"
15
+ }
12
16
  ]