@samyan/hd-wallet 1.0.4 → 1.1.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,29 +1,28 @@
1
- {
2
- "presets": [
3
- [
4
- "@babel/preset-env",
5
- {
6
- "targets": {
7
- "node": "current"
8
- }
9
- }
10
- ],
11
- "@babel/preset-typescript",
12
- "minify"
13
- ],
14
- "plugins": [
15
- [
16
- "@babel/plugin-proposal-decorators",
17
- {
18
- "legacy": true
19
- }
20
- ],
21
- [
22
- "@babel/plugin-transform-runtime",
23
- {
24
- "regenerator": true
25
- }
26
- ],
27
- "@babel/plugin-proposal-class-properties"
28
- ]
29
- }
1
+ {
2
+ "presets": [
3
+ [
4
+ "@babel/preset-env",
5
+ {
6
+ "targets": {
7
+ "node": "current"
8
+ }
9
+ }
10
+ ],
11
+ "@babel/preset-typescript",
12
+ "minify"
13
+ ],
14
+ "plugins": [
15
+ [
16
+ "@babel/plugin-proposal-decorators",
17
+ {
18
+ "version": "2023-11"
19
+ }
20
+ ],
21
+ [
22
+ "@babel/plugin-transform-runtime"
23
+ ],
24
+ [
25
+ "@babel/plugin-transform-class-properties"
26
+ ]
27
+ ]
28
+ }
package/build/index.d.ts CHANGED
@@ -1,63 +1,63 @@
1
- declare class HDWallet {
2
- private segwitParameters;
3
- private rootKey;
4
- private accountExtendedKey;
5
- private protocol;
6
- private mnemonicWord;
7
- private includePrivateKey;
8
- private seed;
9
- private log;
10
- /**
11
- * Constructor
12
- *
13
- * @param {string} protocol
14
- * @param {string} mnemonicWord
15
- * @param {boolean} [includePrivateKey=false]
16
- * @param {boolean} [log=false]
17
- * @memberof HDWallet
18
- */
19
- constructor(protocol: string, mnemonicWord: string, includePrivateKey?: boolean, log?: boolean);
20
- /**
21
- * Generate
22
- *
23
- * @param {string} path
24
- * @param {number} index
25
- * @return {*} {string}
26
- * @memberof HDWallet
27
- */
28
- generate(path: string, index: number): {
29
- address: string;
30
- publicKey: string;
31
- privateKey?: string;
32
- };
33
- /**
34
- * Calculate bip32 extended key by root key
35
- *
36
- * @private
37
- * @param {BIP32Interface} bip32RootKey
38
- * @param {string} path
39
- * @return {*} {BIP32Interface}
40
- * @memberof HDWallet
41
- */
42
- private calcBip32ExtendedKey;
43
- /**
44
- * Convert address to Ripple address
45
- *
46
- * @private
47
- * @param {string} address
48
- * @return {*} {string}
49
- * @memberof HDWallet
50
- */
51
- private convertRippleAdrr;
52
- /**
53
- * Print wallet
54
- *
55
- * @private
56
- * @param {string} address
57
- * @param {string} prvKey
58
- * @param {string} pubKey
59
- * @memberof HDWallet
60
- */
61
- private printWallet;
62
- }
63
- export default HDWallet;
1
+ declare class HDWallet {
2
+ private segwitParameters;
3
+ private rootKey;
4
+ private accountExtendedKey;
5
+ private protocol;
6
+ private mnemonicWord;
7
+ private includePrivateKey;
8
+ private seed;
9
+ private log;
10
+ /**
11
+ * Constructor
12
+ *
13
+ * @param {string} protocol
14
+ * @param {string} mnemonicWord
15
+ * @param {boolean} [includePrivateKey=false]
16
+ * @param {boolean} [log=false]
17
+ * @memberof HDWallet
18
+ */
19
+ constructor(protocol: string, mnemonicWord: string, includePrivateKey?: boolean, log?: boolean);
20
+ /**
21
+ * Generate
22
+ *
23
+ * @param {string} path
24
+ * @param {number} index
25
+ * @return {*} {string}
26
+ * @memberof HDWallet
27
+ */
28
+ generate(path: string, index: number): {
29
+ address: string;
30
+ publicKey: string;
31
+ privateKey?: string;
32
+ };
33
+ /**
34
+ * Calculate bip32 extended key by root key
35
+ *
36
+ * @private
37
+ * @param {BIP32Interface} bip32RootKey
38
+ * @param {string} path
39
+ * @return {*} {BIP32Interface}
40
+ * @memberof HDWallet
41
+ */
42
+ private calcBip32ExtendedKey;
43
+ /**
44
+ * Convert address to Ripple address
45
+ *
46
+ * @private
47
+ * @param {string} address
48
+ * @return {*} {string}
49
+ * @memberof HDWallet
50
+ */
51
+ private convertRippleAdrr;
52
+ /**
53
+ * Print wallet
54
+ *
55
+ * @private
56
+ * @param {string} address
57
+ * @param {string} prvKey
58
+ * @param {string} pubKey
59
+ * @memberof HDWallet
60
+ */
61
+ private printWallet;
62
+ }
63
+ export default HDWallet;
package/build/index.js CHANGED
@@ -1,53 +1,61 @@
1
- "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty")),_baseX=_interopRequireDefault(require("base-x")),_bip=_interopRequireDefault(require("bip32")),_bip2=require("bip39"),_bitcoinjsLib=require("bitcoinjs-lib"),_ethereumjsUtil=require("ethereumjs-util"),_ethereumjsWallet=require("ethereumjs-wallet"),ecc=_interopRequireWildcard(require("tiny-secp256k1"));function _getRequireWildcardCache(a){if("function"!=typeof WeakMap)return null;var b=new WeakMap,c=new WeakMap;return(_getRequireWildcardCache=function(a){return a?c:b})(a)}function _interopRequireWildcard(a,b){if(!b&&a&&a.__esModule)return a;if(null===a||"object"!=typeof a&&"function"!=typeof a)return{default:a};var c=_getRequireWildcardCache(b);if(c&&c.has(a))return c.get(a);var d={},e=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var f in a)if("default"!=f&&Object.prototype.hasOwnProperty.call(a,f)){var g=e?Object.getOwnPropertyDescriptor(a,f):null;g&&(g.get||g.set)?Object.defineProperty(d,f,g):d[f]=a[f]}return d.default=a,c&&c.set(a,d),d}class HDWallet{/**
2
- * Constructor
3
- *
4
- * @param {string} protocol
5
- * @param {string} mnemonicWord
6
- * @param {boolean} [includePrivateKey=false]
7
- * @param {boolean} [log=false]
8
- * @memberof HDWallet
9
- */constructor(a,b,c=!1,d=!1){(0,_defineProperty2.default)(this,"segwitParameters",{bitcoin:{messagePrefix:"\x18Bitcoin Signed Message:\n",bech32:"bc",bip32:{public:78792518,private:78791436},pubKeyHash:0,scriptHash:5,wif:128},bitcoinRegTest:{messagePrefix:"\x18Bitcoin Signed Message:\n",bech32:"bcrt",bip32:{public:70617039,private:70615956},pubKeyHash:111,scriptHash:196,wif:239},litecoin:{messagePrefix:"\x19Litecoin Signed Message:\n",bech32:"ltc",bip32:{public:78792518,private:78791436},pubKeyHash:48,scriptHash:50,wif:176}}),(0,_defineProperty2.default)(this,"rootKey",void 0),(0,_defineProperty2.default)(this,"accountExtendedKey",void 0),(0,_defineProperty2.default)(this,"protocol",void 0),(0,_defineProperty2.default)(this,"mnemonicWord",void 0),(0,_defineProperty2.default)(this,"includePrivateKey",void 0),(0,_defineProperty2.default)(this,"seed",void 0),(0,_defineProperty2.default)(this,"log",void 0),this.protocol=a,this.mnemonicWord=b,this.includePrivateKey=c,this.seed=(0,_bip2.mnemonicToSeedSync)(this.mnemonicWord),this.log=d}/**
10
- * Generate
11
- *
12
- * @param {string} path
13
- * @param {number} index
14
- * @return {*} {string}
15
- * @memberof HDWallet
1
+ "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty")),_util=require("@ethereumjs/util"),_baseX=_interopRequireDefault(require("base-x")),_bip=_interopRequireDefault(require("bip32")),_bip2=require("bip39"),_bitcoinjsLib=require("bitcoinjs-lib"),_hdkey=_interopRequireDefault(require("hdkey")),ecc=_interopRequireWildcard(require("tiny-secp256k1"));function _interopRequireWildcard(a,b){if("function"==typeof WeakMap)var c=new WeakMap,d=new WeakMap;return(_interopRequireWildcard=function(a,b){if(!b&&a&&a.__esModule)return a;var e,g,h={__proto__:null,default:a};if(null===a||"object"!=typeof a&&"function"!=typeof a)return h;if(e=b?d:c){if(e.has(a))return e.get(a);e.set(a,h)}for(const c in a)"default"!=c&&{}.hasOwnProperty.call(a,c)&&((g=(e=Object.defineProperty)&&Object.getOwnPropertyDescriptor(a,c))&&(g.get||g.set)?e(h,c,g):h[c]=a[c]);return h})(a,b)}class HDWallet{/**
2
+ * Constructor
3
+ *
4
+ * @param {string} protocol
5
+ * @param {string} mnemonicWord
6
+ * @param {boolean} [includePrivateKey=false]
7
+ * @param {boolean} [log=false]
8
+ * @memberof HDWallet
9
+ */constructor(a,b,c=!1,d=!1){(0,_defineProperty2.default)(this,"segwitParameters",{bitcoin:{messagePrefix:"\x18Bitcoin Signed Message:\n",bech32:"bc",bip32:{public:78792518,private:78791436},pubKeyHash:0,scriptHash:5,wif:128},bitcoinRegTest:{messagePrefix:"\x18Bitcoin Signed Message:\n",bech32:"bcrt",bip32:{public:70617039,private:70615956},pubKeyHash:111,scriptHash:196,wif:239},litecoin:{messagePrefix:"\x19Litecoin Signed Message:\n",bech32:"ltc",bip32:{public:78792518,private:78791436},pubKeyHash:48,scriptHash:50,wif:176}}),(0,_defineProperty2.default)(this,"rootKey",void 0),(0,_defineProperty2.default)(this,"accountExtendedKey",void 0),(0,_defineProperty2.default)(this,"protocol",void 0),(0,_defineProperty2.default)(this,"mnemonicWord",void 0),(0,_defineProperty2.default)(this,"includePrivateKey",void 0),(0,_defineProperty2.default)(this,"seed",void 0),(0,_defineProperty2.default)(this,"log",void 0),this.protocol=a,this.mnemonicWord=b,this.includePrivateKey=c,this.seed=(0,_bip2.mnemonicToSeedSync)(this.mnemonicWord),this.log=d}/**
10
+ * Generate
11
+ *
12
+ * @param {string} path
13
+ * @param {number} index
14
+ * @return {*} {string}
15
+ * @memberof HDWallet
16
16
  */generate(a,b){// Concatenamos
17
17
  const c="m/"+a;this.log&&(console.log("========================="),console.log("Mnemonic: %s",this.mnemonicWord),console.log("HD Path: %s\r\n",c));// Obtenemos la red si es el caso
18
18
  const d=this.segwitParameters[this.protocol],e=(0,_bip.default)(ecc);// Instanciamos
19
+ // Obtenemos la root key
19
20
  if(this.rootKey=e.fromSeed(this.seed,d),this.accountExtendedKey=this.calcBip32ExtendedKey(this.rootKey,c),this.log){// Obtenemos la clave privada y pública
20
21
  const a=this.accountExtendedKey.toBase58(),b=this.accountExtendedKey.neutered().toBase58();console.log("Account Extended Private Key: %s \r\nAccount Extended Public Key: %s\r\n",a,b)}// Obtenemos el wallet
21
22
  const f=this.accountExtendedKey.derive(b);switch(this.protocol){case"bitcoin":case"bitcoinRegTest":case"litecoin":{// Extraemos la dirección
22
- const{address:a}=_bitcoinjsLib.payments.p2wpkh({pubkey:f.publicKey,network:d}),b=f.publicKey.toString("hex");// Obtenemos la clave pública
23
+ const{address:a}=_bitcoinjsLib.payments.p2wpkh({pubkey:f.publicKey,network:d}),b=f.publicKey.toString();// Obtenemos la clave pública
23
24
  return this.log&&this.printWallet(a,f.toWIF(),b),this.includePrivateKey?{address:a,publicKey:b,privateKey:f.toWIF()}:{address:a,publicKey:b}}case"ethereum":{// Obtenemos el wallet
24
- const a=_ethereumjsWallet.hdkey.fromMasterSeed(this.seed).derivePath(c).deriveChild(b).getWallet(),d=a.getPublicKeyString(),e=a.getPrivateKeyString(),f=a.getAddressString();// Obtenemos la clave pública
25
- return this.log&&this.printWallet(f,e,d),this.includePrivateKey?{address:f,publicKey:d,privateKey:e}:{address:f,publicKey:d}}case"ripple":{// Extraemos la dirección
26
- const{address:a}=_bitcoinjsLib.payments.p2pkh({pubkey:f.publicKey}),b=f.publicKey.toString("hex"),c=f.privateKey.toString("hex"),d=this.convertRippleAdrr(a);// Obtenemos la clave pública
25
+ const a=_hdkey.default.fromMasterSeed(this.seed).derive(c).deriveChild(b),d="0x"+a.publicKey.toString("hex"),e="0x"+a.privateKey.toString("hex"),f=(0,_util.publicToAddress)(a.publicKey,!0),g=(0,_util.toChecksumAddress)("0x"+Buffer.from(f).toString("hex"));// Obtenemos la clave pública
26
+ // Obtenemos la clave privada
27
+ // Obtenemos la dirección
28
+ return this.log&&this.printWallet(g,e,d),this.includePrivateKey?{address:g,publicKey:d,privateKey:e}:{address:g,publicKey:d}}case"ripple":{// Extraemos la dirección
29
+ const{address:a}=_bitcoinjsLib.payments.p2pkh({pubkey:f.publicKey}),b=f.publicKey.toString(),c=f.privateKey.toString(),d=this.convertRippleAdrr(a);// Obtenemos la clave pública
30
+ // Obtenemos la clave privada
31
+ // Obtenemos la dirección
27
32
  return this.log&&this.printWallet(d,c,b),this.includePrivateKey?{address:d,publicKey:b,privateKey:c}:{address:d,publicKey:b}}case"tron":{// Obtenemos la clave pública en formato de ethereum
28
- const a=(0,_ethereumjsUtil.importPublic)(f.publicKey),b=f.publicKey.toString("hex"),c=f.privateKey.toString("hex"),d=(0,_ethereumjsUtil.publicToAddress)(a),e=_bitcoinjsLib.address.toBase58Check(d,65);// Obtenemos la clave pública
29
- return this.log&&this.printWallet(e,c,f.publicKey.toString("hex")),this.includePrivateKey?{address:e,publicKey:b,privateKey:c}:{address:e,publicKey:b}}}}/**
30
- * Calculate bip32 extended key by root key
31
- *
32
- * @private
33
- * @param {BIP32Interface} bip32RootKey
34
- * @param {string} path
35
- * @return {*} {BIP32Interface}
36
- * @memberof HDWallet
37
- */calcBip32ExtendedKey(a,b){let c=a;const d=b.split("/");for(let e=0;e<d.length;e++){const a=d[e],b=parseInt(a);if(isNaN(b))continue;const f="'"===a[a.length-1];c=f?c.deriveHardened(b):c.derive(b)}return c}/**
38
- * Convert address to Ripple address
39
- *
40
- * @private
41
- * @param {string} address
42
- * @return {*} {string}
43
- * @memberof HDWallet
44
- */convertRippleAdrr(a){return(0,_baseX.default)("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz").encode((0,_baseX.default)("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz").decode(a))}/**
45
- * Print wallet
46
- *
47
- * @private
48
- * @param {string} address
49
- * @param {string} prvKey
50
- * @param {string} pubKey
51
- * @memberof HDWallet
52
- */printWallet(a,b,c){console.log("Address: %s \r\nPrivate Key: %s \r\nPublic Key: %s \r\n=========================\r\n\r\n",a,b,c)}}var _default=HDWallet;exports.default=_default;
53
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJIRFdhbGxldCIsImNvbnN0cnVjdG9yIiwicHJvdG9jb2wiLCJtbmVtb25pY1dvcmQiLCJpbmNsdWRlUHJpdmF0ZUtleSIsImxvZyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiYml0Y29pbiIsIm1lc3NhZ2VQcmVmaXgiLCJiZWNoMzIiLCJiaXAzMiIsInB1YmxpYyIsInByaXZhdGUiLCJwdWJLZXlIYXNoIiwic2NyaXB0SGFzaCIsIndpZiIsImJpdGNvaW5SZWdUZXN0IiwibGl0ZWNvaW4iLCJzZWVkIiwibW5lbW9uaWNUb1NlZWRTeW5jIiwiZ2VuZXJhdGUiLCJwYXRoIiwiaW5kZXgiLCJoZFBhdGgiLCJjb25zb2xlIiwibmV0d29yayIsInNlZ3dpdFBhcmFtZXRlcnMiLCJCSVAzMkZhY3RvcnkiLCJlY2MiLCJyb290S2V5IiwiZnJvbVNlZWQiLCJhY2NvdW50RXh0ZW5kZWRLZXkiLCJjYWxjQmlwMzJFeHRlbmRlZEtleSIsImFjY291bnRYcHJ2IiwidG9CYXNlNTgiLCJhY2NvdW50WHB1YiIsIm5ldXRlcmVkIiwia2V5UGFpciIsImRlcml2ZSIsImFkZHJlc3MiLCJwMndwa2hBZGRyZXNzIiwicGF5bWVudHMiLCJwMndwa2giLCJwdWJrZXkiLCJwdWJsaWNLZXkiLCJ0b1N0cmluZyIsInByaW50V2FsbGV0IiwidG9XSUYiLCJwcml2YXRlS2V5IiwiZXRoZXJldW1XYWxsZXQiLCJoZGtleSIsImZyb21NYXN0ZXJTZWVkIiwiZGVyaXZlUGF0aCIsImRlcml2ZUNoaWxkIiwiZ2V0V2FsbGV0IiwiZ2V0UHVibGljS2V5U3RyaW5nIiwiZ2V0UHJpdmF0ZUtleVN0cmluZyIsImdldEFkZHJlc3NTdHJpbmciLCJ4cnBBZGRyZXNzIiwicDJwa2giLCJjb252ZXJ0UmlwcGxlQWRyciIsImV0aFB1YktleSIsImltcG9ydFB1YmxpYyIsImFkZHJlc3NCdWZmZXIiLCJwdWJsaWNUb0FkZHJlc3MiLCJiaXRjb2luanNBZGRyZXNzIiwidG9CYXNlNThDaGVjayIsImJpcDMyUm9vdEtleSIsImV4dGVuZGVkS2V5IiwicGF0aEJpdHMiLCJzcGxpdCIsImkiLCJsZW5ndGgiLCJiaXQiLCJwYXJzZUludCIsImlzTmFOIiwiaGFyZGVuZWQiLCJkZXJpdmVIYXJkZW5lZCIsImJhc2V4IiwiZW5jb2RlIiwiZGVjb2RlIiwicHJ2S2V5IiwicHViS2V5IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBiYXNleCBmcm9tICdiYXNlLXgnO1xyXG5pbXBvcnQgQklQMzJGYWN0b3J5LCB7IEJJUDMyQVBJLCBCSVAzMkludGVyZmFjZSB9IGZyb20gJ2JpcDMyJztcclxuaW1wb3J0IHsgbW5lbW9uaWNUb1NlZWRTeW5jIH0gZnJvbSAnYmlwMzknO1xyXG5pbXBvcnQgeyBhZGRyZXNzIGFzIGJpdGNvaW5qc0FkZHJlc3MsIHBheW1lbnRzIH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XHJcbmltcG9ydCB7IGltcG9ydFB1YmxpYywgcHVibGljVG9BZGRyZXNzIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcclxuaW1wb3J0IHsgaGRrZXkgfSBmcm9tICdldGhlcmV1bWpzLXdhbGxldCc7XHJcbmltcG9ydCAqIGFzIGVjYyBmcm9tICd0aW55LXNlY3AyNTZrMSc7XHJcblxyXG5jbGFzcyBIRFdhbGxldCB7XHJcblx0cHJpdmF0ZSBzZWd3aXRQYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge1xyXG5cdFx0Yml0Y29pbjoge1xyXG5cdFx0XHRtZXNzYWdlUHJlZml4OiAnXFx4MThCaXRjb2luIFNpZ25lZCBNZXNzYWdlOlxcbicsXHJcblx0XHRcdGJlY2gzMjogJ2JjJyxcclxuXHRcdFx0YmlwMzI6IHtcclxuXHRcdFx0XHRwdWJsaWM6IDB4MDRiMjQ3NDYsXHJcblx0XHRcdFx0cHJpdmF0ZTogMHgwNGIyNDMwYyxcclxuXHRcdFx0fSxcclxuXHRcdFx0cHViS2V5SGFzaDogMHgwMCxcclxuXHRcdFx0c2NyaXB0SGFzaDogMHgwNSxcclxuXHRcdFx0d2lmOiAweDgwLFxyXG5cdFx0fSxcclxuXHRcdGJpdGNvaW5SZWdUZXN0OiB7XHJcblx0XHRcdG1lc3NhZ2VQcmVmaXg6ICdcXHgxOEJpdGNvaW4gU2lnbmVkIE1lc3NhZ2U6XFxuJyxcclxuXHRcdFx0YmVjaDMyOiAnYmNydCcsXHJcblx0XHRcdGJpcDMyOiB7XHJcblx0XHRcdFx0cHVibGljOiAweDA0MzU4N2NmLFxyXG5cdFx0XHRcdHByaXZhdGU6IDB4MDQzNTgzOTQsXHJcblx0XHRcdH0sXHJcblx0XHRcdHB1YktleUhhc2g6IDB4NmYsXHJcblx0XHRcdHNjcmlwdEhhc2g6IDB4YzQsXHJcblx0XHRcdHdpZjogMHhlZixcclxuXHRcdH0sXHJcblx0XHRsaXRlY29pbjoge1xyXG5cdFx0XHRtZXNzYWdlUHJlZml4OiAnXFx4MTlMaXRlY29pbiBTaWduZWQgTWVzc2FnZTpcXG4nLFxyXG5cdFx0XHRiZWNoMzI6ICdsdGMnLFxyXG5cdFx0XHRiaXAzMjoge1xyXG5cdFx0XHRcdHB1YmxpYzogMHgwNGIyNDc0NixcclxuXHRcdFx0XHRwcml2YXRlOiAweDA0YjI0MzBjLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRwdWJLZXlIYXNoOiAweDMwLFxyXG5cdFx0XHRzY3JpcHRIYXNoOiAweDMyLFxyXG5cdFx0XHR3aWY6IDB4YjAsXHJcblx0XHR9LFxyXG5cdH07XHJcblxyXG5cdHByaXZhdGUgcm9vdEtleTogQklQMzJJbnRlcmZhY2U7XHJcblx0cHJpdmF0ZSBhY2NvdW50RXh0ZW5kZWRLZXk6IEJJUDMySW50ZXJmYWNlO1xyXG5cclxuXHRwcml2YXRlIHByb3RvY29sOiBzdHJpbmc7XHJcblx0cHJpdmF0ZSBtbmVtb25pY1dvcmQ6IHN0cmluZztcclxuXHRwcml2YXRlIGluY2x1ZGVQcml2YXRlS2V5OiBib29sZWFuO1xyXG5cdHByaXZhdGUgc2VlZDogQnVmZmVyO1xyXG5cclxuXHRwcml2YXRlIGxvZzogYm9vbGVhbjtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0b3JcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm90b2NvbFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtbmVtb25pY1dvcmRcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmNsdWRlUHJpdmF0ZUtleT1mYWxzZV1cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtsb2c9ZmFsc2VdXHJcblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IocHJvdG9jb2w6IHN0cmluZywgbW5lbW9uaWNXb3JkOiBzdHJpbmcsIGluY2x1ZGVQcml2YXRlS2V5OiBib29sZWFuID0gZmFsc2UsIGxvZzogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblx0XHR0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7XHJcblx0XHR0aGlzLm1uZW1vbmljV29yZCA9IG1uZW1vbmljV29yZDtcclxuXHRcdHRoaXMuaW5jbHVkZVByaXZhdGVLZXkgPSBpbmNsdWRlUHJpdmF0ZUtleTtcclxuXHRcdHRoaXMuc2VlZCA9IG1uZW1vbmljVG9TZWVkU3luYyh0aGlzLm1uZW1vbmljV29yZCk7XHJcblx0XHR0aGlzLmxvZyA9IGxvZztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxyXG5cdCAqIEByZXR1cm4geyp9ICB7c3RyaW5nfVxyXG5cdCAqIEBtZW1iZXJvZiBIRFdhbGxldFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZW5lcmF0ZShwYXRoOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB7IGFkZHJlc3M6IHN0cmluZzsgcHVibGljS2V5OiBzdHJpbmc7IHByaXZhdGVLZXk/OiBzdHJpbmcgfSB7XHJcblx0XHQvLyBDb25jYXRlbmFtb3NcclxuXHRcdGNvbnN0IGhkUGF0aDogc3RyaW5nID0gJ20vJyArIHBhdGg7XHJcblxyXG5cdFx0aWYgKHRoaXMubG9nKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09PT09Jyk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdNbmVtb25pYzogJXMnLCB0aGlzLm1uZW1vbmljV29yZCk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdIRCBQYXRoOiAlc1xcclxcbicsIGhkUGF0aCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gT2J0ZW5lbW9zIGxhIHJlZCBzaSBlcyBlbCBjYXNvXHJcblx0XHRjb25zdCBuZXR3b3JrOiBhbnkgPSB0aGlzLnNlZ3dpdFBhcmFtZXRlcnNbdGhpcy5wcm90b2NvbF07XHJcblx0XHQvLyBJbnN0YW5jaWFtb3NcclxuXHRcdGNvbnN0IGJpcDMyOiBCSVAzMkFQSSA9IEJJUDMyRmFjdG9yeShlY2MpO1xyXG5cdFx0Ly8gT2J0ZW5lbW9zIGxhIHJvb3Qga2V5XHJcblx0XHR0aGlzLnJvb3RLZXkgPSBiaXAzMi5mcm9tU2VlZCh0aGlzLnNlZWQsIG5ldHdvcmspO1xyXG5cdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIGV4dGVuZGlkYSBkZSBsYSBjdWVudGFcclxuXHRcdHRoaXMuYWNjb3VudEV4dGVuZGVkS2V5ID0gdGhpcy5jYWxjQmlwMzJFeHRlbmRlZEtleSh0aGlzLnJvb3RLZXksIGhkUGF0aCk7XHJcblxyXG5cdFx0aWYgKHRoaXMubG9nKSB7XHJcblx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBwcml2YWRhIHkgcMO6YmxpY2FcclxuXHRcdFx0Y29uc3QgYWNjb3VudFhwcnY6IHN0cmluZyA9IHRoaXMuYWNjb3VudEV4dGVuZGVkS2V5LnRvQmFzZTU4KCk7XHJcblx0XHRcdGNvbnN0IGFjY291bnRYcHViOiBzdHJpbmcgPSB0aGlzLmFjY291bnRFeHRlbmRlZEtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XHJcblxyXG5cdFx0XHRjb25zb2xlLmxvZygnQWNjb3VudCBFeHRlbmRlZCBQcml2YXRlIEtleTogJXMgXFxyXFxuQWNjb3VudCBFeHRlbmRlZCBQdWJsaWMgS2V5OiAlc1xcclxcbicsIGFjY291bnRYcHJ2LCBhY2NvdW50WHB1Yik7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gT2J0ZW5lbW9zIGVsIHdhbGxldFxyXG5cdFx0Y29uc3Qga2V5UGFpcjogQklQMzJJbnRlcmZhY2UgPSB0aGlzLmFjY291bnRFeHRlbmRlZEtleS5kZXJpdmUoaW5kZXgpO1xyXG5cclxuXHRcdHN3aXRjaCAodGhpcy5wcm90b2NvbCkge1xyXG5cdFx0XHRjYXNlICdiaXRjb2luJzpcclxuXHRcdFx0Y2FzZSAnYml0Y29pblJlZ1Rlc3QnOlxyXG5cdFx0XHRjYXNlICdsaXRlY29pbic6IHtcclxuXHRcdFx0XHQvLyBFeHRyYWVtb3MgbGEgZGlyZWNjacOzblxyXG5cdFx0XHRcdGNvbnN0IHsgYWRkcmVzczogcDJ3cGtoQWRkcmVzcyB9ID0gcGF5bWVudHMucDJ3cGtoKHsgcHVia2V5OiBrZXlQYWlyLnB1YmxpY0tleSwgbmV0d29yayB9KTtcclxuXHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHDDumJsaWNhXHJcblx0XHRcdFx0Y29uc3QgcHVibGljS2V5ID0ga2V5UGFpci5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpO1xyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5sb2cpIHtcclxuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQocDJ3cGtoQWRkcmVzcywga2V5UGFpci50b1dJRigpLCBwdWJsaWNLZXkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuaW5jbHVkZVByaXZhdGVLZXkpIHtcclxuXHRcdFx0XHRcdHJldHVybiB7IGFkZHJlc3M6IHAyd3BraEFkZHJlc3MsIHB1YmxpY0tleSwgcHJpdmF0ZUtleToga2V5UGFpci50b1dJRigpIH07XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzOiBwMndwa2hBZGRyZXNzLCBwdWJsaWNLZXkgfTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjYXNlICdldGhlcmV1bSc6IHtcclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgZWwgd2FsbGV0XHJcblx0XHRcdFx0Y29uc3QgZXRoZXJldW1XYWxsZXQgPSBoZGtleS5mcm9tTWFzdGVyU2VlZCh0aGlzLnNlZWQpLmRlcml2ZVBhdGgoaGRQYXRoKS5kZXJpdmVDaGlsZChpbmRleCkuZ2V0V2FsbGV0KCk7XHJcblxyXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYVxyXG5cdFx0XHRcdGNvbnN0IHB1YmxpY0tleSA9IGV0aGVyZXVtV2FsbGV0LmdldFB1YmxpY0tleVN0cmluZygpO1xyXG5cclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgY2xhdmUgcHJpdmFkYVxyXG5cdFx0XHRcdGNvbnN0IHByaXZhdGVLZXk6IHN0cmluZyA9IGV0aGVyZXVtV2FsbGV0LmdldFByaXZhdGVLZXlTdHJpbmcoKTtcclxuXHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGRpcmVjY2nDs25cclxuXHRcdFx0XHRjb25zdCBhZGRyZXNzOiBzdHJpbmcgPSBldGhlcmV1bVdhbGxldC5nZXRBZGRyZXNzU3RyaW5nKCk7XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xyXG5cdFx0XHRcdFx0dGhpcy5wcmludFdhbGxldChhZGRyZXNzLCBwcml2YXRlS2V5LCBwdWJsaWNLZXkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuaW5jbHVkZVByaXZhdGVLZXkpIHtcclxuXHRcdFx0XHRcdHJldHVybiB7IGFkZHJlc3MsIHB1YmxpY0tleSwgcHJpdmF0ZUtleSB9O1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzcywgcHVibGljS2V5IH07XHJcblx0XHRcdH1cclxuXHRcdFx0Y2FzZSAncmlwcGxlJzoge1xyXG5cdFx0XHRcdC8vIEV4dHJhZW1vcyBsYSBkaXJlY2Npw7NuXHJcblx0XHRcdFx0Y29uc3QgeyBhZGRyZXNzOiB4cnBBZGRyZXNzIH0gPSBwYXltZW50cy5wMnBraCh7IHB1YmtleToga2V5UGFpci5wdWJsaWNLZXkgfSk7XHJcblxyXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYVxyXG5cdFx0XHRcdGNvbnN0IHB1YmxpY0tleSA9IGtleVBhaXIucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKTtcclxuXHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHByaXZhZGFcclxuXHRcdFx0XHRjb25zdCBwcml2YXRlS2V5OiBzdHJpbmcgPSBrZXlQYWlyLnByaXZhdGVLZXkudG9TdHJpbmcoJ2hleCcpO1xyXG5cclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgZGlyZWNjacOzblxyXG5cdFx0XHRcdGNvbnN0IGFkZHJlc3MgPSB0aGlzLmNvbnZlcnRSaXBwbGVBZHJyKHhycEFkZHJlc3MpO1xyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5sb2cpIHtcclxuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQoYWRkcmVzcywgcHJpdmF0ZUtleSwgcHVibGljS2V5KTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLmluY2x1ZGVQcml2YXRlS2V5KSB7XHJcblx0XHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzLCBwdWJsaWNLZXksIHByaXZhdGVLZXkgfTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiB7IGFkZHJlc3MsIHB1YmxpY0tleSB9O1xyXG5cdFx0XHR9XHJcblx0XHRcdGNhc2UgJ3Ryb24nOiB7XHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHDDumJsaWNhIGVuIGZvcm1hdG8gZGUgZXRoZXJldW1cclxuXHRcdFx0XHRjb25zdCBldGhQdWJLZXk6IEJ1ZmZlciA9IGltcG9ydFB1YmxpYyhrZXlQYWlyLnB1YmxpY0tleSk7XHJcblxyXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYVxyXG5cdFx0XHRcdGNvbnN0IHB1YmxpY0tleSA9IGtleVBhaXIucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKTtcclxuXHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHByaXZhZGFcclxuXHRcdFx0XHRjb25zdCBwcml2YXRlS2V5OiBzdHJpbmcgPSBrZXlQYWlyLnByaXZhdGVLZXkudG9TdHJpbmcoJ2hleCcpO1xyXG5cclxuXHRcdFx0XHQvLyBDbGF2ZSBww7pibGljYSBhIGRpcmVjY2nDs25cclxuXHRcdFx0XHRjb25zdCBhZGRyZXNzQnVmZmVyOiBCdWZmZXIgPSBwdWJsaWNUb0FkZHJlc3MoZXRoUHViS2V5KTtcclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgZGlyZWNjacOzblxyXG5cdFx0XHRcdGNvbnN0IGFkZHJlc3M6IHN0cmluZyA9IGJpdGNvaW5qc0FkZHJlc3MudG9CYXNlNThDaGVjayhhZGRyZXNzQnVmZmVyLCAweDQxKTtcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMubG9nKSB7XHJcblx0XHRcdFx0XHR0aGlzLnByaW50V2FsbGV0KGFkZHJlc3MsIHByaXZhdGVLZXksIGtleVBhaXIucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5pbmNsdWRlUHJpdmF0ZUtleSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzcywgcHVibGljS2V5LCBwcml2YXRlS2V5IH07XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzLCBwdWJsaWNLZXkgfTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsY3VsYXRlIGJpcDMyIGV4dGVuZGVkIGtleSBieSByb290IGtleVxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge0JJUDMySW50ZXJmYWNlfSBiaXAzMlJvb3RLZXlcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxyXG5cdCAqIEByZXR1cm4geyp9ICB7QklQMzJJbnRlcmZhY2V9XHJcblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XHJcblx0ICovXHJcblx0cHJpdmF0ZSBjYWxjQmlwMzJFeHRlbmRlZEtleShiaXAzMlJvb3RLZXk6IEJJUDMySW50ZXJmYWNlLCBwYXRoOiBzdHJpbmcpOiBCSVAzMkludGVyZmFjZSB7XHJcblx0XHRsZXQgZXh0ZW5kZWRLZXk6IEJJUDMySW50ZXJmYWNlID0gYmlwMzJSb290S2V5O1xyXG5cdFx0Y29uc3QgcGF0aEJpdHM6IHN0cmluZ1tdID0gcGF0aC5zcGxpdCgnLycpO1xyXG5cclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aEJpdHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Y29uc3QgYml0OiBzdHJpbmcgPSBwYXRoQml0c1tpXTtcclxuXHRcdFx0Y29uc3QgaW5kZXg6IG51bWJlciA9IHBhcnNlSW50KGJpdCk7XHJcblxyXG5cdFx0XHRpZiAoaXNOYU4oaW5kZXgpKSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGhhcmRlbmVkOiBib29sZWFuID0gYml0W2JpdC5sZW5ndGggLSAxXSA9PT0gXCInXCI7XHJcblxyXG5cdFx0XHRpZiAoaGFyZGVuZWQpIHtcclxuXHRcdFx0XHRleHRlbmRlZEtleSA9IGV4dGVuZGVkS2V5LmRlcml2ZUhhcmRlbmVkKGluZGV4KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRleHRlbmRlZEtleSA9IGV4dGVuZGVkS2V5LmRlcml2ZShpbmRleCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZXh0ZW5kZWRLZXk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0IGFkZHJlc3MgdG8gUmlwcGxlIGFkZHJlc3NcclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcclxuXHQgKiBAcmV0dXJuIHsqfSAge3N0cmluZ31cclxuXHQgKiBAbWVtYmVyb2YgSERXYWxsZXRcclxuXHQgKi9cclxuXHRwcml2YXRlIGNvbnZlcnRSaXBwbGVBZHJyKGFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gYmFzZXgoJ3Jwc2huYWYzOXdCVURORUdISktMTTRQUVJTVDdWV1hZWjJiY2RlQ2c2NWprbThvRnFpMXR1dkF4eXonKS5lbmNvZGUoXHJcblx0XHRcdGJhc2V4KCcxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6JykuZGVjb2RlKGFkZHJlc3MpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHJpbnQgd2FsbGV0XHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBydktleVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwdWJLZXlcclxuXHQgKiBAbWVtYmVyb2YgSERXYWxsZXRcclxuXHQgKi9cclxuXHRwcml2YXRlIHByaW50V2FsbGV0KGFkZHJlc3M6IHN0cmluZywgcHJ2S2V5OiBzdHJpbmcsIHB1YktleTogc3RyaW5nKTogdm9pZCB7XHJcblx0XHRjb25zb2xlLmxvZygnQWRkcmVzczogJXMgXFxyXFxuUHJpdmF0ZSBLZXk6ICVzIFxcclxcblB1YmxpYyBLZXk6ICVzIFxcclxcbj09PT09PT09PT09PT09PT09PT09PT09PT1cXHJcXG5cXHJcXG4nLCBhZGRyZXNzLCBwcnZLZXksIHB1YktleSk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIRFdhbGxldDtcclxuIl0sIm1hcHBpbmdzIjoiaXRDQVFBLEtBQU0sQ0FBQUEsUUFBUyxDQStDZDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFDQ0MsV0FBV0EsQ0FBQ0MsQ0FBZ0IsQ0FBRUMsQ0FBb0IsQ0FBRUMsQ0FBMEIsR0FBUSxDQUFFQyxDQUFZLEdBQVEs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
33
+ const a=(0,_util.importPublic)(f.publicKey),b=f.publicKey.toString(),c=f.privateKey.toString(),d=(0,_util.publicToAddress)(a),e=_bitcoinjsLib.address.toBase58Check(d,65);// Obtenemos la clave pública
34
+ // Obtenemos la clave privada
35
+ // Clave pública a dirección
36
+ // Obtenemos la dirección
37
+ return this.log&&this.printWallet(e,c,b),this.includePrivateKey?{address:e,publicKey:b,privateKey:c}:{address:e,publicKey:b}}}}/**
38
+ * Calculate bip32 extended key by root key
39
+ *
40
+ * @private
41
+ * @param {BIP32Interface} bip32RootKey
42
+ * @param {string} path
43
+ * @return {*} {BIP32Interface}
44
+ * @memberof HDWallet
45
+ */calcBip32ExtendedKey(a,b){let c=a;const d=b.split("/");for(let e=0;e<d.length;e++){const a=d[e],b=parseInt(a);if(isNaN(b))continue;const f="'"===a[a.length-1];c=f?c.deriveHardened(b):c.derive(b)}return c;}/**
46
+ * Convert address to Ripple address
47
+ *
48
+ * @private
49
+ * @param {string} address
50
+ * @return {*} {string}
51
+ * @memberof HDWallet
52
+ */convertRippleAdrr(a){return(0,_baseX.default)("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz").encode((0,_baseX.default)("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz").decode(a));}/**
53
+ * Print wallet
54
+ *
55
+ * @private
56
+ * @param {string} address
57
+ * @param {string} prvKey
58
+ * @param {string} pubKey
59
+ * @memberof HDWallet
60
+ */printWallet(a,b,c){console.log("Address: %s \r\nPrivate Key: %s \r\nPublic Key: %s \r\n=========================\r\n\r\n",a,b,c)}}var _default=exports.default=HDWallet;
61
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJIRFdhbGxldCIsImNvbnN0cnVjdG9yIiwicHJvdG9jb2wiLCJtbmVtb25pY1dvcmQiLCJpbmNsdWRlUHJpdmF0ZUtleSIsImxvZyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiYml0Y29pbiIsIm1lc3NhZ2VQcmVmaXgiLCJiZWNoMzIiLCJiaXAzMiIsInB1YmxpYyIsInByaXZhdGUiLCJwdWJLZXlIYXNoIiwic2NyaXB0SGFzaCIsIndpZiIsImJpdGNvaW5SZWdUZXN0IiwibGl0ZWNvaW4iLCJzZWVkIiwibW5lbW9uaWNUb1NlZWRTeW5jIiwiZ2VuZXJhdGUiLCJwYXRoIiwiaW5kZXgiLCJoZFBhdGgiLCJjb25zb2xlIiwibmV0d29yayIsInNlZ3dpdFBhcmFtZXRlcnMiLCJCSVAzMkZhY3RvcnkiLCJlY2MiLCJyb290S2V5IiwiZnJvbVNlZWQiLCJhY2NvdW50RXh0ZW5kZWRLZXkiLCJjYWxjQmlwMzJFeHRlbmRlZEtleSIsImFjY291bnRYcHJ2IiwidG9CYXNlNTgiLCJhY2NvdW50WHB1YiIsIm5ldXRlcmVkIiwia2V5UGFpciIsImRlcml2ZSIsImFkZHJlc3MiLCJwMndwa2hBZGRyZXNzIiwicGF5bWVudHMiLCJwMndwa2giLCJwdWJrZXkiLCJwdWJsaWNLZXkiLCJ0b1N0cmluZyIsInByaW50V2FsbGV0IiwidG9XSUYiLCJwcml2YXRlS2V5IiwiZXRoZXJldW1XYWxsZXQiLCJoZGtleSIsImZyb21NYXN0ZXJTZWVkIiwiZGVyaXZlQ2hpbGQiLCJhZGRyZXNzQnVmZmVyIiwicHVibGljVG9BZGRyZXNzIiwidG9DaGVja3N1bUFkZHJlc3MiLCJCdWZmZXIiLCJmcm9tIiwieHJwQWRkcmVzcyIsInAycGtoIiwiY29udmVydFJpcHBsZUFkcnIiLCJldGhQdWJLZXkiLCJpbXBvcnRQdWJsaWMiLCJiaXRjb2luanNBZGRyZXNzIiwidG9CYXNlNThDaGVjayIsImJpcDMyUm9vdEtleSIsImV4dGVuZGVkS2V5IiwicGF0aEJpdHMiLCJzcGxpdCIsImkiLCJsZW5ndGgiLCJiaXQiLCJwYXJzZUludCIsImlzTmFOIiwiaGFyZGVuZWQiLCJkZXJpdmVIYXJkZW5lZCIsImJhc2V4IiwiZW5jb2RlIiwiZGVjb2RlIiwicHJ2S2V5IiwicHViS2V5IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGltcG9ydFB1YmxpYywgcHVibGljVG9BZGRyZXNzLCB0b0NoZWNrc3VtQWRkcmVzcyB9IGZyb20gJ0BldGhlcmV1bWpzL3V0aWwnO1xuaW1wb3J0IGJhc2V4IGZyb20gJ2Jhc2UteCc7XG5pbXBvcnQgQklQMzJGYWN0b3J5LCB7IEJJUDMyQVBJLCBCSVAzMkludGVyZmFjZSB9IGZyb20gJ2JpcDMyJztcbmltcG9ydCB7IG1uZW1vbmljVG9TZWVkU3luYyB9IGZyb20gJ2JpcDM5JztcbmltcG9ydCB7IGFkZHJlc3MgYXMgYml0Y29pbmpzQWRkcmVzcywgcGF5bWVudHMgfSBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCBoZGtleSBmcm9tICdoZGtleSc7XG5pbXBvcnQgKiBhcyBlY2MgZnJvbSAndGlueS1zZWNwMjU2azEnO1xuXG5jbGFzcyBIRFdhbGxldCB7XG5cdHByaXZhdGUgc2Vnd2l0UGFyYW1ldGVyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHtcblx0XHRiaXRjb2luOiB7XG5cdFx0XHRtZXNzYWdlUHJlZml4OiAnXFx4MThCaXRjb2luIFNpZ25lZCBNZXNzYWdlOlxcbicsXG5cdFx0XHRiZWNoMzI6ICdiYycsXG5cdFx0XHRiaXAzMjoge1xuXHRcdFx0XHRwdWJsaWM6IDB4MDRiMjQ3NDYsXG5cdFx0XHRcdHByaXZhdGU6IDB4MDRiMjQzMGMsXG5cdFx0XHR9LFxuXHRcdFx0cHViS2V5SGFzaDogMHgwMCxcblx0XHRcdHNjcmlwdEhhc2g6IDB4MDUsXG5cdFx0XHR3aWY6IDB4ODAsXG5cdFx0fSxcblx0XHRiaXRjb2luUmVnVGVzdDoge1xuXHRcdFx0bWVzc2FnZVByZWZpeDogJ1xceDE4Qml0Y29pbiBTaWduZWQgTWVzc2FnZTpcXG4nLFxuXHRcdFx0YmVjaDMyOiAnYmNydCcsXG5cdFx0XHRiaXAzMjoge1xuXHRcdFx0XHRwdWJsaWM6IDB4MDQzNTg3Y2YsXG5cdFx0XHRcdHByaXZhdGU6IDB4MDQzNTgzOTQsXG5cdFx0XHR9LFxuXHRcdFx0cHViS2V5SGFzaDogMHg2Zixcblx0XHRcdHNjcmlwdEhhc2g6IDB4YzQsXG5cdFx0XHR3aWY6IDB4ZWYsXG5cdFx0fSxcblx0XHRsaXRlY29pbjoge1xuXHRcdFx0bWVzc2FnZVByZWZpeDogJ1xceDE5TGl0ZWNvaW4gU2lnbmVkIE1lc3NhZ2U6XFxuJyxcblx0XHRcdGJlY2gzMjogJ2x0YycsXG5cdFx0XHRiaXAzMjoge1xuXHRcdFx0XHRwdWJsaWM6IDB4MDRiMjQ3NDYsXG5cdFx0XHRcdHByaXZhdGU6IDB4MDRiMjQzMGMsXG5cdFx0XHR9LFxuXHRcdFx0cHViS2V5SGFzaDogMHgzMCxcblx0XHRcdHNjcmlwdEhhc2g6IDB4MzIsXG5cdFx0XHR3aWY6IDB4YjAsXG5cdFx0fSxcblx0fTtcblxuXHRwcml2YXRlIHJvb3RLZXk6IEJJUDMySW50ZXJmYWNlO1xuXHRwcml2YXRlIGFjY291bnRFeHRlbmRlZEtleTogQklQMzJJbnRlcmZhY2U7XG5cblx0cHJpdmF0ZSBwcm90b2NvbDogc3RyaW5nO1xuXHRwcml2YXRlIG1uZW1vbmljV29yZDogc3RyaW5nO1xuXHRwcml2YXRlIGluY2x1ZGVQcml2YXRlS2V5OiBib29sZWFuO1xuXHRwcml2YXRlIHNlZWQ6IEJ1ZmZlcjtcblxuXHRwcml2YXRlIGxvZzogYm9vbGVhbjtcblxuXHQvKipcblx0ICogQ29uc3RydWN0b3Jcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3RvY29sXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtbmVtb25pY1dvcmRcblx0ICogQHBhcmFtIHtib29sZWFufSBbaW5jbHVkZVByaXZhdGVLZXk9ZmFsc2VdXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xvZz1mYWxzZV1cblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihwcm90b2NvbDogc3RyaW5nLCBtbmVtb25pY1dvcmQ6IHN0cmluZywgaW5jbHVkZVByaXZhdGVLZXk6IGJvb2xlYW4gPSBmYWxzZSwgbG9nOiBib29sZWFuID0gZmFsc2UpIHtcblx0XHR0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7XG5cdFx0dGhpcy5tbmVtb25pY1dvcmQgPSBtbmVtb25pY1dvcmQ7XG5cdFx0dGhpcy5pbmNsdWRlUHJpdmF0ZUtleSA9IGluY2x1ZGVQcml2YXRlS2V5O1xuXHRcdHRoaXMuc2VlZCA9IG1uZW1vbmljVG9TZWVkU3luYyh0aGlzLm1uZW1vbmljV29yZCk7XG5cdFx0dGhpcy5sb2cgPSBsb2c7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG5cdCAqIEByZXR1cm4geyp9ICB7c3RyaW5nfVxuXHQgKiBAbWVtYmVyb2YgSERXYWxsZXRcblx0ICovXG5cdHB1YmxpYyBnZW5lcmF0ZShwYXRoOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB7IGFkZHJlc3M6IHN0cmluZzsgcHVibGljS2V5OiBzdHJpbmc7IHByaXZhdGVLZXk/OiBzdHJpbmcgfSB7XG5cdFx0Ly8gQ29uY2F0ZW5hbW9zXG5cdFx0Y29uc3QgaGRQYXRoOiBzdHJpbmcgPSAnbS8nICsgcGF0aDtcblxuXHRcdGlmICh0aGlzLmxvZykge1xuXHRcdFx0Y29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcblx0XHRcdGNvbnNvbGUubG9nKCdNbmVtb25pYzogJXMnLCB0aGlzLm1uZW1vbmljV29yZCk7XG5cdFx0XHRjb25zb2xlLmxvZygnSEQgUGF0aDogJXNcXHJcXG4nLCBoZFBhdGgpO1xuXHRcdH1cblxuXHRcdC8vIE9idGVuZW1vcyBsYSByZWQgc2kgZXMgZWwgY2Fzb1xuXHRcdGNvbnN0IG5ldHdvcms6IGFueSA9IHRoaXMuc2Vnd2l0UGFyYW1ldGVyc1t0aGlzLnByb3RvY29sXTtcblx0XHQvLyBJbnN0YW5jaWFtb3Ncblx0XHRjb25zdCBiaXAzMjogQklQMzJBUEkgPSBCSVAzMkZhY3RvcnkoZWNjKTtcblx0XHQvLyBPYnRlbmVtb3MgbGEgcm9vdCBrZXlcblx0XHR0aGlzLnJvb3RLZXkgPSBiaXAzMi5mcm9tU2VlZCh0aGlzLnNlZWQsIG5ldHdvcmspO1xuXHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBleHRlbmRpZGEgZGUgbGEgY3VlbnRhXG5cdFx0dGhpcy5hY2NvdW50RXh0ZW5kZWRLZXkgPSB0aGlzLmNhbGNCaXAzMkV4dGVuZGVkS2V5KHRoaXMucm9vdEtleSwgaGRQYXRoKTtcblxuXHRcdGlmICh0aGlzLmxvZykge1xuXHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHByaXZhZGEgeSBww7pibGljYVxuXHRcdFx0Y29uc3QgYWNjb3VudFhwcnY6IHN0cmluZyA9IHRoaXMuYWNjb3VudEV4dGVuZGVkS2V5LnRvQmFzZTU4KCk7XG5cdFx0XHRjb25zdCBhY2NvdW50WHB1Yjogc3RyaW5nID0gdGhpcy5hY2NvdW50RXh0ZW5kZWRLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuXG5cdFx0XHRjb25zb2xlLmxvZygnQWNjb3VudCBFeHRlbmRlZCBQcml2YXRlIEtleTogJXMgXFxyXFxuQWNjb3VudCBFeHRlbmRlZCBQdWJsaWMgS2V5OiAlc1xcclxcbicsIGFjY291bnRYcHJ2LCBhY2NvdW50WHB1Yik7XG5cdFx0fVxuXG5cdFx0Ly8gT2J0ZW5lbW9zIGVsIHdhbGxldFxuXHRcdGNvbnN0IGtleVBhaXI6IEJJUDMySW50ZXJmYWNlID0gdGhpcy5hY2NvdW50RXh0ZW5kZWRLZXkuZGVyaXZlKGluZGV4KTtcblxuXHRcdHN3aXRjaCAodGhpcy5wcm90b2NvbCkge1xuXHRcdFx0Y2FzZSAnYml0Y29pbic6XG5cdFx0XHRjYXNlICdiaXRjb2luUmVnVGVzdCc6XG5cdFx0XHRjYXNlICdsaXRlY29pbic6IHtcblx0XHRcdFx0Ly8gRXh0cmFlbW9zIGxhIGRpcmVjY2nDs25cblx0XHRcdFx0Y29uc3QgeyBhZGRyZXNzOiBwMndwa2hBZGRyZXNzIH0gPSBwYXltZW50cy5wMndwa2goeyBwdWJrZXk6IGtleVBhaXIucHVibGljS2V5LCBuZXR3b3JrIH0pO1xuXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYVxuXHRcdFx0XHRjb25zdCBwdWJsaWNLZXkgPSBrZXlQYWlyLnB1YmxpY0tleS50b1N0cmluZygpO1xuXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQocDJ3cGtoQWRkcmVzcywga2V5UGFpci50b1dJRigpLCBwdWJsaWNLZXkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuaW5jbHVkZVByaXZhdGVLZXkpIHtcblx0XHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzOiBwMndwa2hBZGRyZXNzLCBwdWJsaWNLZXksIHByaXZhdGVLZXk6IGtleVBhaXIudG9XSUYoKSB9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzczogcDJ3cGtoQWRkcmVzcywgcHVibGljS2V5IH07XG5cdFx0XHR9XG5cdFx0XHRjYXNlICdldGhlcmV1bSc6IHtcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGVsIHdhbGxldFxuXHRcdFx0XHRjb25zdCBldGhlcmV1bVdhbGxldCA9IGhka2V5LmZyb21NYXN0ZXJTZWVkKHRoaXMuc2VlZCkuZGVyaXZlKGhkUGF0aCkuZGVyaXZlQ2hpbGQoaW5kZXgpO1xuXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYVxuXHRcdFx0XHRjb25zdCBwdWJsaWNLZXkgPSAnMHgnICsgZXRoZXJldW1XYWxsZXQucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKTtcblxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgY2xhdmUgcHJpdmFkYVxuXHRcdFx0XHRjb25zdCBwcml2YXRlS2V5OiBzdHJpbmcgPSAnMHgnICsgZXRoZXJldW1XYWxsZXQucHJpdmF0ZUtleS50b1N0cmluZygnaGV4Jyk7XG5cblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGRpcmVjY2nDs25cblx0XHRcdFx0Y29uc3QgYWRkcmVzc0J1ZmZlciA9IHB1YmxpY1RvQWRkcmVzcyhldGhlcmV1bVdhbGxldC5wdWJsaWNLZXksIHRydWUpO1xuXHRcdFx0XHRjb25zdCBhZGRyZXNzOiBzdHJpbmcgPSB0b0NoZWNrc3VtQWRkcmVzcygnMHgnICsgQnVmZmVyLmZyb20oYWRkcmVzc0J1ZmZlcikudG9TdHJpbmcoJ2hleCcpKTtcblxuXHRcdFx0XHRpZiAodGhpcy5sb2cpIHtcblx0XHRcdFx0XHR0aGlzLnByaW50V2FsbGV0KGFkZHJlc3MsIHByaXZhdGVLZXksIHB1YmxpY0tleSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGhpcy5pbmNsdWRlUHJpdmF0ZUtleSkge1xuXHRcdFx0XHRcdHJldHVybiB7IGFkZHJlc3MsIHB1YmxpY0tleSwgcHJpdmF0ZUtleSB9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzcywgcHVibGljS2V5IH07XG5cdFx0XHR9XG5cdFx0XHRjYXNlICdyaXBwbGUnOiB7XG5cdFx0XHRcdC8vIEV4dHJhZW1vcyBsYSBkaXJlY2Npw7NuXG5cdFx0XHRcdGNvbnN0IHsgYWRkcmVzczogeHJwQWRkcmVzcyB9ID0gcGF5bWVudHMucDJwa2goeyBwdWJrZXk6IGtleVBhaXIucHVibGljS2V5IH0pO1xuXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYVxuXHRcdFx0XHRjb25zdCBwdWJsaWNLZXkgPSBrZXlQYWlyLnB1YmxpY0tleS50b1N0cmluZygpO1xuXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBwcml2YWRhXG5cdFx0XHRcdGNvbnN0IHByaXZhdGVLZXk6IHN0cmluZyA9IGtleVBhaXIucHJpdmF0ZUtleS50b1N0cmluZygpO1xuXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBkaXJlY2Npw7NuXG5cdFx0XHRcdGNvbnN0IGFkZHJlc3MgPSB0aGlzLmNvbnZlcnRSaXBwbGVBZHJyKHhycEFkZHJlc3MpO1xuXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQoYWRkcmVzcywgcHJpdmF0ZUtleSwgcHVibGljS2V5KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLmluY2x1ZGVQcml2YXRlS2V5KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzcywgcHVibGljS2V5LCBwcml2YXRlS2V5IH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzLCBwdWJsaWNLZXkgfTtcblx0XHRcdH1cblx0XHRcdGNhc2UgJ3Ryb24nOiB7XG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYSBlbiBmb3JtYXRvIGRlIGV0aGVyZXVtXG5cdFx0XHRcdGNvbnN0IGV0aFB1YktleSA9IGltcG9ydFB1YmxpYyhrZXlQYWlyLnB1YmxpY0tleSk7XG5cblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHDDumJsaWNhXG5cdFx0XHRcdGNvbnN0IHB1YmxpY0tleSA9IGtleVBhaXIucHVibGljS2V5LnRvU3RyaW5nKCk7XG5cblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHByaXZhZGFcblx0XHRcdFx0Y29uc3QgcHJpdmF0ZUtleTogc3RyaW5nID0ga2V5UGFpci5wcml2YXRlS2V5LnRvU3RyaW5nKCk7XG5cblx0XHRcdFx0Ly8gQ2xhdmUgcMO6YmxpY2EgYSBkaXJlY2Npw7NuXG5cdFx0XHRcdGNvbnN0IGFkZHJlc3NCdWZmZXIgPSBwdWJsaWNUb0FkZHJlc3MoZXRoUHViS2V5KTtcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGRpcmVjY2nDs25cblx0XHRcdFx0Y29uc3QgYWRkcmVzczogc3RyaW5nID0gYml0Y29pbmpzQWRkcmVzcy50b0Jhc2U1OENoZWNrKGFkZHJlc3NCdWZmZXIsIDB4NDEpO1xuXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQoYWRkcmVzcywgcHJpdmF0ZUtleSwgcHVibGljS2V5KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLmluY2x1ZGVQcml2YXRlS2V5KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzcywgcHVibGljS2V5LCBwcml2YXRlS2V5IH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzLCBwdWJsaWNLZXkgfTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsY3VsYXRlIGJpcDMyIGV4dGVuZGVkIGtleSBieSByb290IGtleVxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0JJUDMySW50ZXJmYWNlfSBiaXAzMlJvb3RLZXlcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcblx0ICogQHJldHVybiB7Kn0gIHtCSVAzMkludGVyZmFjZX1cblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XG5cdCAqL1xuXHRwcml2YXRlIGNhbGNCaXAzMkV4dGVuZGVkS2V5KGJpcDMyUm9vdEtleTogQklQMzJJbnRlcmZhY2UsIHBhdGg6IHN0cmluZyk6IEJJUDMySW50ZXJmYWNlIHtcblx0XHRsZXQgZXh0ZW5kZWRLZXk6IEJJUDMySW50ZXJmYWNlID0gYmlwMzJSb290S2V5O1xuXHRcdGNvbnN0IHBhdGhCaXRzOiBzdHJpbmdbXSA9IHBhdGguc3BsaXQoJy8nKTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aEJpdHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGJpdDogc3RyaW5nID0gcGF0aEJpdHNbaV07XG5cdFx0XHRjb25zdCBpbmRleDogbnVtYmVyID0gcGFyc2VJbnQoYml0KTtcblxuXHRcdFx0aWYgKGlzTmFOKGluZGV4KSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaGFyZGVuZWQ6IGJvb2xlYW4gPSBiaXRbYml0Lmxlbmd0aCAtIDFdID09PSBcIidcIjtcblxuXHRcdFx0aWYgKGhhcmRlbmVkKSB7XG5cdFx0XHRcdGV4dGVuZGVkS2V5ID0gZXh0ZW5kZWRLZXkuZGVyaXZlSGFyZGVuZWQoaW5kZXgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZXh0ZW5kZWRLZXkgPSBleHRlbmRlZEtleS5kZXJpdmUoaW5kZXgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBleHRlbmRlZEtleTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IGFkZHJlc3MgdG8gUmlwcGxlIGFkZHJlc3Ncblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3Ncblx0ICogQHJldHVybiB7Kn0gIHtzdHJpbmd9XG5cdCAqIEBtZW1iZXJvZiBIRFdhbGxldFxuXHQgKi9cblx0cHJpdmF0ZSBjb252ZXJ0UmlwcGxlQWRycihhZGRyZXNzOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBiYXNleCgncnBzaG5hZjM5d0JVRE5FR0hKS0xNNFBRUlNUN1ZXWFlaMmJjZGVDZzY1amttOG9GcWkxdHV2QXh5eicpLmVuY29kZShcblx0XHRcdGJhc2V4KCcxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6JykuZGVjb2RlKGFkZHJlc3MpLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJpbnQgd2FsbGV0XG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcnZLZXlcblx0ICogQHBhcmFtIHtzdHJpbmd9IHB1YktleVxuXHQgKiBAbWVtYmVyb2YgSERXYWxsZXRcblx0ICovXG5cdHByaXZhdGUgcHJpbnRXYWxsZXQoYWRkcmVzczogc3RyaW5nLCBwcnZLZXk6IHN0cmluZywgcHViS2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zb2xlLmxvZygnQWRkcmVzczogJXMgXFxyXFxuUHJpdmF0ZSBLZXk6ICVzIFxcclxcblB1YmxpYyBLZXk6ICVzIFxcclxcbj09PT09PT09PT09PT09PT09PT09PT09PT1cXHJcXG5cXHJcXG4nLCBhZGRyZXNzLCBwcnZLZXksIHB1YktleSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSERXYWxsZXQ7XG4iXSwibWFwcGluZ3MiOiIraUNBUUEsS0FBTSxDQUFBQSxRQUFTLENBK0NkO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUNDQyxXQUFXQSxDQUFDQyxDQUFnQixDQUFFQyxDQUFvQixDQUFFQyxDQUEwQixHQUFRLENBQUVDLENBQVksR0FBUSxDQUFFLElBQUFDLGdCQUFBLENBQUFDLE9BQUEsMEJBdkQzRCxDQUNsREMsT0FBTyxDQUFFLENBQ1JDLGFBQWEsQ0FBRSwrQkFBK0IsQ0FDOUNDLE1BQU0sQ0FBRSxJQUFJLENBQ1pDLEtBQUssQ0FBRSxDQUNOQyxNQUFNLENBQUUsUUFBVSxDQUNsQkMsT0FBTyxDQUFFLFFBQ1YsQ0FBQyxDQUNEQyxVQUFVLENBQUUsQ0FBSSxDQUNoQkMsVUFBVSxDQUFFLENBQUksQ0FDaEJDLEdBQUcsQ0FBRSxHQUNOLENBQUMsQ0FDREMsY0FBYyxDQUFFLENBQ2ZSLGFBQWEsQ0FBRSwrQkFBK0IsQ0FDOUNDLE1BQU0sQ0FBRSxNQUFNLENBQ2RDLEtBQUssQ0FBRSxDQUNOQyxNQUFNLENBQUUsUUFBVSxDQUNsQkMsT0FBTyxDQUFFLFFBQ1YsQ0FBQyxDQUNEQyxVQUFVLENBQUUsR0FBSSxDQUNoQkMsVUFBVSxDQUFFLEdBQUksQ0FDaEJDLEdBQUcsQ0FBRSxHQUNOLENBQUMsQ0FDREUsUUFBUSxDQUFFLENBQ1RULGFBQWEsQ0FBRSxnQ0FBZ0MsQ0FDL0NDLE1BQU0sQ0FBRSxLQUFLLENBQ2JDLEtBQUssQ0FBRSxDQUNOQyxNQUFNLENBQUUs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
@@ -0,0 +1,8 @@
1
+ services:
2
+ hd-wallet:
3
+ image: node:20-alpine
4
+ container_name: hd-wallet
5
+ working_dir: /app
6
+ command: sh -c "npm install -g npm@latest && tail -f /dev/null"
7
+ volumes:
8
+ - .:/app
package/package.json CHANGED
@@ -1,11 +1,14 @@
1
1
  {
2
2
  "name": "@samyan/hd-wallet",
3
- "version": "1.0.4",
3
+ "version": "1.1.1",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "scripts": {
7
7
  "build": "babel src --out-dir build --extensions \".ts\" --source-maps inline",
8
- "build-ts": "tsc"
8
+ "build-ts": "tsc",
9
+ "test": "vitest",
10
+ "test:watch": "vitest --watch",
11
+ "prepublishOnly": "npm run build && npm test"
9
12
  },
10
13
  "keywords": [
11
14
  "crypto",
@@ -15,22 +18,25 @@
15
18
  "author": "samyan",
16
19
  "license": "ISC",
17
20
  "devDependencies": {
18
- "@babel/cli": "^7.21.0",
19
- "@babel/core": "^7.21.0",
20
- "@babel/plugin-proposal-decorators": "^7.21.0",
21
- "@babel/plugin-transform-runtime": "^7.21.0",
22
- "@babel/preset-env": "^7.20.2",
23
- "@babel/preset-typescript": "^7.21.0",
21
+ "@babel/cli": "^7.28.6",
22
+ "@babel/core": "^7.29.0",
23
+ "@babel/plugin-proposal-decorators": "^7.29.0",
24
+ "@babel/plugin-transform-runtime": "^7.29.0",
25
+ "@babel/preset-env": "^7.29.2",
26
+ "@babel/preset-typescript": "^7.28.5",
27
+ "@types/hdkey": "^2.1.0",
28
+ "@types/node": "^25.5.0",
24
29
  "babel-preset-minify": "^0.5.2",
25
- "typescript": "^4.9.5"
30
+ "typescript": "^6.0.2",
31
+ "vitest": "^4.1.2"
26
32
  },
27
33
  "dependencies": {
28
- "base-x": "^4.0.0",
29
- "bip32": "^3.1.0",
30
- "bip39": "^3.0.4",
31
- "bitcoinjs-lib": "^6.1.0",
32
- "ethereumjs-util": "^7.1.5",
33
- "ethereumjs-wallet": "^1.0.2",
34
- "tiny-secp256k1": "^2.2.1"
34
+ "@ethereumjs/util": "^10.1.1",
35
+ "base-x": "^5.0.1",
36
+ "bip32": "^5.0.1",
37
+ "bip39": "^3.1.0",
38
+ "bitcoinjs-lib": "^7.0.1",
39
+ "hdkey": "^2.1.0",
40
+ "tiny-secp256k1": "^2.2.4"
35
41
  }
36
- }
42
+ }
@@ -0,0 +1,120 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import HDWallet from '../src/index';
3
+
4
+ const MNEMONIC = 'test test test test test test test test test test test junk';
5
+
6
+ describe('HDWallet', () => {
7
+ describe('Ethereum', () => {
8
+ it('deriva siempre la misma direccion (determinismo)', () => {
9
+ const wallet1 = new HDWallet('ethereum', MNEMONIC);
10
+
11
+ const result1 = wallet1.generate("44'/60'/0'/0", 0);
12
+
13
+ expect(result1.address).toBe('0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266');
14
+ });
15
+
16
+ it('genera direccion valida (formato 0x)', () => {
17
+ const wallet = new HDWallet('ethereum', MNEMONIC);
18
+
19
+ const { address } = wallet.generate("44'/60'/0'/0", 0);
20
+
21
+ expect(address.startsWith('0x')).toBe(true);
22
+ expect(address.length).toBe(42);
23
+ });
24
+
25
+ it('incluye privateKey cuando includePrivateKey=true', () => {
26
+ const wallet = new HDWallet('ethereum', MNEMONIC, true, true);
27
+
28
+ const result = wallet.generate("44'/60'/0'/0", 0);
29
+
30
+ expect(result.privateKey).toBeDefined();
31
+ expect(result.privateKey?.length).toBeGreaterThan(0);
32
+ });
33
+
34
+ it('genera publicKey válida', () => {
35
+ const wallet = new HDWallet('ethereum', MNEMONIC);
36
+
37
+ const { publicKey } = wallet.generate("44'/60'/0'/0", 0);
38
+
39
+ expect(publicKey).toMatch(/^0x[0-9a-fA-F]+$/);
40
+ });
41
+ });
42
+
43
+ describe('Bitcoin (SegWit)', () => {
44
+ it('genera direccion bech32 valida', () => {
45
+ const wallet = new HDWallet('bitcoin', MNEMONIC);
46
+
47
+ const { address } = wallet.generate("84'/0'/0'/0", 0);
48
+
49
+ expect(address.startsWith('bc1')).toBe(true);
50
+ });
51
+
52
+ it('determinismo bitcoin', () => {
53
+ const wallet = new HDWallet('bitcoin', MNEMONIC);
54
+
55
+ const a = wallet.generate("84'/0'/0'/0", 0);
56
+ const b = wallet.generate("84'/0'/0'/0", 0);
57
+
58
+ expect(a.address).toBe(b.address);
59
+ });
60
+ });
61
+
62
+ describe('Litecoin', () => {
63
+ it('genera direccion valida', () => {
64
+ const wallet = new HDWallet('litecoin', MNEMONIC);
65
+
66
+ const { address } = wallet.generate("84'/2'/0'/0", 0);
67
+
68
+ expect(address).toBeDefined();
69
+ expect(address.length).toBeGreaterThan(0);
70
+ });
71
+ });
72
+
73
+ describe('Tron', () => {
74
+ it('genera direccion valida (Base58 tron)', () => {
75
+ const wallet = new HDWallet('tron', MNEMONIC);
76
+
77
+ const { address } = wallet.generate("44'/195'/0'/0", 0);
78
+
79
+ expect(address.startsWith('T')).toBe(true);
80
+ });
81
+
82
+ it('deriva siempre la misma direccion (determinismo)', () => {
83
+ const wallet1 = new HDWallet('tron', MNEMONIC);
84
+
85
+ const result1 = wallet1.generate("44'/195'/0'/0", 0);
86
+
87
+ expect(result1.address).toBe('TWer2Ygk5TEheHp3TPuYeqxmB6SsGZmaL6');
88
+ });
89
+ });
90
+
91
+ describe('Ripple', () => {
92
+ it('genera direccion ripple valida', () => {
93
+ const wallet = new HDWallet('ripple', MNEMONIC);
94
+
95
+ const { address } = wallet.generate("44'/144'/0'/0", 0);
96
+
97
+ expect(address.startsWith('r')).toBe(true);
98
+ });
99
+ });
100
+
101
+ describe('Edge cases', () => {
102
+ it('indices distintos generan direcciones distintas', () => {
103
+ const wallet = new HDWallet('ethereum', MNEMONIC);
104
+
105
+ const a = wallet.generate("44'/60'/0'/0", 0);
106
+ const b = wallet.generate("44'/60'/0'/0", 1);
107
+
108
+ expect(a.address).not.toBe(b.address);
109
+ });
110
+
111
+ it('paths distintos generan direcciones distintas', () => {
112
+ const wallet = new HDWallet('ethereum', MNEMONIC);
113
+
114
+ const a = wallet.generate("44'/60'/0'/0", 0);
115
+ const b = wallet.generate("44'/60'/1'/0", 0);
116
+
117
+ expect(a.address).not.toBe(b.address);
118
+ });
119
+ });
120
+ });
package/tsconfig.json CHANGED
@@ -1,20 +1,27 @@
1
- {
2
- "compilerOptions": {
3
- "module": "commonjs",
4
- "esModuleInterop": true,
5
- "target": "es2016",
6
- "lib": ["es2016"],
7
- "strict": false,
8
- "declaration": true,
9
- "emitDeclarationOnly": true,
10
- "moduleResolution": "node",
11
- "forceConsistentCasingInFileNames": true,
12
- "sourceMap": true,
13
- "outDir": "build",
14
- "baseUrl": ".",
15
- "paths": {
16
- "*": ["node_modules/*", "src/types/*"]
17
- }
18
- },
19
- "include": ["src/**/*"]
20
- }
1
+ {
2
+ "compilerOptions": {
3
+ "module": "commonjs",
4
+ "esModuleInterop": true,
5
+ "target": "es2016",
6
+ "lib": [
7
+ "es2016"
8
+ ],
9
+ "strict": false,
10
+ "declaration": true,
11
+ "emitDeclarationOnly": true,
12
+ "moduleResolution": "node",
13
+ "forceConsistentCasingInFileNames": true,
14
+ "sourceMap": true,
15
+ "outDir": "build",
16
+ "baseUrl": ".",
17
+ "paths": {
18
+ "*": [
19
+ "node_modules/*",
20
+ "src/types/*"
21
+ ]
22
+ }
23
+ },
24
+ "include": [
25
+ "src/**/*"
26
+ ]
27
+ }