@rosen-bridge/address-codec 0.6.0-c7768928 → 0.6.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.
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../lib/validator.ts"],"names":[],"mappings":"AAgBA;;;;GAIG;AACH,eAAO,MAAM,eAAe,UAAW,MAAM,WAAW,MAAM,KAAG,OAqChE,CAAC"}
package/dist/validator.js CHANGED
@@ -1,4 +1,4 @@
1
- import { BINANCE_CHAIN, BITCOIN_CHAIN, CARDANO_CHAIN, DOGE_CHAIN, DOGE_NETWORK, ERGO_CHAIN, ETHEREUM_CHAIN, } from './const';
1
+ import { BINANCE_CHAIN, BITCOIN_CHAIN, CARDANO_CHAIN, DOGE_CHAIN, DOGE_NETWORK, ERGO_CHAIN, ETHEREUM_CHAIN, RUNES_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';
@@ -35,8 +35,18 @@ export const validateAddress = (chain, address) => {
35
35
  throw new UnsupportedAddressError(chain, address);
36
36
  }
37
37
  return true;
38
+ case RUNES_CHAIN:
39
+ try {
40
+ bitcoinLib.address.toOutputScript(address);
41
+ if (address.slice(0, 4) != 'bc1p')
42
+ throw new UnsupportedAddressError(chain, address);
43
+ }
44
+ catch (e) {
45
+ throw new UnsupportedAddressError(chain, address);
46
+ }
47
+ return true;
38
48
  default:
39
49
  throw new UnsupportedChainError(chain);
40
50
  }
