@rosen-bridge/address-codec 0.4.1 → 0.5.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.
@@ -1 +1 @@
1
- {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../lib/validator.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,eAAO,MAAM,eAAe,UAAW,MAAM,WAAW,MAAM,KAAG,OAoBhE,CAAC"}
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../lib/validator.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,eAAO,MAAM,eAAe,UAAW,MAAM,WAAW,MAAM,KAAG,OA4BhE,CAAC"}
package/dist/validator.js CHANGED
@@ -1,4 +1,4 @@
1
- import { BITCOIN_CHAIN, CARDANO_CHAIN, ERGO_CHAIN, ETHEREUM_CHAIN, } from './const';
1
+ import { BINANCE_CHAIN, BITCOIN_CHAIN, CARDANO_CHAIN, DOGE_CHAIN, DOGE_NETWORK, ERGO_CHAIN, ETHEREUM_CHAIN, } from './const';
2
2
  import { UnsupportedAddressError, UnsupportedChainError } from './types';
3
3
  import * as ergoLib from 'ergo-lib-wasm-nodejs';
4
4
  import * as cardanoLib from '@emurgo/cardano-serialization-lib-nodejs';
@@ -22,12 +22,21 @@ export const validateAddress = (chain, address) => {
22
22
  if (address.slice(0, 4) != 'bc1q')
23
23
  throw new UnsupportedAddressError(chain, address);
24
24
  return true;
25
+ case BINANCE_CHAIN:
25
26
  case ETHEREUM_CHAIN:
26
27
  if (address.toLowerCase() != address || !ethereumLib.isAddress(address))
27
28
  throw new UnsupportedAddressError(chain, address);
28
29
  return true;
30
+ case DOGE_CHAIN:
31
+ try {
32
+ bitcoinLib.address.toOutputScript(address, DOGE_NETWORK);
33
+ }
34
+ catch (e) {
35
+ throw new UnsupportedAddressError(chain, address);
36
+ }
37
+ return true;
29
38
  default:
30
39
  throw new UnsupportedChainError(chain);
31
40
  }
32
41
  };
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixVQUFVLEVBQ1YsY0FBYyxHQUNmLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6RSxPQUFPLEtBQUssT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxVQUFVLE1BQU0sMENBQTBDLENBQUM7QUFDdkUsT0FBTyxLQUFLLFVBQVUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxRQUFRLENBQUM7QUFFdEM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWEsRUFBRSxPQUFlLEVBQVcsRUFBRTtJQUN6RSxRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ2QsS0FBSyxVQUFVO1lBQ2IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLGFBQWE7WUFDaEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLGFBQWE7WUFDaEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNO2dCQUMvQixNQUFNLElBQUksdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2QsS0FBSyxjQUFjO1lBQ2pCLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUNyRSxNQUFNLElBQUksdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2Q7WUFDRSxNQUFNLElBQUkscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJJVENPSU5fQ0hBSU4sXG4gIENBUkRBTk9fQ0hBSU4sXG4gIEVSR09fQ0hBSU4sXG4gIEVUSEVSRVVNX0NIQUlOLFxufSBmcm9tICcuL2NvbnN0JztcbmltcG9ydCB7IFVuc3VwcG9ydGVkQWRkcmVzc0Vycm9yLCBVbnN1cHBvcnRlZENoYWluRXJyb3IgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIGVyZ29MaWIgZnJvbSAnZXJnby1saWItd2FzbS1ub2RlanMnO1xuaW1wb3J0ICogYXMgY2FyZGFub0xpYiBmcm9tICdAZW11cmdvL2NhcmRhbm8tc2VyaWFsaXphdGlvbi1saWItbm9kZWpzJztcbmltcG9ydCAqIGFzIGJpdGNvaW5MaWIgZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgKiBhcyBldGhlcmV1bUxpYiBmcm9tICdldGhlcnMnO1xuXG4vKipcbiAqIHZhbGlkYXRlcyBhZGRyZXNzIG9mIGEgY2hhaW5cbiAqIEBwYXJhbSBjaGFpblxuICogQHBhcmFtIGFkZHJlc3NcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQWRkcmVzcyA9IChjaGFpbjogc3RyaW5nLCBhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgc3dpdGNoIChjaGFpbikge1xuICAgIGNhc2UgRVJHT19DSEFJTjpcbiAgICAgIGVyZ29MaWIuQWRkcmVzcy5mcm9tX2Jhc2U1OChhZGRyZXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgQ0FSREFOT19DSEFJTjpcbiAgICAgIGNhcmRhbm9MaWIuQWRkcmVzcy5mcm9tX2JlY2gzMihhZGRyZXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgQklUQ09JTl9DSEFJTjpcbiAgICAgIGJpdGNvaW5MaWIuYWRkcmVzcy5mcm9tQmVjaDMyKGFkZHJlc3MpO1xuICAgICAgaWYgKGFkZHJlc3Muc2xpY2UoMCwgNCkgIT0gJ2JjMXEnKVxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3IoY2hhaW4sIGFkZHJlc3MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSBFVEhFUkVVTV9DSEFJTjpcbiAgICAgIGlmIChhZGRyZXNzLnRvTG93ZXJDYXNlKCkgIT0gYWRkcmVzcyB8fCAhZXRoZXJldW1MaWIuaXNBZGRyZXNzKGFkZHJlc3MpKVxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3IoY2hhaW4sIGFkZHJlc3MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZENoYWluRXJyb3IoY2hhaW4pO1xuICB9XG59O1xuIl19
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixhQUFhLEVBQ2IsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsY0FBYyxHQUNmLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6RSxPQUFPLEtBQUssT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxVQUFVLE1BQU0sMENBQTBDLENBQUM7QUFDdkUsT0FBTyxLQUFLLFVBQVUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxRQUFRLENBQUM7QUFFdEM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWEsRUFBRSxPQUFlLEVBQVcsRUFBRTtJQUN6RSxRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ2QsS0FBSyxVQUFVO1lBQ2IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLGFBQWE7WUFDaEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLGFBQWE7WUFDaEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNO2dCQUMvQixNQUFNLElBQUksdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2QsS0FBSyxhQUFhLENBQUM7UUFDbkIsS0FBSyxjQUFjO1lBQ2pCLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUNyRSxNQUFNLElBQUksdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2QsS0FBSyxVQUFVO1lBQ2IsSUFBSSxDQUFDO2dCQUNILFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxNQUFNLElBQUksdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkO1lBQ0UsTUFBTSxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCSU5BTkNFX0NIQUlOLFxuICBCSVRDT0lOX0NIQUlOLFxuICBDQVJEQU5PX0NIQUlOLFxuICBET0dFX0NIQUlOLFxuICBET0dFX05FVFdPUkssXG4gIEVSR09fQ0hBSU4sXG4gIEVUSEVSRVVNX0NIQUlOLFxufSBmcm9tICcuL2NvbnN0JztcbmltcG9ydCB7IFVuc3VwcG9ydGVkQWRkcmVzc0Vycm9yLCBVbnN1cHBvcnRlZENoYWluRXJyb3IgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIGVyZ29MaWIgZnJvbSAnZXJnby1saWItd2FzbS1ub2RlanMnO1xuaW1wb3J0ICogYXMgY2FyZGFub0xpYiBmcm9tICdAZW11cmdvL2NhcmRhbm8tc2VyaWFsaXphdGlvbi1saWItbm9kZWpzJztcbmltcG9ydCAqIGFzIGJpdGNvaW5MaWIgZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgKiBhcyBldGhlcmV1bUxpYiBmcm9tICdldGhlcnMnO1xuXG4vKipcbiAqIHZhbGlkYXRlcyBhZGRyZXNzIG9mIGEgY2hhaW5cbiAqIEBwYXJhbSBjaGFpblxuICogQHBhcmFtIGFkZHJlc3NcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQWRkcmVzcyA9IChjaGFpbjogc3RyaW5nLCBhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgc3dpdGNoIChjaGFpbikge1xuICAgIGNhc2UgRVJHT19DSEFJTjpcbiAgICAgIGVyZ29MaWIuQWRkcmVzcy5mcm9tX2Jhc2U1OChhZGRyZXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgQ0FSREFOT19DSEFJTjpcbiAgICAgIGNhcmRhbm9MaWIuQWRkcmVzcy5mcm9tX2JlY2gzMihhZGRyZXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgQklUQ09JTl9DSEFJTjpcbiAgICAgIGJpdGNvaW5MaWIuYWRkcmVzcy5mcm9tQmVjaDMyKGFkZHJlc3MpO1xuICAgICAgaWYgKGFkZHJlc3Muc2xpY2UoMCwgNCkgIT0gJ2JjMXEnKVxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3IoY2hhaW4sIGFkZHJlc3MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSBCSU5BTkNFX0NIQUlOOlxuICAgIGNhc2UgRVRIRVJFVU1fQ0hBSU46XG4gICAgICBpZiAoYWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9IGFkZHJlc3MgfHwgIWV0aGVyZXVtTGliLmlzQWRkcmVzcyhhZGRyZXNzKSlcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQWRkcmVzc0Vycm9yKGNoYWluLCBhZGRyZXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgRE9HRV9DSEFJTjpcbiAgICAgIHRyeSB7XG4gICAgICAgIGJpdGNvaW5MaWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChhZGRyZXNzLCBET0dFX05FVFdPUkspO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3IoY2hhaW4sIGFkZHJlc3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZENoYWluRXJyb3IoY2hhaW4pO1xuICB9XG59O1xuIl19
@@ -4,15 +4,15 @@ export default defineConfig({
4
4
  globals: true,
5
5
  coverage: {
6
6
  all: true,
7
+ reporter: ['cobertura', 'lcov', 'text', 'text-summary'],
7
8
  provider: 'istanbul',
8
- reporter: 'cobertura',
9
+ include: ['src'],
9
10
  },
10
- passWithNoTests: true,
11
11
  poolOptions: {
12
- threads: {
13
- singleThread: true,
12
+ forks: {
13
+ singleFork: true,
14
14
  },
15
15
  },
16
16
  },
17
17
  });
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3ZpdGVzdC5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3QyxlQUFlLFlBQVksQ0FBQztJQUMxQixJQUFJLEVBQUU7UUFDSixPQUFPLEVBQUUsSUFBSTtRQUNiLFFBQVEsRUFBRTtZQUNSLEdBQUcsRUFBRSxJQUFJO1lBQ1QsUUFBUSxFQUFFLFVBQVU7WUFDcEIsUUFBUSxFQUFFLFdBQVc7U0FDdEI7UUFDRCxlQUFlLEVBQUUsSUFBSTtRQUNyQixXQUFXLEVBQUU7WUFDWCxPQUFPLEVBQUU7Z0JBQ1AsWUFBWSxFQUFFLElBQUk7YUFDbkI7U0FDRjtLQUNGO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZXN0L2NvbmZpZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHRlc3Q6IHtcbiAgICBnbG9iYWxzOiB0cnVlLFxuICAgIGNvdmVyYWdlOiB7XG4gICAgICBhbGw6IHRydWUsXG4gICAgICBwcm92aWRlcjogJ2lzdGFuYnVsJyxcbiAgICAgIHJlcG9ydGVyOiAnY29iZXJ0dXJhJyxcbiAgICB9LFxuICAgIHBhc3NXaXRoTm9UZXN0czogdHJ1ZSxcbiAgICBwb29sT3B0aW9uczoge1xuICAgICAgdGhyZWFkczoge1xuICAgICAgICBzaW5nbGVUaHJlYWQ6IHRydWUsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiJdfQ==
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3ZpdGVzdC5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3QyxlQUFlLFlBQVksQ0FBQztJQUMxQixJQUFJLEVBQUU7UUFDSixPQUFPLEVBQUUsSUFBSTtRQUNiLFFBQVEsRUFBRTtZQUNSLEdBQUcsRUFBRSxJQUFJO1lBQ1QsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO1lBQ3ZELFFBQVEsRUFBRSxVQUFVO1lBQ3BCLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQztTQUNqQjtRQUNELFdBQVcsRUFBRTtZQUNYLEtBQUssRUFBRTtnQkFDTCxVQUFVLEVBQUUsSUFBSTthQUNqQjtTQUNGO0tBQ0Y7Q0FDRixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlc3QvY29uZmlnJztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgdGVzdDoge1xuICAgIGdsb2JhbHM6IHRydWUsXG4gICAgY292ZXJhZ2U6IHtcbiAgICAgIGFsbDogdHJ1ZSxcbiAgICAgIHJlcG9ydGVyOiBbJ2NvYmVydHVyYScsICdsY292JywgJ3RleHQnLCAndGV4dC1zdW1tYXJ5J10sXG4gICAgICBwcm92aWRlcjogJ2lzdGFuYnVsJyxcbiAgICAgIGluY2x1ZGU6IFsnc3JjJ10sXG4gICAgfSxcbiAgICBwb29sT3B0aW9uczoge1xuICAgICAgZm9ya3M6IHtcbiAgICAgICAgc2luZ2xlRm9yazogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pO1xuIl19
package/lib/const.ts CHANGED
@@ -3,3 +3,17 @@ export const CARDANO_CHAIN = 'cardano';
3
3
  export const ERGO_CHAIN = 'ergo';
