@bitgo/sdk-core 38.16.0 → 38.18.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/dist/src/account-lib/baseCoin/ed25519KeyPair.js +3 -3
- package/dist/src/account-lib/index.d.ts +0 -1
- package/dist/src/account-lib/index.d.ts.map +1 -1
- package/dist/src/account-lib/index.js +1 -2
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +14 -0
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +9 -12
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +8 -83
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -1
- package/dist/src/bitgo/safe/derivableEd25519Pub.js +29 -198
- package/dist/src/bitgo/safe/iSafe.d.ts +5 -0
- package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -1
- package/dist/src/bitgo/safe/iSafe.js +1 -1
- package/dist/src/bitgo/safe/index.d.ts +1 -1
- package/dist/src/bitgo/safe/index.d.ts.map +1 -1
- package/dist/src/bitgo/safe/index.js +2 -2
- package/dist/src/bitgo/safe/safe.d.ts +5 -1
- package/dist/src/bitgo/safe/safe.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safe.js +24 -36
- package/dist/src/bitgo/safe/safes.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safes.js +11 -9
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +20 -3
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +18 -11
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.js +13 -5
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.js +9 -1
- package/dist/src/bitgo/wallet/safeKeychain.js +3 -3
- package/dist/test/unit/bitgo/keychain/keychains.js +15 -29
- package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +72 -76
- package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +50 -175
- package/dist/test/unit/bitgo/safe/safe.js +100 -6
- package/dist/test/unit/bitgo/safe/safeDerivation.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/safeDerivation.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/safeDerivation.js +75 -0
- package/dist/test/unit/bitgo/safe/safes.js +23 -11
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +29 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +0 -50
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +0 -1
- package/dist/src/account-lib/util/ed25519KeyDeriver.js +0 -89
- package/dist/src/bitgo/safe/safeDerivation.d.ts +0 -30
- package/dist/src/bitgo/safe/safeDerivation.d.ts.map +0 -1
- package/dist/src/bitgo/safe/safeDerivation.js +0 -122
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo/sdk-core",
|
|
3
|
-
"version": "38.
|
|
3
|
+
"version": "38.18.0",
|
|
4
4
|
"description": "core library functions for BitGoJS",
|
|
5
5
|
"main": "./dist/src/index.js",
|
|
6
6
|
"types": "./dist/src/index.d.ts",
|
|
@@ -40,11 +40,12 @@
|
|
|
40
40
|
]
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@bitgo/public-types": "6.
|
|
44
|
-
"@bitgo/sdk-lib-mpc": "^
|
|
43
|
+
"@bitgo/public-types": "6.75.0",
|
|
44
|
+
"@bitgo/sdk-lib-mpc": "^11.0.0",
|
|
45
|
+
"@bitgo/sdk-lib-safes": "^1.1.0",
|
|
45
46
|
"@bitgo/secp256k1": "^1.11.1",
|
|
46
47
|
"@bitgo/sjcl": "^1.1.0",
|
|
47
|
-
"@bitgo/statics": "^59.
|
|
48
|
+
"@bitgo/statics": "^59.17.1",
|
|
48
49
|
"@bitgo/utxo-lib": "^11.24.4",
|
|
49
50
|
"@noble/curves": "1.8.1",
|
|
50
51
|
"@stablelib/hex": "^1.0.0",
|
|
@@ -54,7 +55,6 @@
|
|
|
54
55
|
"bignumber.js": "^9.1.1",
|
|
55
56
|
"bs58": "^4.0.1",
|
|
56
57
|
"cbor-x": "1.5.9",
|
|
57
|
-
"create-hmac": "^1.1.7",
|
|
58
58
|
"debug": "^3.1.0",
|
|
59
59
|
"ethereumjs-util": "7.1.5",
|
|
60
60
|
"fp-ts": "^2.12.2",
|
|
@@ -79,5 +79,5 @@
|
|
|
79
79
|
"@types/lodash": "^4.14.151",
|
|
80
80
|
"nyc": "^15.0.0"
|
|
81
81
|
},
|
|
82
|
-
"gitHead": "
|
|
82
|
+
"gitHead": "7420a9b0a2bd96347c33baa5574145c02ba1af44"
|
|
83
83
|
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
export interface HdKeypair {
|
|
2
|
-
key: Buffer;
|
|
3
|
-
chainCode: Buffer;
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Heirarchical determinisitic key derivation for the ed25519 elliptic curve,
|
|
7
|
-
* as defined in SLIP-0010.
|
|
8
|
-
*
|
|
9
|
-
* https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0005.md
|
|
10
|
-
* https://github.com/satoshilabs/slips/blob/master/slip-0010.md
|
|
11
|
-
*
|
|
12
|
-
* @deprecated
|
|
13
|
-
*/
|
|
14
|
-
export declare class Ed25519KeyDeriver {
|
|
15
|
-
/**
|
|
16
|
-
* This key derivation code was copied and adapted from:
|
|
17
|
-
* https://github.com/chatch/stellar-hd-wallet/blob/612c12325ca9047dce460016fb7d148f55f575ca/src/hd-key.js
|
|
18
|
-
*
|
|
19
|
-
* There have been some slight modifications to improve typescript support.
|
|
20
|
-
*
|
|
21
|
-
* The original ed25519-hd-key module is licensed under "GPL-3".
|
|
22
|
-
*/
|
|
23
|
-
private static readonly ED25519_CURVE;
|
|
24
|
-
private static readonly HARDENED_OFFSET;
|
|
25
|
-
private static readonly PATH_REGEX;
|
|
26
|
-
/**
|
|
27
|
-
* Derive a SLIP-0010 key given a path and master key seed.
|
|
28
|
-
*
|
|
29
|
-
* @param path derivation path
|
|
30
|
-
* @param seed key seed
|
|
31
|
-
*/
|
|
32
|
-
static derivePath(path: string, seed: string): HdKeypair;
|
|
33
|
-
/**
|
|
34
|
-
* Generate a SLIP-0010 master key from the entropy seed
|
|
35
|
-
*
|
|
36
|
-
* @param seed master key seed used to recreate master key
|
|
37
|
-
*/
|
|
38
|
-
private static getMasterKeyFromSeed;
|
|
39
|
-
/**
|
|
40
|
-
* Calculate a child private key given the parent key, the chain code, and the child index.
|
|
41
|
-
*
|
|
42
|
-
* @param key parent key
|
|
43
|
-
* @param chainCode chain code for parent key
|
|
44
|
-
* @param index index of child to derive
|
|
45
|
-
*/
|
|
46
|
-
private static CKDPriv;
|
|
47
|
-
private static replaceDerive;
|
|
48
|
-
private static isValidPath;
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=ed25519KeyDeriver.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ed25519KeyDeriver.d.ts","sourceRoot":"","sources":["../../../../src/account-lib/util/ed25519KeyDeriver.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;;OAOG;IAEH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAkB;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAc;IACrD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAkC;IAEpE;;;;;OAKG;WACW,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS;IAY/D;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAWnC;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,OAAO;IAatB,OAAO,CAAC,MAAM,CAAC,aAAa,CAA+D;IAC3F,OAAO,CAAC,MAAM,CAAC,WAAW;CAM3B"}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.Ed25519KeyDeriver = void 0;
|
|
7
|
-
/**
|
|
8
|
-
* @prettier
|
|
9
|
-
*/
|
|
10
|
-
const create_hmac_1 = __importDefault(require("create-hmac"));
|
|
11
|
-
/**
|
|
12
|
-
* Heirarchical determinisitic key derivation for the ed25519 elliptic curve,
|
|
13
|
-
* as defined in SLIP-0010.
|
|
14
|
-
*
|
|
15
|
-
* https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0005.md
|
|
16
|
-
* https://github.com/satoshilabs/slips/blob/master/slip-0010.md
|
|
17
|
-
*
|
|
18
|
-
* @deprecated
|
|
19
|
-
*/
|
|
20
|
-
class Ed25519KeyDeriver {
|
|
21
|
-
/**
|
|
22
|
-
* Derive a SLIP-0010 key given a path and master key seed.
|
|
23
|
-
*
|
|
24
|
-
* @param path derivation path
|
|
25
|
-
* @param seed key seed
|
|
26
|
-
*/
|
|
27
|
-
static derivePath(path, seed) {
|
|
28
|
-
if (!this.isValidPath(path)) {
|
|
29
|
-
throw new Error('Invalid derivation path');
|
|
30
|
-
}
|
|
31
|
-
const { key, chainCode } = this.getMasterKeyFromSeed(seed);
|
|
32
|
-
const segments = path.split('/').slice(1).map(this.replaceDerive);
|
|
33
|
-
return segments.reduce((parentKeys, segment) => this.CKDPriv(parentKeys, segment + Ed25519KeyDeriver.HARDENED_OFFSET), { key, chainCode });
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Generate a SLIP-0010 master key from the entropy seed
|
|
37
|
-
*
|
|
38
|
-
* @param seed master key seed used to recreate master key
|
|
39
|
-
*/
|
|
40
|
-
static getMasterKeyFromSeed(seed) {
|
|
41
|
-
const hmac = (0, create_hmac_1.default)('sha512', Ed25519KeyDeriver.ED25519_CURVE);
|
|
42
|
-
const I = hmac.update(Buffer.from(seed, 'hex')).digest();
|
|
43
|
-
const IL = I.slice(0, 32);
|
|
44
|
-
const IR = I.slice(32);
|
|
45
|
-
return {
|
|
46
|
-
key: IL,
|
|
47
|
-
chainCode: IR,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Calculate a child private key given the parent key, the chain code, and the child index.
|
|
52
|
-
*
|
|
53
|
-
* @param key parent key
|
|
54
|
-
* @param chainCode chain code for parent key
|
|
55
|
-
* @param index index of child to derive
|
|
56
|
-
*/
|
|
57
|
-
static CKDPriv({ key, chainCode }, index) {
|
|
58
|
-
const indexBuffer = Buffer.allocUnsafe(4);
|
|
59
|
-
indexBuffer.writeUInt32BE(index, 0);
|
|
60
|
-
const data = Buffer.concat([Buffer.alloc(1, 0), key, indexBuffer]);
|
|
61
|
-
const I = (0, create_hmac_1.default)('sha512', chainCode).update(data).digest();
|
|
62
|
-
const IL = I.slice(0, 32);
|
|
63
|
-
const IR = I.slice(32);
|
|
64
|
-
return {
|
|
65
|
-
key: IL,
|
|
66
|
-
chainCode: IR,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
static isValidPath(path) {
|
|
70
|
-
if (!Ed25519KeyDeriver.PATH_REGEX.test(path)) {
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
return !path.split('/').slice(1).map(this.replaceDerive).some(isNaN);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
exports.Ed25519KeyDeriver = Ed25519KeyDeriver;
|
|
77
|
-
/**
|
|
78
|
-
* This key derivation code was copied and adapted from:
|
|
79
|
-
* https://github.com/chatch/stellar-hd-wallet/blob/612c12325ca9047dce460016fb7d148f55f575ca/src/hd-key.js
|
|
80
|
-
*
|
|
81
|
-
* There have been some slight modifications to improve typescript support.
|
|
82
|
-
*
|
|
83
|
-
* The original ed25519-hd-key module is licensed under "GPL-3".
|
|
84
|
-
*/
|
|
85
|
-
Ed25519KeyDeriver.ED25519_CURVE = 'ed25519 seed';
|
|
86
|
-
Ed25519KeyDeriver.HARDENED_OFFSET = 0x80000000;
|
|
87
|
-
Ed25519KeyDeriver.PATH_REGEX = new RegExp("^m(\\/[0-9]+')+$");
|
|
88
|
-
Ed25519KeyDeriver.replaceDerive = (val) => parseInt(val.replace("'", ''), 10);
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWQyNTUxOUtleURlcml2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWNjb3VudC1saWIvdXRpbC9lZDI1NTE5S2V5RGVyaXZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7R0FFRztBQUNILDhEQUFxQztBQU9yQzs7Ozs7Ozs7R0FRRztBQUNILE1BQWEsaUJBQWlCO0lBYzVCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFZLEVBQUUsSUFBWTtRQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQ3BCLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxHQUFHLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxFQUM5RixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FDbkIsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssTUFBTSxDQUFDLG9CQUFvQixDQUFDLElBQVk7UUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBQSxxQkFBVSxFQUFDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNuRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDekQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QixPQUFPO1lBQ0wsR0FBRyxFQUFFLEVBQUU7WUFDUCxTQUFTLEVBQUUsRUFBRTtTQUNkLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQWEsRUFBRSxLQUFhO1FBQ2pFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxHQUFHLElBQUEscUJBQVUsRUFBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsT0FBTztZQUNMLEdBQUcsRUFBRSxFQUFFO1lBQ1AsU0FBUyxFQUFFLEVBQUU7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUdPLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBWTtRQUNyQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RSxDQUFDOztBQTFFSCw4Q0EyRUM7QUExRUM7Ozs7Ozs7R0FPRztBQUVxQiwrQkFBYSxHQUFHLGNBQWMsQ0FBQztBQUMvQixpQ0FBZSxHQUFHLFVBQVUsQ0FBQztBQUM3Qiw0QkFBVSxHQUFHLElBQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUF3RHJELCtCQUFhLEdBQUcsQ0FBQyxHQUFXLEVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBjcmVhdGVIbWFjIGZyb20gJ2NyZWF0ZS1obWFjJztcblxuZXhwb3J0IGludGVyZmFjZSBIZEtleXBhaXIge1xuICBrZXk6IEJ1ZmZlcjtcbiAgY2hhaW5Db2RlOiBCdWZmZXI7XG59XG5cbi8qKlxuICogSGVpcmFyY2hpY2FsIGRldGVybWluaXNpdGljIGtleSBkZXJpdmF0aW9uIGZvciB0aGUgZWQyNTUxOSBlbGxpcHRpYyBjdXJ2ZSxcbiAqIGFzIGRlZmluZWQgaW4gU0xJUC0wMDEwLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGVsbGFyL3N0ZWxsYXItcHJvdG9jb2wvYmxvYi9tYXN0ZXIvZWNvc3lzdGVtL3NlcC0wMDA1Lm1kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc2F0b3NoaWxhYnMvc2xpcHMvYmxvYi9tYXN0ZXIvc2xpcC0wMDEwLm1kXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGNsYXNzIEVkMjU1MTlLZXlEZXJpdmVyIHtcbiAgLyoqXG4gICAqIFRoaXMga2V5IGRlcml2YXRpb24gY29kZSB3YXMgY29waWVkIGFuZCBhZGFwdGVkIGZyb206XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGF0Y2gvc3RlbGxhci1oZC13YWxsZXQvYmxvYi82MTJjMTIzMjVjYTkwNDdkY2U0NjAwMTZmYjdkMTQ4ZjU1ZjU3NWNhL3NyYy9oZC1rZXkuanNcbiAgICpcbiAgICogVGhlcmUgaGF2ZSBiZWVuIHNvbWUgc2xpZ2h0IG1vZGlmaWNhdGlvbnMgdG8gaW1wcm92ZSB0eXBlc2NyaXB0IHN1cHBvcnQuXG4gICAqXG4gICAqIFRoZSBvcmlnaW5hbCBlZDI1NTE5LWhkLWtleSBtb2R1bGUgaXMgbGljZW5zZWQgdW5kZXIgXCJHUEwtM1wiLlxuICAgKi9cblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFRDI1NTE5X0NVUlZFID0gJ2VkMjU1MTkgc2VlZCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEhBUkRFTkVEX09GRlNFVCA9IDB4ODAwMDAwMDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFBBVEhfUkVHRVggPSBuZXcgUmVnRXhwKFwiXm0oXFxcXC9bMC05XSsnKSskXCIpO1xuXG4gIC8qKlxuICAgKiBEZXJpdmUgYSBTTElQLTAwMTAga2V5IGdpdmVuIGEgcGF0aCBhbmQgbWFzdGVyIGtleSBzZWVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCBkZXJpdmF0aW9uIHBhdGhcbiAgICogQHBhcmFtIHNlZWQga2V5IHNlZWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVyaXZlUGF0aChwYXRoOiBzdHJpbmcsIHNlZWQ6IHN0cmluZyk6IEhkS2V5cGFpciB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRQYXRoKHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGVyaXZhdGlvbiBwYXRoJyk7XG4gICAgfVxuICAgIGNvbnN0IHsga2V5LCBjaGFpbkNvZGUgfSA9IHRoaXMuZ2V0TWFzdGVyS2V5RnJvbVNlZWQoc2VlZCk7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJykuc2xpY2UoMSkubWFwKHRoaXMucmVwbGFjZURlcml2ZSk7XG4gICAgcmV0dXJuIHNlZ21lbnRzLnJlZHVjZShcbiAgICAgIChwYXJlbnRLZXlzLCBzZWdtZW50KSA9PiB0aGlzLkNLRFByaXYocGFyZW50S2V5cywgc2VnbWVudCArIEVkMjU1MTlLZXlEZXJpdmVyLkhBUkRFTkVEX09GRlNFVCksXG4gICAgICB7IGtleSwgY2hhaW5Db2RlIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgU0xJUC0wMDEwIG1hc3RlciBrZXkgZnJvbSB0aGUgZW50cm9weSBzZWVkXG4gICAqXG4gICAqIEBwYXJhbSBzZWVkIG1hc3RlciBrZXkgc2VlZCB1c2VkIHRvIHJlY3JlYXRlIG1hc3RlciBrZXlcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldE1hc3RlcktleUZyb21TZWVkKHNlZWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGhtYWMgPSBjcmVhdGVIbWFjKCdzaGE1MTInLCBFZDI1NTE5S2V5RGVyaXZlci5FRDI1NTE5X0NVUlZFKTtcbiAgICBjb25zdCBJID0gaG1hYy51cGRhdGUoQnVmZmVyLmZyb20oc2VlZCwgJ2hleCcpKS5kaWdlc3QoKTtcbiAgICBjb25zdCBJTCA9IEkuc2xpY2UoMCwgMzIpO1xuICAgIGNvbnN0IElSID0gSS5zbGljZSgzMik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogSUwsXG4gICAgICBjaGFpbkNvZGU6IElSLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGEgY2hpbGQgcHJpdmF0ZSBrZXkgZ2l2ZW4gdGhlIHBhcmVudCBrZXksIHRoZSBjaGFpbiBjb2RlLCBhbmQgdGhlIGNoaWxkIGluZGV4LlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IHBhcmVudCBrZXlcbiAgICogQHBhcmFtIGNoYWluQ29kZSBjaGFpbiBjb2RlIGZvciBwYXJlbnQga2V5XG4gICAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiBjaGlsZCB0byBkZXJpdmVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIENLRFByaXYoeyBrZXksIGNoYWluQ29kZSB9OiBIZEtleXBhaXIsIGluZGV4OiBudW1iZXIpOiBIZEtleXBhaXIge1xuICAgIGNvbnN0IGluZGV4QnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKDQpO1xuICAgIGluZGV4QnVmZmVyLndyaXRlVUludDMyQkUoaW5kZXgsIDApO1xuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuYWxsb2MoMSwgMCksIGtleSwgaW5kZXhCdWZmZXJdKTtcbiAgICBjb25zdCBJID0gY3JlYXRlSG1hYygnc2hhNTEyJywgY2hhaW5Db2RlKS51cGRhdGUoZGF0YSkuZGlnZXN0KCk7XG4gICAgY29uc3QgSUwgPSBJLnNsaWNlKDAsIDMyKTtcbiAgICBjb25zdCBJUiA9IEkuc2xpY2UoMzIpO1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IElMLFxuICAgICAgY2hhaW5Db2RlOiBJUixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVwbGFjZURlcml2ZSA9ICh2YWw6IHN0cmluZyk6IG51bWJlciA9PiBwYXJzZUludCh2YWwucmVwbGFjZShcIidcIiwgJycpLCAxMCk7XG4gIHByaXZhdGUgc3RhdGljIGlzVmFsaWRQYXRoKHBhdGg6IHN0cmluZykge1xuICAgIGlmICghRWQyNTUxOUtleURlcml2ZXIuUEFUSF9SRUdFWC50ZXN0KHBhdGgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhcGF0aC5zcGxpdCgnLycpLnNsaWNlKDEpLm1hcCh0aGlzLnJlcGxhY2VEZXJpdmUpLnNvbWUoaXNOYU4pO1xuICB9XG59XG4iXX0=
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @prettier
|
|
3
|
-
*
|
|
4
|
-
* @experimental Shared safe child derivation for mint and sign.
|
|
5
|
-
*
|
|
6
|
-
* User child: hardened `m/<index>'` from the sequential `safe.derivationIndex[slot]`.
|
|
7
|
-
* Backup / BitGo children are soft-derived server-side at `m/<index>` (not here).
|
|
8
|
-
*
|
|
9
|
-
* Do not use `derivedFromParentWithSeed` / `deriveKeyWithSeed` (`m/999999/a/b`) —
|
|
10
|
-
* that is the custody hashed path and cannot reproduce a safe child.
|
|
11
|
-
*/
|
|
12
|
-
import * as t from 'io-ts';
|
|
13
|
-
export declare const DERIVED_FROM_PARENT_WITH_HARDENED_PATH: RegExp;
|
|
14
|
-
export declare function parseSafeDerivationIndex(index: string | number): number;
|
|
15
|
-
export declare function getSafeHardenedDerivationPath(index: string | number): string;
|
|
16
|
-
export interface DerivedFromParentWithHardenedPathBrand {
|
|
17
|
-
readonly DerivedFromParentWithHardenedPath: unique symbol;
|
|
18
|
-
}
|
|
19
|
-
export type DerivedFromParentWithHardenedPath = t.Branded<string, DerivedFromParentWithHardenedPathBrand>;
|
|
20
|
-
export declare const DerivedFromParentWithHardenedPath: t.BrandC<t.StringC, DerivedFromParentWithHardenedPathBrand>;
|
|
21
|
-
export declare function parseDerivedFromParentWithHardenedPath(path: string): number;
|
|
22
|
-
export interface SafeHardenedChildKey {
|
|
23
|
-
prv: string;
|
|
24
|
-
pub: string;
|
|
25
|
-
derivationPath: string;
|
|
26
|
-
}
|
|
27
|
-
export declare function deriveSafeChildHardenedFromXprv(rootXprv: string, index: string | number): SafeHardenedChildKey;
|
|
28
|
-
/** Re-derive and assert both results match before the child is registered. */
|
|
29
|
-
export declare function deriveAndSelfCheckSafeChildHardened(rootXprv: string, index: string | number): SafeHardenedChildKey;
|
|
30
|
-
//# sourceMappingURL=safeDerivation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"safeDerivation.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safeDerivation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAK3B,eAAO,MAAM,sCAAsC,QAAgB,CAAC;AAEpE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAavE;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE5E;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,iCAAiC,EAAE,OAAO,MAAM,CAAC;CAC3D;AAED,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC;AAE1G,eAAO,MAAM,iCAAiC,6DAI7C,CAAC;AAcF,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO3E;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACxB;AAaD,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAI9G;AAED,8EAA8E;AAC9E,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAOlH"}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.DerivedFromParentWithHardenedPath = exports.DERIVED_FROM_PARENT_WITH_HARDENED_PATH = void 0;
|
|
37
|
-
exports.parseSafeDerivationIndex = parseSafeDerivationIndex;
|
|
38
|
-
exports.getSafeHardenedDerivationPath = getSafeHardenedDerivationPath;
|
|
39
|
-
exports.parseDerivedFromParentWithHardenedPath = parseDerivedFromParentWithHardenedPath;
|
|
40
|
-
exports.deriveSafeChildHardenedFromXprv = deriveSafeChildHardenedFromXprv;
|
|
41
|
-
exports.deriveAndSelfCheckSafeChildHardened = deriveAndSelfCheckSafeChildHardened;
|
|
42
|
-
/**
|
|
43
|
-
* @prettier
|
|
44
|
-
*
|
|
45
|
-
* @experimental Shared safe child derivation for mint and sign.
|
|
46
|
-
*
|
|
47
|
-
* User child: hardened `m/<index>'` from the sequential `safe.derivationIndex[slot]`.
|
|
48
|
-
* Backup / BitGo children are soft-derived server-side at `m/<index>` (not here).
|
|
49
|
-
*
|
|
50
|
-
* Do not use `derivedFromParentWithSeed` / `deriveKeyWithSeed` (`m/999999/a/b`) —
|
|
51
|
-
* that is the custody hashed path and cannot reproduce a safe child.
|
|
52
|
-
*/
|
|
53
|
-
const t = __importStar(require("io-ts"));
|
|
54
|
-
const utxo_lib_1 = require("@bitgo/utxo-lib");
|
|
55
|
-
const codecs_1 = require("../utils/codecs");
|
|
56
|
-
const MAX_BIP32_INDEX = 0x7fffffff;
|
|
57
|
-
exports.DERIVED_FROM_PARENT_WITH_HARDENED_PATH = /^m\/(\d+)'$/;
|
|
58
|
-
function parseSafeDerivationIndex(index) {
|
|
59
|
-
let idx;
|
|
60
|
-
if (typeof index === 'number') {
|
|
61
|
-
idx = index;
|
|
62
|
-
}
|
|
63
|
-
else if (/^\d+$/.test(index)) {
|
|
64
|
-
idx = Number(index);
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
throw new Error(`Invalid safe derivation index '${index}': expected a non-negative integer`);
|
|
68
|
-
}
|
|
69
|
-
if (!Number.isInteger(idx) || idx < 0 || idx > MAX_BIP32_INDEX) {
|
|
70
|
-
throw new Error(`Invalid safe derivation index '${index}': expected a non-negative integer`);
|
|
71
|
-
}
|
|
72
|
-
return idx;
|
|
73
|
-
}
|
|
74
|
-
function getSafeHardenedDerivationPath(index) {
|
|
75
|
-
return `m/${parseSafeDerivationIndex(index)}'`;
|
|
76
|
-
}
|
|
77
|
-
exports.DerivedFromParentWithHardenedPath = t.brand(t.string, (s) => parseDerivedFromParentWithHardenedPathIndex(s) !== undefined, 'DerivedFromParentWithHardenedPath');
|
|
78
|
-
function parseDerivedFromParentWithHardenedPathIndex(path) {
|
|
79
|
-
const match = exports.DERIVED_FROM_PARENT_WITH_HARDENED_PATH.exec(path);
|
|
80
|
-
if (!match) {
|
|
81
|
-
return undefined;
|
|
82
|
-
}
|
|
83
|
-
try {
|
|
84
|
-
return parseSafeDerivationIndex(match[1]);
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
return undefined;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
function parseDerivedFromParentWithHardenedPath(path) {
|
|
91
|
-
const validated = (0, codecs_1.decodeWithCodec)(exports.DerivedFromParentWithHardenedPath, path, 'derivedFromParentWithHardenedPath');
|
|
92
|
-
const index = parseDerivedFromParentWithHardenedPathIndex(validated);
|
|
93
|
-
if (index === undefined) {
|
|
94
|
-
throw new Error(`Invalid derivedFromParentWithHardenedPath '${path}': expected m/<n>'`);
|
|
95
|
-
}
|
|
96
|
-
return index;
|
|
97
|
-
}
|
|
98
|
-
function childFromNode(child, derivationPath) {
|
|
99
|
-
if (!child.privateKey) {
|
|
100
|
-
throw new Error(`Failed to derive hardened safe child at ${derivationPath}`);
|
|
101
|
-
}
|
|
102
|
-
return {
|
|
103
|
-
prv: child.toBase58(),
|
|
104
|
-
pub: child.neutered().toBase58(),
|
|
105
|
-
derivationPath,
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
function deriveSafeChildHardenedFromXprv(rootXprv, index) {
|
|
109
|
-
const idx = parseSafeDerivationIndex(index);
|
|
110
|
-
const derivationPath = getSafeHardenedDerivationPath(idx);
|
|
111
|
-
return childFromNode(utxo_lib_1.bip32.fromBase58(rootXprv).deriveHardened(idx), derivationPath);
|
|
112
|
-
}
|
|
113
|
-
/** Re-derive and assert both results match before the child is registered. */
|
|
114
|
-
function deriveAndSelfCheckSafeChildHardened(rootXprv, index) {
|
|
115
|
-
const first = deriveSafeChildHardenedFromXprv(rootXprv, index);
|
|
116
|
-
const second = deriveSafeChildHardenedFromXprv(rootXprv, index);
|
|
117
|
-
if (first.pub !== second.pub || first.prv !== second.prv) {
|
|
118
|
-
throw new Error(`Safe child self-check failed at ${first.derivationPath}: derivation was not deterministic`);
|
|
119
|
-
}
|
|
120
|
-
return first;
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZURlcml2YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9zYWZlRGVyaXZhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsNERBYUM7QUFFRCxzRUFFQztBQTBCRCx3RkFPQztBQW1CRCwwRUFJQztBQUdELGtGQU9DO0FBckdEOzs7Ozs7Ozs7O0dBVUc7QUFDSCx5Q0FBMkI7QUFDM0IsOENBQXdEO0FBQ3hELDRDQUFrRDtBQUVsRCxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFDdEIsUUFBQSxzQ0FBc0MsR0FBRyxhQUFhLENBQUM7QUFFcEUsU0FBZ0Isd0JBQXdCLENBQUMsS0FBc0I7SUFDN0QsSUFBSSxHQUFXLENBQUM7SUFDaEIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ2QsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxLQUFLLG9DQUFvQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLGVBQWUsRUFBRSxDQUFDO1FBQy9ELE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLEtBQUssb0NBQW9DLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBZ0IsNkJBQTZCLENBQUMsS0FBc0I7SUFDbEUsT0FBTyxLQUFLLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7QUFDakQsQ0FBQztBQVFZLFFBQUEsaUNBQWlDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FDdEQsQ0FBQyxDQUFDLE1BQU0sRUFDUixDQUFDLENBQUMsRUFBMEMsRUFBRSxDQUFDLDJDQUEyQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFDM0csbUNBQW1DLENBQ3BDLENBQUM7QUFFRixTQUFTLDJDQUEyQyxDQUFDLElBQVk7SUFDL0QsTUFBTSxLQUFLLEdBQUcsOENBQXNDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxPQUFPLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLHNDQUFzQyxDQUFDLElBQVk7SUFDakUsTUFBTSxTQUFTLEdBQUcsSUFBQSx3QkFBZSxFQUFDLHlDQUFpQyxFQUFFLElBQUksRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ2hILE1BQU0sS0FBSyxHQUFHLDJDQUEyQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLElBQUksb0JBQW9CLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBUUQsU0FBUyxhQUFhLENBQUMsS0FBcUIsRUFBRSxjQUFzQjtJQUNsRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELE9BQU87UUFDTCxHQUFHLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtRQUNyQixHQUFHLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRTtRQUNoQyxjQUFjO0tBQ2YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQiwrQkFBK0IsQ0FBQyxRQUFnQixFQUFFLEtBQXNCO0lBQ3RGLE1BQU0sR0FBRyxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLE1BQU0sY0FBYyxHQUFHLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFELE9BQU8sYUFBYSxDQUFDLGdCQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLFNBQWdCLG1DQUFtQyxDQUFDLFFBQWdCLEVBQUUsS0FBc0I7SUFDMUYsTUFBTSxLQUFLLEdBQUcsK0JBQStCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9ELE1BQU0sTUFBTSxHQUFHLCtCQUErQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6RCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxLQUFLLENBQUMsY0FBYyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQy9HLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgU2hhcmVkIHNhZmUgY2hpbGQgZGVyaXZhdGlvbiBmb3IgbWludCBhbmQgc2lnbi5cbiAqXG4gKiBVc2VyIGNoaWxkOiBoYXJkZW5lZCBgbS88aW5kZXg+J2AgZnJvbSB0aGUgc2VxdWVudGlhbCBgc2FmZS5kZXJpdmF0aW9uSW5kZXhbc2xvdF1gLlxuICogQmFja3VwIC8gQml0R28gY2hpbGRyZW4gYXJlIHNvZnQtZGVyaXZlZCBzZXJ2ZXItc2lkZSBhdCBgbS88aW5kZXg+YCAobm90IGhlcmUpLlxuICpcbiAqIERvIG5vdCB1c2UgYGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWRgIC8gYGRlcml2ZUtleVdpdGhTZWVkYCAoYG0vOTk5OTk5L2EvYmApIOKAlFxuICogdGhhdCBpcyB0aGUgY3VzdG9keSBoYXNoZWQgcGF0aCBhbmQgY2Fubm90IHJlcHJvZHVjZSBhIHNhZmUgY2hpbGQuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0IHsgYmlwMzIsIEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IGRlY29kZVdpdGhDb2RlYyB9IGZyb20gJy4uL3V0aWxzL2NvZGVjcyc7XG5cbmNvbnN0IE1BWF9CSVAzMl9JTkRFWCA9IDB4N2ZmZmZmZmY7XG5leHBvcnQgY29uc3QgREVSSVZFRF9GUk9NX1BBUkVOVF9XSVRIX0hBUkRFTkVEX1BBVEggPSAvXm1cXC8oXFxkKyknJC87XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoaW5kZXg6IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpZHg6IG51bWJlcjtcbiAgaWYgKHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicpIHtcbiAgICBpZHggPSBpbmRleDtcbiAgfSBlbHNlIGlmICgvXlxcZCskLy50ZXN0KGluZGV4KSkge1xuICAgIGlkeCA9IE51bWJlcihpbmRleCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNhZmUgZGVyaXZhdGlvbiBpbmRleCAnJHtpbmRleH0nOiBleHBlY3RlZCBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYCk7XG4gIH1cbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlkeCkgfHwgaWR4IDwgMCB8fCBpZHggPiBNQVhfQklQMzJfSU5ERVgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2FmZSBkZXJpdmF0aW9uIGluZGV4ICcke2luZGV4fSc6IGV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgfVxuICByZXR1cm4gaWR4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FmZUhhcmRlbmVkRGVyaXZhdGlvblBhdGgoaW5kZXg6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgbS8ke3BhcnNlU2FmZURlcml2YXRpb25JbmRleChpbmRleCl9J2A7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoQnJhbmQge1xuICByZWFkb25seSBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGg6IHVuaXF1ZSBzeW1ib2w7XG59XG5cbmV4cG9ydCB0eXBlIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCA9IHQuQnJhbmRlZDxzdHJpbmcsIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aEJyYW5kPjtcblxuZXhwb3J0IGNvbnN0IERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCA9IHQuYnJhbmQoXG4gIHQuc3RyaW5nLFxuICAocyk6IHMgaXMgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoID0+IHBhcnNlRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoSW5kZXgocykgIT09IHVuZGVmaW5lZCxcbiAgJ0Rlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCdcbik7XG5cbmZ1bmN0aW9uIHBhcnNlRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoSW5kZXgocGF0aDogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2ggPSBERVJJVkVEX0ZST01fUEFSRU5UX1dJVEhfSEFSREVORURfUEFUSC5leGVjKHBhdGgpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgobWF0Y2hbMV0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aChwYXRoOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCB2YWxpZGF0ZWQgPSBkZWNvZGVXaXRoQ29kZWMoRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoLCBwYXRoLCAnZGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoJyk7XG4gIGNvbnN0IGluZGV4ID0gcGFyc2VEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGhJbmRleCh2YWxpZGF0ZWQpO1xuICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGggJyR7cGF0aH0nOiBleHBlY3RlZCBtLzxuPidgKTtcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBwcnY6IHN0cmluZztcbiAgcHViOiBzdHJpbmc7XG4gIGRlcml2YXRpb25QYXRoOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGNoaWxkRnJvbU5vZGUoY2hpbGQ6IEJJUDMySW50ZXJmYWNlLCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBpZiAoIWNoaWxkLnByaXZhdGVLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZXJpdmUgaGFyZGVuZWQgc2FmZSBjaGlsZCBhdCAke2Rlcml2YXRpb25QYXRofWApO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHJ2OiBjaGlsZC50b0Jhc2U1OCgpLFxuICAgIHB1YjogY2hpbGQubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgIGRlcml2YXRpb25QYXRoLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydihyb290WHBydjogc3RyaW5nLCBpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBjb25zdCBpZHggPSBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoaW5kZXgpO1xuICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9IGdldFNhZmVIYXJkZW5lZERlcml2YXRpb25QYXRoKGlkeCk7XG4gIHJldHVybiBjaGlsZEZyb21Ob2RlKGJpcDMyLmZyb21CYXNlNTgocm9vdFhwcnYpLmRlcml2ZUhhcmRlbmVkKGlkeCksIGRlcml2YXRpb25QYXRoKTtcbn1cblxuLyoqIFJlLWRlcml2ZSBhbmQgYXNzZXJ0IGJvdGggcmVzdWx0cyBtYXRjaCBiZWZvcmUgdGhlIGNoaWxkIGlzIHJlZ2lzdGVyZWQuICovXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlQW5kU2VsZkNoZWNrU2FmZUNoaWxkSGFyZGVuZWQocm9vdFhwcnY6IHN0cmluZywgaW5kZXg6IHN0cmluZyB8IG51bWJlcik6IFNhZmVIYXJkZW5lZENoaWxkS2V5IHtcbiAgY29uc3QgZmlyc3QgPSBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZEZyb21YcHJ2KHJvb3RYcHJ2LCBpbmRleCk7XG4gIGNvbnN0IHNlY29uZCA9IGRlcml2ZVNhZmVDaGlsZEhhcmRlbmVkRnJvbVhwcnYocm9vdFhwcnYsIGluZGV4KTtcbiAgaWYgKGZpcnN0LnB1YiAhPT0gc2Vjb25kLnB1YiB8fCBmaXJzdC5wcnYgIT09IHNlY29uZC5wcnYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNhZmUgY2hpbGQgc2VsZi1jaGVjayBmYWlsZWQgYXQgJHtmaXJzdC5kZXJpdmF0aW9uUGF0aH06IGRlcml2YXRpb24gd2FzIG5vdCBkZXRlcm1pbmlzdGljYCk7XG4gIH1cbiAgcmV0dXJuIGZpcnN0O1xufVxuIl19
|