41
51
  };
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixhQUFhLEVBQ2IsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsY0FBYyxHQUNmLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6RSxPQUFPLEtBQUssT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxVQUFVLE1BQU0sMENBQTBDLENBQUM7QUFDdkUsT0FBTyxLQUFLLFVBQVUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxRQUFRLENBQUM7QUFFdEM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWEsRUFBRSxPQUFlLEVBQVcsRUFBRTtJQUN6RSxRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ2QsS0FBSyxVQUFVO1lBQ2IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLGFBQWE7WUFDaEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLGFBQWE7WUFDaEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNO2dCQUMvQixNQUFNLElBQUksdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2QsS0FBSyxhQUFhLENBQUM7UUFDbkIsS0FBSyxjQUFjO1lBQ2pCLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUNyRSxNQUFNLElBQUksdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2QsS0FBSyxVQUFVO1lBQ2IsSUFBSSxDQUFDO2dCQUNILFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxNQUFNLElBQUksdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkO1lBQ0UsTUFBTSxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCSU5BTkNFX0NIQUlOLFxuICBCSVRDT0lOX0NIQUlOLFxuICBDQVJEQU5PX0NIQUlOLFxuICBET0dFX0NIQUlOLFxuICBET0dFX05FVFdPUkssXG4gIEVSR09fQ0hBSU4sXG4gIEVUSEVSRVVNX0NIQUlOLFxufSBmcm9tICcuL2NvbnN0JztcbmltcG9ydCB7IFVuc3VwcG9ydGVkQWRkcmVzc0Vycm9yLCBVbnN1cHBvcnRlZENoYWluRXJyb3IgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIGVyZ29MaWIgZnJvbSAnZXJnby1saWItd2FzbS1ub2RlanMnO1xuaW1wb3J0ICogYXMgY2FyZGFub0xpYiBmcm9tICdAZW11cmdvL2NhcmRhbm8tc2VyaWFsaXphdGlvbi1saWItbm9kZWpzJztcbmltcG9ydCAqIGFzIGJpdGNvaW5MaWIgZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgKiBhcyBldGhlcmV1bUxpYiBmcm9tICdldGhlcnMnO1xuXG4vKipcbiAqIHZhbGlkYXRlcyBhZGRyZXNzIG9mIGEgY2hhaW5cbiAqIEBwYXJhbSBjaGFpblxuICogQHBhcmFtIGFkZHJlc3NcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQWRkcmVzcyA9IChjaGFpbjogc3RyaW5nLCBhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgc3dpdGNoIChjaGFpbikge1xuICAgIGNhc2UgRVJHT19DSEFJTjpcbiAgICAgIGVyZ29MaWIuQWRkcmVzcy5mcm9tX2Jhc2U1OChhZGRyZXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgQ0FSREFOT19DSEFJTjpcbiAgICAgIGNhcmRhbm9MaWIuQWRkcmVzcy5mcm9tX2JlY2gzMihhZGRyZXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgQklUQ09JTl9DSEFJTjpcbiAgICAgIGJpdGNvaW5MaWIuYWRkcmVzcy5mcm9tQmVjaDMyKGFkZHJlc3MpO1xuICAgICAgaWYgKGFkZHJlc3Muc2xpY2UoMCwgNCkgIT0gJ2JjMXEnKVxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3IoY2hhaW4sIGFkZHJlc3MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSBCSU5BTkNFX0NIQUlOOlxuICAgIGNhc2UgRVRIRVJFVU1fQ0hBSU46XG4gICAgICBpZiAoYWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9IGFkZHJlc3MgfHwgIWV0aGVyZXVtTGliLmlzQWRkcmVzcyhhZGRyZXNzKSlcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQWRkcmVzc0Vycm9yKGNoYWluLCBhZGRyZXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgRE9HRV9DSEFJTjpcbiAgICAgIHRyeSB7XG4gICAgICAgIGJpdGNvaW5MaWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChhZGRyZXNzLCBET0dFX05FVFdPUkspO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3IoY2hhaW4sIGFkZHJlc3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZENoYWluRXJyb3IoY2hhaW4pO1xuICB9XG59O1xuIl19
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixhQUFhLEVBQ2IsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsY0FBYyxFQUNkLFdBQVcsR0FDWixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekUsT0FBTyxLQUFLLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssVUFBVSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxVQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sS0FBSyxXQUFXLE1BQU0sUUFBUSxDQUFDO0FBRXRDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFhLEVBQUUsT0FBZSxFQUFXLEVBQUU7SUFDekUsUUFBUSxLQUFLLEVBQUUsQ0FBQztRQUNkLEtBQUssVUFBVTtZQUNiLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsS0FBSyxhQUFhO1lBQ2hCLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsS0FBSyxhQUFhO1lBQ2hCLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTTtnQkFDL0IsTUFBTSxJQUFJLHVCQUF1QixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNwRCxPQUFPLElBQUksQ0FBQztRQUNkLEtBQUssYUFBYSxDQUFDO1FBQ25CLEtBQUssY0FBYztZQUNqQixJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFDckUsTUFBTSxJQUFJLHVCQUF1QixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNwRCxPQUFPLElBQUksQ0FBQztRQUNkLEtBQUssVUFBVTtZQUNiLElBQUksQ0FBQztnQkFDSCxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDM0QsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxJQUFJLHVCQUF1QixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNwRCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLFdBQVc7WUFDZCxJQUFJLENBQUM7Z0JBQ0gsVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTTtvQkFDL0IsTUFBTSxJQUFJLHVCQUF1QixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxNQUFNLElBQUksdUJBQXVCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkO1lBQ0UsTUFBTSxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCSU5BTkNFX0NIQUlOLFxuICBCSVRDT0lOX0NIQUlOLFxuICBDQVJEQU5PX0NIQUlOLFxuICBET0dFX0NIQUlOLFxuICBET0dFX05FVFdPUkssXG4gIEVSR09fQ0hBSU4sXG4gIEVUSEVSRVVNX0NIQUlOLFxuICBSVU5FU19DSEFJTixcbn0gZnJvbSAnLi9jb25zdCc7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEFkZHJlc3NFcnJvciwgVW5zdXBwb3J0ZWRDaGFpbkVycm9yIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyBlcmdvTGliIGZyb20gJ2VyZ28tbGliLXdhc20tbm9kZWpzJztcbmltcG9ydCAqIGFzIGNhcmRhbm9MaWIgZnJvbSAnQGVtdXJnby9jYXJkYW5vLXNlcmlhbGl6YXRpb24tbGliLW5vZGVqcyc7XG5pbXBvcnQgKiBhcyBiaXRjb2luTGliIGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0ICogYXMgZXRoZXJldW1MaWIgZnJvbSAnZXRoZXJzJztcblxuLyoqXG4gKiB2YWxpZGF0ZXMgYWRkcmVzcyBvZiBhIGNoYWluXG4gKiBAcGFyYW0gY2hhaW5cbiAqIEBwYXJhbSBhZGRyZXNzXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUFkZHJlc3MgPSAoY2hhaW46IHN0cmluZywgYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHN3aXRjaCAoY2hhaW4pIHtcbiAgICBjYXNlIEVSR09fQ0hBSU46XG4gICAgICBlcmdvTGliLkFkZHJlc3MuZnJvbV9iYXNlNTgoYWRkcmVzcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIENBUkRBTk9fQ0hBSU46XG4gICAgICBjYXJkYW5vTGliLkFkZHJlc3MuZnJvbV9iZWNoMzIoYWRkcmVzcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIEJJVENPSU5fQ0hBSU46XG4gICAgICBiaXRjb2luTGliLmFkZHJlc3MuZnJvbUJlY2gzMihhZGRyZXNzKTtcbiAgICAgIGlmIChhZGRyZXNzLnNsaWNlKDAsIDQpICE9ICdiYzFxJylcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQWRkcmVzc0Vycm9yKGNoYWluLCBhZGRyZXNzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgQklOQU5DRV9DSEFJTjpcbiAgICBjYXNlIEVUSEVSRVVNX0NIQUlOOlxuICAgICAgaWYgKGFkZHJlc3MudG9Mb3dlckNhc2UoKSAhPSBhZGRyZXNzIHx8ICFldGhlcmV1bUxpYi5pc0FkZHJlc3MoYWRkcmVzcykpXG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEFkZHJlc3NFcnJvcihjaGFpbiwgYWRkcmVzcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIERPR0VfQ0hBSU46XG4gICAgICB0cnkge1xuICAgICAgICBiaXRjb2luTGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgRE9HRV9ORVRXT1JLKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQWRkcmVzc0Vycm9yKGNoYWluLCBhZGRyZXNzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgUlVORVNfQ0hBSU46XG4gICAgICB0cnkge1xuICAgICAgICBiaXRjb2luTGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoYWRkcmVzcyk7XG4gICAgICAgIGlmIChhZGRyZXNzLnNsaWNlKDAsIDQpICE9ICdiYzFwJylcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3IoY2hhaW4sIGFkZHJlc3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3IoY2hhaW4sIGFkZHJlc3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZENoYWluRXJyb3IoY2hhaW4pO1xuICB9XG59O1xuIl19
package/lib/const.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export const BITCOIN_CHAIN = 'bitcoin';
2
+ export const RUNES_CHAIN = 'bitcoin-runes';
2
3
  export const CARDANO_CHAIN = 'cardano';