4
4
  export const ETHEREUM_CHAIN = 'ethereum';
5
5
  export const BINANCE_CHAIN = 'binance';
6
+ export const DOGE_CHAIN = 'doge';
7
+
8
+ export const DOGE_NETWORK = {
9
+ // Doge network parameters
10
+ messagePrefix: '\x19Dogecoin Signed Message:\n',
11
+ bech32: 'dc',
12
+ bip32: {
13
+ public: 0x02facafd,
14
+ private: 0x02fac398,
15
+ },
16
+ pubKeyHash: 0x1e,
17
+ scriptHash: 0x16,
18
+ wif: 0x9e,
19
+ };
package/lib/decoder.ts CHANGED
@@ -2,6 +2,8 @@ import {
2
2
  BINANCE_CHAIN,
3
3
  BITCOIN_CHAIN,
4
4
  CARDANO_CHAIN,
5
+ DOGE_CHAIN,
6
+ DOGE_NETWORK,
5
7
  ERGO_CHAIN,
6
8
  ETHEREUM_CHAIN,
7
9
  } from './const';
@@ -40,7 +42,13 @@ export const decodeAddress = (
40
42
  if (encodedAddress.length != 40) {
41
43
  throw new UnsupportedAddressError(chain, encodedAddress);
42
44
  }
45
+
43
46
  return '0x' + encodedAddress;
47
+ case DOGE_CHAIN:
48
+ return bitcoinLib.address.fromOutputScript(
49
+ Buffer.from(encodedAddress, 'hex'),
50
+ DOGE_NETWORK
51
+ );
44
52
  default:
45
53
  throw new UnsupportedChainError(chain);
46
54
  }
