multichain-address-validator 0.7.7 → 0.7.9

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.
@@ -1,8 +1,10 @@
1
1
  import { Address, Chain, NetworkType } from './types.js';
2
2
  export declare function validate(address: Address, chain: Chain): boolean;
3
+ export declare function validateMemo(memo: string, chain: Chain): boolean;
3
4
  export type { Address, Chain };
4
5
  export { NetworkType };
5
6
  declare const _default: {
6
7
  validate: typeof validate;
8
+ validateMemo: typeof validateMemo;
7
9
  };
8
10
  export default _default;
package/dist/cjs/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NetworkType = void 0;
4
4
  exports.validate = validate;
5
+ exports.validateMemo = validateMemo;
5
6
  const types_js_1 = require("./types.js");
6
7
  Object.defineProperty(exports, "NetworkType", { enumerable: true, get: function () { return types_js_1.NetworkType; } });
7
8
  const chain_validators_js_1 = require("./chain-validators.js");
@@ -12,6 +13,14 @@ function validate(address, chain) {
12
13
  }
13
14
  return validator.isValidAddress(address);
14
15
  }
16
+ function validateMemo(memo, chain) {
17
+ const validator = (0, chain_validators_js_1.getValidatorForChain)(chain);
18
+ if (!validator) {
19
+ throw new Error(`Missing validator for chain: ${chain}`);
20
+ }
21
+ return validator.isValidMemo?.(memo) ?? true;
22
+ }
15
23
  exports.default = {
16
- validate
24
+ validate,
25
+ validateMemo
17
26
  };
@@ -8,6 +8,7 @@ export type Chain = string | {
8
8
  };
9
9
  export interface Validator {
10
10
  isValidAddress(address: Address): boolean;
11
+ isValidMemo?(memo: string): boolean;
11
12
  }
