Skip to content

Commit 6f0cdae

Browse files
Marzooqabitgobot
authored andcommitted
fix(sdk-core): route EdDSA MPCv2 hot wallets to full apiVersion
- `getTxRequestApiVersion`: add `|| wallet.multisigTypeVersion() === 'MPCv2'` to the `'full'` branch so EdDSA MPCv2 hot wallets are not incorrectly returned `'lite'`, which causes `signRequestBase` to fail with "Missing signableHex in unsignedTx" at runtime. - `validateTxRequestApiVersion`: merge ECDSA and MPCv2 check so that passing `apiVersion: 'lite'` on any MPCv2 wallet throws immediately. - `baseTSSUtils.supportedTxRequestVersions`: return `['full']` (not `['lite', 'full']`) for EdDSA MPCv2 hot wallets; v1 hot wallets are unchanged. - Tests: add `multisigTypeVersion` to all txRequest wallet stubs; add two new cases (MPCv2 throws on `'lite'`, MPCv2 defaults to `'full'`); add `EddsaMPCv2Utils.supportedTxRequestVersions` test for MPCv2 hot wallet returning `['full']`. Ticket: WCI-156 Session-Id: ac2678cb-270b-48ab-851f-7787f697cba9 Task-Id: 77a26d69-dcc5-43cf-b339-dace5e08c890
1 parent d473c4c commit 6f0cdae

4 files changed

Lines changed: 48 additions & 7 deletions

File tree

