@rosen-bridge/address-codec 0.1.0 → 0.2.1-6770eb

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 (59) hide show
  1. package/CHANGELOG.md +13 -0
  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.map +1 -1
  6. package/dist/decoder.js +7 -2
  7. package/dist/encoder.d.ts.map +1 -1
  8. package/dist/encoder.js +8 -2
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -1
  12. package/dist/lib/const.d.ts +5 -0
  13. package/dist/lib/const.d.ts.map +1 -0
  14. package/dist/lib/const.js +5 -0
  15. package/dist/lib/decoder.d.ts +8 -0
  16. package/dist/lib/decoder.d.ts.map +1 -0
  17. package/dist/lib/decoder.js +31 -0
  18. package/dist/lib/encoder.d.ts +8 -0
  19. package/dist/lib/encoder.d.ts.map +1 -0
  20. package/dist/lib/encoder.js +37 -0
  21. package/dist/lib/index.d.ts +5 -0
  22. package/dist/lib/index.d.ts.map +1 -0
  23. package/dist/lib/index.js +5 -0
  24. package/dist/lib/types.d.ts +7 -0
  25. package/dist/lib/types.d.ts.map +1 -0
  26. package/dist/lib/types.js +11 -0
  27. package/dist/lib/validator.d.ts +7 -0
  28. package/dist/lib/validator.d.ts.map +1 -0
  29. package/dist/lib/validator.js +33 -0
  30. package/dist/tests/decoder.spec.d.ts +2 -0
  31. package/dist/tests/decoder.spec.d.ts.map +1 -0
  32. package/dist/tests/decoder.spec.js +84 -0
  33. package/dist/tests/encoder.spec.d.ts +2 -0
  34. package/dist/tests/encoder.spec.d.ts.map +1 -0
  35. package/dist/tests/encoder.spec.js +98 -0
  36. package/dist/tests/testData.d.ts +17 -0
  37. package/dist/tests/testData.d.ts.map +1 -0
  38. package/dist/tests/testData.js +17 -0
  39. package/dist/tests/validator.spec.d.ts +2 -0
  40. package/dist/tests/validator.spec.d.ts.map +1 -0
  41. package/dist/tests/validator.spec.js +145 -0
  42. package/dist/tsconfig.tsbuildinfo +1 -0
  43. package/dist/validator.d.ts +7 -0
  44. package/dist/validator.d.ts.map +1 -0
  45. package/dist/validator.js +33 -0
  46. package/dist/vitest.config.d.ts +3 -0
  47. package/dist/vitest.config.d.ts.map +1 -0
  48. package/dist/vitest.config.js +18 -0
  49. package/lib/const.ts +1 -0
  50. package/lib/decoder.ts +11 -1
  51. package/lib/encoder.ts +12 -1
  52. package/lib/index.ts +1 -0
  53. package/lib/validator.ts +38 -0
  54. package/package.json +3 -2
  55. package/tests/decoder.spec.ts +20 -1
  56. package/tests/encoder.spec.ts +35 -1
  57. package/tests/testData.ts +16 -0
  58. package/tests/validator.spec.ts +164 -0
  59. package/tsconfig.build.tsbuildinfo +1 -1