package/lib/encoder.ts CHANGED
@@ -2,6 +2,8 @@ import {
2
2
  BINANCE_CHAIN,
3
3
  BITCOIN_CHAIN,
4
4
  CARDANO_CHAIN,
5
+ DOGE_CHAIN,
6
+ DOGE_NETWORK,
5
7
  ERGO_CHAIN,
6
8
  ETHEREUM_CHAIN,
7
9
  } from './const';
@@ -41,6 +43,11 @@ export const encodeAddress = (chain: string, address: string): string => {
41
43
  }
42
44
  encoded = address.substring(2);
43
45
  break;
46
+ case DOGE_CHAIN:
47
+ encoded = bitcoinLib.address
48
+ .toOutputScript(address, DOGE_NETWORK)
49
+ .toString('hex');
50
+ break;
44
51
  default:
45
52
  throw new UnsupportedChainError(chain);
46
53
  }
package/lib/validator.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  import {
2
+ BINANCE_CHAIN,
2
3
  BITCOIN_CHAIN,
3
4
  CARDANO_CHAIN,
5
+ DOGE_CHAIN,
6
+ DOGE_NETWORK,
4
7
  ERGO_CHAIN,
5
8
  ETHEREUM_CHAIN,
6
9
  } from './const';
@@ -28,10 +31,18 @@ export const validateAddress = (chain: string, address: string): boolean => {
28
31
  if (address.slice(0, 4) != 'bc1q')
29
32
  throw new UnsupportedAddressError(chain, address);
30
33
  return true;
34
+ case BINANCE_CHAIN:
31
35
  case ETHEREUM_CHAIN:
32
36
  if (address.toLowerCase() != address || !ethereumLib.isAddress(address))
33
37
  throw new UnsupportedAddressError(chain, address);
34
38
  return true;
39
+ case DOGE_CHAIN:
40
+ try {
41
+ bitcoinLib.address.toOutputScript(address, DOGE_NETWORK);
42
+ } catch (e) {
43
+ throw new UnsupportedAddressError(chain, address);
44
+ }
45
+ return true;
35
46
  default:
36
47
  throw new UnsupportedChainError(chain);
37
48
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rosen-bridge/address-codec",
3
- "version": "0.4.1",
3
+ "version": "0.5.1",
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",
@@ -10,7 +10,7 @@
10
10
  "types": "dist/index.d.ts",
11
11
  "scripts": {
12
12
  "build": "tsc --build tsconfig.build.json",
13
- "coverage": "npm run test -- --coverage",
13
+ "coverage": "npm run test -- --run --coverage",
14
14
  "lint": "eslint --fix . && npm run prettify",
15
15
  "prettify": "prettier --write . --ignore-path ./.gitignore",
16
16
  "release": "npm run test -- --run && npm run build && npm publish --access public",
@@ -21,13 +21,13 @@
21
21
  "@types/node": "^20.11.9",
22
22
  "@typescript-eslint/eslint-plugin": "^6.19.1",
23
23
  "@typescript-eslint/parser": "^6.19.1",
24
- "@vitest/coverage-istanbul": "^1.2.2",
24
+ "@vitest/coverage-istanbul": "^2.0.5",
25
25
  "eslint": "^8.56.0",
26
26
  "eslint-config-prettier": "^9.1.0",
27
27
  "extensionless": "^1.9.6",
28
28
  "prettier": "^3.2.4",
29
29
  "typescript": "^5.3.3",
30
- "vitest": "^1.2.2"
30
+ "vitest": "^2.0.5"
31
31
  },
32
32
  "engines": {
33
33
  "node": ">=20.11.0"
@@ -7,6 +7,7 @@ import {
7
7
  import {
8
8
  BITCOIN_CHAIN,
9
9
  CARDANO_CHAIN,
10
+ DOGE_CHAIN,
10
11
  ERGO_CHAIN,
11
12
  ETHEREUM_CHAIN,
12
13
  } from '../lib/const';
@@ -95,4 +96,18 @@ describe('decodeAddress', () => {
95
96
  decodeAddress('unsupported-chain', '0011223344');
96
97
  }).toThrow(UnsupportedChainError);
97
98
  });
99
+
100
+ /**
101
+ * @target `decodeAddress` should decode Doge address successfully
102
+ * @dependencies
103
+ * @scenario
104
+ * - run test
105
+ * - check returned value
106
+ * @expected
107
+ * - it should be address in hex format
108
+ */
109
+ it('should decode Doge address successfully', () => {
110
+ const res = decodeAddress(DOGE_CHAIN, testData.encodedDogeAddress);
111
+ expect(res).toEqual(testData.dogeAddress);
112
+ });
98
113
  });
