@rosen-bridge/address-codec 0.2.1 → 0.4.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.
Files changed (47) hide show
  1. package/CHANGELOG.md +14 -2
  2. package/dist/const.d.ts +1 -0
  3. package/dist/const.d.ts.map +1 -1
  4. package/dist/const.js +2 -1
  5. package/dist/decoder.d.ts +2 -5
  6. package/dist/decoder.d.ts.map +1 -1
  7. package/dist/decoder.js +3 -2
  8. package/dist/encoder.d.ts +1 -1
  9. package/dist/encoder.d.ts.map +1 -1
  10. package/dist/encoder.js +3 -2
  11. package/dist/index.d.ts +2 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +2 -1
  14. package/dist/lib/const.d.ts +1 -0
  15. package/dist/lib/const.d.ts.map +1 -1
  16. package/dist/lib/const.js +2 -1
  17. package/dist/lib/decoder.d.ts.map +1 -1
  18. package/dist/lib/decoder.js +3 -2
  19. package/dist/lib/encoder.d.ts.map +1 -1
  20. package/dist/lib/encoder.js +3 -2
  21. package/dist/lib/index.d.ts +1 -0
  22. package/dist/lib/index.d.ts.map +1 -1
  23. package/dist/lib/index.js +2 -1
  24. package/dist/lib/validator.d.ts +7 -0
  25. package/dist/lib/validator.d.ts.map +1 -0
  26. package/dist/lib/validator.js +34 -0
  27. package/dist/tests/testData.d.ts +6 -0
  28. package/dist/tests/testData.d.ts.map +1 -1
  29. package/dist/tests/testData.js +7 -1
  30. package/dist/tests/validator.spec.d.ts +2 -0
  31. package/dist/tests/validator.spec.d.ts.map +1 -0
  32. package/dist/tests/validator.spec.js +158 -0
  33. package/dist/tsconfig.tsbuildinfo +1 -1
  34. package/dist/types.d.ts +3 -3
  35. package/dist/types.js +7 -11
  36. package/dist/validator.d.ts +7 -0
  37. package/dist/validator.d.ts.map +1 -0
  38. package/dist/validator.js +34 -0
  39. package/lib/const.ts +1 -0
  40. package/lib/decoder.ts +2 -0
  41. package/lib/encoder.ts +2 -0
  42. package/lib/index.ts +1 -0
  43. package/lib/validator.ts +40 -0
  44. package/package.json +3 -2
  45. package/tests/testData.ts +11 -0
  46. package/tests/validator.spec.ts +178 -0
  47. package/tsconfig.build.tsbuildinfo +1 -1
package/dist/types.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export declare class UnsupportedAddressError extends Error {
2
- constructor(chain: string, address: string);
2
+ constructor(chain: string, address: string);
3
3
  }
4
4
  export declare class UnsupportedChainError extends Error {
5
- constructor(chain: string);
5
+ constructor(chain: string);
6
6
  }
7
- //# sourceMappingURL=types.d.ts.map
7
+ //# sourceMappingURL=types.d.ts.map
package/dist/types.js CHANGED
@@ -1,15 +1,11 @@
1
1
  export class UnsupportedAddressError extends Error {
2
- constructor(chain, address) {
3
- super(
4
- `UnsupportedAddressError: Address [${address}] is not supported in current implementation of [${chain}] chain`,
5
- );
6
- }
2
+ constructor(chain, address) {
3
+ super(`UnsupportedAddressError: Address [${address}] is not supported in current implementation of [${chain}] chain`);
4
+ }
7
5
  }