@@ -0,0 +1,33 @@
1
+ import { 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 ETHEREUM_CHAIN:
26
+ if (address.toLowerCase() != address || !ethereumLib.isAddress(address))
27
+ throw new UnsupportedAddressError(chain, address);
28
+ return true;
29
+ default:
30
+ throw new UnsupportedChainError(chain);
31
+ }
32
+ };
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixVQUFVLEVBQ1YsY0FBYyxHQUNmLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6RSxPQUFPLEtBQUssT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxVQUFVLE1BQU0sMENBQTBDLENBQUM7QUFDdkUsT0FBTyxLQUFLLFVBQVUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxRQUFRLENBQUM7QUFFdEM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWEsRUFBRSxPQUFlLEVBQVcsRUFBRTtJQUN6RSxRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ2QsS0FBSyxVQUFVO1lBQ2IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLGFBQWE7WUFDaEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLGFBQWE7WUFDaEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNO2dCQUMvQixNQUFNLElBQUksdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2QsS0FBSyxjQUFjO1lBQ2pCLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUNyRSxNQUFNLElBQUksdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2Q7WUFDRSxNQUFNLElBQUkscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJJVENPSU5fQ0hBSU4sXG4gIENBUkRBTk9fQ0hBSU4sXG4gIEVSR09fQ0hBSU4sXG4gIEVUSEVSRVVNX0NIQUlOLFxufSBmcm9tICcuL2NvbnN0JztcbmltcG9ydCB7IFVuc3VwcG9ydGVkQWRkcmVzc0Vycm9yLCBVbnN1cHBvcnRlZENoYWluRXJyb3IgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIGVyZ29MaWIgZnJvbSAnZXJnby1saWItd2FzbS1ub2RlanMnO1xuaW1wb3J0ICogYXMgY2FyZGFub0xpYiBmcm9tICdAZW11cmdvL2NhcmRhbm8tc2VyaWFsaXphdGlvbi1saWItbm9kZWpzJztcbmltcG9ydCAqIGFzIGJpdGNvaW5MaWIgZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgKiBhcyBldGhlcmV1bUxpYiBmcm9tICdldGhlcnMnO1xuXG4vKipcbiAqIHZhbGlkYXRlcyBhZGRyZXNzIG9mIGEgY2hhaW5cbiAqIEBwYXJhbSBjaGFpblxuICogQHBhcmFtIGFkZHJlc3NcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQWRkcmVzcyA9IChjaGFpbjogc3RyaW5nLCBhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgc3dpdGNoIChjaGFpbikge1xuICAgIGNhc2UgRVJHT19DSEFJTjpcbiAgICAgIGVyZ29MaWIuQWRkcmVzcy5mcm9tX2Jhc2U1OChhZGRyZXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgQ0FSREFOT19DSEFJTjpcbiAgICAgIGNhcmRhbm9MaWIuQWRkcmVzcy5mcm9tX2JlY2gzMihhZGRyZXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgQklUQ09JTl9DSEFJTjpcbiAgICAgIGJpdGNvaW5MaWIuYWRkcmVzcy5mcm9tQmVjaDMyKGFkZHJlc3MpO1xuICAgICAgaWYgKGFkZHJlc3Muc2xpY2UoMCwgNCkgIT0gJ2JjMXEnKVxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3IoY2hhaW4sIGFkZHJlc3MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSBFVEhFUkVVTV9DSEFJTjpcbiAgICAgIGlmIChhZGRyZXNzLnRvTG93ZXJDYXNlKCkgIT0gYWRkcmVzcyB8fCAhZXRoZXJldW1MaWIuaXNBZGRyZXNzKGFkZHJlc3MpKVxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3IoY2hhaW4sIGFkZHJlc3MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZENoYWluRXJyb3IoY2hhaW4pO1xuICB9XG59O1xuIl19
@@ -0,0 +1,3 @@
1
+ declare const _default: import("vite").UserConfig;
2
+ export default _default;
3
+ //# sourceMappingURL=vitest.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.config.d.ts","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":";AAEA,wBAeG"}
@@ -0,0 +1,18 @@
1
+ import { defineConfig } from 'vitest/config';
2
+ export default defineConfig({
3
+ test: {
4
+ globals: true,
5
+ coverage: {
6
+ all: true,
7
+ provider: 'istanbul',
8
+ reporter: 'cobertura',
9
+ },
10
+ passWithNoTests: true,
11
+ poolOptions: {
12
+ threads: {
13
+ singleThread: true,
14
+ },
15
+ },
16
+ },
17
+ });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3ZpdGVzdC5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3QyxlQUFlLFlBQVksQ0FBQztJQUMxQixJQUFJLEVBQUU7UUFDSixPQUFPLEVBQUUsSUFBSTtRQUNiLFFBQVEsRUFBRTtZQUNSLEdBQUcsRUFBRSxJQUFJO1lBQ1QsUUFBUSxFQUFFLFVBQVU7WUFDcEIsUUFBUSxFQUFFLFdBQVc7U0FDdEI7UUFDRCxlQUFlLEVBQUUsSUFBSTtRQUNyQixXQUFXLEVBQUU7WUFDWCxPQUFPLEVBQUU7Z0JBQ1AsWUFBWSxFQUFFLElBQUk7YUFDbkI7U0FDRjtLQUNGO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZXN0L2NvbmZpZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHRlc3Q6IHtcbiAgICBnbG9iYWxzOiB0cnVlLFxuICAgIGNvdmVyYWdlOiB7XG4gICAgICBhbGw6IHRydWUsXG4gICAgICBwcm92aWRlcjogJ2lzdGFuYnVsJyxcbiAgICAgIHJlcG9ydGVyOiAnY29iZXJ0dXJhJyxcbiAgICB9LFxuICAgIHBhc3NXaXRoTm9UZXN0czogdHJ1ZSxcbiAgICBwb29sT3B0aW9uczoge1xuICAgICAgdGhyZWFkczoge1xuICAgICAgICBzaW5nbGVUaHJlYWQ6IHRydWUsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiJdfQ==
package/lib/const.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export const BITCOIN_CHAIN = 'bitcoin';
2
2
  export const CARDANO_CHAIN = 'cardano';
