Skip to content

Commit 5948e2d

Browse files
feat: moved mbe ping enclave to api-ts
Ticket: WP-4593
1 parent 7778f2f commit 5948e2d

File tree

11 files changed

+822
-105
lines changed

11 files changed

+822
-105
lines changed

cert.key

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCf49KqlyCwSPuS
3+
9g1lgarBY3yVAkeBdHxaoRHbdWSe3gq7OgkUD9bUnJyg8nZzXyYT3Dx+59J6kS4U
4+
i5eM/JcPMI6LHUWiwQWGg+LoFg+JY5DyRkiMrZrjbKt0N/nn7+MBIMMrZAJ8pWy+
5+
VmZBQ+LbKlnTQT6jdNh14MnSRc03QSfCjKnFPCuQ6elvuD2FT7syzegO5daZM1Bi
6+
F+omMSn9vb2wrGt3RxzJDNwIbx5SuBGqyiA0bWuPRYDVO/1caWbD4t17L0dqwwWP
7+
qLlOFv2xcTmGdB+PRcXM4ec4XgbTD8bcDxqtC4EzMnwnQ63fSrztYSUJ1AeFMEvN
8+
Afs/HkQVAgMBAAECggEAByEfOmSRPFMQxqmKiOFqhgOD4VgP7K2PQvJGK9E0+qF/
9+
fIA2ueqH44SVNlcBYZ0XQ1DxcJ4xJC53jcp4qDx2FuMNJBZazcpKDwiv9DXRnQhv
10+
xOHN59nw212z2nOJhOZNKrZ1hWiI9Npiei07k4LtqWSeyzzwSFUUNtNeZG4g26sN
11+
v5IDqKyIr+pKIQXGP9k2swqoMLKJeQR6ugjIpRERugJ4EJo92Bt5KmE/B5KcYX8g
12+
NvpsQAVlaPYit9sIKrupEsgSQW6/Y/Tt1KNagyd9ruabkmVOzC9Is8FRjPSc6WGg
13+
C31ZYPLDmzFSX1oPfRFkZchNS/NQttn2XreOvc4J+QKBgQDYfaF+6IagYFMAXuyh
14+
H4VI7VkrRxITcosDo2Q3nfVgvoKrZe2fuoL6VTetDKHQRXysZRoJetjnNt3dbe9g
15+
WTiZsGbGQIjoI1SS1I3QOGbUjP9VufEpkuRsj1CgnzVg8lQlfqK7SChG3aMrJmYF
16+
+ELtKqm5xUyjY0NJ3SzYLH+mTQKBgQC9EdKYrcfMol3rmcWyHNH0Rlg5WAv9Lwcc
17+
A5+OA7bSX24M4E1EHj3FNg7Vr/2UIBD0eSo11EO7ACl3u9vX7Lanljh6s+pCOHHy
18+
9HgsYraivu4zsXParRHhSSEdwDzUkjcBNxsht4d65uaV/33w3XhiqCIXbkMiJv3J
19+
Q29NInOI6QKBgDMADZ6HCsgXSRZqRlaCxXRzrbD7Ui/QqR0XTdGoXZkH6GKWZY9e
20+
ceKlVrNmqWwWIpO+UY7wKM73Zvb2IhFRk3rpSpzjsRz2zcK1Xh8yWk8yVCiO4FhJ
21+
6ZQFgxoDx6BqFharKYzzJ8HiDsFoj1pSrPmQNmG0MCTBiqWI/DqE6SF1AoGAM+oP
22+
5GJbKSIwHb/0W6q0L5mdIem+KP/fuN550hnM+ki/xANW0+xl05+7RQt02lZPsYEP
23+
iQZGrrMlr73CaLCTmsKRsYdzPEmZaDeeQ7m7IkbAyyrff9zjuvNEh5HAYjHfrpK9
24+
/W0SYznBeNBVeWymYJh/++UHw/nm13uPtSNPi/kCgYEAlRS9eEp+Y4Gx8mh/Dg3k
25+
mmrPvk+Fofxm52+BBmhPMREi3Xu/nc+oGoB2fe+1DLm4rg529ka4GfmjErsYJ1ip
26+
fg+TBM6j4D+W1pyPmPFTXjL16MGg0zYFcIcuaZBmD1WP1Ojz2uZt5WaPsapuXTi/
27+
rkA/bbzrGAE65dSaZDx58k0=
28+
-----END PRIVATE KEY-----

package.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,19 @@
1414
"test:watch": "jest --watch",
1515
"test:coverage": "jest --coverage",
1616
"lint": "eslint --quiet .",
17-
"generate-test-ssl": "openssl req -x509 -newkey rsa:2048 -keyout test-ssl-key.pem -out test-ssl-cert.pem -days 365 -nodes -subj '/CN=localhost'"
17+
"generate-test-ssl": "openssl req -x509 -newkey rsa:2048 -keyout test-ssl-key.pem -out test-ssl-cert.pem -days 365 -nodes -subj '/CN=localhost'",
18+
"generate-openapi": "npx openapi-generator ./src/masterExpressApi.ts > src/masterExpressApi.openapi.json"
1819
},
1920
"dependencies": {
2021
"@bitgo/sdk-core": "^33.2.0",
2122
"bitgo": "^44.2.0",
2223
"body-parser": "^1.20.3",
2324
"connect-timeout": "^1.9.0",
2425
"debug": "^3.1.0",
26+
"@api-ts/io-ts-http": "^3.2.1",
27+
"@api-ts/express-wrapper": "^1.0.33",
28+
"@api-ts/response": "^2.1.0",
29+
"io-ts": "~2.1.3",
2530
"express": "4.17.3",
2631
"lodash": "^4.17.20",
2732
"morgan": "^1.9.1",
@@ -31,6 +36,7 @@
3136
"zod": "^3.25.48"
3237
},
3338
"devDependencies": {
39+
"@api-ts/openapi-generator": "^5.7.0",
3440
"@types/body-parser": "^1.17.0",
3541
"@types/connect-timeout": "^1.9.0",
3642
"@types/debug": "^4.1.12",

src/config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ function masterExpressEnvConfig(): Partial<MasterExpressConfig> {
209209
timeout: Number(readEnvVar('BITGO_TIMEOUT')),
210210
keepAliveTimeout: Number(readEnvVar('BITGO_KEEP_ALIVE_TIMEOUT')),
211211
headersTimeout: Number(readEnvVar('BITGO_HEADERS_TIMEOUT')),
212-
// BitGo API settings
212+
// BitGo MasterExpressApi settings
213213
env: readEnvVar('BITGO_ENV') as EnvironmentName,
214214
customRootUri: readEnvVar('BITGO_CUSTOM_ROOT_URI'),
215215
enableSSL: readEnvVar('BITGO_ENABLE_SSL') !== 'false', // Default to true unless explicitly set to false

src/errors.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export class EnclavedError extends Error {
1717
}
1818

1919
/**
20-
* Error for API responses
20+
* Error for MasterExpressApi responses
2121
*/
2222
export class ApiResponseError extends EnclavedError {
2323
public result: any;

src/masterBitgoExpress/enclavedExpressClient.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export class EnclavedExpressClient {
7070
try {
7171
debugLogger('Creating independent keychain for coin: %s', this.coin);
7272
const { body: keychain } = await superagent
73-
.post(`${this.url}/api/${this.coin}/key/independent`)
73+
.post(`${this.url}/${this.coin}/key/independentKey`)
7474
.ca(this.sslCert)
7575
.agent(
7676
new https.Agent({
Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,65 @@
11
import {
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';
1211
import { 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

Comments
 (0)