8
6
  export class UnsupportedChainError extends Error {
9
- constructor(chain) {
10
- super(
11
- `UnsupportedChainError: Address encoding does not support [${chain}] chain currently`,
12
- );
13
- }
7
+ constructor(chain) {
8
+ super(`UnsupportedChainError: Address encoding does not support [${chain}] chain currently`);
9
+ }
14
10
  }
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLHVCQUF3QixTQUFRLEtBQUs7SUFDaEQsWUFBWSxLQUFhLEVBQUUsT0FBZTtRQUN4QyxLQUFLLENBQ0gscUNBQXFDLE9BQU8sb0RBQW9ELEtBQUssU0FBUyxDQUMvRyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHFCQUFzQixTQUFRLEtBQUs7SUFDOUMsWUFBWSxLQUFhO1FBQ3ZCLEtBQUssQ0FDSCw2REFBNkQsS0FBSyxtQkFBbUIsQ0FDdEYsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZEFkZHJlc3NFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoY2hhaW46IHN0cmluZywgYWRkcmVzczogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3I6IEFkZHJlc3MgWyR7YWRkcmVzc31dIGlzIG5vdCBzdXBwb3J0ZWQgaW4gY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBbJHtjaGFpbn1dIGNoYWluYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkQ2hhaW5FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoY2hhaW46IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgYFVuc3VwcG9ydGVkQ2hhaW5FcnJvcjogQWRkcmVzcyBlbmNvZGluZyBkb2VzIG5vdCBzdXBwb3J0IFske2NoYWlufV0gY2hhaW4gY3VycmVudGx5YFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLHVCQUF3QixTQUFRLEtBQUs7SUFDaEQsWUFBWSxLQUFhLEVBQUUsT0FBZTtRQUN4QyxLQUFLLENBQ0gscUNBQXFDLE9BQU8sb0RBQW9ELEtBQUssU0FBUyxDQUMvRyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHFCQUFzQixTQUFRLEtBQUs7SUFDOUMsWUFBWSxLQUFhO1FBQ3ZCLEtBQUssQ0FDSCw2REFBNkQsS0FBSyxtQkFBbUIsQ0FDdEYsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZEFkZHJlc3NFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoY2hhaW46IHN0cmluZywgYWRkcmVzczogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3I6IEFkZHJlc3MgWyR7YWRkcmVzc31dIGlzIG5vdCBzdXBwb3J0ZWQgaW4gY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBbJHtjaGFpbn1dIGNoYWluYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkQ2hhaW5FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoY2hhaW46IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgYFVuc3VwcG9ydGVkQ2hhaW5FcnJvcjogQWRkcmVzcyBlbmNvZGluZyBkb2VzIG5vdCBzdXBwb3J0IFske2NoYWlufV0gY2hhaW4gY3VycmVudGx5YFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ /**
2
+ * validates address of a chain
3
+ * @param chain
4
+ * @param address
5
+ */
6
+ export declare const validateAddress: (chain: string, address: string) => boolean;
7
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../lib/validator.ts"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,eAAO,MAAM,eAAe,UAAW,MAAM,WAAW,MAAM,KAAG,OAqBhE,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { BINANCE_CHAIN, BITCOIN_CHAIN, CARDANO_CHAIN, ERGO_CHAIN, ETHEREUM_CHAIN, } from './const';
2
+ import { UnsupportedAddressError, UnsupportedChainError } from './types';
3
+ import * as ergoLib from 'ergo-lib-wasm-nodejs';
4
+ import * as cardanoLib from '@emurgo/cardano-serialization-lib-nodejs';
5
+ import * as bitcoinLib from 'bitcoinjs-lib';
6
+ import * as ethereumLib from 'ethers';
7
+ /**
8
+ * validates address of a chain
9
+ * @param chain
10
+ * @param address
11
+ */
12
+ export const validateAddress = (chain, address) => {
13
+ switch (chain) {
14
+ case ERGO_CHAIN:
15
+ ergoLib.Address.from_base58(address);
16
+ return true;
17
+ case CARDANO_CHAIN:
18
+ cardanoLib.Address.from_bech32(address);
19
+ return true;
20
+ case BITCOIN_CHAIN:
21
+ bitcoinLib.address.fromBech32(address);
22
+ if (address.slice(0, 4) != 'bc1q')
23
+ throw new UnsupportedAddressError(chain, address);
24
+ return true;
25
+ case BINANCE_CHAIN:
26
+ case ETHEREUM_CHAIN:
27
+ if (address.toLowerCase() != address || !ethereumLib.isAddress(address))
28
+ throw new UnsupportedAddressError(chain, address);
29
+ return true;
30
+ default:
31
+ throw new UnsupportedChainError(chain);
32
+ }
33
+ };
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixhQUFhLEVBQ2IsVUFBVSxFQUNWLGNBQWMsR0FDZixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekUsT0FBTyxLQUFLLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssVUFBVSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxVQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sS0FBSyxXQUFXLE1BQU0sUUFBUSxDQUFDO0FBRXRDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFhLEVBQUUsT0FBZSxFQUFXLEVBQUU7SUFDekUsUUFBUSxLQUFLLEVBQUUsQ0FBQztRQUNkLEtBQUssVUFBVTtZQUNiLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsS0FBSyxhQUFhO1lBQ2hCLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsS0FBSyxhQUFhO1lBQ2hCLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTTtnQkFDL0IsTUFBTSxJQUFJLHVCQUF1QixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNwRCxPQUFPLElBQUksQ0FBQztRQUNkLEtBQUssYUFBYSxDQUFDO1FBQ25CLEtBQUssY0FBYztZQUNqQixJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFDckUsTUFBTSxJQUFJLHVCQUF1QixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNwRCxPQUFPLElBQUksQ0FBQztRQUNkO1lBQ0UsTUFBTSxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCSU5BTkNFX0NIQUlOLFxuICBCSVRDT0lOX0NIQUlOLFxuICBDQVJEQU5PX0NIQUlOLFxuICBFUkdPX0NIQUlOLFxuICBFVEhFUkVVTV9DSEFJTixcbn0gZnJvbSAnLi9jb25zdCc7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEFkZHJlc3NFcnJvciwgVW5zdXBwb3J0ZWRDaGFpbkVycm9yIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyBlcmdvTGliIGZyb20gJ2VyZ28tbGliLXdhc20tbm9kZWpzJztcbmltcG9ydCAqIGFzIGNhcmRhbm9MaWIgZnJvbSAnQGVtdXJnby9jYXJkYW5vLXNlcmlhbGl6YXRpb24tbGliLW5vZGVqcyc7XG5pbXBvcnQgKiBhcyBiaXRjb2luTGliIGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0ICogYXMgZXRoZXJldW1MaWIgZnJvbSAnZXRoZXJzJztcblxuLyoqXG4gKiB2YWxpZGF0ZXMgYWRkcmVzcyBvZiBhIGNoYWluXG4gKiBAcGFyYW0gY2hhaW5cbiAqIEBwYXJhbSBhZGRyZXNzXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUFkZHJlc3MgPSAoY2hhaW46IHN0cmluZywgYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHN3aXRjaCAoY2hhaW4pIHtcbiAgICBjYXNlIEVSR09fQ0hBSU46XG4gICAgICBlcmdvTGliLkFkZHJlc3MuZnJvbV9iYXNlNTgoYWRkcmVzcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIENBUkRBTk9fQ0hBSU46XG4gICAgICBjYXJkYW5vTGliLkFkZHJlc3MuZnJvbV9iZWNoMzIoYWRkcmVzcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIEJJVENPSU5fQ0hBSU46XG4gICAgICBiaXRjb2luTGliLmFkZHJlc3MuZnJvbUJlY2gzMihhZGRyZXNzKTtcbiAgICAgIGlmIChhZGRyZXNzLnNsaWNlKDAsIDQpICE9ICdiYzFxJylcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQWRkcmVzc0Vycm9yKGNoYWluLCBhZGRyZXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgQklOQU5DRV9DSEFJTjpcbiAgICBjYXNlIEVUSEVSRVVNX0NIQUlOOlxuICAgICAgaWYgKGFkZHJlc3MudG9Mb3dlckNhc2UoKSAhPSBhZGRyZXNzIHx8ICFldGhlcmV1bUxpYi5pc0FkZHJlc3MoYWRkcmVzcykpXG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEFkZHJlc3NFcnJvcihjaGFpbiwgYWRkcmVzcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ2hhaW5FcnJvcihjaGFpbik7XG4gIH1cbn07XG4iXX0=
package/lib/const.ts CHANGED
@@ -2,3 +2,4 @@ export const BITCOIN_CHAIN = 'bitcoin';
2
2
  export const CARDANO_CHAIN = 'cardano';