3
3
  export const ERGO_CHAIN = 'ergo';
4
+ export const ETHEREUM_CHAIN = 'ethereum';
package/lib/decoder.ts CHANGED
@@ -1,4 +1,9 @@
1
- import { BITCOIN_CHAIN, CARDANO_CHAIN, ERGO_CHAIN } from './const';
1
+ import {
2
+ BITCOIN_CHAIN,
3
+ CARDANO_CHAIN,
4
+ ERGO_CHAIN,
5
+ ETHEREUM_CHAIN,
6
+ } from './const';
2
7
  import { UnsupportedAddressError, UnsupportedChainError } from './types';
3
8
  import * as ergoLib from 'ergo-lib-wasm-nodejs';
4
9
  import * as cardanoLib from '@emurgo/cardano-serialization-lib-nodejs';
@@ -29,6 +34,11 @@ export const decodeAddress = (
29
34
  return bitcoinLib.address.fromOutputScript(
30
35
  Buffer.from(encodedAddress, 'hex')
31
36
  );
37
+ case ETHEREUM_CHAIN:
38
+ if (encodedAddress.length != 40) {
39
+ throw new UnsupportedAddressError(chain, encodedAddress);
40
+ }
41
+ return '0x' + encodedAddress;
32
42
  default:
33
43
  throw new UnsupportedChainError(chain);
34
44
  }
package/lib/encoder.ts CHANGED
@@ -1,4 +1,9 @@
1
- import { BITCOIN_CHAIN, CARDANO_CHAIN, ERGO_CHAIN } from './const';
1
+ import {
2
+ BITCOIN_CHAIN,
3
+ CARDANO_CHAIN,
4
+ ERGO_CHAIN,
5
+ ETHEREUM_CHAIN,
6
+ } from './const';
2
7
  import { UnsupportedAddressError, UnsupportedChainError } from './types';
3
8
  import * as ergoLib from 'ergo-lib-wasm-nodejs';
4
9
  import * as cardanoLib from '@emurgo/cardano-serialization-lib-nodejs';
@@ -28,6 +33,12 @@ export const encodeAddress = (chain: string, address: string): string => {
28
33
  bitcoinLib.address.toOutputScript(address)
29
34
  ).toString('hex');
30
35
  break;
36
+ case ETHEREUM_CHAIN:
37
+ if (address.length != 42 || address.substring(0, 2) != '0x') {
38
+ throw new UnsupportedAddressError(chain, address);
39
+ }
40
+ encoded = address.substring(2);
41
+ break;
31
42
  default:
32
43
  throw new UnsupportedChainError(chain);
33
44
  }
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,38 @@
1
+ import {
2
+ BITCOIN_CHAIN,
3
+ CARDANO_CHAIN,
4
+ ERGO_CHAIN,
5
+ ETHEREUM_CHAIN,
6
+ } from './const';
7
+ import { UnsupportedAddressError, UnsupportedChainError } from './types';
8
+ import * as ergoLib from 'ergo-lib-wasm-nodejs';
9
+ import * as cardanoLib from '@emurgo/cardano-serialization-lib-nodejs';
10
+ import * as bitcoinLib from 'bitcoinjs-lib';
11
+ import * as ethereumLib from 'ethers';
12
+
13
+ /**
14
+ * validates address of a chain
15
+ * @param chain
16
+ * @param address
17
+ */
18
+ export const validateAddress = (chain: string, address: string): boolean => {
19
+ switch (chain) {
20
+ case ERGO_CHAIN:
21
+ ergoLib.Address.from_base58(address);
22
+ return true;
23
+ case CARDANO_CHAIN:
24
+ cardanoLib.Address.from_bech32(address);
25
+ return true;
26
+ case BITCOIN_CHAIN:
27
+ bitcoinLib.address.fromBech32(address);
28
+ if (address.slice(0, 4) != 'bc1q')
29
+ throw new UnsupportedAddressError(chain, address);
30
+ return true;
31
+ case ETHEREUM_CHAIN:
32
+ if (address.toLowerCase() != address || !ethereumLib.isAddress(address))
33
+ throw new UnsupportedAddressError(chain, address);
34
+ return true;
35
+ default:
36
+ throw new UnsupportedChainError(chain);
37
+ }
38
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rosen-bridge/address-codec",
3
- "version": "0.1.0",
3
+ "version": "0.2.1-6770eb",
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.26.0"
38
+ "ergo-lib-wasm-nodejs": "^0.24.1",
39
+ "ethers": "^6.13.2"
39
40
  }
