@bitgo/sdk-core 27.6.0 → 27.8.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/CHANGELOG.md +22 -0
- package/dist/src/bitgo/environments.d.ts +1 -0
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +3 -1
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +6 -6
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +17 -17
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +2 -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/SMC/utils.d.ts +18 -0
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +149 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +63 -6
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +98 -12
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/index.js +2 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BitgoToOVC1Round1Response, BitgoToOVC1Round2Response, BitgoToOVC1Round3Response, OVC1ToBitgoRound3Payload, OVC2ToBitgoRound1Payload, OVC2ToBitgoRound2Payload } from '@bitgo/public-types';
|
|
2
|
+
import { IBaseCoin } from '../../../../baseCoin';
|
|
3
|
+
import { BitGoBase } from '../../../../bitgoBase';
|
|
4
|
+
import { Keychain } from '../../../..';
|
|
5
|
+
export declare class MPCv2SMCUtils {
|
|
6
|
+
private baseCoin;
|
|
7
|
+
private MPCv2Utils;
|
|
8
|
+
constructor(bitgo: BitGoBase, baseCoin: IBaseCoin);
|
|
9
|
+
keyGenRound1(enterprise: string, payload: OVC2ToBitgoRound1Payload): Promise<BitgoToOVC1Round1Response>;
|
|
10
|
+
keyGenRound2(enterprise: string, payload: OVC2ToBitgoRound2Payload): Promise<BitgoToOVC1Round2Response>;
|
|
11
|
+
keyGenRound3(enterprise: string, payload: OVC1ToBitgoRound3Payload): Promise<BitgoToOVC1Round3Response>;
|
|
12
|
+
uploadClientKeys(bitgoKeyId: string, userCommonKeychain: string, backupCommonKeychain: string): Promise<{
|
|
13
|
+
userKeychain: Keychain;
|
|
14
|
+
backupKeychain: Keychain;
|
|
15
|
+
bitgoKeychain: Keychain;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../../../src/bitgo/utils/tss/ecdsa/SMC/utils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EAEzB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EAEzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAgB,QAAQ,EAAE,MAAM,aAAa,CAAC;AAErD,qBAAa,aAAa;IAGM,OAAO,CAAC,QAAQ;IAF9C,OAAO,CAAC,UAAU,CAAkB;gBAExB,KAAK,EAAE,SAAS,EAAU,QAAQ,EAAE,SAAS;IAI5C,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAwCvG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAwCvG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IA0CvG,gBAAgB,CAC3B,UAAU,EAAE,MAAM,EAClB,kBAAkB,EAAE,MAAM,EAC1B,oBAAoB,EAAE,MAAM,GAC3B,OAAO,CAAC;QAAE,YAAY,EAAE,QAAQ,CAAC;QAAC,cAAc,EAAE,QAAQ,CAAC;QAAC,aAAa,EAAE,QAAQ,CAAA;KAAE,CAAC;CA8B1F"}
|
|
@@ -0,0 +1,149 @@
|
|
|
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.MPCv2SMCUtils = void 0;
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
const public_types_1 = require("@bitgo/public-types");
|
|
9
|
+
const ecdsaMPCv2_1 = require("../ecdsaMPCv2");
|
|
10
|
+
const __1 = require("../../../..");
|
|
11
|
+
class MPCv2SMCUtils {
|
|
12
|
+
constructor(bitgo, baseCoin) {
|
|
13
|
+
this.baseCoin = baseCoin;
|
|
14
|
+
this.MPCv2Utils = new ecdsaMPCv2_1.EcdsaMPCv2Utils(bitgo, baseCoin);
|
|
15
|
+
}
|
|
16
|
+
async keyGenRound1(enterprise, payload) {
|
|
17
|
+
(0, __1.decodeOrElse)(public_types_1.OVC2ToBitgoRound1Payload.name, public_types_1.OVC2ToBitgoRound1Payload, payload, (errors) => {
|
|
18
|
+
throw new Error(`error(s) parsing payload: ${errors}`);
|
|
19
|
+
});
|
|
20
|
+
const ovc1 = payload.ovc[public_types_1.OVCIndexEnum.ONE];
|
|
21
|
+
const ovc2 = payload.ovc[public_types_1.OVCIndexEnum.TWO];
|
|
22
|
+
const userGpgPublicKey = ovc1.gpgPubKey;
|
|
23
|
+
const backupGpgPublicKey = ovc2.gpgPubKey;
|
|
24
|
+
const messages = { p2pMessages: [], broadcastMessages: [ovc1.ovcMsg1, ovc2.ovcMsg1] };
|
|
25
|
+
const result = await this.MPCv2Utils.sendKeyGenerationRound1(enterprise, userGpgPublicKey, backupGpgPublicKey, messages);
|
|
26
|
+
const response = {
|
|
27
|
+
wallet: {
|
|
28
|
+
tssVersion: payload.tssVersion,
|
|
29
|
+
walletType: payload.walletType,
|
|
30
|
+
coin: payload.coin,
|
|
31
|
+
ovc: payload.ovc,
|
|
32
|
+
state: public_types_1.KeyCreationMPCv2StateEnum.WaitingForOVC1Round2Data,
|
|
33
|
+
platform: {
|
|
34
|
+
walletGpgPubKeySigs: result.walletGpgPubKeySigs,
|
|
35
|
+
sessionId: result.sessionId,
|
|
36
|
+
bitgoMsg1: this.MPCv2Utils.formatBitgoBroadcastMessage(result.bitgoMsg1),
|
|
37
|
+
ovc: {
|
|
38
|
+
[public_types_1.OVCIndexEnum.ONE]: { bitgoToOvcMsg2: this.MPCv2Utils.formatP2PMessage(result.bitgoToUserMsg2) },
|
|
39
|
+
[public_types_1.OVCIndexEnum.TWO]: { bitgoToOvcMsg2: this.MPCv2Utils.formatP2PMessage(result.bitgoToBackupMsg2) },
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
return (0, __1.decodeOrElse)(public_types_1.BitgoToOVC1Round1Response.name, public_types_1.BitgoToOVC1Round1Response, response, (errors) => {
|
|
45
|
+
throw new Error(`error(s) parsing response: ${errors}`);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async keyGenRound2(enterprise, payload) {
|
|
49
|
+
(0, __1.decodeOrElse)(public_types_1.OVC2ToBitgoRound2Payload.name, public_types_1.OVC2ToBitgoRound2Payload, payload, (errors) => {
|
|
50
|
+
throw new Error(`error(s) parsing payload: ${errors}`);
|
|
51
|
+
});
|
|
52
|
+
const ovc1 = payload.ovc[public_types_1.OVCIndexEnum.ONE];
|
|
53
|
+
const ovc2 = payload.ovc[public_types_1.OVCIndexEnum.TWO];
|
|
54
|
+
const sessionId = payload.platform.sessionId;
|
|
55
|
+
const messages = { p2pMessages: [ovc1.ovcToBitgoMsg2, ovc2.ovcToBitgoMsg2], broadcastMessages: [] };
|
|
56
|
+
const result = await this.MPCv2Utils.sendKeyGenerationRound2(enterprise, sessionId, messages);
|
|
57
|
+
const response = {
|
|
58
|
+
wallet: {
|
|
59
|
+
tssVersion: payload.tssVersion,
|
|
60
|
+
walletType: payload.walletType,
|
|
61
|
+
coin: payload.coin,
|
|
62
|
+
ovc: payload.ovc,
|
|
63
|
+
state: public_types_1.KeyCreationMPCv2StateEnum.WaitingForOVC1Round3aData,
|
|
64
|
+
platform: {
|
|
65
|
+
...payload.platform,
|
|
66
|
+
sessionId: result.sessionId,
|
|
67
|
+
bitgoCommitment2: result.bitgoCommitment2,
|
|
68
|
+
ovc: {
|
|
69
|
+
[public_types_1.OVCIndexEnum.ONE]: {
|
|
70
|
+
...payload.platform.ovc[public_types_1.OVCIndexEnum.ONE],
|
|
71
|
+
bitgoToOvcMsg3: this.MPCv2Utils.formatP2PMessage(result.bitgoToUserMsg3),
|
|
72
|
+
},
|
|
73
|
+
[public_types_1.OVCIndexEnum.TWO]: {
|
|
74
|
+
...payload.platform.ovc[public_types_1.OVCIndexEnum.TWO],
|
|
75
|
+
bitgoToOvcMsg3: this.MPCv2Utils.formatP2PMessage(result.bitgoToBackupMsg3),
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
return (0, __1.decodeOrElse)(public_types_1.BitgoToOVC1Round2Response.name, public_types_1.BitgoToOVC1Round2Response, response, (errors) => {
|
|
82
|
+
throw new Error(`error(s) parsing response: ${errors}`);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async keyGenRound3(enterprise, payload) {
|
|
86
|
+
(0, __1.decodeOrElse)(public_types_1.OVC1ToBitgoRound3Payload.name, public_types_1.OVC1ToBitgoRound3Payload, payload, (errors) => {
|
|
87
|
+
throw new Error(`error(s) parsing payload: ${errors}`);
|
|
88
|
+
});
|
|
89
|
+
const ovc1 = payload.ovc[public_types_1.OVCIndexEnum.ONE];
|
|
90
|
+
const ovc2 = payload.ovc[public_types_1.OVCIndexEnum.TWO];
|
|
91
|
+
const sessionId = payload.platform.sessionId;
|
|
92
|
+
const messages = {
|
|
93
|
+
p2pMessages: [ovc1.ovcToBitgoMsg3, ovc2.ovcToBitgoMsg3],
|
|
94
|
+
broadcastMessages: [ovc1.ovcMsg4, ovc2.ovcMsg4],
|
|
95
|
+
};
|
|
96
|
+
const result = await this.MPCv2Utils.sendKeyGenerationRound3(enterprise, sessionId, messages);
|
|
97
|
+
const keychains = this.baseCoin.keychains();
|
|
98
|
+
const bitgoKeychain = await keychains.add({
|
|
99
|
+
source: 'bitgo',
|
|
100
|
+
keyType: 'tss',
|
|
101
|
+
commonKeychain: result.commonKeychain,
|
|
102
|
+
isMPCv2: true,
|
|
103
|
+
});
|
|
104
|
+
const response = {
|
|
105
|
+
bitGoKeyId: bitgoKeychain.id,
|
|
106
|
+
wallet: {
|
|
107
|
+
tssVersion: payload.tssVersion,
|
|
108
|
+
walletType: payload.walletType,
|
|
109
|
+
coin: payload.coin,
|
|
110
|
+
ovc: payload.ovc,
|
|
111
|
+
state: public_types_1.KeyCreationMPCv2StateEnum.WaitingForOVC1GenerateKey,
|
|
112
|
+
platform: {
|
|
113
|
+
...payload.platform,
|
|
114
|
+
commonKeychain: result.commonKeychain,
|
|
115
|
+
bitgoMsg4: this.MPCv2Utils.formatBitgoBroadcastMessage(result.bitgoMsg4),
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
return (0, __1.decodeOrElse)(public_types_1.BitgoToOVC1Round3Response.name, public_types_1.BitgoToOVC1Round3Response, response, (errors) => {
|
|
120
|
+
throw new Error(`error(s) parsing response: ${errors}`);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async uploadClientKeys(bitgoKeyId, userCommonKeychain, backupCommonKeychain) {
|
|
124
|
+
(0, assert_1.default)(userCommonKeychain === backupCommonKeychain, 'Common keychain mismatch between the user and backup keychains');
|
|
125
|
+
const keychains = this.baseCoin.keychains();
|
|
126
|
+
const bitgoKeychain = await keychains.get({ id: bitgoKeyId });
|
|
127
|
+
(0, assert_1.default)(bitgoKeychain, 'Keychain not found');
|
|
128
|
+
(0, assert_1.default)(bitgoKeychain.source === 'bitgo', 'The keychain is not a BitGo keychain');
|
|
129
|
+
(0, assert_1.default)(bitgoKeychain.type === 'tss', 'BitGo keychain is not a TSS keychain');
|
|
130
|
+
(0, assert_1.default)(bitgoKeychain.commonKeychain, 'BitGo keychain does not have a common keychain');
|
|
131
|
+
(0, assert_1.default)(bitgoKeychain.commonKeychain === userCommonKeychain, 'Common keychain mismatch between the OVCs and BitGo');
|
|
132
|
+
const userKeychainPromise = keychains.add({
|
|
133
|
+
source: 'user',
|
|
134
|
+
keyType: 'tss',
|
|
135
|
+
commonKeychain: userCommonKeychain,
|
|
136
|
+
isMPCv2: true,
|
|
137
|
+
});
|
|
138
|
+
const backupKeychainPromise = keychains.add({
|
|
139
|
+
source: 'backup',
|
|
140
|
+
keyType: 'tss',
|
|
141
|
+
commonKeychain: backupCommonKeychain,
|
|
142
|
+
isMPCv2: true,
|
|
143
|
+
});
|
|
144
|
+
const [userKeychain, backupKeychain] = await Promise.all([userKeychainPromise, backupKeychainPromise]);
|
|
145
|
+
return { userKeychain, backupKeychain, bitgoKeychain };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
exports.MPCv2SMCUtils = MPCv2SMCUtils;
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL1NNQy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsc0RBUzZCO0FBRzdCLDhDQUFnRDtBQUNoRCxtQ0FBcUQ7QUFFckQsTUFBYSxhQUFhO0lBR3hCLFlBQVksS0FBZ0IsRUFBVSxRQUFtQjtRQUFuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ3ZELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSw0QkFBZSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFrQixFQUFFLE9BQWlDO1FBQzdFLElBQUEsZ0JBQVksRUFBQyx1Q0FBd0IsQ0FBQyxJQUFJLEVBQUUsdUNBQXdCLEVBQUUsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDeEYsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3RGLE1BQU0sTUFBTSxH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QkFBcUIsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQzFDLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsY0FBYyxFQUFFLG9CQUFvQjtZQUNwQyxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsbUJBQW1CLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQW5LRCxzQ0FtS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge1xuICBCaXRnb1RvT1ZDMVJvdW5kMVJlc3BvbnNlLFxuICBCaXRnb1RvT1ZDMVJvdW5kMlJlc3BvbnNlLFxuICBCaXRnb1RvT1ZDMVJvdW5kM1Jlc3BvbnNlLFxuICBLZXlDcmVhdGlvbk1QQ3YyU3RhdGVFbnVtLFxuICBPVkMxVG9CaXRnb1JvdW5kM1BheWxvYWQsXG4gIE9WQzJUb0JpdGdvUm91bmQxUGF5bG9hZCxcbiAgT1ZDMlRvQml0Z29Sb3VuZDJQYXlsb2FkLFxuICBPVkNJbmRleEVudW0sXG59IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgSUJhc2VDb2luIH0gZnJvbSAnLi4vLi4vLi4vLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IEVjZHNhTVBDdjJVdGlscyB9IGZyb20gJy4uL2VjZHNhTVBDdjInO1xuaW1wb3J0IHsgZGVjb2RlT3JFbHNlLCBLZXljaGFpbiB9IGZyb20gJy4uLy4uLy4uLy4uJztcblxuZXhwb3J0IGNsYXNzIE1QQ3YyU01DVXRpbHMge1xuICBwcml2YXRlIE1QQ3YyVXRpbHM6IEVjZHNhTVBDdjJVdGlscztcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBwcml2YXRlIGJhc2VDb2luOiBJQmFzZUNvaW4pIHtcbiAgICB0aGlzLk1QQ3YyVXRpbHMgPSBuZXcgRWNkc2FNUEN2MlV0aWxzKGJpdGdvLCBiYXNlQ29pbik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMga2V5R2VuUm91bmQxKGVudGVycHJpc2U6IHN0cmluZywgcGF5bG9hZDogT1ZDMlRvQml0Z29Sb3VuZDFQYXlsb2FkKTogUHJvbWlzZTxCaXRnb1RvT1ZDMVJvdW5kMVJlc3BvbnNlPiB7XG4gICAgZGVjb2RlT3JFbHNlKE9WQzJUb0JpdGdvUm91bmQxUGF5bG9hZC5uYW1lLCBPVkMyVG9CaXRnb1JvdW5kMVBheWxvYWQsIHBheWxvYWQsIChlcnJvcnMpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IocykgcGFyc2luZyBwYXlsb2FkOiAke2Vycm9yc31gKTtcbiAgICB9KTtcbiAgICBjb25zdCBvdmMxID0gcGF5bG9hZC5vdmNbT1ZDSW5kZXhFbnVtLk9ORV07XG4gICAgY29uc3Qgb3ZjMiA9IHBheWxvYWQub3ZjW09WQ0luZGV4RW51bS5UV09dO1xuICAgIGNvbnN0IHVzZXJHcGdQdWJsaWNLZXkgPSBvdmMxLmdwZ1B1YktleTtcbiAgICBjb25zdCBiYWNrdXBHcGdQdWJsaWNLZXkgPSBvdmMyLmdwZ1B1YktleTtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHsgcDJwTWVzc2FnZXM6IFtdLCBicm9hZGNhc3RNZXNzYWdlczogW292YzEub3ZjTXNnMSwgb3ZjMi5vdmNNc2cxXSB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuTVBDdjJVdGlscy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMShcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgbWVzc2FnZXNcbiAgICApO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICB3YWxsZXQ6IHtcbiAgICAgICAgdHNzVmVyc2lvbjogcGF5bG9hZC50c3NWZXJzaW9uLFxuICAgICAgICB3YWxsZXRUeXBlOiBwYXlsb2FkLndhbGxldFR5cGUsXG4gICAgICAgIGNvaW46IHBheWxvYWQuY29pbixcbiAgICAgICAgb3ZjOiBwYXlsb2FkLm92YyxcbiAgICAgICAgc3RhdGU6IEtleUNyZWF0aW9uTVBDdjJTdGF0ZUVudW0uV2FpdGluZ0Zvck9WQzFSb3VuZDJEYXRhLFxuICAgICAgICBwbGF0Zm9ybToge1xuICAgICAgICAgIHdhbGxldEdwZ1B1YktleVNpZ3M6IHJlc3VsdC53YWxsZXRHcGdQdWJLZXlTaWdzLFxuICAgICAgICAgIHNlc3Npb25JZDogcmVzdWx0LnNlc3Npb25JZCxcbiAgICAgICAgICBiaXRnb01zZzE6IHRoaXMuTVBDdjJVdGlscy5mb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UocmVzdWx0LmJpdGdvTXNnMSksXG4gICAgICAgICAgb3ZjOiB7XG4gICAgICAgICAgICBbT1ZDSW5kZXhFbnVtLk9ORV06IHsgYml0Z29Ub092Y01zZzI6IHRoaXMuTVBDdjJVdGlscy5mb3JtYXRQMlBNZXNzYWdlKHJlc3VsdC5iaXRnb1RvVXNlck1zZzIpIH0sXG4gICAgICAgICAgICBbT1ZDSW5kZXhFbnVtLlRXT106IHsgYml0Z29Ub092Y01zZzI6IHRoaXMuTVBDdjJVdGlscy5mb3JtYXRQMlBNZXNzYWdlKHJlc3VsdC5iaXRnb1RvQmFja3VwTXNnMikgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlY29kZU9yRWxzZShCaXRnb1RvT1ZDMVJvdW5kMVJlc3BvbnNlLm5hbWUsIEJpdGdvVG9PVkMxUm91bmQxUmVzcG9uc2UsIHJlc3BvbnNlLCAoZXJyb3JzKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGVycm9yKHMpIHBhcnNpbmcgcmVzcG9uc2U6ICR7ZXJyb3JzfWApO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGtleUdlblJvdW5kMihlbnRlcnByaXNlOiBzdHJpbmcsIHBheWxvYWQ6IE9WQzJUb0JpdGdvUm91bmQyUGF5bG9hZCk6IFByb21pc2U8Qml0Z29Ub09WQzFSb3VuZDJSZXNwb25zZT4ge1xuICAgIGRlY29kZU9yRWxzZShPVkMyVG9CaXRnb1JvdW5kMlBheWxvYWQubmFtZSwgT1ZDMlRvQml0Z29Sb3VuZDJQYXlsb2FkLCBwYXlsb2FkLCAoZXJyb3JzKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGVycm9yKHMpIHBhcnNpbmcgcGF5bG9hZDogJHtlcnJvcnN9YCk7XG4gICAgfSk7XG4gICAgY29uc3Qgb3ZjMSA9IHBheWxvYWQub3ZjW09WQ0luZGV4RW51bS5PTkVdO1xuICAgIGNvbnN0IG92YzIgPSBwYXlsb2FkLm92Y1tPVkNJbmRleEVudW0uVFdPXTtcbiAgICBjb25zdCBzZXNzaW9uSWQgPSBwYXlsb2FkLnBsYXRmb3JtLnNlc3Npb25JZDtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHsgcDJwTWVzc2FnZXM6IFtvdmMxLm92Y1RvQml0Z29Nc2cyLCBvdmMyLm92Y1RvQml0Z29Nc2cyXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH07XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5NUEN2MlV0aWxzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQyKGVudGVycHJpc2UsIHNlc3Npb25JZCwgbWVzc2FnZXMpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICB3YWxsZXQ6IHtcbiAgICAgICAgdHNzVmVyc2lvbjogcGF5bG9hZC50c3NWZXJzaW9uLFxuICAgICAgICB3YWxsZXRUeXBlOiBwYXlsb2FkLndhbGxldFR5cGUsXG4gICAgICAgIGNvaW46IHBheWxvYWQuY29pbixcbiAgICAgICAgb3ZjOiBwYXlsb2FkLm92YyxcbiAgICAgICAgc3RhdGU6IEtleUNyZWF0aW9uTVBDdjJTdGF0ZUVudW0uV2FpdGluZ0Zvck9WQzFSb3VuZDNhRGF0YSxcbiAgICAgICAgcGxhdGZvcm06IHtcbiAgICAgICAgICAuLi5wYXlsb2FkLnBsYXRmb3JtLFxuICAgICAgICAgIHNlc3Npb25JZDogcmVzdWx0LnNlc3Npb25JZCxcbiAgICAgICAgICBiaXRnb0NvbW1pdG1lbnQyOiByZXN1bHQuYml0Z29Db21taXRtZW50MixcbiAgICAgICAgICBvdmM6IHtcbiAgICAgICAgICAgIFtPVkNJbmRleEVudW0uT05FXToge1xuICAgICAgICAgICAgICAuLi5wYXlsb2FkLnBsYXRmb3JtLm92Y1tPVkNJbmRleEVudW0uT05FXSxcbiAgICAgICAgICAgICAgYml0Z29Ub092Y01zZzM6IHRoaXMuTVBDdjJVdGlscy5mb3JtYXRQMlBNZXNzYWdlKHJlc3VsdC5iaXRnb1RvVXNlck1zZzMpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtPVkNJbmRleEVudW0uVFdPXToge1xuICAgICAgICAgICAgICAuLi5wYXlsb2FkLnBsYXRmb3JtLm92Y1tPVkNJbmRleEVudW0uVFdPXSxcbiAgICAgICAgICAgICAgYml0Z29Ub092Y01zZzM6IHRoaXMuTVBDdjJVdGlscy5mb3JtYXRQMlBNZXNzYWdlKHJlc3VsdC5iaXRnb1RvQmFja3VwTXNnMyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gZGVjb2RlT3JFbHNlKEJpdGdvVG9PVkMxUm91bmQyUmVzcG9uc2UubmFtZSwgQml0Z29Ub09WQzFSb3VuZDJSZXNwb25zZSwgcmVzcG9uc2UsIChlcnJvcnMpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IocykgcGFyc2luZyByZXNwb25zZTogJHtlcnJvcnN9YCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMga2V5R2VuUm91bmQzKGVudGVycHJpc2U6IHN0cmluZywgcGF5bG9hZDogT1ZDMVRvQml0Z29Sb3VuZDNQYXlsb2FkKTogUHJvbWlzZTxCaXRnb1RvT1ZDMVJvdW5kM1Jlc3BvbnNlPiB7XG4gICAgZGVjb2RlT3JFbHNlKE9WQzFUb0JpdGdvUm91bmQzUGF5bG9hZC5uYW1lLCBPVkMxVG9CaXRnb1JvdW5kM1BheWxvYWQsIHBheWxvYWQsIChlcnJvcnMpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IocykgcGFyc2luZyBwYXlsb2FkOiAke2Vycm9yc31gKTtcbiAgICB9KTtcbiAgICBjb25zdCBvdmMxID0gcGF5bG9hZC5vdmNbT1ZDSW5kZXhFbnVtLk9ORV07XG4gICAgY29uc3Qgb3ZjMiA9IHBheWxvYWQub3ZjW09WQ0luZGV4RW51bS5UV09dO1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IHBheWxvYWQucGxhdGZvcm0uc2Vzc2lvbklkO1xuICAgIGNvbnN0IG1lc3NhZ2VzID0ge1xuICAgICAgcDJwTWVzc2FnZXM6IFtvdmMxLm92Y1RvQml0Z29Nc2czLCBvdmMyLm92Y1RvQml0Z29Nc2czXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbb3ZjMS5vdmNNc2c0LCBvdmMyLm92Y01zZzRdLFxuICAgIH07XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5NUEN2MlV0aWxzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQzKGVudGVycHJpc2UsIHNlc3Npb25JZCwgbWVzc2FnZXMpO1xuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKTtcbiAgICBjb25zdCBiaXRnb0tleWNoYWluID0gYXdhaXQga2V5Y2hhaW5zLmFkZCh7XG4gICAgICBzb3VyY2U6ICdiaXRnbycsXG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIGNvbW1vbktleWNoYWluOiByZXN1bHQuY29tbW9uS2V5Y2hhaW4sXG4gICAgICBpc01QQ3YyOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICBiaXRHb0tleUlkOiBiaXRnb0tleWNoYWluLmlkLFxuICAgICAgd2FsbGV0OiB7XG4gICAgICAgIHRzc1ZlcnNpb246IHBheWxvYWQudHNzVmVyc2lvbixcbiAgICAgICAgd2FsbGV0VHlwZTogcGF5bG9hZC53YWxsZXRUeXBlLFxuICAgICAgICBjb2luOiBwYXlsb2FkLmNvaW4sXG4gICAgICAgIG92YzogcGF5bG9hZC5vdmMsXG4gICAgICAgIHN0YXRlOiBLZXlDcmVhdGlvbk1QQ3YyU3RhdGVFbnVtLldhaXRpbmdGb3JPVkMxR2VuZXJhdGVLZXksXG4gICAgICAgIHBsYXRmb3JtOiB7XG4gICAgICAgICAgLi4ucGF5bG9hZC5wbGF0Zm9ybSxcbiAgICAgICAgICBjb21tb25LZXljaGFpbjogcmVzdWx0LmNvbW1vbktleWNoYWluLFxuICAgICAgICAgIGJpdGdvTXNnNDogdGhpcy5NUEN2MlV0aWxzLmZvcm1hdEJpdGdvQnJvYWRjYXN0TWVzc2FnZShyZXN1bHQuYml0Z29Nc2c0KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBkZWNvZGVPckVsc2UoQml0Z29Ub09WQzFSb3VuZDNSZXNwb25zZS5uYW1lLCBCaXRnb1RvT1ZDMVJvdW5kM1Jlc3BvbnNlLCByZXNwb25zZSwgKGVycm9ycykgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBlcnJvcihzKSBwYXJzaW5nIHJlc3BvbnNlOiAke2Vycm9yc31gKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGxvYWRDbGllbnRLZXlzKFxuICAgIGJpdGdvS2V5SWQ6IHN0cmluZyxcbiAgICB1c2VyQ29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBiYWNrdXBDb21tb25LZXljaGFpbjogc3RyaW5nXG4gICk6IFByb21pc2U8eyB1c2VyS2V5Y2hhaW46IEtleWNoYWluOyBiYWNrdXBLZXljaGFpbjogS2V5Y2hhaW47IGJpdGdvS2V5Y2hhaW46IEtleWNoYWluIH0+IHtcbiAgICBhc3NlcnQoXG4gICAgICB1c2VyQ29tbW9uS2V5Y2hhaW4gPT09IGJhY2t1cENvbW1vbktleWNoYWluLFxuICAgICAgJ0NvbW1vbiBrZXljaGFpbiBtaXNtYXRjaCBiZXR3ZWVuIHRoZSB1c2VyIGFuZCBiYWNrdXAga2V5Y2hhaW5zJ1xuICAgICk7XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW4gPSBhd2FpdCBrZXljaGFpbnMuZ2V0KHsgaWQ6IGJpdGdvS2V5SWQgfSk7XG4gICAgYXNzZXJ0KGJpdGdvS2V5Y2hhaW4sICdLZXljaGFpbiBub3QgZm91bmQnKTtcbiAgICBhc3NlcnQoYml0Z29LZXljaGFpbi5zb3VyY2UgPT09ICdiaXRnbycsICdUaGUga2V5Y2hhaW4gaXMgbm90IGEgQml0R28ga2V5Y2hhaW4nKTtcbiAgICBhc3NlcnQoYml0Z29LZXljaGFpbi50eXBlID09PSAndHNzJywgJ0JpdEdvIGtleWNoYWluIGlzIG5vdCBhIFRTUyBrZXljaGFpbicpO1xuICAgIGFzc2VydChiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLCAnQml0R28ga2V5Y2hhaW4gZG9lcyBub3QgaGF2ZSBhIGNvbW1vbiBrZXljaGFpbicpO1xuICAgIGFzc2VydChiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluID09PSB1c2VyQ29tbW9uS2V5Y2hhaW4sICdDb21tb24ga2V5Y2hhaW4gbWlzbWF0Y2ggYmV0d2VlbiB0aGUgT1ZDcyBhbmQgQml0R28nKTtcblxuICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSBrZXljaGFpbnMuYWRkKHtcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAga2V5VHlwZTogJ3RzcycsXG4gICAgICBjb21tb25LZXljaGFpbjogdXNlckNvbW1vbktleWNoYWluLFxuICAgICAgaXNNUEN2MjogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBiYWNrdXBLZXljaGFpblByb21pc2UgPSBrZXljaGFpbnMuYWRkKHtcbiAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiYWNrdXBDb21tb25LZXljaGFpbixcbiAgICAgIGlzTVBDdjI6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbdXNlcktleWNoYWluUHJvbWlzZSwgYmFja3VwS2V5Y2hhaW5Qcm9taXNlXSk7XG4gICAgcmV0dXJuIHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9O1xuICB9XG59XG4iXX0=
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { DklsTypes } from '@bitgo/sdk-lib-mpc';
|
|
3
3
|
import { Buffer } from 'buffer';
|
|
4
4
|
import { KeychainsTriplet } from '../../../baseCoin';
|
|
5
|
-
import { MPCv2PartyFromStringOrNumber } from '@bitgo/public-types';
|
|
5
|
+
import { MPCv2BroadcastMessage, MPCv2KeyGenRound1Response, MPCv2KeyGenRound2Response, MPCv2KeyGenRound3Response, MPCv2P2PMessage, MPCv2PartyFromStringOrNumber } from '@bitgo/public-types';
|
|
6
6
|
import { Ecdsa } from '../../../../account-lib';
|
|
7
7
|
import { Keychain } from '../../../keychain';
|
|
8
8
|
import { DecryptedRetrofitPayload } from '../../../keychain/iKeychains';
|
|
@@ -41,14 +41,17 @@ export declare class EcdsaMPCv2Utils extends BaseEcdsaUtils {
|
|
|
41
41
|
private getUserAndBackupSession;
|
|
42
42
|
private addBitgoKeychain;
|
|
43
43
|
private sendKeyGenerationRequest;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
sendKeyGenerationRound1(enterprise: string, userGpgPublicKey: string, backupGpgPublicKey: string, payload: DklsTypes.AuthEncMessages & {
|
|
45
|
+
walletId?: string;
|
|
46
|
+
}): Promise<MPCv2KeyGenRound1Response>;
|
|
47
|
+
sendKeyGenerationRound2(enterprise: string, sessionId: string, payload: DklsTypes.AuthEncMessages): Promise<MPCv2KeyGenRound2Response>;
|
|
48
|
+
sendKeyGenerationRound3(enterprise: string, sessionId: string, payload: DklsTypes.AuthEncMessages): Promise<MPCv2KeyGenRound3Response>;
|
|
47
49
|
/**
|
|
48
50
|
* Signs the transaction associated to the transaction request.
|
|
49
51
|
* @param {string | TxRequest} params.txRequest - transaction request object or id
|
|
50
52
|
* @param {string} params.prv - decrypted private key
|
|
51
53
|
* @param {string} params.reqId - request id
|
|
54
|
+
* @param {string} params.mpcv2PartyId - party id for the signer involved in this mpcv2 request (either 0 for user or 1 for backup)
|
|
52
55
|
* @returns {Promise<TxRequest>} fully signed TxRequest object
|
|
53
56
|
*/
|
|
54
57
|
signTxRequest(params: TSSParamsWithPrv): Promise<TxRequest>;
|
|
@@ -61,8 +64,22 @@ export declare class EcdsaMPCv2Utils extends BaseEcdsaUtils {
|
|
|
61
64
|
*/
|
|
62
65
|
signTxRequestForMessage(params: TSSParamsForMessageWithPrv): Promise<TxRequest>;
|
|
63
66
|
private signRequestBase;
|
|
64
|
-
|
|
65
|
-
|
|
67
|
+
formatBitgoBroadcastMessage(broadcastMessage: MPCv2BroadcastMessage): {
|
|
68
|
+
from: 0 | 1 | 2;
|
|
69
|
+
payload: {
|
|
70
|
+
message: string;
|
|
71
|
+
signature: string;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
formatP2PMessage(p2pMessage: MPCv2P2PMessage, commitment?: string): {
|
|
75
|
+
payload: {
|
|
76
|
+
encryptedMessage: string;
|
|
77
|
+
signature: string;
|
|
78
|
+
};
|
|
79
|
+
from: 0 | 1 | 2;
|
|
80
|
+
to: 0 | 1 | 2;
|
|
81
|
+
commitment: string | undefined;
|
|
82
|
+
};
|
|
66
83
|
/**
|
|
67
84
|
* Get the hash string and derivation path from the transaction request.
|
|
68
85
|
* @param {TxRequest} txRequest - the transaction request object
|
|
@@ -120,4 +137,44 @@ export declare class EcdsaMPCv2Utils extends BaseEcdsaUtils {
|
|
|
120
137
|
signatureShareRound3: SignatureShareRecord;
|
|
121
138
|
}>;
|
|
122
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* Checks if the given key share, when decrypted, contains valid GG18 signing material.
|
|
142
|
+
*
|
|
143
|
+
* @param {string} keyShare - The encrypted key share string.
|
|
144
|
+
* @param {string|undefined} walletPassphrase - The passphrase used to decrypt the key share
|
|
145
|
+
* @returns {boolean} - Returns `true` if the decrypted data contains valid signing material, otherwise `false`.
|
|
146
|
+
*/
|
|
147
|
+
export declare function isGG18SigningMaterial(keyShare: string, walletPassphrase: string | undefined): boolean;
|
|
148
|
+
/**
|
|
149
|
+
* Retrieves the MPC v2 recovery key shares from the provided user and backup key shares.
|
|
150
|
+
*
|
|
151
|
+
* @param {string} userPublicOrPrivateKeyShare
|
|
152
|
+
* @param {string} backupPrivateOrPublicKeyShare
|
|
153
|
+
* @param {string} [walletPassphrase] - The passphrase used to decrypt the key shares
|
|
154
|
+
* @returns {Promise<{ userKeyShare: KeyShare, backupKeyShare: KeyShare, commonKeyChain: string }>}
|
|
155
|
+
*
|
|
156
|
+
* @async
|
|
157
|
+
*/
|
|
158
|
+
export declare function getMpcV2RecoveryKeyShares(userPublicOrPrivateKeyShare: string, backupPrivateOrPublicKeyShare: string, walletPassphrase?: string): Promise<{
|
|
159
|
+
userKeyShare: Buffer;
|
|
160
|
+
backupKeyShare: Buffer;
|
|
161
|
+
commonKeyChain: string;
|
|
162
|
+
}>;
|
|
163
|
+
/**
|
|
164
|
+
* Signs a message hash using MPC v2 recovery key shares.
|
|
165
|
+
*
|
|
166
|
+
* @param {Buffer} messageHash
|
|
167
|
+
* @param {Buffer} userKeyShare
|
|
168
|
+
* @param {Buffer} backupKeyShare
|
|
169
|
+
* @param {string} commonKeyChain
|
|
170
|
+
* @returns {Promise<{ recid: number, r: string, s: string, y: string }>}
|
|
171
|
+
*
|
|
172
|
+
* @async
|
|
173
|
+
*/
|
|
174
|
+
export declare function signRecoveryMpcV2(messageHash: Buffer, userKeyShare: Buffer, backupKeyShare: Buffer, commonKeyChain: string): Promise<{
|
|
175
|
+
recid: number;
|
|
176
|
+
r: string;
|
|
177
|
+
s: string;
|
|
178
|
+
y: string;
|
|
179
|
+
}>;
|
|
123
180
|
//# sourceMappingURL=ecdsaMPCv2.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ecdsaMPCv2.d.ts","sourceRoot":"","sources":["../../../../../../src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.ts"],"names":[],"mappings":";AAAA,OAAO,EAAiD,SAAS,
|
|
1
|
+
{"version":3,"file":"ecdsaMPCv2.d.ts","sourceRoot":"","sources":["../../../../../../src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.ts"],"names":[],"mappings":"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"}
|