11import {
2- GenerateWalletOptions ,
32 promiseProps ,
43 RequestTracer ,
54 SupplementGenerateWalletOptions ,
@@ -8,42 +7,49 @@ import {
87 Wallet ,
98 WalletWithKeychains ,
109 AddKeychainOptions ,
10+ BitGoBase ,
11+ WalletData ,
1112} from '@bitgo/sdk-core' ;
1213import { createEnclavedExpressClient } from './enclavedExpressClient' ;
13- import _ from 'lodash' ;
14- import { BitGoRequest } from '../types/request' ;
14+ import { BitGo } from 'bitgo' ;
15+
16+ export type GenerateWalletOnPremParams = {
17+ coin : string ;
18+ label : string ;
19+ enterprise ?: string ;
20+ multisigType ?: string ;
21+ isDistributedCustody ?: boolean ;
22+ } ;
1523
1624/**
1725 * This route is used to generate a multisig wallet when enclaved express is enabled
1826 */
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 ) ;
27+ export async function handleGenerateWalletOnPrem ( {
28+ bitGo,
29+ params,
30+ } : {
31+ bitGo : BitGo ;
32+ params : GenerateWalletOnPremParams ;
33+ } ) : Promise < WalletWithKeychains > {
34+ const baseCoin = bitGo . coin ( params . coin ) ;
35+
36+ const enclavedExpressClient = createEnclavedExpressClient ( params . coin ) ;
2437 if ( ! enclavedExpressClient ) {
2538 throw new Error (
2639 'Enclaved express client not configured - enclaved express features will be disabled' ,
2740 ) ;
2841 }
2942
30- const params = req . body as GenerateWalletOptions ;
3143 const reqId = new RequestTracer ( ) ;
3244
3345 // Assign the default multiSig type value based on the coin
3446 if ( ! params . multisigType ) {
3547 params . multisigType = baseCoin . getDefaultMultisigType ( ) ;
3648 }
3749
38- if ( typeof params . label !== 'string' ) {
39- throw new Error ( 'missing required string parameter label' ) ;
40- }
41-
42- const { label, enterprise } = params ;
43-
4450 // Create wallet parameters with type assertion to allow 'onprem' subtype
4551 const walletParams = {
46- label : label ,
52+ label : params . label ,
4753 m : 2 ,
4854 n : 3 ,
4955 keys : [ ] ,
@@ -52,17 +58,10 @@ export async function handleGenerateWalletOnPrem(req: BitGoRequest) {
5258 multisigType : 'onchain' ,
5359 } as unknown as SupplementGenerateWalletOptions ; // TODO: Add onprem to the SDK subType and remove "unknown" type casting
5460
55- if ( ! _ . isUndefined ( enterprise ) ) {
56- if ( ! _ . isString ( enterprise ) ) {
57- throw new Error ( 'invalid enterprise argument, expecting string' ) ;
58- }
59- walletParams . enterprise = enterprise ;
60- }
61-
6261 const userKeychainPromise = async ( ) : Promise < Keychain > => {
6362 const userKeychain = await enclavedExpressClient . createIndependentKeychain ( {
6463 source : 'user' ,
65- coin : req . params . coin ,
64+ coin : params . coin ,
6665 type : 'independent' ,
6766 } ) ;
6867 const userKeychainParams : AddKeychainOptions = {
@@ -73,13 +72,13 @@ export async function handleGenerateWalletOnPrem(req: BitGoRequest) {
7372 } ;
7473
7574 const newUserKeychain = await baseCoin . keychains ( ) . add ( userKeychainParams ) ;
76- return _ . extend ( { } , newUserKeychain , userKeychain ) ;
75+ return { ... newUserKeychain , ... userKeychain } ;
7776 } ;
7877
7978 const backupKeychainPromise = async ( ) : Promise < Keychain > => {
8079 const backupKeychain = await enclavedExpressClient . createIndependentKeychain ( {
8180 source : 'backup' ,
82- coin : req . params . coin ,
81+ coin : params . coin ,
8382 type : 'independent' ,
8483 } ) ;
8584 const backupKeychainParams : AddKeychainOptions = {
@@ -90,7 +89,7 @@ export async function handleGenerateWalletOnPrem(req: BitGoRequest) {
9089 } ;
9190
9291 const newBackupKeychain = await baseCoin . keychains ( ) . add ( backupKeychainParams ) ;
93- return _ . extend ( { } , newBackupKeychain , backupKeychain ) ;
92+ return { ... newBackupKeychain , ... backupKeychain } ;
9493 } ;
9594
9695 const { userKeychain, backupKeychain, bitgoKeychain } : KeychainsTriplet = await promiseProps ( {
@@ -113,16 +112,21 @@ export async function handleGenerateWalletOnPrem(req: BitGoRequest) {
113112
114113 const finalWalletParams = await baseCoin . supplementGenerateWallet ( walletParams , keychains ) ;
115114
116- bitgo . setRequestTracer ( reqId ) ;
117- const newWallet = await bitgo . post ( baseCoin . url ( '/wallet/add' ) ) . send ( finalWalletParams ) . result ( ) ;
115+ bitGo . setRequestTracer ( reqId ) ;
116+ const wallet = await baseCoin . wallets ( ) . add ( {
117+ ...finalWalletParams ,
118+ enterprise : params . enterprise ,
119+ reqId,
120+ isDistributedCustody : params . isDistributedCustody ,
121+ } ) ;
118122
119- const result : WalletWithKeychains = {
120- wallet : new Wallet ( bitgo , baseCoin , newWallet ) ,
123+ const result = {
124+ wallet : wallet as WalletData ,
121125 userKeychain : userKeychain ,
122126 backupKeychain : backupKeychain ,
123127 bitgoKeychain : bitgoKeychain ,
124128 responseType : 'WalletWithKeychains' ,
125129 } ;
126130
127- return { ... result , wallet : result . wallet . toJSON ( ) } ;
131+ return result as unknown as WalletWithKeychains ;
128132}
0 commit comments