11import {
2- GenerateWalletOptions ,
32 promiseProps ,
43 RequestTracer ,
54 SupplementGenerateWalletOptions ,
65 Keychain ,
76 KeychainsTriplet ,
8- Wallet ,
97 WalletWithKeychains ,
108 AddKeychainOptions ,
9+ WalletData ,
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 GenerateWalletOnPremParams = {
15+ coin : string ;
16+ label : string ;
17+ enterprise ?: string ;
18+ multisigType ?: string ;
19+ isDistributedCustody ?: boolean ;
20+ } ;
1521
1622/**
1723 * This route is used to generate a multisig wallet when enclaved express is enabled
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 handleGenerateWalletOnPrem ( {
26+ bitGo,
27+ params,
28+ } : {
29+ bitGo : BitGo ;
30+ params : GenerateWalletOnPremParams ;
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
3343 // Assign the default multiSig type value based on the coin
3444 if ( ! params . multisigType ) {
3545 params . multisigType = baseCoin . getDefaultMultisigType ( ) ;
3646 }
3747
38- if ( typeof params . label !== 'string' ) {
39- throw new Error ( 'missing required string parameter label' ) ;
40- }
41-
42- const { label, enterprise } = params ;
43-
4448 // Create wallet parameters with type assertion to allow 'onprem' subtype
4549 const walletParams = {
46- label : label ,
50+ label : params . label ,
4751 m : 2 ,
4852 n : 3 ,
4953 keys : [ ] ,
5054 type : 'cold' ,
51- subType : 'onprem ' ,
55+ subType : 'onPrem ' ,
5256 multisigType : 'onchain' ,
5357 } as unknown as SupplementGenerateWalletOptions ; // TODO: Add onprem to the SDK subType and remove "unknown" type casting
5458
55- if ( ! _ . isUndefined ( enterprise ) ) {
56- if ( ! _ . isString ( enterprise ) ) {
57- throw new Error ( 'invalid enterprise argument, expecting string' ) ;
58- }
59- walletParams . enterprise = enterprise ;
60- }
61-
6259 const userKeychainPromise = async ( ) : Promise < Keychain > => {
6360 const userKeychain = await enclavedExpressClient . createIndependentKeychain ( {
6461 source : 'user' ,
65- coin : req . params . coin ,
62+ coin : params . coin ,
6663 type : 'independent' ,
6764 } ) ;
6865 const userKeychainParams : AddKeychainOptions = {
@@ -73,13 +70,13 @@ export async function handleGenerateWalletOnPrem(req: BitGoRequest) {
7370 } ;
7471
7572 const newUserKeychain = await baseCoin . keychains ( ) . add ( userKeychainParams ) ;
76- return _ . extend ( { } , newUserKeychain , userKeychain ) ;
73+ return { ... newUserKeychain , ... userKeychain } ;
7774 } ;
7875
7976 const backupKeychainPromise = async ( ) : Promise < Keychain > => {
8077 const backupKeychain = await enclavedExpressClient . createIndependentKeychain ( {
8178 source : 'backup' ,
82- coin : req . params . coin ,
79+ coin : params . coin ,
8380 type : 'independent' ,
8481 } ) ;
8582 const backupKeychainParams : AddKeychainOptions = {
@@ -90,7 +87,7 @@ export async function handleGenerateWalletOnPrem(req: BitGoRequest) {
9087 } ;
9188
9289 const newBackupKeychain = await baseCoin . keychains ( ) . add ( backupKeychainParams ) ;
93- return _ . extend ( { } , newBackupKeychain , backupKeychain ) ;
90+ return { ... newBackupKeychain , ... backupKeychain } ;
9491 } ;
9592
9693 const { userKeychain, backupKeychain, bitgoKeychain } : KeychainsTriplet = await promiseProps ( {
@@ -113,16 +110,21 @@ export async function handleGenerateWalletOnPrem(req: BitGoRequest) {
113110
114111 const finalWalletParams = await baseCoin . supplementGenerateWallet ( walletParams , keychains ) ;
115112
116- bitgo . setRequestTracer ( reqId ) ;
117- const newWallet = await bitgo . post ( baseCoin . url ( '/wallet/add' ) ) . send ( finalWalletParams ) . result ( ) ;
113+ bitGo . setRequestTracer ( reqId ) ;
114+ const wallet = await baseCoin . wallets ( ) . add ( {
115+ ...finalWalletParams ,
116+ enterprise : params . enterprise ,
117+ reqId,
118+ isDistributedCustody : params . isDistributedCustody ,
119+ } ) ;
118120
119- const result : WalletWithKeychains = {
120- wallet : new Wallet ( bitgo , baseCoin , newWallet ) ,
121+ const result = {
122+ wallet : wallet as WalletData ,
121123 userKeychain : userKeychain ,
122124 backupKeychain : backupKeychain ,
123125 bitgoKeychain : bitgoKeychain ,
124126 responseType : 'WalletWithKeychains' ,
125127 } ;
126128
127- return { ... result , wallet : result . wallet . toJSON ( ) } ;
129+ return result as unknown as WalletWithKeychains ;
128130}
0 commit comments