40
41
  }
@@ -4,7 +4,12 @@ import {
4
4
  UnsupportedChainError,
5
5
  decodeAddress,
6
6
  } from '../lib';
7
- import { BITCOIN_CHAIN, CARDANO_CHAIN, ERGO_CHAIN } from '../lib/const';
7
+ import {
8
+ BITCOIN_CHAIN,
9
+ CARDANO_CHAIN,
10
+ ERGO_CHAIN,
11
+ ETHEREUM_CHAIN,
12
+ } from '../lib/const';
8
13
 
9
14
  describe('decodeAddress', () => {
10
15
  /**
@@ -49,6 +54,20 @@ describe('decodeAddress', () => {
49
54
  expect(res).toEqual(testData.bitcoinAddress);
50
55
  });
51
56
 
57
+ /**
58
+ * @target `decodeAddress` should decode Ethereum address successfully
59
+ * @dependencies
60
+ * @scenario
61
+ * - run test
62
+ * - check returned value
63
+ * @expected
64
+ * - it should be address in hex format
65
+ */
66
+ it('should decode Ethereum address successfully', () => {
67
+ const res = decodeAddress(ETHEREUM_CHAIN, testData.encodedEthereumAddress);
68
+ expect(res).toEqual(testData.ethereumAddress);
69
+ });
70
+
52
71
  /**
53
72
  * @target `decodeAddress` should throw error when encoded address is more than 60 bytes
54
73
  * @dependencies
@@ -4,7 +4,12 @@ import {
4
4
  UnsupportedChainError,
5
5
  encodeAddress,
6
6
  } from '../lib';
7
- import { BITCOIN_CHAIN, CARDANO_CHAIN, ERGO_CHAIN } from '../lib/const';
7
+ import {
8
+ BITCOIN_CHAIN,
9
+ CARDANO_CHAIN,
10
+ ERGO_CHAIN,
11
+ ETHEREUM_CHAIN,
12
+ } from '../lib/const';
8
13
 
9
14
  describe('encodeAddress', () => {
10
15
  /**
@@ -49,6 +54,35 @@ describe('encodeAddress', () => {
49
54
  expect(res).toEqual(testData.encodedBitcoinAddress);
50
55
  });
51
56
 
57
+ /**
58
+ * @target `encodeAddress` should encode Ethereum address successfully
59
+ * @dependencies
60
+ * @scenario
61
+ * - run test
62
+ * - check returned value
63
+ * @expected
64
+ * - it should be output script of given address in hex
65
+ */
66
+ it('should encode Ethereum address successfully', () => {
67
+ const res = encodeAddress(ETHEREUM_CHAIN, testData.ethereumAddress);
68
+ expect(res).toEqual(testData.encodedEthereumAddress);
69
+ });
70
+
71
+ /**
72
+ * @target `encodeAddress` should throw error when address is not 40 bytes
73
+ * @dependencies
74
+ * @scenario
75
+ * - run test
76
+ * - run test & check thrown exception
77
+ * @expected
78
+ * - it should throw UnsupportedAddress error
79
+ */
80
+ it('should encode Ethereum address successfully', () => {
81
+ expect(() => {
82
+ encodeAddress(ETHEREUM_CHAIN, testData.invalidEthereumAddressLength);
83
+ }).toThrow(UnsupportedAddressError);
84
+ });
85
+
52
86
  /**
53
87
  * @target `encodeAddress` should throw error when encoded address is more than 60 bytes
54
88
  * @dependencies
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 invalidBitcoinAddressLength =
17
+ 'bc1qkgp89fjerymm5ltg0hygnumr0m2qa7n22gyw6';
18
+ export const tapRootBitcoinAddress =
19
+ 'bc1pxhtmm7mjrafdkw46wc7lmjn3gyrmdm4q0dnmw8j225gxtwtq7mwqd7e24v';
12
20
  export const encodedBitcoinAddress =
13
21
  '0014b20272a6591937ba7d687dc889f3637ed40efa6a';
14
22
 
@@ -16,3 +24,11 @@ export const longErgoAddress =
16
24
  'nB3L2PD3LBtiNhDYK7XhZ8nVt6uekBXN7RcPUKgdKLXFcrJiSPxmQsUKuUkTRQ1hbvDrxEQAKYurGFbaGD1RPxU7XqQimD78j23HHMQKL1boUGsnNhCxaVNAYMcFbQNo355Af8cWkhAN6';
17
25
  export const longEncodedAddress =
18
26
  '100304000e20a6ac381e6fa99929fd1477b3ba9499790a775e91d4c14c5aa86e9a118dfac8530400d801d601b2db6501fe730000ea02d1aedb63087201d901024d0e938c720201730198b2e4c672010510730200ade4c67201041ad901020ecdee7202';
27
+
28
+ export const ethereumAddress = '0xb416c8a6d7ec94706a9ae2c26c11d320519482b1';
29
+ export const encodedEthereumAddress =
30
+ 'b416c8a6d7ec94706a9ae2c26c11d320519482b1';
31
+
32
+ export const invalidEthereumAddressLength =
33
+ '0xb416c8a7ec94706a9ae2c26c11d320519482b1';
34
+ export const invalidEthereumIcapAddress = 'XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36';
@@ -0,0 +1,164 @@
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 not validate wrong Ergo address
30
+ * @dependencies
31
+ * @scenario
32
+ * - run test
33
+ * @expected
34
+ * - not to validate wrong Ergo address
35
+ */
36
+ it('should not validate 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 not validate wrong Cardano address
57
+ * @dependencies
58
+ * @scenario
59
+ * - run test
60
+ * @expected
61
+ * - not to validate wrong Cardano address
62
+ */
63
+ it('should not validate 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 not validate Bitcoin taproot address
84
+ * @dependencies
85
+ * @scenario
86
+ * - run test
87
+ * @expected
88
+ * - not to validate Bitcoin taproot address
89
+ */
90
+ it('should not validate Bitcoin taproot address', () => {
91
+ expect(() => {
92
+ validateAddress(BITCOIN_CHAIN, testData.tapRootBitcoinAddress);
93
+ }).toThrow(UnsupportedAddressError);
94
+ });
95
+
96
+ /**
97
+ * @target `validateAddress` should not validate wrong Bitcoin address
98
+ * @dependencies
99
+ * @scenario
100
+ * - run test
101
+ * @expected
102
+ * - not to validate wrong Bitcoin address
103
+ */
104
+ it('should not validate wrong Bitcoin address', () => {
105
+ expect(() => {
106
+ validateAddress(BITCOIN_CHAIN, testData.invalidBitcoinAddressLength);
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 not validate ICAP Ethereum address
125
+ * @dependencies
126
+ * @scenario
127
+ * - run test
128
+ * @expected
129
+ * - not to validate ICAP Ethereum address
130
+ */
131
+ it('should not validate ICAP Ethereum address', () => {
132
+ expect(() => {
133
+ validateAddress(ETHEREUM_CHAIN, testData.invalidEthereumIcapAddress);
134
+ }).toThrow(UnsupportedAddressError);
135
+ });
136
+
137
+ /**
138
+ * @target `validateAddress` should not validate wrong Ethereum address
139
+ * @dependencies
140
+ * @scenario
141
+ * - run test
142
+ * @expected
143
+ * - not to validate wrong Ethereum address
144
+ */
145
+ it('should not validate wrong Ethereum address', () => {
146
+ expect(() => {
147
+ validateAddress(ETHEREUM_CHAIN, testData.invalidEthereumAddressLength);
148
+ }).toThrow(UnsupportedAddressError);
149
+ });
150
+
151
+ /**
152
+ * @target `validateAddress` should throw error when chain is not supported
153
+ * @dependencies
154
+ * @scenario
155
+ * - run test
156
+ * @expected
157
+ * - it should throw UnsupportedChain error
158
+ */
159
+ it('should throw error when chain is not supported', () => {
160
+ expect(() => {
161
+ validateAddress('unsupported-chain', '0011223344');
162
+ }).toThrow(UnsupportedChainError);
163
+ });
164
+ });