3
4
  export const ERGO_CHAIN = 'ergo';
4
5
  export const ETHEREUM_CHAIN = 'ethereum';
package/lib/decoder.ts CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  DOGE_NETWORK,
7
7
  ERGO_CHAIN,
8
8
  ETHEREUM_CHAIN,
9
+ RUNES_CHAIN,
9
10
  } from './const';
10
11
  import { UnsupportedAddressError, UnsupportedChainError } from './types';
11
12
  import * as ergoLib from 'ergo-lib-wasm-nodejs';
@@ -27,12 +28,13 @@ export const decodeAddress = (
27
28
  switch (chain) {
28
29
  case ERGO_CHAIN:
29
30
  return ergoLib.Address.from_public_key(
30
- Buffer.from(encodedAddress, 'hex')
31
+ Uint8Array.from(Buffer.from(encodedAddress, 'hex'))
31
32
  ).to_base58(ergoLib.NetworkPrefix.Mainnet);
32
33
  case CARDANO_CHAIN:
33
34
  return cardanoLib.Address.from_bytes(
34
- Buffer.from(encodedAddress, 'hex')
35
+ Uint8Array.from(Buffer.from(encodedAddress, 'hex'))
35
36
  ).to_bech32();
37
+ case RUNES_CHAIN:
36
38
  case BITCOIN_CHAIN:
37
39
  return bitcoinLib.address.fromOutputScript(
38
40
  Buffer.from(encodedAddress, 'hex')
package/lib/encoder.ts CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  DOGE_NETWORK,
7
7
  ERGO_CHAIN,
8
8
  ETHEREUM_CHAIN,
9
+ RUNES_CHAIN,
9
10
  } from './const';
10
11
  import { UnsupportedAddressError, UnsupportedChainError } from './types';
11
12
  import * as ergoLib from 'ergo-lib-wasm-nodejs';
@@ -31,10 +32,9 @@ export const encodeAddress = (chain: string, address: string): string => {
31
32
  cardanoLib.Address.from_bech32(address).to_bytes()
32
33
  ).toString('hex');
33
34
  break;
35
+ case RUNES_CHAIN:
34
36
  case BITCOIN_CHAIN:
35
- encoded = Buffer.from(
36
- bitcoinLib.address.toOutputScript(address)
37
- ).toString('hex');
37
+ encoded = bitcoinLib.address.toOutputScript(address).toString('hex');
38
38
  break;
39
39
  case BINANCE_CHAIN:
40
40
  case ETHEREUM_CHAIN:
package/lib/index.ts CHANGED
@@ -1,3 +1,8 @@
1
+ import * as tinySecp from 'tiny-secp256k1';
2
+ import * as bitcoinLib from 'bitcoinjs-lib';
3
+
4
+ bitcoinLib.initEccLib(tinySecp);
5
+
1
6
  export * from './encoder';
2
7
  export * from './decoder';
3
8
  export * from './types';
package/lib/validator.ts CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  DOGE_NETWORK,
7
7
  ERGO_CHAIN,
8
8
  ETHEREUM_CHAIN,
9
+ RUNES_CHAIN,
9
10
  } from './const';
10
11
  import { UnsupportedAddressError, UnsupportedChainError } from './types';
11
12
  import * as ergoLib from 'ergo-lib-wasm-nodejs';
@@ -43,6 +44,15 @@ export const validateAddress = (chain: string, address: string): boolean => {
43
44
  throw new UnsupportedAddressError(chain, address);
44
45
  }
45
46
  return true;
47
+ case RUNES_CHAIN:
48
+ try {
49
+ bitcoinLib.address.toOutputScript(address);
50
+ if (address.slice(0, 4) != 'bc1p')
51
+ throw new UnsupportedAddressError(chain, address);
52
+ } catch (e) {
53
+ throw new UnsupportedAddressError(chain, address);
54
+ }
55
+ return true;
46
56
  default:
47
57
  throw new UnsupportedChainError(chain);
48
58
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rosen-bridge/address-codec",
3
- "version": "0.6.0-c7768928",
3
+ "version": "0.6.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",
@@ -33,9 +33,10 @@
33
33
  "node": ">=20.11.0"
34
34
  },
