@ledgerhq/vault-common 2.4.3 → 2.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +16 -16
- package/CHANGELOG.md +6 -0
- package/lib/{chunk-MTIKVKIS.js → chunk-BLZRHILW.js} +13 -13
- package/lib/{chunk-MTIKVKIS.js.map → chunk-BLZRHILW.js.map} +1 -1
- package/lib/{chunk-QL5GBWII.js → chunk-N6UGATIN.js} +3 -3
- package/lib/{chunk-QL5GBWII.js.map → chunk-N6UGATIN.js.map} +1 -1
- package/lib/{chunk-3NZFOZSL.js → chunk-OZIREBYO.js} +21 -21
- package/lib/{chunk-3NZFOZSL.js.map → chunk-OZIREBYO.js.map} +1 -1
- package/lib/{chunk-4OGAVJPW.js → chunk-TBOMCYUR.js} +36 -2
- package/lib/chunk-TBOMCYUR.js.map +1 -0
- package/lib/{chunk-ZRN7GJSN.js → chunk-TZJ54LD2.js} +3 -3
- package/lib/{chunk-ZRN7GJSN.js.map → chunk-TZJ54LD2.js.map} +1 -1
- package/lib/createHSMBridge.js +4 -4
- package/lib/index.js +64 -64
- package/lib/recipeManifest.js +3 -3
- package/lib/reviewAPIRequest.js +4 -4
- package/lib/utils.js +2 -2
- package/package.json +3 -3
- package/lib/chunk-4OGAVJPW.js.map +0 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @ledgerhq/vault-common@2.4.
|
|
2
|
+
> @ledgerhq/vault-common@2.4.4 build /home/runner/work/vault-ts/vault-ts/packages/common
|
|
3
3
|
> tsup
|
|
4
4
|
|
|
5
5
|
[34mCLI[39m Building entry: src/createHSMBridge.ts, src/index.ts, src/recipeManifest.ts, src/reviewAPIRequest.ts, src/utils.ts, src/crypto/utils.ts, src/types/index.ts
|
|
@@ -9,39 +9,39 @@
|
|
|
9
9
|
[34mCLI[39m Target: es2022
|
|
10
10
|
[34mCLI[39m Cleaning output folder
|
|
11
11
|
[34mCJS[39m Build start
|
|
12
|
+
[34mDTS[39m Build start
|
|
12
13
|
[32mCJS[39m [1mlib/createHSMBridge.js [22m[32m331.00 B[39m
|
|
13
14
|
[32mCJS[39m [1mlib/crypto/utils.js [22m[32m335.00 B[39m
|
|
14
15
|
[32mCJS[39m [1mlib/types/index.js [22m[32m329.00 B[39m
|
|
15
16
|
[32mCJS[39m [1mlib/index.js [22m[32m121.00 KB[39m
|
|
16
|
-
[32mCJS[39m [1mlib/chunk-
|
|
17
|
+
[32mCJS[39m [1mlib/chunk-N6UGATIN.js [22m[32m3.59 KB[39m
|
|
17
18
|
[32mCJS[39m [1mlib/recipeManifest.js [22m[32m349.00 B[39m
|
|
18
|
-
[32mCJS[39m [1mlib/chunk-
|
|
19
|
+
[32mCJS[39m [1mlib/chunk-OZIREBYO.js [22m[32m17.80 KB[39m
|
|
19
20
|
[32mCJS[39m [1mlib/reviewAPIRequest.js [22m[32m365.00 B[39m
|
|
20
|
-
[32mCJS[39m [1mlib/chunk-
|
|
21
|
-
[32mCJS[39m [1mlib/chunk-
|
|
21
|
+
[32mCJS[39m [1mlib/chunk-BLZRHILW.js [22m[32m37.63 KB[39m
|
|
22
|
+
[32mCJS[39m [1mlib/chunk-TZJ54LD2.js [22m[32m3.39 KB[39m
|
|
22
23
|
[32mCJS[39m [1mlib/utils.js [22m[32m1.20 KB[39m
|
|
23
|
-
[32mCJS[39m [1mlib/chunk-
|
|
24
|
+
[32mCJS[39m [1mlib/chunk-TBOMCYUR.js [22m[32m35.45 KB[39m
|
|
24
25
|
[32mCJS[39m [1mlib/chunk-3L2XDBZ2.js [22m[32m8.65 KB[39m
|
|
25
26
|
[32mCJS[39m [1mlib/chunk-IAJMQIH7.js [22m[32m396.00 B[39m
|
|
26
27
|
[32mCJS[39m [1mlib/chunk-PZ5AY32C.js [22m[32m314.00 B[39m
|
|
27
28
|
[32mCJS[39m [1mlib/createHSMBridge.js.map [22m[32m293.00 B[39m
|
|
28
|
-
[32mCJS[39m [1mlib/crypto/utils.js.map [22m[32m281.00 B[39m
|
|
29
29
|
[32mCJS[39m [1mlib/types/index.js.map [22m[32m269.00 B[39m
|
|
30
|
+
[32mCJS[39m [1mlib/crypto/utils.js.map [22m[32m281.00 B[39m
|
|
30
31
|
[32mCJS[39m [1mlib/index.js.map [22m[32m179.10 KB[39m
|
|
31
|
-
[32mCJS[39m [1mlib/chunk-
|
|
32
|
+
[32mCJS[39m [1mlib/chunk-N6UGATIN.js.map [22m[32m7.09 KB[39m
|
|
32
33
|
[32mCJS[39m [1mlib/recipeManifest.js.map [22m[32m288.00 B[39m
|
|
33
|
-
[32mCJS[39m [1mlib/chunk-
|
|
34
|
+
[32mCJS[39m [1mlib/chunk-OZIREBYO.js.map [22m[32m36.53 KB[39m
|
|
34
35
|
[32mCJS[39m [1mlib/reviewAPIRequest.js.map [22m[32m308.00 B[39m
|
|
35
|
-
[32mCJS[39m [1mlib/chunk-
|
|
36
|
-
[32mCJS[39m [1mlib/chunk-
|
|
36
|
+
[32mCJS[39m [1mlib/chunk-BLZRHILW.js.map [22m[32m71.66 KB[39m
|
|
37
|
+
[32mCJS[39m [1mlib/chunk-TZJ54LD2.js.map [22m[32m5.19 KB[39m
|
|
37
38
|
[32mCJS[39m [1mlib/utils.js.map [22m[32m398.00 B[39m
|
|
38
|
-
[32mCJS[39m [1mlib/chunk-
|
|
39
|
+
[32mCJS[39m [1mlib/chunk-TBOMCYUR.js.map [22m[32m67.04 KB[39m
|
|
39
40
|
[32mCJS[39m [1mlib/chunk-3L2XDBZ2.js.map [22m[32m20.30 KB[39m
|
|
40
|
-
[32mCJS[39m [1mlib/chunk-IAJMQIH7.js.map [22m[32m52.69 KB[39m
|
|
41
41
|
[32mCJS[39m [1mlib/chunk-PZ5AY32C.js.map [22m[32m479.00 B[39m
|
|
42
|
-
[32mCJS[39m
|
|
43
|
-
[
|
|
44
|
-
[32mDTS[39m ⚡️ Build success in
|
|
42
|
+
[32mCJS[39m [1mlib/chunk-IAJMQIH7.js.map [22m[32m52.69 KB[39m
|
|
43
|
+
[32mCJS[39m ⚡️ Build success in 916ms
|
|
44
|
+
[32mDTS[39m ⚡️ Build success in 11847ms
|
|
45
45
|
[32mDTS[39m [1mlib/createHSMBridge.d.ts [22m[32m984.00 B[39m
|
|
46
46
|
[32mDTS[39m [1mlib/index.d.ts [22m[32m12.96 KB[39m
|
|
47
47
|
[32mDTS[39m [1mlib/reviewAPIRequest.d.ts [22m[32m836.00 B[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkTZJ54LD2js = require('./chunk-TZJ54LD2.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
@@ -9,7 +9,7 @@ var _chunkZRN7GJSNjs = require('./chunk-ZRN7GJSN.js');
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _chunkTBOMCYURjs = require('./chunk-TBOMCYUR.js');
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
@@ -86,12 +86,12 @@ var prepareAccountCreation = ({ type, data }) => {
|
|
|
86
86
|
} else if ("accountType" in account) {
|
|
87
87
|
account_type = account.accountType;
|
|
88
88
|
} else if ("currency" in account) {
|
|
89
|
-
account_type =
|
|
89
|
+
account_type = _chunkTBOMCYURjs.getAccountTypeByCurrency.call(void 0, account.currency);
|
|
90
90
|
}
|
|
91
91
|
if (!account_type) {
|
|
92
92
|
throw new Error(`Can't determine account type`);
|
|
93
93
|
}
|
|
94
|
-
const unit =
|
|
94
|
+
const unit = _chunkTBOMCYURjs.getAccountUnit.call(void 0, account, tokens);
|
|
95
95
|
const governance_rules = "policy" in account || "tradelink_data" in account && !!account.tradelink_data ? null : transformManifestRules({
|
|
96
96
|
rules: account.rules,
|
|
97
97
|
unit,
|
|
@@ -221,7 +221,7 @@ var prepareAccountEdition = ({ type, data }) => {
|
|
|
221
221
|
if (!existingAccount) {
|
|
222
222
|
throw new Error("No existingAccount given");
|
|
223
223
|
}
|
|
224
|
-
const unit =
|
|
224
|
+
const unit = _chunkTBOMCYURjs.getAccountUnit.call(void 0, account, tokens);
|
|
225
225
|
const governance_rules = transformManifestRules({
|
|
226
226
|
rules: account.rules,
|
|
227
227
|
unit,
|
|
@@ -384,7 +384,7 @@ var prepareExchangeCreation = ({ type, data }) => {
|
|
|
384
384
|
};
|
|
385
385
|
var preparePolicyCreation = ({ type, data }) => {
|
|
386
386
|
const { policy, usersByName, usersByDevice, groupsIDsByName, whitelistsIDsByName } = data;
|
|
387
|
-
const unit = data.policy.currency ?
|
|
387
|
+
const unit = data.policy.currency ? _chunkTBOMCYURjs.getCurrencyUnit.call(void 0, data.policy.currency) : void 0;
|
|
388
388
|
const governance_rules = transformManifestRules({
|
|
389
389
|
rules: policy.rules,
|
|
390
390
|
unit,
|
|
@@ -536,8 +536,8 @@ var transformThresholdRuleFromManifest = (rule, unit) => {
|
|
|
536
536
|
data: [
|
|
537
537
|
{
|
|
538
538
|
currency_type: "CRYPTO",
|
|
539
|
-
...rule.max ? { max:
|
|
540
|
-
min:
|
|
539
|
+
...rule.max ? { max: _chunkTBOMCYURjs.serializeUnitValue.call(void 0, unit, rule.max) } : {},
|
|
540
|
+
min: _chunkTBOMCYURjs.serializeUnitValue.call(void 0, unit, rule.min || 0)
|
|
541
541
|
}
|
|
542
542
|
]
|
|
543
543
|
};
|
|
@@ -723,7 +723,7 @@ var createDefaultRunner = (pool, options) => {
|
|
|
723
723
|
const reqResp = await admin.get(
|
|
724
724
|
`/requests?page=1&type=ACTIVATE&target_id=${res.account.id}`
|
|
725
725
|
);
|
|
726
|
-
const requests =
|
|
726
|
+
const requests = _chunkTBOMCYURjs.unwrapConnection.call(void 0, reqResp);
|
|
727
727
|
const activationRequest = requests[0];
|
|
728
728
|
if (!activationRequest) {
|
|
729
729
|
throw new Error(`No account activation request found for account ${res.account.name}`);
|
|
@@ -786,7 +786,7 @@ var createDefaultRunner = (pool, options) => {
|
|
|
786
786
|
res.account = account2;
|
|
787
787
|
break;
|
|
788
788
|
}
|
|
789
|
-
await
|
|
789
|
+
await _chunkTBOMCYURjs.wait.call(void 0, 3e3);
|
|
790
790
|
}
|
|
791
791
|
}
|
|
792
792
|
return res;
|
|
@@ -1135,8 +1135,8 @@ async function reviewAPIRequest({
|
|
|
1135
1135
|
reviewType,
|
|
1136
1136
|
skipDecodeChallenge = false
|
|
1137
1137
|
}, { logger = _vaultutils.SILENT_LOGGER }) {
|
|
1138
|
-
const workspace =
|
|
1139
|
-
const apiNetwork =
|
|
1138
|
+
const workspace = _chunkTBOMCYURjs.getWorkspaceFromGate.call(void 0, gate);
|
|
1139
|
+
const apiNetwork = _chunkTZJ54LD2js.createNetwork.call(void 0, {
|
|
1140
1140
|
baseURL: apiGateway
|
|
1141
1141
|
});
|
|
1142
1142
|
logger.info(`Authenticate for ${apiUser.name}`);
|
|
@@ -1181,4 +1181,4 @@ var reviewAPIRequest_default = reviewAPIRequest;
|
|
|
1181
1181
|
|
|
1182
1182
|
|
|
1183
1183
|
exports.performRequest = performRequest; exports.prepareRequest_default = prepareRequest_default; exports.reviewAPIRequest_default = reviewAPIRequest_default; exports.createDefaultRunner_default = createDefaultRunner_default; exports.getAuthTokens = getAuthTokens; exports.authenticate = authenticate; exports.decodeChallenge = decodeChallenge; exports.signAndApprove = signAndApprove; exports.getTradelinkPledge = getTradelinkPledge; exports.getTradelinkRecipient = getTradelinkRecipient;
|
|
1184
|
-
//# sourceMappingURL=chunk-
|
|
1184
|
+
//# sourceMappingURL=chunk-BLZRHILW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-MTIKVKIS.js","../src/reviewAPIRequest.ts","../src/apiUser/index.ts","../src/createDefaultRunner.ts","../src/prepareRequest.ts"],"names":["admin","invariant","account"],"mappings":"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","file":"/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-MTIKVKIS.js","sourcesContent":[null,"import { SILENT_LOGGER } from \"@ledgerhq/vault-utils\";\n\nimport { authenticate, decodeChallenge, signAndApprove } from \"./apiUser\";\nimport createNetwork from \"./createNetwork\";\nimport { APIRequestResponse, DevicesPool, ManifestAPIV2User, RunnableOptions } from \"./types\";\nimport { getWorkspaceFromGate } from \"./utils\";\n\nexport type ReviewAPIRequestOptions = {\n pool: DevicesPool;\n requestID: number;\n apiUser: ManifestAPIV2User;\n gate: string;\n apiGateway: string;\n reviewType: ReviewType;\n skipDecodeChallenge?: boolean;\n};\n\nexport type ReviewType = \"APPROVE\" | \"REJECT\";\n\nasync function reviewAPIRequest(\n {\n pool,\n requestID,\n apiUser,\n gate,\n apiGateway,\n reviewType,\n skipDecodeChallenge = false,\n }: ReviewAPIRequestOptions,\n { logger = SILENT_LOGGER }: RunnableOptions,\n): Promise<APIRequestResponse> {\n const workspace = getWorkspaceFromGate(gate);\n const apiNetwork = createNetwork({\n baseURL: apiGateway,\n });\n logger.info(`Authenticate for ${apiUser.name}`);\n const bearerToken = await authenticate(pool, apiNetwork, workspace, apiUser, logger);\n\n let apiChallenge = {\n challenge: \"\",\n decodedChallenge: \"\",\n };\n // for example today there is no challenge ro reject a message signing transaction as a simple empty abort is enough like for regular transaction\n if (skipDecodeChallenge === false) {\n logger.info(\"Decode challenge\");\n apiChallenge = await decodeChallenge({\n apiNetwork,\n workspace,\n bearerToken,\n requestID,\n reviewType,\n });\n }\n\n logger.info(apiChallenge.decodedChallenge);\n logger.info(\"Sign and approve\");\n\n return signAndApprove({\n apiNetwork,\n workspace,\n bearerToken,\n requestID,\n apiUser,\n challenge: apiChallenge.challenge,\n reviewType,\n });\n}\n\nexport default reviewAPIRequest;\n","import { Logger } from \"@ledgerhq/vault-utils\";\nimport chalk from \"chalk\";\n\nimport createDefaultRunner from \"../createDefaultRunner\";\nimport { decodeData, genKeys, sign } from \"../crypto/utils\";\nimport { ReviewType } from \"../reviewAPIRequest\";\nimport {\n APIBearerTokenResponse,\n APIGetChallengeResponse,\n APIRequestResponse,\n Connection,\n DevicesPool,\n GateAccount,\n GateWhitelist,\n ManifestAPIV2User,\n Network,\n} from \"../types\";\nimport { TradelinkPledge } from \"../types/tradelink\";\n\nfunction getAPIHeader(bearerToken: string, workspace: string) {\n return {\n headers: {\n \"X-Ledger-Workspace\": workspace,\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${bearerToken}`,\n },\n };\n}\n\nexport async function regenerateCredentials(\n pool: DevicesPool,\n apiNetwork: Network,\n workspace: string,\n apiUser: ManifestAPIV2User,\n logger: Logger,\n): Promise<{ api_key_id: string; api_key_secret: string }> {\n const runner = createDefaultRunner(pool, {});\n const postApiUserAccess = {\n user: apiUser,\n publicKey: genKeys(apiUser.name).hexPubKey,\n role: apiUser.role,\n name: apiUser.name,\n };\n const userAccessRequest = await runner.createAPIV2UserAccess(postApiUserAccess);\n const apiUserAuth = {\n api_key_id: userAccessRequest.api_key_id,\n api_key_secret: userAccessRequest.api_key_secret,\n };\n\n logger.info(\n chalk`{red.bold IMPORTANT:} {red The API user credentials will not be displayed again so note them somewhere}`,\n );\n logger.info(\n JSON.stringify({\n api_key_id: userAccessRequest.api_key_id,\n api_key_secret: userAccessRequest.api_key_secret,\n }),\n );\n return apiUserAuth;\n}\n\nexport async function getAuthTokens(\n apiNetwork: Network,\n workspace: string,\n apiUserAuth: { api_key_id: string; api_key_secret: string },\n) {\n return await apiNetwork<APIBearerTokenResponse>(\"POST\", \"/auth/token\", apiUserAuth, {\n headers: { \"X-Ledger-Workspace\": workspace },\n });\n}\n\nexport async function authenticate(\n pool: DevicesPool,\n apiNetwork: Network,\n workspace: string,\n apiUser: ManifestAPIV2User,\n logger: Logger,\n): Promise<string> {\n const apiUserAuth = await regenerateCredentials(pool, apiNetwork, workspace, apiUser, logger);\n\n const bearerResp = await getAuthTokens(apiNetwork, workspace, apiUserAuth);\n return bearerResp.access_token;\n}\n\nexport type APIChallenge = {\n challenge: string;\n decodedChallenge: any;\n};\n\nexport async function decodeChallenge({\n apiNetwork,\n workspace,\n bearerToken,\n requestID,\n reviewType,\n}: {\n apiNetwork: Network;\n workspace: string;\n bearerToken: string;\n requestID: number;\n reviewType: ReviewType;\n}): Promise<APIChallenge> {\n let challengeUrl = `/requests/${requestID}/challenge`;\n if (reviewType === \"REJECT\") {\n challengeUrl = `${challengeUrl}/reject`;\n }\n const challengeResp = await apiNetwork<APIGetChallengeResponse>(\n \"GET\",\n challengeUrl,\n {},\n getAPIHeader(bearerToken, workspace),\n ).catch((error) => {\n // have to do this sh**t because settlement are transaction today so we have now way to know if this create transaction is part of a tradelink settlement\n if (error.message.includes(\"Get abort challenge is only available for tradelink settlement\")) {\n return { challenge: \"\" };\n }\n /* istanbul ignore next */\n throw error;\n });\n if (challengeResp.challenge === \"\") {\n return {\n challenge: \"\",\n decodedChallenge: \"\",\n };\n }\n return {\n challenge: challengeResp.challenge,\n decodedChallenge: decodeData(challengeResp.challenge),\n };\n}\n\nexport async function signAndApprove({\n apiNetwork,\n workspace,\n bearerToken,\n requestID,\n apiUser,\n challenge,\n reviewType,\n}: {\n apiNetwork: Network;\n workspace: string;\n bearerToken: string;\n requestID: number;\n apiUser: ManifestAPIV2User;\n challenge: string;\n reviewType: ReviewType;\n}): Promise<APIRequestResponse> {\n const keys = genKeys(apiUser.name);\n\n let jws = \"\";\n if (challenge !== \"\") {\n jws = sign(String(keys.privateKey), challenge);\n }\n\n return await apiNetwork<APIRequestResponse>(\n \"POST\",\n `/requests/${requestID}/${reviewType.toLowerCase()}`,\n { jws },\n getAPIHeader(bearerToken, workspace),\n );\n}\n\nexport async function getTradelinkPledge({\n apiNetwork,\n workspace,\n gateAccount,\n bearerToken,\n exchange,\n}: {\n apiNetwork: Network;\n workspace: string;\n gateAccount: GateAccount;\n bearerToken: string;\n exchange: string;\n}): Promise<TradelinkPledge> {\n const pledgesResp = await apiNetwork<Connection<TradelinkPledge>>(\n \"GET\",\n `/pledges?account_id=${gateAccount.id}`,\n {},\n getAPIHeader(bearerToken, workspace),\n );\n // find sub_account\n const pledgeResp = pledgesResp.edges.find((p) => p.node.exchange.name == exchange);\n /* istanbul ignore if */\n if (!pledgeResp) {\n throw new Error(`Exchange '${exchange}' not found`);\n }\n return pledgeResp.node;\n}\n\nexport async function getTradelinkRecipient({\n pool,\n gateAccount,\n pledge,\n}: {\n pool: DevicesPool;\n gateAccount: GateAccount;\n pledge: TradelinkPledge;\n}): Promise<string> {\n const exchangeWLId = pledge.exchange.whitelist_id;\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const wlResp = await admin.network<Connection<GateWhitelist>>(\n \"GET\",\n `/whitelists?id=${exchangeWLId}`,\n );\n /* istanbul ignore next */\n const wlAddress = wlResp.edges[0]?.node.addresses.find(\n (a) => a.currency === gateAccount.currency,\n )?.address;\n return String(wlAddress);\n}\n","import { SILENT_LOGGER } from \"@ledgerhq/vault-utils\";\nimport invariant from \"invariant\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport prepareRequest, {\n GateCreateAccountPayload,\n GateEditWorkspaceRulePayload,\n Input,\n performRequest,\n} from \"./prepareRequest\";\nimport { RecipeManifestResult } from \"./recipeManifest\";\nimport reviewAPIRequest from \"./reviewAPIRequest\";\nimport {\n BakeManifestOptions,\n Connection,\n DevicesPool,\n GateAPIV2UserAccessRequest,\n GateAccount,\n GateAccountRequest,\n GateEditWorkspaceRuleRequest,\n GateExchangeRequest,\n GateGenericRequest,\n GateGroupRequest,\n GatePolicyRequest,\n GateRequestType,\n GateTradelinkAssetManagerRequest,\n GateTradelinkEntity,\n GateTradelinkExchangeRequest,\n GateTradelinkNetwork,\n GateTradelinkRequest,\n GateUserRequest,\n GateVaultEntityRequest,\n GateWhitelistRequest,\n GateWorkspaceRuleStep,\n MRBakeAccountParams,\n MRBakeExchangeParams,\n MRBakeGroupParams,\n MRBakePolicyParams,\n MRBakeTradelinkEntityOnboardingParams,\n MRBakeTradelinkEntityParams,\n MRBakeTradelinkNetworkParams,\n MRBakeTradelinkOnboardingParams,\n MRBakeVaultEntityParams,\n MRBakeWhitelistParams,\n MRCreateAPIUserParams,\n MRCreateAPIV2UserParams,\n MRCreateUserParams,\n MREditQuorumParams,\n MREditWorkspaceRuleParams,\n ManifestRunner,\n} from \"./types\";\nimport { unwrapConnection, wait } from \"./utils\";\n\nconst createDefaultRunner = (pool: DevicesPool, options: BakeManifestOptions): ManifestRunner => {\n const { twoStepsRequest } = options;\n\n const basicHandler = <R>(type: GateRequestType, options?: { withoutHSM: boolean }) => {\n return async (\n params:\n | MRBakeGroupParams\n | MRBakeAccountParams\n | MRBakeVaultEntityParams\n | MRBakeWhitelistParams\n | MRBakeExchangeParams\n | MRBakePolicyParams,\n ) => {\n const { data, existingRequest, noApproval } = params;\n const payload = prepareRequest({ type, data } as Input);\n const extra = { noApproval, existingRequest, twoStepsRequest, ...options };\n return performRequest<R>(payload, pool, extra);\n };\n };\n\n const createAccount = async (params: MRBakeAccountParams) => {\n const { account, data, tradelinkAM } = params;\n if (\"readOnly\" in account && account.readOnly) {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const payload = prepareRequest({ type: \"CREATE_ACCOUNT\", data }) as GateCreateAccountPayload;\n return admin.post<GateAccountRequest>(\"/dev/accounts\", payload);\n }\n\n let res;\n try {\n res = await basicHandler<GateAccountRequest>(\"CREATE_ACCOUNT\")(params);\n\n if (tradelinkAM) {\n // get the activation request id\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const reqResp = await admin.get<Connection<GateAccountRequest>>(\n `/requests?page=1&type=ACTIVATE&target_id=${res.account.id}`,\n );\n const requests: GateAccountRequest[] = unwrapConnection(reqResp);\n const activationRequest = requests[0];\n\n /* istanbul ignore if */\n if (!activationRequest) {\n throw new Error(`No account activation request found for account ${res.account.name}`);\n }\n /* istanbul ignore if */\n if (!pool.apiGateway) {\n throw new Error(\"apiGateway URL is not set\");\n }\n await reviewAPIRequest(\n {\n pool,\n requestID: activationRequest.id,\n apiUser: tradelinkAM,\n gate: pool.gate,\n apiGateway: pool.apiGateway,\n reviewType: \"APPROVE\",\n },\n { logger: SILENT_LOGGER },\n );\n }\n } catch (err) {\n //\n // VG-18856 mitigate airdropped account when syncing the parent while children accounts\n // are described in manifest\n //\n /* istanbul ignore else */\n if (\n err instanceof Error &&\n err.name === \"ACCOUNT_CHILD_ALREADY_EXISTED_EXCEPTION\" &&\n \"contractAddress\" in account &&\n !!account.parentAccount\n ) {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const parentAccountsConnection = await admin.network<Connection<GateAccount>>(\n \"GET\",\n `/accounts?name=${account.parentAccount}`,\n );\n const parentAccountEdge = parentAccountsConnection.edges.find(\n (e) => e.node.name === account.parentAccount,\n );\n invariant(parentAccountEdge, `Parent account not found for ${account.name}`);\n const parentAccount = parentAccountEdge.node;\n const rawCurrencyQuery = `${parentAccount.currency}:${account.contractAddress}`;\n const currencyQuery = encodeURIComponent(rawCurrencyQuery);\n const potentialAccounts = await admin.network<Connection<GateAccount>>(\n \"GET\",\n `/accounts?currency=${currencyQuery}&index=${parentAccount.index}`,\n );\n invariant(\n potentialAccounts.edges.length === 1,\n `We should have one matching token account for ${currencyQuery} (index: ${parentAccount.index})`,\n );\n const existingAccount = potentialAccounts.edges[0]!.node;\n const editParams: MRBakeAccountParams = {\n ...params,\n data: { ...params.data, existingAccount },\n };\n res = await basicHandler<GateAccountRequest>(\"EDIT_ACCOUNT\")(editParams);\n } else {\n throw err;\n }\n }\n\n // VG-17223 optionally wait for account to be active\n if (params.waitForActive) {\n const accountId = res.target_id;\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n\n for (let i = 0; i < 60; i++) {\n const account = await admin.get<GateAccount>(`/accounts/${accountId}`);\n if (account.status === \"ACTIVE\") {\n res.account = account;\n break;\n }\n /* istanbul ignore next */\n await wait(3e3);\n }\n }\n return res;\n };\n\n const createUser = async (params: MRCreateUserParams) => {\n const { role, userID, name, device } = params;\n const type = role === \"operator\" ? \"CREATE_OPERATOR\" : \"CREATE_ADMIN\";\n const data = { userID, role, name };\n const payload = prepareRequest({ type, data });\n const extra = { noApproval: true };\n const req = await performRequest<GateUserRequest>(payload, pool, extra);\n const res = await pool.registerDevice(device, req);\n req.user.pub_key = res.u2f_key.pubKey;\n if (!options.noApproval) {\n await pool.runWithQuorum((admin) => admin.approveRequest(req));\n }\n return req;\n };\n\n const createAPIUser = async (\n params: MRCreateAPIUserParams,\n manifestFromGate: RecipeManifestResult,\n ) => {\n const { user, name, userID } = params;\n let request: GateUserRequest | null =\n manifestFromGate.rawData.pendingUserRequests.find((e) => e.user.username === name) || null;\n if (!request) {\n // Tries to invite user -> PENDING_REGISTRATION status if successful (creation/invitation of user from admin front)\n request = await performRequest<GateUserRequest>(\n {\n type: \"CREATE_OPERATOR\",\n username: name,\n user_id: userID,\n is_api: true,\n view_all_override: user.viewAll,\n },\n pool,\n { noApproval: true },\n );\n }\n if (request.status != \"PENDING_APPROVAL\")\n // Tries to register user -> PENDING_APPROVAL status if successful (api user from api)\n await pool.lamAPI.registerUser(name, request.url_id);\n if (!options.noApproval) {\n // Approves registration request (admin in front)\n await pool.runWithQuorum((admin) => admin.approveRequest(request));\n }\n return request;\n };\n\n const createAPIV2User = async (params: MRCreateAPIV2UserParams) => {\n const { name, publicKey, role } = params;\n const type = \"CREATE_API_USER\";\n const data = { publicKey, name, role };\n const payload = prepareRequest({ type, data });\n const extra = { noApproval: true };\n const req = await performRequest<GateUserRequest>(payload, pool, extra);\n if (!options.noApproval) {\n await pool.runWithQuorum((admin) => admin.approveRequest(req));\n }\n return req;\n };\n\n const createAPIV2UserAccess = async (params: MRCreateAPIV2UserParams) => {\n const { name } = params;\n const type = \"CREATE_API_USER_ACCESS\";\n const data = { name };\n const payload = prepareRequest({ type, data });\n const extra = { noApproval: true };\n return await performRequest<GateAPIV2UserAccessRequest>(payload, pool, extra);\n };\n\n const createTradelinkEntity = async <T extends \"ASSET_MANAGER\" | \"EXCHANGE\" | \"CUSTODIAN\">(\n params: MRBakeTradelinkEntityParams,\n ) => {\n const { tradelinkEntity, type } = params;\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const data = {\n id: tradelinkEntity.id,\n name: tradelinkEntity.name,\n code: tradelinkEntity.code,\n logo_url: tradelinkEntity.logoUrl,\n };\n return await admin.post<GateTradelinkEntity<T>>(`/tradelink/${type}`, data);\n };\n\n const createTradelinkNetwork = async (params: MRBakeTradelinkNetworkParams) => {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const data = {\n id: uuidv4(),\n custodian: params.custodians[0],\n exchanges: params.exchanges,\n asset_managers: params.assetManagers,\n };\n // we keep deleting and create TL network in case manifest got updated\n await admin.network<GateTradelinkNetwork>(\"DELETE\", \"/tradelink/network\").catch(\n /* istanbul ignore next */\n (error) => {\n if (error.message.includes(\"404\")) {\n // Handle 404 error: if there is no network, it will return a 404 as there is nothing to delete\n } else {\n throw error;\n }\n },\n );\n return await admin.post<GateTradelinkNetwork>(`/tradelink/network`, data);\n };\n\n const createTradelink = async (params: MRBakeTradelinkOnboardingParams) => {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const request = await admin.post<GateTradelinkRequest>(`/requests`, params);\n await pool.runWithQuorum((admin) => admin.approveRequest(request));\n return request;\n };\n\n const onboardTradelinkEntity = async (params: MRBakeTradelinkEntityOnboardingParams) => {\n const { tradelinkEntity, type, tradelinkEntityApprover } = params;\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n let data = {};\n let request: GateTradelinkAssetManagerRequest | GateTradelinkExchangeRequest;\n if (type === \"exchanges\") {\n data = {\n type: \"CREATE_TRADELINK_EXCHANGE\",\n exchange_name: tradelinkEntity.name,\n operators: tradelinkEntity.operators,\n addresses: tradelinkEntity.addresses,\n };\n request = await admin.post<GateTradelinkExchangeRequest>(`/requests`, data);\n } else {\n data = {\n type: \"CREATE_TRADELINK_ASSET_MANAGER\",\n asset_manager_name: tradelinkEntity.name,\n operators: tradelinkEntity.operators,\n addresses: tradelinkEntity.addresses,\n };\n request = await admin.post<GateTradelinkAssetManagerRequest>(`/requests`, data);\n }\n await pool.runWithQuorum((admin) => admin.approveRequest(request));\n\n /* istanbul ignore next */\n if (!pool.apiGateway) {\n throw new Error(\"apiGateway URL is not set\");\n }\n // for now the API user have to approve the exchange request (soonTM a new operator request to activate)\n await reviewAPIRequest(\n {\n pool,\n requestID: request.id,\n apiUser: tradelinkEntityApprover,\n gate: pool.gate,\n apiGateway: pool.apiGateway,\n reviewType: \"APPROVE\",\n },\n { logger: SILENT_LOGGER },\n );\n return request;\n };\n\n const editQuorum = async (params: MREditQuorumParams) => {\n const { quorum } = params;\n const payload = prepareRequest({\n type: \"UPDATE_QUORUM\",\n data: { quorum },\n });\n await performRequest<GateGenericRequest>(payload, pool);\n };\n\n const editWorkspaceRule = async (params: MREditWorkspaceRuleParams) => {\n const { rule, usersByName } = params;\n const payload: GateEditWorkspaceRulePayload = {\n type: \"EDIT_WORKSPACE_RULE\",\n permission: rule.permission,\n edit_data: {\n steps: rule.steps.map((s): GateWorkspaceRuleStep => {\n return {\n quorum: s.quorum,\n users: s.users.map((username) => {\n const user = usersByName[username];\n invariant(user, `No user with name ${username}`);\n return user.pub_key;\n }),\n };\n }),\n },\n };\n await performRequest<GateEditWorkspaceRuleRequest>(payload, pool);\n };\n\n const runner: ManifestRunner = {\n editQuorum,\n editWorkspaceRule,\n createUser,\n createAPIUser,\n createAPIV2User,\n createAPIV2UserAccess,\n createGroup: basicHandler<GateGroupRequest>(\"CREATE_GROUP\"),\n editGroup: basicHandler<GateGroupRequest>(\"EDIT_GROUP\"),\n createAccount,\n editAccount: basicHandler<GateAccountRequest>(\"EDIT_ACCOUNT\"),\n createWhitelist: basicHandler<GateWhitelistRequest>(\"CREATE_WHITELIST\"),\n editWhitelist: basicHandler<GateWhitelistRequest>(\"EDIT_WHITELIST\"),\n createVaultEntity: basicHandler<GateVaultEntityRequest>(\"CREATE_ENTITY\", {\n withoutHSM: true,\n }),\n editVaultEntity: basicHandler<GateVaultEntityRequest>(\"EDIT_ENTITY\", {\n withoutHSM: true,\n }),\n createExchange: basicHandler<GateExchangeRequest>(\"IMPORT_EXCHANGE\", {\n withoutHSM: true,\n }),\n editExchange: basicHandler<GateExchangeRequest>(\"IMPORT_EXCHANGE\", {\n withoutHSM: true,\n }),\n createPolicy: basicHandler<GatePolicyRequest>(\"CREATE_POLICY\"),\n createTradelink,\n createTradelinkEntity,\n onboardTradelinkEntity,\n createTradelinkNetwork,\n };\n\n return runner;\n};\n\nexport default createDefaultRunner;\n","import invariant from \"invariant\";\n\nimport {\n DevicesPool,\n GateAccount,\n GateExchange,\n GateGenericRequest,\n GateGovernanceRule,\n GateGovernanceRulesSet,\n GateGroup,\n GatePolicy,\n GateRequestType,\n GateRuleMultiAuthStep,\n GateRuleSCI,\n GateRuleTransactionFilter,\n GateTokenCurrency,\n GateUser,\n GateVaultEntity,\n GateWhitelist,\n GateWorkspacePermission,\n GateWorkspaceRuleStep,\n ManifestAccount,\n ManifestAccountRule,\n ManifestAccountRuleMultiAuth,\n ManifestAccountRuleSCI,\n ManifestAccountRuleThreshold,\n ManifestAccountRuleWhitelist,\n ManifestExchange,\n ManifestGroup,\n ManifestPolicy,\n ManifestVaultEntity,\n ManifestWhitelist,\n Unit,\n WeirdGateERC20Token,\n WeirdGateGovernanceRule,\n WeirdGateGovernanceRulesSet,\n WeirdGateRuleMultiAuth,\n WeirdGateRuleMultiAuthStep,\n WeirdGateRuleThreshold,\n WeirdGateRuleWhitelist,\n WeirdGateTokenCurrency,\n} from \"./types\";\nimport {\n getAccountTypeByCurrency,\n getAccountUnit,\n getCurrencyUnit,\n serializeUnitValue,\n} from \"./utils\";\n\ntype PrepareRequestArgs<S, T> = {\n type: S;\n data: T;\n};\n\nexport type GateCreateUserPayload = {\n type: \"CREATE_ADMIN\" | \"CREATE_OPERATOR\";\n username: string;\n user_id: string;\n is_api?: boolean;\n view_all_override?: boolean;\n};\n\nexport type GateCreateAPIUserPayload = {\n type: \"CREATE_API_USER\";\n user_data: {\n username: string;\n public_key: string;\n role: string;\n };\n};\n\ntype GateCreateAPIV2UserAccessPayload = {\n type: \"CREATE_API_USER_ACCESS\";\n user_data: {\n username: string;\n };\n};\n\ntype GateMigrateUserPayload = {\n type: \"MIGRATE_ADMIN\" | \"MIGRATE_OPERATOR\";\n id: number;\n};\n\ntype GateCreateGroupPayload = {\n type: \"CREATE_GROUP\";\n name: string;\n description: string;\n members: number[];\n};\n\ntype GateMigrateGroupPayload = {\n type: \"MIGRATE_GROUP\";\n group_id: number;\n migration_data: {\n members: number[];\n };\n};\n\nexport type GateCreateLamUserPayload = {\n type: \"CREATE_OPERATOR\";\n username: string;\n user_id: number;\n};\n\ntype GateCreateAccountTradelinkPayload = {\n currency: string;\n custodian: number;\n asset_manager: number;\n exchanges: Array<{ id: number; auto_repledge_enabled: boolean; requires_pre_approval: boolean }>;\n};\n\nexport type GateCreateAccountPayload = {\n type: \"CREATE_ACCOUNT\";\n index?: number;\n account_type: string;\n account_data: {\n name: string;\n derivation_mode?: \"standard\" | \"native_segwit\";\n parent_account?: { id: number } | { name: string };\n currency?: { name: string };\n governance_rules?: WeirdGateGovernanceRulesSet[];\n token?: WeirdGateTokenCurrency;\n policy_id?: number;\n\n // legacy format for erc20 token (see VFE-951)\n erc20?: WeirdGateERC20Token;\n };\n tradelink_data?: GateCreateAccountTradelinkPayload;\n};\n\ntype GateEditAccountPayload = {\n type: \"EDIT_ACCOUNT\";\n account_id: number;\n edit_data: {\n erc20?: WeirdGateERC20Token;\n token?: WeirdGateTokenCurrency;\n governance_rules?: WeirdGateGovernanceRulesSet[];\n name: string;\n };\n};\n\ntype GateCreateVaultEntityPayload = {\n type: \"CREATE_ENTITY\";\n name: string;\n accounts: number[];\n};\n\ntype GateEditVaultEntityPayload = {\n type: \"EDIT_ENTITY\";\n entity_id: number;\n edit_data: {\n name: string;\n accounts: number[];\n };\n};\n\ntype GateMigrateAccountPayload = {\n type: \"MIGRATE_ACCOUNT\";\n account_id: number;\n migration_data: {\n currency?: string;\n derivation_mode?: \"STANDARD\" | \"NATIVE_SEGWIT\";\n governance_rules: WeirdGateGovernanceRulesSet[];\n name: string;\n };\n};\n\ntype GateEditGroupPayload = {\n type: \"EDIT_GROUP\";\n group_id: number;\n edit_data: {\n name: string;\n members: number[];\n };\n};\n\ntype GateAddressPayload = {\n name: string;\n currency: string;\n address: string;\n};\n\ntype GateCreateWhitelistPayload = {\n type: \"CREATE_WHITELIST\";\n name: string;\n whitelist_type?: \"TRANSACTION\" | \"SMART_CONTRACT\";\n description: string;\n addresses: GateAddressPayload[];\n};\n\ntype GateMigrateWhitelistPayload = {\n type: \"MIGRATE_WHITELIST\";\n whitelist_id: number;\n};\n\ntype GateEditWhitelistPayload = {\n type: \"EDIT_WHITELIST\";\n whitelist_id: number;\n edit_data: {\n name: string;\n addresses: GateAddressPayload[];\n };\n};\n\ntype GateCreateExchangePayload = {\n type: \"IMPORT_EXCHANGE\";\n exchange_data: {\n name: string;\n platform: string;\n governance_rules: WeirdGateGovernanceRulesSet[] | null;\n credentials: {\n apiKey: string;\n secret: string;\n };\n };\n};\n\ntype GateCreatePolicyPayload = {\n type: \"CREATE_POLICY\";\n policy_data: {\n name: string;\n currency?: { name: string };\n governance_rules: WeirdGateGovernanceRulesSet[];\n };\n};\n\nexport type UsersByDevice = Record<number, GateUser>;\nexport type UsersByName = Record<string, GateUser>;\nexport type GroupByName = Record<string, GateGroup>;\nexport type AccountsByName = Record<string, GateAccount>;\n\nexport type IDByName = {\n [_: string]: number;\n};\n\nexport type DataGroup = {\n group: ManifestGroup;\n usersByDevice: UsersByDevice;\n usersByName: UsersByName;\n existingGroup?: GateGroup;\n};\n\nexport type DataWhitelist = {\n whitelist: ManifestWhitelist;\n existingWhitelist?: GateWhitelist;\n};\n\nexport type DataExchange = {\n exchange: ManifestExchange;\n usersByDevice: UsersByDevice;\n usersByName: UsersByName;\n groupsIDsByName: Record<string, number>;\n existingExchange: GateExchange | void;\n};\n\nexport type DataPolicy = {\n policy: ManifestPolicy;\n usersByDevice: UsersByDevice;\n whitelistsIDsByName: IDByName;\n usersByName: UsersByName;\n groupsIDsByName: Record<string, number>;\n existingPolicy: GatePolicy | void;\n};\n\nexport type DataAccount = {\n account: ManifestAccount;\n existingAccount?: GateAccount;\n usersByDevice: UsersByDevice;\n usersByName: UsersByName;\n groupsIDsByName: IDByName;\n whitelistsIDsByName: IDByName;\n hsmAssetManagersIDsByName: IDByName;\n hsmExchangesIDsByName: IDByName;\n hsmCustodiansIDsByName: IDByName;\n policiesIDsByName: IDByName;\n accountsByName: { [key: string]: GateAccount };\n tokens: GateTokenCurrency[];\n};\n\nexport type DataVaultEntity = {\n vaultEntity: ManifestVaultEntity;\n existingVaultEntity?: GateVaultEntity;\n accountsByName: { [key: string]: GateAccount };\n};\n\nexport type DataUser = {\n userID: string;\n name: string;\n role: \"operator\" | \"admin\";\n};\n\nexport type DataAPIUser = {\n name: string;\n publicKey: string;\n role: string;\n};\n\nexport type DataAPIUserAccess = {\n name: string;\n};\n\ntype EditGroupInput = PrepareRequestArgs<\"EDIT_GROUP\", DataGroup>;\ntype CreateGroupInput = PrepareRequestArgs<\"CREATE_GROUP\", DataGroup>;\ntype EditWhitelistInput = PrepareRequestArgs<\"EDIT_WHITELIST\", DataWhitelist>;\n\ntype CreateWhitelistInput = PrepareRequestArgs<\"CREATE_WHITELIST\", DataWhitelist>;\n\ntype CreateUserInput = PrepareRequestArgs<\"CREATE_ADMIN\" | \"CREATE_OPERATOR\", DataUser>;\ntype CreateAPIUserInput = PrepareRequestArgs<\"CREATE_API_USER\", DataAPIUser>;\ntype CreateAPIUserAccessInput = PrepareRequestArgs<\"CREATE_API_USER_ACCESS\", DataAPIUserAccess>;\n\ntype CreateAccountInput = PrepareRequestArgs<\"CREATE_ACCOUNT\", DataAccount>;\ntype EditAccountInput = PrepareRequestArgs<\"EDIT_ACCOUNT\", DataAccount>;\n\ntype CreateVaultEntityInput = PrepareRequestArgs<\"CREATE_ENTITY\", DataVaultEntity>;\ntype EditVaultEntityInput = PrepareRequestArgs<\"EDIT_ENTITY\", DataVaultEntity>;\n\ntype CreateExchangeInput = PrepareRequestArgs<\"IMPORT_EXCHANGE\", DataExchange>;\n\ntype CreatePolicyInput = PrepareRequestArgs<\"CREATE_POLICY\", DataPolicy>;\n\ntype PrepareRequest<T, S> = (obj: T) => S;\n\ntype DataQuorum = {\n quorum: number;\n};\n\ntype EditQuorumInput = PrepareRequestArgs<\"UPDATE_QUORUM\", DataQuorum>;\ntype GateEditQuorumPayload = {\n type: \"UPDATE_QUORUM\";\n quorum: number;\n};\n\nexport type GateEditWorkspaceRulePayload = {\n type: \"EDIT_WORKSPACE_RULE\";\n permission: GateWorkspacePermission;\n edit_data: {\n steps: GateWorkspaceRuleStep[];\n };\n};\n\ntype PrepareEditQuorum = PrepareRequest<EditQuorumInput, GateEditQuorumPayload>;\n\ntype PrepareCreateUser = PrepareRequest<CreateUserInput, GateCreateUserPayload>;\ntype PrepareCreateAPIUser = PrepareRequest<CreateAPIUserInput, GateCreateAPIUserPayload>;\ntype PrepareCreateAPIV2UserAccess = PrepareRequest<\n CreateAPIUserAccessInput,\n GateCreateAPIV2UserAccessPayload\n>;\ntype PrepareEditGroup = PrepareRequest<EditGroupInput, GateEditGroupPayload>;\n\ntype PrepareCreateGroup = PrepareRequest<CreateGroupInput, GateCreateGroupPayload>;\n\ntype PrepareCreateAccount = PrepareRequest<CreateAccountInput, GateCreateAccountPayload>;\n\ntype PrepareEditAccount = PrepareRequest<EditAccountInput, GateEditAccountPayload>;\n\ntype PrepareCreateVaultEntity = PrepareRequest<\n CreateVaultEntityInput,\n GateCreateVaultEntityPayload\n>;\n\ntype PrepareEditVaultEntity = PrepareRequest<EditVaultEntityInput, GateEditVaultEntityPayload>;\n\ntype PrepareEditWhitelist = PrepareRequest<EditWhitelistInput, GateEditWhitelistPayload>;\n\ntype PrepareCreateWhitelist = PrepareRequest<CreateWhitelistInput, GateCreateWhitelistPayload>;\n\ntype PrepareCreateExchange = PrepareRequest<CreateExchangeInput, GateCreateExchangePayload>;\n\ntype PrepareCreatePolicy = PrepareRequest<CreatePolicyInput, GateCreatePolicyPayload>;\n\nexport const EMPTY_RULES_SETS: GateGovernanceRulesSet[] = [\n {\n name: \"Rule 1\",\n rules: [\n {\n type: \"MULTI_AUTHORIZATIONS\",\n data: [],\n },\n ],\n },\n];\n\nexport const prepareUserCreation: PrepareCreateUser = ({ data }) => {\n const { role, name, userID } = data;\n return {\n type: role === \"operator\" ? \"CREATE_OPERATOR\" : \"CREATE_ADMIN\",\n username: name,\n user_id: userID,\n };\n};\n\nexport const prepareAPIUserCreation: PrepareCreateAPIUser = ({ data }) => {\n const { publicKey, name, role } = data;\n return {\n type: \"CREATE_API_USER\",\n user_data: {\n username: name,\n public_key: publicKey,\n role,\n },\n };\n};\n\nexport const prepareAPIUserAccessCreation: PrepareCreateAPIV2UserAccess = ({ data }) => {\n const { name } = data;\n return {\n type: \"CREATE_API_USER_ACCESS\",\n user_data: {\n username: name,\n },\n };\n};\n\nexport const prepareAccountCreation: PrepareCreateAccount = ({ type, data }) => {\n const {\n account,\n usersByDevice,\n whitelistsIDsByName,\n groupsIDsByName,\n accountsByName,\n hsmCustodiansIDsByName,\n hsmAssetManagersIDsByName,\n hsmExchangesIDsByName,\n policiesIDsByName,\n usersByName,\n tokens,\n } = data;\n\n const allAccounts = Object.keys(accountsByName).map((key) => accountsByName[key]);\n\n const token =\n \"contractAddress\" in account\n ? tokens.find((t) => t.contract_address === account.contractAddress)\n : null;\n\n if (\"contractAddress\" in account && !token) {\n throw new Error(`Can't find token with contract address ${account.contractAddress}`);\n }\n\n let account_type = null;\n if (token?.family === \"ethereum\") {\n if (token.parent_currency === \"bsc\") {\n account_type = \"Bep20\";\n } else {\n account_type = \"Erc20\";\n }\n } else if (\"accountType\" in account) {\n account_type = account.accountType;\n } else if (\"currency\" in account) {\n account_type = getAccountTypeByCurrency(account.currency);\n }\n\n if (!account_type) {\n throw new Error(`Can't determine account type`);\n }\n\n const unit = getAccountUnit(account, tokens);\n const governance_rules =\n \"policy\" in account || (\"tradelink_data\" in account && !!account.tradelink_data)\n ? null\n : transformManifestRules({\n rules: account.rules,\n unit,\n usersByDevice,\n usersByName,\n whitelistsIDsByName,\n groupsIDsByName,\n // VG-18120 accounts *must* enforce having a tx-filter rule of type SEND for rules that are\n // not SCI and not \"any-other-type-of-filter\".\n enforceSendTxFilter: true,\n });\n\n const account_data = {\n name: account.name,\n ...(governance_rules ? { governance_rules } : {}),\n };\n\n if (\"policy\" in account && !!account.policy) {\n const policyID = policiesIDsByName[account.policy];\n if (typeof policyID === \"undefined\") {\n throw new Error(`Invalid policy name ${account.policy}`);\n }\n\n Object.assign(account_data, {\n policy_id: policiesIDsByName[account.policy],\n });\n }\n\n if (\"readOnly\" in account && !!account.readOnly) {\n Object.assign(account_data, {\n xpub: account.readOnly.xpub,\n extended_public_key: {\n public_key: account.readOnly.publicKey,\n chain_code: account.readOnly.chainCode,\n },\n address: account.readOnly.address,\n });\n }\n\n if (\"contractAddress\" in account && token) {\n const currencyName = token.parent_currency;\n const parentAccountName = account.parentAccount;\n\n // FIXME there is something weird in this code\n const parent_account = parentAccountName\n ? (() => {\n let parentAccountID = null;\n // FIXME why not using accountsByName\n // search in existing accounts\n const existingParentAccount = allAccounts.find(\n (a) => !!a && a.name === parentAccountName,\n );\n if (existingParentAccount) {\n parentAccountID = existingParentAccount.id;\n } else {\n const createdParentAccount = accountsByName[parentAccountName];\n if (!createdParentAccount) {\n return { name: parentAccountName };\n }\n parentAccountID = createdParentAccount.id;\n }\n return { id: parentAccountID };\n })()\n : null;\n\n // see VFE-951\n if (process.env.LEGACY_TOKENS) {\n const erc20 = {\n ticker: token.ticker,\n address: token.contract_address,\n decimals: token.units[0].magnitude,\n hsm_account_parameters: token.__legacy_hsm_account_parameters,\n hsm_signature: token.__legacy_hsm_signature,\n };\n Object.assign(account_data, { erc20 });\n } else {\n Object.assign(account_data, {\n token: { type: token.token_type, address: token.contract_address },\n });\n }\n\n Object.assign(account_data, {\n currency: { name: currencyName },\n parent_account,\n });\n }\n\n if (\"currency\" in account) {\n Object.assign(account_data, {\n currency: {\n name: account.currency,\n },\n });\n\n if (\"derivationMode\" in account) {\n Object.assign(account_data, {\n derivation_mode: account.derivationMode,\n });\n }\n }\n\n let tradelinkData;\n if (\"tradelink_data\" in account && !!account.tradelink_data) {\n const custodianID = hsmCustodiansIDsByName[account.tradelink_data.custodian.name];\n /* istanbul ignore if */\n if (typeof custodianID === \"undefined\")\n throw new Error(`Invalid custodian name ${account.tradelink_data.custodian.name}`);\n\n const assetManagerID = hsmAssetManagersIDsByName[account.tradelink_data.asset_manager.name];\n /* istanbul ignore if */\n if (typeof assetManagerID === \"undefined\")\n throw new Error(`Invalid asset manager name ${account.tradelink_data.asset_manager.name}`);\n\n tradelinkData = {\n currency: account.tradelink_data.currency,\n custodian: custodianID,\n asset_manager: assetManagerID,\n exchanges: account.tradelink_data.exchanges.map((exchange) => {\n const exchangeID = hsmExchangesIDsByName[exchange.name];\n /* istanbul ignore if */\n if (typeof exchangeID === \"undefined\")\n throw new Error(`Invalid exchange name ${exchange.name}`);\n return {\n auto_repledge_enabled: exchange.auto_repledge_enabled,\n requires_pre_approval: exchange.requires_pre_approval,\n id: exchangeID,\n };\n }),\n };\n }\n\n return {\n type,\n ...(account.index !== undefined ? { index: account.index } : {}),\n ...(tradelinkData ? { tradelink_data: tradelinkData } : {}),\n account_type,\n account_data,\n };\n};\n\nconst prepareAccountEdition: PrepareEditAccount = ({ type, data }) => {\n const {\n account,\n existingAccount,\n usersByDevice,\n usersByName,\n whitelistsIDsByName,\n groupsIDsByName,\n tokens,\n } = data;\n\n /* istanbul ignore if */\n if (!existingAccount) {\n throw new Error(\"No existingAccount given\");\n }\n\n const unit = getAccountUnit(account, tokens);\n const governance_rules = transformManifestRules({\n rules: account.rules,\n unit,\n usersByDevice,\n usersByName,\n whitelistsIDsByName,\n groupsIDsByName,\n enforceSendTxFilter: true,\n });\n\n const edit_data = {\n name: account.name,\n governance_rules,\n };\n\n if (\"contractAddress\" in account) {\n const token = tokens.find((t) => t.contract_address === account.contractAddress);\n\n /* istanbul ignore if */\n if (!token) {\n throw new Error(`Can't find token with contract address ${account.contractAddress}`);\n }\n\n // see VFE-951\n if (process.env.LEGACY_TOKENS) {\n const erc20 = {\n ticker: token.ticker,\n address: token.contract_address,\n decimals: token.units[0].magnitude,\n hsm_account_parameters: token.__legacy_hsm_account_parameters,\n hsm_signature: token.__legacy_hsm_signature,\n };\n Object.assign(edit_data, { erc20 });\n } else {\n Object.assign(edit_data, {\n token: { type: \"erc20\", address: token.contract_address },\n });\n }\n }\n\n return {\n type,\n account_id: existingAccount.id,\n edit_data,\n };\n};\n\nconst serializeGroupMembers = (\n groupUsers: Array<string | number>,\n { usersByDevice, usersByName }: { usersByDevice: UsersByDevice; usersByName: UsersByName },\n): number[] => {\n return groupUsers.map((device) => {\n if (typeof device === \"number\") {\n const u = usersByDevice[device];\n /* istanbul ignore if */\n if (!u) throw new Error(`Invalid device ${device}`);\n return u.id;\n } else {\n const u = usersByName[device];\n /* istanbul ignore if */\n if (!u) throw new Error(`Invalid user name ${device}`);\n return u.id;\n }\n });\n};\n\nconst prepareGroupCreation: PrepareCreateGroup = ({ type, data }) => {\n const { group } = data;\n const members = serializeGroupMembers(group.users, data);\n return {\n type,\n name: group.name,\n description: group.description || \"\",\n members,\n };\n};\n\nconst prepareGroupEdition: PrepareEditGroup = ({ type, data }) => {\n const { group, existingGroup } = data;\n /* istanbul ignore if */\n if (!existingGroup) {\n throw new Error(\"No existingGroup given\");\n }\n const members = serializeGroupMembers(group.users, data);\n return {\n type,\n name: group.name,\n description: group.description || \"\",\n group_id: existingGroup.id,\n edit_data: {\n name: group.name,\n members,\n },\n };\n};\n\nconst serializeVaultEntityAccounts = (\n vaultEntityAccounts: string[],\n { accountsByName }: { accountsByName: AccountsByName },\n): number[] => {\n return vaultEntityAccounts.map((accountName) => {\n const a = accountsByName[accountName];\n /* istanbul ignore if */\n if (!a) throw new Error(`Invalid account ${accountName}`);\n return a.id;\n });\n};\n\nconst prepareVaultEntityCreation: PrepareCreateVaultEntity = ({ type, data }) => {\n const {\n vaultEntity: { name, accounts },\n } = data;\n return {\n type,\n name,\n accounts: accounts ? serializeVaultEntityAccounts(accounts, data) : [],\n };\n};\n\nconst prepareVaultEntityEdition: PrepareEditVaultEntity = ({ type, data }) => {\n const { vaultEntity, existingVaultEntity } = data;\n /* istanbul ignore if */\n if (!existingVaultEntity) {\n throw new Error(\"No existing VaultEntity given\");\n }\n return {\n type,\n entity_id: existingVaultEntity.id,\n edit_data: {\n name: vaultEntity.name,\n accounts: vaultEntity.accounts\n ? serializeVaultEntityAccounts(vaultEntity.accounts, data)\n : [],\n },\n };\n};\n\nconst prepareWhitelistCreation: PrepareCreateWhitelist = ({ type, data }) => {\n const { whitelist } = data;\n const addresses = whitelist.addresses.map((a, i) => ({\n ...a,\n name: a.name || `${a.currency}-${i + 1}`,\n }));\n return {\n type,\n name: whitelist.name,\n description: whitelist.description || \"\",\n addresses,\n ...(whitelist.type && { whitelist_type: whitelist.type }),\n };\n};\n\nconst prepareWhitelistEdition: PrepareEditWhitelist = ({ type, data }) => {\n const { whitelist, existingWhitelist } = data;\n /* istanbul ignore if */\n if (!existingWhitelist) {\n throw new Error(`No existingWhitelist given`);\n }\n const addresses = whitelist.addresses.map((a, i) => ({\n ...a,\n name: a.name || `${a.currency}-${i + 1}`,\n }));\n return {\n type,\n name: whitelist.name,\n description: \"\",\n whitelist_id: existingWhitelist.id,\n edit_data: {\n name: whitelist.name,\n addresses,\n },\n };\n};\n\nconst prepareExchangeCreation: PrepareCreateExchange = ({ type, data }) => {\n const { exchange, usersByDevice, usersByName, groupsIDsByName } = data;\n const governance_rules = exchange.rules\n ? transformManifestRules({ rules: exchange.rules, usersByDevice, usersByName, groupsIDsByName })\n : [];\n return {\n type,\n exchange_data: {\n name: exchange.name,\n governance_rules,\n platform: exchange.platform,\n credentials: {\n apiKey: exchange.configuration.apiKey,\n secret: exchange.configuration.apiSecret,\n },\n },\n };\n};\n\nconst preparePolicyCreation: PrepareCreatePolicy = ({ type, data }) => {\n const { policy, usersByName, usersByDevice, groupsIDsByName, whitelistsIDsByName } = data;\n\n const unit = data.policy.currency ? getCurrencyUnit(data.policy.currency) : undefined;\n const governance_rules = transformManifestRules({\n rules: policy.rules,\n unit,\n usersByDevice,\n usersByName,\n groupsIDsByName,\n whitelistsIDsByName,\n });\n\n return {\n type,\n policy_data: {\n name: policy.name,\n governance_rules,\n ...(policy.currency ? { currency: { name: policy.currency } } : {}),\n },\n };\n};\n\nconst prepareQuorumEdition: PrepareEditQuorum = ({ data }) => {\n return {\n type: \"UPDATE_QUORUM\",\n quorum: data.quorum,\n };\n};\n\nexport type Input =\n | EditQuorumInput\n | CreateAPIUserInput\n | CreateUserInput\n | CreateAPIUserAccessInput\n | CreateGroupInput\n | EditGroupInput\n | CreateWhitelistInput\n | EditWhitelistInput\n | CreateExchangeInput\n | CreatePolicyInput\n | CreateAccountInput\n | EditAccountInput\n | CreateVaultEntityInput\n | EditVaultEntityInput;\n\nexport type Output =\n | GateEditQuorumPayload\n | GateEditWorkspaceRulePayload\n | GateCreateAPIUserPayload\n | GateCreateAPIV2UserAccessPayload\n | GateCreateUserPayload\n | GateMigrateUserPayload\n | GateCreateGroupPayload\n | GateMigrateGroupPayload\n | GateEditGroupPayload\n | GateEditWhitelistPayload\n | GateCreateWhitelistPayload\n | GateMigrateWhitelistPayload\n | GateCreateExchangePayload\n | GateCreatePolicyPayload\n | GateCreateAccountPayload\n | GateCreateLamUserPayload\n | GateEditAccountPayload\n | GateMigrateAccountPayload\n | GateCreateVaultEntityPayload\n | GateEditVaultEntityPayload;\n\nconst prepareRequest = (data: Input): Output => {\n if (data.type === \"EDIT_GROUP\") {\n return prepareGroupEdition(data);\n }\n\n if (data.type === \"CREATE_GROUP\") {\n return prepareGroupCreation(data);\n }\n if (data.type === \"EDIT_WHITELIST\") {\n return prepareWhitelistEdition(data);\n }\n if (data.type === \"CREATE_WHITELIST\") {\n return prepareWhitelistCreation(data);\n }\n if (data.type === \"CREATE_ACCOUNT\") {\n return prepareAccountCreation(data);\n }\n if (data.type === \"EDIT_ACCOUNT\") {\n return prepareAccountEdition(data);\n }\n if (data.type === \"CREATE_ENTITY\") {\n return prepareVaultEntityCreation(data);\n }\n if (data.type === \"EDIT_ENTITY\") {\n return prepareVaultEntityEdition(data);\n }\n if (data.type === \"CREATE_ADMIN\" || data.type === \"CREATE_OPERATOR\") {\n return prepareUserCreation(data);\n }\n if (data.type === \"CREATE_API_USER\") {\n return prepareAPIUserCreation(data);\n }\n\n if (data.type === \"CREATE_API_USER_ACCESS\") {\n return prepareAPIUserAccessCreation(data);\n }\n\n if (data.type === \"UPDATE_QUORUM\") {\n return prepareQuorumEdition(data);\n }\n if (data.type === \"IMPORT_EXCHANGE\") {\n return prepareExchangeCreation(data);\n }\n if (data.type === \"CREATE_POLICY\") {\n return preparePolicyCreation(data);\n }\n\n // @ts-ignore\n throw new Error(`Unhandled request type ${data.type}`);\n};\n\nconst getGroupID = (groupsIDsByName: IDByName, groupName: string) => {\n const groupID = groupsIDsByName[groupName];\n /* istanbul ignore if */\n if (typeof groupID === \"undefined\") throw new Error(`Invalid group name ${groupName}`);\n return groupID;\n};\n\nconst transformMultiAuthRuleFromManifest = (\n rule: ManifestAccountRuleMultiAuth,\n groupsIDsByName: IDByName,\n usersByDevice: UsersByDevice,\n usersByName: UsersByName,\n): WeirdGateRuleMultiAuth => {\n return {\n type: rule.type,\n data: rule.steps.map((step) => {\n return {\n quorum: step.quorum,\n ...(\"group\" in step\n ? { group_id: getGroupID(groupsIDsByName, step.group) }\n : {\n users: step.users.map((d) => {\n if (typeof d === \"number\") {\n const user = usersByDevice[d];\n /* istanbul ignore if */\n if (!user) throw new Error(`Invalid device ${d}`);\n return user.id;\n }\n const user = usersByName[d];\n /* istanbul ignore if */\n if (!user) throw new Error(`Invalid name ${d}`);\n return user.id;\n }),\n }),\n };\n }),\n };\n};\n\nconst transformWhitelistRuleFromManifest = (\n rule: ManifestAccountRuleWhitelist,\n whitelistsIDsByName: Record<string, number>,\n): WeirdGateRuleWhitelist => {\n return {\n type: rule.type,\n data: rule.whitelists.map((w) => {\n const whitelistID = whitelistsIDsByName[w];\n /* istanbul ignore if */\n if (typeof whitelistID === \"undefined\") throw new Error(`Invalid whitelist name ${w}`);\n return whitelistID;\n }),\n };\n};\n\nexport const transformSCIRuleFromManifest = (rule: ManifestAccountRuleSCI): GateRuleSCI => {\n return {\n type: rule.type,\n data: [\n {\n enabled: rule.enabled,\n },\n ],\n };\n};\n\nexport const transformTezosDelegationRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"TEZOS_DELEGATION\" } };\n};\n\nexport const transformPolkadotStakingRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"POLKADOT_STAKING\" } };\n};\n\nexport const transformSolanaStakingRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"SOLANA_STAKING\" } };\n};\nexport const transformMessageSigningRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"MESSAGE_SIGNING\" } };\n};\nexport const transformCreateSplTokenAccountRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"CREATE_SPL_TOKEN_ACCOUNT\" } };\n};\n\nexport const transformCardanoStakingRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"CARDANO_STAKING\" } };\n};\n\nexport const transformRawTransactionRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"RAW_SIGNING\" } };\n};\n\nexport const transformSendTransactionRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"SEND\" } };\n};\n\nexport const transformSmartContractDeploymentFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"DEPLOY_CONTRACT\" } };\n};\n\nexport const transformStakeTransactionRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"STAKE\" } };\n};\n\nexport const transformThresholdRuleFromManifest = (\n rule: ManifestAccountRuleThreshold,\n unit: Unit,\n): WeirdGateRuleThreshold => {\n return {\n type: rule.type,\n data: [\n {\n currency_type: \"CRYPTO\",\n ...(rule.max ? { max: serializeUnitValue(unit, rule.max) } : {}),\n min: serializeUnitValue(unit, rule.min || 0),\n },\n ],\n };\n};\n\nexport const transformManifestRules = ({\n rules,\n unit,\n usersByDevice,\n usersByName,\n whitelistsIDsByName,\n groupsIDsByName,\n enforceSendTxFilter,\n}: {\n rules: Array<ManifestAccountRule[]> | void;\n unit?: Unit;\n usersByDevice: UsersByDevice;\n usersByName: UsersByName;\n whitelistsIDsByName?: IDByName;\n groupsIDsByName: IDByName;\n // VG-18120 ability to enforce `SEND` transaction filter if no transaction filter is present\n enforceSendTxFilter?: boolean;\n}): WeirdGateGovernanceRulesSet[] => {\n const governance_rules =\n rules && rules.length\n ? rules.map((rules, i) => {\n return {\n name: `Rule ${i + 1}`,\n rules: rules.map((rule) => {\n if (rule.type === \"MULTI_AUTHORIZATIONS\") {\n return transformMultiAuthRuleFromManifest(\n rule,\n groupsIDsByName,\n usersByDevice,\n usersByName,\n );\n }\n if (rule.type === \"WHITELIST\") {\n invariant(\n whitelistsIDsByName,\n \"WHITELIST rule configured outside of account context\",\n );\n return transformWhitelistRuleFromManifest(rule, whitelistsIDsByName);\n }\n if (rule.type === \"THRESHOLD\") {\n invariant(unit, \"THRESHOLD: no unit provided\");\n\n return transformThresholdRuleFromManifest(rule, unit);\n }\n if (rule.type === \"SMART_CONTRACT_INTERACTION\") {\n return transformSCIRuleFromManifest(rule);\n }\n\n if (rule.type === \"DEPLOY_CONTRACT\") {\n return transformSmartContractDeploymentFromManifest();\n }\n\n if (rule.type === \"TEZOS_DELEGATION\") {\n return transformTezosDelegationRuleFromManifest();\n }\n if (rule.type === \"POLKADOT_STAKING\") {\n return transformPolkadotStakingRuleFromManifest();\n }\n if (rule.type === \"SOLANA_STAKING\") {\n return transformSolanaStakingRuleFromManifest();\n }\n if (rule.type === \"CARDANO_STAKING\") {\n return transformCardanoStakingRuleFromManifest();\n }\n if (rule.type === \"RAW_SIGNING\") {\n return transformRawTransactionRuleFromManifest();\n }\n if (rule.type === \"SEND\") {\n return transformSendTransactionRuleFromManifest();\n }\n if (rule.type === \"STAKE\") {\n return transformStakeTransactionRuleFromManifest();\n }\n if (rule.type === \"MESSAGE_SIGNING\") {\n return transformMessageSigningRuleFromManifest();\n }\n if (rule.type === \"CREATE_SPL_TOKEN_ACCOUNT\") {\n return transformCreateSplTokenAccountRuleFromManifest();\n }\n // @ts-ignore\n throw new Error(`Unhandled rule type ${rule.type}`);\n }),\n };\n })\n : getDefaultRule(usersByDevice);\n\n // VG-18120 ability to enforce `SEND` transaction filter if no transaction filter is present\n if (enforceSendTxFilter) {\n governance_rules.forEach((rulesSet) => {\n const hasTxFilterRule = !!rulesSet.rules.find((r) => r.type === \"TRANSACTION_FILTER\");\n const hasSCIRule = !!rulesSet.rules.find((r) => r.type === \"SMART_CONTRACT_INTERACTION\");\n if (!hasTxFilterRule && !hasSCIRule) {\n rulesSet.rules.unshift({ type: \"TRANSACTION_FILTER\", data: { preset: \"SEND\" } });\n }\n });\n }\n\n return governance_rules;\n};\n\nconst getDefaultRule = (usersByDevice: Record<string, GateUser>): WeirdGateGovernanceRulesSet[] => {\n const operatorsDevices = Object.keys(usersByDevice).filter((key) => {\n const u = usersByDevice[key];\n /* istanbul ignore if */\n if (!u) throw new Error(`Invalid device ${key}`);\n return u.role === \"OPERATOR\";\n });\n const lastCreatedOperatorDevice = operatorsDevices[0];\n /* istanbul ignore if */\n if (!lastCreatedOperatorDevice) {\n throw new Error(`Can't get the last created operator device`);\n }\n const lastCreatedOperator = usersByDevice[lastCreatedOperatorDevice];\n /* istanbul ignore if */\n if (!lastCreatedOperator) {\n throw new Error(`Can't get the last created operator`);\n }\n\n return [\n {\n name: \"Rule 1\",\n rules: [\n {\n type: \"MULTI_AUTHORIZATIONS\",\n data: [\n {\n quorum: 1,\n users: [lastCreatedOperator.id],\n },\n ],\n },\n ],\n },\n ];\n};\n\nexport const serializeToWeirdGateRulesSets = (\n rulesSets: GateGovernanceRulesSet[],\n): WeirdGateGovernanceRulesSet[] => {\n return rulesSets.map((rulesSet: GateGovernanceRulesSet): WeirdGateGovernanceRulesSet => {\n return {\n name: rulesSet.name,\n rules: rulesSet.rules.map((rule: GateGovernanceRule): WeirdGateGovernanceRule => {\n if (rule.type === \"MULTI_AUTHORIZATIONS\") {\n return {\n type: rule.type,\n data: rule.data.map((step: GateRuleMultiAuthStep): WeirdGateRuleMultiAuthStep => {\n if (step.group.is_internal) {\n return {\n quorum: step.quorum,\n users: step.group.members.map((member) => member.id),\n };\n }\n return {\n quorum: step.quorum,\n group_id: step.group.id,\n };\n }),\n };\n }\n if (rule.type === \"THRESHOLD\") {\n return {\n type: rule.type,\n data: [\n {\n currency_type: \"CRYPTO\",\n min: rule.data[0].min,\n ...(rule.data[0].max ? /* istanbul ignore next */ { max: rule.data[0].max } : {}),\n },\n ],\n };\n }\n if (rule.type === \"WHITELIST\") {\n return {\n type: rule.type,\n data: rule.data.map((whitelist) => whitelist.id),\n };\n }\n /* istanbul ignore next */\n return rule;\n }),\n };\n });\n};\n\nconst TWO_STEPS_CREATION_REQUESTS: GateRequestType[] = [\n \"CREATE_ACCOUNT\",\n \"CREATE_GROUP\",\n \"CREATE_TRANSACTION\",\n \"CREATE_WHITELIST\",\n \"EDIT_ACCOUNT\",\n \"EDIT_GROUP\",\n \"EDIT_WHITELIST\",\n \"REVOKE_USER\",\n \"UPDATE_QUORUM\",\n];\n\nexport const performRequest = async <T>(\n payload: Output,\n pool: DevicesPool,\n options?: {\n existingRequest?: GateGenericRequest | null;\n noApproval?: boolean;\n withoutHSM?: boolean;\n twoStepsRequest?: boolean;\n },\n): Promise<T> => {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n\n let request: GateGenericRequest | void | null = options?.existingRequest;\n\n if (!request) {\n const enableTwoStepsCreation =\n options?.twoStepsRequest && TWO_STEPS_CREATION_REQUESTS.includes(payload.type);\n\n if (enableTwoStepsCreation) {\n Object.assign(payload, { enable_two_step_request_creation: true });\n }\n\n const r = await admin.post<GateGenericRequest>(\"/requests\", payload);\n request = r;\n\n if (enableTwoStepsCreation) {\n const pingChallenge = async () => {\n try {\n await admin.post(`/requests/${r.id}/post-create`, {});\n } catch (err) /* istanbul ignore next */ {\n await pingChallenge();\n }\n };\n await pingChallenge();\n }\n }\n\n if (!options || !options.noApproval) {\n await pool.runWithQuorum((admin) =>\n options?.withoutHSM ? admin.approveRequestWithoutHSM(request) : admin.approveRequest(request),\n );\n }\n return request as unknown as T;\n};\n\nexport default prepareRequest;\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-BLZRHILW.js","../src/reviewAPIRequest.ts","../src/apiUser/index.ts","../src/createDefaultRunner.ts","../src/prepareRequest.ts"],"names":["admin","invariant","account"],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACF,sDAA4B;AAC5B;AACA;AClBA,mDAA8B;ADoB9B;AACA;AEpBA,4EAAkB;AFsBlB;AACA;AGxBA;AACA,4FAAsB;AACtB,4BAA6B;AH0B7B;AACA;AI7BA;AAgYO,IAAM,oBAAA,EAAyC,CAAC,EAAE,KAAK,CAAA,EAAA,GAAM;AAClE,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,OAAO,EAAA,EAAI,IAAA;AAC/B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA,IAAS,WAAA,EAAa,kBAAA,EAAoB,cAAA;AAAA,IAChD,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS;AAAA,EACX,CAAA;AACF,CAAA;AAEO,IAAM,uBAAA,EAA+C,CAAC,EAAE,KAAK,CAAA,EAAA,GAAM;AACxE,EAAA,MAAM,EAAE,SAAA,EAAW,IAAA,EAAM,KAAK,EAAA,EAAI,IAAA;AAClC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,iBAAA;AAAA,IACN,SAAA,EAAW;AAAA,MACT,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,SAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF,CAAA;AACF,CAAA;AAEO,IAAM,6BAAA,EAA6D,CAAC,EAAE,KAAK,CAAA,EAAA,GAAM;AACtF,EAAA,MAAM,EAAE,KAAK,EAAA,EAAI,IAAA;AACjB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,wBAAA;AAAA,IACN,SAAA,EAAW;AAAA,MACT,QAAA,EAAU;AAAA,IACZ;AAAA,EACF,CAAA;AACF,CAAA;AAEO,IAAM,uBAAA,EAA+C,CAAC,EAAE,IAAA,EAAM,KAAK,CAAA,EAAA,GAAM;AAC9E,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,aAAA;AAAA,IACA,mBAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,sBAAA;AAAA,IACA,yBAAA;AAAA,IACA,qBAAA;AAAA,IACA,iBAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,EACF,EAAA,EAAI,IAAA;AAEJ,EAAA,MAAM,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,EAAA,GAAQ,cAAA,CAAe,GAAG,CAAC,CAAA;AAEhF,EAAA,MAAM,MAAA,EACJ,kBAAA,GAAqB,QAAA,EACjB,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAA,GAAM,CAAA,CAAE,iBAAA,IAAqB,OAAA,CAAQ,eAAe,EAAA,EACjE,IAAA;AAEN,EAAA,GAAA,CAAI,kBAAA,GAAqB,QAAA,GAAW,CAAC,KAAA,EAAO;AAC1C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,OAAA,CAAQ,eAAe,CAAA,CAAA;AACnF,EAAA;AAEmB,EAAA;AACe,EAAA;AACK,IAAA;AACpB,MAAA;AACV,IAAA;AACU,MAAA;AACjB,IAAA;AACmC,EAAA;AACZ,IAAA;AACS,EAAA;AACwB,IAAA;AAC1D,EAAA;AAEmB,EAAA;AAC6B,IAAA;AAChD,EAAA;AAE2C,EAAA;AAEgB,EAAA;AAGpC,IAAA;AACf,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAAA;AAAA;AAGqB,IAAA;AACtB,EAAA;AAEc,EAAA;AACL,IAAA;AACiC,IAAA;AACjD,EAAA;AAE6C,EAAA;AACM,IAAA;AACZ,IAAA;AACoB,MAAA;AACzD,IAAA;AAE4B,IAAA;AACiB,MAAA;AAC5C,IAAA;AACH,EAAA;AAEiD,EAAA;AACnB,IAAA;AACH,MAAA;AACF,MAAA;AACU,QAAA;AACA,QAAA;AAC/B,MAAA;AAC0B,MAAA;AAC3B,IAAA;AACH,EAAA;AAE2C,EAAA;AACd,IAAA;AACO,IAAA;AAIvB,IAAA;AACiB,MAAA;AAGoB,MAAA;AACf,QAAA;AAC3B,MAAA;AAC2B,MAAA;AACe,QAAA;AACnC,MAAA;AACwD,QAAA;AAClC,QAAA;AACQ,UAAA;AACnC,QAAA;AACuC,QAAA;AACzC,MAAA;AAC6B,MAAA;AAE/B,IAAA;AAG2B,IAAA;AACf,MAAA;AACE,QAAA;AACC,QAAA;AACU,QAAA;AACK,QAAA;AACT,QAAA;AACvB,MAAA;AACqC,MAAA;AAChC,IAAA;AACuB,MAAA;AACuC,QAAA;AAClE,MAAA;AACH,IAAA;AAE4B,IAAA;AACK,MAAA;AAC/B,MAAA;AACD,IAAA;AACH,EAAA;AAE2B,EAAA;AACG,IAAA;AAChB,MAAA;AACM,QAAA;AAChB,MAAA;AACD,IAAA;AAEgC,IAAA;AACH,MAAA;AACD,QAAA;AAC1B,MAAA;AACH,IAAA;AACF,EAAA;AAEI,EAAA;AACyD,EAAA;AACqB,IAAA;AAErD,IAAA;AACsD,MAAA;AAET,IAAA;AAE1C,IAAA;AACyC,MAAA;AAEvD,IAAA;AACmB,MAAA;AACtB,MAAA;AACI,MAAA;AAC+C,MAAA;AACN,QAAA;AAE5B,QAAA;AACgC,UAAA;AACnD,QAAA;AAC2B,UAAA;AACA,UAAA;AAC5B,UAAA;AACN,QAAA;AACD,MAAA;AACH,IAAA;AACF,EAAA;AAEO,EAAA;AACL,IAAA;AAC8D,IAAA;AACL,IAAA;AACzD,IAAA;AACA,IAAA;AACF,EAAA;AACF;AAEsE;AAC9D,EAAA;AACJ,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACE,EAAA;AAGkB,EAAA;AACsB,IAAA;AAC5C,EAAA;AAE2C,EAAA;AACK,EAAA;AAC/B,IAAA;AACf,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACqB,IAAA;AACtB,EAAA;AAEiB,EAAA;AACF,IAAA;AACd,IAAA;AACF,EAAA;AAEkC,EAAA;AAC+C,IAAA;AAGnE,IAAA;AACwD,MAAA;AACpE,IAAA;AAG+B,IAAA;AACf,MAAA;AACE,QAAA;AACC,QAAA;AACU,QAAA;AACK,QAAA;AACT,QAAA;AACvB,MAAA;AACkC,MAAA;AAC7B,IAAA;AACoB,MAAA;AACiC,QAAA;AACzD,MAAA;AACH,IAAA;AACF,EAAA;AAEO,EAAA;AACL,IAAA;AAC4B,IAAA;AAC5B,IAAA;AACF,EAAA;AACF;AAKe;AACqB,EAAA;AACA,IAAA;AACA,MAAA;AAEoB,MAAA;AACzC,MAAA;AACJ,IAAA;AACuB,MAAA;AAEyB,MAAA;AAC5C,MAAA;AACX,IAAA;AACD,EAAA;AACH;AAEqE;AACjD,EAAA;AACqC,EAAA;AAChD,EAAA;AACL,IAAA;AACY,IAAA;AACsB,IAAA;AAClC,IAAA;AACF,EAAA;AACF;AAEkE;AAC/B,EAAA;AAEb,EAAA;AACsB,IAAA;AAC1C,EAAA;AACuD,EAAA;AAChD,EAAA;AACL,IAAA;AACY,IAAA;AACsB,IAAA;AACV,IAAA;AACb,IAAA;AACG,MAAA;AACZ,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAKe;AACmC,EAAA;AACV,IAAA;AAEoB,IAAA;AAC/C,IAAA;AACV,EAAA;AACH;AAEiF;AACzE,EAAA;AAC0B,IAAA;AAC5B,EAAA;AACG,EAAA;AACL,IAAA;AACA,IAAA;AACqE,IAAA;AACvE,EAAA;AACF;AAE8E;AAC/B,EAAA;AAEnB,EAAA;AACuB,IAAA;AACjD,EAAA;AACO,EAAA;AACL,IAAA;AAC+B,IAAA;AACpB,IAAA;AACS,MAAA;AAE2B,MAAA;AAE/C,IAAA;AACF,EAAA;AACF;AAE6E;AACrD,EAAA;AAC+B,EAAA;AAChD,IAAA;AACmC,IAAA;AACtC,EAAA;AACK,EAAA;AACL,IAAA;AACgB,IAAA;AACsB,IAAA;AACtC,IAAA;AACuD,IAAA;AACzD,EAAA;AACF;AAE0E;AAC/B,EAAA;AAEjB,EAAA;AACsB,IAAA;AAC9C,EAAA;AACqD,EAAA;AAChD,IAAA;AACmC,IAAA;AACtC,EAAA;AACK,EAAA;AACL,IAAA;AACgB,IAAA;AACH,IAAA;AACmB,IAAA;AACrB,IAAA;AACO,MAAA;AAChB,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAE2E;AACP,EAAA;AAErB,EAAA;AAEtC,EAAA;AACL,IAAA;AACe,IAAA;AACE,MAAA;AACf,MAAA;AACmB,MAAA;AACN,MAAA;AACoB,QAAA;AACA,QAAA;AACjC,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAEuE;AACY,EAAA;AAEL,EAAA;AAC5B,EAAA;AAChC,IAAA;AACd,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACD,EAAA;AAEM,EAAA;AACL,IAAA;AACa,IAAA;AACE,MAAA;AACb,MAAA;AACiE,MAAA;AACnE,IAAA;AACF,EAAA;AACF;AAE8D;AACrD,EAAA;AACC,IAAA;AACO,IAAA;AACf,EAAA;AACF;AAwCgD;AACd,EAAA;AACC,IAAA;AACjC,EAAA;AAEkC,EAAA;AACA,IAAA;AAClC,EAAA;AACoC,EAAA;AACC,IAAA;AACrC,EAAA;AACsC,EAAA;AACA,IAAA;AACtC,EAAA;AACoC,EAAA;AACA,IAAA;AACpC,EAAA;AACkC,EAAA;AACC,IAAA;AACnC,EAAA;AACmC,EAAA;AACK,IAAA;AACxC,EAAA;AACiC,EAAA;AACM,IAAA;AACvC,EAAA;AACqE,EAAA;AACpC,IAAA;AACjC,EAAA;AACqC,EAAA;AACD,IAAA;AACpC,EAAA;AAE4C,EAAA;AACF,IAAA;AAC1C,EAAA;AAEmC,EAAA;AACD,IAAA;AAClC,EAAA;AACqC,EAAA;AACA,IAAA;AACrC,EAAA;AACmC,EAAA;AACA,IAAA;AACnC,EAAA;AAGqD,EAAA;AACvD;AAEqE;AAC1B,EAAA;AAE0C,EAAA;AAC5E,EAAA;AACT;AAME;AAEO,EAAA;AACM,IAAA;AACoB,IAAA;AACtB,MAAA;AACQ,QAAA;AAGT,QAAA;AAC+B,UAAA;AACA,YAAA;AACG,cAAA;AAEoB,cAAA;AACpC,cAAA;AACd,YAAA;AAC0B,YAAA;AAEoB,YAAA;AAClC,YAAA;AACb,UAAA;AACH,QAAA;AACN,MAAA;AACD,IAAA;AACH,EAAA;AACF;AAK6B;AACpB,EAAA;AACM,IAAA;AACsB,IAAA;AACU,MAAA;AAEe,MAAA;AACjD,MAAA;AACR,IAAA;AACH,EAAA;AACF;AAE2F;AAClF,EAAA;AACM,IAAA;AACL,IAAA;AACJ,MAAA;AACgB,QAAA;AAChB,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAEyF;AACb,EAAA;AAC5E;AAEyF;AACb,EAAA;AAC5E;AAEuF;AACb,EAAA;AAC1E;AACwF;AACb,EAAA;AAC3E;AAC+F;AACX,EAAA;AACpF;AAEwF;AACb,EAAA;AAC3E;AAEwF;AACjB,EAAA;AACvE;AAEyF;AACzB,EAAA;AAChE;AAE6F;AAClB,EAAA;AAC3E;AAE0F;AACzB,EAAA;AACjE;AAK6B;AACpB,EAAA;AACM,IAAA;AACL,IAAA;AACJ,MAAA;AACiB,QAAA;AAC+C,QAAA;AACnB,QAAA;AAC7C,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAEuC;AACrC,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAUmC;AAGL,EAAA;AACf,IAAA;AACc,MAAA;AACQ,MAAA;AACiB,QAAA;AACjC,UAAA;AACL,YAAA;AACA,YAAA;AACA,YAAA;AACA,YAAA;AACF,UAAA;AACF,QAAA;AAC+B,QAAA;AAC7B,UAAA;AACE,YAAA;AACA,YAAA;AACF,UAAA;AACmE,UAAA;AACrE,QAAA;AAC+B,QAAA;AACgB,UAAA;AAEO,UAAA;AACtD,QAAA;AACgD,QAAA;AACN,UAAA;AAC1C,QAAA;AAEqC,QAAA;AACiB,UAAA;AACtD,QAAA;AAEsC,QAAA;AACY,UAAA;AAClD,QAAA;AACsC,QAAA;AACY,UAAA;AAClD,QAAA;AACoC,QAAA;AACY,UAAA;AAChD,QAAA;AACqC,QAAA;AACY,UAAA;AACjD,QAAA;AACiC,QAAA;AACgB,UAAA;AACjD,QAAA;AAC0B,QAAA;AACwB,UAAA;AAClD,QAAA;AAC2B,QAAA;AACwB,UAAA;AACnD,QAAA;AACqC,QAAA;AACY,UAAA;AACjD,QAAA;AAC8C,QAAA;AACU,UAAA;AACxD,QAAA;AAEkD,QAAA;AACnD,MAAA;AACH,IAAA;AAE0B,EAAA;AAGT,EAAA;AACgB,IAAA;AAC2B,MAAA;AACL,MAAA;AACtB,MAAA;AAC2C,QAAA;AAChF,MAAA;AACD,IAAA;AACH,EAAA;AAEO,EAAA;AACT;AAEmG;AAC7B,EAAA;AACvC,IAAA;AAEoB,IAAA;AAC7B,IAAA;AACnB,EAAA;AACmD,EAAA;AAEpB,EAAA;AAC8B,IAAA;AAC9D,EAAA;AACmE,EAAA;AAEzC,EAAA;AAC6B,IAAA;AACvD,EAAA;AAEO,EAAA;AACL,IAAA;AACQ,MAAA;AACC,MAAA;AACL,QAAA;AACQ,UAAA;AACA,UAAA;AACJ,YAAA;AACU,cAAA;AACsB,cAAA;AAChC,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAmDuD;AACrD,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACF;AAWiB;AAC2C,EAAA;AACR,EAAA;AAEO,EAAA;AAE3C,EAAA;AAEkB,IAAA;AAEF,IAAA;AACuC,MAAA;AACnE,IAAA;AAEmE,IAAA;AACzD,IAAA;AAEkB,IAAA;AACQ,MAAA;AAC5B,QAAA;AACkD,UAAA;AACb,QAAA;AACnB,UAAA;AACtB,QAAA;AACF,MAAA;AACoB,MAAA;AACtB,IAAA;AACF,EAAA;AAEqC,EAAA;AACxB,IAAA;AACuDA,MAAAA;AAClE,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAEe;AJrlBuE;AACA;AGpoBW;AACnE,EAAA;AAE0D,EAAA;AAS/E,IAAA;AAC2C,MAAA;AACQ,MAAA;AACmB,MAAA;AAC5B,MAAA;AAC/C,IAAA;AACF,EAAA;AAE6D,EAAA;AACpB,IAAA;AACQ,IAAA;AACa,MAAA;AACR,MAAA;AACa,MAAA;AACD,MAAA;AAChE,IAAA;AAEI,IAAA;AACA,IAAA;AACmE,MAAA;AAEpD,MAAA;AAE2C,QAAA;AACR,QAAA;AACtB,QAAA;AACgC,UAAA;AAC5D,QAAA;AAC+D,QAAA;AAC3B,QAAA;AAGZ,QAAA;AACiD,UAAA;AACzE,QAAA;AAEsB,QAAA;AACuB,UAAA;AAC7C,QAAA;AACM,QAAA;AACJ,UAAA;AACE,YAAA;AAC6B,YAAA;AACpB,YAAA;AACE,YAAA;AACM,YAAA;AACL,YAAA;AACd,UAAA;AACwB,UAAA;AAC1B,QAAA;AACF,MAAA;AACY,IAAA;AAQG,MAAA;AAI6C,QAAA;AACR,QAAA;AACL,QAAA;AAC3C,UAAA;AACuC,UAAA;AACzC,QAAA;AACyD,QAAA;AACxB,UAAA;AACjC,QAAA;AAC2E,QAAA;AACnC,QAAA;AACqC,QAAA;AACpB,QAAA;AACnB,QAAA;AACpC,UAAA;AACgE,UAAA;AAClE,QAAA;AACAC,QAAAA;AACqC,UAAA;AACuC,UAAA;AAC5E,QAAA;AACoD,QAAA;AACZ,QAAA;AACnC,UAAA;AACqC,UAAA;AAC1C,QAAA;AACuE,QAAA;AAClE,MAAA;AACC,QAAA;AACR,MAAA;AACF,IAAA;AAG0B,IAAA;AACF,MAAA;AACoC,MAAA;AACR,MAAA;AAErB,MAAA;AAC0C,QAAA;AACpC,QAAA;AACjBC,UAAAA;AACd,UAAA;AACF,QAAA;AAEc,QAAA;AAChB,MAAA;AACF,IAAA;AACO,IAAA;AACT,EAAA;AAEyD,EAAA;AAChB,IAAA;AACgB,IAAA;AACrB,IAAA;AACW,IAAA;AACZ,IAAA;AACqC,IAAA;AACrB,IAAA;AAClB,IAAA;AACN,IAAA;AACsC,MAAA;AAC/D,IAAA;AACO,IAAA;AACT,EAAA;AAKK,EAAA;AAC4B,IAAA;AAEmC,IAAA;AACpD,IAAA;AAEI,MAAA;AACd,QAAA;AACQ,UAAA;AACI,UAAA;AACD,UAAA;AACD,UAAA;AACgB,UAAA;AAC1B,QAAA;AACA,QAAA;AACmB,QAAA;AACrB,MAAA;AACF,IAAA;AACsB,IAAA;AAE+B,MAAA;AAC5B,IAAA;AAE0C,MAAA;AACnE,IAAA;AACO,IAAA;AACT,EAAA;AAEmE,EAAA;AAC/B,IAAA;AACrB,IAAA;AACwB,IAAA;AACQ,IAAA;AACZ,IAAA;AACqC,IAAA;AAC7C,IAAA;AACsC,MAAA;AAC/D,IAAA;AACO,IAAA;AACT,EAAA;AAEyE,EAAA;AACtD,IAAA;AACJ,IAAA;AACO,IAAA;AACyB,IAAA;AACZ,IAAA;AAC2C,IAAA;AAC9E,EAAA;AAIK,EAAA;AAC+B,IAAA;AACwB,IAAA;AACR,IAAA;AACrC,IAAA;AACS,MAAA;AACE,MAAA;AACA,MAAA;AACI,MAAA;AAC5B,IAAA;AAC0E,IAAA;AAC5E,EAAA;AAE+E,EAAA;AACnB,IAAA;AACR,IAAA;AACrC,IAAA;AACA,MAAA;AACmB,MAAA;AACZ,MAAA;AACK,MAAA;AACzB,IAAA;AAE0E,IAAA;AAAA;AAE7D,MAAA;AAC0B,QAAA;AAE5B,QAAA;AACC,UAAA;AACR,QAAA;AACF,MAAA;AACF,IAAA;AACwE,IAAA;AAC1E,EAAA;AAE2E,EAAA;AACf,IAAA;AACR,IAAA;AACwB,IAAA;AACT,IAAA;AAC1D,IAAA;AACT,EAAA;AAEwF,EAAA;AAC3B,IAAA;AACD,IAAA;AACR,IAAA;AACtC,IAAA;AACR,IAAA;AACsB,IAAA;AACjB,MAAA;AACC,QAAA;AACyB,QAAA;AACJ,QAAA;AACA,QAAA;AAC7B,MAAA;AAC0E,MAAA;AACrE,IAAA;AACE,MAAA;AACC,QAAA;AAC8B,QAAA;AACT,QAAA;AACA,QAAA;AAC7B,MAAA;AAC8E,MAAA;AAChF,IAAA;AACiE,IAAA;AAG3C,IAAA;AACuB,MAAA;AAC7C,IAAA;AAEM,IAAA;AACJ,MAAA;AACE,QAAA;AACmB,QAAA;AACV,QAAA;AACE,QAAA;AACM,QAAA;AACL,QAAA;AACd,MAAA;AACwB,MAAA;AAC1B,IAAA;AACO,IAAA;AACT,EAAA;AAEyD,EAAA;AACpC,IAAA;AACY,IAAA;AACvB,MAAA;AACS,MAAA;AAChB,IAAA;AACqD,IAAA;AACxD,EAAA;AAEuE,EAAA;AACvC,IAAA;AACgB,IAAA;AACtC,MAAA;AACW,MAAA;AACN,MAAA;AAC2C,QAAA;AAC3C,UAAA;AACK,YAAA;AACuB,YAAA;AACE,cAAA;AACc,cAAA;AACnC,cAAA;AACb,YAAA;AACH,UAAA;AACD,QAAA;AACH,MAAA;AACF,IAAA;AACgE,IAAA;AAClE,EAAA;AAE+B,EAAA;AAC7B,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAC0D,IAAA;AACJ,IAAA;AACtD,IAAA;AAC4D,IAAA;AACU,IAAA;AACJ,IAAA;AACO,IAAA;AAC3D,MAAA;AACb,IAAA;AACoE,IAAA;AACvD,MAAA;AACb,IAAA;AACoE,IAAA;AACvD,MAAA;AACb,IAAA;AACkE,IAAA;AACrD,MAAA;AACb,IAAA;AAC4D,IAAA;AAC7D,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AAEO,EAAA;AACT;AAEe;AH6kBuE;AACA;AE78BxB;AACrD,EAAA;AACI,IAAA;AACe,MAAA;AACN,MAAA;AACoB,MAAA;AACtC,IAAA;AACF,EAAA;AACF;AAQ2D;AACd,EAAA;AACjB,EAAA;AAClB,IAAA;AAC2B,IAAA;AACnB,IAAA;AACA,IAAA;AAChB,EAAA;AAC8E,EAAA;AAC1D,EAAA;AACY,IAAA;AACI,IAAA;AACpC,EAAA;AAEO,EAAA;AACL,IAAA;AACF,EAAA;AACO,EAAA;AACU,IAAA;AACiB,MAAA;AACI,MAAA;AACnC,IAAA;AACH,EAAA;AACO,EAAA;AACT;AAME;AACoF,EAAA;AACvC,IAAA;AAC5C,EAAA;AACH;AAQmB;AAC4D,EAAA;AAEJ,EAAA;AACvD,EAAA;AACpB;AAOsC;AACpC,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAOwB;AACiB,EAAA;AACZ,EAAA;AACG,IAAA;AAChC,EAAA;AAC4B,EAAA;AAC1B,IAAA;AACA,IAAA;AACC,IAAA;AACkC,IAAA;AAClB,EAAA;AAEU,IAAA;AACF,MAAA;AACzB,IAAA;AAEM,IAAA;AACP,EAAA;AACmC,EAAA;AAC3B,IAAA;AACM,MAAA;AACO,MAAA;AACpB,IAAA;AACF,EAAA;AACO,EAAA;AACoB,IAAA;AAC2B,IAAA;AACtD,EAAA;AACF;AAEqC;AACnC,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAS8B;AACG,EAAA;AAEvB,EAAA;AACY,EAAA;AACyB,IAAA;AAC/C,EAAA;AAEa,EAAA;AACX,IAAA;AACkD,IAAA;AAC5C,IAAA;AAC6B,IAAA;AACrC,EAAA;AACF;AAEyC;AACvC,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAO2B;AACD,EAAA;AACxB,IAAA;AACqC,IAAA;AACpC,IAAA;AACkC,IAAA;AACrC,EAAA;AAEiF,EAAA;AAEhE,EAAA;AACmC,IAAA;AACpD,EAAA;AACkB,EAAA;AACpB;AAE4C;AAC1C,EAAA;AACA,EAAA;AACA,EAAA;AAKkB;AACmB,EAAA;AACqB,EAAA;AACR,EAAA;AACvB,EAAA;AACzB,IAAA;AAC8B,IAAA;AAChC,EAAA;AAEkD,EAAA;AACd,IAAA;AACjC,EAAA;AACoB,EAAA;AACzB;AFk5BsF;AACA;ACnlCpF;AACE,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACsB,EAAA;AAGK;AACc,EAAA;AACV,EAAA;AACtB,IAAA;AACV,EAAA;AAC6C,EAAA;AACqC,EAAA;AAEhE,EAAA;AACN,IAAA;AACO,IAAA;AACpB,EAAA;AAEmC,EAAA;AACH,IAAA;AACO,IAAA;AACnC,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACD,IAAA;AACH,EAAA;AAEyC,EAAA;AACX,EAAA;AAER,EAAA;AACpB,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACwB,IAAA;AACxB,IAAA;AACD,EAAA;AACH;AAEe;AD8kCuE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-BLZRHILW.js","sourcesContent":[null,"import { SILENT_LOGGER } from \"@ledgerhq/vault-utils\";\n\nimport { authenticate, decodeChallenge, signAndApprove } from \"./apiUser\";\nimport createNetwork from \"./createNetwork\";\nimport { APIRequestResponse, DevicesPool, ManifestAPIV2User, RunnableOptions } from \"./types\";\nimport { getWorkspaceFromGate } from \"./utils\";\n\nexport type ReviewAPIRequestOptions = {\n pool: DevicesPool;\n requestID: number;\n apiUser: ManifestAPIV2User;\n gate: string;\n apiGateway: string;\n reviewType: ReviewType;\n skipDecodeChallenge?: boolean;\n};\n\nexport type ReviewType = \"APPROVE\" | \"REJECT\";\n\nasync function reviewAPIRequest(\n {\n pool,\n requestID,\n apiUser,\n gate,\n apiGateway,\n reviewType,\n skipDecodeChallenge = false,\n }: ReviewAPIRequestOptions,\n { logger = SILENT_LOGGER }: RunnableOptions,\n): Promise<APIRequestResponse> {\n const workspace = getWorkspaceFromGate(gate);\n const apiNetwork = createNetwork({\n baseURL: apiGateway,\n });\n logger.info(`Authenticate for ${apiUser.name}`);\n const bearerToken = await authenticate(pool, apiNetwork, workspace, apiUser, logger);\n\n let apiChallenge = {\n challenge: \"\",\n decodedChallenge: \"\",\n };\n // for example today there is no challenge ro reject a message signing transaction as a simple empty abort is enough like for regular transaction\n if (skipDecodeChallenge === false) {\n logger.info(\"Decode challenge\");\n apiChallenge = await decodeChallenge({\n apiNetwork,\n workspace,\n bearerToken,\n requestID,\n reviewType,\n });\n }\n\n logger.info(apiChallenge.decodedChallenge);\n logger.info(\"Sign and approve\");\n\n return signAndApprove({\n apiNetwork,\n workspace,\n bearerToken,\n requestID,\n apiUser,\n challenge: apiChallenge.challenge,\n reviewType,\n });\n}\n\nexport default reviewAPIRequest;\n","import { Logger } from \"@ledgerhq/vault-utils\";\nimport chalk from \"chalk\";\n\nimport createDefaultRunner from \"../createDefaultRunner\";\nimport { decodeData, genKeys, sign } from \"../crypto/utils\";\nimport { ReviewType } from \"../reviewAPIRequest\";\nimport {\n APIBearerTokenResponse,\n APIGetChallengeResponse,\n APIRequestResponse,\n Connection,\n DevicesPool,\n GateAccount,\n GateWhitelist,\n ManifestAPIV2User,\n Network,\n} from \"../types\";\nimport { TradelinkPledge } from \"../types/tradelink\";\n\nfunction getAPIHeader(bearerToken: string, workspace: string) {\n return {\n headers: {\n \"X-Ledger-Workspace\": workspace,\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${bearerToken}`,\n },\n };\n}\n\nexport async function regenerateCredentials(\n pool: DevicesPool,\n apiNetwork: Network,\n workspace: string,\n apiUser: ManifestAPIV2User,\n logger: Logger,\n): Promise<{ api_key_id: string; api_key_secret: string }> {\n const runner = createDefaultRunner(pool, {});\n const postApiUserAccess = {\n user: apiUser,\n publicKey: genKeys(apiUser.name).hexPubKey,\n role: apiUser.role,\n name: apiUser.name,\n };\n const userAccessRequest = await runner.createAPIV2UserAccess(postApiUserAccess);\n const apiUserAuth = {\n api_key_id: userAccessRequest.api_key_id,\n api_key_secret: userAccessRequest.api_key_secret,\n };\n\n logger.info(\n chalk`{red.bold IMPORTANT:} {red The API user credentials will not be displayed again so note them somewhere}`,\n );\n logger.info(\n JSON.stringify({\n api_key_id: userAccessRequest.api_key_id,\n api_key_secret: userAccessRequest.api_key_secret,\n }),\n );\n return apiUserAuth;\n}\n\nexport async function getAuthTokens(\n apiNetwork: Network,\n workspace: string,\n apiUserAuth: { api_key_id: string; api_key_secret: string },\n) {\n return await apiNetwork<APIBearerTokenResponse>(\"POST\", \"/auth/token\", apiUserAuth, {\n headers: { \"X-Ledger-Workspace\": workspace },\n });\n}\n\nexport async function authenticate(\n pool: DevicesPool,\n apiNetwork: Network,\n workspace: string,\n apiUser: ManifestAPIV2User,\n logger: Logger,\n): Promise<string> {\n const apiUserAuth = await regenerateCredentials(pool, apiNetwork, workspace, apiUser, logger);\n\n const bearerResp = await getAuthTokens(apiNetwork, workspace, apiUserAuth);\n return bearerResp.access_token;\n}\n\nexport type APIChallenge = {\n challenge: string;\n decodedChallenge: any;\n};\n\nexport async function decodeChallenge({\n apiNetwork,\n workspace,\n bearerToken,\n requestID,\n reviewType,\n}: {\n apiNetwork: Network;\n workspace: string;\n bearerToken: string;\n requestID: number;\n reviewType: ReviewType;\n}): Promise<APIChallenge> {\n let challengeUrl = `/requests/${requestID}/challenge`;\n if (reviewType === \"REJECT\") {\n challengeUrl = `${challengeUrl}/reject`;\n }\n const challengeResp = await apiNetwork<APIGetChallengeResponse>(\n \"GET\",\n challengeUrl,\n {},\n getAPIHeader(bearerToken, workspace),\n ).catch((error) => {\n // have to do this sh**t because settlement are transaction today so we have now way to know if this create transaction is part of a tradelink settlement\n if (error.message.includes(\"Get abort challenge is only available for tradelink settlement\")) {\n return { challenge: \"\" };\n }\n /* istanbul ignore next */\n throw error;\n });\n if (challengeResp.challenge === \"\") {\n return {\n challenge: \"\",\n decodedChallenge: \"\",\n };\n }\n return {\n challenge: challengeResp.challenge,\n decodedChallenge: decodeData(challengeResp.challenge),\n };\n}\n\nexport async function signAndApprove({\n apiNetwork,\n workspace,\n bearerToken,\n requestID,\n apiUser,\n challenge,\n reviewType,\n}: {\n apiNetwork: Network;\n workspace: string;\n bearerToken: string;\n requestID: number;\n apiUser: ManifestAPIV2User;\n challenge: string;\n reviewType: ReviewType;\n}): Promise<APIRequestResponse> {\n const keys = genKeys(apiUser.name);\n\n let jws = \"\";\n if (challenge !== \"\") {\n jws = sign(String(keys.privateKey), challenge);\n }\n\n return await apiNetwork<APIRequestResponse>(\n \"POST\",\n `/requests/${requestID}/${reviewType.toLowerCase()}`,\n { jws },\n getAPIHeader(bearerToken, workspace),\n );\n}\n\nexport async function getTradelinkPledge({\n apiNetwork,\n workspace,\n gateAccount,\n bearerToken,\n exchange,\n}: {\n apiNetwork: Network;\n workspace: string;\n gateAccount: GateAccount;\n bearerToken: string;\n exchange: string;\n}): Promise<TradelinkPledge> {\n const pledgesResp = await apiNetwork<Connection<TradelinkPledge>>(\n \"GET\",\n `/pledges?account_id=${gateAccount.id}`,\n {},\n getAPIHeader(bearerToken, workspace),\n );\n // find sub_account\n const pledgeResp = pledgesResp.edges.find((p) => p.node.exchange.name == exchange);\n /* istanbul ignore if */\n if (!pledgeResp) {\n throw new Error(`Exchange '${exchange}' not found`);\n }\n return pledgeResp.node;\n}\n\nexport async function getTradelinkRecipient({\n pool,\n gateAccount,\n pledge,\n}: {\n pool: DevicesPool;\n gateAccount: GateAccount;\n pledge: TradelinkPledge;\n}): Promise<string> {\n const exchangeWLId = pledge.exchange.whitelist_id;\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const wlResp = await admin.network<Connection<GateWhitelist>>(\n \"GET\",\n `/whitelists?id=${exchangeWLId}`,\n );\n /* istanbul ignore next */\n const wlAddress = wlResp.edges[0]?.node.addresses.find(\n (a) => a.currency === gateAccount.currency,\n )?.address;\n return String(wlAddress);\n}\n","import { SILENT_LOGGER } from \"@ledgerhq/vault-utils\";\nimport invariant from \"invariant\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport prepareRequest, {\n GateCreateAccountPayload,\n GateEditWorkspaceRulePayload,\n Input,\n performRequest,\n} from \"./prepareRequest\";\nimport { RecipeManifestResult } from \"./recipeManifest\";\nimport reviewAPIRequest from \"./reviewAPIRequest\";\nimport {\n BakeManifestOptions,\n Connection,\n DevicesPool,\n GateAPIV2UserAccessRequest,\n GateAccount,\n GateAccountRequest,\n GateEditWorkspaceRuleRequest,\n GateExchangeRequest,\n GateGenericRequest,\n GateGroupRequest,\n GatePolicyRequest,\n GateRequestType,\n GateTradelinkAssetManagerRequest,\n GateTradelinkEntity,\n GateTradelinkExchangeRequest,\n GateTradelinkNetwork,\n GateTradelinkRequest,\n GateUserRequest,\n GateVaultEntityRequest,\n GateWhitelistRequest,\n GateWorkspaceRuleStep,\n MRBakeAccountParams,\n MRBakeExchangeParams,\n MRBakeGroupParams,\n MRBakePolicyParams,\n MRBakeTradelinkEntityOnboardingParams,\n MRBakeTradelinkEntityParams,\n MRBakeTradelinkNetworkParams,\n MRBakeTradelinkOnboardingParams,\n MRBakeVaultEntityParams,\n MRBakeWhitelistParams,\n MRCreateAPIUserParams,\n MRCreateAPIV2UserParams,\n MRCreateUserParams,\n MREditQuorumParams,\n MREditWorkspaceRuleParams,\n ManifestRunner,\n} from \"./types\";\nimport { unwrapConnection, wait } from \"./utils\";\n\nconst createDefaultRunner = (pool: DevicesPool, options: BakeManifestOptions): ManifestRunner => {\n const { twoStepsRequest } = options;\n\n const basicHandler = <R>(type: GateRequestType, options?: { withoutHSM: boolean }) => {\n return async (\n params:\n | MRBakeGroupParams\n | MRBakeAccountParams\n | MRBakeVaultEntityParams\n | MRBakeWhitelistParams\n | MRBakeExchangeParams\n | MRBakePolicyParams,\n ) => {\n const { data, existingRequest, noApproval } = params;\n const payload = prepareRequest({ type, data } as Input);\n const extra = { noApproval, existingRequest, twoStepsRequest, ...options };\n return performRequest<R>(payload, pool, extra);\n };\n };\n\n const createAccount = async (params: MRBakeAccountParams) => {\n const { account, data, tradelinkAM } = params;\n if (\"readOnly\" in account && account.readOnly) {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const payload = prepareRequest({ type: \"CREATE_ACCOUNT\", data }) as GateCreateAccountPayload;\n return admin.post<GateAccountRequest>(\"/dev/accounts\", payload);\n }\n\n let res;\n try {\n res = await basicHandler<GateAccountRequest>(\"CREATE_ACCOUNT\")(params);\n\n if (tradelinkAM) {\n // get the activation request id\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const reqResp = await admin.get<Connection<GateAccountRequest>>(\n `/requests?page=1&type=ACTIVATE&target_id=${res.account.id}`,\n );\n const requests: GateAccountRequest[] = unwrapConnection(reqResp);\n const activationRequest = requests[0];\n\n /* istanbul ignore if */\n if (!activationRequest) {\n throw new Error(`No account activation request found for account ${res.account.name}`);\n }\n /* istanbul ignore if */\n if (!pool.apiGateway) {\n throw new Error(\"apiGateway URL is not set\");\n }\n await reviewAPIRequest(\n {\n pool,\n requestID: activationRequest.id,\n apiUser: tradelinkAM,\n gate: pool.gate,\n apiGateway: pool.apiGateway,\n reviewType: \"APPROVE\",\n },\n { logger: SILENT_LOGGER },\n );\n }\n } catch (err) {\n //\n // VG-18856 mitigate airdropped account when syncing the parent while children accounts\n // are described in manifest\n //\n /* istanbul ignore else */\n if (\n err instanceof Error &&\n err.name === \"ACCOUNT_CHILD_ALREADY_EXISTED_EXCEPTION\" &&\n \"contractAddress\" in account &&\n !!account.parentAccount\n ) {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const parentAccountsConnection = await admin.network<Connection<GateAccount>>(\n \"GET\",\n `/accounts?name=${account.parentAccount}`,\n );\n const parentAccountEdge = parentAccountsConnection.edges.find(\n (e) => e.node.name === account.parentAccount,\n );\n invariant(parentAccountEdge, `Parent account not found for ${account.name}`);\n const parentAccount = parentAccountEdge.node;\n const rawCurrencyQuery = `${parentAccount.currency}:${account.contractAddress}`;\n const currencyQuery = encodeURIComponent(rawCurrencyQuery);\n const potentialAccounts = await admin.network<Connection<GateAccount>>(\n \"GET\",\n `/accounts?currency=${currencyQuery}&index=${parentAccount.index}`,\n );\n invariant(\n potentialAccounts.edges.length === 1,\n `We should have one matching token account for ${currencyQuery} (index: ${parentAccount.index})`,\n );\n const existingAccount = potentialAccounts.edges[0]!.node;\n const editParams: MRBakeAccountParams = {\n ...params,\n data: { ...params.data, existingAccount },\n };\n res = await basicHandler<GateAccountRequest>(\"EDIT_ACCOUNT\")(editParams);\n } else {\n throw err;\n }\n }\n\n // VG-17223 optionally wait for account to be active\n if (params.waitForActive) {\n const accountId = res.target_id;\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n\n for (let i = 0; i < 60; i++) {\n const account = await admin.get<GateAccount>(`/accounts/${accountId}`);\n if (account.status === \"ACTIVE\") {\n res.account = account;\n break;\n }\n /* istanbul ignore next */\n await wait(3e3);\n }\n }\n return res;\n };\n\n const createUser = async (params: MRCreateUserParams) => {\n const { role, userID, name, device } = params;\n const type = role === \"operator\" ? \"CREATE_OPERATOR\" : \"CREATE_ADMIN\";\n const data = { userID, role, name };\n const payload = prepareRequest({ type, data });\n const extra = { noApproval: true };\n const req = await performRequest<GateUserRequest>(payload, pool, extra);\n const res = await pool.registerDevice(device, req);\n req.user.pub_key = res.u2f_key.pubKey;\n if (!options.noApproval) {\n await pool.runWithQuorum((admin) => admin.approveRequest(req));\n }\n return req;\n };\n\n const createAPIUser = async (\n params: MRCreateAPIUserParams,\n manifestFromGate: RecipeManifestResult,\n ) => {\n const { user, name, userID } = params;\n let request: GateUserRequest | null =\n manifestFromGate.rawData.pendingUserRequests.find((e) => e.user.username === name) || null;\n if (!request) {\n // Tries to invite user -> PENDING_REGISTRATION status if successful (creation/invitation of user from admin front)\n request = await performRequest<GateUserRequest>(\n {\n type: \"CREATE_OPERATOR\",\n username: name,\n user_id: userID,\n is_api: true,\n view_all_override: user.viewAll,\n },\n pool,\n { noApproval: true },\n );\n }\n if (request.status != \"PENDING_APPROVAL\")\n // Tries to register user -> PENDING_APPROVAL status if successful (api user from api)\n await pool.lamAPI.registerUser(name, request.url_id);\n if (!options.noApproval) {\n // Approves registration request (admin in front)\n await pool.runWithQuorum((admin) => admin.approveRequest(request));\n }\n return request;\n };\n\n const createAPIV2User = async (params: MRCreateAPIV2UserParams) => {\n const { name, publicKey, role } = params;\n const type = \"CREATE_API_USER\";\n const data = { publicKey, name, role };\n const payload = prepareRequest({ type, data });\n const extra = { noApproval: true };\n const req = await performRequest<GateUserRequest>(payload, pool, extra);\n if (!options.noApproval) {\n await pool.runWithQuorum((admin) => admin.approveRequest(req));\n }\n return req;\n };\n\n const createAPIV2UserAccess = async (params: MRCreateAPIV2UserParams) => {\n const { name } = params;\n const type = \"CREATE_API_USER_ACCESS\";\n const data = { name };\n const payload = prepareRequest({ type, data });\n const extra = { noApproval: true };\n return await performRequest<GateAPIV2UserAccessRequest>(payload, pool, extra);\n };\n\n const createTradelinkEntity = async <T extends \"ASSET_MANAGER\" | \"EXCHANGE\" | \"CUSTODIAN\">(\n params: MRBakeTradelinkEntityParams,\n ) => {\n const { tradelinkEntity, type } = params;\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const data = {\n id: tradelinkEntity.id,\n name: tradelinkEntity.name,\n code: tradelinkEntity.code,\n logo_url: tradelinkEntity.logoUrl,\n };\n return await admin.post<GateTradelinkEntity<T>>(`/tradelink/${type}`, data);\n };\n\n const createTradelinkNetwork = async (params: MRBakeTradelinkNetworkParams) => {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const data = {\n id: uuidv4(),\n custodian: params.custodians[0],\n exchanges: params.exchanges,\n asset_managers: params.assetManagers,\n };\n // we keep deleting and create TL network in case manifest got updated\n await admin.network<GateTradelinkNetwork>(\"DELETE\", \"/tradelink/network\").catch(\n /* istanbul ignore next */\n (error) => {\n if (error.message.includes(\"404\")) {\n // Handle 404 error: if there is no network, it will return a 404 as there is nothing to delete\n } else {\n throw error;\n }\n },\n );\n return await admin.post<GateTradelinkNetwork>(`/tradelink/network`, data);\n };\n\n const createTradelink = async (params: MRBakeTradelinkOnboardingParams) => {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const request = await admin.post<GateTradelinkRequest>(`/requests`, params);\n await pool.runWithQuorum((admin) => admin.approveRequest(request));\n return request;\n };\n\n const onboardTradelinkEntity = async (params: MRBakeTradelinkEntityOnboardingParams) => {\n const { tradelinkEntity, type, tradelinkEntityApprover } = params;\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n let data = {};\n let request: GateTradelinkAssetManagerRequest | GateTradelinkExchangeRequest;\n if (type === \"exchanges\") {\n data = {\n type: \"CREATE_TRADELINK_EXCHANGE\",\n exchange_name: tradelinkEntity.name,\n operators: tradelinkEntity.operators,\n addresses: tradelinkEntity.addresses,\n };\n request = await admin.post<GateTradelinkExchangeRequest>(`/requests`, data);\n } else {\n data = {\n type: \"CREATE_TRADELINK_ASSET_MANAGER\",\n asset_manager_name: tradelinkEntity.name,\n operators: tradelinkEntity.operators,\n addresses: tradelinkEntity.addresses,\n };\n request = await admin.post<GateTradelinkAssetManagerRequest>(`/requests`, data);\n }\n await pool.runWithQuorum((admin) => admin.approveRequest(request));\n\n /* istanbul ignore next */\n if (!pool.apiGateway) {\n throw new Error(\"apiGateway URL is not set\");\n }\n // for now the API user have to approve the exchange request (soonTM a new operator request to activate)\n await reviewAPIRequest(\n {\n pool,\n requestID: request.id,\n apiUser: tradelinkEntityApprover,\n gate: pool.gate,\n apiGateway: pool.apiGateway,\n reviewType: \"APPROVE\",\n },\n { logger: SILENT_LOGGER },\n );\n return request;\n };\n\n const editQuorum = async (params: MREditQuorumParams) => {\n const { quorum } = params;\n const payload = prepareRequest({\n type: \"UPDATE_QUORUM\",\n data: { quorum },\n });\n await performRequest<GateGenericRequest>(payload, pool);\n };\n\n const editWorkspaceRule = async (params: MREditWorkspaceRuleParams) => {\n const { rule, usersByName } = params;\n const payload: GateEditWorkspaceRulePayload = {\n type: \"EDIT_WORKSPACE_RULE\",\n permission: rule.permission,\n edit_data: {\n steps: rule.steps.map((s): GateWorkspaceRuleStep => {\n return {\n quorum: s.quorum,\n users: s.users.map((username) => {\n const user = usersByName[username];\n invariant(user, `No user with name ${username}`);\n return user.pub_key;\n }),\n };\n }),\n },\n };\n await performRequest<GateEditWorkspaceRuleRequest>(payload, pool);\n };\n\n const runner: ManifestRunner = {\n editQuorum,\n editWorkspaceRule,\n createUser,\n createAPIUser,\n createAPIV2User,\n createAPIV2UserAccess,\n createGroup: basicHandler<GateGroupRequest>(\"CREATE_GROUP\"),\n editGroup: basicHandler<GateGroupRequest>(\"EDIT_GROUP\"),\n createAccount,\n editAccount: basicHandler<GateAccountRequest>(\"EDIT_ACCOUNT\"),\n createWhitelist: basicHandler<GateWhitelistRequest>(\"CREATE_WHITELIST\"),\n editWhitelist: basicHandler<GateWhitelistRequest>(\"EDIT_WHITELIST\"),\n createVaultEntity: basicHandler<GateVaultEntityRequest>(\"CREATE_ENTITY\", {\n withoutHSM: true,\n }),\n editVaultEntity: basicHandler<GateVaultEntityRequest>(\"EDIT_ENTITY\", {\n withoutHSM: true,\n }),\n createExchange: basicHandler<GateExchangeRequest>(\"IMPORT_EXCHANGE\", {\n withoutHSM: true,\n }),\n editExchange: basicHandler<GateExchangeRequest>(\"IMPORT_EXCHANGE\", {\n withoutHSM: true,\n }),\n createPolicy: basicHandler<GatePolicyRequest>(\"CREATE_POLICY\"),\n createTradelink,\n createTradelinkEntity,\n onboardTradelinkEntity,\n createTradelinkNetwork,\n };\n\n return runner;\n};\n\nexport default createDefaultRunner;\n","import invariant from \"invariant\";\n\nimport {\n DevicesPool,\n GateAccount,\n GateExchange,\n GateGenericRequest,\n GateGovernanceRule,\n GateGovernanceRulesSet,\n GateGroup,\n GatePolicy,\n GateRequestType,\n GateRuleMultiAuthStep,\n GateRuleSCI,\n GateRuleTransactionFilter,\n GateTokenCurrency,\n GateUser,\n GateVaultEntity,\n GateWhitelist,\n GateWorkspacePermission,\n GateWorkspaceRuleStep,\n ManifestAccount,\n ManifestAccountRule,\n ManifestAccountRuleMultiAuth,\n ManifestAccountRuleSCI,\n ManifestAccountRuleThreshold,\n ManifestAccountRuleWhitelist,\n ManifestExchange,\n ManifestGroup,\n ManifestPolicy,\n ManifestVaultEntity,\n ManifestWhitelist,\n Unit,\n WeirdGateERC20Token,\n WeirdGateGovernanceRule,\n WeirdGateGovernanceRulesSet,\n WeirdGateRuleMultiAuth,\n WeirdGateRuleMultiAuthStep,\n WeirdGateRuleThreshold,\n WeirdGateRuleWhitelist,\n WeirdGateTokenCurrency,\n} from \"./types\";\nimport {\n getAccountTypeByCurrency,\n getAccountUnit,\n getCurrencyUnit,\n serializeUnitValue,\n} from \"./utils\";\n\ntype PrepareRequestArgs<S, T> = {\n type: S;\n data: T;\n};\n\nexport type GateCreateUserPayload = {\n type: \"CREATE_ADMIN\" | \"CREATE_OPERATOR\";\n username: string;\n user_id: string;\n is_api?: boolean;\n view_all_override?: boolean;\n};\n\nexport type GateCreateAPIUserPayload = {\n type: \"CREATE_API_USER\";\n user_data: {\n username: string;\n public_key: string;\n role: string;\n };\n};\n\ntype GateCreateAPIV2UserAccessPayload = {\n type: \"CREATE_API_USER_ACCESS\";\n user_data: {\n username: string;\n };\n};\n\ntype GateMigrateUserPayload = {\n type: \"MIGRATE_ADMIN\" | \"MIGRATE_OPERATOR\";\n id: number;\n};\n\ntype GateCreateGroupPayload = {\n type: \"CREATE_GROUP\";\n name: string;\n description: string;\n members: number[];\n};\n\ntype GateMigrateGroupPayload = {\n type: \"MIGRATE_GROUP\";\n group_id: number;\n migration_data: {\n members: number[];\n };\n};\n\nexport type GateCreateLamUserPayload = {\n type: \"CREATE_OPERATOR\";\n username: string;\n user_id: number;\n};\n\ntype GateCreateAccountTradelinkPayload = {\n currency: string;\n custodian: number;\n asset_manager: number;\n exchanges: Array<{ id: number; auto_repledge_enabled: boolean; requires_pre_approval: boolean }>;\n};\n\nexport type GateCreateAccountPayload = {\n type: \"CREATE_ACCOUNT\";\n index?: number;\n account_type: string;\n account_data: {\n name: string;\n derivation_mode?: \"standard\" | \"native_segwit\";\n parent_account?: { id: number } | { name: string };\n currency?: { name: string };\n governance_rules?: WeirdGateGovernanceRulesSet[];\n token?: WeirdGateTokenCurrency;\n policy_id?: number;\n\n // legacy format for erc20 token (see VFE-951)\n erc20?: WeirdGateERC20Token;\n };\n tradelink_data?: GateCreateAccountTradelinkPayload;\n};\n\ntype GateEditAccountPayload = {\n type: \"EDIT_ACCOUNT\";\n account_id: number;\n edit_data: {\n erc20?: WeirdGateERC20Token;\n token?: WeirdGateTokenCurrency;\n governance_rules?: WeirdGateGovernanceRulesSet[];\n name: string;\n };\n};\n\ntype GateCreateVaultEntityPayload = {\n type: \"CREATE_ENTITY\";\n name: string;\n accounts: number[];\n};\n\ntype GateEditVaultEntityPayload = {\n type: \"EDIT_ENTITY\";\n entity_id: number;\n edit_data: {\n name: string;\n accounts: number[];\n };\n};\n\ntype GateMigrateAccountPayload = {\n type: \"MIGRATE_ACCOUNT\";\n account_id: number;\n migration_data: {\n currency?: string;\n derivation_mode?: \"STANDARD\" | \"NATIVE_SEGWIT\";\n governance_rules: WeirdGateGovernanceRulesSet[];\n name: string;\n };\n};\n\ntype GateEditGroupPayload = {\n type: \"EDIT_GROUP\";\n group_id: number;\n edit_data: {\n name: string;\n members: number[];\n };\n};\n\ntype GateAddressPayload = {\n name: string;\n currency: string;\n address: string;\n};\n\ntype GateCreateWhitelistPayload = {\n type: \"CREATE_WHITELIST\";\n name: string;\n whitelist_type?: \"TRANSACTION\" | \"SMART_CONTRACT\";\n description: string;\n addresses: GateAddressPayload[];\n};\n\ntype GateMigrateWhitelistPayload = {\n type: \"MIGRATE_WHITELIST\";\n whitelist_id: number;\n};\n\ntype GateEditWhitelistPayload = {\n type: \"EDIT_WHITELIST\";\n whitelist_id: number;\n edit_data: {\n name: string;\n addresses: GateAddressPayload[];\n };\n};\n\ntype GateCreateExchangePayload = {\n type: \"IMPORT_EXCHANGE\";\n exchange_data: {\n name: string;\n platform: string;\n governance_rules: WeirdGateGovernanceRulesSet[] | null;\n credentials: {\n apiKey: string;\n secret: string;\n };\n };\n};\n\ntype GateCreatePolicyPayload = {\n type: \"CREATE_POLICY\";\n policy_data: {\n name: string;\n currency?: { name: string };\n governance_rules: WeirdGateGovernanceRulesSet[];\n };\n};\n\nexport type UsersByDevice = Record<number, GateUser>;\nexport type UsersByName = Record<string, GateUser>;\nexport type GroupByName = Record<string, GateGroup>;\nexport type AccountsByName = Record<string, GateAccount>;\n\nexport type IDByName = {\n [_: string]: number;\n};\n\nexport type DataGroup = {\n group: ManifestGroup;\n usersByDevice: UsersByDevice;\n usersByName: UsersByName;\n existingGroup?: GateGroup;\n};\n\nexport type DataWhitelist = {\n whitelist: ManifestWhitelist;\n existingWhitelist?: GateWhitelist;\n};\n\nexport type DataExchange = {\n exchange: ManifestExchange;\n usersByDevice: UsersByDevice;\n usersByName: UsersByName;\n groupsIDsByName: Record<string, number>;\n existingExchange: GateExchange | void;\n};\n\nexport type DataPolicy = {\n policy: ManifestPolicy;\n usersByDevice: UsersByDevice;\n whitelistsIDsByName: IDByName;\n usersByName: UsersByName;\n groupsIDsByName: Record<string, number>;\n existingPolicy: GatePolicy | void;\n};\n\nexport type DataAccount = {\n account: ManifestAccount;\n existingAccount?: GateAccount;\n usersByDevice: UsersByDevice;\n usersByName: UsersByName;\n groupsIDsByName: IDByName;\n whitelistsIDsByName: IDByName;\n hsmAssetManagersIDsByName: IDByName;\n hsmExchangesIDsByName: IDByName;\n hsmCustodiansIDsByName: IDByName;\n policiesIDsByName: IDByName;\n accountsByName: { [key: string]: GateAccount };\n tokens: GateTokenCurrency[];\n};\n\nexport type DataVaultEntity = {\n vaultEntity: ManifestVaultEntity;\n existingVaultEntity?: GateVaultEntity;\n accountsByName: { [key: string]: GateAccount };\n};\n\nexport type DataUser = {\n userID: string;\n name: string;\n role: \"operator\" | \"admin\";\n};\n\nexport type DataAPIUser = {\n name: string;\n publicKey: string;\n role: string;\n};\n\nexport type DataAPIUserAccess = {\n name: string;\n};\n\ntype EditGroupInput = PrepareRequestArgs<\"EDIT_GROUP\", DataGroup>;\ntype CreateGroupInput = PrepareRequestArgs<\"CREATE_GROUP\", DataGroup>;\ntype EditWhitelistInput = PrepareRequestArgs<\"EDIT_WHITELIST\", DataWhitelist>;\n\ntype CreateWhitelistInput = PrepareRequestArgs<\"CREATE_WHITELIST\", DataWhitelist>;\n\ntype CreateUserInput = PrepareRequestArgs<\"CREATE_ADMIN\" | \"CREATE_OPERATOR\", DataUser>;\ntype CreateAPIUserInput = PrepareRequestArgs<\"CREATE_API_USER\", DataAPIUser>;\ntype CreateAPIUserAccessInput = PrepareRequestArgs<\"CREATE_API_USER_ACCESS\", DataAPIUserAccess>;\n\ntype CreateAccountInput = PrepareRequestArgs<\"CREATE_ACCOUNT\", DataAccount>;\ntype EditAccountInput = PrepareRequestArgs<\"EDIT_ACCOUNT\", DataAccount>;\n\ntype CreateVaultEntityInput = PrepareRequestArgs<\"CREATE_ENTITY\", DataVaultEntity>;\ntype EditVaultEntityInput = PrepareRequestArgs<\"EDIT_ENTITY\", DataVaultEntity>;\n\ntype CreateExchangeInput = PrepareRequestArgs<\"IMPORT_EXCHANGE\", DataExchange>;\n\ntype CreatePolicyInput = PrepareRequestArgs<\"CREATE_POLICY\", DataPolicy>;\n\ntype PrepareRequest<T, S> = (obj: T) => S;\n\ntype DataQuorum = {\n quorum: number;\n};\n\ntype EditQuorumInput = PrepareRequestArgs<\"UPDATE_QUORUM\", DataQuorum>;\ntype GateEditQuorumPayload = {\n type: \"UPDATE_QUORUM\";\n quorum: number;\n};\n\nexport type GateEditWorkspaceRulePayload = {\n type: \"EDIT_WORKSPACE_RULE\";\n permission: GateWorkspacePermission;\n edit_data: {\n steps: GateWorkspaceRuleStep[];\n };\n};\n\ntype PrepareEditQuorum = PrepareRequest<EditQuorumInput, GateEditQuorumPayload>;\n\ntype PrepareCreateUser = PrepareRequest<CreateUserInput, GateCreateUserPayload>;\ntype PrepareCreateAPIUser = PrepareRequest<CreateAPIUserInput, GateCreateAPIUserPayload>;\ntype PrepareCreateAPIV2UserAccess = PrepareRequest<\n CreateAPIUserAccessInput,\n GateCreateAPIV2UserAccessPayload\n>;\ntype PrepareEditGroup = PrepareRequest<EditGroupInput, GateEditGroupPayload>;\n\ntype PrepareCreateGroup = PrepareRequest<CreateGroupInput, GateCreateGroupPayload>;\n\ntype PrepareCreateAccount = PrepareRequest<CreateAccountInput, GateCreateAccountPayload>;\n\ntype PrepareEditAccount = PrepareRequest<EditAccountInput, GateEditAccountPayload>;\n\ntype PrepareCreateVaultEntity = PrepareRequest<\n CreateVaultEntityInput,\n GateCreateVaultEntityPayload\n>;\n\ntype PrepareEditVaultEntity = PrepareRequest<EditVaultEntityInput, GateEditVaultEntityPayload>;\n\ntype PrepareEditWhitelist = PrepareRequest<EditWhitelistInput, GateEditWhitelistPayload>;\n\ntype PrepareCreateWhitelist = PrepareRequest<CreateWhitelistInput, GateCreateWhitelistPayload>;\n\ntype PrepareCreateExchange = PrepareRequest<CreateExchangeInput, GateCreateExchangePayload>;\n\ntype PrepareCreatePolicy = PrepareRequest<CreatePolicyInput, GateCreatePolicyPayload>;\n\nexport const EMPTY_RULES_SETS: GateGovernanceRulesSet[] = [\n {\n name: \"Rule 1\",\n rules: [\n {\n type: \"MULTI_AUTHORIZATIONS\",\n data: [],\n },\n ],\n },\n];\n\nexport const prepareUserCreation: PrepareCreateUser = ({ data }) => {\n const { role, name, userID } = data;\n return {\n type: role === \"operator\" ? \"CREATE_OPERATOR\" : \"CREATE_ADMIN\",\n username: name,\n user_id: userID,\n };\n};\n\nexport const prepareAPIUserCreation: PrepareCreateAPIUser = ({ data }) => {\n const { publicKey, name, role } = data;\n return {\n type: \"CREATE_API_USER\",\n user_data: {\n username: name,\n public_key: publicKey,\n role,\n },\n };\n};\n\nexport const prepareAPIUserAccessCreation: PrepareCreateAPIV2UserAccess = ({ data }) => {\n const { name } = data;\n return {\n type: \"CREATE_API_USER_ACCESS\",\n user_data: {\n username: name,\n },\n };\n};\n\nexport const prepareAccountCreation: PrepareCreateAccount = ({ type, data }) => {\n const {\n account,\n usersByDevice,\n whitelistsIDsByName,\n groupsIDsByName,\n accountsByName,\n hsmCustodiansIDsByName,\n hsmAssetManagersIDsByName,\n hsmExchangesIDsByName,\n policiesIDsByName,\n usersByName,\n tokens,\n } = data;\n\n const allAccounts = Object.keys(accountsByName).map((key) => accountsByName[key]);\n\n const token =\n \"contractAddress\" in account\n ? tokens.find((t) => t.contract_address === account.contractAddress)\n : null;\n\n if (\"contractAddress\" in account && !token) {\n throw new Error(`Can't find token with contract address ${account.contractAddress}`);\n }\n\n let account_type = null;\n if (token?.family === \"ethereum\") {\n if (token.parent_currency === \"bsc\") {\n account_type = \"Bep20\";\n } else {\n account_type = \"Erc20\";\n }\n } else if (\"accountType\" in account) {\n account_type = account.accountType;\n } else if (\"currency\" in account) {\n account_type = getAccountTypeByCurrency(account.currency);\n }\n\n if (!account_type) {\n throw new Error(`Can't determine account type`);\n }\n\n const unit = getAccountUnit(account, tokens);\n const governance_rules =\n \"policy\" in account || (\"tradelink_data\" in account && !!account.tradelink_data)\n ? null\n : transformManifestRules({\n rules: account.rules,\n unit,\n usersByDevice,\n usersByName,\n whitelistsIDsByName,\n groupsIDsByName,\n // VG-18120 accounts *must* enforce having a tx-filter rule of type SEND for rules that are\n // not SCI and not \"any-other-type-of-filter\".\n enforceSendTxFilter: true,\n });\n\n const account_data = {\n name: account.name,\n ...(governance_rules ? { governance_rules } : {}),\n };\n\n if (\"policy\" in account && !!account.policy) {\n const policyID = policiesIDsByName[account.policy];\n if (typeof policyID === \"undefined\") {\n throw new Error(`Invalid policy name ${account.policy}`);\n }\n\n Object.assign(account_data, {\n policy_id: policiesIDsByName[account.policy],\n });\n }\n\n if (\"readOnly\" in account && !!account.readOnly) {\n Object.assign(account_data, {\n xpub: account.readOnly.xpub,\n extended_public_key: {\n public_key: account.readOnly.publicKey,\n chain_code: account.readOnly.chainCode,\n },\n address: account.readOnly.address,\n });\n }\n\n if (\"contractAddress\" in account && token) {\n const currencyName = token.parent_currency;\n const parentAccountName = account.parentAccount;\n\n // FIXME there is something weird in this code\n const parent_account = parentAccountName\n ? (() => {\n let parentAccountID = null;\n // FIXME why not using accountsByName\n // search in existing accounts\n const existingParentAccount = allAccounts.find(\n (a) => !!a && a.name === parentAccountName,\n );\n if (existingParentAccount) {\n parentAccountID = existingParentAccount.id;\n } else {\n const createdParentAccount = accountsByName[parentAccountName];\n if (!createdParentAccount) {\n return { name: parentAccountName };\n }\n parentAccountID = createdParentAccount.id;\n }\n return { id: parentAccountID };\n })()\n : null;\n\n // see VFE-951\n if (process.env.LEGACY_TOKENS) {\n const erc20 = {\n ticker: token.ticker,\n address: token.contract_address,\n decimals: token.units[0].magnitude,\n hsm_account_parameters: token.__legacy_hsm_account_parameters,\n hsm_signature: token.__legacy_hsm_signature,\n };\n Object.assign(account_data, { erc20 });\n } else {\n Object.assign(account_data, {\n token: { type: token.token_type, address: token.contract_address },\n });\n }\n\n Object.assign(account_data, {\n currency: { name: currencyName },\n parent_account,\n });\n }\n\n if (\"currency\" in account) {\n Object.assign(account_data, {\n currency: {\n name: account.currency,\n },\n });\n\n if (\"derivationMode\" in account) {\n Object.assign(account_data, {\n derivation_mode: account.derivationMode,\n });\n }\n }\n\n let tradelinkData;\n if (\"tradelink_data\" in account && !!account.tradelink_data) {\n const custodianID = hsmCustodiansIDsByName[account.tradelink_data.custodian.name];\n /* istanbul ignore if */\n if (typeof custodianID === \"undefined\")\n throw new Error(`Invalid custodian name ${account.tradelink_data.custodian.name}`);\n\n const assetManagerID = hsmAssetManagersIDsByName[account.tradelink_data.asset_manager.name];\n /* istanbul ignore if */\n if (typeof assetManagerID === \"undefined\")\n throw new Error(`Invalid asset manager name ${account.tradelink_data.asset_manager.name}`);\n\n tradelinkData = {\n currency: account.tradelink_data.currency,\n custodian: custodianID,\n asset_manager: assetManagerID,\n exchanges: account.tradelink_data.exchanges.map((exchange) => {\n const exchangeID = hsmExchangesIDsByName[exchange.name];\n /* istanbul ignore if */\n if (typeof exchangeID === \"undefined\")\n throw new Error(`Invalid exchange name ${exchange.name}`);\n return {\n auto_repledge_enabled: exchange.auto_repledge_enabled,\n requires_pre_approval: exchange.requires_pre_approval,\n id: exchangeID,\n };\n }),\n };\n }\n\n return {\n type,\n ...(account.index !== undefined ? { index: account.index } : {}),\n ...(tradelinkData ? { tradelink_data: tradelinkData } : {}),\n account_type,\n account_data,\n };\n};\n\nconst prepareAccountEdition: PrepareEditAccount = ({ type, data }) => {\n const {\n account,\n existingAccount,\n usersByDevice,\n usersByName,\n whitelistsIDsByName,\n groupsIDsByName,\n tokens,\n } = data;\n\n /* istanbul ignore if */\n if (!existingAccount) {\n throw new Error(\"No existingAccount given\");\n }\n\n const unit = getAccountUnit(account, tokens);\n const governance_rules = transformManifestRules({\n rules: account.rules,\n unit,\n usersByDevice,\n usersByName,\n whitelistsIDsByName,\n groupsIDsByName,\n enforceSendTxFilter: true,\n });\n\n const edit_data = {\n name: account.name,\n governance_rules,\n };\n\n if (\"contractAddress\" in account) {\n const token = tokens.find((t) => t.contract_address === account.contractAddress);\n\n /* istanbul ignore if */\n if (!token) {\n throw new Error(`Can't find token with contract address ${account.contractAddress}`);\n }\n\n // see VFE-951\n if (process.env.LEGACY_TOKENS) {\n const erc20 = {\n ticker: token.ticker,\n address: token.contract_address,\n decimals: token.units[0].magnitude,\n hsm_account_parameters: token.__legacy_hsm_account_parameters,\n hsm_signature: token.__legacy_hsm_signature,\n };\n Object.assign(edit_data, { erc20 });\n } else {\n Object.assign(edit_data, {\n token: { type: \"erc20\", address: token.contract_address },\n });\n }\n }\n\n return {\n type,\n account_id: existingAccount.id,\n edit_data,\n };\n};\n\nconst serializeGroupMembers = (\n groupUsers: Array<string | number>,\n { usersByDevice, usersByName }: { usersByDevice: UsersByDevice; usersByName: UsersByName },\n): number[] => {\n return groupUsers.map((device) => {\n if (typeof device === \"number\") {\n const u = usersByDevice[device];\n /* istanbul ignore if */\n if (!u) throw new Error(`Invalid device ${device}`);\n return u.id;\n } else {\n const u = usersByName[device];\n /* istanbul ignore if */\n if (!u) throw new Error(`Invalid user name ${device}`);\n return u.id;\n }\n });\n};\n\nconst prepareGroupCreation: PrepareCreateGroup = ({ type, data }) => {\n const { group } = data;\n const members = serializeGroupMembers(group.users, data);\n return {\n type,\n name: group.name,\n description: group.description || \"\",\n members,\n };\n};\n\nconst prepareGroupEdition: PrepareEditGroup = ({ type, data }) => {\n const { group, existingGroup } = data;\n /* istanbul ignore if */\n if (!existingGroup) {\n throw new Error(\"No existingGroup given\");\n }\n const members = serializeGroupMembers(group.users, data);\n return {\n type,\n name: group.name,\n description: group.description || \"\",\n group_id: existingGroup.id,\n edit_data: {\n name: group.name,\n members,\n },\n };\n};\n\nconst serializeVaultEntityAccounts = (\n vaultEntityAccounts: string[],\n { accountsByName }: { accountsByName: AccountsByName },\n): number[] => {\n return vaultEntityAccounts.map((accountName) => {\n const a = accountsByName[accountName];\n /* istanbul ignore if */\n if (!a) throw new Error(`Invalid account ${accountName}`);\n return a.id;\n });\n};\n\nconst prepareVaultEntityCreation: PrepareCreateVaultEntity = ({ type, data }) => {\n const {\n vaultEntity: { name, accounts },\n } = data;\n return {\n type,\n name,\n accounts: accounts ? serializeVaultEntityAccounts(accounts, data) : [],\n };\n};\n\nconst prepareVaultEntityEdition: PrepareEditVaultEntity = ({ type, data }) => {\n const { vaultEntity, existingVaultEntity } = data;\n /* istanbul ignore if */\n if (!existingVaultEntity) {\n throw new Error(\"No existing VaultEntity given\");\n }\n return {\n type,\n entity_id: existingVaultEntity.id,\n edit_data: {\n name: vaultEntity.name,\n accounts: vaultEntity.accounts\n ? serializeVaultEntityAccounts(vaultEntity.accounts, data)\n : [],\n },\n };\n};\n\nconst prepareWhitelistCreation: PrepareCreateWhitelist = ({ type, data }) => {\n const { whitelist } = data;\n const addresses = whitelist.addresses.map((a, i) => ({\n ...a,\n name: a.name || `${a.currency}-${i + 1}`,\n }));\n return {\n type,\n name: whitelist.name,\n description: whitelist.description || \"\",\n addresses,\n ...(whitelist.type && { whitelist_type: whitelist.type }),\n };\n};\n\nconst prepareWhitelistEdition: PrepareEditWhitelist = ({ type, data }) => {\n const { whitelist, existingWhitelist } = data;\n /* istanbul ignore if */\n if (!existingWhitelist) {\n throw new Error(`No existingWhitelist given`);\n }\n const addresses = whitelist.addresses.map((a, i) => ({\n ...a,\n name: a.name || `${a.currency}-${i + 1}`,\n }));\n return {\n type,\n name: whitelist.name,\n description: \"\",\n whitelist_id: existingWhitelist.id,\n edit_data: {\n name: whitelist.name,\n addresses,\n },\n };\n};\n\nconst prepareExchangeCreation: PrepareCreateExchange = ({ type, data }) => {\n const { exchange, usersByDevice, usersByName, groupsIDsByName } = data;\n const governance_rules = exchange.rules\n ? transformManifestRules({ rules: exchange.rules, usersByDevice, usersByName, groupsIDsByName })\n : [];\n return {\n type,\n exchange_data: {\n name: exchange.name,\n governance_rules,\n platform: exchange.platform,\n credentials: {\n apiKey: exchange.configuration.apiKey,\n secret: exchange.configuration.apiSecret,\n },\n },\n };\n};\n\nconst preparePolicyCreation: PrepareCreatePolicy = ({ type, data }) => {\n const { policy, usersByName, usersByDevice, groupsIDsByName, whitelistsIDsByName } = data;\n\n const unit = data.policy.currency ? getCurrencyUnit(data.policy.currency) : undefined;\n const governance_rules = transformManifestRules({\n rules: policy.rules,\n unit,\n usersByDevice,\n usersByName,\n groupsIDsByName,\n whitelistsIDsByName,\n });\n\n return {\n type,\n policy_data: {\n name: policy.name,\n governance_rules,\n ...(policy.currency ? { currency: { name: policy.currency } } : {}),\n },\n };\n};\n\nconst prepareQuorumEdition: PrepareEditQuorum = ({ data }) => {\n return {\n type: \"UPDATE_QUORUM\",\n quorum: data.quorum,\n };\n};\n\nexport type Input =\n | EditQuorumInput\n | CreateAPIUserInput\n | CreateUserInput\n | CreateAPIUserAccessInput\n | CreateGroupInput\n | EditGroupInput\n | CreateWhitelistInput\n | EditWhitelistInput\n | CreateExchangeInput\n | CreatePolicyInput\n | CreateAccountInput\n | EditAccountInput\n | CreateVaultEntityInput\n | EditVaultEntityInput;\n\nexport type Output =\n | GateEditQuorumPayload\n | GateEditWorkspaceRulePayload\n | GateCreateAPIUserPayload\n | GateCreateAPIV2UserAccessPayload\n | GateCreateUserPayload\n | GateMigrateUserPayload\n | GateCreateGroupPayload\n | GateMigrateGroupPayload\n | GateEditGroupPayload\n | GateEditWhitelistPayload\n | GateCreateWhitelistPayload\n | GateMigrateWhitelistPayload\n | GateCreateExchangePayload\n | GateCreatePolicyPayload\n | GateCreateAccountPayload\n | GateCreateLamUserPayload\n | GateEditAccountPayload\n | GateMigrateAccountPayload\n | GateCreateVaultEntityPayload\n | GateEditVaultEntityPayload;\n\nconst prepareRequest = (data: Input): Output => {\n if (data.type === \"EDIT_GROUP\") {\n return prepareGroupEdition(data);\n }\n\n if (data.type === \"CREATE_GROUP\") {\n return prepareGroupCreation(data);\n }\n if (data.type === \"EDIT_WHITELIST\") {\n return prepareWhitelistEdition(data);\n }\n if (data.type === \"CREATE_WHITELIST\") {\n return prepareWhitelistCreation(data);\n }\n if (data.type === \"CREATE_ACCOUNT\") {\n return prepareAccountCreation(data);\n }\n if (data.type === \"EDIT_ACCOUNT\") {\n return prepareAccountEdition(data);\n }\n if (data.type === \"CREATE_ENTITY\") {\n return prepareVaultEntityCreation(data);\n }\n if (data.type === \"EDIT_ENTITY\") {\n return prepareVaultEntityEdition(data);\n }\n if (data.type === \"CREATE_ADMIN\" || data.type === \"CREATE_OPERATOR\") {\n return prepareUserCreation(data);\n }\n if (data.type === \"CREATE_API_USER\") {\n return prepareAPIUserCreation(data);\n }\n\n if (data.type === \"CREATE_API_USER_ACCESS\") {\n return prepareAPIUserAccessCreation(data);\n }\n\n if (data.type === \"UPDATE_QUORUM\") {\n return prepareQuorumEdition(data);\n }\n if (data.type === \"IMPORT_EXCHANGE\") {\n return prepareExchangeCreation(data);\n }\n if (data.type === \"CREATE_POLICY\") {\n return preparePolicyCreation(data);\n }\n\n // @ts-ignore\n throw new Error(`Unhandled request type ${data.type}`);\n};\n\nconst getGroupID = (groupsIDsByName: IDByName, groupName: string) => {\n const groupID = groupsIDsByName[groupName];\n /* istanbul ignore if */\n if (typeof groupID === \"undefined\") throw new Error(`Invalid group name ${groupName}`);\n return groupID;\n};\n\nconst transformMultiAuthRuleFromManifest = (\n rule: ManifestAccountRuleMultiAuth,\n groupsIDsByName: IDByName,\n usersByDevice: UsersByDevice,\n usersByName: UsersByName,\n): WeirdGateRuleMultiAuth => {\n return {\n type: rule.type,\n data: rule.steps.map((step) => {\n return {\n quorum: step.quorum,\n ...(\"group\" in step\n ? { group_id: getGroupID(groupsIDsByName, step.group) }\n : {\n users: step.users.map((d) => {\n if (typeof d === \"number\") {\n const user = usersByDevice[d];\n /* istanbul ignore if */\n if (!user) throw new Error(`Invalid device ${d}`);\n return user.id;\n }\n const user = usersByName[d];\n /* istanbul ignore if */\n if (!user) throw new Error(`Invalid name ${d}`);\n return user.id;\n }),\n }),\n };\n }),\n };\n};\n\nconst transformWhitelistRuleFromManifest = (\n rule: ManifestAccountRuleWhitelist,\n whitelistsIDsByName: Record<string, number>,\n): WeirdGateRuleWhitelist => {\n return {\n type: rule.type,\n data: rule.whitelists.map((w) => {\n const whitelistID = whitelistsIDsByName[w];\n /* istanbul ignore if */\n if (typeof whitelistID === \"undefined\") throw new Error(`Invalid whitelist name ${w}`);\n return whitelistID;\n }),\n };\n};\n\nexport const transformSCIRuleFromManifest = (rule: ManifestAccountRuleSCI): GateRuleSCI => {\n return {\n type: rule.type,\n data: [\n {\n enabled: rule.enabled,\n },\n ],\n };\n};\n\nexport const transformTezosDelegationRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"TEZOS_DELEGATION\" } };\n};\n\nexport const transformPolkadotStakingRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"POLKADOT_STAKING\" } };\n};\n\nexport const transformSolanaStakingRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"SOLANA_STAKING\" } };\n};\nexport const transformMessageSigningRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"MESSAGE_SIGNING\" } };\n};\nexport const transformCreateSplTokenAccountRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"CREATE_SPL_TOKEN_ACCOUNT\" } };\n};\n\nexport const transformCardanoStakingRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"CARDANO_STAKING\" } };\n};\n\nexport const transformRawTransactionRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"RAW_SIGNING\" } };\n};\n\nexport const transformSendTransactionRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"SEND\" } };\n};\n\nexport const transformSmartContractDeploymentFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"DEPLOY_CONTRACT\" } };\n};\n\nexport const transformStakeTransactionRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"STAKE\" } };\n};\n\nexport const transformThresholdRuleFromManifest = (\n rule: ManifestAccountRuleThreshold,\n unit: Unit,\n): WeirdGateRuleThreshold => {\n return {\n type: rule.type,\n data: [\n {\n currency_type: \"CRYPTO\",\n ...(rule.max ? { max: serializeUnitValue(unit, rule.max) } : {}),\n min: serializeUnitValue(unit, rule.min || 0),\n },\n ],\n };\n};\n\nexport const transformManifestRules = ({\n rules,\n unit,\n usersByDevice,\n usersByName,\n whitelistsIDsByName,\n groupsIDsByName,\n enforceSendTxFilter,\n}: {\n rules: Array<ManifestAccountRule[]> | void;\n unit?: Unit;\n usersByDevice: UsersByDevice;\n usersByName: UsersByName;\n whitelistsIDsByName?: IDByName;\n groupsIDsByName: IDByName;\n // VG-18120 ability to enforce `SEND` transaction filter if no transaction filter is present\n enforceSendTxFilter?: boolean;\n}): WeirdGateGovernanceRulesSet[] => {\n const governance_rules =\n rules && rules.length\n ? rules.map((rules, i) => {\n return {\n name: `Rule ${i + 1}`,\n rules: rules.map((rule) => {\n if (rule.type === \"MULTI_AUTHORIZATIONS\") {\n return transformMultiAuthRuleFromManifest(\n rule,\n groupsIDsByName,\n usersByDevice,\n usersByName,\n );\n }\n if (rule.type === \"WHITELIST\") {\n invariant(\n whitelistsIDsByName,\n \"WHITELIST rule configured outside of account context\",\n );\n return transformWhitelistRuleFromManifest(rule, whitelistsIDsByName);\n }\n if (rule.type === \"THRESHOLD\") {\n invariant(unit, \"THRESHOLD: no unit provided\");\n\n return transformThresholdRuleFromManifest(rule, unit);\n }\n if (rule.type === \"SMART_CONTRACT_INTERACTION\") {\n return transformSCIRuleFromManifest(rule);\n }\n\n if (rule.type === \"DEPLOY_CONTRACT\") {\n return transformSmartContractDeploymentFromManifest();\n }\n\n if (rule.type === \"TEZOS_DELEGATION\") {\n return transformTezosDelegationRuleFromManifest();\n }\n if (rule.type === \"POLKADOT_STAKING\") {\n return transformPolkadotStakingRuleFromManifest();\n }\n if (rule.type === \"SOLANA_STAKING\") {\n return transformSolanaStakingRuleFromManifest();\n }\n if (rule.type === \"CARDANO_STAKING\") {\n return transformCardanoStakingRuleFromManifest();\n }\n if (rule.type === \"RAW_SIGNING\") {\n return transformRawTransactionRuleFromManifest();\n }\n if (rule.type === \"SEND\") {\n return transformSendTransactionRuleFromManifest();\n }\n if (rule.type === \"STAKE\") {\n return transformStakeTransactionRuleFromManifest();\n }\n if (rule.type === \"MESSAGE_SIGNING\") {\n return transformMessageSigningRuleFromManifest();\n }\n if (rule.type === \"CREATE_SPL_TOKEN_ACCOUNT\") {\n return transformCreateSplTokenAccountRuleFromManifest();\n }\n // @ts-ignore\n throw new Error(`Unhandled rule type ${rule.type}`);\n }),\n };\n })\n : getDefaultRule(usersByDevice);\n\n // VG-18120 ability to enforce `SEND` transaction filter if no transaction filter is present\n if (enforceSendTxFilter) {\n governance_rules.forEach((rulesSet) => {\n const hasTxFilterRule = !!rulesSet.rules.find((r) => r.type === \"TRANSACTION_FILTER\");\n const hasSCIRule = !!rulesSet.rules.find((r) => r.type === \"SMART_CONTRACT_INTERACTION\");\n if (!hasTxFilterRule && !hasSCIRule) {\n rulesSet.rules.unshift({ type: \"TRANSACTION_FILTER\", data: { preset: \"SEND\" } });\n }\n });\n }\n\n return governance_rules;\n};\n\nconst getDefaultRule = (usersByDevice: Record<string, GateUser>): WeirdGateGovernanceRulesSet[] => {\n const operatorsDevices = Object.keys(usersByDevice).filter((key) => {\n const u = usersByDevice[key];\n /* istanbul ignore if */\n if (!u) throw new Error(`Invalid device ${key}`);\n return u.role === \"OPERATOR\";\n });\n const lastCreatedOperatorDevice = operatorsDevices[0];\n /* istanbul ignore if */\n if (!lastCreatedOperatorDevice) {\n throw new Error(`Can't get the last created operator device`);\n }\n const lastCreatedOperator = usersByDevice[lastCreatedOperatorDevice];\n /* istanbul ignore if */\n if (!lastCreatedOperator) {\n throw new Error(`Can't get the last created operator`);\n }\n\n return [\n {\n name: \"Rule 1\",\n rules: [\n {\n type: \"MULTI_AUTHORIZATIONS\",\n data: [\n {\n quorum: 1,\n users: [lastCreatedOperator.id],\n },\n ],\n },\n ],\n },\n ];\n};\n\nexport const serializeToWeirdGateRulesSets = (\n rulesSets: GateGovernanceRulesSet[],\n): WeirdGateGovernanceRulesSet[] => {\n return rulesSets.map((rulesSet: GateGovernanceRulesSet): WeirdGateGovernanceRulesSet => {\n return {\n name: rulesSet.name,\n rules: rulesSet.rules.map((rule: GateGovernanceRule): WeirdGateGovernanceRule => {\n if (rule.type === \"MULTI_AUTHORIZATIONS\") {\n return {\n type: rule.type,\n data: rule.data.map((step: GateRuleMultiAuthStep): WeirdGateRuleMultiAuthStep => {\n if (step.group.is_internal) {\n return {\n quorum: step.quorum,\n users: step.group.members.map((member) => member.id),\n };\n }\n return {\n quorum: step.quorum,\n group_id: step.group.id,\n };\n }),\n };\n }\n if (rule.type === \"THRESHOLD\") {\n return {\n type: rule.type,\n data: [\n {\n currency_type: \"CRYPTO\",\n min: rule.data[0].min,\n ...(rule.data[0].max ? /* istanbul ignore next */ { max: rule.data[0].max } : {}),\n },\n ],\n };\n }\n if (rule.type === \"WHITELIST\") {\n return {\n type: rule.type,\n data: rule.data.map((whitelist) => whitelist.id),\n };\n }\n /* istanbul ignore next */\n return rule;\n }),\n };\n });\n};\n\nconst TWO_STEPS_CREATION_REQUESTS: GateRequestType[] = [\n \"CREATE_ACCOUNT\",\n \"CREATE_GROUP\",\n \"CREATE_TRANSACTION\",\n \"CREATE_WHITELIST\",\n \"EDIT_ACCOUNT\",\n \"EDIT_GROUP\",\n \"EDIT_WHITELIST\",\n \"REVOKE_USER\",\n \"UPDATE_QUORUM\",\n];\n\nexport const performRequest = async <T>(\n payload: Output,\n pool: DevicesPool,\n options?: {\n existingRequest?: GateGenericRequest | null;\n noApproval?: boolean;\n withoutHSM?: boolean;\n twoStepsRequest?: boolean;\n },\n): Promise<T> => {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n\n let request: GateGenericRequest | void | null = options?.existingRequest;\n\n if (!request) {\n const enableTwoStepsCreation =\n options?.twoStepsRequest && TWO_STEPS_CREATION_REQUESTS.includes(payload.type);\n\n if (enableTwoStepsCreation) {\n Object.assign(payload, { enable_two_step_request_creation: true });\n }\n\n const r = await admin.post<GateGenericRequest>(\"/requests\", payload);\n request = r;\n\n if (enableTwoStepsCreation) {\n const pingChallenge = async () => {\n try {\n await admin.post(`/requests/${r.id}/post-create`, {});\n } catch (err) /* istanbul ignore next */ {\n await pingChallenge();\n }\n };\n await pingChallenge();\n }\n }\n\n if (!options || !options.noApproval) {\n await pool.runWithQuorum((admin) =>\n options?.withoutHSM ? admin.approveRequestWithoutHSM(request) : admin.approveRequest(request),\n );\n }\n return request as unknown as T;\n};\n\nexport default prepareRequest;\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkTZJ54LD2js = require('./chunk-TZJ54LD2.js');
|
|
4
4
|
|
|
5
5
|
// src/createHSMBridge.ts
|
|
6
6
|
var _vaultutils = require('@ledgerhq/vault-utils');
|
|
@@ -17,7 +17,7 @@ function createHSMBridge(options) {
|
|
|
17
17
|
baseURL: hsmEndpoint,
|
|
18
18
|
httpsAgent
|
|
19
19
|
};
|
|
20
|
-
const hsmNetwork =
|
|
20
|
+
const hsmNetwork = _chunkTZJ54LD2js.createNetwork.call(void 0, hsmNetworkOptions);
|
|
21
21
|
const raw = _axios2.default.create({ baseURL: hsmEndpoint, httpsAgent });
|
|
22
22
|
return {
|
|
23
23
|
backupCompartment: async (cid) => {
|
|
@@ -85,4 +85,4 @@ var createHSMBridge_default = createHSMBridge;
|
|
|
85
85
|
|
|
86
86
|
|
|
87
87
|
exports.createHSMBridge_default = createHSMBridge_default;
|
|
88
|
-
//# sourceMappingURL=chunk-
|
|
88
|
+
//# sourceMappingURL=chunk-N6UGATIN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-N6UGATIN.js","../src/createHSMBridge.ts"],"names":[],"mappings":"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","file":"/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-N6UGATIN.js","sourcesContent":[null,"import { SILENT_LOGGER } from \"@ledgerhq/vault-utils\";\nimport axios from \"axios\";\nimport https from \"https\";\n\nimport createNetwork from \"./createNetwork\";\nimport { RunnableOptions } from \"./types\";\n\ntype HSMBridge = {\n backupCompartment: (cid: number) => Promise<HSMCompartmentBackup>;\n restoreCompartment: (\n cid: number,\n data: HSMCompartmentBackup,\n options?: RunnableOptions,\n ) => Promise<void>;\n initCompartment: (options?: RunnableOptions & { cid?: number }) => Promise<number>;\n resetCompartment: (compartmentID: number, options: RunnableOptions) => Promise<void>;\n};\n\ntype HSMSlot = {\n id: number;\n userId: number;\n lastUsed: string;\n};\n\ntype CreateHSMBridgeOptions = {\n hsmEndpoint: string;\n hsmCert: Buffer;\n hsmCertKey: Buffer;\n monotonicCountersSize?: number;\n fileSystemSize?: number;\n};\n\ntype HSMCompartmentBackup = {\n internalfs: string;\n counters: string;\n};\n\nfunction createHSMBridge(options: CreateHSMBridgeOptions): HSMBridge {\n const { monotonicCountersSize, fileSystemSize } = options;\n\n const httpsAgent = new https.Agent({\n cert: options.hsmCert,\n key: options.hsmCertKey,\n });\n\n // cf hsmaas code\n const hsmEndpoint = options.hsmEndpoint.replace(\"/process\", \"\");\n\n const hsmNetworkOptions = {\n baseURL: hsmEndpoint,\n httpsAgent,\n };\n\n const hsmNetwork = createNetwork(hsmNetworkOptions);\n const raw = axios.create({ baseURL: hsmEndpoint, httpsAgent });\n\n return {\n backupCompartment: async (cid: number): Promise<HSMCompartmentBackup> => {\n const [internalfs, counters] = await Promise.all([\n raw.get<Buffer>(`/compartments/${cid}/internalfs`, { responseType: \"arraybuffer\" }),\n raw.get<Buffer>(`/compartments/${cid}/counters`, { responseType: \"arraybuffer\" }),\n ]);\n return {\n internalfs: internalfs.data.toString(\"hex\"),\n counters: counters.data.toString(\"hex\"),\n };\n },\n restoreCompartment: async (\n cid: number,\n data: HSMCompartmentBackup,\n { logger = SILENT_LOGGER }: RunnableOptions = {},\n ): Promise<void> => {\n logger.info(\"Restoring internalfs...\");\n await raw.put(`/compartments/${cid}/internalfs`, Buffer.from(data.internalfs, \"hex\"));\n logger.info(\"Restoring counters...\");\n await raw.put(`/compartments/${cid}/counters`, Buffer.from(data.counters, \"hex\"));\n logger.success(\"Successfully restored compartment\");\n },\n initCompartment: async ({\n logger = SILENT_LOGGER,\n cid,\n }: RunnableOptions & { cid?: number } = {}) => {\n const res = (await hsmNetwork(\"POST\", \"/compartments\", {\n ...(cid !== undefined ? { id: cid } : {}),\n })) as { id: number };\n logger.info(`Created compartment ${res.id}`);\n return res.id;\n },\n resetCompartment: async (\n compartmentID: number,\n { logger = SILENT_LOGGER }: RunnableOptions,\n ) => {\n try {\n await hsmNetwork(\"DELETE\", `/compartments/${compartmentID}`);\n logger.info(`Removed compartment ${compartmentID}`);\n } catch (err) {\n /* istanbul ignore next */\n // @ts-expect-error\n logger.info(`Arf! Problem deleting compartment apparently: ${err.toString()}`);\n /* istanbul ignore next */\n logger.info(\"But let's pretend we don't care and let's continue\");\n }\n try {\n const slots: HSMSlot[] = await hsmNetwork(\"GET\", \"/slots\");\n const compartmentSlots = slots.filter((slot) => slot.userId === compartmentID);\n for (let i = 0; i < compartmentSlots.length; i++) {\n const slot = compartmentSlots[i];\n /* istanbul ignore if */\n if (!slot) throw new Error(\"Invalid slot\");\n await hsmNetwork(\"DELETE\", `/slots/${slot.id}`);\n logger.info(`Removed slot ${slot.id}`);\n }\n } catch (err) {\n /* istanbul ignore next */\n // @ts-expect-error\n logger.info(`Ouch! Little error there: ${err.toString()}`);\n /* istanbul ignore next */\n logger.info(\"There was a problem getting slots, but let's continue anyway, i mean.\");\n }\n const payload = { id: compartmentID };\n if (monotonicCountersSize) {\n Object.assign(payload, { monotonicCountersSize });\n }\n if (fileSystemSize) {\n Object.assign(payload, { fileSystemSize });\n }\n await hsmNetwork(\"POST\", \"/compartments\", payload);\n logger.info(`Created compartment ${compartmentID}`);\n },\n };\n}\n\nexport default createHSMBridge;\n"]}
|