diff --git a/src/masterBitgoExpress/handlers/handleGenerateWallet.ts b/src/masterBitgoExpress/handlers/handleGenerateWallet.ts index c7dcfaaa..ed2981e7 100644 --- a/src/masterBitgoExpress/handlers/handleGenerateWallet.ts +++ b/src/masterBitgoExpress/handlers/handleGenerateWallet.ts @@ -8,6 +8,7 @@ import { submitJobViaBridgeClient } from './utils/asyncUtils'; import { createEcdsaMPCv2KeyGenCallbacks, createEddsaKeyGenCallbacks, + createEddsaMPCv2KeyGenCallbacks, createOnchainKeyGenCallback, } from './walletGenerationCallbacks'; @@ -69,7 +70,7 @@ function keyGenCallbacks( algorithm: MPCAlgorithm | undefined, ): Pick< GenerateWalletWithExternalSignerOptions, - 'createKeychainCallback' | 'ecdsaMPCv2Callbacks' | 'eddsaCallbacks' + 'createKeychainCallback' | 'ecdsaMPCv2Callbacks' | 'eddsaCallbacks' | 'eddsaMPCv2Callbacks' > { const { awmUserClient, awmBackupClient } = req; assert(awmUserClient, 'User AWM client not initialized'); @@ -84,8 +85,14 @@ function keyGenCallbacks( return { ecdsaMPCv2Callbacks: createEcdsaMPCv2KeyGenCallbacks(awmUserClient, awmBackupClient), }; - case 'eddsa': + case 'eddsa': { + if (req.decoded.multisigTypeVersion === 'MPCv2') { + return { + eddsaMPCv2Callbacks: createEddsaMPCv2KeyGenCallbacks(awmUserClient, awmBackupClient), + }; + } return { eddsaCallbacks: createEddsaKeyGenCallbacks(awmUserClient, awmBackupClient) }; + } default: throw new BadRequestError( `Unsupported MPC algorithm: ${algorithm}. Supported algorithms: ecdsa, eddsa`, diff --git a/src/masterBitgoExpress/routers/generateWalletRoute.ts b/src/masterBitgoExpress/routers/generateWalletRoute.ts index aeed52f7..717e37b7 100644 --- a/src/masterBitgoExpress/routers/generateWalletRoute.ts +++ b/src/masterBitgoExpress/routers/generateWalletRoute.ts @@ -346,6 +346,15 @@ const GenerateWalletRequest = { * @pattern ^[0-9a-f]{32}$ */ evmKeyRingReferenceWalletId: optional(t.string), + + /** + * The MPC protocol version used for TSS wallet generation + * - MPCv1: Legacy MPC protocol (default for TSS wallets if absent) + * - MPCv2: Silence Labs MPC protocol (newer, currently opt-in) + * Only used when multisigType is 'tss'; if absent, the coin's default is used + * @example "MPCv2" + */ + multisigTypeVersion: optional(t.union([t.literal('MPCv1'), t.literal('MPCv2')])), }; /**