11import {
2- GenerateWalletOptions ,
2+ AddKeychainOptions ,
3+ Keychain ,
4+ KeychainsTriplet ,
35 promiseProps ,
46 RequestTracer ,
57 SupplementGenerateWalletOptions ,
6- Keychain ,
7- KeychainsTriplet ,
8- Wallet ,
98 WalletWithKeychains ,
10- AddKeychainOptions ,
9+ type Wallet ,
1110} from '@bitgo/sdk-core' ;
1211import { createEnclavedExpressClient } from './enclavedExpressClient' ;
13- import _ from 'lodash' ;
14- import { BitGoRequest } from '../types/request' ;
12+ import { BitGo } from 'bitgo' ;
13+
14+ export type GenerateMultiSigOnPremWalletParams = {
15+ coin : string ;
16+ label : string ;
17+ enterprise ?: string ;
18+ } ;
1519
1620/**
17- * This route is used to generate a multisig wallet when enclaved express is enabled
21+ * Generate multisig wallet keys using enclaved express and create the wallet in BitGo
22+ * @param {BitGo } bitgo the sdk instance
23+ * @param {GenerateMultiSigOnPremWalletParams } params
1824 */
19- export async function handleGenerateWalletOnPrem ( req : BitGoRequest ) {
20- const bitgo = req . bitgo ;
21- const baseCoin = bitgo . coin ( req . params . coin ) ;
22-
23- const enclavedExpressClient = createEnclavedExpressClient ( req . params . coin ) ;
25+ export async function generateMultiSigOnPremWallet ( {
26+ bitgo,
27+ params,
28+ } : {
29+ bitgo : BitGo ;
30+ params : GenerateMultiSigOnPremWalletParams ;
31+ } ) : Promise < WalletWithKeychains > {
32+ const baseCoin = bitgo . coin ( params . coin ) ;
33+
34+ const enclavedExpressClient = createEnclavedExpressClient ( params . coin ) ;
2435 if ( ! enclavedExpressClient ) {
2536 throw new Error (
2637 'Enclaved express client not configured - enclaved express features will be disabled' ,
2738 ) ;
2839 }
2940
30- const params = req . body as GenerateWalletOptions ;
3141 const reqId = new RequestTracer ( ) ;
3242
33- // Assign the default multiSig type value based on the coin
34- if ( ! params . multisigType ) {
35- params . multisigType = baseCoin . getDefaultMultisigType ( ) ;
36- }
37-
38- if ( typeof params . label !== 'string' ) {
39- throw new Error ( 'missing required string parameter label' ) ;
40- }
41-
42- const { label, enterprise } = params ;
43-
4443 // Create wallet parameters with type assertion to allow 'onprem' subtype
4544 const walletParams = {
46- label : label ,
45+ label : params . label ,
4746 m : 2 ,
4847 n : 3 ,
4948 keys : [ ] ,
5049 type : 'cold' ,
51- subType : 'onprem ' ,
50+ subType : 'onPrem ' ,
5251 multisigType : 'onchain' ,
5352 } as unknown as SupplementGenerateWalletOptions ; // TODO: Add onprem to the SDK subType and remove "unknown" type casting
5453
55- if ( ! _ . isUndefined ( enterprise ) ) {
56- if ( ! _ . isString ( enterprise ) ) {
57- throw new Error ( 'invalid enterprise argument, expecting string' ) ;
58- }
59- walletParams . enterprise = enterprise ;
60- }
61-
6254 const userKeychainPromise = async ( ) : Promise < Keychain > => {
6355 const userKeychain = await enclavedExpressClient . createIndependentKeychain ( {
6456 source : 'user' ,
65- coin : req . params . coin ,
57+ coin : params . coin ,
6658 type : 'independent' ,
6759 } ) ;
6860 const userKeychainParams : AddKeychainOptions = {
@@ -73,13 +65,13 @@ export async function handleGenerateWalletOnPrem(req: BitGoRequest) {
7365 } ;
7466
7567 const newUserKeychain = await baseCoin . keychains ( ) . add ( userKeychainParams ) ;
76- return _ . extend ( { } , newUserKeychain , userKeychain ) ;
68+ return { ... newUserKeychain , ... userKeychain } ;
7769 } ;
7870
7971 const backupKeychainPromise = async ( ) : Promise < Keychain > => {
8072 const backupKeychain = await enclavedExpressClient . createIndependentKeychain ( {
8173 source : 'backup' ,
82- coin : req . params . coin ,
74+ coin : params . coin ,
8375 type : 'independent' ,
8476 } ) ;
8577 const backupKeychainParams : AddKeychainOptions = {
@@ -90,7 +82,7 @@ export async function handleGenerateWalletOnPrem(req: BitGoRequest) {
9082 } ;
9183
9284 const newBackupKeychain = await baseCoin . keychains ( ) . add ( backupKeychainParams ) ;
93- return _ . extend ( { } , newBackupKeychain , backupKeychain ) ;
85+ return { ... newBackupKeychain , ... backupKeychain } ;
9486 } ;
9587
9688 const { userKeychain, backupKeychain, bitgoKeychain } : KeychainsTriplet = await promiseProps ( {
@@ -99,7 +91,8 @@ export async function handleGenerateWalletOnPrem(req: BitGoRequest) {
9991 bitgoKeychain : baseCoin . keychains ( ) . createBitGo ( {
10092 enterprise : params . enterprise ,
10193 reqId,
102- isDistributedCustody : params . isDistributedCustody ,
94+ // not applicable for onPrem wallets
95+ isDistributedCustody : false ,
10396 } ) ,
10497 } ) ;
10598
@@ -114,15 +107,19 @@ export async function handleGenerateWalletOnPrem(req: BitGoRequest) {
114107 const finalWalletParams = await baseCoin . supplementGenerateWallet ( walletParams , keychains ) ;
115108
116109 bitgo . setRequestTracer ( reqId ) ;
117- const newWallet = await bitgo . post ( baseCoin . url ( '/wallet/add' ) ) . send ( finalWalletParams ) . result ( ) ;
118-
119- const result : WalletWithKeychains = {
120- wallet : new Wallet ( bitgo , baseCoin , newWallet ) ,
110+ const wallet = ( await baseCoin . wallets ( ) . add ( {
111+ ...finalWalletParams ,
112+ enterprise : params . enterprise ,
113+ reqId,
114+ // Not valid for onPrem wallets
115+ isDistributedCustody : false ,
116+ } ) ) as Wallet ;
117+
118+ return {
119+ wallet : wallet ,
121120 userKeychain : userKeychain ,
122121 backupKeychain : backupKeychain ,
123122 bitgoKeychain : bitgoKeychain ,
124123 responseType : 'WalletWithKeychains' ,
125124 } ;
126-
127- return { ...result , wallet : result . wallet . toJSON ( ) } ;
128125}
0 commit comments