@samyan/hd-wallet 1.0.0 → 1.0.2
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.
- package/{dist → build}/index.d.ts +10 -5
- package/build/index.js +52 -0
- package/package.json +2 -2
- package/dist/index.js +0 -50
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
declare class HDWallet {
|
|
2
2
|
private segwitParameters;
|
|
3
|
+
private rootKey;
|
|
4
|
+
private accountExtendedKey;
|
|
3
5
|
private protocol;
|
|
4
6
|
private mnemonicWord;
|
|
7
|
+
private includePrivateKey;
|
|
5
8
|
private seed;
|
|
6
|
-
private rootKey;
|
|
7
|
-
private accountExtendedKey;
|
|
8
9
|
private log;
|
|
9
10
|
/**
|
|
10
11
|
* Constructor
|
|
11
12
|
*
|
|
12
13
|
* @param {string} protocol
|
|
13
14
|
* @param {string} mnemonicWord
|
|
14
|
-
* @param {boolean} [
|
|
15
|
+
* @param {boolean} [includePrivateKey=false]
|
|
16
|
+
* @param {boolean} [log=false]
|
|
15
17
|
* @memberof HDWallet
|
|
16
18
|
*/
|
|
17
|
-
constructor(protocol: string, mnemonicWord: string, log?: boolean);
|
|
19
|
+
constructor(protocol: string, mnemonicWord: string, includePrivateKey?: boolean, log?: boolean);
|
|
18
20
|
/**
|
|
19
21
|
* Generate
|
|
20
22
|
*
|
|
@@ -23,7 +25,10 @@ declare class HDWallet {
|
|
|
23
25
|
* @return {*} {string}
|
|
24
26
|
* @memberof HDWallet
|
|
25
27
|
*/
|
|
26
|
-
generate(path: string, index: number):
|
|
28
|
+
generate(path: string, index: number): {
|
|
29
|
+
publicKey: string;
|
|
30
|
+
privateKey?: string;
|
|
31
|
+
};
|
|
27
32
|
/**
|
|
28
33
|
* Calculate bip32 extended key by root key
|
|
29
34
|
*
|
package/build/index.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
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:{baseNetwork:"bitcoin",messagePrefix:"\x18Bitcoin Signed Message:\n",bech32:"bc",bip32:{public:78792518,private:78791436},pubKeyHash:0,scriptHash:5,wif:128},litecoin:{baseNetwork:"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
|
+
*/generate(a,b){// Concatenamos
|
|
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
|
+
const d=this.segwitParameters[this.protocol],e=(0,_bip.default)(ecc);// Instanciamos
|
|
19
|
+
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
|
+
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
|
+
const f=this.accountExtendedKey.derive(b);switch(this.protocol){case"bitcoin":case"litecoin":{// Extraemos la dirección
|
|
22
|
+
const{address:a}=_bitcoinjsLib.payments.p2wpkh({pubkey:f.publicKey,network:d});return this.log&&this.printWallet(a,f.toWIF(),f.publicKey.toString("hex")),this.includePrivateKey?{publicKey:a,privateKey:f.toWIF()}:{publicKey:a}}case"ethereum":{// Obtenemos el wallet
|
|
23
|
+
const a=_ethereumjsWallet.hdkey.fromMasterSeed(this.seed).derivePath(c).deriveChild(b).getWallet(),d=a.getAddressString(),e=a.getPrivateKeyString();// Obtenemos la dirección
|
|
24
|
+
return this.log&&this.printWallet(d,e,a.getPublicKeyString()),this.includePrivateKey?{publicKey:d,privateKey:e}:{publicKey:d}}case"ripple":{// Extraemos la dirección
|
|
25
|
+
const{address:a}=_bitcoinjsLib.payments.p2pkh({pubkey:f.publicKey}),b=this.convertRippleAdrr(a),c=f.privateKey.toString("hex");// Obtenemos la dirección
|
|
26
|
+
return this.log&&this.printWallet(b,c,f.publicKey.toString("hex")),this.includePrivateKey?{publicKey:b,privateKey:c}:{publicKey:b}}case"tron":{// Obtenemos la clave pública en formato de ethereum
|
|
27
|
+
const a=(0,_ethereumjsUtil.importPublic)(f.publicKey),b=(0,_ethereumjsUtil.publicToAddress)(a),c=_bitcoinjsLib.address.toBase58Check(b,65),d=f.privateKey.toString("hex");// Clave pública a dirección
|
|
28
|
+
return this.log&&this.printWallet(c,d,f.publicKey.toString("hex")),this.includePrivateKey?{publicKey:c,privateKey:d}:{publicKey:c}}}}/**
|
|
29
|
+
* Calculate bip32 extended key by root key
|
|
30
|
+
*
|
|
31
|
+
* @private
|
|
32
|
+
* @param {BIP32Interface} bip32RootKey
|
|
33
|
+
* @param {string} path
|
|
34
|
+
* @return {*} {BIP32Interface}
|
|
35
|
+
* @memberof HDWallet
|
|
36
|
+
*/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}/**
|
|
37
|
+
* Convert address to Ripple address
|
|
38
|
+
*
|
|
39
|
+
* @private
|
|
40
|
+
* @param {string} address
|
|
41
|
+
* @return {*} {string}
|
|
42
|
+
* @memberof HDWallet
|
|
43
|
+
*/convertRippleAdrr(a){return(0,_baseX.default)("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz").encode((0,_baseX.default)("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz").decode(a))}/**
|
|
44
|
+
* Print wallet
|
|
45
|
+
*
|
|
46
|
+
* @private
|
|
47
|
+
* @param {string} address
|
|
48
|
+
* @param {string} prvKey
|
|
49
|
+
* @param {string} pubKey
|
|
50
|
+
* @memberof HDWallet
|
|
51
|
+
*/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;
|
|
52
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJIRFdhbGxldCIsImNvbnN0cnVjdG9yIiwicHJvdG9jb2wiLCJtbmVtb25pY1dvcmQiLCJpbmNsdWRlUHJpdmF0ZUtleSIsImxvZyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiYml0Y29pbiIsImJhc2VOZXR3b3JrIiwibWVzc2FnZVByZWZpeCIsImJlY2gzMiIsImJpcDMyIiwicHVibGljIiwicHJpdmF0ZSIsInB1YktleUhhc2giLCJzY3JpcHRIYXNoIiwid2lmIiwibGl0ZWNvaW4iLCJzZWVkIiwibW5lbW9uaWNUb1NlZWRTeW5jIiwiZ2VuZXJhdGUiLCJwYXRoIiwiaW5kZXgiLCJoZFBhdGgiLCJjb25zb2xlIiwibmV0d29yayIsInNlZ3dpdFBhcmFtZXRlcnMiLCJCSVAzMkZhY3RvcnkiLCJlY2MiLCJyb290S2V5IiwiZnJvbVNlZWQiLCJhY2NvdW50RXh0ZW5kZWRLZXkiLCJjYWxjQmlwMzJFeHRlbmRlZEtleSIsImFjY291bnRYcHJ2IiwidG9CYXNlNTgiLCJhY2NvdW50WHB1YiIsIm5ldXRlcmVkIiwia2V5UGFpciIsImRlcml2ZSIsImFkZHJlc3MiLCJwMndwa2hBZGRyZXNzIiwicGF5bWVudHMiLCJwMndwa2giLCJwdWJrZXkiLCJwdWJsaWNLZXkiLCJwcmludFdhbGxldCIsInRvV0lGIiwidG9TdHJpbmciLCJwcml2YXRlS2V5IiwiZXRoZXJldW1XYWxsZXQiLCJoZGtleSIsImZyb21NYXN0ZXJTZWVkIiwiZGVyaXZlUGF0aCIsImRlcml2ZUNoaWxkIiwiZ2V0V2FsbGV0IiwiZ2V0QWRkcmVzc1N0cmluZyIsImdldFByaXZhdGVLZXlTdHJpbmciLCJnZXRQdWJsaWNLZXlTdHJpbmciLCJ4cnBBZGRyZXNzIiwicDJwa2giLCJjb252ZXJ0UmlwcGxlQWRyciIsImV0aFB1YktleSIsImltcG9ydFB1YmxpYyIsImFkZHJlc3NCdWZmZXIiLCJwdWJsaWNUb0FkZHJlc3MiLCJiaXRjb2luanNBZGRyZXNzIiwidG9CYXNlNThDaGVjayIsImJpcDMyUm9vdEtleSIsImV4dGVuZGVkS2V5IiwicGF0aEJpdHMiLCJzcGxpdCIsImkiLCJsZW5ndGgiLCJiaXQiLCJwYXJzZUludCIsImlzTmFOIiwiaGFyZGVuZWQiLCJkZXJpdmVIYXJkZW5lZCIsImJhc2V4IiwiZW5jb2RlIiwiZGVjb2RlIiwicHJ2S2V5IiwicHViS2V5IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBiYXNleCBmcm9tICdiYXNlLXgnO1xyXG5pbXBvcnQgQklQMzJGYWN0b3J5LCB7IEJJUDMyQVBJLCBCSVAzMkludGVyZmFjZSB9IGZyb20gJ2JpcDMyJztcclxuaW1wb3J0IHsgbW5lbW9uaWNUb1NlZWRTeW5jIH0gZnJvbSAnYmlwMzknO1xyXG5pbXBvcnQgeyBhZGRyZXNzIGFzIGJpdGNvaW5qc0FkZHJlc3MsIHBheW1lbnRzIH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XHJcbmltcG9ydCB7IGltcG9ydFB1YmxpYywgcHVibGljVG9BZGRyZXNzIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcclxuaW1wb3J0IHsgaGRrZXkgfSBmcm9tICdldGhlcmV1bWpzLXdhbGxldCc7XHJcbmltcG9ydCAqIGFzIGVjYyBmcm9tICd0aW55LXNlY3AyNTZrMSc7XHJcblxyXG5jbGFzcyBIRFdhbGxldCB7XHJcblx0cHJpdmF0ZSBzZWd3aXRQYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge1xyXG5cdFx0Yml0Y29pbjoge1xyXG5cdFx0XHRiYXNlTmV0d29yazogJ2JpdGNvaW4nLFxyXG5cdFx0XHRtZXNzYWdlUHJlZml4OiAnXFx4MThCaXRjb2luIFNpZ25lZCBNZXNzYWdlOlxcbicsXHJcblx0XHRcdGJlY2gzMjogJ2JjJyxcclxuXHRcdFx0YmlwMzI6IHtcclxuXHRcdFx0XHRwdWJsaWM6IDB4MDRiMjQ3NDYsXHJcblx0XHRcdFx0cHJpdmF0ZTogMHgwNGIyNDMwYyxcclxuXHRcdFx0fSxcclxuXHRcdFx0cHViS2V5SGFzaDogMHgwMCxcclxuXHRcdFx0c2NyaXB0SGFzaDogMHgwNSxcclxuXHRcdFx0d2lmOiAweDgwLFxyXG5cdFx0fSxcclxuXHRcdGxpdGVjb2luOiB7XHJcblx0XHRcdGJhc2VOZXR3b3JrOiAnbGl0ZWNvaW4nLFxyXG5cdFx0XHRtZXNzYWdlUHJlZml4OiAnXFx4MTlMaXRlY29pbiBTaWduZWQgTWVzc2FnZTpcXG4nLFxyXG5cdFx0XHRiZWNoMzI6ICdsdGMnLFxyXG5cdFx0XHRiaXAzMjoge1xyXG5cdFx0XHRcdHB1YmxpYzogMHgwNGIyNDc0NixcclxuXHRcdFx0XHRwcml2YXRlOiAweDA0YjI0MzBjLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRwdWJLZXlIYXNoOiAweDMwLFxyXG5cdFx0XHRzY3JpcHRIYXNoOiAweDMyLFxyXG5cdFx0XHR3aWY6IDB4YjAsXHJcblx0XHR9LFxyXG5cdH07XHJcblxyXG5cdHByaXZhdGUgcm9vdEtleTogQklQMzJJbnRlcmZhY2U7XHJcblx0cHJpdmF0ZSBhY2NvdW50RXh0ZW5kZWRLZXk6IEJJUDMySW50ZXJmYWNlO1xyXG5cclxuXHRwcml2YXRlIHByb3RvY29sOiBzdHJpbmc7XHJcblx0cHJpdmF0ZSBtbmVtb25pY1dvcmQ6IHN0cmluZztcclxuXHRwcml2YXRlIGluY2x1ZGVQcml2YXRlS2V5OiBib29sZWFuO1xyXG5cdHByaXZhdGUgc2VlZDogQnVmZmVyO1xyXG5cclxuXHRwcml2YXRlIGxvZzogYm9vbGVhbjtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0b3JcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm90b2NvbFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtbmVtb25pY1dvcmRcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmNsdWRlUHJpdmF0ZUtleT1mYWxzZV1cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtsb2c9ZmFsc2VdXHJcblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IocHJvdG9jb2w6IHN0cmluZywgbW5lbW9uaWNXb3JkOiBzdHJpbmcsIGluY2x1ZGVQcml2YXRlS2V5OiBib29sZWFuID0gZmFsc2UsIGxvZzogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblx0XHR0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7XHJcblx0XHR0aGlzLm1uZW1vbmljV29yZCA9IG1uZW1vbmljV29yZDtcclxuXHRcdHRoaXMuaW5jbHVkZVByaXZhdGVLZXkgPSBpbmNsdWRlUHJpdmF0ZUtleTtcclxuXHRcdHRoaXMuc2VlZCA9IG1uZW1vbmljVG9TZWVkU3luYyh0aGlzLm1uZW1vbmljV29yZCk7XHJcblx0XHR0aGlzLmxvZyA9IGxvZztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxyXG5cdCAqIEByZXR1cm4geyp9ICB7c3RyaW5nfVxyXG5cdCAqIEBtZW1iZXJvZiBIRFdhbGxldFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZW5lcmF0ZShwYXRoOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB7IHB1YmxpY0tleTogc3RyaW5nOyBwcml2YXRlS2V5Pzogc3RyaW5nIH0ge1xyXG5cdFx0Ly8gQ29uY2F0ZW5hbW9zXHJcblx0XHRjb25zdCBoZFBhdGg6IHN0cmluZyA9ICdtLycgKyBwYXRoO1xyXG5cclxuXHRcdGlmICh0aGlzLmxvZykge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnPT09PT09PT09PT09PT09PT09PT09PT09PScpO1xyXG5cdFx0XHRjb25zb2xlLmxvZygnTW5lbW9uaWM6ICVzJywgdGhpcy5tbmVtb25pY1dvcmQpO1xyXG5cdFx0XHRjb25zb2xlLmxvZygnSEQgUGF0aDogJXNcXHJcXG4nLCBoZFBhdGgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE9idGVuZW1vcyBsYSByZWQgc2kgZXMgZWwgY2Fzb1xyXG5cdFx0Y29uc3QgbmV0d29yazogYW55ID0gdGhpcy5zZWd3aXRQYXJhbWV0ZXJzW3RoaXMucHJvdG9jb2xdO1xyXG5cdFx0Ly8gSW5zdGFuY2lhbW9zXHJcblx0XHRjb25zdCBiaXAzMjogQklQMzJBUEkgPSBCSVAzMkZhY3RvcnkoZWNjKTtcclxuXHRcdC8vIE9idGVuZW1vcyBsYSByb290IGtleVxyXG5cdFx0dGhpcy5yb290S2V5ID0gYmlwMzIuZnJvbVNlZWQodGhpcy5zZWVkLCBuZXR3b3JrKTtcclxuXHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBleHRlbmRpZGEgZGUgbGEgY3VlbnRhXHJcblx0XHR0aGlzLmFjY291bnRFeHRlbmRlZEtleSA9IHRoaXMuY2FsY0JpcDMyRXh0ZW5kZWRLZXkodGhpcy5yb290S2V5LCBoZFBhdGgpO1xyXG5cclxuXHRcdGlmICh0aGlzLmxvZykge1xyXG5cdFx0XHQvLyBPYnRlbmVtb3MgbGEgY2xhdmUgcHJpdmFkYSB5IHDDumJsaWNhXHJcblx0XHRcdGNvbnN0IGFjY291bnRYcHJ2OiBzdHJpbmcgPSB0aGlzLmFjY291bnRFeHRlbmRlZEtleS50b0Jhc2U1OCgpO1xyXG5cdFx0XHRjb25zdCBhY2NvdW50WHB1Yjogc3RyaW5nID0gdGhpcy5hY2NvdW50RXh0ZW5kZWRLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xyXG5cclxuXHRcdFx0Y29uc29sZS5sb2coJ0FjY291bnQgRXh0ZW5kZWQgUHJpdmF0ZSBLZXk6ICVzIFxcclxcbkFjY291bnQgRXh0ZW5kZWQgUHVibGljIEtleTogJXNcXHJcXG4nLCBhY2NvdW50WHBydiwgYWNjb3VudFhwdWIpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE9idGVuZW1vcyBlbCB3YWxsZXRcclxuXHRcdGNvbnN0IGtleVBhaXI6IEJJUDMySW50ZXJmYWNlID0gdGhpcy5hY2NvdW50RXh0ZW5kZWRLZXkuZGVyaXZlKGluZGV4KTtcclxuXHJcblx0XHRzd2l0Y2ggKHRoaXMucHJvdG9jb2wpIHtcclxuXHRcdFx0Y2FzZSAnYml0Y29pbic6XHJcblx0XHRcdGNhc2UgJ2xpdGVjb2luJzoge1xyXG5cdFx0XHRcdC8vIEV4dHJhZW1vcyBsYSBkaXJlY2Npw7NuXHJcblx0XHRcdFx0Y29uc3QgeyBhZGRyZXNzOiBwMndwa2hBZGRyZXNzIH0gPSBwYXltZW50cy5wMndwa2goeyBwdWJrZXk6IGtleVBhaXIucHVibGljS2V5LCBuZXR3b3JrIH0pO1xyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5sb2cpIHtcclxuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQocDJ3cGtoQWRkcmVzcywga2V5UGFpci50b1dJRigpLCBrZXlQYWlyLnB1YmxpY0tleS50b1N0cmluZygnaGV4JykpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuaW5jbHVkZVByaXZhdGVLZXkpIHtcclxuXHRcdFx0XHRcdHJldHVybiB7IHB1YmxpY0tleTogcDJ3cGtoQWRkcmVzcywgcHJpdmF0ZUtleToga2V5UGFpci50b1dJRigpIH07XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4geyBwdWJsaWNLZXk6IHAyd3BraEFkZHJlc3MgfTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjYXNlICdldGhlcmV1bSc6IHtcclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgZWwgd2FsbGV0XHJcblx0XHRcdFx0Y29uc3QgZXRoZXJldW1XYWxsZXQgPSBoZGtleS5mcm9tTWFzdGVyU2VlZCh0aGlzLnNlZWQpLmRlcml2ZVBhdGgoaGRQYXRoKS5kZXJpdmVDaGlsZChpbmRleCkuZ2V0V2FsbGV0KCk7XHJcblxyXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBkaXJlY2Npw7NuXHJcblx0XHRcdFx0Y29uc3QgYWRkcmVzczogc3RyaW5nID0gZXRoZXJldW1XYWxsZXQuZ2V0QWRkcmVzc1N0cmluZygpO1xyXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBwcml2YWRhXHJcblx0XHRcdFx0Y29uc3QgcHJpdmF0ZUtleTogc3RyaW5nID0gZXRoZXJldW1XYWxsZXQuZ2V0UHJpdmF0ZUtleVN0cmluZygpO1xyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5sb2cpIHtcclxuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQoYWRkcmVzcywgcHJpdmF0ZUtleSwgZXRoZXJldW1XYWxsZXQuZ2V0UHVibGljS2V5U3RyaW5nKCkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuaW5jbHVkZVByaXZhdGVLZXkpIHtcclxuXHRcdFx0XHRcdHJldHVybiB7IHB1YmxpY0tleTogYWRkcmVzcywgcHJpdmF0ZUtleSB9O1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIHsgcHVibGljS2V5OiBhZGRyZXNzIH07XHJcblx0XHRcdH1cclxuXHRcdFx0Y2FzZSAncmlwcGxlJzoge1xyXG5cdFx0XHRcdC8vIEV4dHJhZW1vcyBsYSBkaXJlY2Npw7NuXHJcblx0XHRcdFx0Y29uc3QgeyBhZGRyZXNzOiB4cnBBZGRyZXNzIH0gPSBwYXltZW50cy5wMnBraCh7IHB1YmtleToga2V5UGFpci5wdWJsaWNLZXkgfSk7XHJcblxyXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBkaXJlY2Npw7NuXHJcblx0XHRcdFx0Y29uc3QgYWRkcmVzcyA9IHRoaXMuY29udmVydFJpcHBsZUFkcnIoeHJwQWRkcmVzcyk7XHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHByaXZhZGFcclxuXHRcdFx0XHRjb25zdCBwcml2YXRlS2V5OiBzdHJpbmcgPSBrZXlQYWlyLnByaXZhdGVLZXkudG9TdHJpbmcoJ2hleCcpO1xyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5sb2cpIHtcclxuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQoYWRkcmVzcywgcHJpdmF0ZUtleSwga2V5UGFpci5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLmluY2x1ZGVQcml2YXRlS2V5KSB7XHJcblx0XHRcdFx0XHRyZXR1cm4geyBwdWJsaWNLZXk6IGFkZHJlc3MsIHByaXZhdGVLZXkgfTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiB7IHB1YmxpY0tleTogYWRkcmVzcyB9O1xyXG5cdFx0XHR9XHJcblx0XHRcdGNhc2UgJ3Ryb24nOiB7XHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHDDumJsaWNhIGVuIGZvcm1hdG8gZGUgZXRoZXJldW1cclxuXHRcdFx0XHRjb25zdCBldGhQdWJLZXk6IEJ1ZmZlciA9IGltcG9ydFB1YmxpYyhrZXlQYWlyLnB1YmxpY0tleSk7XHJcblxyXG5cdFx0XHRcdC8vIENsYXZlIHDDumJsaWNhIGEgZGlyZWNjacOzblxyXG5cdFx0XHRcdGNvbnN0IGFkZHJlc3NCdWZmZXI6IEJ1ZmZlciA9IHB1YmxpY1RvQWRkcmVzcyhldGhQdWJLZXkpO1xyXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBkaXJlY2Npw7NuXHJcblx0XHRcdFx0Y29uc3QgYWRkcmVzczogc3RyaW5nID0gYml0Y29pbmpzQWRkcmVzcy50b0Jhc2U1OENoZWNrKGFkZHJlc3NCdWZmZXIsIDB4NDEpO1xyXG5cclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgY2xhdmUgcHJpdmFkYVxyXG5cdFx0XHRcdGNvbnN0IHByaXZhdGVLZXk6IHN0cmluZyA9IGtleVBhaXIucHJpdmF0ZUtleS50b1N0cmluZygnaGV4Jyk7XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xyXG5cdFx0XHRcdFx0dGhpcy5wcmludFdhbGxldChhZGRyZXNzLCBwcml2YXRlS2V5LCBrZXlQYWlyLnB1YmxpY0tleS50b1N0cmluZygnaGV4JykpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuaW5jbHVkZVByaXZhdGVLZXkpIHtcclxuXHRcdFx0XHRcdHJldHVybiB7IHB1YmxpY0tleTogYWRkcmVzcywgcHJpdmF0ZUtleSB9O1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIHsgcHVibGljS2V5OiBhZGRyZXNzIH07XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGN1bGF0ZSBiaXAzMiBleHRlbmRlZCBrZXkgYnkgcm9vdCBrZXlcclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtCSVAzMkludGVyZmFjZX0gYmlwMzJSb290S2V5XHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcclxuXHQgKiBAcmV0dXJuIHsqfSAge0JJUDMySW50ZXJmYWNlfVxyXG5cdCAqIEBtZW1iZXJvZiBIRFdhbGxldFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgY2FsY0JpcDMyRXh0ZW5kZWRLZXkoYmlwMzJSb290S2V5OiBCSVAzMkludGVyZmFjZSwgcGF0aDogc3RyaW5nKTogQklQMzJJbnRlcmZhY2Uge1xyXG5cdFx0bGV0IGV4dGVuZGVkS2V5OiBCSVAzMkludGVyZmFjZSA9IGJpcDMyUm9vdEtleTtcclxuXHRcdGNvbnN0IHBhdGhCaXRzOiBzdHJpbmdbXSA9IHBhdGguc3BsaXQoJy8nKTtcclxuXHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhCaXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGNvbnN0IGJpdDogc3RyaW5nID0gcGF0aEJpdHNbaV07XHJcblx0XHRcdGNvbnN0IGluZGV4OiBudW1iZXIgPSBwYXJzZUludChiaXQpO1xyXG5cclxuXHRcdFx0aWYgKGlzTmFOKGluZGV4KSkge1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBoYXJkZW5lZDogYm9vbGVhbiA9IGJpdFtiaXQubGVuZ3RoIC0gMV0gPT09IFwiJ1wiO1xyXG5cclxuXHRcdFx0aWYgKGhhcmRlbmVkKSB7XHJcblx0XHRcdFx0ZXh0ZW5kZWRLZXkgPSBleHRlbmRlZEtleS5kZXJpdmVIYXJkZW5lZChpbmRleCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZXh0ZW5kZWRLZXkgPSBleHRlbmRlZEtleS5kZXJpdmUoaW5kZXgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGV4dGVuZGVkS2V5O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydCBhZGRyZXNzIHRvIFJpcHBsZSBhZGRyZXNzXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXHJcblx0ICogQHJldHVybiB7Kn0gIHtzdHJpbmd9XHJcblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XHJcblx0ICovXHJcblx0cHJpdmF0ZSBjb252ZXJ0UmlwcGxlQWRycihhZGRyZXNzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGJhc2V4KCdycHNobmFmMzl3QlVETkVHSEpLTE00UFFSU1Q3VldYWVoyYmNkZUNnNjVqa204b0ZxaTF0dXZBeHl6JykuZW5jb2RlKFxyXG5cdFx0XHRiYXNleCgnMTIzNDU2Nzg5QUJDREVGR0hKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamttbm9wcXJzdHV2d3h5eicpLmRlY29kZShhZGRyZXNzKVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByaW50IHdhbGxldFxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcnZLZXlcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHViS2V5XHJcblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XHJcblx0ICovXHJcblx0cHJpdmF0ZSBwcmludFdhbGxldChhZGRyZXNzOiBzdHJpbmcsIHBydktleTogc3RyaW5nLCBwdWJLZXk6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0Y29uc29sZS5sb2coJ0FkZHJlc3M6ICVzIFxcclxcblByaXZhdGUgS2V5OiAlcyBcXHJcXG5QdWJsaWMgS2V5OiAlcyBcXHJcXG49PT09PT09PT09PT09PT09PT09PT09PT09XFxyXFxuXFxyXFxuJywgYWRkcmVzcywgcHJ2S2V5LCBwdWJLZXkpO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSERXYWxsZXQ7XHJcbiJdLCJtYXBwaW5ncyI6Iml0Q0FRQSxLQUFNLENBQUFBLFFBQVMsQ0FzQ2Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQ0NDLFdBQVdBLENBQUNDLENBQWdCLENBQUVDLENBQW9CLENBQUVDLENBQTBCLEdBQVEsQ0FBRUMsQ0FBWSxHQUFRLENBQUUsSUFBQUMsZ0JBQUEsQ0FBQUMsT0FBQSwwQkE5QzNELENBQ2xEQyxPQUFPLENBQUUsQ0FDUkMsV0FBVyxDQUFFLFNBQVMsQ0FDdEJDLGFBQWEsQ0FBRSwrQkFBK0IsQ0FDOUNDLE1BQU0sQ0FBRSxJQUFJLENBQ1pDLEtBQUssQ0FBRSxDQUNOQyxNQUFNLENBQUUsUUFBVSxDQUNsQkMsT0FBTyxDQUFFLFFBQ1YsQ0FBQyxDQUNEQyxVQUFVLENBQUUsQ0FBSSxDQUNoQkMsVUFBVSxDQUFFLENBQUksQ0FDaEJDLEdBQUcsQ0FBRSxHQUNOLENBQUMsQ0FDREMsUUFBUSxDQUFFLENBQ1RULFdBQVcsQ0FBRSxVQUFVLENBQ3ZCQyxhQUFhLENBQUUsZ0NBQWdDLENBQy9DQyxNQUFNLENBQUUsS0FBSyxDQUNiQyxLQUFLLENBQUUsQ0FDTkMsTUFBTSxDQUFFLFFBQVUsQ0FDbEJDLE9BQU8sQ0FBRSxRQUNWLENBQUMsQ0FDREMsVUFBVSxDQUFFLEVBQUksQ0FDaEJDLFVBQVUsQ0FBRSxFQUFJLENBQ2hCQyxHQUFHLENBQUUsR0FDTixDQUNELENBQUMsS0FBQVgsZ0JBQUEsQ0FBQUMsT0FBQSw0QkFBQUQsZ0JBQUEsQ0FBQUMsT0FBQSx1Q0FBQUQsZ0JBQUEsQ0FBQUMsT0FBQSw2QkFBQUQsZ0JBQUEsQ0FBQUMsT0FBQSxpQ0FBQUQsZ0JBQUEsQ0FBQUMsT0FBQSxzQ0FBQUQsZ0JBQUEsQ0FBQUMsT0FBQSx5QkFBQUQsZ0JBQUEsQ0FBQUMsT0FBQSxxQkFzQkEsSUFBSSxDQUFDTCxRQUFR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
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@samyan/hd-wallet",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "",
|
|
5
|
-
"main": "
|
|
5
|
+
"main": "build/index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"build": "babel src --out-dir build --extensions \".ts\" --source-maps inline",
|
|
8
8
|
"build-ts": "tsc"
|
package/dist/index.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
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} [log]
|
|
7
|
-
* @memberof HDWallet
|
|
8
|
-
*/constructor(a,b,c=!1){(0,_defineProperty2.default)(this,"segwitParameters",{bitcoin:{baseNetwork:"bitcoin",messagePrefix:"\x18Bitcoin Signed Message:\n",bech32:"bc",bip32:{public:78792518,private:78791436},pubKeyHash:0,scriptHash:5,wif:128},litecoin:{baseNetwork:"litecoin",messagePrefix:"\x19Litecoin Signed Message:\n",bech32:"ltc",bip32:{public:78792518,private:78791436},pubKeyHash:48,scriptHash:50,wif:176}}),(0,_defineProperty2.default)(this,"protocol",void 0),(0,_defineProperty2.default)(this,"mnemonicWord",void 0),(0,_defineProperty2.default)(this,"seed",void 0),(0,_defineProperty2.default)(this,"rootKey",void 0),(0,_defineProperty2.default)(this,"accountExtendedKey",void 0),(0,_defineProperty2.default)(this,"log",void 0),this.protocol=a,this.mnemonicWord=b,this.seed=(0,_bip2.mnemonicToSeedSync)(this.mnemonicWord),this.log=c}/**
|
|
9
|
-
* Generate
|
|
10
|
-
*
|
|
11
|
-
* @param {string} path
|
|
12
|
-
* @param {number} index
|
|
13
|
-
* @return {*} {string}
|
|
14
|
-
* @memberof HDWallet
|
|
15
|
-
*/generate(a,b){// Concatenamos
|
|
16
|
-
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
|
|
17
|
-
const d=this.segwitParameters[this.protocol],e=(0,_bip.default)(ecc);// Instanciamos
|
|
18
|
-
if(this.rootKey=e.fromSeed(this.seed,d),this.accountExtendedKey=this.calcBip32ExtendedKey(this.rootKey,c),this.log){// Obtenemos la clave privada y pública
|
|
19
|
-
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
|
|
20
|
-
const f=this.accountExtendedKey.derive(b);switch(this.protocol){case"bitcoin":case"litecoin":// Extraemos la dirección
|
|
21
|
-
const{address:a}=_bitcoinjsLib.payments.p2wpkh({pubkey:f.publicKey,network:d});return this.log&&this.printWallet(a,f.toWIF(),f.publicKey.toString("hex")),a;case"ethereum":// Obtenemos el wallet
|
|
22
|
-
const e=_ethereumjsWallet.hdkey.fromMasterSeed(this.seed).derivePath(c).deriveChild(b).getWallet(),g=e.getAddressString();// Obtenemos la dirección
|
|
23
|
-
return this.log&&this.printWallet(g,e.getPrivateKeyString(),e.getPublicKeyString()),g;case"ripple":// Extraemos la dirección
|
|
24
|
-
const{address:h}=_bitcoinjsLib.payments.p2pkh({pubkey:f.publicKey});return this.log&&this.printWallet(h,f.privateKey.toString("hex"),f.publicKey.toString("hex")),this.convertRippleAdrr(h);case"tron":// Obtenemos la clave pública en formato de ethereum
|
|
25
|
-
const i=(0,_ethereumjsUtil.importPublic)(f.publicKey),j=(0,_ethereumjsUtil.publicToAddress)(i),k=_bitcoinjsLib.address.toBase58Check(j,65);// Clave pública a dirección
|
|
26
|
-
return this.log&&this.printWallet(k,f.privateKey.toString("hex"),f.publicKey.toString("hex")),k;}}/**
|
|
27
|
-
* Calculate bip32 extended key by root key
|
|
28
|
-
*
|
|
29
|
-
* @private
|
|
30
|
-
* @param {BIP32Interface} bip32RootKey
|
|
31
|
-
* @param {string} path
|
|
32
|
-
* @return {*} {BIP32Interface}
|
|
33
|
-
* @memberof HDWallet
|
|
34
|
-
*/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}/**
|
|
35
|
-
* Convert address to Ripple address
|
|
36
|
-
*
|
|
37
|
-
* @private
|
|
38
|
-
* @param {string} address
|
|
39
|
-
* @return {*} {string}
|
|
40
|
-
* @memberof HDWallet
|
|
41
|
-
*/convertRippleAdrr(a){return(0,_baseX.default)("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz").encode((0,_baseX.default)("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz").decode(a))}/**
|
|
42
|
-
* Print wallet
|
|
43
|
-
*
|
|
44
|
-
* @private
|
|
45
|
-
* @param {string} address
|
|
46
|
-
* @param {string} prvKey
|
|
47
|
-
* @param {string} pubKey
|
|
48
|
-
* @memberof HDWallet
|
|
49
|
-
*/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;
|
|
50
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJIRFdhbGxldCIsImNvbnN0cnVjdG9yIiwicHJvdG9jb2wiLCJtbmVtb25pY1dvcmQiLCJsb2ciLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImJpdGNvaW4iLCJiYXNlTmV0d29yayIsIm1lc3NhZ2VQcmVmaXgiLCJiZWNoMzIiLCJiaXAzMiIsInB1YmxpYyIsInByaXZhdGUiLCJwdWJLZXlIYXNoIiwic2NyaXB0SGFzaCIsIndpZiIsImxpdGVjb2luIiwic2VlZCIsIm1uZW1vbmljVG9TZWVkU3luYyIsImdlbmVyYXRlIiwicGF0aCIsImluZGV4IiwiaGRQYXRoIiwiY29uc29sZSIsIm5ldHdvcmsiLCJzZWd3aXRQYXJhbWV0ZXJzIiwiQklQMzJGYWN0b3J5IiwiZWNjIiwicm9vdEtleSIsImZyb21TZWVkIiwiYWNjb3VudEV4dGVuZGVkS2V5IiwiY2FsY0JpcDMyRXh0ZW5kZWRLZXkiLCJhY2NvdW50WHBydiIsInRvQmFzZTU4IiwiYWNjb3VudFhwdWIiLCJuZXV0ZXJlZCIsImtleVBhaXIiLCJkZXJpdmUiLCJhZGRyZXNzIiwicDJ3cGtoQWRkcmVzcyIsInBheW1lbnRzIiwicDJ3cGtoIiwicHVia2V5IiwicHVibGljS2V5IiwicHJpbnRXYWxsZXQiLCJ0b1dJRiIsInRvU3RyaW5nIiwiZXRoZXJldW1XYWxsZXQiLCJoZGtleSIsImZyb21NYXN0ZXJTZWVkIiwiZGVyaXZlUGF0aCIsImRlcml2ZUNoaWxkIiwiZ2V0V2FsbGV0IiwiZXRoZXJldW1BZGRyZXNzIiwiZ2V0QWRkcmVzc1N0cmluZyIsImdldFByaXZhdGVLZXlTdHJpbmciLCJnZXRQdWJsaWNLZXlTdHJpbmciLCJ4cnBBZGRyZXNzIiwicDJwa2giLCJwcml2YXRlS2V5IiwiY29udmVydFJpcHBsZUFkcnIiLCJldGhQdWJLZXkiLCJpbXBvcnRQdWJsaWMiLCJhZGRyZXNzQnVmZmVyIiwicHVibGljVG9BZGRyZXNzIiwidHJvbkFkZHJlc3MiLCJ0b0Jhc2U1OENoZWNrIiwiYmlwMzJSb290S2V5IiwiZXh0ZW5kZWRLZXkiLCJwYXRoQml0cyIsInNwbGl0IiwiaSIsImxlbmd0aCIsImJpdCIsInBhcnNlSW50IiwiaXNOYU4iLCJoYXJkZW5lZCIsImRlcml2ZUhhcmRlbmVkIiwiYmFzZXgiLCJlbmNvZGUiLCJkZWNvZGUiLCJwcnZLZXkiLCJwdWJLZXkiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGJhc2V4IGZyb20gJ2Jhc2UteCc7XHJcbmltcG9ydCBCSVAzMkZhY3RvcnksIHsgQklQMzJBUEksIEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnYmlwMzInO1xyXG5pbXBvcnQgeyBtbmVtb25pY1RvU2VlZFN5bmMgfSBmcm9tICdiaXAzOSc7XHJcbmltcG9ydCB7IGFkZHJlc3MsIHBheW1lbnRzIH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XHJcbmltcG9ydCB7IGltcG9ydFB1YmxpYywgcHVibGljVG9BZGRyZXNzIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcclxuaW1wb3J0IHsgaGRrZXkgfSBmcm9tICdldGhlcmV1bWpzLXdhbGxldCc7XHJcbmltcG9ydCAqIGFzIGVjYyBmcm9tICd0aW55LXNlY3AyNTZrMSc7XHJcblxyXG5jbGFzcyBIRFdhbGxldCB7XHJcblx0cHJpdmF0ZSBzZWd3aXRQYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge1xyXG5cdFx0Yml0Y29pbjoge1xyXG5cdFx0XHRiYXNlTmV0d29yazogJ2JpdGNvaW4nLFxyXG5cdFx0XHRtZXNzYWdlUHJlZml4OiAnXFx4MThCaXRjb2luIFNpZ25lZCBNZXNzYWdlOlxcbicsXHJcblx0XHRcdGJlY2gzMjogJ2JjJyxcclxuXHRcdFx0YmlwMzI6IHtcclxuXHRcdFx0XHRwdWJsaWM6IDB4MDRiMjQ3NDYsXHJcblx0XHRcdFx0cHJpdmF0ZTogMHgwNGIyNDMwYyxcclxuXHRcdFx0fSxcclxuXHRcdFx0cHViS2V5SGFzaDogMHgwMCxcclxuXHRcdFx0c2NyaXB0SGFzaDogMHgwNSxcclxuXHRcdFx0d2lmOiAweDgwLFxyXG5cdFx0fSxcclxuXHRcdGxpdGVjb2luOiB7XHJcblx0XHRcdGJhc2VOZXR3b3JrOiAnbGl0ZWNvaW4nLFxyXG5cdFx0XHRtZXNzYWdlUHJlZml4OiAnXFx4MTlMaXRlY29pbiBTaWduZWQgTWVzc2FnZTpcXG4nLFxyXG5cdFx0XHRiZWNoMzI6ICdsdGMnLFxyXG5cdFx0XHRiaXAzMjoge1xyXG5cdFx0XHRcdHB1YmxpYzogMHgwNGIyNDc0NixcclxuXHRcdFx0XHRwcml2YXRlOiAweDA0YjI0MzBjLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRwdWJLZXlIYXNoOiAweDMwLFxyXG5cdFx0XHRzY3JpcHRIYXNoOiAweDMyLFxyXG5cdFx0XHR3aWY6IDB4YjAsXHJcblx0XHR9LFxyXG5cdH07XHJcblxyXG5cdHByaXZhdGUgcHJvdG9jb2w6IHN0cmluZztcclxuXHRwcml2YXRlIG1uZW1vbmljV29yZDogc3RyaW5nO1xyXG5cdHByaXZhdGUgc2VlZDogQnVmZmVyO1xyXG5cdHByaXZhdGUgcm9vdEtleTogQklQMzJJbnRlcmZhY2U7XHJcblx0cHJpdmF0ZSBhY2NvdW50RXh0ZW5kZWRLZXk6IEJJUDMySW50ZXJmYWNlO1xyXG5cdHByaXZhdGUgbG9nOiBib29sZWFuO1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RvclxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3RvY29sXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1uZW1vbmljV29yZFxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xvZ11cclxuXHQgKiBAbWVtYmVyb2YgSERXYWxsZXRcclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvcihwcm90b2NvbDogc3RyaW5nLCBtbmVtb25pY1dvcmQ6IHN0cmluZywgbG9nOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHRcdHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDtcclxuXHRcdHRoaXMubW5lbW9uaWNXb3JkID0gbW5lbW9uaWNXb3JkO1xyXG5cdFx0dGhpcy5zZWVkID0gbW5lbW9uaWNUb1NlZWRTeW5jKHRoaXMubW5lbW9uaWNXb3JkKTtcclxuXHRcdHRoaXMubG9nID0gbG9nO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XHJcblx0ICogQHJldHVybiB7Kn0gIHtzdHJpbmd9XHJcblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XHJcblx0ICovXHJcblx0cHVibGljIGdlbmVyYXRlKHBhdGg6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcblx0XHQvLyBDb25jYXRlbmFtb3NcclxuXHRcdGNvbnN0IGhkUGF0aDogc3RyaW5nID0gJ20vJyArIHBhdGg7XHJcblxyXG5cdFx0aWYgKHRoaXMubG9nKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09PT09Jyk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdNbmVtb25pYzogJXMnLCB0aGlzLm1uZW1vbmljV29yZCk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdIRCBQYXRoOiAlc1xcclxcbicsIGhkUGF0aCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gT2J0ZW5lbW9zIGxhIHJlZCBzaSBlcyBlbCBjYXNvXHJcblx0XHRjb25zdCBuZXR3b3JrOiBhbnkgPSB0aGlzLnNlZ3dpdFBhcmFtZXRlcnNbdGhpcy5wcm90b2NvbF07XHJcblx0XHQvLyBJbnN0YW5jaWFtb3NcclxuXHRcdGNvbnN0IGJpcDMyOiBCSVAzMkFQSSA9IEJJUDMyRmFjdG9yeShlY2MpO1xyXG5cdFx0Ly8gT2J0ZW5lbW9zIGxhIHJvb3Qga2V5XHJcblx0XHR0aGlzLnJvb3RLZXkgPSBiaXAzMi5mcm9tU2VlZCh0aGlzLnNlZWQsIG5ldHdvcmspO1xyXG5cdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIGV4dGVuZGlkYSBkZSBsYSBjdWVudGFcclxuXHRcdHRoaXMuYWNjb3VudEV4dGVuZGVkS2V5ID0gdGhpcy5jYWxjQmlwMzJFeHRlbmRlZEtleSh0aGlzLnJvb3RLZXksIGhkUGF0aCk7XHJcblxyXG5cdFx0aWYgKHRoaXMubG9nKSB7XHJcblx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBwcml2YWRhIHkgcMO6YmxpY2FcclxuXHRcdFx0Y29uc3QgYWNjb3VudFhwcnY6IHN0cmluZyA9IHRoaXMuYWNjb3VudEV4dGVuZGVkS2V5LnRvQmFzZTU4KCk7XHJcblx0XHRcdGNvbnN0IGFjY291bnRYcHViOiBzdHJpbmcgPSB0aGlzLmFjY291bnRFeHRlbmRlZEtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XHJcblxyXG5cdFx0XHRjb25zb2xlLmxvZygnQWNjb3VudCBFeHRlbmRlZCBQcml2YXRlIEtleTogJXMgXFxyXFxuQWNjb3VudCBFeHRlbmRlZCBQdWJsaWMgS2V5OiAlc1xcclxcbicsIGFjY291bnRYcHJ2LCBhY2NvdW50WHB1Yik7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gT2J0ZW5lbW9zIGVsIHdhbGxldFxyXG5cdFx0Y29uc3Qga2V5UGFpcjogQklQMzJJbnRlcmZhY2UgPSB0aGlzLmFjY291bnRFeHRlbmRlZEtleS5kZXJpdmUoaW5kZXgpO1xyXG5cclxuXHRcdHN3aXRjaCAodGhpcy5wcm90b2NvbCkge1xyXG5cdFx0XHRjYXNlICdiaXRjb2luJzpcclxuXHRcdFx0Y2FzZSAnbGl0ZWNvaW4nOlxyXG5cdFx0XHRcdC8vIEV4dHJhZW1vcyBsYSBkaXJlY2Npw7NuXHJcblx0XHRcdFx0Y29uc3QgeyBhZGRyZXNzOiBwMndwa2hBZGRyZXNzIH0gPSBwYXltZW50cy5wMndwa2goeyBwdWJrZXk6IGtleVBhaXIucHVibGljS2V5LCBuZXR3b3JrIH0pO1xyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5sb2cpIHtcclxuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQocDJ3cGtoQWRkcmVzcywga2V5UGFpci50b1dJRigpLCBrZXlQYWlyLnB1YmxpY0tleS50b1N0cmluZygnaGV4JykpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIHAyd3BraEFkZHJlc3M7XHJcblx0XHRcdGNhc2UgJ2V0aGVyZXVtJzpcclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgZWwgd2FsbGV0XHJcblx0XHRcdFx0Y29uc3QgZXRoZXJldW1XYWxsZXQgPSBoZGtleS5mcm9tTWFzdGVyU2VlZCh0aGlzLnNlZWQpLmRlcml2ZVBhdGgoaGRQYXRoKS5kZXJpdmVDaGlsZChpbmRleCkuZ2V0V2FsbGV0KCk7XHJcblxyXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBkaXJlY2Npw7NuXHJcblx0XHRcdFx0Y29uc3QgZXRoZXJldW1BZGRyZXNzOiBzdHJpbmcgPSBldGhlcmV1bVdhbGxldC5nZXRBZGRyZXNzU3RyaW5nKCk7XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xyXG5cdFx0XHRcdFx0dGhpcy5wcmludFdhbGxldChldGhlcmV1bUFkZHJlc3MsIGV0aGVyZXVtV2FsbGV0LmdldFByaXZhdGVLZXlTdHJpbmcoKSwgZXRoZXJldW1XYWxsZXQuZ2V0UHVibGljS2V5U3RyaW5nKCkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIGV0aGVyZXVtQWRkcmVzcztcclxuXHRcdFx0Y2FzZSAncmlwcGxlJzpcclxuXHRcdFx0XHQvLyBFeHRyYWVtb3MgbGEgZGlyZWNjacOzblxyXG5cdFx0XHRcdGNvbnN0IHsgYWRkcmVzczogeHJwQWRkcmVzcyB9ID0gcGF5bWVudHMucDJwa2goeyBwdWJrZXk6IGtleVBhaXIucHVibGljS2V5IH0pO1xyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5sb2cpIHtcclxuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQoeHJwQWRkcmVzcywga2V5UGFpci5wcml2YXRlS2V5LnRvU3RyaW5nKCdoZXgnKSwga2V5UGFpci5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnZlcnRSaXBwbGVBZHJyKHhycEFkZHJlc3MpO1xyXG5cdFx0XHRjYXNlICd0cm9uJzpcclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgY2xhdmUgcMO6YmxpY2EgZW4gZm9ybWF0byBkZSBldGhlcmV1bVxyXG5cdFx0XHRcdGNvbnN0IGV0aFB1YktleTogQnVmZmVyID0gaW1wb3J0UHVibGljKGtleVBhaXIucHVibGljS2V5KTtcclxuXHRcdFx0XHQvLyBDbGF2ZSBww7pibGljYSBhIGRpcmVjY2nDs25cclxuXHRcdFx0XHRjb25zdCBhZGRyZXNzQnVmZmVyOiBCdWZmZXIgPSBwdWJsaWNUb0FkZHJlc3MoZXRoUHViS2V5KTtcclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgZGlyZWNjacOzblxyXG5cdFx0XHRcdGNvbnN0IHRyb25BZGRyZXNzOiBzdHJpbmcgPSBhZGRyZXNzLnRvQmFzZTU4Q2hlY2soYWRkcmVzc0J1ZmZlciwgMHg0MSk7XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xyXG5cdFx0XHRcdFx0dGhpcy5wcmludFdhbGxldCh0cm9uQWRkcmVzcywga2V5UGFpci5wcml2YXRlS2V5LnRvU3RyaW5nKCdoZXgnKSwga2V5UGFpci5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiB0cm9uQWRkcmVzcztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGN1bGF0ZSBiaXAzMiBleHRlbmRlZCBrZXkgYnkgcm9vdCBrZXlcclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtCSVAzMkludGVyZmFjZX0gYmlwMzJSb290S2V5XHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcclxuXHQgKiBAcmV0dXJuIHsqfSAge0JJUDMySW50ZXJmYWNlfVxyXG5cdCAqIEBtZW1iZXJvZiBIRFdhbGxldFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgY2FsY0JpcDMyRXh0ZW5kZWRLZXkoYmlwMzJSb290S2V5OiBCSVAzMkludGVyZmFjZSwgcGF0aDogc3RyaW5nKTogQklQMzJJbnRlcmZhY2Uge1xyXG5cdFx0bGV0IGV4dGVuZGVkS2V5OiBCSVAzMkludGVyZmFjZSA9IGJpcDMyUm9vdEtleTtcclxuXHRcdGNvbnN0IHBhdGhCaXRzOiBzdHJpbmdbXSA9IHBhdGguc3BsaXQoJy8nKTtcclxuXHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhCaXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGNvbnN0IGJpdDogc3RyaW5nID0gcGF0aEJpdHNbaV07XHJcblx0XHRcdGNvbnN0IGluZGV4OiBudW1iZXIgPSBwYXJzZUludChiaXQpO1xyXG5cclxuXHRcdFx0aWYgKGlzTmFOKGluZGV4KSkge1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBoYXJkZW5lZDogYm9vbGVhbiA9IGJpdFtiaXQubGVuZ3RoIC0gMV0gPT09IFwiJ1wiO1xyXG5cclxuXHRcdFx0aWYgKGhhcmRlbmVkKSB7XHJcblx0XHRcdFx0ZXh0ZW5kZWRLZXkgPSBleHRlbmRlZEtleS5kZXJpdmVIYXJkZW5lZChpbmRleCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZXh0ZW5kZWRLZXkgPSBleHRlbmRlZEtleS5kZXJpdmUoaW5kZXgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGV4dGVuZGVkS2V5O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydCBhZGRyZXNzIHRvIFJpcHBsZSBhZGRyZXNzXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXHJcblx0ICogQHJldHVybiB7Kn0gIHtzdHJpbmd9XHJcblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XHJcblx0ICovXHJcblx0cHJpdmF0ZSBjb252ZXJ0UmlwcGxlQWRycihhZGRyZXNzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGJhc2V4KCdycHNobmFmMzl3QlVETkVHSEpLTE00UFFSU1Q3VldYWVoyYmNkZUNnNjVqa204b0ZxaTF0dXZBeHl6JykuZW5jb2RlKFxyXG5cdFx0XHRiYXNleCgnMTIzNDU2Nzg5QUJDREVGR0hKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamttbm9wcXJzdHV2d3h5eicpLmRlY29kZShhZGRyZXNzKVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByaW50IHdhbGxldFxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcnZLZXlcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcHViS2V5XHJcblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XHJcblx0ICovXHJcblx0cHJpdmF0ZSBwcmludFdhbGxldChhZGRyZXNzOiBzdHJpbmcsIHBydktleTogc3RyaW5nLCBwdWJLZXk6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0Y29uc29sZS5sb2coJ0FkZHJlc3M6ICVzIFxcclxcblByaXZhdGUgS2V5OiAlcyBcXHJcXG5QdWJsaWMgS2V5OiAlcyBcXHJcXG49PT09PT09PT09PT09PT09PT09PT09PT09XFxyXFxuXFxyXFxuJywgYWRkcmVzcywgcHJ2S2V5LCBwdWJLZXkpO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSERXYWxsZXQ7XHJcbiJdLCJtYXBwaW5ncyI6Iml0Q0FRQSxLQUFNLENBQUFBLFFBQVMsQ0FtQ2Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUNDQyxXQUFXQSxDQUFDQyxDQUFnQixDQUFFQyxDQUFvQixDQUFFQyxDQUFZLEdBQVEsQ0FBRSxJQUFBQyxnQkFBQSxDQUFBQyxPQUFBLDBCQTFDdkIsQ0FDbERDLE9BQU8sQ0FBRSxDQUNSQyxXQUFX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
|