@@ -7,6 +7,7 @@ import {
7
7
  import {
8
8
  BITCOIN_CHAIN,
9
9
  CARDANO_CHAIN,
10
+ DOGE_CHAIN,
10
11
  ERGO_CHAIN,
11
12
  ETHEREUM_CHAIN,
12
13
  } from '../lib/const';
@@ -110,4 +111,18 @@ describe('encodeAddress', () => {
110
111
  encodeAddress('unsupported-chain', 'address');
111
112
  }).toThrow(UnsupportedChainError);
112
113
  });
114
+
115
+ /**
116
+ * @target `encodeAddress` should encode Doge address successfully
117
+ * @dependencies
118
+ * @scenario
119
+ * - run test
120
+ * - check returned value
121
+ * @expected
122
+ * - it should be output script of given address in hex
123
+ */
124
+ it('should encode Doge address successfully', () => {
125
+ const res = encodeAddress(DOGE_CHAIN, testData.dogeAddress);
126
+ expect(res).toEqual(testData.encodedDogeAddress);
127
+ });
113
128
  });
package/tests/testData.ts CHANGED
@@ -34,3 +34,8 @@ export const invalidEthereumAddressLength =
34
34
  export const invalidEthereumIcapAddress = 'XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36';
35
35
  export const invalidEthereumChecksumAddress =