modules/bitgo/test/v2/unit/internal/tssUtils/eddsa.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
common,
1616
createSharedDataProof,
1717
Ed25519BIP32,
18+
EDDSAUtils,
1819
Eddsa,
1920
EncryptedSignerShareType,
2021
ExchangeCommitmentResponse,
@@ -1130,11 +1131,20 @@ describe('TSS Utils:', async function () {
11301131
coldWalletTssUtils.supportedTxRequestVersions().should.deepEqual(['full']);
11311132
});
11321133
it('should return full and lite for hot wallets', async function () {
1133-
const hotWallet = new Wallet(bitgo, baseCoin, { multisigType: 'tss', type: 'hot' });
1134+
const hotWallet = new Wallet(bitgo, baseCoin, { multisigType: 'tss', multisigTypeVersion: undefined, type: 'hot' });
11341135
const hotTssUtils = new TssUtils(bitgo, baseCoin, hotWallet);
11351136
const supportedTxRequestVersions = hotTssUtils.supportedTxRequestVersions();
11361137
supportedTxRequestVersions.should.deepEqual(['lite', 'full']);
11371138
});
1139+
it('should return only full for hot MPCv2 wallets', function () {
1140+
const hotMPCv2Wallet = new Wallet(bitgo, baseCoin, {
1141+
multisigType: 'tss',
1142+
multisigTypeVersion: 'MPCv2',
1143+
type: 'hot',
1144+
});
1145+
const mpcv2TssUtils = new EDDSAUtils.EddsaMPCv2Utils(bitgo, baseCoin, hotMPCv2Wallet);
1146+
mpcv2TssUtils.supportedTxRequestVersions().should.deepEqual(['full']);
1147+
});
11381148
it('should return empty for trading wallets', function () {
11391149
const tradingWallets = new Wallet(bitgo, baseCoin, { multisigType: 'tss', type: 'trading' });
11401150
const tradingWalletTssUtils = new TssUtils(bitgo, baseCoin, tradingWallets);

modules/sdk-core/src/bitgo/utils/tss/baseTSSUtils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,9 @@ export default class BaseTssUtils<KeyShare> extends MpcUtils implements ITssUtil
618618
} else if (this._wallet.baseCoin.getMPCAlgorithm() === 'ecdsa') {
619619
return ['full'];
620620
} else if (this._wallet.baseCoin.getMPCAlgorithm() === 'eddsa' && this._wallet.type() === 'hot') {
621+
if (this._wallet.multisigTypeVersion() === 'MPCv2') {
622+
return ['full'];
623+
}
621624
return ['lite', 'full'];
622625
} else {
623626
return ['full'];

modules/sdk-core/src/bitgo/utils/txRequest.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ export function validateTxRequestApiVersion(wallet: IWallet, requestedApiVersion
66
// only tss wallets have api version requirements
77
return;
88
}
9-
if (wallet.baseCoin.getMPCAlgorithm() === 'ecdsa') {
10-
// ecdsa wallets can only use full, even if they are hot wallets
11-
assert(requestedApiVersion === 'full', 'For ECDSA tss wallets, parameter `apiVersion` must be `full`.');
9+
if (wallet.baseCoin.getMPCAlgorithm() === 'ecdsa' || wallet.multisigTypeVersion() === 'MPCv2') {
10+
assert(requestedApiVersion === 'full', 'For MPCv2 tss wallets, parameter `apiVersion` must be `full`.');
1211
} else if (wallet.type() !== 'hot') {
1312
// all other cases should use full!
1413
assert(
@@ -30,10 +29,10 @@ export function getTxRequestApiVersion(wallet: IWallet, requestedApiVersion?: Ap
3029
validateTxRequestApiVersion(wallet, requestedApiVersion);
3130
return requestedApiVersion;
3231
}
33-
if (wallet.baseCoin.getMPCAlgorithm() === 'ecdsa') {
32+
if (wallet.baseCoin.getMPCAlgorithm() === 'ecdsa' || wallet.multisigTypeVersion() === 'MPCv2') {
3433
return 'full';
3534
} else if (wallet.type() === 'hot') {
36-
// default to lite for hot eddsa tss wallets
35+
// default to lite for hot eddsa tss wallets (v1 only)
3736
return 'lite';
3837
} else {
3938
// default to full for all other wallet types

modules/sdk-core/test/unit/bitgo/utils/txRequest.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,18 @@ describe('txRequest utils', () => {
1010
baseCoin: { getMPCAlgorithm: () => 'ecdsa' },
1111
type: () => 'hot',
1212
multisigType: () => 'tss',
13+
multisigTypeVersion: () => undefined,
1314
} as any as IWallet,
1415
requestedApiVersion: 'lite',
1516
expectedApiVersion: '',
16-
expectedErrorMessage: 'For ECDSA tss wallets, parameter `apiVersion` must be `full`.',
17+
expectedErrorMessage: 'For MPCv2 tss wallets, parameter `apiVersion` must be `full`.',
1718
},
1819
{
1920
wallet: {
2021
baseCoin: { getMPCAlgorithm: () => 'eddsa' },
2122
type: () => 'cold',
2223
multisigType: () => 'tss',
24+
multisigTypeVersion: () => undefined,
2325
} as any as IWallet,
2426
requestedApiVersion: 'lite',
2527
expectedApiVersion: '',
@@ -30,17 +32,41 @@ describe('txRequest utils', () => {
3032
baseCoin: { getMPCAlgorithm: () => 'eddsa' },
3133
type: () => 'hot',
3234
multisigType: () => 'tss',
35+
multisigTypeVersion: () => undefined,
3336
} as any as IWallet,
3437
requestedApiVersion: undefined,
3538
expectedApiVersion: 'lite',
3639
expectedErrorMessage: '',
3740
},
41+
{
42+
wallet: {
43+
baseCoin: { getMPCAlgorithm: () => 'eddsa' },
44+
type: () => 'hot',
45+
multisigType: () => 'tss',
46+
multisigTypeVersion: () => 'MPCv2',
47+
} as any as IWallet,
48+
requestedApiVersion: 'lite' as ApiVersion,
49+
expectedApiVersion: '',
50+
expectedErrorMessage: 'For MPCv2 tss wallets, parameter `apiVersion` must be `full`.',
51+
},
52+
{
53+
wallet: {
54+
baseCoin: { getMPCAlgorithm: () => 'eddsa' },
55+
type: () => 'hot',
56+
multisigType: () => 'tss',
57+
multisigTypeVersion: () => 'MPCv2',
58+
} as any as IWallet,
59+
requestedApiVersion: undefined,
60+
expectedApiVersion: 'full',
61+
expectedErrorMessage: '',
62+
},
3863
...['hot', 'cold', 'custodial', 'backing'].map((walletType) => {
3964
return {
4065
wallet: {
4166
baseCoin: { getMPCAlgorithm: () => 'ecdsa' },
4267
type: () => walletType,
4368
multisigType: () => 'tss',
69+
multisigTypeVersion: () => undefined,
4470
} as any as IWallet,
4571
requestedApiVersion: 'full',
4672
expectedApiVersion: 'full',
@@ -54,6 +80,7 @@ describe('txRequest utils', () => {
5480
baseCoin: { getMPCAlgorithm: () => 'ecdsa' },
5581
type: () => walletType,
5682
multisigType: () => 'tss',
83+
multisigTypeVersion: () => undefined,
5784
} as any as IWallet,
5885
requestedApiVersion: undefined,
5986
expectedApiVersion: 'full',
@@ -67,6 +94,7 @@ describe('txRequest utils', () => {
6794
baseCoin: { getMPCAlgorithm: () => 'eddsa' },
6895
type: () => walletType,
6996
multisigType: () => 'tss',
97+
multisigTypeVersion: () => undefined,
7098
} as any as IWallet,
7199
requestedApiVersion: 'full',
72100
expectedApiVersion: 'full',
@@ -80,6 +108,7 @@ describe('txRequest utils', () => {
80108
baseCoin: { getMPCAlgorithm: () => 'eddsa' },
81109
type: () => walletType,
82110
multisigType: () => 'tss',
111+
multisigTypeVersion: () => undefined,
83112
} as any as IWallet,
84113
requestedApiVersion: undefined,
85114
expectedApiVersion: 'full',

0 commit comments

Comments
 (0)