@bitgo/sdk-core 38.9.1 → 38.11.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/bitgo/baseCoin/iBaseCoin.d.ts +8 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/defi/defiVault.d.ts +21 -1
- package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -1
- package/dist/src/bitgo/defi/defiVault.js +36 -12
- package/dist/src/bitgo/defi/iDefiVault.d.ts +2 -1
- package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -1
- package/dist/src/bitgo/defi/iDefiVault.js +1 -1
- package/dist/src/bitgo/environments.js +3 -3
- package/dist/src/bitgo/keychain/iKeychains.d.ts +7 -1
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +1 -1
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +5 -1
- package/dist/src/bitgo/safe/iSafe.d.ts +4 -2
- 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/iSafes.d.ts +13 -8
- package/dist/src/bitgo/safe/iSafes.d.ts.map +1 -1
- package/dist/src/bitgo/safe/iSafes.js +1 -1
- package/dist/src/bitgo/safe/safe.d.ts +3 -8
- package/dist/src/bitgo/safe/safe.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safe.js +138 -4
- package/dist/src/bitgo/safe/safeDerivation.d.ts +22 -3
- package/dist/src/bitgo/safe/safeDerivation.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safeDerivation.js +100 -17
- package/dist/src/bitgo/safe/safes.d.ts +7 -6
- package/dist/src/bitgo/safe/safes.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safes.js +27 -19
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +12 -1
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -1
- package/dist/src/bitgo/tss/bitgoPubKeys.js +22 -2
- package/dist/src/bitgo/tss/common.d.ts +2 -1
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +1 -1
- package/dist/src/bitgo/utils/opengpgUtils.d.ts +1 -0
- package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/opengpgUtils.js +5 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +6 -2
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +31 -7
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +9 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +9 -3
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +19 -3
- package/dist/src/bitgo/utils/tss/index.d.ts +2 -0
- package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/index.js +4 -2
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +1 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.js +4 -2
- package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts +29 -0
- package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.js +128 -0
- package/dist/src/bitgo/utils/tss/redpallas/index.d.ts +4 -0
- package/dist/src/bitgo/utils/tss/redpallas/index.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/redpallas/index.js +20 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +30 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.js +46 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts +46 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.js +55 -0
- package/dist/src/bitgo/utils/tss/signableConsistency.d.ts +12 -0
- package/dist/src/bitgo/utils/tss/signableConsistency.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/signableConsistency.js +9 -0
- package/dist/src/bitgo/wallet/iWallet.d.ts +3 -2
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/safeKeychain.d.ts +2 -2
- package/dist/src/bitgo/wallet/safeKeychain.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/safeKeychain.js +7 -7
- package/dist/src/bitgo/wallet/wallet.d.ts +8 -0
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +11 -5
- package/dist/test/unit/bitgo/defi/defiVault.js +56 -1
- package/dist/test/unit/bitgo/safe/safe.js +148 -5
- package/dist/test/unit/bitgo/safe/safes.js +45 -4
- package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts +2 -0
- package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
- package/dist/test/unit/bitgo/tss/bitgoPubKeys.js +66 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +121 -1
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +14 -1
- package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.js +81 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.js +281 -0
- package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.js +111 -0
- package/dist/test/unit/bitgo/wallet/safeGetUserPrv.js +82 -25
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -1,4 +1,37 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.Safe = void 0;
|
|
4
37
|
/**
|
|
@@ -7,9 +40,54 @@ exports.Safe = void 0;
|
|
|
7
40
|
* @experimental The safe client surface is experimental and may change (including breaking
|
|
8
41
|
* changes) before the public release.
|
|
9
42
|
*/
|
|
43
|
+
const t = __importStar(require("io-ts"));
|
|
10
44
|
const public_types_1 = require("@bitgo/public-types");
|
|
45
|
+
const statics_1 = require("@bitgo/statics");
|
|
46
|
+
const errors_1 = require("../errors");
|
|
47
|
+
const keychain_1 = require("../keychain");
|
|
11
48
|
const codecs_1 = require("../utils/codecs");
|
|
12
49
|
const postWithCodec_1 = require("../utils/postWithCodec");
|
|
50
|
+
const wallet_1 = require("../wallet");
|
|
51
|
+
const safeKeychain_1 = require("../wallet/safeKeychain");
|
|
52
|
+
const safeDerivation_1 = require("./safeDerivation");
|
|
53
|
+
const SafeRootKeySlot = t.keyof({
|
|
54
|
+
secp256k1Multisig: null,
|
|
55
|
+
ecdsaMpc: null,
|
|
56
|
+
eddsaMpc: null,
|
|
57
|
+
ed25519Multisig: null,
|
|
58
|
+
});
|
|
59
|
+
const GetDerivationIndexResponse = t.type({
|
|
60
|
+
slot: SafeRootKeySlot,
|
|
61
|
+
index: (0, codecs_1.boundedInt)(0, 0x7fffffff, 'derivationIndex'),
|
|
62
|
+
});
|
|
63
|
+
const CreateWalletInSafeBody = t.strict({
|
|
64
|
+
coin: t.string,
|
|
65
|
+
label: t.string,
|
|
66
|
+
type: t.literal('hot'),
|
|
67
|
+
multisigType: t.literal('onchain'),
|
|
68
|
+
keys: t.tuple([t.string]),
|
|
69
|
+
});
|
|
70
|
+
function onchainSlotForCoin(coin) {
|
|
71
|
+
if (coin.getDefaultMultisigType() === 'tss') {
|
|
72
|
+
throw new Error('MPC safe wallet minting is not yet implemented; use a slot-1 onchain coin');
|
|
73
|
+
}
|
|
74
|
+
const curve = statics_1.coins.get(coin.getChain()).primaryKeyCurve;
|
|
75
|
+
if (curve === statics_1.KeyCurve.Secp256k1) {
|
|
76
|
+
return 'secp256k1Multisig';
|
|
77
|
+
}
|
|
78
|
+
if (curve === statics_1.KeyCurve.Ed25519) {
|
|
79
|
+
throw new Error('ed25519 coin safe wallet minting is not yet supported');
|
|
80
|
+
}
|
|
81
|
+
throw new Error(`Coin '${coin.getChain()}' is not supported for safe wallet minting`);
|
|
82
|
+
}
|
|
83
|
+
function userRootIdFromSafe(safe, slot) {
|
|
84
|
+
const triplet = safe.rootKeys?.hot?.[slot];
|
|
85
|
+
if (!triplet || triplet.length !== 3) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
const userRootId = triplet[0];
|
|
89
|
+
return userRootId.length > 0 ? userRootId : undefined;
|
|
90
|
+
}
|
|
13
91
|
/**
|
|
14
92
|
* @experimental
|
|
15
93
|
*/
|
|
@@ -38,11 +116,67 @@ class Safe {
|
|
|
38
116
|
return this.bitgo.url(`/enterprise/${this.enterpriseId()}/safes/${this.id()}${extra}`, 2);
|
|
39
117
|
}
|
|
40
118
|
/**
|
|
41
|
-
* Mint a child wallet
|
|
42
|
-
*
|
|
119
|
+
* Mint a child wallet: peek the sequential index, hardened-derive the user child,
|
|
120
|
+
* register it public-only, then mint. Backup and BitGo children are soft-derived on the server.
|
|
43
121
|
*/
|
|
44
122
|
async createWallet(params) {
|
|
45
|
-
|
|
123
|
+
if (params.passphrase.length === 0) {
|
|
124
|
+
throw new Error('passphrase is required to mint a safe wallet');
|
|
125
|
+
}
|
|
126
|
+
if (params.type !== undefined && params.type !== 'hot') {
|
|
127
|
+
throw new Error('Safe wallets are hot-only in v1');
|
|
128
|
+
}
|
|
129
|
+
if (params.multisigType === 'tss') {
|
|
130
|
+
throw new Error('MPC safe wallet minting is not yet implemented; use multisigType "onchain"');
|
|
131
|
+
}
|
|
132
|
+
const coin = this.bitgo.coin(params.coin);
|
|
133
|
+
const slot = onchainSlotForCoin(coin);
|
|
134
|
+
const indexResponse = await this.bitgo.get(this.url('/derivation-index')).query({ slot }).result();
|
|
135
|
+
const peeked = (0, codecs_1.decodeWithCodec)(GetDerivationIndexResponse, indexResponse, 'GetDerivationIndexResponse');
|
|
136
|
+
if (peeked.slot !== slot) {
|
|
137
|
+
throw new Error(`derivation-index returned slot '${peeked.slot}', expected '${slot}'`);
|
|
138
|
+
}
|
|
139
|
+
const { index } = peeked;
|
|
140
|
+
const userRootId = userRootIdFromSafe(this._safe, slot) ?? userRootIdFromSafe(await this.fetchSafeData(), slot);
|
|
141
|
+
if (userRootId === undefined) {
|
|
142
|
+
throw new Error(`Safe ${this.id()} is missing rootKeys.hot.${slot}`);
|
|
143
|
+
}
|
|
144
|
+
const keychains = coin.keychains();
|
|
145
|
+
const rootKeychain = await keychains.get({ id: userRootId });
|
|
146
|
+
if (rootKeychain.source !== 'user') {
|
|
147
|
+
throw new safeKeychain_1.InvalidRootKeychainSourceError(rootKeychain.id, rootKeychain.source);
|
|
148
|
+
}
|
|
149
|
+
const rootPrv = await (0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, rootKeychain, params.passphrase);
|
|
150
|
+
if (!rootPrv) {
|
|
151
|
+
throw new errors_1.IncorrectPasswordError();
|
|
152
|
+
}
|
|
153
|
+
const derived = (0, safeDerivation_1.deriveAndSelfCheckSafeChildHardened)(rootPrv, index);
|
|
154
|
+
const derivedFromParentWithHardenedPath = (0, codecs_1.decodeWithCodec)(safeDerivation_1.DerivedFromParentWithHardenedPath, derived.derivationPath, 'derivedFromParentWithHardenedPath');
|
|
155
|
+
const child = await keychains.add({
|
|
156
|
+
pub: derived.pub,
|
|
157
|
+
source: 'user',
|
|
158
|
+
keyType: 'independent',
|
|
159
|
+
parent: userRootId,
|
|
160
|
+
safeId: this.id(),
|
|
161
|
+
derivedFromParentWithHardenedPath,
|
|
162
|
+
});
|
|
163
|
+
const childId = child.id;
|
|
164
|
+
if (childId.length === 0) {
|
|
165
|
+
throw new Error('safe child key registration returned an empty id');
|
|
166
|
+
}
|
|
167
|
+
const keys = [childId];
|
|
168
|
+
const response = await (0, postWithCodec_1.postWithCodec)(this.bitgo, this.url('/wallets'), CreateWalletInSafeBody, {
|
|
169
|
+
coin: params.coin,
|
|
170
|
+
label: params.label,
|
|
171
|
+
type: 'hot',
|
|
172
|
+
multisigType: 'onchain',
|
|
173
|
+
keys,
|
|
174
|
+
}).result();
|
|
175
|
+
return new wallet_1.Wallet(this.bitgo, coin, response);
|
|
176
|
+
}
|
|
177
|
+
async fetchSafeData() {
|
|
178
|
+
const response = await this.bitgo.get(this.url()).result();
|
|
179
|
+
return (0, codecs_1.decodeWithCodec)(public_types_1.SafeData, response, 'SafeData');
|
|
46
180
|
}
|
|
47
181
|
/**
|
|
48
182
|
* Add a member to the whole safe (view/admin/spend). Spend opens a key share.
|
|
@@ -93,4 +227,4 @@ class Safe {
|
|
|
93
227
|
}
|
|
94
228
|
}
|
|
95
229
|
exports.Safe = Safe;
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL3NhZmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7O0dBS0c7QUFDSCxzREFBOEY7QUFFOUYsNENBQWtEO0FBQ2xELDBEQUF1RDtBQVd2RDs7R0FFRztBQUNILE1BQWEsSUFBSTtJQUlmLFlBQVksS0FBZ0IsRUFBRSxRQUFrQjtRQUM5QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztJQUN4QixDQUFDO0lBRUQsRUFBRTtRQUNBLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRTtRQUNaLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQStCO1FBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUE0QjtRQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFrQztRQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBcUMsRUFBRTtRQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBOEI7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQXlCLEVBQUU7UUFDdEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLDZCQUFhLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLDZCQUFjLEVBQUUsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkcsT0FBTyxJQUFBLHdCQUFlLEVBQUMsdUJBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0UsT0FBTyxJQUFBLHdCQUFlLEVBQUMsdUJBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBOUZELG9CQThGQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgc2FmZSBjbGllbnQgc3VyZmFjZSBpcyBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgKGluY2x1ZGluZyBicmVha2luZ1xuICogY2hhbmdlcykgYmVmb3JlIHRoZSBwdWJsaWMgcmVsZWFzZS5cbiAqL1xuaW1wb3J0IHsgRnJlZXplU2FmZUJvZHksIFNhZmVEYXRhLCBTYWZlU2hhcmVEYXRhLCBTYWZlU2hhcmVTdGF0ZSB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IGRlY29kZVdpdGhDb2RlYyB9IGZyb20gJy4uL3V0aWxzL2NvZGVjcyc7XG5pbXBvcnQgeyBwb3N0V2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvcG9zdFdpdGhDb2RlYyc7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuLi93YWxsZXQnO1xuaW1wb3J0IHtcbiAgQWNjZXB0U2FmZVNoYXJlT3B0aW9ucyxcbiAgQWRkU2FmZU1lbWJlck9wdGlvbnMsXG4gIEFkZFNhZmVXYWxsZXRNZW1iZXJPcHRpb25zLFxuICBDcmVhdGVTYWZlV2FsbGV0T3B0aW9ucyxcbiAgSVNhZmUsXG4gIFdhbGxldFNoYXJlRGF0YSxcbn0gZnJvbSAnLi9pU2FmZSc7XG5cbi8qKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY2xhc3MgU2FmZSBpbXBsZW1lbnRzIElTYWZlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwdWJsaWMgcmVhZG9ubHkgX3NhZmU6IFNhZmVEYXRhO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHNhZmVEYXRhOiBTYWZlRGF0YSkge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLl9zYWZlID0gc2FmZURhdGE7XG4gIH1cblxuICBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zYWZlLmlkO1xuICB9XG5cbiAgZW50ZXJwcmlzZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmUuZW50ZXJwcmlzZUlkO1xuICB9XG5cbiAgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5sYWJlbDtcbiAgfVxuXG4gIHN0YXR1cygpOiBTYWZlRGF0YVsnc3RhdHVzJ10ge1xuICAgIHJldHVybiB0aGlzLl9zYWZlLnN0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRlcnByaXNlLXNjb3BlZCB2MiBVUkwgZm9yIHRoaXMgc2FmZSwgZS5nLiAvYXBpL3YyL2VudGVycHJpc2UvOmVJZC9zYWZlcy86c2FmZUlkXG4gICAqIEBwYXJhbSBleHRyYVxuICAgKi9cbiAgdXJsKGV4dHJhID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJpdGdvLnVybChgL2VudGVycHJpc2UvJHt0aGlzLmVudGVycHJpc2VJZCgpfS9zYWZlcy8ke3RoaXMuaWQoKX0ke2V4dHJhfWAsIDIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbnQgYSBjaGlsZCB3YWxsZXQgaW4gdGhpcyBzYWZlIChzZXJ2ZXItc2lkZSBwdWJsaWMgZGVyaXZhdGlvbiDigJQgbm8gY2VyZW1vbnkpLlxuICAgKiBCb2R5IGxhbmRzIGluIFdDTi0xMjAzLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlV2FsbGV0KHBhcmFtczogQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnMpOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZS5jcmVhdGVXYWxsZXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCAoV0NOLTEyMDMpJyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbWVtYmVyIHRvIHRoZSB3aG9sZSBzYWZlICh2aWV3L2FkbWluL3NwZW5kKS4gU3BlbmQgb3BlbnMgYSBrZXkgc2hhcmUuXG4gICAqIEJvZHkgbGFuZHMgaW4gV0NOLTEyMDQuXG4gICAqL1xuICBhc3luYyBhZGRNZW1iZXIocGFyYW1zOiBBZGRTYWZlTWVtYmVyT3B0aW9ucyk6IFByb21pc2U8U2FmZURhdGE+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUuYWRkTWVtYmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKFdDTi0xMjA0KScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIE9ORSBzYWZlIHdhbGxldCB3aXRoIGEgbm9uLW1lbWJlciB2aWEgdGhlIGV4aXN0aW5nIHdhbGxldC1zaGFyZSBoYW5kc2hha2UgKEZSLTEzKS5cbiAgICogQm9keSBsYW5kcyBpbiBXQ04tMTIwNC5cbiAgICovXG4gIGFzeW5jIGFkZE1lbWJlclRvV2FsbGV0KHBhcmFtczogQWRkU2FmZVdhbGxldE1lbWJlck9wdGlvbnMpOiBQcm9taXNlPFdhbGxldFNoYXJlRGF0YT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZS5hZGRNZW1iZXJUb1dhbGxldCBpcyBub3QgeWV0IGltcGxlbWVudGVkIChXQ04tMTIwNCknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSBzYWZlIGtleSBzaGFyZXMgdmlzaWJsZSB0byB0aGUgY2FsbGVyLlxuICAgKiBCb2R5IGxhbmRzIGluIFdDTi0xMjA0LlxuICAgKi9cbiAgYXN5bmMgbGlzdFNoYXJlcyhwYXJhbXM6IHsgc3RhdGU/OiBTYWZlU2hhcmVTdGF0ZSB9ID0ge30pOiBQcm9taXNlPFNhZmVTaGFyZURhdGFbXT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZS5saXN0U2hhcmVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKFdDTi0xMjA0KScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdCBhIHNhZmUga2V5IHNoYXJlIGFkZHJlc3NlZCB0byB0aGUgY2FsbGVyLlxuICAgKiBCb2R5IGxhbmRzIGluIFdDTi0xMjA0LlxuICAgKi9cbiAgYXN5bmMgYWNjZXB0U2hhcmUocGFyYW1zOiBBY2NlcHRTYWZlU2hhcmVPcHRpb25zKTogUHJvbWlzZTxTYWZlU2hhcmVEYXRhPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlLmFjY2VwdFNoYXJlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKFdDTi0xMjA0KScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyZWV6ZSB0aGUgc2FmZSDigJQgYmxvY2tzIHdpdGhkcmF3YWxzIG9uIGFsbCBzYWZlIHdhbGxldHMuIFNhZmUgc3RheXMgJ2FjdGl2ZScuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGZyZWV6ZShwYXJhbXM6IEZyZWV6ZVNhZmVCb2R5ID0ge30pOiBQcm9taXNlPFNhZmVEYXRhPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0V2l0aENvZGVjKHRoaXMuYml0Z28sIHRoaXMudXJsKCcvZnJlZXplJyksIEZyZWV6ZVNhZmVCb2R5LCBwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcmNoaXZlIHRoZSBzYWZlLiBSZXF1aXJlcyBldmVyeSBzYWZlIHdhbGxldCB0byBhbHJlYWR5IGJlIGFyY2hpdmVkOyBhbHNvIHRoZSBhYmFuZG9ubWVudFxuICAgKiBwYXRoIGZvciBhIHN0dWNrICdpbml0aWFsaXppbmcnIHNhZmUuXG4gICAqL1xuICBhc3luYyBhcmNoaXZlKCk6IFByb21pc2U8U2FmZURhdGE+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2FyY2hpdmUnKSkuc2VuZCgpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIHRvSlNPTigpOiBTYWZlRGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmU7XG4gIH1cbn1cbiJdfQ==
|
|
230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL3NhZmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7O0dBS0c7QUFDSCx5Q0FBMkI7QUFDM0Isc0RBQWdIO0FBQ2hILDRDQUFpRDtBQUdqRCxzQ0FBbUQ7QUFDbkQsMENBQXdEO0FBQ3hELDRDQUE4RDtBQUM5RCwwREFBdUQ7QUFDdkQsc0NBQW1DO0FBQ25DLHlEQUF3RTtBQVN4RSxxREFBMEc7QUFFMUcsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM5QixpQkFBaUIsRUFBRSxJQUFJO0lBQ3ZCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsUUFBUSxFQUFFLElBQUk7SUFDZCxlQUFlLEVBQUUsSUFBSTtDQUN0QixDQUFDLENBQUM7QUFFSCxNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEMsSUFBSSxFQUFFLGVBQWU7SUFDckIsS0FBSyxFQUFFLElBQUEsbUJBQVUsRUFBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixDQUFDO0NBQ3BELENBQUMsQ0FBQztBQUVILE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN0QyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU07SUFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU07SUFDZixJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDdEIsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ2xDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0NBQzFCLENBQUMsQ0FBQztBQUVILFNBQVMsa0JBQWtCLENBQUMsSUFBZTtJQUN6QyxJQUFJLElBQUks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Q0FBQyxFQUFFLDZCQUFjLEVBQUUsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkcsT0FBTyxJQUFBLHdCQUFlLEVBQUMsdUJBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0UsT0FBTyxJQUFBLHdCQUFlLEVBQUMsdUJBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBbEtELG9CQWtLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgc2FmZSBjbGllbnQgc3VyZmFjZSBpcyBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgKGluY2x1ZGluZyBicmVha2luZ1xuICogY2hhbmdlcykgYmVmb3JlIHRoZSBwdWJsaWMgcmVsZWFzZS5cbiAqL1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5pbXBvcnQgeyBGcmVlemVTYWZlQm9keSwgU2FmZURhdGEsIFNhZmVTaGFyZURhdGEsIFNhZmVTaGFyZVN0YXRlLCB0eXBlIFJvb3RLZXlUeXBlIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBjb2lucywgS2V5Q3VydmUgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBJQmFzZUNvaW4gfSBmcm9tICcuLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgSW5jb3JyZWN0UGFzc3dvcmRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5IH0gZnJvbSAnLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgYm91bmRlZEludCwgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvY29kZWNzJztcbmltcG9ydCB7IHBvc3RXaXRoQ29kZWMgfSBmcm9tICcuLi91dGlscy9wb3N0V2l0aENvZGVjJztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4uL3dhbGxldCc7XG5pbXBvcnQgeyBJbnZhbGlkUm9vdEtleWNoYWluU291cmNlRXJyb3IgfSBmcm9tICcuLi93YWxsZXQvc2FmZUtleWNoYWluJztcbmltcG9ydCB7XG4gIEFjY2VwdFNhZmVTaGFyZU9wdGlvbnMsXG4gIEFkZFNhZmVNZW1iZXJPcHRpb25zLFxuICBBZGRTYWZlV2FsbGV0TWVtYmVyT3B0aW9ucyxcbiAgQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnMsXG4gIElTYWZlLFxuICBXYWxsZXRTaGFyZURhdGEsXG59IGZyb20gJy4vaVNhZmUnO1xuaW1wb3J0IHsgZGVyaXZlQW5kU2VsZkNoZWNrU2FmZUNoaWxkSGFyZGVuZWQsIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCB9IGZyb20gJy4vc2FmZURlcml2YXRpb24nO1xuXG5jb25zdCBTYWZlUm9vdEtleVNsb3QgPSB0LmtleW9mKHtcbiAgc2VjcDI1NmsxTXVsdGlzaWc6IG51bGwsXG4gIGVjZHNhTXBjOiBudWxsLFxuICBlZGRzYU1wYzogbnVsbCxcbiAgZWQyNTUxOU11bHRpc2lnOiBudWxsLFxufSk7XG5cbmNvbnN0IEdldERlcml2YXRpb25JbmRleFJlc3BvbnNlID0gdC50eXBlKHtcbiAgc2xvdDogU2FmZVJvb3RLZXlTbG90LFxuICBpbmRleDogYm91bmRlZEludCgwLCAweDdmZmZmZmZmLCAnZGVyaXZhdGlvbkluZGV4JyksXG59KTtcblxuY29uc3QgQ3JlYXRlV2FsbGV0SW5TYWZlQm9keSA9IHQuc3RyaWN0KHtcbiAgY29pbjogdC5zdHJpbmcsXG4gIGxhYmVsOiB0LnN0cmluZyxcbiAgdHlwZTogdC5saXRlcmFsKCdob3QnKSxcbiAgbXVsdGlzaWdUeXBlOiB0LmxpdGVyYWwoJ29uY2hhaW4nKSxcbiAga2V5czogdC50dXBsZShbdC5zdHJpbmddKSxcbn0pO1xuXG5mdW5jdGlvbiBvbmNoYWluU2xvdEZvckNvaW4oY29pbjogSUJhc2VDb2luKTogRXh0cmFjdDxSb290S2V5VHlwZSwgJ3NlY3AyNTZrMU11bHRpc2lnJz4ge1xuICBpZiAoY29pbi5nZXREZWZhdWx0TXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNUEMgc2FmZSB3YWxsZXQgbWludGluZyBpcyBub3QgeWV0IGltcGxlbWVudGVkOyB1c2UgYSBzbG90LTEgb25jaGFpbiBjb2luJyk7XG4gIH1cbiAgY29uc3QgY3VydmUgPSBjb2lucy5nZXQoY29pbi5nZXRDaGFpbigpKS5wcmltYXJ5S2V5Q3VydmU7XG4gIGlmIChjdXJ2ZSA9PT0gS2V5Q3VydmUuU2VjcDI1NmsxKSB7XG4gICAgcmV0dXJuICdzZWNwMjU2azFNdWx0aXNpZyc7XG4gIH1cbiAgaWYgKGN1cnZlID09PSBLZXlDdXJ2ZS5FZDI1NTE5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdlZDI1NTE5IGNvaW4gc2FmZSB3YWxsZXQgbWludGluZyBpcyBub3QgeWV0IHN1cHBvcnRlZCcpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQ29pbiAnJHtjb2luLmdldENoYWluKCl9JyBpcyBub3Qgc3VwcG9ydGVkIGZvciBzYWZlIHdhbGxldCBtaW50aW5nYCk7XG59XG5cbmZ1bmN0aW9uIHVzZXJSb290SWRGcm9tU2FmZShzYWZlOiBTYWZlRGF0YSwgc2xvdDogUm9vdEtleVR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0cmlwbGV0ID0gc2FmZS5yb290S2V5cz8uaG90Py5bc2xvdF07XG4gIGlmICghdHJpcGxldCB8fCB0cmlwbGV0Lmxlbmd0aCAhPT0gMykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgdXNlclJvb3RJZCA9IHRyaXBsZXRbMF07XG4gIHJldHVybiB1c2VyUm9vdElkLmxlbmd0aCA+IDAgPyB1c2VyUm9vdElkIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNhZmUgaW1wbGVtZW50cyBJU2FmZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHVibGljIHJlYWRvbmx5IF9zYWZlOiBTYWZlRGF0YTtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzYWZlRGF0YTogU2FmZURhdGEpIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5fc2FmZSA9IHNhZmVEYXRhO1xuICB9XG5cbiAgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5pZDtcbiAgfVxuXG4gIGVudGVycHJpc2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zYWZlLmVudGVycHJpc2VJZDtcbiAgfVxuXG4gIGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmUubGFiZWw7XG4gIH1cblxuICBzdGF0dXMoKTogU2FmZURhdGFbJ3N0YXR1cyddIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogRW50ZXJwcmlzZS1zY29wZWQgdjIgVVJMIGZvciB0aGlzIHNhZmUsIGUuZy4gL2FwaS92Mi9lbnRlcnByaXNlLzplSWQvc2FmZXMvOnNhZmVJZFxuICAgKiBAcGFyYW0gZXh0cmFcbiAgICovXG4gIHVybChleHRyYSA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby51cmwoYC9lbnRlcnByaXNlLyR7dGhpcy5lbnRlcnByaXNlSWQoKX0vc2FmZXMvJHt0aGlzLmlkKCl9JHtleHRyYX1gLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaW50IGEgY2hpbGQgd2FsbGV0OiBwZWVrIHRoZSBzZXF1ZW50aWFsIGluZGV4LCBoYXJkZW5lZC1kZXJpdmUgdGhlIHVzZXIgY2hpbGQsXG4gICAqIHJlZ2lzdGVyIGl0IHB1YmxpYy1vbmx5LCB0aGVuIG1pbnQuIEJhY2t1cCBhbmQgQml0R28gY2hpbGRyZW4gYXJlIHNvZnQtZGVyaXZlZCBvbiB0aGUgc2VydmVyLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlV2FsbGV0KHBhcmFtczogQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnMpOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIGlmIChwYXJhbXMucGFzc3BocmFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3BocmFzZSBpcyByZXF1aXJlZCB0byBtaW50IGEgc2FmZSB3YWxsZXQnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy50eXBlICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLnR5cGUgIT09ICdob3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUgd2FsbGV0cyBhcmUgaG90LW9ubHkgaW4gdjEnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01QQyBzYWZlIHdhbGxldCBtaW50aW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQ7IHVzZSBtdWx0aXNpZ1R5cGUgXCJvbmNoYWluXCInKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2luID0gdGhpcy5iaXRnby5jb2luKHBhcmFtcy5jb2luKTtcbiAgICBjb25zdCBzbG90ID0gb25jaGFpblNsb3RGb3JDb2luKGNvaW4pO1xuXG4gICAgY29uc3QgaW5kZXhSZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvZGVyaXZhdGlvbi1pbmRleCcpKS5xdWVyeSh7IHNsb3QgfSkucmVzdWx0KCk7XG4gICAgY29uc3QgcGVla2VkID0gZGVjb2RlV2l0aENvZGVjKEdldERlcml2YXRpb25JbmRleFJlc3BvbnNlLCBpbmRleFJlc3BvbnNlLCAnR2V0RGVyaXZhdGlvbkluZGV4UmVzcG9uc2UnKTtcbiAgICBpZiAocGVla2VkLnNsb3QgIT09IHNsb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZGVyaXZhdGlvbi1pbmRleCByZXR1cm5lZCBzbG90ICcke3BlZWtlZC5zbG90fScsIGV4cGVjdGVkICcke3Nsb3R9J2ApO1xuICAgIH1cbiAgICBjb25zdCB7IGluZGV4IH0gPSBwZWVrZWQ7XG5cbiAgICBjb25zdCB1c2VyUm9vdElkID0gdXNlclJvb3RJZEZyb21TYWZlKHRoaXMuX3NhZmUsIHNsb3QpID8/IHVzZXJSb290SWRGcm9tU2FmZShhd2FpdCB0aGlzLmZldGNoU2FmZURhdGEoKSwgc2xvdCk7XG4gICAgaWYgKHVzZXJSb290SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTYWZlICR7dGhpcy5pZCgpfSBpcyBtaXNzaW5nIHJvb3RLZXlzLmhvdC4ke3Nsb3R9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gY29pbi5rZXljaGFpbnMoKTtcbiAgICBjb25zdCByb290S2V5Y2hhaW4gPSBhd2FpdCBrZXljaGFpbnMuZ2V0KHsgaWQ6IHVzZXJSb290SWQgfSk7XG4gICAgaWYgKHJvb3RLZXljaGFpbi5zb3VyY2UgIT09ICd1c2VyJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRSb290S2V5Y2hhaW5Tb3VyY2VFcnJvcihyb290S2V5Y2hhaW4uaWQsIHJvb3RLZXljaGFpbi5zb3VyY2UpO1xuICAgIH1cbiAgICBjb25zdCByb290UHJ2ID0gYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCByb290S2V5Y2hhaW4sIHBhcmFtcy5wYXNzcGhyYXNlKTtcbiAgICBpZiAoIXJvb3RQcnYpIHtcbiAgICAgIHRocm93IG5ldyBJbmNvcnJlY3RQYXNzd29yZEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVyaXZlZCA9IGRlcml2ZUFuZFNlbGZDaGVja1NhZmVDaGlsZEhhcmRlbmVkKHJvb3RQcnYsIGluZGV4KTtcbiAgICBjb25zdCBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGggPSBkZWNvZGVXaXRoQ29kZWMoXG4gICAgICBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgsXG4gICAgICBkZXJpdmVkLmRlcml2YXRpb25QYXRoLFxuICAgICAgJ2Rlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCdcbiAgICApO1xuXG4gICAgY29uc3QgY2hpbGQgPSBhd2FpdCBrZXljaGFpbnMuYWRkKHtcbiAgICAgIHB1YjogZGVyaXZlZC5wdWIsXG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIGtleVR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICBwYXJlbnQ6IHVzZXJSb290SWQsXG4gICAgICBzYWZlSWQ6IHRoaXMuaWQoKSxcbiAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCxcbiAgICB9KTtcbiAgICBjb25zdCBjaGlsZElkID0gY2hpbGQuaWQ7XG4gICAgaWYgKGNoaWxkSWQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NhZmUgY2hpbGQga2V5IHJlZ2lzdHJhdGlvbiByZXR1cm5lZCBhbiBlbXB0eSBpZCcpO1xuICAgIH1cbiAgICBjb25zdCBrZXlzOiBbc3RyaW5nXSA9IFtjaGlsZElkXTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFdpdGhDb2RlYyh0aGlzLmJpdGdvLCB0aGlzLnVybCgnL3dhbGxldHMnKSwgQ3JlYXRlV2FsbGV0SW5TYWZlQm9keSwge1xuICAgICAgY29pbjogcGFyYW1zLmNvaW4sXG4gICAgICBsYWJlbDogcGFyYW1zLmxhYmVsLFxuICAgICAgdHlwZTogJ2hvdCcsXG4gICAgICBtdWx0aXNpZ1R5cGU6ICdvbmNoYWluJyxcbiAgICAgIGtleXMsXG4gICAgfSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQodGhpcy5iaXRnbywgY29pbiwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFNhZmVEYXRhKCk6IFByb21pc2U8U2FmZURhdGE+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBtZW1iZXIgdG8gdGhlIHdob2xlIHNhZmUgKHZpZXcvYWRtaW4vc3BlbmQpLiBTcGVuZCBvcGVucyBhIGtleSBzaGFyZS5cbiAgICogQm9keSBsYW5kcyBpbiBXQ04tMTIwNC5cbiAgICovXG4gIGFzeW5jIGFkZE1lbWJlcihwYXJhbXM6IEFkZFNhZmVNZW1iZXJPcHRpb25zKTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZS5hZGRNZW1iZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCAoV0NOLTEyMDQpJyk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgT05FIHNhZmUgd2FsbGV0IHdpdGggYSBub24tbWVtYmVyIHZpYSB0aGUgZXhpc3Rpbmcgd2FsbGV0LXNoYXJlIGhhbmRzaGFrZSAoRlItMTMpLlxuICAgKiBCb2R5IGxhbmRzIGluIFdDTi0xMjA0LlxuICAgKi9cbiAgYXN5bmMgYWRkTWVtYmVyVG9XYWxsZXQocGFyYW1zOiBBZGRTYWZlV2FsbGV0TWVtYmVyT3B0aW9ucyk6IFByb21pc2U8V2FsbGV0U2hhcmVEYXRhPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlLmFkZE1lbWJlclRvV2FsbGV0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKFdDTi0xMjA0KScpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHNhZmUga2V5IHNoYXJlcyB2aXNpYmxlIHRvIHRoZSBjYWxsZXIuXG4gICAqIEJvZHkgbGFuZHMgaW4gV0NOLTEyMDQuXG4gICAqL1xuICBhc3luYyBsaXN0U2hhcmVzKHBhcmFtczogeyBzdGF0ZT86IFNhZmVTaGFyZVN0YXRlIH0gPSB7fSk6IFByb21pc2U8U2FmZVNoYXJlRGF0YVtdPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlLmxpc3RTaGFyZXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCAoV0NOLTEyMDQpJyk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0IGEgc2FmZSBrZXkgc2hhcmUgYWRkcmVzc2VkIHRvIHRoZSBjYWxsZXIuXG4gICAqIEJvZHkgbGFuZHMgaW4gV0NOLTEyMDQuXG4gICAqL1xuICBhc3luYyBhY2NlcHRTaGFyZShwYXJhbXM6IEFjY2VwdFNhZmVTaGFyZU9wdGlvbnMpOiBQcm9taXNlPFNhZmVTaGFyZURhdGE+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUuYWNjZXB0U2hhcmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCAoV0NOLTEyMDQpJyk7XG4gIH1cblxuICAvKipcbiAgICogRnJlZXplIHRoZSBzYWZlIOKAlCBibG9ja3Mgd2l0aGRyYXdhbHMgb24gYWxsIHNhZmUgd2FsbGV0cy4gU2FmZSBzdGF5cyAnYWN0aXZlJy5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZnJlZXplKHBhcmFtczogRnJlZXplU2FmZUJvZHkgPSB7fSk6IFByb21pc2U8U2FmZURhdGE+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RXaXRoQ29kZWModGhpcy5iaXRnbywgdGhpcy51cmwoJy9mcmVlemUnKSwgRnJlZXplU2FmZUJvZHksIHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFyY2hpdmUgdGhlIHNhZmUuIFJlcXVpcmVzIGV2ZXJ5IHNhZmUgd2FsbGV0IHRvIGFscmVhZHkgYmUgYXJjaGl2ZWQ7IGFsc28gdGhlIGFiYW5kb25tZW50XG4gICAqIHBhdGggZm9yIGEgc3R1Y2sgJ2luaXRpYWxpemluZycgc2FmZS5cbiAgICovXG4gIGFzeW5jIGFyY2hpdmUoKTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvYXJjaGl2ZScpKS5zZW5kKCkucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICB9XG5cbiAgdG9KU09OKCk6IFNhZmVEYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZTtcbiAgfVxufVxuIl19
|
|
@@ -1,11 +1,30 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
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;
|
|
3
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;
|
|
4
22
|
export interface SafeHardenedChildKey {
|
|
5
23
|
prv: string;
|
|
6
24
|
pub: string;
|
|
7
25
|
derivationPath: string;
|
|
8
26
|
}
|
|
9
|
-
/** Hardened BIP32 derive for secp256k1 multisig from a root xprv and mint index. */
|
|
10
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;
|
|
11
30
|
//# sourceMappingURL=safeDerivation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safeDerivation.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safeDerivation.ts"],"names":[],"mappings":"
|
|
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,32 +1,101 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
36
|
+
exports.DerivedFromParentWithHardenedPath = exports.DERIVED_FROM_PARENT_WITH_HARDENED_PATH = void 0;
|
|
37
|
+
exports.parseSafeDerivationIndex = parseSafeDerivationIndex;
|
|
4
38
|
exports.getSafeHardenedDerivationPath = getSafeHardenedDerivationPath;
|
|
39
|
+
exports.parseDerivedFromParentWithHardenedPath = parseDerivedFromParentWithHardenedPath;
|
|
5
40
|
exports.deriveSafeChildHardenedFromXprv = deriveSafeChildHardenedFromXprv;
|
|
41
|
+
exports.deriveAndSelfCheckSafeChildHardened = deriveAndSelfCheckSafeChildHardened;
|
|
6
42
|
/**
|
|
7
43
|
* @prettier
|
|
8
44
|
*
|
|
9
|
-
* Shared safe child derivation for mint and sign.
|
|
10
|
-
* Path: m/999999'/<index>' where index is the mint allocation stored on the
|
|
11
|
-
* child key as derivedFromParentWithSeed.
|
|
45
|
+
* @experimental Shared safe child derivation for mint and sign.
|
|
12
46
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
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.
|
|
15
52
|
*/
|
|
53
|
+
const t = __importStar(require("io-ts"));
|
|
16
54
|
const utxo_lib_1 = require("@bitgo/utxo-lib");
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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) {
|
|
22
70
|
throw new Error(`Invalid safe derivation index '${index}': expected a non-negative integer`);
|
|
23
71
|
}
|
|
24
|
-
return
|
|
72
|
+
return idx;
|
|
25
73
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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) {
|
|
30
99
|
if (!child.privateKey) {
|
|
31
100
|
throw new Error(`Failed to derive hardened safe child at ${derivationPath}`);
|
|
32
101
|
}
|
|
@@ -36,4 +105,18 @@ function deriveSafeChildHardenedFromXprv(rootXprv, index) {
|
|
|
36
105
|
derivationPath,
|
|
37
106
|
};
|
|
38
107
|
}
|
|
39
|
-
|
|
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
|
|
@@ -21,7 +21,7 @@ export declare class Safes implements ISafes {
|
|
|
21
21
|
private url;
|
|
22
22
|
/**
|
|
23
23
|
* One-call convenience wrapper chaining the three creation phases:
|
|
24
|
-
* initialize (Phase 1) → createSafeKeys (Phase 2,
|
|
24
|
+
* initialize (Phase 1) → createSafeKeys (Phase 2, enabled-slot ceremonies) →
|
|
25
25
|
* finalize (Phase 3). HOT custody only in v1.
|
|
26
26
|
*
|
|
27
27
|
* If a key ceremony fails, `createSafeKeys` archives the safe before throwing, so a failed run
|
|
@@ -32,15 +32,16 @@ export declare class Safes implements ISafes {
|
|
|
32
32
|
/**
|
|
33
33
|
* Phase 1 — initialize a safe (metadata only, no key material).
|
|
34
34
|
* POST /api/v2/enterprise/:eId/safes { label }
|
|
35
|
-
* Response is
|
|
35
|
+
* Response is `{ id, status }` plus optional `enabledRootSlots` (absent on older WP).
|
|
36
36
|
* @experimental
|
|
37
37
|
*/
|
|
38
38
|
initializeSafe(params: InitializeSafeOptions): Promise<InitializeSafeResponse>;
|
|
39
39
|
/**
|
|
40
|
-
* Phase 2 — run the
|
|
41
|
-
*
|
|
40
|
+
* Phase 2 — run the enabled root key ceremonies tagged with `safeId`; returns ordered
|
|
41
|
+
* [user, backup, bitgo] triplets for those slots. HOT custody only in v1.
|
|
42
42
|
*
|
|
43
|
-
*
|
|
43
|
+
* Absent `enabledRootSlots` (older WP, pre-gating) runs all 4 slots. Enabled ceremonies
|
|
44
|
+
* (2.1 multisig ①④, 2.2 MPC ②③) run in parallel. If any of them fail, the
|
|
44
45
|
* partially-created safe is archived (a legal `initializing → archived` transition, so the
|
|
45
46
|
* orphaned tagged keys are inert) and an error listing every ceremony failure is thrown —
|
|
46
47
|
* create a new safe and retry.
|
|
@@ -58,7 +59,7 @@ export declare class Safes implements ISafes {
|
|
|
58
59
|
*/
|
|
59
60
|
archiveSafe(safeId: string): Promise<Safe>;
|
|
60
61
|
/**
|
|
61
|
-
* Phase 3 — finalize a safe with the
|
|
62
|
+
* Phase 3 — finalize a safe with the minted root key ids as ordered [user, backup, bitgo] triplets.
|
|
62
63
|
* POST /api/v2/enterprise/:eId/safes/:safeId/finalize { rootKeys }.
|
|
63
64
|
* Idempotent: re-finalizing with the same `rootKeys` returns the active safe again (200).
|
|
64
65
|
* @experimental
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safes.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safes.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,sBAAsB,
|
|
1
|
+
{"version":3,"file":"safes.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safes.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,sBAAsB,EAKvB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACrH,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAuC9B;;;;;;GAMG;AACH,qBAAa,KAAM,YAAW,MAAM;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM;IAKlD;;;OAGG;IACH,OAAO,CAAC,GAAG;IAIX;;;;;;;;OAQG;IACG,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5D;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAKpF;;;;;;;;;;;;;OAaG;IACG,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwDvF;;;;;OAKG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E;;;OAGG;IACH,OAAO,CAAC,WAAW;IAOnB;;;;;;OAMG;YACW,kBAAkB;IA0BhC;;;;;OAKG;YACW,aAAa;IAY3B;;;;;;;OAOG;IACG,IAAI,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiB1F;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAKjD"}
|