35
35
  "dependencies": {
36
- "@emurgo/cardano-serialization-lib-nodejs": "^14.1.1",
36
+ "@emurgo/cardano-serialization-lib-nodejs": "^13.2.1",
37
37
  "bitcoinjs-lib": "^6.1.5",
38
38
  "ergo-lib-wasm-nodejs": "^0.24.1",
39
- "ethers": "^6.13.2"
39
+ "ethers": "^6.13.2",
40
+ "tiny-secp256k1": "^2.2.3"
40
41
  }
41
42
  }
@@ -10,6 +10,7 @@ import {
10
10
  DOGE_CHAIN,
11
11
  ERGO_CHAIN,
12
12
  ETHEREUM_CHAIN,
13
+ RUNES_CHAIN,
13
14
  } from '../lib/const';
14
15
 
15
16
  describe('decodeAddress', () => {
@@ -110,4 +111,21 @@ describe('decodeAddress', () => {
110
111
  const res = decodeAddress(DOGE_CHAIN, testData.encodedDogeAddress);
111
112
  expect(res).toEqual(testData.dogeAddress);
112
113
  });
114
+
115
+ /**
116
+ * @target `decodeAddress` should decode Runes address successfully
117
+ * @dependencies
118
+ * @scenario
119
+ * - run test
120
+ * - check returned value
121
+ * @expected
122
+ * - it should be address in hex format
123
+ */
124
+ it('should decode Runes address successfully', () => {
125
+ const res = decodeAddress(
126
+ RUNES_CHAIN,
127
+ testData.encodedTaprootBitcoinAddress
128
+ );
129
+ expect(res).toEqual(testData.taprootBitcoinAddress);
130
+ });
113
131
  });
