@samyan/hd-wallet 1.0.3 → 1.1.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.
- package/{.babelrc → babel.config.json} +28 -29
- package/build/index.js +55 -46
- package/build/{index.d.ts → src/index.d.ts} +63 -62
- package/docker-compose.yml +8 -0
- package/package.json +22 -16
- package/test/hd-wallet.test.ts +120 -0
- package/tsconfig.json +27 -20
|
@@ -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
|
-
"
|
|
19
|
-
}
|
|
20
|
-
],
|
|
21
|
-
[
|
|
22
|
-
"@babel/plugin-transform-runtime"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
]
|
|
27
|
-
|
|
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.js
CHANGED
|
@@ -1,52 +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"),
|
|
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})
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* @private
|
|
40
|
-
* @param {
|
|
41
|
-
* @
|
|
42
|
-
* @
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* @
|
|
48
|
-
* @param {string}
|
|
49
|
-
* @
|
|
50
|
-
* @memberof HDWallet
|
|
51
|
-
*/
|
|
52
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJIRFdhbGxldCIsImNvbnN0cnVjdG9yIiwicHJvdG9jb2wiLCJtbmVtb25pY1dvcmQiLCJpbmNsdWRlUHJpdmF0ZUtleSIsImxvZyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiYml0Y29pbiIsIm1lc3NhZ2VQcmVmaXgiLCJiZWNoMzIiLCJiaXAzMiIsInB1YmxpYyIsInByaXZhdGUiLCJwdWJLZXlIYXNoIiwic2NyaXB0SGFzaCIsIndpZiIsImJpdGNvaW5SZWdUZXN0IiwibGl0ZWNvaW4iLCJzZWVkIiwibW5lbW9uaWNUb1NlZWRTeW5jIiwiZ2VuZXJhdGUiLCJwYXRoIiwiaW5kZXgiLCJoZFBhdGgiLCJjb25zb2xlIiwibmV0d29yayIsInNlZ3dpdFBhcmFtZXRlcnMiLCJCSVAzMkZhY3RvcnkiLCJlY2MiLCJyb290S2V5IiwiZnJvbVNlZWQiLCJhY2NvdW50RXh0ZW5kZWRLZXkiLCJjYWxjQmlwMzJFeHRlbmRlZEtleSIsImFjY291bnRYcHJ2IiwidG9CYXNlNTgiLCJhY2NvdW50WHB1YiIsIm5ldXRlcmVkIiwia2V5UGFpciIsImRlcml2ZSIsImFkZHJlc3MiLCJwMndwa2hBZGRyZXNzIiwicGF5bWVudHMiLCJwMndwa2giLCJwdWJrZXkiLCJwdWJsaWNLZXkiLCJwcmludFdhbGxldCIsInRvV0lGIiwidG9TdHJpbmciLCJwcml2YXRlS2V5IiwiZXRoZXJldW1XYWxsZXQiLCJoZGtleSIsImZyb21NYXN0ZXJTZWVkIiwiZGVyaXZlUGF0aCIsImRlcml2ZUNoaWxkIiwiZ2V0V2FsbGV0IiwiZ2V0QWRkcmVzc1N0cmluZyIsImdldFByaXZhdGVLZXlTdHJpbmciLCJnZXRQdWJsaWNLZXlTdHJpbmciLCJ4cnBBZGRyZXNzIiwicDJwa2giLCJjb252ZXJ0UmlwcGxlQWRyciIsImV0aFB1YktleSIsImltcG9ydFB1YmxpYyIsImFkZHJlc3NCdWZmZXIiLCJwdWJsaWNUb0FkZHJlc3MiLCJiaXRjb2luanNBZGRyZXNzIiwidG9CYXNlNThDaGVjayIsImJpcDMyUm9vdEtleSIsImV4dGVuZGVkS2V5IiwicGF0aEJpdHMiLCJzcGxpdCIsImkiLCJsZW5ndGgiLCJiaXQiLCJwYXJzZUludCIsImlzTmFOIiwiaGFyZGVuZWQiLCJkZXJpdmVIYXJkZW5lZCIsImJhc2V4IiwiZW5jb2RlIiwiZGVjb2RlIiwicHJ2S2V5IiwicHViS2V5IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBiYXNleCBmcm9tICdiYXNlLXgnO1xyXG5pbXBvcnQgQklQMzJGYWN0b3J5LCB7IEJJUDMyQVBJLCBCSVAzMkludGVyZmFjZSB9IGZyb20gJ2JpcDMyJztcclxuaW1wb3J0IHsgbW5lbW9uaWNUb1NlZWRTeW5jIH0gZnJvbSAnYmlwMzknO1xyXG5pbXBvcnQgeyBhZGRyZXNzIGFzIGJpdGNvaW5qc0FkZHJlc3MsIHBheW1lbnRzIH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XHJcbmltcG9ydCB7IGltcG9ydFB1YmxpYywgcHVibGljVG9BZGRyZXNzIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcclxuaW1wb3J0IHsgaGRrZXkgfSBmcm9tICdldGhlcmV1bWpzLXdhbGxldCc7XHJcbmltcG9ydCAqIGFzIGVjYyBmcm9tICd0aW55LXNlY3AyNTZrMSc7XHJcblxyXG5jbGFzcyBIRFdhbGxldCB7XHJcblx0cHJpdmF0ZSBzZWd3aXRQYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge1xyXG5cdFx0Yml0Y29pbjoge1xyXG5cdFx0XHRtZXNzYWdlUHJlZml4OiAnXFx4MThCaXRjb2luIFNpZ25lZCBNZXNzYWdlOlxcbicsXHJcblx0XHRcdGJlY2gzMjogJ2JjJyxcclxuXHRcdFx0YmlwMzI6IHtcclxuXHRcdFx0XHRwdWJsaWM6IDB4MDRiMjQ3NDYsXHJcblx0XHRcdFx0cHJpdmF0ZTogMHgwNGIyNDMwYyxcclxuXHRcdFx0fSxcclxuXHRcdFx0cHViS2V5SGFzaDogMHgwMCxcclxuXHRcdFx0c2NyaXB0SGFzaDogMHgwNSxcclxuXHRcdFx0d2lmOiAweDgwLFxyXG5cdFx0fSxcclxuXHRcdGJpdGNvaW5SZWdUZXN0OiB7XHJcblx0XHRcdG1lc3NhZ2VQcmVmaXg6ICdcXHgxOEJpdGNvaW4gU2lnbmVkIE1lc3NhZ2U6XFxuJyxcclxuXHRcdFx0YmVjaDMyOiAnYmNydCcsXHJcblx0XHRcdGJpcDMyOiB7XHJcblx0XHRcdFx0cHVibGljOiAweDA0MzU4N2NmLFxyXG5cdFx0XHRcdHByaXZhdGU6IDB4MDQzNTgzOTQsXHJcblx0XHRcdH0sXHJcblx0XHRcdHB1YktleUhhc2g6IDB4NmYsXHJcblx0XHRcdHNjcmlwdEhhc2g6IDB4YzQsXHJcblx0XHRcdHdpZjogMHhlZixcclxuXHRcdH0sXHJcblx0XHRsaXRlY29pbjoge1xyXG5cdFx0XHRtZXNzYWdlUHJlZml4OiAnXFx4MTlMaXRlY29pbiBTaWduZWQgTWVzc2FnZTpcXG4nLFxyXG5cdFx0XHRiZWNoMzI6ICdsdGMnLFxyXG5cdFx0XHRiaXAzMjoge1xyXG5cdFx0XHRcdHB1YmxpYzogMHgwNGIyNDc0NixcclxuXHRcdFx0XHRwcml2YXRlOiAweDA0YjI0MzBjLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRwdWJLZXlIYXNoOiAweDMwLFxyXG5cdFx0XHRzY3JpcHRIYXNoOiAweDMyLFxyXG5cdFx0XHR3aWY6IDB4YjAsXHJcblx0XHR9LFxyXG5cdH07XHJcblxyXG5cdHByaXZhdGUgcm9vdEtleTogQklQMzJJbnRlcmZhY2U7XHJcblx0cHJpdmF0ZSBhY2NvdW50RXh0ZW5kZWRLZXk6IEJJUDMySW50ZXJmYWNlO1xyXG5cclxuXHRwcml2YXRlIHByb3RvY29sOiBzdHJpbmc7XHJcblx0cHJpdmF0ZSBtbmVtb25pY1dvcmQ6IHN0cmluZztcclxuXHRwcml2YXRlIGluY2x1ZGVQcml2YXRlS2V5OiBib29sZWFuO1xyXG5cdHByaXZhdGUgc2VlZDogQnVmZmVyO1xyXG5cclxuXHRwcml2YXRlIGxvZzogYm9vbGVhbjtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0b3JcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm90b2NvbFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtbmVtb25pY1dvcmRcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmNsdWRlUHJpdmF0ZUtleT1mYWxzZV1cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtsb2c9ZmFsc2VdXHJcblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IocHJvdG9jb2w6IHN0cmluZywgbW5lbW9uaWNXb3JkOiBzdHJpbmcsIGluY2x1ZGVQcml2YXRlS2V5OiBib29sZWFuID0gZmFsc2UsIGxvZzogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblx0XHR0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7XHJcblx0XHR0aGlzLm1uZW1vbmljV29yZCA9IG1uZW1vbmljV29yZDtcclxuXHRcdHRoaXMuaW5jbHVkZVByaXZhdGVLZXkgPSBpbmNsdWRlUHJpdmF0ZUtleTtcclxuXHRcdHRoaXMuc2VlZCA9IG1uZW1vbmljVG9TZWVkU3luYyh0aGlzLm1uZW1vbmljV29yZCk7XHJcblx0XHR0aGlzLmxvZyA9IGxvZztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxyXG5cdCAqIEByZXR1cm4geyp9ICB7c3RyaW5nfVxyXG5cdCAqIEBtZW1iZXJvZiBIRFdhbGxldFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZW5lcmF0ZShwYXRoOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB7IHB1YmxpY0tleTogc3RyaW5nOyBwcml2YXRlS2V5Pzogc3RyaW5nIH0ge1xyXG5cdFx0Ly8gQ29uY2F0ZW5hbW9zXHJcblx0XHRjb25zdCBoZFBhdGg6IHN0cmluZyA9ICdtLycgKyBwYXRoO1xyXG5cclxuXHRcdGlmICh0aGlzLmxvZykge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnPT09PT09PT09PT09PT09PT09PT09PT09PScpO1xyXG5cdFx0XHRjb25zb2xlLmxvZygnTW5lbW9uaWM6ICVzJywgdGhpcy5tbmVtb25pY1dvcmQpO1xyXG5cdFx0XHRjb25zb2xlLmxvZygnSEQgUGF0aDogJXNcXHJcXG4nLCBoZFBhdGgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE9idGVuZW1vcyBsYSByZWQgc2kgZXMgZWwgY2Fzb1xyXG5cdFx0Y29uc3QgbmV0d29yazogYW55ID0gdGhpcy5zZWd3aXRQYXJhbWV0ZXJzW3RoaXMucHJvdG9jb2xdO1xyXG5cdFx0Ly8gSW5zdGFuY2lhbW9zXHJcblx0XHRjb25zdCBiaXAzMjogQklQMzJBUEkgPSBCSVAzMkZhY3RvcnkoZWNjKTtcclxuXHRcdC8vIE9idGVuZW1vcyBsYSByb290IGtleVxyXG5cdFx0dGhpcy5yb290S2V5ID0gYmlwMzIuZnJvbVNlZWQodGhpcy5zZWVkLCBuZXR3b3JrKTtcclxuXHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBleHRlbmRpZGEgZGUgbGEgY3VlbnRhXHJcblx0XHR0aGlzLmFjY291bnRFeHRlbmRlZEtleSA9IHRoaXMuY2FsY0JpcDMyRXh0ZW5kZWRLZXkodGhpcy5yb290S2V5LCBoZFBhdGgpO1xyXG5cclxuXHRcdGlmICh0aGlzLmxvZykge1xyXG5cdFx0XHQvLyBPYnRlbmVtb3MgbGEgY2xhdmUgcHJpdmFkYSB5IHDDumJsaWNhXHJcblx0XHRcdGNvbnN0IGFjY291bnRYcHJ2OiBzdHJpbmcgPSB0aGlzLmFjY291bnRFeHRlbmRlZEtleS50b0Jhc2U1OCgpO1xyXG5cdFx0XHRjb25zdCBhY2NvdW50WHB1Yjogc3RyaW5nID0gdGhpcy5hY2NvdW50RXh0ZW5kZWRLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xyXG5cclxuXHRcdFx0Y29uc29sZS5sb2coJ0FjY291bnQgRXh0ZW5kZWQgUHJpdmF0ZSBLZXk6ICVzIFxcclxcbkFjY291bnQgRXh0ZW5kZWQgUHVibGljIEtleTogJXNcXHJcXG4nLCBhY2NvdW50WHBydiwgYWNjb3VudFhwdWIpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE9idGVuZW1vcyBlbCB3YWxsZXRcclxuXHRcdGNvbnN0IGtleVBhaXI6IEJJUDMySW50ZXJmYWNlID0gdGhpcy5hY2NvdW50RXh0ZW5kZWRLZXkuZGVyaXZlKGluZGV4KTtcclxuXHJcblx0XHRzd2l0Y2ggKHRoaXMucHJvdG9jb2wpIHtcclxuXHRcdFx0Y2FzZSAnYml0Y29pbic6XHJcblx0XHRcdGNhc2UgJ2JpdGNvaW5SZWdUZXN0JzpcclxuXHRcdFx0Y2FzZSAnbGl0ZWNvaW4nOiB7XHJcblx0XHRcdFx0Ly8gRXh0cmFlbW9zIGxhIGRpcmVjY2nDs25cclxuXHRcdFx0XHRjb25zdCB7IGFkZHJlc3M6IHAyd3BraEFkZHJlc3MgfSA9IHBheW1lbnRzLnAyd3BraCh7IHB1YmtleToga2V5UGFpci5wdWJsaWNLZXksIG5ldHdvcmsgfSk7XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xyXG5cdFx0XHRcdFx0dGhpcy5wcmludFdhbGxldChwMndwa2hBZGRyZXNzLCBrZXlQYWlyLnRvV0lGKCksIGtleVBhaXIucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5pbmNsdWRlUHJpdmF0ZUtleSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHsgcHVibGljS2V5OiBwMndwa2hBZGRyZXNzLCBwcml2YXRlS2V5OiBrZXlQYWlyLnRvV0lGKCkgfTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiB7IHB1YmxpY0tleTogcDJ3cGtoQWRkcmVzcyB9O1xyXG5cdFx0XHR9XHJcblx0XHRcdGNhc2UgJ2V0aGVyZXVtJzoge1xyXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBlbCB3YWxsZXRcclxuXHRcdFx0XHRjb25zdCBldGhlcmV1bVdhbGxldCA9IGhka2V5LmZyb21NYXN0ZXJTZWVkKHRoaXMuc2VlZCkuZGVyaXZlUGF0aChoZFBhdGgpLmRlcml2ZUNoaWxkKGluZGV4KS5nZXRXYWxsZXQoKTtcclxuXHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGRpcmVjY2nDs25cclxuXHRcdFx0XHRjb25zdCBhZGRyZXNzOiBzdHJpbmcgPSBldGhlcmV1bVdhbGxldC5nZXRBZGRyZXNzU3RyaW5nKCk7XHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHByaXZhZGFcclxuXHRcdFx0XHRjb25zdCBwcml2YXRlS2V5OiBzdHJpbmcgPSBldGhlcmV1bVdhbGxldC5nZXRQcml2YXRlS2V5U3RyaW5nKCk7XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xyXG5cdFx0XHRcdFx0dGhpcy5wcmludFdhbGxldChhZGRyZXNzLCBwcml2YXRlS2V5LCBldGhlcmV1bVdhbGxldC5nZXRQdWJsaWNLZXlTdHJpbmcoKSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5pbmNsdWRlUHJpdmF0ZUtleSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHsgcHVibGljS2V5OiBhZGRyZXNzLCBwcml2YXRlS2V5IH07XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4geyBwdWJsaWNLZXk6IGFkZHJlc3MgfTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjYXNlICdyaXBwbGUnOiB7XHJcblx0XHRcdFx0Ly8gRXh0cmFlbW9zIGxhIGRpcmVjY2nDs25cclxuXHRcdFx0XHRjb25zdCB7IGFkZHJlc3M6IHhycEFkZHJlc3MgfSA9IHBheW1lbnRzLnAycGtoKHsgcHVia2V5OiBrZXlQYWlyLnB1YmxpY0tleSB9KTtcclxuXHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGRpcmVjY2nDs25cclxuXHRcdFx0XHRjb25zdCBhZGRyZXNzID0gdGhpcy5jb252ZXJ0UmlwcGxlQWRycih4cnBBZGRyZXNzKTtcclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgY2xhdmUgcHJpdmFkYVxyXG5cdFx0XHRcdGNvbnN0IHByaXZhdGVLZXk6IHN0cmluZyA9IGtleVBhaXIucHJpdmF0ZUtleS50b1N0cmluZygnaGV4Jyk7XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xyXG5cdFx0XHRcdFx0dGhpcy5wcmludFdhbGxldChhZGRyZXNzLCBwcml2YXRlS2V5LCBrZXlQYWlyLnB1YmxpY0tleS50b1N0cmluZygnaGV4JykpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuaW5jbHVkZVByaXZhdGVLZXkpIHtcclxuXHRcdFx0XHRcdHJldHVybiB7IHB1YmxpY0tleTogYWRkcmVzcywgcHJpdmF0ZUtleSB9O1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIHsgcHVibGljS2V5OiBhZGRyZXNzIH07XHJcblx0XHRcdH1cclxuXHRcdFx0Y2FzZSAndHJvbic6IHtcclxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgY2xhdmUgcMO6YmxpY2EgZW4gZm9ybWF0byBkZSBldGhlcmV1bVxyXG5cdFx0XHRcdGNvbnN0IGV0aFB1YktleTogQnVmZmVyID0gaW1wb3J0UHVibGljKGtleVBhaXIucHVibGljS2V5KTtcclxuXHJcblx0XHRcdFx0Ly8gQ2xhdmUgcMO6YmxpY2EgYSBkaXJlY2Npw7NuXHJcblx0XHRcdFx0Y29uc3QgYWRkcmVzc0J1ZmZlcjogQnVmZmVyID0gcHVibGljVG9BZGRyZXNzKGV0aFB1YktleSk7XHJcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGRpcmVjY2nDs25cclxuXHRcdFx0XHRjb25zdCBhZGRyZXNzOiBzdHJpbmcgPSBiaXRjb2luanNBZGRyZXNzLnRvQmFzZTU4Q2hlY2soYWRkcmVzc0J1ZmZlciwgMHg0MSk7XHJcblxyXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBwcml2YWRhXHJcblx0XHRcdFx0Y29uc3QgcHJpdmF0ZUtleTogc3RyaW5nID0ga2V5UGFpci5wcml2YXRlS2V5LnRvU3RyaW5nKCdoZXgnKTtcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMubG9nKSB7XHJcblx0XHRcdFx0XHR0aGlzLnByaW50V2FsbGV0KGFkZHJlc3MsIHByaXZhdGVLZXksIGtleVBhaXIucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5pbmNsdWRlUHJpdmF0ZUtleSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHsgcHVibGljS2V5OiBhZGRyZXNzLCBwcml2YXRlS2V5IH07XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4geyBwdWJsaWNLZXk6IGFkZHJlc3MgfTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsY3VsYXRlIGJpcDMyIGV4dGVuZGVkIGtleSBieSByb290IGtleVxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge0JJUDMySW50ZXJmYWNlfSBiaXAzMlJvb3RLZXlcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxyXG5cdCAqIEByZXR1cm4geyp9ICB7QklQMzJJbnRlcmZhY2V9XHJcblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XHJcblx0ICovXHJcblx0cHJpdmF0ZSBjYWxjQmlwMzJFeHRlbmRlZEtleShiaXAzMlJvb3RLZXk6IEJJUDMySW50ZXJmYWNlLCBwYXRoOiBzdHJpbmcpOiBCSVAzMkludGVyZmFjZSB7XHJcblx0XHRsZXQgZXh0ZW5kZWRLZXk6IEJJUDMySW50ZXJmYWNlID0gYmlwMzJSb290S2V5O1xyXG5cdFx0Y29uc3QgcGF0aEJpdHM6IHN0cmluZ1tdID0gcGF0aC5zcGxpdCgnLycpO1xyXG5cclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aEJpdHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Y29uc3QgYml0OiBzdHJpbmcgPSBwYXRoQml0c1tpXTtcclxuXHRcdFx0Y29uc3QgaW5kZXg6IG51bWJlciA9IHBhcnNlSW50KGJpdCk7XHJcblxyXG5cdFx0XHRpZiAoaXNOYU4oaW5kZXgpKSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGhhcmRlbmVkOiBib29sZWFuID0gYml0W2JpdC5sZW5ndGggLSAxXSA9PT0gXCInXCI7XHJcblxyXG5cdFx0XHRpZiAoaGFyZGVuZWQpIHtcclxuXHRcdFx0XHRleHRlbmRlZEtleSA9IGV4dGVuZGVkS2V5LmRlcml2ZUhhcmRlbmVkKGluZGV4KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRleHRlbmRlZEtleSA9IGV4dGVuZGVkS2V5LmRlcml2ZShpbmRleCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZXh0ZW5kZWRLZXk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0IGFkZHJlc3MgdG8gUmlwcGxlIGFkZHJlc3NcclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcclxuXHQgKiBAcmV0dXJuIHsqfSAge3N0cmluZ31cclxuXHQgKiBAbWVtYmVyb2YgSERXYWxsZXRcclxuXHQgKi9cclxuXHRwcml2YXRlIGNvbnZlcnRSaXBwbGVBZHJyKGFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gYmFzZXgoJ3Jwc2huYWYzOXdCVURORUdISktMTTRQUVJTVDdWV1hZWjJiY2RlQ2c2NWprbThvRnFpMXR1dkF4eXonKS5lbmNvZGUoXHJcblx0XHRcdGJhc2V4KCcxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6JykuZGVjb2RlKGFkZHJlc3MpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHJpbnQgd2FsbGV0XHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBydktleVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwdWJLZXlcclxuXHQgKiBAbWVtYmVyb2YgSERXYWxsZXRcclxuXHQgKi9cclxuXHRwcml2YXRlIHByaW50V2FsbGV0KGFkZHJlc3M6IHN0cmluZywgcHJ2S2V5OiBzdHJpbmcsIHB1YktleTogc3RyaW5nKTogdm9pZCB7XHJcblx0XHRjb25zb2xlLmxvZygnQWRkcmVzczogJXMgXFxyXFxuUHJpdmF0ZSBLZXk6ICVzIFxcclxcblB1YmxpYyBLZXk6ICVzIFxcclxcbj09PT09PT09PT09PT09PT09PT09PT09PT1cXHJcXG5cXHJcXG4nLCBhZGRyZXNzLCBwcnZLZXksIHB1YktleSk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIRFdhbGxldDtcclxuIl0sIm1hcHBpbmdzIjoiaXRDQVFBLEtBQU0sQ0FBQUEsUUFBUyxDQStDZDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFDQ0MsV0FBV0EsQ0FBQ0MsQ0FBZ0IsQ0FBRUMsQ0FBb0IsQ0FBRUMsQ0FBMEIsR0FBUSxDQUFFQyxDQUFZLEdBQVEsQ0FBRSxJQUFBQyxnQkFBQSxDQUFBQyxPQUFBLDBCQXZEM0QsQ0FDbERDLE9BQU8sQ0FBRSxDQUNSQyxhQUFhLENBQUUsK0JBQStCLENBQzlDQyxNQUFNLENBQUUsSUFBSSxDQUNaQyxLQUFLLENBQUUsQ0FDTkMsTUFBTSxDQUFFLFFBQVUsQ0FDbEJDLE9BQU8sQ0FBRSxRQUNWLENBQUMsQ0FDREMsVUFBVSxDQUFFLENBQUksQ0FDaEJDLFVBQVUsQ0FBRSxDQUFJLENBQ2hCQyxHQUFHLENBQUUsR0FDTixDQUFDLENBQ0RDLGNBQWMsQ0FBRSxDQUNmUixhQUFhLENBQUUsK0JBQStCLENBQzlDQyxNQUFNLENBQUUsTUFBTSxDQUNkQyxLQUFLLENBQUUsQ0FDTkMsTUFBTSxDQUFFLFFBQVUsQ0FDbEJDLE9BQU8sQ0FBRSxRQUNWLENBQUMsQ0FDREMsVUFBVSxDQUFFLEdBQUksQ0FDaEJDLFVBQVUsQ0FBRSxHQUFJLENBQ2hCQyxHQUFH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
|
|
23
|
+
const{address:a}=_bitcoinjsLib.payments.p2wpkh({pubkey:f.publicKey,network:d}),b=f.publicKey.toString();// Obtenemos la clave pública
|
|
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
|
|
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
|
|
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
|
|
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/OiBzdHJpbmcgfSB7XG5cdFx0Ly8gQ29uY2F0ZW5hbW9zXG5cdFx0Y29uc3QgaGRQYXRoOiBzdHJpbmcgPSAnbS8nICsgcGF0aDtcblxuXHRcdGlmICh0aGlzLmxvZykge1xuXHRcdFx0Y29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcblx0XHRcdGNvbnNvbGUubG9nKCdNbmVtb25pYzogJXMnLCB0aGlzLm1uZW1vbmljV29yZCk7XG5cdFx0XHRjb25zb2xlLmxvZygnSEQgUGF0aDogJXNcXHJcXG4nLCBoZFBhdGgpO1xuXHRcdH1cblxuXHRcdC8vIE9idGVuZW1vcyBsYSByZWQgc2kgZXMgZWwgY2Fzb1xuXHRcdGNvbnN0IG5ldHdvcms6IGFueSA9IHRoaXMuc2Vnd2l0UGFyYW1ldGVyc1t0aGlzLnByb3RvY29sXTtcblx0XHQvLyBJbnN0YW5jaWFtb3Ncblx0XHRjb25zdCBiaXAzMjogQklQMzJBUEkgPSBCSVAzMkZhY3RvcnkoZWNjKTtcblx0XHQvLyBPYnRlbmVtb3MgbGEgcm9vdCBrZXlcblx0XHR0aGlzLnJvb3RLZXkgPSBiaXAzMi5mcm9tU2VlZCh0aGlzLnNlZWQsIG5ldHdvcmspO1xuXHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBleHRlbmRpZGEgZGUgbGEgY3VlbnRhXG5cdFx0dGhpcy5hY2NvdW50RXh0ZW5kZWRLZXkgPSB0aGlzLmNhbGNCaXAzMkV4dGVuZGVkS2V5KHRoaXMucm9vdEtleSwgaGRQYXRoKTtcblxuXHRcdGlmICh0aGlzLmxvZykge1xuXHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHByaXZhZGEgeSBww7pibGljYVxuXHRcdFx0Y29uc3QgYWNjb3VudFhwcnY6IHN0cmluZyA9IHRoaXMuYWNjb3VudEV4dGVuZGVkS2V5LnRvQmFzZTU4KCk7XG5cdFx0XHRjb25zdCBhY2NvdW50WHB1Yjogc3RyaW5nID0gdGhpcy5hY2NvdW50RXh0ZW5kZWRLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuXG5cdFx0XHRjb25zb2xlLmxvZygnQWNjb3VudCBFeHRlbmRlZCBQcml2YXRlIEtleTogJXMgXFxyXFxuQWNjb3VudCBFeHRlbmRlZCBQdWJsaWMgS2V5OiAlc1xcclxcbicsIGFjY291bnRYcHJ2LCBhY2NvdW50WHB1Yik7XG5cdFx0fVxuXG5cdFx0Ly8gT2J0ZW5lbW9zIGVsIHdhbGxldFxuXHRcdGNvbnN0IGtleVBhaXI6IEJJUDMySW50ZXJmYWNlID0gdGhpcy5hY2NvdW50RXh0ZW5kZWRLZXkuZGVyaXZlKGluZGV4KTtcblxuXHRcdHN3aXRjaCAodGhpcy5wcm90b2NvbCkge1xuXHRcdFx0Y2FzZSAnYml0Y29pbic6XG5cdFx0XHRjYXNlICdiaXRjb2luUmVnVGVzdCc6XG5cdFx0XHRjYXNlICdsaXRlY29pbic6IHtcblx0XHRcdFx0Ly8gRXh0cmFlbW9zIGxhIGRpcmVjY2nDs25cblx0XHRcdFx0Y29uc3QgeyBhZGRyZXNzOiBwMndwa2hBZGRyZXNzIH0gPSBwYXltZW50cy5wMndwa2goeyBwdWJrZXk6IGtleVBhaXIucHVibGljS2V5LCBuZXR3b3JrIH0pO1xuXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYVxuXHRcdFx0XHRjb25zdCBwdWJsaWNLZXkgPSBrZXlQYWlyLnB1YmxpY0tleS50b1N0cmluZygpO1xuXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQocDJ3cGtoQWRkcmVzcywga2V5UGFpci50b1dJRigpLCBwdWJsaWNLZXkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuaW5jbHVkZVByaXZhdGVLZXkpIHtcblx0XHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzOiBwMndwa2hBZGRyZXNzLCBwdWJsaWNLZXksIHByaXZhdGVLZXk6IGtleVBhaXIudG9XSUYoKSB9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzczogcDJ3cGtoQWRkcmVzcywgcHVibGljS2V5IH07XG5cdFx0XHR9XG5cdFx0XHRjYXNlICdldGhlcmV1bSc6IHtcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGVsIHdhbGxldFxuXHRcdFx0XHRjb25zdCBldGhlcmV1bVdhbGxldCA9IGhka2V5LmZyb21NYXN0ZXJTZWVkKHRoaXMuc2VlZCkuZGVyaXZlKGhkUGF0aCkuZGVyaXZlQ2hpbGQoaW5kZXgpO1xuXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYVxuXHRcdFx0XHRjb25zdCBwdWJsaWNLZXkgPSAnMHgnICsgZXRoZXJldW1XYWxsZXQucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKTtcblxuXHRcdFx0XHQvLyBPYnRlbmVtb3MgbGEgY2xhdmUgcHJpdmFkYVxuXHRcdFx0XHRjb25zdCBwcml2YXRlS2V5OiBzdHJpbmcgPSAnMHgnICsgZXRoZXJldW1XYWxsZXQucHJpdmF0ZUtleS50b1N0cmluZygnaGV4Jyk7XG5cblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGRpcmVjY2nDs25cblx0XHRcdFx0Y29uc3QgYWRkcmVzc0J1ZmZlciA9IHB1YmxpY1RvQWRkcmVzcyhldGhlcmV1bVdhbGxldC5wdWJsaWNLZXksIHRydWUpO1xuXHRcdFx0XHRjb25zdCBhZGRyZXNzOiBzdHJpbmcgPSB0b0NoZWNrc3VtQWRkcmVzcygnMHgnICsgQnVmZmVyLmZyb20oYWRkcmVzc0J1ZmZlcikudG9TdHJpbmcoJ2hleCcpKTtcblxuXHRcdFx0XHRpZiAodGhpcy5sb2cpIHtcblx0XHRcdFx0XHR0aGlzLnByaW50V2FsbGV0KGFkZHJlc3MsIHByaXZhdGVLZXksIHB1YmxpY0tleSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGhpcy5pbmNsdWRlUHJpdmF0ZUtleSkge1xuXHRcdFx0XHRcdHJldHVybiB7IGFkZHJlc3MsIHB1YmxpY0tleSwgcHJpdmF0ZUtleSB9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzcywgcHVibGljS2V5IH07XG5cdFx0XHR9XG5cdFx0XHRjYXNlICdyaXBwbGUnOiB7XG5cdFx0XHRcdC8vIEV4dHJhZW1vcyBsYSBkaXJlY2Npw7NuXG5cdFx0XHRcdGNvbnN0IHsgYWRkcmVzczogeHJwQWRkcmVzcyB9ID0gcGF5bWVudHMucDJwa2goeyBwdWJrZXk6IGtleVBhaXIucHVibGljS2V5IH0pO1xuXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYVxuXHRcdFx0XHRjb25zdCBwdWJsaWNLZXkgPSBrZXlQYWlyLnB1YmxpY0tleS50b1N0cmluZygpO1xuXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBwcml2YWRhXG5cdFx0XHRcdGNvbnN0IHByaXZhdGVLZXk6IHN0cmluZyA9IGtleVBhaXIucHJpdmF0ZUtleS50b1N0cmluZygpO1xuXG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBkaXJlY2Npw7NuXG5cdFx0XHRcdGNvbnN0IGFkZHJlc3MgPSB0aGlzLmNvbnZlcnRSaXBwbGVBZHJyKHhycEFkZHJlc3MpO1xuXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQoYWRkcmVzcywgcHJpdmF0ZUtleSwgcHVibGljS2V5KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLmluY2x1ZGVQcml2YXRlS2V5KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzcywgcHVibGljS2V5LCBwcml2YXRlS2V5IH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzLCBwdWJsaWNLZXkgfTtcblx0XHRcdH1cblx0XHRcdGNhc2UgJ3Ryb24nOiB7XG5cdFx0XHRcdC8vIE9idGVuZW1vcyBsYSBjbGF2ZSBww7pibGljYSBlbiBmb3JtYXRvIGRlIGV0aGVyZXVtXG5cdFx0XHRcdGNvbnN0IGV0aFB1YktleSA9IGltcG9ydFB1YmxpYyhrZXlQYWlyLnB1YmxpY0tleSk7XG5cblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHDDumJsaWNhXG5cdFx0XHRcdGNvbnN0IHB1YmxpY0tleSA9IGtleVBhaXIucHVibGljS2V5LnRvU3RyaW5nKCk7XG5cblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGNsYXZlIHByaXZhZGFcblx0XHRcdFx0Y29uc3QgcHJpdmF0ZUtleTogc3RyaW5nID0ga2V5UGFpci5wcml2YXRlS2V5LnRvU3RyaW5nKCk7XG5cblx0XHRcdFx0Ly8gQ2xhdmUgcMO6YmxpY2EgYSBkaXJlY2Npw7NuXG5cdFx0XHRcdGNvbnN0IGFkZHJlc3NCdWZmZXIgPSBwdWJsaWNUb0FkZHJlc3MoZXRoUHViS2V5KTtcblx0XHRcdFx0Ly8gT2J0ZW5lbW9zIGxhIGRpcmVjY2nDs25cblx0XHRcdFx0Y29uc3QgYWRkcmVzczogc3RyaW5nID0gYml0Y29pbmpzQWRkcmVzcy50b0Jhc2U1OENoZWNrKGFkZHJlc3NCdWZmZXIsIDB4NDEpO1xuXG5cdFx0XHRcdGlmICh0aGlzLmxvZykge1xuXHRcdFx0XHRcdHRoaXMucHJpbnRXYWxsZXQoYWRkcmVzcywgcHJpdmF0ZUtleSwgcHVibGljS2V5KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLmluY2x1ZGVQcml2YXRlS2V5KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgYWRkcmVzcywgcHVibGljS2V5LCBwcml2YXRlS2V5IH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4geyBhZGRyZXNzLCBwdWJsaWNLZXkgfTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsY3VsYXRlIGJpcDMyIGV4dGVuZGVkIGtleSBieSByb290IGtleVxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0JJUDMySW50ZXJmYWNlfSBiaXAzMlJvb3RLZXlcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcblx0ICogQHJldHVybiB7Kn0gIHtCSVAzMkludGVyZmFjZX1cblx0ICogQG1lbWJlcm9mIEhEV2FsbGV0XG5cdCAqL1xuXHRwcml2YXRlIGNhbGNCaXAzMkV4dGVuZGVkS2V5KGJpcDMyUm9vdEtleTogQklQMzJJbnRlcmZhY2UsIHBhdGg6IHN0cmluZyk6IEJJUDMySW50ZXJmYWNlIHtcblx0XHRsZXQgZXh0ZW5kZWRLZXk6IEJJUDMySW50ZXJmYWNlID0gYmlwMzJSb290S2V5O1xuXHRcdGNvbnN0IHBhdGhCaXRzOiBzdHJpbmdbXSA9IHBhdGguc3BsaXQoJy8nKTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aEJpdHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGJpdDogc3RyaW5nID0gcGF0aEJpdHNbaV07XG5cdFx0XHRjb25zdCBpbmRleDogbnVtYmVyID0gcGFyc2VJbnQoYml0KTtcblxuXHRcdFx0aWYgKGlzTmFOKGluZGV4KSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaGFyZGVuZWQ6IGJvb2xlYW4gPSBiaXRbYml0Lmxlbmd0aCAtIDFdID09PSBcIidcIjtcblxuXHRcdFx0aWYgKGhhcmRlbmVkKSB7XG5cdFx0XHRcdGV4dGVuZGVkS2V5ID0gZXh0ZW5kZWRLZXkuZGVyaXZlSGFyZGVuZWQoaW5kZXgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZXh0ZW5kZWRLZXkgPSBleHRlbmRlZEtleS5kZXJpdmUoaW5kZXgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBleHRlbmRlZEtleTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IGFkZHJlc3MgdG8gUmlwcGxlIGFkZHJlc3Ncblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3Ncblx0ICogQHJldHVybiB7Kn0gIHtzdHJpbmd9XG5cdCAqIEBtZW1iZXJvZiBIRFdhbGxldFxuXHQgKi9cblx0cHJpdmF0ZSBjb252ZXJ0UmlwcGxlQWRycihhZGRyZXNzOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBiYXNleCgncnBzaG5hZjM5d0JVRE5FR0hKS0xNNFBRUlNUN1ZXWFlaMmJjZGVDZzY1amttOG9GcWkxdHV2QXh5eicpLmVuY29kZShcblx0XHRcdGJhc2V4KCcxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6JykuZGVjb2RlKGFkZHJlc3MpLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJpbnQgd2FsbGV0XG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcnZLZXlcblx0ICogQHBhcmFtIHtzdHJpbmd9IHB1YktleVxuXHQgKiBAbWVtYmVyb2YgSERXYWxsZXRcblx0ICovXG5cdHByaXZhdGUgcHJpbnRXYWxsZXQoYWRkcmVzczogc3RyaW5nLCBwcnZLZXk6IHN0cmluZywgcHViS2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zb2xlLmxvZygnQWRkcmVzczogJXMgXFxyXFxuUHJpdmF0ZSBLZXk6ICVzIFxcclxcblB1YmxpYyBLZXk6ICVzIFxcclxcbj09PT09PT09PT09PT09PT09PT09PT09PT1cXHJcXG5cXHJcXG4nLCBhZGRyZXNzLCBwcnZLZXksIHB1YktleSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSERXYWxsZXQ7XG4iXSwibWFwcGluZ3MiOiIraUNBUUEsS0FBTSxDQUFBQSxRQUFTLENBK0NkO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUNDQyxXQUFXQSxDQUFDQyxDQUFnQixDQUFFQyxDQUFvQixDQUFFQyxDQUEwQixHQUFRLENBQUVDLENBQVksR0FBUSxDQUFFLElBQUFDLGdCQUFBLENBQUFDLE9BQUEsMEJBdkQzRCxDQUNsREMsT0FBTyxDQUFFLENBQ1JDLGFBQWEsQ0FBRSwrQkFBK0IsQ0FDOUNDLE1BQU0sQ0FBRSxJQUFJLENBQ1pDLEtBQUssQ0FBRSxDQUNOQyxNQUFNLENBQUUsUUFBVSxDQUNsQkMsT0FBTyxDQUFFLFFBQ1YsQ0FBQyxDQUNEQyxVQUFVLENBQUUsQ0FBSSxDQUNoQkMsVUFBVSxDQUFFLENBQUksQ0FDaEJDLEdBQUcsQ0FBRSxHQUNOLENBQUMsQ0FDREMsY0FBYyxDQUFFLENBQ2ZSLGFBQWEsQ0FBRSwrQkFBK0IsQ0FDOUNDLE1BQU0sQ0FBRSxNQUFNLENBQ2RDLEtBQUssQ0FBRSxDQUNOQyxNQUFNLENBQUUsUUFBVSxDQUNsQkMsT0FBTyxDQUFFLFFBQ1YsQ0FBQyxDQUNEQyxVQUFVLENBQUUsR0FBSSxDQUNoQkMsVUFBVSxDQUFFLEdBQUksQ0FDaEJDLEdBQUcsQ0FBRSxHQUNOLENBQUMsQ0FDREUsUUFBUSxDQUFFLENBQ1RULGFBQWEsQ0FBRSxnQ0FBZ0MsQ0FDL0NDLE1BQU0sQ0FBRSxLQUFLLENBQ2JDLEtBQUssQ0FBRSxDQUNOQyxNQUFNLENBQUUsUUFBVSxDQUNsQkMsT0FBTyxDQUFFLFFBQ1YsQ0FBQyxDQUNEQyxVQUFVLENBQUUsRUFBSSxDQUNoQkMsVUFBVSxDQUFFLEVBQUksQ0FDaEJDLEdBQUcsQ0FBRSxHQUNOLENBQ0QsQ0FBQyxLQUFBVixnQkFBQSxDQUFBQyxPQUFBLDRCQUFBRCxnQkFBQSxDQUFBQyxPQUFBLHVDQUFBRCxnQkFBQSxDQUFBQyxPQUFBLDZCQUFBRCxnQkFBQSxDQUFBQyxPQUFBLGlDQUFBRCxnQkFBQSxDQUFBQyxPQUFBLHNDQUFBRCxnQkFBQSxDQUFBQyxPQUFBLHlCQUFBRCxnQkFBQSxDQUFBQyxPQUFBLHFCQXNCQSxJQUFJLENBQUNMLFFBQVEsQ0FBR0EsQ0FBUSxDQUN4QixJQUFJLENBQUNDLFlBQVksQ0FBR0EsQ0FBWSxDQUNoQyxJQUFJLENBQUNDLGlCQUFpQixDQUFHQSxDQUFpQixDQUMxQyxJQUFJLENBQUNlLElBQUksQ0FBRyxHQUFBQyx3QkFBa0IsRUFBQyxJQUFJLENBQUNqQixZQUFZLENBQUMsQ0FDakQsSUFBSSxDQUFDRSxHQUFHLENBQUdBLENBQ1osQ0FFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQ1FnQixRQUFRQSxDQUFDQyxDQUFZLENBQUVDLENBQWEsQ0FBK0QsQ0FDekc7QUFDQSxLQUFNLENBQUFDLENBQWMsQ0FBRyxJQUFJLENBQUdGLENBQUksQ0FFOUIsSUFBSSxDQUFDakIsR0FBRyxHQUNYb0IsT0FBTyxDQUFDcEIsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQ3hDb0IsT0FBTyxDQUFDcEIsR0FBRyxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUNGLFlBQVksQ0FBQyxDQUM5Q3NCLE9BQU8sQ0FBQ3BCLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBRW1CLENBQU0sQ0FBQyxFQUd2QztBQUFBLEtBQ00sQ0FBQUUsQ0FBWSxDQUFHLElBQUksQ0FBQ0MsZ0JBQWdCLENBQUMsSUFBSSxDQUFDekIsUUFBUSxDQUFDLENBRW5EUyxDQUFlLENBQUcsR0FBQWlCLFlBQVksRUFBQ0MsR0FBRyxDQUFDLENBRHpDO0FBRUE7QUFLQSxHQUpBLElBQUksQ0FBQ0MsT0FBTyxDQUFHbkIsQ0FBSyxDQUFDb0IsUUFBUSxDQUFDLElBQUksQ0FBQ1osSUFBSSxDQUFFTyxDQUFPLENBQUMsQ0FFakQsSUFBSSxDQUFDTSxrQkFBa0IsQ0FBRyxJQUFJLENBQUNDLG9CQUFvQixDQUFDLElBQUksQ0FBQ0gsT0FBTyxDQUFFTixDQUFNLENBQUMsQ0FFckUsSUFBSSxDQUFDbkIsR0FBRyxDQUFFLENBQ2I7QUFBQSxLQUNNLENBQUE2QixDQUFtQixDQUFHLElBQUksQ0FBQ0Ysa0JBQWtCLENBQUNHLFFBQVEsQ0FBQyxDQUFDLENBQ3hEQyxDQUFtQixDQUFHLElBQUksQ0FBQ0osa0JBQWtCLENBQUNLLFFBQVEsQ0FBQyxDQUFDLENBQUNGLFFBQVEsQ0FBQyxDQUFDLENBRXpFVixPQUFPLENBQUNwQixHQUFHLENBQUMsMEVBQTBFLENBQUU2QixDQUFXLENBQUVFLENBQVcsQ0FDakgsQ0FFQTtBQUNBLEtBQU0sQ0FBQUUsQ0FBdUIsQ0FBRyxJQUFJLENBQUNOLGtCQUFrQixDQUFDTyxNQUFNLENBQUNoQixDQUFLLENBQUMsQ0FFckUsT0FBUSxJQUFJLENBQUNyQixRQUFRLEVBQ3BCLElBQUssU0FBUyxDQUNkLElBQUssZ0JBQWdCLENBQ3JCLElBQUssVUFBVSxDQUFFLENBQ2hCO0FBQUEsS0FDTSxDQUFFc0MsT0FBTyxDQUFFQyxDQUFjLENBQUMsQ0FBR0Msc0JBQVEsQ0FBQ0MsTUFBTSxDQUFDLENBQUVDLE1BQU0sQ0FBRU4sQ0FBTyxDQUFDTyxTQUFTLENBQUVuQixPQUFPLENBQVBBLENBQVEsQ0FBQyxDQUFDLENBR3BGbUIsQ0FBUyxDQUFHUCxDQUFPLENBQUNPLFNBQVMsQ0FBQ0MsUUFBUSxDQUFDLENBQUMsQ0FEOUM7QUFBQSxNQUdJLEtBQUksQ0FBQ3pDLEdBQUcsRUFDWCxJQUFJLENBQUMwQyxXQUFXLENBQUNOLENBQWEsQ0FBRUgsQ0FBTyxDQUFDVSxLQUFLLENBQUMsQ0FBQyxDQUFFSCxDQUFTLENBQUMsQ0FHeEQsSUFBSSxDQUFDekMsaUJBQWlCLENBQ2xCLENBQUVvQyxPQUFPLENBQUVDLENBQWEsQ0FBRUksU0FBUyxDQUFUQSxDQUFTLENBQUVJLFVBQVUsQ0FBRVgsQ0FBTyxDQUFDVSxLQUFLLENBQUMsQ0FBRSxDQUFDLENBR25FLENBQUVSLE9BQU8sQ0FBRUMsQ0FBYSxDQUFFSSxTQUFTLENBQVRBLENBQVUsQ0FDNUMsQ0FDQSxJQUFLLFVBQVUsQ0FBRSxDQUNoQjtBQUFBLEtBQ00sQ0FBQUssQ0FBYyxDQUFHQyxjQUFLLENBQUNDLGNBQWMsQ0FBQyxJQUFJLENBQUNqQyxJQUFJLENBQUMsQ0FBQ29CLE1BQU0sQ0FBQ2YsQ0FBTSxDQUFDLENBQUM2QixXQUFXLENBQUM5QixDQUFLLENBQUMsQ0FHbEZzQixDQUFTLENBQUcsSUFBSSxDQUFHSyxDQUFjLENBQUNMLFNBQVMsQ0FBQ0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUczREcsQ0FBa0IsQ0FBRyxJQUFJLENBQUdDLENBQWMsQ0FBQ0QsVUFBVSxDQUFDSCxRQUFRLENBQUMsS0FBSyxDQUFDLENBR3JFUSxDQUFhLENBQUcsR0FBQUMscUJBQWUsRUFBQ0wsQ0FBYyxDQUFDTCxTQUFTLEdBQU0sQ0FBQyxDQUMvREwsQ0FBZSxDQUFHLEdBQUFnQix1QkFBaUIsRUFBQyxJQUFJLENBQUdDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDSixDQUFhLENBQUMsQ0FBQ1IsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBUjVGO0FBR0E7QUFHQTtBQUFBLE1BSUksS0FBSSxDQUFDekMsR0FBRyxFQUNYLElBQUksQ0FBQzBDLFdBQVcsQ0FBQ1AsQ0FBTyxDQUFFUyxDQUFVLENBQUVKLENBQVMsQ0FBQyxDQUc3QyxJQUFJLENBQUN6QyxpQkFBaUIsQ0FDbEIsQ0FBRW9DLE9BQU8sQ0FBUEEsQ0FBTyxDQUFFSyxTQUFTLENBQVRBLENBQVMsQ0FBRUksVUFBVSxDQUFWQSxDQUFXLENBQUMsQ0FHbkMsQ0FBRVQsT0FBTyxDQUFQQSxDQUFPLENBQUVLLFNBQVMsQ0FBVEEsQ0FBVSxDQUM3QixDQUNBLElBQUssUUFBUSxDQUFFLENBQ2Q7QUFBQSxLQUNNLENBQUVMLE9BQU8sQ0FBRW1CLENBQVcsQ0FBQyxDQUFHakIsc0JBQVEsQ0FBQ2tCLEtBQUssQ0FBQyxDQUFFaEIsTUFBTSxDQUFFTixDQUFPLENBQUNPLFNBQVUsQ0FBQyxDQUFDLENBR3ZFQSxDQUFTLENBQUdQLENBQU8sQ0FBQ08sU0FBUyxDQUFDQyxRQUFRLENBQUMsQ0FBQyxDQUd4Q0csQ0FBa0IsQ0FBR1gsQ0FBTyxDQUFDVyxVQUFVLENBQUNILFFBQVEsQ0FBQyxDQUFDLENBR2xETixDQUFPLENBQUcsSUFBSSxDQUFDcUIsaUJBQWlCLENBQUNGLENBQVUsQ0FBQyxDQVBsRDtBQUdBO0FBR0E7QUFBQSxNQUdJLEtBQUksQ0FBQ3RELEdBQUcsRUFDWCxJQUFJLENBQUMwQyxXQUFXLENBQUNQLENBQU8sQ0FBRVMsQ0FBVSxDQUFFSixDQUFTLENBQUMsQ0FHN0MsSUFBSSxDQUFDekMsaUJBQWlCLENBQ2xCLENBQUVvQyxPQUFPLENBQVBBLENBQU8sQ0FBRUssU0FBUyxDQUFUQSxDQUFTLENBQUVJLFVBQVUsQ0FBVkEsQ0FBVyxDQUFDLENBR25DLENBQUVULE9BQU8sQ0FBUEEsQ0FBTyxDQUFFSyxTQUFTLENBQVRBLENBQVUsQ0FDN0IsQ0FDQSxJQUFLLE1BQU0sQ0FBRSxDQUNaO0FBQUEsS0FDTSxDQUFBaUIsQ0FBUyxDQUFHLEdBQUFDLGtCQUFZLEVBQUN6QixDQUFPLENBQUNPLFNBQVMsQ0FBQyxDQUczQ0EsQ0FBUyxDQUFHUCxDQUFPLENBQUNPLFNBQVMsQ0FBQ0MsUUFBUSxDQUFDLENBQUMsQ0FHeENHLENBQWtCLENBQUdYLENBQU8sQ0FBQ1csVUFBVSxDQUFDSCxRQUFRLENBQUMsQ0FBQyxDQUdsRFEsQ0FBYSxDQUFHLEdBQUFDLHFCQUFlLEVBQUNPLENBQVMsQ0FBQyxDQUUxQ3RCLENBQWUsQ0FBR3dCLHFCQUFnQixDQUFDQyxhQUFhLENBQUNYLENBQWEsQ0FBRSxFQUFJLENBQUMsQ0FUM0U7QUFHQTtBQUdBO0FBRUE7QUFBQSxNQUdJLEtBQUksQ0FBQ2pELEdBQUcsRUFDWCxJQUFJLENBQUMwQyxXQUFXLENBQUNQLENBQU8sQ0FBRVMsQ0FBVSxDQUFFSixDQUFTLENBQUMsQ0FHN0MsSUFBSSxDQUFDekMsaUJBQWlCLENBQ2xCLENBQUVvQyxPQUFPLENBQVBBLENBQU8sQ0FBRUssU0FBUyxDQUFUQSxDQUFTLENBQUVJLFVBQVUsQ0FBVkEsQ0FBVyxDQUFDLENBR25DLENBQUVULE9BQU8sQ0FBUEEsQ0FBTyxDQUFFSyxTQUFTLENBQVRBLENBQVUsQ0FDN0IsQ0FDRCxDQUNELENBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQ1NaLG9CQUFvQkEsQ0FBQ2lDLENBQTRCLENBQUU1QyxDQUFZLENBQWtCLENBQ3hGLEdBQUksQ0FBQTZDLENBQTJCLENBQUdELENBQVksQ0FDOUMsS0FBTSxDQUFBRSxDQUFrQixDQUFHOUMsQ0FBSSxDQUFDK0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUUxQyxJQUFLLEdBQUksQ0FBQUMsQ0FBQyxDQUFHLENBQUMsQ0FBRUEsQ0FBQyxDQUFHRixDQUFRLENBQUNHLE1BQU0sQ0FBRUQsQ0FBQyxFQUFFLENBQUUsTUFDbkMsQ0FBQUUsQ0FBVyxDQUFHSixDQUFRLENBQUNFLENBQUMsQ0FBQyxDQUN6Qi9DLENBQWEsQ0FBR2tELFFBQVEsQ0FBQ0QsQ0FBRyxDQUFDLENBRW5DLEdBQUlFLEtBQUssQ0FBQ25ELENBQUssQ0FBQyxDQUNmLFNBR0QsS0FBTSxDQUFBb0QsQ0FBaUIsQ0FBMkIsR0FBRyxHQUEzQkgsQ0FBRyxDQUFDQSxDQUFHLENBQUNELE1BQU0sQ0FBRyxDQUFDLENBQVMsQ0FHcERKLENBQVcsQ0FEUlEsQ0FBUSxDQUNHUixDQUFXLENBQUNTLGNBQWMsQ0FBQ3JELENBQUssQ0FBQyxDQUVqQzRDLENBQVcsQ0FBQzVCLE1BQU0sQ0FBQ2hCLENBQUssQ0FFeEMsQ0FFQSxNQUFPLENBQUE0QyxDQUFXLENBQ25CLENBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUNTTixpQkFBaUJBLENBQUNyQixDQUFlLENBQVUsQ0FDbEQsTUFBTyxHQUFBcUMsY0FBSyxFQUFDLDREQUE0RCxDQUFDLENBQUNDLE1BQU0sQ0FDaEYsR0FBQUQsY0FBSyxFQUFDLDREQUE0RCxDQUFDLENBQUNFLE1BQU0sQ0FBQ3ZDLENBQU8sQ0FDbkYsQ0FBQyxDQUNGLENBRUE7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQ1NPLFdBQVdBLENBQUNQLENBQWUsQ0FBRXdDLENBQWMsQ0FBRUMsQ0FBYyxDQUFRLENBQzFFeEQsT0FBTyxDQUFDcEIsR0FBRyxDQUFDLDBGQUEwRixDQUFFbUMsQ0FBTyxDQUFFd0MsQ0FBTSxDQUFFQyxDQUFNLENBQ2hJLENBQ0QsQ0FBQyxJQUFBQyxRQUFBLENBQUFDLE9BQUEsQ0FBQTVFLE9BQUEsQ0FFY1AsUUFBUSIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -1,62 +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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* @
|
|
37
|
-
* @param {
|
|
38
|
-
* @
|
|
39
|
-
* @
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* @
|
|
47
|
-
* @
|
|
48
|
-
* @
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* @
|
|
56
|
-
* @param {string}
|
|
57
|
-
* @param {string}
|
|
58
|
-
* @
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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/package.json
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@samyan/hd-wallet",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
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.
|
|
19
|
-
"@babel/core": "^7.
|
|
20
|
-
"@babel/plugin-proposal-decorators": "^7.
|
|
21
|
-
"@babel/plugin-transform-runtime": "^7.
|
|
22
|
-
"@babel/preset-env": "^7.
|
|
23
|
-
"@babel/preset-typescript": "^7.
|
|
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": "^
|
|
30
|
+
"typescript": "^6.0.2",
|
|
31
|
+
"vitest": "^4.1.2"
|
|
26
32
|
},
|
|
27
33
|
"dependencies": {
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"tiny-secp256k1": "^2.2.
|
|
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": [
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
+
}
|