3
3
  export const ERGO_CHAIN = 'ergo';
4
4
  export const ETHEREUM_CHAIN = 'ethereum';
5
+ export const BINANCE_CHAIN = 'binance';
package/lib/decoder.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import {
2
+ BINANCE_CHAIN,
2
3
  BITCOIN_CHAIN,
3
4
  CARDANO_CHAIN,
4
5
  ERGO_CHAIN,
@@ -34,6 +35,7 @@ export const decodeAddress = (
34
35
  return bitcoinLib.address.fromOutputScript(
35
36
  Buffer.from(encodedAddress, 'hex')
36
37
  );
38
+ case BINANCE_CHAIN:
37
39
  case ETHEREUM_CHAIN:
38
40
  if (encodedAddress.length != 40) {
39
41
  throw new UnsupportedAddressError(chain, encodedAddress);
package/lib/encoder.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import {
2
+ BINANCE_CHAIN,
2
3
  BITCOIN_CHAIN,
3
4
  CARDANO_CHAIN,
4
5
  ERGO_CHAIN,
@@ -33,6 +34,7 @@ export const encodeAddress = (chain: string, address: string): string => {
33
34
  bitcoinLib.address.toOutputScript(address)
34
35
  ).toString('hex');
35
36
  break;
37
+ case BINANCE_CHAIN:
36
38
  case ETHEREUM_CHAIN:
37
39
  if (address.length != 42 || address.substring(0, 2) != '0x') {
38
40
  throw new UnsupportedAddressError(chain, address);
package/lib/index.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './encoder';
2
2
  export * from './decoder';
3
3
  export * from './types';
4
+ export * from './validator';
@@ -0,0 +1,40 @@
1
+ import {
2
+ BINANCE_CHAIN,
3
+ BITCOIN_CHAIN,
4
+ CARDANO_CHAIN,
5
+ ERGO_CHAIN,
6
+ ETHEREUM_CHAIN,
7
+ } from './const';
8
+ import { UnsupportedAddressError, UnsupportedChainError } from './types';
9
+ import * as ergoLib from 'ergo-lib-wasm-nodejs';
10
+ import * as cardanoLib from '@emurgo/cardano-serialization-lib-nodejs';
11
+ import * as bitcoinLib from 'bitcoinjs-lib';
12
+ import * as ethereumLib from 'ethers';
13
+
14
+ /**
15
+ * validates address of a chain
16
+ * @param chain
17
+ * @param address
18
+ */
19
+ export const validateAddress = (chain: string, address: string): boolean => {
20
+ switch (chain) {
21
+ case ERGO_CHAIN:
22
+ ergoLib.Address.from_base58(address);
23
+ return true;
24
+ case CARDANO_CHAIN:
25
+ cardanoLib.Address.from_bech32(address);
26
+ return true;
27
+ case BITCOIN_CHAIN:
28
+ bitcoinLib.address.fromBech32(address);
29
+ if (address.slice(0, 4) != 'bc1q')
30
+ throw new UnsupportedAddressError(chain, address);
31
+ return true;
32
+ case BINANCE_CHAIN:
33
+ case ETHEREUM_CHAIN:
34
+ if (address.toLowerCase() != address || !ethereumLib.isAddress(address))
35
+ throw new UnsupportedAddressError(chain, address);
36
+ return true;
37
+ default:
38
+ throw new UnsupportedChainError(chain);
39
+ }
40
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rosen-bridge/address-codec",
3
- "version": "0.2.1",
3
+ "version": "0.4.0",
4
4
  "description": "A Typescript package for encoding and decoding of addresses in Rosen bridge supported chains",
5
5
  "repository": "https://github.com/rosen-bridge/utils",
6
6
  "license": "GPL-3.0",
@@ -35,6 +35,7 @@
35
35
  "dependencies": {
36
36
  "@emurgo/cardano-serialization-lib-nodejs": "^11.5.0",
37
37
  "bitcoinjs-lib": "^6.1.5",
38
- "ergo-lib-wasm-nodejs": "^0.24.1"
38
+ "ergo-lib-wasm-nodejs": "^0.24.1",
39
+ "ethers": "^6.13.2"
39
40
  }
40
41
  }
package/tests/testData.ts CHANGED
@@ -2,13 +2,21 @@ export const ergoAddress =
2
2
  '9iMjQx8PzwBKXRvsFUJFJAPoy31znfEeBUGz8DRkcnJX4rJYjVd';
3
3
  export const encodedErgoAddress =
4
4
  '03f999da8e6e42660e4464d17d29e63bc006734a6710a24eb489b466323d3a9339';
5
+ export const invalidErgoAddress =
6
+ '9iMjQx8PzwBKXRvsFUJFJAPoy31znfEeBUGz8DRkcnJX4rJYjVD';
5
7
 
6
8
  export const cardanoAddress =
7
9
  'addr1qxxa3kfnnh40yqtepa5frt0tkw4a0rys7v33422lzt8glx43sqtd4vkhjzawajej8aujh27p5a54zx62xf3wvuplynqs3fsqet';
8
10
  export const encodedCardanoAddress =
9
11
  '018dd8d9339deaf201790f6891adebb3abd78c90f3231aa95f12ce8f9ab18016dab2d790baeecb323f792babc1a769511b4a3262e6703f24c1';
12
+ export const invalidCardanoAddress =
13
+ 'addr1qxxa3kfnnh40yqtepa5frt0tkw4a0rys7v33422lzt8glx43sqtd4vkhjzawajej8aujh27p5a54zx62xf3wvuplynqs3fsqee';
10
14
 
11
15
  export const bitcoinAddress = 'bc1qkgp89fjerymm5ltg0hygnumr0m2qa7n22gyw6h';
16
+ export const invalidBitcoinAddress =
17
+ 'bc1qkgp89fjerymm5ltg0hygnumr0m2qa7n22gyw6';
18
+ export const tapRootBitcoinAddress =
19
+ 'bc1pxhtmm7mjrafdkw46wc7lmjn3gyrmdm4q0dnmw8j225gxtwtq7mwqd7e24v';
12
20
  export const encodedBitcoinAddress =
13
21
  '0014b20272a6591937ba7d687dc889f3637ed40efa6a';
14
22
 
@@ -23,3 +31,6 @@ export const encodedEthereumAddress =
23
31
 
24
32
  export const invalidEthereumAddressLength =
25
33
  '0xb416c8a7ec94706a9ae2c26c11d320519482b1';
34
+ export const invalidEthereumIcapAddress = 'XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36';
35
+ export const invalidEthereumChecksumAddress =
36
+ '0x4838B106FCe9647Bdf1E7877BF73cE8B0BAD5f97';
@@ -0,0 +1,178 @@
1
+ import * as testData from './testData';
2
+ import {
3
+ UnsupportedAddressError,
4
+ UnsupportedChainError,
5
+ validateAddress,
6
+ } from '../lib';
7
+ import {
8
+ BITCOIN_CHAIN,
9
+ CARDANO_CHAIN,
10
+ ERGO_CHAIN,
11
+ ETHEREUM_CHAIN,
12
+ } from '../lib/const';
13
+
14
+ describe('validateAddress', () => {
15
+ /**
16
+ * @target `validateAddress` should validate Ergo address successfully
17
+ * @dependencies
18
+ * @scenario
19
+ * - run test
20
+ * @expected
21
+ * - to validate correct Ergo address
22
+ */
23
+ it('should validate Ergo address successfully', () => {
24
+ const res = validateAddress(ERGO_CHAIN, testData.ergoAddress);
25
+ expect(res).toEqual(true);
26
+ });
27
+
28
+ /**
29
+ * @target `validateAddress` should throw error for wrong Ergo address
30
+ * @dependencies
31
+ * @scenario
32
+ * - run test
33
+ * @expected
34
+ * - to throw error for wrong Ergo address
35
+ */
36
+ it('should throw error for wrong Ergo address', () => {
37
+ expect(() => {
38
+ validateAddress(ERGO_CHAIN, testData.invalidErgoAddress);
39
+ }).toThrow();
40
+ });
41
+
42
+ /**
43
+ * @target `validateAddress` should validate Cardano address successfully
44
+ * @dependencies
45
+ * @scenario
46
+ * - run test
47
+ * @expected
48
+ * - to validate correct Cardano address
49
+ */
50
+ it('should validate Cardano address successfully', () => {
51
+ const res = validateAddress(CARDANO_CHAIN, testData.cardanoAddress);
52
+ expect(res).toEqual(true);
53
+ });
54
+
55
+ /**
56
+ * @target `validateAddress` should throw error for wrong Cardano address
57
+ * @dependencies
58
+ * @scenario
59
+ * - run test
60
+ * @expected
61
+ * - to throw error for wrong Cardano address
62
+ */
63
+ it('should throw error for wrong Cardano address', () => {
64
+ expect(() => {
65
+ validateAddress(CARDANO_CHAIN, testData.invalidCardanoAddress);
66
+ }).toThrow();
67
+ });
68
+
69
+ /**
70
+ * @target `validateAddress` should validate Bitcoin address successfully
71
+ * @dependencies
72
+ * @scenario
73
+ * - run test
74
+ * @expected
75
+ * - to validate correct Bitcoin address
76
+ */
77
+ it('should validate Bitcoin address successfully', () => {
78
+ const res = validateAddress(BITCOIN_CHAIN, testData.bitcoinAddress);
79
+ expect(res).toEqual(true);
80
+ });
81
+
82
+ /**
83
+ * @target `validateAddress` should throw error for Bitcoin taproot address
84
+ * @dependencies
85
+ * @scenario
86
+ * - run test
87
+ * @expected
88
+ * - to throw error for Bitcoin taproot address
89
+ */
90
+ it('should throw error for Bitcoin taproot address', () => {
91
+ expect(() => {
92
+ validateAddress(BITCOIN_CHAIN, testData.tapRootBitcoinAddress);
93
+ }).toThrow(UnsupportedAddressError);
94
+ });
95
+
96
+ /**
97
+ * @target `validateAddress` should throw error for wrong Bitcoin address
98
+ * @dependencies
99
+ * @scenario
100
+ * - run test
101
+ * @expected
102
+ * - to throw error for wrong Bitcoin address
103
+ */
104
+ it('should throw error for wrong Bitcoin address', () => {
105
+ expect(() => {
106
+ validateAddress(BITCOIN_CHAIN, testData.invalidBitcoinAddress);
107
+ }).toThrowError();
108
+ });
109
+
110
+ /**
111
+ * @target `validateAddress` should validate Ethereum address successfully
112
+ * @dependencies
113
+ * @scenario
114
+ * - run test
115
+ * @expected
116
+ * - to validate correct Ethereum address
117
+ */
118
+ it('should validate Ethereum address successfully', () => {
119
+ const res = validateAddress(ETHEREUM_CHAIN, testData.ethereumAddress);
120
+ expect(res).toEqual(true);
121
+ });
122
+
123
+ /**
124
+ * @target `validateAddress` should throw error for ICAP Ethereum address
125
+ * @dependencies
126
+ * @scenario
127
+ * - run test
128
+ * @expected
129
+ * - to throw error for ICAP Ethereum address
130
+ */
131
+ it('should throw error for ICAP Ethereum address', () => {
132
+ expect(() => {
133
+ validateAddress(ETHEREUM_CHAIN, testData.invalidEthereumIcapAddress);
134
+ }).toThrow(UnsupportedAddressError);
135
+ });
136
+
137
+ /**
138
+ * @target `validateAddress` should throw error for Ethereum address with checksum
139
+ * @dependencies
140
+ * @scenario
141
+ * - run test
142
+ * @expected
143
+ * - to throw error for Ethereum address with checksum
144
+ */
145
+ it('should throw error for Ethereum address with checksum', () => {
146
+ expect(() => {
147
+ validateAddress(ETHEREUM_CHAIN, testData.invalidEthereumChecksumAddress);
148
+ }).toThrow(UnsupportedAddressError);
149
+ });
150
+
151
+ /**
152
+ * @target `validateAddress` should throw error for wrong Ethereum address
153
+ * @dependencies
154
+ * @scenario
155
+ * - run test
156
+ * @expected
157
+ * - to throw error for wrong Ethereum address
158
+ */
159
+ it('should throw error for wrong Ethereum address', () => {
160
+ expect(() => {
161
+ validateAddress(ETHEREUM_CHAIN, testData.invalidEthereumAddressLength);
162
+ }).toThrow(UnsupportedAddressError);
163
+ });
164
+
165
+ /**
166
+ * @target `validateAddress` should throw error when chain is not supported
167
+ * @dependencies
168
+ * @scenario
169
+ * - run test
170
+ * @expected
171
+ * - it should throw UnsupportedChain error
172
+ */
173
+ it('should throw error when chain is not supported', () => {
174
+ expect(() => {
175
+ validateAddress('unsupported-chain', '0011223344');
176
+ }).toThrow(UnsupportedChainError);
177
+ });
178
+ });