@@ -10,6 +10,7 @@ import {
10
10
  DOGE_CHAIN,
11
11
  ERGO_CHAIN,
12
12
  ETHEREUM_CHAIN,
13
+ RUNES_CHAIN,
13
14
  } from '../lib/const';
14
15
 
15
16
  describe('encodeAddress', () => {
@@ -125,4 +126,18 @@ describe('encodeAddress', () => {
125
126
  const res = encodeAddress(DOGE_CHAIN, testData.dogeAddress);
126
127
  expect(res).toEqual(testData.encodedDogeAddress);
127
128
  });
129
+
130
+ /**
131
+ * @target `encodeAddress` should encode Runes address successfully
132
+ * @dependencies
133
+ * @scenario
134
+ * - run test
135
+ * - check returned value
136
+ * @expected
137
+ * - it should be output script of given address in hex
138
+ */
139
+ it('should encode Runes address successfully', () => {
140
+ const res = encodeAddress(RUNES_CHAIN, testData.taprootBitcoinAddress);
141
+ expect(res).toEqual(testData.encodedTaprootBitcoinAddress);
142
+ });
128
143
  });
package/tests/testData.ts CHANGED
@@ -15,8 +15,10 @@ export const invalidCardanoAddress =
15
15
  export const bitcoinAddress = 'bc1qkgp89fjerymm5ltg0hygnumr0m2qa7n22gyw6h';
16
16
  export const invalidBitcoinAddress =
17
17
  'bc1qkgp89fjerymm5ltg0hygnumr0m2qa7n22gyw6';
18
- export const tapRootBitcoinAddress =
19
- 'bc1pxhtmm7mjrafdkw46wc7lmjn3gyrmdm4q0dnmw8j225gxtwtq7mwqd7e24v';
18
+ export const taprootBitcoinAddress =
19
+ 'bc1px0ad45qrfwc20yfd9wljeytrvfa6tmrcxv6pgxze2svvx00tp7mstj5rpk';
20
+ export const encodedTaprootBitcoinAddress =
21
+ '512033fadad0034bb0a7912d2bbf2c9163627ba5ec7833341418595418c33deb0fb7';
20
22
  export const encodedBitcoinAddress =
21
23
  '0014b20272a6591937ba7d687dc889f3637ed40efa6a';
22
24
 
@@ -10,6 +10,7 @@ import {
10
10
  DOGE_CHAIN,
11
11
  ERGO_CHAIN,
12
12
  ETHEREUM_CHAIN,
13
+ RUNES_CHAIN,
13
14
  } from '../lib/const';
14
15
 
15
16
  describe('validateAddress', () => {
@@ -90,7 +91,7 @@ describe('validateAddress', () => {
90
91
  */
91
92
  it('should throw error for Bitcoin taproot address', () => {
92
93
  expect(() => {
93
- validateAddress(BITCOIN_CHAIN, testData.tapRootBitcoinAddress);
94
+ validateAddress(BITCOIN_CHAIN, testData.taprootBitcoinAddress);
94
95
  }).toThrow(UnsupportedAddressError);
95
96
  });
96
97
 
@@ -203,4 +204,31 @@ describe('validateAddress', () => {
203
204
  validateAddress(DOGE_CHAIN, testData.invalidDogeAddress);
204
205
  }).toThrow(UnsupportedAddressError);
205
206
  });
207
+
208
+ /**
209
+ * @target `validateAddress` should validate Runes address successfully
210
+ * @dependencies
211
+ * @scenario
212
+ * - run test
213
+ * @expected
214
+ * - to validate correct Runes address
215
+ */
216
+ it('should validate Runes address successfully', () => {
217
+ const res = validateAddress(RUNES_CHAIN, testData.taprootBitcoinAddress);
218
+ expect(res).toEqual(true);
219
+ });
220
+
221
+ /**
222
+ * @target `validateAddress` should throw error for wrong Runes address
223
+ * @dependencies
224
+ * @scenario
225
+ * - run test
226
+ * @expected
227
+ * - to throw error for wrong Runes address
228
+ */
229
+ it('should throw error for wrong Runes address', () => {
230
+ expect(() => {
231
+ validateAddress(RUNES_CHAIN, testData.bitcoinAddress);
232
+ }).toThrow(UnsupportedAddressError);
233
+ });
206
234
  });