36
36
  '0x4838B106FCe9647Bdf1E7877BF73cE8B0BAD5f97';
37
+
38
+ export const dogeAddress = 'A69cznKpaYVWjzU3sNFZnGhbpSmUVFzvHB';
39
+ export const invalidDogeAddress = 'bc1qkgp89fjerymm5ltg0hygnumr0m2qa7n22gyw6h';
40
+ export const encodedDogeAddress =
41
+ 'a914966ba9f4755996c3d51025d53044b415121bc10287';
@@ -7,6 +7,7 @@ import {
7
7
  import {
8
8
  BITCOIN_CHAIN,
9
9
  CARDANO_CHAIN,
10
+ DOGE_CHAIN,
10
11
  ERGO_CHAIN,
11
12
  ETHEREUM_CHAIN,
12
13
  } from '../lib/const';
@@ -175,4 +176,31 @@ describe('validateAddress', () => {
175
176
  validateAddress('unsupported-chain', '0011223344');
176
177
  }).toThrow(UnsupportedChainError);
177
178
  });
179
+
180
+ /**
181
+ * @target `validateAddress` should validate Doge address successfully
182
+ * @dependencies
183
+ * @scenario
184
+ * - run test
185
+ * @expected
186
+ * - to validate correct Doge address
187
+ */
188
+ it('should validate Doge address successfully', () => {
189
+ const res = validateAddress(DOGE_CHAIN, testData.dogeAddress);
190
+ expect(res).toEqual(true);
191
+ });
192
+
193
+ /**
194
+ * @target `validateAddress` should throw error for wrong Doge address
195
+ * @dependencies
196
+ * @scenario
197
+ * - run test
198
+ * @expected
199
+ * - to throw error for wrong Doge address
200
+ */
201
+ it('should throw error for wrong Doge address', () => {
202
+ expect(() => {
203
+ validateAddress(DOGE_CHAIN, testData.invalidDogeAddress);
204
+ }).toThrow(UnsupportedAddressError);
205
+ });
178
206
  });