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.
- package/.editorconfig +10 -0
- package/.travis.yml +11 -0
- package/.vscode/launch.json +23 -0
- package/LICENSE +21 -0
- package/README.md +87 -0
- package/config/esbuild.inject.js +1 -0
- package/config/esbuild.ts +14 -0
- package/dist/chain-validators.d.ts +2 -0
- package/dist/chain-validators.js +98 -0
- package/dist/crypto/base32.d.ts +5 -0
- package/dist/crypto/base32.js +64 -0
- package/dist/crypto/base58.d.ts +4 -0
- package/dist/crypto/base58.js +42 -0
- package/dist/crypto/bech32.d.ts +17 -0
- package/dist/crypto/bech32.js +124 -0
- package/dist/crypto/biginteger.d.ts +57 -0
- package/dist/crypto/biginteger.js +1311 -0
- package/dist/crypto/blake256.d.ts +22 -0
- package/dist/crypto/blake256.js +169 -0
- package/dist/crypto/blake2b.d.ts +13 -0
- package/dist/crypto/blake2b.js +242 -0
- package/dist/crypto/cnBase58.d.ts +7 -0
- package/dist/crypto/cnBase58.js +209 -0
- package/dist/crypto/segwit_addr.d.ts +12 -0
- package/dist/crypto/segwit_addr.js +102 -0
- package/dist/crypto/utils.d.ts +26 -0
- package/dist/crypto/utils.js +123 -0
- package/dist/helpers.d.ts +2 -0
- package/dist/helpers.js +5 -0
- package/dist/multichain-address-validator.bundle.min.js +17 -0
- package/dist/multichain-address-validator.d.ts +2 -0
- package/dist/multichain-address-validator.js +8 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.js +5 -0
- package/dist/validators/algorand_validator.d.ts +5 -0
- package/dist/validators/algorand_validator.js +23 -0
- package/dist/validators/base58_validator.d.ts +4 -0
- package/dist/validators/base58_validator.js +31 -0
- package/dist/validators/bch_validator.d.ts +13 -0
- package/dist/validators/bch_validator.js +50 -0
- package/dist/validators/bip173_validator.d.ts +7 -0
- package/dist/validators/bip173_validator.js +12 -0
- package/dist/validators/bitcoin_validator.d.ts +12 -0
- package/dist/validators/bitcoin_validator.js +68 -0
- package/dist/validators/cardano_validator.d.ts +5 -0
- package/dist/validators/cardano_validator.js +41 -0
- package/dist/validators/eos_validator.d.ts +5 -0
- package/dist/validators/eos_validator.js +10 -0
- package/dist/validators/ethereum_validator.d.ts +6 -0
- package/dist/validators/ethereum_validator.js +30 -0
- package/dist/validators/index.d.ts +16 -0
- package/dist/validators/index.js +16 -0
- package/dist/validators/monero_validator.d.ts +5 -0
- package/dist/validators/monero_validator.js +58 -0
- package/dist/validators/nano_validator.d.ts +6 -0
- package/dist/validators/nano_validator.js +23 -0
- package/dist/validators/nem_validator.d.ts +5 -0
- package/dist/validators/nem_validator.js +14 -0
- package/dist/validators/polkadot_validator.d.ts +5 -0
- package/dist/validators/polkadot_validator.js +49 -0
- package/dist/validators/ripple_validator.d.ts +10 -0
- package/dist/validators/ripple_validator.js +26 -0
- package/dist/validators/sia_validator.d.ts +5 -0
- package/dist/validators/sia_validator.js +27 -0
- package/dist/validators/solana_validator.d.ts +5 -0
- package/dist/validators/solana_validator.js +10 -0
- package/dist/validators/tezos_validator.d.ts +5 -0
- package/dist/validators/tezos_validator.js +30 -0
- package/dist/validators/tron_validator.d.ts +8 -0
- package/dist/validators/tron_validator.js +45 -0
- package/dist/validators/xlm_validator.d.ts +6 -0
- package/dist/validators/xlm_validator.js +32 -0
- package/index.html +12 -0
- package/package.json +353 -0
- package/src/chain-validators.ts +131 -0
- package/src/crypto/base32.ts +66 -0
- package/src/crypto/base58.ts +46 -0
- package/src/crypto/bech32.js +132 -0
- package/src/crypto/biginteger.js +1426 -0
- package/src/crypto/blake256.js +186 -0
- package/src/crypto/blake2b.js +276 -0
- package/src/crypto/cnBase58.js +226 -0
- package/src/crypto/segwit_addr.js +112 -0
- package/src/crypto/utils.ts +133 -0
- package/src/helpers.ts +7 -0
- package/src/multichain-address-validator.ts +11 -0
- package/src/types.ts +18 -0
- package/src/validators/algorand_validator.ts +28 -0
- package/src/validators/base58_validator.ts +32 -0
- package/src/validators/bch_validator.ts +66 -0
- package/src/validators/bip173_validator.ts +19 -0
- package/src/validators/bitcoin_validator.ts +94 -0
- package/src/validators/cardano_validator.ts +50 -0
- package/src/validators/eos_validator.ts +13 -0
- package/src/validators/ethereum_validator.ts +37 -0
- package/src/validators/index.ts +16 -0
- package/src/validators/monero_validator.ts +72 -0
- package/src/validators/nano_validator.ts +32 -0
- package/src/validators/nem_validator.ts +18 -0
- package/src/validators/polkadot_validator.ts +57 -0
- package/src/validators/ripple_validator.ts +36 -0
- package/src/validators/sia_validator.ts +33 -0
- package/src/validators/solana_validator.ts +12 -0
- package/src/validators/tezos_validator.ts +36 -0
- package/src/validators/tron_validator.ts +59 -0
- package/src/validators/xlm_validator.ts +42 -0
- package/test/addresses/addresses.ts +45 -0
- package/test/addresses/algorand.json +6 -0
- package/test/addresses/bch-testnet.json +4 -0
- package/test/addresses/bch.json +12 -0
- package/test/addresses/btc-testnet.json +6 -0
- package/test/addresses/btc.json +14 -0
- package/test/addresses/cardano.json +8 -0
- package/test/addresses/doge.json +7 -0
- package/test/addresses/eos.json +6 -0
- package/test/addresses/evm.json +21 -0
- package/test/addresses/invalid.json +15 -0
- package/test/addresses/ltc-testnet.json +7 -0
- package/test/addresses/ltc.json +9 -0
- package/test/addresses/monero.json +7 -0
- package/test/addresses/nano.json +12 -0
- package/test/addresses/nem.json +4 -0
- package/test/addresses/polkadot.json +8 -0
- package/test/addresses/ripple.json +11 -0
- package/test/addresses/sia.json +6 -0
- package/test/addresses/solana.json +8 -0
- package/test/addresses/tezos.json +9 -0
- package/test/addresses/tron.json +6 -0
- package/test/addresses/xlm.json +12 -0
- package/test/multichain-address-validator.test.ts +1589 -0
- 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,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,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
|
+
};
|