12
13
  export declare enum NetworkType {
13
14
  MainNet = "mainnet",
@@ -4,6 +4,7 @@ declare const _default: {
4
4
  * ripple address validation
5
5
  */
6
6
  isValidAddress: (address: Address) => any;
7
+ isValidMemo(memo: string): boolean;
7
8
  verifyMemo(memo?: string): boolean;
8
9
  verifyChecksum(address: string): boolean;
9
10
  };
@@ -19,6 +19,9 @@ exports.default = {
19
19
  const validAddress = regexp.test(addr) && this.verifyChecksum(addr);
20
20
  return validAddress && this.verifyMemo(memo);
21
21
  },
22
+ isValidMemo(memo) {
23
+ return this.verifyMemo(memo);
24
+ },
22
25
  verifyMemo(memo) {
23
26
  if (!memo)
24
27
  return true; // Optional
@@ -5,11 +5,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const base58_validator_js_1 = __importDefault(require("./base58_validator.js"));
7
7
  const helpers_js_1 = require("../helpers.js");
8
+ const base58_js_1 = __importDefault(require("../crypto/base58.js"));
8
9
  exports.default = {
9
10
  isValidAddress: function (address) {
10
- return base58_validator_js_1.default.isValidAddress((0, helpers_js_1.getAddress)(address), {
11
+ const validBase58 = base58_validator_js_1.default.isValidAddress((0, helpers_js_1.getAddress)(address), {
11
12
  maxLength: 44,
12
13
  minLength: 43,
13
14
  });
15
+ if (!validBase58) {
16
+ return false;
17
+ }
18
+ // solana address must be 32 bytes
19
+ return base58_js_1.default.decode((0, helpers_js_1.getAddress)(address)).length === 32;
14
20
  }
15
21
  };
@@ -1,6 +1,7 @@
1
1
  import { Address } from '../types.js';
2
2
  declare const _default: {
3
3
  isValidAddress: (address: Address) => any;
4
+ isValidMemo(memo: string): boolean;
4
5
  verifyMemo(memo?: string): boolean;
5
6
  verifyChecksum: (address: string) => boolean;
6
7
  };
@@ -23,6 +23,9 @@ exports.default = {
23
23
  const validAddress = regexp.test(addr) && this.verifyChecksum(addr);
24
24
  return validAddress && this.verifyMemo(memo);
25
25
  },
26
+ isValidMemo(memo) {
27
+ return this.verifyMemo(memo);
28
+ },
26
29
  verifyMemo(memo) {
27
30
  if (!memo)
28
31
  return true; // Optional
@@ -1,8 +1,10 @@
1
1
  import { Address, Chain, NetworkType } from './types.js';
2
2
  export declare function validate(address: Address, chain: Chain): boolean;
3
+ export declare function validateMemo(memo: string, chain: Chain): boolean;
3
4
  export type { Address, Chain };
4
5
  export { NetworkType };
5
6
  declare const _default: {
6
7
  validate: typeof validate;
8
+ validateMemo: typeof validateMemo;
7
9
  };
8
10
  export default _default;
package/dist/esm/index.js CHANGED
@@ -7,7 +7,15 @@ export function validate(address, chain) {
7
7
  }
8
8
  return validator.isValidAddress(address);
9
9
  }
10
+ export function validateMemo(memo, chain) {
11
+ const validator = getValidatorForChain(chain);
12
+ if (!validator) {
13
+ throw new Error(`Missing validator for chain: ${chain}`);
14
+ }
15
+ return validator.isValidMemo?.(memo) ?? true;
16
+ }
10
17
  export { NetworkType };
11
18
  export default {
12
- validate
19
+ validate,
20
+ validateMemo
13
21
  };
@@ -8,6 +8,7 @@ export type Chain = string | {
8
8
  };
9
9
  export interface Validator {
10
10
  isValidAddress(address: Address): boolean;
11
+ isValidMemo?(memo: string): boolean;
11
12
  }
12
13
  export declare enum NetworkType {
13
14
  MainNet = "mainnet",
@@ -4,6 +4,7 @@ declare const _default: {
4
4
  * ripple address validation
5
5
  */
6
6
  isValidAddress: (address: Address) => any;
7
+ isValidMemo(memo: string): boolean;
7
8
  verifyMemo(memo?: string): boolean;
8
9
  verifyChecksum(address: string): boolean;
9
10
  };
@@ -14,6 +14,9 @@ export default {
14
14
  const validAddress = regexp.test(addr) && this.verifyChecksum(addr);
15
15
  return validAddress && this.verifyMemo(memo);
16
16
  },
17
+ isValidMemo(memo) {
18
+ return this.verifyMemo(memo);
19
+ },
17
20
  verifyMemo(memo) {
18
21
  if (!memo)
19
22
  return true; // Optional
@@ -1,10 +1,16 @@
1
1
  import base58Validator from './base58_validator.js';
2
2
  import { getAddress } from '../helpers.js';
3
+ import base58 from '../crypto/base58.js';
3
4
  export default {
4
5
  isValidAddress: function (address) {
5
- return base58Validator.isValidAddress(getAddress(address), {
6
+ const validBase58 = base58Validator.isValidAddress(getAddress(address), {
6
7
  maxLength: 44,
7
8
  minLength: 43,
8
9
  });
10
+ if (!validBase58) {
11
+ return false;
12
+ }
13
+ // solana address must be 32 bytes
14
+ return base58.decode(getAddress(address)).length === 32;
9
15
  }
10
16
  };
@@ -1,6 +1,7 @@
1
1
  import { Address } from '../types.js';
2
2
  declare const _default: {
3
3
  isValidAddress: (address: Address) => any;
4
+ isValidMemo(memo: string): boolean;
4
5
  verifyMemo(memo?: string): boolean;
5
6
  verifyChecksum: (address: string) => boolean;
6
7
  };
@@ -18,6 +18,9 @@ export default {
18
18
  const validAddress = regexp.test(addr) && this.verifyChecksum(addr);
19
19
  return validAddress && this.verifyMemo(memo);
20
20
  },
21
+ isValidMemo(memo) {
22
+ return this.verifyMemo(memo);
23
+ },
21
24
  verifyMemo(memo) {
22
25
  if (!memo)
23
26
  return true; // Optional
package/package.json CHANGED
@@ -1,7 +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.7",
4
+ "version": "0.7.9",
5
5
  "keywords": [
6
6
  "0x",
7
7
  "zrx",
package/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import {Address, Chain, NetworkType} from './types.js'
2
2
  import {getValidatorForChain} from './chain-validators.js'
3
3
 
4
- export function validate(address: Address, chain: Chain) {
4
+ export function validate(address: Address, chain: Chain): boolean {
5
5
  const validator = getValidatorForChain(chain)
6
6
  if (!validator) {
7
7
  throw new Error(`Missing validator for chain: ${chain}`);
@@ -10,9 +10,19 @@ export function validate(address: Address, chain: Chain) {
10
10
  return validator.isValidAddress(address);
11
11
  }
12
12
 
13
+ export function validateMemo(memo: string, chain: Chain): boolean {
14
+ const validator = getValidatorForChain(chain)
15
+ if (!validator) {
16
+ throw new Error(`Missing validator for chain: ${chain}`);
17
+ }
18
+
19
+ return validator.isValidMemo?.(memo) ?? true
20
+ }
21
+
13
22
  export type { Address, Chain }
14
23
  export { NetworkType }
15
24
 
16
25
  export default {
17
- validate
26
+ validate,
27
+ validateMemo
18
28
  }
package/src/types.ts CHANGED
@@ -10,6 +10,7 @@ export type Chain = string | {
10
10
 
11
11
  export interface Validator {
12
12
  isValidAddress(address: Address): boolean
13
+ isValidMemo?(memo: string): boolean
13
14
  }
14
15
 
15
16
  export enum NetworkType {
@@ -22,6 +22,10 @@ export default {
22
22
  return validAddress && this.verifyMemo(memo)
23
23
  },
24
24
 
25
+ isValidMemo(memo: string): boolean {
26
+ return this.verifyMemo(memo)
27
+ },
28
+
25
29
  verifyMemo(memo?: string): boolean {
26
30
  if (!memo) return true; // Optional
27
31
 
@@ -1,12 +1,21 @@
1
1
  import base58Validator from './base58_validator.js';
2
2
  import {Address} from '../types.js'
3
3
  import {getAddress} from '../helpers.js'
4
+ import {Buffer} from 'buffer'
5
+ import base58 from '../crypto/base58.js'
4
6
 
5
7
  export default {
6
8
  isValidAddress: function (address: Address) {
7
- return base58Validator.isValidAddress(getAddress(address), {
9
+ const validBase58 = base58Validator.isValidAddress(getAddress(address), {
8
10
  maxLength: 44,
9
11
  minLength: 43,
10
12
  })
13
+
14
+ if (!validBase58) {
15
+ return false
16
+ }
17
+
18
+ // solana address must be 32 bytes
19
+ return base58.decode(getAddress(address)).length === 32
11
20
  }
12
21
  };
@@ -27,6 +27,10 @@ export default {
27
27
  return validAddress && this.verifyMemo(memo)
28
28
  },
29
29
 
30
+ isValidMemo(memo: string): boolean {
31
+ return this.verifyMemo(memo)
32
+ },
33
+
30
34
  verifyMemo(memo?: string): boolean {
31
35
  if (!memo) return true; // Optional
32
36
 
@@ -24,9 +24,8 @@ import sui from './sui.json'
24
24
  import tezos from './tezos.json'
25
25
  import tron from './tron.json'
26
26
  import xlm from './xlm.json'
27
- import {Address} from '../../src'
28
27
 
29
- export type TestAddress = Address & { invalid?: boolean }
28
+ export type TestAddress = string | { address: string, memo?: string } & { invalid?: boolean, invalidMemo?: boolean }
30
29
 
31
30
  const testAddresses: Record<string, TestAddress[]> = {
32
31
  aptos,
@@ -7,5 +7,7 @@
7
7
  "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7",
8
8
  "GSa5espVLNseXEfKt46zEdS6jrPkmFghBU",
9
9
  "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7",
10
- "tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy"
10
+ "tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy",
11
+ "mxHzYDeCZD8qzvfVzTqPS65p23inGkRvXT",
12
+ "2N3ATmqPqnHR243HiwtqpCFwSsNdTiCvmmv"
11
13
  ]
@@ -5,5 +5,6 @@
5
5
  "QW2SvwjaJU8LD6GSmtm1PHnBG2xPuxwZFy",
6
6
  "QjpzxpbLp5pCGsCczMbfh1uhC3P89QZavY",
7
7
  "tltc1qu78xur5xnq6fjy83amy0qcjfau8m367defyhms",
8
- "mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJRfn"
8
+ "mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJRfn",
9
+ "nYNZ81BicMYUDt99dFsMdPo5JjfrMB6T3k"
9
10
  ]
@@ -3,5 +3,6 @@
3
3
  "LTpYZG19YmfvY2bBDYtCKpunVRw7nVgRHW",
4
4
  "Lb6wDP2kHGyWC7vrZuZAgV7V4ECyDdH7a6",
5
5
  "ltc1qg42tkwuuxefutzxezdkdel39gfstuap288mfea",
6
- "ltc1qg42tkwuuxefutzxezdkdel39gfstuap288mfea"
6
+ "ltc1qg42tkwuuxefutzxezdkdel39gfstuap288mfea",
7
+ "LLUvRjeoNCa1gRuoVzFAzr3pWdu21JJESa"
7
8
  ]
@@ -15,6 +15,6 @@
15
15
  {
16
16
  "address": "rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN",
17
17
  "memo": "non-numeric-memo",
18
- "invalid": true
18
+ "invalidMemo": true
19
19
  }
20
20
  ]
@@ -4,5 +4,9 @@
4
4
  "HgyXhqapicB8zoyyFQ23oUwwFrBACDyDc7bqUuvnEELM",
5
5
  "833XorXTTx5iya5B3Tr6iqEs9GbRuvVfwyLCP2vpdzhq",
6
6
  "69UwBV4LPg7hHUS5JXiXyfgVnESmDKe8KJppsLj8pRU",
7
- "G4qGCGF4vWGPzYi2pxc2Djvgv3j8NiWaHQMgTVebCX6W"
7
+ "G4qGCGF4vWGPzYi2pxc2Djvgv3j8NiWaHQMgTVebCX6W",
8
+ {
9
+ "address": "3Yu3ULPjVc4QqS349VCs22br9zH9T6MWNnSM9RBimkw",
10
+ "invalid": true
11
+ }
8
12
  ]
@@ -16,6 +16,6 @@
16
16
  {
17
17
  "address": "GDTYVCTAUQVPKEDZIBWEJGKBQHB4UGGXI2SXXUEW7LXMD4B7MK37CWLJ",
18
18
  "memo": "really long memo that exceeds 28 bytes",
19
- "invalid": true
19
+ "invalidMemo": true
20
20
  }
21
21
  ]
@@ -1,12 +1,15 @@
1
1
  import {describe, it} from 'mocha'
2
2
  import {expect} from 'chai'
3
3
 
4
- import {validate, Chain, NetworkType} from '../src'
4
+ import {Chain, NetworkType, validate, validateMemo} from '../src'
5
5
  // @ts-ignore
6
6
  import addresses, {TestAddress} from './addresses/addresses'
7
7
 
8
8
  function check(address: TestAddress, chain: Chain) {
9
- address.invalid
9
+ if (typeof address === 'string') {
10
+ return valid(address, chain)
11
+ }
12
+ (address.invalid || address.invalidMemo)
10
13
  ? invalid(address, chain)
11
14
  : valid(address, chain)
12
15
  }
@@ -21,6 +24,31 @@ function invalid(address: TestAddress, chain: Chain) {
21
24
  expect({address, chain, valid}).to.deep.equal({address, chain, valid: false});
22
25
  }
23
26
 
27
+ function checkMemo(address: TestAddress, chain: Chain) {
28
+ if (typeof address === 'string') {
29
+ return
30
+ }
31
+ address.invalidMemo
32
+ ? invalidMemo(address.memo, chain)
33
+ : validMemo(address.memo, chain)
34
+ }
35
+
36
+ function validMemo(memo: string | undefined, chain: Chain) {
37
+ if (!memo) {
38
+ return
39
+ }
40
+ const valid = validateMemo(memo, chain);
41
+ expect({memo, chain, valid}).to.deep.equal({memo, chain, valid: true});
42
+ }
43
+
44
+ function invalidMemo(memo: string | undefined, chain: Chain) {
45
+ if (!memo) {
46
+ return
47
+ }
48
+ const valid = validateMemo(memo, chain);
49
+ expect({memo, chain, valid}).to.deep.equal({memo, chain, valid: false});
50
+ }
51
+
24
52
  interface TestCase {
25
53
  alternatives: string[],
26
54
  testAddresses: keyof typeof addresses,
@@ -154,7 +182,6 @@ const TestCases: Record<string, TestCase> = {
154
182
  }
155
183
 
156
184
  describe('multichain address validator', function () {
157
-
158
185
  it('should check valid addresses for chains', function () {
159
186
  for (const chain in TestCases) {
160
187
  for (const c of [chain, ...TestCases[chain].alternatives]) {
@@ -163,6 +190,7 @@ describe('multichain address validator', function () {
163
190
  }
164
191
  for (const address of addresses[TestCases[chain].testAddresses]) {
165
192
  check(address, c)
193
+ checkMemo(address, c)
166
194
  }
167
195
 
168
196
  if (TestCases[chain].testnet) {
@@ -170,7 +198,7 @@ describe('multichain address validator', function () {
170
198
  throw new Error(`No test testnet addresses for chain '${chain}'`)
171
199
  }
172
200
  for (const address of addresses[TestCases[chain].testnet.testAddresses]) {
173
- check(address, { chain: c, networkType: NetworkType.TestNet })
201
+ checkMemo(address, {chain: c, networkType: NetworkType.TestNet})
174
202
  }
175
203
  }
176
204
  }