@ledgerhq/vault-common 2.1.4 → 2.2.0

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @ledgerhq/vault-common@2.1.4 build /home/runner/work/vault-ts/vault-ts/packages/common
2
+ > @ledgerhq/vault-common@2.2.0 build /home/runner/work/vault-ts/vault-ts/packages/common
3
3
  > tsup
4
4
 
5
5
  CLI 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,44 +9,44 @@
9
9
  CLI Target: es2022
10
10
  CLI Cleaning output folder
11
11
  CJS Build start
12
- CJS lib/createHSMBridge.js 331.00 B
13
12
  CJS lib/crypto/utils.js 335.00 B
14
13
  CJS lib/types/index.js 329.00 B
14
+ CJS lib/createHSMBridge.js 331.00 B
15
15
  CJS lib/index.js 120.29 KB
16
- CJS lib/chunk-FHIMXJ7N.js 3.52 KB
16
+ CJS lib/chunk-R5RZM7VO.js 3.52 KB
17
17
  CJS lib/recipeManifest.js 349.00 B
18
- CJS lib/chunk-ODU2VY2U.js 17.66 KB
18
+ CJS lib/chunk-YAB42L5H.js 17.66 KB
19
19
  CJS lib/reviewAPIRequest.js 365.00 B
20
- CJS lib/chunk-33OZ4G5P.js 37.23 KB
21
- CJS lib/chunk-O535UIIL.js 3.39 KB
20
+ CJS lib/chunk-5KTWGTUF.js 37.27 KB
21
+ CJS lib/chunk-QH2K2MDV.js 3.39 KB
22
22
  CJS lib/utils.js 1.20 KB
23
- CJS lib/chunk-TLTMGY3E.js 29.23 KB
24
- CJS lib/chunk-3L2XDBZ2.js 8.65 KB
25
- CJS lib/chunk-IY7PGTWV.js 396.00 B
23
+ CJS lib/chunk-6NGBW7BG.js 29.85 KB
24
+ CJS lib/chunk-WCH2IYIJ.js 396.00 B
26
25
  CJS lib/chunk-PZ5AY32C.js 314.00 B
27
- CJS lib/createHSMBridge.js.map 293.00 B
26
+ CJS lib/chunk-3L2XDBZ2.js 8.65 KB
28
27
  CJS lib/crypto/utils.js.map 281.00 B
28
+ CJS lib/createHSMBridge.js.map 293.00 B
29
29
  CJS lib/types/index.js.map 269.00 B
30
30
  CJS lib/index.js.map 178.14 KB
31
- CJS lib/chunk-FHIMXJ7N.js.map 6.86 KB
31
+ CJS lib/chunk-R5RZM7VO.js.map 6.86 KB
32
32
  CJS lib/recipeManifest.js.map 288.00 B
33
- CJS lib/chunk-ODU2VY2U.js.map 36.38 KB
33
+ CJS lib/chunk-YAB42L5H.js.map 36.38 KB
34
34
  CJS lib/reviewAPIRequest.js.map 308.00 B
35
- CJS lib/chunk-33OZ4G5P.js.map 71.09 KB
36
- CJS lib/chunk-O535UIIL.js.map 5.19 KB
35
+ CJS lib/chunk-5KTWGTUF.js.map 71.12 KB
36
+ CJS lib/chunk-QH2K2MDV.js.map 5.19 KB
37
37
  CJS lib/utils.js.map 398.00 B
38
- CJS lib/chunk-3L2XDBZ2.js.map 20.30 KB
39
- CJS lib/chunk-TLTMGY3E.js.map 54.56 KB
38
+ CJS lib/chunk-6NGBW7BG.js.map 55.76 KB
39
+ CJS lib/chunk-WCH2IYIJ.js.map 52.44 KB
40
40
  CJS lib/chunk-PZ5AY32C.js.map 479.00 B
41
- CJS lib/chunk-IY7PGTWV.js.map 52.27 KB
42
- CJS ⚡️ Build success in 957ms
41
+ CJS lib/chunk-3L2XDBZ2.js.map 20.30 KB
42
+ CJS ⚡️ Build success in 922ms
43
43
  DTS Build start
44
- DTS ⚡️ Build success in 11238ms
44
+ DTS ⚡️ Build success in 11971ms
45
45
  DTS lib/createHSMBridge.d.ts 952.00 B
46
- DTS lib/index.d.ts 12.93 KB
46
+ DTS lib/index.d.ts 12.96 KB
47
47
  DTS lib/reviewAPIRequest.d.ts 836.00 B
48
48
  DTS lib/utils.d.ts 1.96 KB
49
49
  DTS lib/crypto/utils.d.ts 428.00 B
50
50
  DTS lib/recipeManifest.d.ts 704.00 B
51
- DTS lib/types/index.d.ts 5.84 KB
52
- DTS lib/index-JiLYVPat.d.ts 67.87 KB
51
+ DTS lib/types/index.d.ts 5.86 KB
52
+ DTS lib/index-C99kQ88p.d.ts 68.05 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @ledgerhq/vault-common
2
2
 
3
+ ## 2.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - b19da60: feat(policy): allow creating currency-less policies
8
+ - 702ad52: Add Tron testnet (shasta) support
9
+
10
+ ## 2.1.5
11
+
12
+ ### Patch Changes
13
+
14
+ - 4300b4f: fix(trc20) add GateTRC20Account type
15
+
3
16
  ## 2.1.4
4
17
 
5
18
  ### Patch Changes
@@ -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 _chunkO535UIILjs = require('./chunk-O535UIIL.js');
3
+ var _chunkQH2K2MDVjs = require('./chunk-QH2K2MDV.js');
4
4
 
5
5
 
6
6
 
@@ -9,7 +9,7 @@ var _chunkO535UIILjs = require('./chunk-O535UIIL.js');
9
9
 
10
10
 
11
11
 
12
- var _chunkTLTMGY3Ejs = require('./chunk-TLTMGY3E.js');
12
+ var _chunk6NGBW7BGjs = require('./chunk-6NGBW7BG.js');
13
13
 
14
14
 
15
15
 
@@ -85,12 +85,12 @@ var prepareAccountCreation = ({ type, data }) => {
85
85
  } else if ("accountType" in account) {
86
86
  account_type = account.accountType;
87
87
  } else if ("currency" in account) {
88
- account_type = _chunkTLTMGY3Ejs.getAccountTypeByCurrency.call(void 0, account.currency);
88
+ account_type = _chunk6NGBW7BGjs.getAccountTypeByCurrency.call(void 0, account.currency);
89
89
  }
90
90
  if (!account_type) {
91
91
  throw new Error(`Can't determine account type`);
92
92
  }
93
- const unit = _chunkTLTMGY3Ejs.getAccountUnit.call(void 0, account, tokens);
93
+ const unit = _chunk6NGBW7BGjs.getAccountUnit.call(void 0, account, tokens);
94
94
  const governance_rules = "tradelink_data" in account && !!account.tradelink_data ? null : transformManifestRules({
95
95
  rules: account.rules,
96
96
  unit,
@@ -211,7 +211,7 @@ var prepareAccountEdition = ({ type, data }) => {
211
211
  if (!existingAccount) {
212
212
  throw new Error("No existingAccount given");
213
213
  }
214
- const unit = _chunkTLTMGY3Ejs.getAccountUnit.call(void 0, account, tokens);
214
+ const unit = _chunk6NGBW7BGjs.getAccountUnit.call(void 0, account, tokens);
215
215
  const governance_rules = transformManifestRules({
216
216
  rules: account.rules,
217
217
  unit,
@@ -374,7 +374,7 @@ var prepareExchangeCreation = ({ type, data }) => {
374
374
  };
375
375
  var preparePolicyCreation = ({ type, data }) => {
376
376
  const { policy, usersByName, usersByDevice, groupsIDsByName, whitelistsIDsByName } = data;
377
- const unit = _chunkTLTMGY3Ejs.getCurrencyUnit.call(void 0, data.policy.currency);
377
+ const unit = data.policy.currency ? _chunk6NGBW7BGjs.getCurrencyUnit.call(void 0, data.policy.currency) : void 0;
378
378
  const governance_rules = transformManifestRules({
379
379
  rules: policy.rules,
380
380
  unit,
@@ -388,9 +388,7 @@ var preparePolicyCreation = ({ type, data }) => {
388
388
  policy_data: {
389
389
  name: policy.name,
390
390
  governance_rules,
391
- currency: {
392
- name: policy.currency
393
- }
391
+ ...policy.currency ? { currency: { name: policy.currency } } : {}
394
392
  }
395
393
  };
396
394
  };
@@ -528,8 +526,8 @@ var transformThresholdRuleFromManifest = (rule, unit) => {
528
526
  data: [
529
527
  {
530
528
  currency_type: "CRYPTO",
531
- ...rule.max ? { max: _chunkTLTMGY3Ejs.serializeUnitValue.call(void 0, unit, rule.max) } : {},
532
- min: _chunkTLTMGY3Ejs.serializeUnitValue.call(void 0, unit, rule.min || 0)
529
+ ...rule.max ? { max: _chunk6NGBW7BGjs.serializeUnitValue.call(void 0, unit, rule.max) } : {},
530
+ min: _chunk6NGBW7BGjs.serializeUnitValue.call(void 0, unit, rule.min || 0)
533
531
  }
534
532
  ]
535
533
  };
@@ -715,7 +713,7 @@ var createDefaultRunner = (pool, options) => {
715
713
  const reqResp = await admin.get(
716
714
  `/requests?page=1&type=ACTIVATE&target_id=${res.account.id}`
717
715
  );
718
- const requests = _chunkTLTMGY3Ejs.unwrapConnection.call(void 0, reqResp);
716
+ const requests = _chunk6NGBW7BGjs.unwrapConnection.call(void 0, reqResp);
719
717
  const activationRequest = requests[0];
720
718
  if (!activationRequest) {
721
719
  throw new Error(`No account activation request found for account ${res.account.name}`);
@@ -778,7 +776,7 @@ var createDefaultRunner = (pool, options) => {
778
776
  res.account = account2;
779
777
  break;
780
778
  }
781
- await _chunkTLTMGY3Ejs.wait.call(void 0, 3e3);
779
+ await _chunk6NGBW7BGjs.wait.call(void 0, 3e3);
782
780
  }
783
781
  }
784
782
  return res;
@@ -1127,8 +1125,8 @@ async function reviewAPIRequest({
1127
1125
  reviewType,
1128
1126
  skipDecodeChallenge = false
1129
1127
  }, { logger = _vaultutils.SILENT_LOGGER }) {
1130
- const workspace = _chunkTLTMGY3Ejs.getWorkspaceFromGate.call(void 0, gate);
1131
- const apiNetwork = _chunkO535UIILjs.createNetwork.call(void 0, {
1128
+ const workspace = _chunk6NGBW7BGjs.getWorkspaceFromGate.call(void 0, gate);
1129
+ const apiNetwork = _chunkQH2K2MDVjs.createNetwork.call(void 0, {
1132
1130
  baseURL: apiGateway
1133
1131
  });
1134
1132
  logger.info(`Authenticate for ${apiUser.name}`);
@@ -1173,4 +1171,4 @@ var reviewAPIRequest_default = reviewAPIRequest;
1173
1171
 
1174
1172
 
1175
1173
  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;
1176
- //# sourceMappingURL=chunk-33OZ4G5P.js.map
1174
+ //# sourceMappingURL=chunk-5KTWGTUF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-5KTWGTUF.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-5KTWGTUF.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\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 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 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 \"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 (\"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"]}
@@ -8,6 +8,33 @@ var _bs58 = require('bs58'); var _bs582 = _interopRequireDefault(_bs58);
8
8
 
9
9
  var _currencies = require('@ledgerhq/cryptoassets/lib/currencies');
10
10
  var vaultCoins = [
11
+ {
12
+ type: "CryptoCurrency",
13
+ // @ts-expect-error
14
+ id: "tron_testnet",
15
+ coinType: 60,
16
+ name: "Tron Testnet",
17
+ managerAppName: "Tron",
18
+ ticker: "tTRX",
19
+ countervalueTicker: "tTRX",
20
+ scheme: "tron",
21
+ color: "#6E4A4A",
22
+ family: "tron",
23
+ units: [
24
+ {
25
+ name: "tTRX",
26
+ code: "tTRX",
27
+ magnitude: 6
28
+ }
29
+ ],
30
+ explorerViews: [
31
+ {
32
+ tx: "https://shasta-tronscan.on.btfs.io/#/transaction/$hash",
33
+ address: "https://shasta-tronscan.on.btfs.io/#/address/$address",
34
+ token: "https://shasta-tronscan.on.btfs.io/#/token20/$address"
35
+ }
36
+ ]
37
+ },
11
38
  {
12
39
  type: "CryptoCurrency",
13
40
  // @ts-expect-error
@@ -1258,4 +1285,4 @@ var wait = (duration) => new Promise((resolve) => setTimeout(resolve, duration))
1258
1285
 
1259
1286
 
1260
1287
  exports.vaultCoins = vaultCoins; exports.getCryptoCurrencyById = getCryptoCurrencyById; exports.listCryptoCurrencies = listCryptoCurrencies; exports.getWorkspaceFromGate = getWorkspaceFromGate; exports.xpubToExtendedPubKey = xpubToExtendedPubKey; exports.queue = queue; exports.serializeUnitValue = serializeUnitValue; exports.getAccountUnit = getAccountUnit; exports.getGateAccountUnit = getGateAccountUnit; exports.getTokenUnit = getTokenUnit; exports.getCurrencyUnit = getCurrencyUnit; exports.deserializeUnitValue = deserializeUnitValue; exports.LIGHT_EVM_CURRENCIES = LIGHT_EVM_CURRENCIES; exports.getAccountTypeByCurrency = getAccountTypeByCurrency; exports.getCurrencyOrToken = getCurrencyOrToken; exports.getDefaultUsername = getDefaultUsername; exports.unwrapConnection = unwrapConnection; exports.extractSecureChannel = extractSecureChannel; exports.wait = wait;
1261
- //# sourceMappingURL=chunk-TLTMGY3E.js.map
1288
+ //# sourceMappingURL=chunk-6NGBW7BG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-6NGBW7BG.js","../src/utils.ts","../src/currencies.ts"],"names":[],"mappings":"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,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACF;AAEiC;AAC/B,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACG,EAAA;AACL;AAC2E;AAGrE,EAAA;AAeN;AAEyD;AACO,EAAA;AACvD,EAAA;AACC,IAAA;AACA,IAAA;AACE,IAAA;AACE,IAAA;AACD,IAAA;AACU,IAAA;AAAA;AAEnB,IAAA;AAAA;AAEa,IAAA;AACf,EAAA;AACF;AAKmB;AACgB,EAAA;AAEb,EAAA;AAC8C,IAAA;AACpD,IAAA;AAC0D,MAAA;AACtE,IAAA;AACoB,IAAA;AACtB,EAAA;AAC6C,EAAA;AAC/C;AAEuF;AAE/D,EAAA;AAExB;AAEuF;AAKtE;AACe,EAAA;AACY,EAAA;AACR,EAAA;AACpC;AAGwD;AD0iCwB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-6NGBW7BG.js","sourcesContent":[null,"import { BigNumber } from \"bignumber.js\";\nimport bs58 from \"bs58\";\n\nimport { getCryptoCurrencyById } from \"./currencies\";\nimport {\n AccountType,\n Connection,\n CurrencyOrToken,\n GateAccount,\n GateTokenCurrency,\n ManifestAccount,\n SecureChannel,\n TokenCurrency,\n Unit,\n} from \"./types\";\n\nexport function getWorkspaceFromGate(gate: string): string {\n const s = gate.split(\"/\");\n const workspace = s[s.length - 1];\n /* istanbul ignore if */\n if (!workspace) throw new Error(`Could not extract workspace from gate ${gate}`);\n return workspace;\n}\n\nexport type ExtendedPubKey = {\n chain_code: string;\n public_key: string;\n};\n\nexport function xpubToExtendedPubKey(xpub: string): ExtendedPubKey {\n const decoded = bs58.decode(xpub);\n const extendedPubKey = {\n chain_code: decoded\n .slice(13, 13 + 32)\n .toString(\"hex\")\n .toUpperCase(),\n public_key: decoded\n .slice(13 + 32, 13 + 32 + 33)\n .toString(\"hex\")\n .toUpperCase(),\n };\n return extendedPubKey;\n}\n\nexport const queue = <T>(items: T[], job: (output: T) => Promise<void>): Promise<void> =>\n items.reduce((promise, item) => promise.then(() => job(item)), Promise.resolve());\n\nexport function serializeUnitValue(unit: Unit, value: number | string): string {\n const multi = new BigNumber(10).exponentiatedBy(unit.magnitude);\n return new BigNumber(value).times(multi).toFixed();\n}\n\nexport function getAccountUnit(account: ManifestAccount, tokens: GateTokenCurrency[]): Unit {\n const unit =\n \"contractAddress\" in account\n ? getTokenUnit(account.contractAddress, tokens)\n : getCurrencyUnit(account.currency);\n return unit;\n}\n\nexport function getGateAccountUnit(account: GateAccount, tokens: GateTokenCurrency[]): Unit {\n const unit = account.contract_address\n ? getTokenUnit(account.contract_address, tokens)\n : getCurrencyUnit(account.currency);\n return unit;\n}\n\nexport function getTokenUnit(contractAddress: string, tokens: GateTokenCurrency[]): Unit {\n const token = tokens.find((t) => t.contract_address === contractAddress);\n if (!token) {\n throw new Error(`Can't find token with contract address ${contractAddress}`);\n }\n return token.units[0];\n}\n\nexport function getCurrencyUnit(currencyName: string): Unit {\n const currency = getCryptoCurrencyById(currencyName);\n return currency.units[0]!;\n}\n\nexport function deserializeUnitValue(unit: Unit, value: string): number {\n const multi = new BigNumber(10).exponentiatedBy(unit.magnitude);\n return new BigNumber(value).div(multi).toNumber();\n}\n\nexport const LIGHT_EVM_CURRENCIES = [\n \"ethereum_sepolia\",\n \"polygon_mumbai\",\n \"klaytn\",\n \"klaytn_baobab\",\n \"arbitrum\",\n \"arbitrum_goerli\",\n \"base_goerli\",\n \"optimism\",\n \"optimism_goerli\",\n \"flare\",\n \"flare_coston\",\n \"fantom\",\n \"fantom_testnet\",\n \"avalanche_c_chain\",\n \"avalanche_c_chain_fuji\",\n \"celo\",\n \"celo_alfajores\",\n \"cronos\",\n \"cronos_testnet\",\n \"filecoin\",\n \"filecoin_calibration\",\n \"kava_evm\",\n \"kava_evm_testnet\",\n \"tomo\",\n \"tomo_testnet\",\n \"viction\",\n \"viction_testnet\",\n \"sonic\",\n \"mantle\",\n];\n\nconst ETHEREUM_LIKE_CURRENCIES = [\n \"ethereum\",\n \"ethereum_ropsten\",\n \"ethereum_goerli\",\n \"ethereum_classic\",\n \"ethereum_holesky\",\n \"ethereum_hoodi\",\n \"polygon_amoy\",\n \"polygon\",\n \"bsc\",\n ...LIGHT_EVM_CURRENCIES,\n];\nexport const getAccountTypeByCurrency = (currency: string): AccountType => {\n return ETHEREUM_LIKE_CURRENCIES.includes(currency)\n ? \"Ethereum\"\n : currency === \"ripple\"\n ? \"Ripple\"\n : currency === \"stellar\"\n ? \"Stellar\"\n : currency === \"tezos\"\n ? \"Tezos\"\n : currency === \"polkadot\" || currency == \"westend\"\n ? \"Polkadot\"\n : currency === \"solana\" || currency === \"solana_testnet\" || currency === \"solana_devnet\"\n ? \"Solana\"\n : currency === \"cardano\" || currency === \"cardano_testnet\" || currency === \"cardano_devnet\"\n ? \"Cardano\"\n : currency === \"tron\"\n ? \"Tron\"\n : \"Bitcoin\";\n};\n\nconst toToken = (t: GateTokenCurrency): TokenCurrency => {\n const parentCurrency = getCryptoCurrencyById(t.parent_currency);\n return {\n type: \"TokenCurrency\",\n id: t.ticker,\n name: t.name,\n ticker: t.ticker,\n units: t.units,\n contractAddress: t.contract_address,\n // the currency it belongs to. e.g. 'ethereum,\n parentCurrency,\n // the type of token in the blockchain it belongs. e.g. 'erc20,\n tokenType: t.token_type,\n };\n};\n\nexport function getCurrencyOrToken(\n account: GateAccount,\n tokens: GateTokenCurrency[],\n): CurrencyOrToken {\n const isTokenAccount = !!account.contract_address;\n\n if (isTokenAccount) {\n const token = tokens.find((t) => t.contract_address === account.contract_address);\n if (!token) {\n throw new Error(`Cannot find token with contract address: ${account.contract_address}`);\n }\n return toToken(token);\n }\n return getCryptoCurrencyById(account.currency);\n}\n\nexport function getDefaultUsername(role: \"admin\" | \"operator\", device: number): string {\n return `${role === \"admin\" ? \"Admin\" : \"Operator\"} ${\n role === \"admin\" ? (device < 10 ? device - 3 : device) : device\n }`;\n}\n\nexport const unwrapConnection = <T>(c: Connection<T>): T[] => c.edges.map((n) => n.node);\n\nexport function extractSecureChannel(\n object: Record<string, unknown>,\n pub_key: string,\n): SecureChannel {\n if (object.request_id) return object as SecureChannel;\n if (object[pub_key]) return object[pub_key] as SecureChannel;\n throw new Error(\"No channel found\");\n}\n\nexport const wait = (duration: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, duration));\n","import {\n getCryptoCurrencyById as byId,\n listCryptoCurrencies as listCC,\n} from \"@ledgerhq/cryptoassets/lib/currencies\";\n\nimport { CryptoCurrency } from \"./types\";\n\nexport const vaultCoins: CryptoCurrency[] = [\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"tron_testnet\",\n coinType: 60,\n name: \"Tron Testnet\",\n managerAppName: \"Tron\",\n ticker: \"tTRX\",\n countervalueTicker: \"tTRX\",\n scheme: \"tron\",\n color: \"#6E4A4A\",\n family: \"tron\",\n units: [\n {\n name: \"tTRX\",\n code: \"tTRX\",\n magnitude: 6,\n },\n ],\n explorerViews: [\n {\n tx: \"https://shasta-tronscan.on.btfs.io/#/transaction/$hash\",\n address: \"https://shasta-tronscan.on.btfs.io/#/address/$address\",\n token: \"https://shasta-tronscan.on.btfs.io/#/token20/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"sonic\",\n coinType: 60,\n name: \"Sonic\",\n managerAppName: \"Sonic\",\n ticker: \"S\",\n countervalueTicker: \"S\",\n scheme: \"sonic\",\n color: \"#FE7823\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"mainnet\",\n chainId: 146,\n networkId: 146,\n },\n units: [\n {\n name: \"S\",\n code: \"S\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://sonicscan.org/tx/$hash\",\n address: \"https://sonicscan.org/address/$address\",\n token: \"https://sonicscan.org/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"mantle\",\n coinType: 60,\n name: \"Mantle\",\n managerAppName: \"Mantle\",\n ticker: \"MNT\",\n countervalueTicker: \"MNT\",\n scheme: \"mantle\",\n color: \"#003827\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"mainnet\",\n chainId: 5000,\n networkId: 5000,\n },\n units: [\n {\n name: \"MNT\",\n code: \"MNT\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://https://explorer.mantle.xyz/tx/$hash\",\n address: \"https://https://explorer.mantle.xyz/address/$address\",\n token: \"https://explorer.mantle.xyz/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"viction\",\n coinType: 60,\n name: \"Viction\",\n managerAppName: \"Viction\",\n ticker: \"VIC\",\n countervalueTicker: \"VIC\",\n scheme: \"viction\",\n color: \"#101010\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"mainnet\",\n chainId: 88,\n networkId: 88,\n },\n units: [\n {\n name: \"VIC\",\n code: \"VIC\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://vicscan.xyz/tx/$hash\",\n address: \"https://vicscan.xyz/address/$address\",\n token: \"https://vicscan.xyz/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"viction_testnet\",\n coinType: 60,\n name: \"VictionTestnet\",\n managerAppName: \"VictionTestnet\",\n ticker: \"tVIC\",\n countervalueTicker: \"tVIC\",\n scheme: \"viction_testnet\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 89,\n networkId: 89,\n },\n units: [\n {\n name: \"tVIC\",\n code: \"tVIC\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://testnet.vicscan.xyz/tx/$hash\",\n address: \"https://testnet.vicscan.xyz/address/$address\",\n token: \"https://testnet.vicscan.xyz/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"polygon_amoy\",\n coinType: 60,\n name: \"Polygon Amoy\",\n managerAppName: \"Polygon Amoy\",\n ticker: \"tPOL\",\n countervalueTicker: \"POL\",\n scheme: \"polygon_amoy\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 80002,\n networkId: 80002,\n },\n units: [\n {\n name: \"tPOL\",\n code: \"tPOL\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://amoy.polygonscan.com/tx/$hash\",\n address: \"https://amoy.polygonscan.com/address/$address\",\n token: \"https://amoy.polygonscan.com//token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"ethereum_hoodi\",\n coinType: 60,\n name: \"Ethereum Hoodi\",\n managerAppName: \"Ethereum Hoodi\",\n ticker: \"tETH\",\n countervalueTicker: \"tETH\",\n scheme: \"ethereum_hoodi\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 560048,\n networkId: 560048,\n },\n units: [\n {\n name: \"ether\",\n code: \"tETH\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://hoodi.etherscan.io/tx/$hash\",\n address: \"https://hoodi.etherscan.io/account/$address\",\n token: \"https://hoodi.etherscan.io/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"polymesh\",\n // @ts-expect-error\n coinType: 595,\n name: \"Polymesh\",\n managerAppName: \"Polymesh\",\n ticker: \"POLYX\",\n scheme: \"polymesh\",\n color: \"#ff2e72\",\n family: \"polymesh\",\n units: [\n {\n name: \"polyx\",\n code: \"POLYX\",\n magnitude: 8,\n },\n ],\n explorerViews: [\n {\n address: \"https://polymesh.subscan.io/account/$address\",\n tx: \"https://polymesh.subscan.io/extrinsic/$hash\",\n },\n ],\n // @ts-expect-error\n explorerId: \"polymesh\",\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"pivx\",\n // @ts-expect-error\n coinType: 77,\n name: \"PivX\",\n managerAppName: \"PivX\",\n ticker: \"PIVX\",\n scheme: \"pivx\",\n color: \"#46385d\",\n family: \"bitcoin\",\n blockAvgTime: 150,\n bitcoinLikeInfo: {\n P2PKH: 30,\n P2SH: 13,\n XPUBVersion: 0x022d2533,\n },\n units: [\n {\n name: \"pivx\",\n code: \"PIVX\",\n magnitude: 8,\n },\n {\n name: \"satoshi\",\n code: \"sat\",\n magnitude: 0,\n },\n ],\n explorerViews: [\n {\n tx: \"https://chainz.cryptoid.info/pivx/tx.dws?$hash.htm\",\n address: \"https://chainz.cryptoid.info/pivx/address.dws?$address.htm\",\n },\n ],\n // @ts-expect-error\n explorerId: \"pivx\",\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"westend\",\n // @ts-expect-error\n coinType: 23519,\n name: \"Westend\",\n managerAppName: \"Polkadot\",\n ticker: \"WND\",\n countervalueTicker: \"PDOT\",\n scheme: \"polkadot\",\n color: \"#E6007A\",\n family: \"polkadot\",\n units: [\n {\n name: \"WND\",\n code: \"WND\",\n magnitude: 12,\n },\n ],\n explorerViews: [\n {\n address: \"https://westend.subscan.io/account/$address\",\n tx: \"https://westend.subscan.io/extrinsic/$hash\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"ethereum_pow\",\n coinType: 60,\n name: \"Ethereum PoW\",\n managerAppName: \"Ethereum PoW\",\n ticker: \"ETHW\",\n countervalueTicker: \"ETHW\",\n scheme: \"ethereum_pow\",\n color: \"#6E89D5\",\n family: \"ethereum\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"mainnet\",\n chainId: 10001,\n networkId: 10001,\n },\n units: [\n {\n name: \"ETHW\",\n code: \"ETHW\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://www.oklink.com/en/ethw/tx/$hash\",\n address: \"https://www.oklink.com/en/ethw/address/$address\",\n token: \"https://www.oklink.com/en/ethw/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n id: \"klaytn\",\n // @ts-expect-error\n coinType: 8217,\n name: \"Klaytn\",\n managerAppName: \"Klaytn\",\n ticker: \"KLAY\",\n countervalueTicker: \"KLAY\",\n scheme: \"klaytn\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"mainnet\",\n chainId: 8217,\n networkId: 8217,\n },\n units: [\n {\n name: \"KLAY\",\n code: \"KLAY\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://scope.klaytn.com/tx/$hash\",\n address: \"https://scope.klaytn.com/account/$address\",\n token: \"https://scope.klaytn.com/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"klaytn_baobab\",\n // @ts-expect-error\n coinType: 8217,\n name: \"Klaytn Baobab\",\n managerAppName: \"Klaytn Baobab\",\n ticker: \"tKLAY\",\n countervalueTicker: \"tKLAY\",\n scheme: \"klaytn\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 1001,\n networkId: 1001,\n },\n units: [\n {\n name: \"tKLAY\",\n code: \"tKLAY\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://baobab.scope.klaytn.com/tx/$hash\",\n address: \"https://baobab.scope.klaytn.com/account/$address\",\n token: \"https://baobab.scope.klaytn.com/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n id: \"ethereum_holesky\",\n coinType: 60,\n name: \"Ethereum Holesky\",\n managerAppName: \"Ethereum Holesky\",\n ticker: \"tETH\",\n countervalueTicker: \"tETH\",\n scheme: \"ethereum_holesky\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 17000,\n networkId: 17000,\n },\n units: [\n {\n name: \"ether\",\n code: \"tETH\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://holesky.etherscan.io/tx/$hash\",\n address: \"https://holesky.etherscan.io/account/$address\",\n token: \"https://holesky.etherscan.io/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n id: \"ethereum_sepolia\",\n coinType: 60,\n name: \"Ethereum Sepolia\",\n managerAppName: \"Ethereum Sepolia\",\n ticker: \"sETH\",\n countervalueTicker: \"sETH\",\n scheme: \"ethereum_sepolia\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 11155111,\n networkId: 11155111,\n },\n units: [\n {\n name: \"ether\",\n code: \"sETH\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://sepolia.etherscan.io/tx/$hash\",\n address: \"https://sepolia.etherscan.io/account/$address\",\n token: \"https://sepolia.etherscan.io/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"base_goerli\",\n // @ts-expect-error\n coinType: 614,\n name: \"Base Goerli\",\n managerAppName: \"Base Goerli\",\n ticker: \"gETH\",\n countervalueTicker: \"gETH\",\n scheme: \"base_goerli\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 84531,\n networkId: 84531,\n },\n units: [\n {\n name: \"ether\",\n code: \"gETH\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://base-goerli.blockscout.com/tx/$hash\",\n address: \"https://base-goerli.blockscout.com/account/$address\",\n token: \"https://base-goerli.blockscout.com/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"arbitrum_goerli\",\n // @ts-expect-error\n coinType: 9001,\n name: \"Arbitrum Goerli\",\n managerAppName: \"Arbitrum Goerli\",\n ticker: \"gETH\",\n countervalueTicker: \"gETH\",\n scheme: \"arbitrum_goerli\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 421611,\n networkId: 421611,\n },\n units: [\n {\n name: \"ether\",\n code: \"gETH\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://testnet.arbiscan.io/tx/$hash\",\n address: \"https://testnet.arbiscan.io/account/$address\",\n token: \"https://testnet.arbiscan.io/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n id: \"avalanche_c_chain\",\n // @ts-expect-error\n coinType: 9005,\n name: \"Aavalanche C Chain\",\n managerAppName: \"Aavalanche C Chain\",\n ticker: \"AVAX\",\n countervalueTicker: \"AVAX\",\n scheme: \"avalanche_c_chain\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"mainnet\",\n chainId: 43114,\n networkId: 43114,\n },\n units: [\n {\n name: \"AVAX\",\n code: \"AVAX\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://snowtrace.io/tx/$hash\",\n address: \"https://snowtrace.io/address/$address\",\n token: \"https://snowtrace.io/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"avalanche_c_chain_fuji\",\n // @ts-expect-error\n coinType: 9005,\n name: \"Aavalanche C Chain Fuji\",\n managerAppName: \"Aavalanche C Chain Fuji\",\n ticker: \"AVAX\",\n countervalueTicker: \"AVAX\",\n scheme: \"avalanche_c_chain_fuji\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 43113,\n networkId: 43113,\n },\n units: [\n {\n name: \"fAVAX\",\n code: \"fAVAX\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://testnet.snowtrace.io/tx/$hash\",\n address: \"https://testnet.snowtrace.io/address/$address\",\n token: \"https://testnet.snowtrace.io/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"fantom_testnet\",\n // @ts-expect-error\n coinType: 1007,\n name: \"Fantom Testnet\",\n managerAppName: \"Fantom Testnet\",\n ticker: \"tFTM\",\n countervalueTicker: \"tFTM\",\n scheme: \"fantom_testnet\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 4002,\n networkId: 4002,\n },\n units: [\n {\n name: \"tFTM\",\n code: \"tFTM\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://testnet.ftmscan.com/tx/$hash\",\n address: \"https://testnet.ftmscan.com/address/$address\",\n token: \"https://testnet.ftmscan.com/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"flare_coston\",\n coinType: 60,\n name: \"Flare Coston\",\n managerAppName: \"Flare Coston\",\n ticker: \"tFLR\",\n countervalueTicker: \"tFLR\",\n scheme: \"flare_coston\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 16,\n networkId: 16,\n },\n units: [\n {\n name: \"tFLR\",\n code: \"tFLR\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://coston-explorer.flare.network/tx/$hash\",\n address: \"https://coston-explorer.flare.network/$address\",\n token: \"https://coston-explorer.flare.network/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n id: \"optimism\",\n // @ts-expect-error\n coinType: 614,\n name: \"Optimism\",\n managerAppName: \"Optimism\",\n ticker: \"ETH\",\n countervalueTicker: \"ETH\",\n scheme: \"optimism\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"mainnet\",\n chainId: 10,\n networkId: 10,\n },\n units: [\n {\n name: \"ether\",\n code: \"ETH\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://optimistic.etherscan.io/tx/$hash\",\n address: \"https://optimistic.etherscan.io/account/$address\",\n token: \"https://optimistic.etherscan.io/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"polygon_mumbai\",\n coinType: 60,\n name: \"Polygon Mumbai\",\n managerAppName: \"Polygon Mumbai\",\n ticker: \"tMATIC\",\n countervalueTicker: \"MATIC\",\n scheme: \"polygon_mumbai\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 80001,\n networkId: 80001,\n },\n units: [\n {\n name: \"tMATIC\",\n code: \"tMATIC\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://mumbai.polygonscan.com/tx/$hash\",\n address: \"https://mumbai.polygonscan.com/address/$address\",\n token: \"https://mumbai.polygonscan.com//token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"optimism_goerli\",\n // @ts-expect-error\n coinType: 614,\n name: \"Optimism Goerli\",\n managerAppName: \"Optimism Goerli\",\n ticker: \"gETH\",\n countervalueTicker: \"gETH\",\n scheme: \"optimism_goerli\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 420,\n networkId: 420,\n },\n units: [\n {\n name: \"gether\",\n code: \"gETH\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://goerli-optimism.etherscan.io/tx/$hash\",\n address: \"https://goerli-optimism.etherscan.io/account/$address\",\n token: \"https://goerli-optimism.etherscan.io/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"celo_alfajores\",\n coinType: 60,\n name: \"Celo Alfajores\",\n managerAppName: \"Celo Alfajores\",\n ticker: \"tCELO\",\n countervalueTicker: \"tCELO\",\n scheme: \"celo_alfojores\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 44787,\n networkId: 44787,\n },\n units: [\n {\n name: \"tCELO\",\n code: \"tCELO\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://alfajores.celoscan.io/tx/$hash\",\n address: \"https://alfajores.celoscan.io/address/$address\",\n token: \"https://alfajores.celoscan.io/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"cronos_testnet\",\n coinType: 60,\n name: \"Cronos Testnet\",\n managerAppName: \"Cronos Testnet\",\n ticker: \"tCRO\",\n countervalueTicker: \"tCRO\",\n scheme: \"cronos_testnet\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 338,\n networkId: 338,\n },\n units: [\n {\n name: \"tCRO\",\n code: \"tCRO\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://cronos.org/explorer/testnet3/tx/$hash\",\n address: \"https://cronos.org/explorer/testnet3/address/$address\",\n token: \"https://cronos.org/explorer/testnet3/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"kava_evm\",\n coinType: 60,\n name: \"Kava EVM\",\n managerAppName: \"Kava EVM\",\n ticker: \"KAVA\",\n countervalueTicker: \"KAVA\",\n scheme: \"kava_evm\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"mainnet\",\n chainId: 2222,\n networkId: 2222,\n },\n units: [\n {\n name: \"KAVA\",\n code: \"KAVA\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://explorer.kava.io/tx/$hash\",\n address: \"https://explorer.kava.io/address/$address\",\n token: \"https://explorer.kava.io/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"kava_evm_testnet\",\n coinType: 60,\n name: \"Kava EVM Testnet\",\n managerAppName: \"Kava EVM Testnet\",\n ticker: \"tKAVA\",\n countervalueTicker: \"tKAVA\",\n scheme: \"kava_evm_testnet\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 2221,\n networkId: 2221,\n },\n units: [\n {\n name: \"tKAVA\",\n code: \"tKAVA\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://explorer.testnet.kava.io/tx/$hash\",\n address: \"https://explorer.testnet.kava.io/address/$address\",\n token: \"https://explorer.testnet.kava.io/token/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"tomo_testnet\",\n coinType: 60,\n name: \"TomoTestnet\",\n managerAppName: \"TomoTestnet\",\n ticker: \"tTOMO\",\n countervalueTicker: \"tTOMO\",\n scheme: \"tomo_testnet\",\n color: \"#A020F0\",\n family: \"evm\",\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"testnet\",\n chainId: 88,\n networkId: 88,\n },\n units: [\n {\n name: \"tTOMO\",\n code: \"tTOMO\",\n magnitude: 18,\n },\n ],\n explorerViews: [\n {\n tx: \"https://scan.testnet.tomochain.com/txs/$hash\",\n address: \"https://scan.testnet.tomochain.com/address/$address\",\n token: \"https://scan.testnet.tomochain.com/tokens/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"ethereum_goerli\",\n name: \"Ethereum Goerli\",\n family: \"ethereum\",\n coinType: 1,\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"goerli\",\n chainId: 5, // goerli\n networkId: 5,\n hardfork: \"petersburg\",\n },\n units: [\n {\n code: \"wei\",\n magnitude: 0,\n name: \"wei\",\n },\n {\n code: \"Kwei\",\n magnitude: 3,\n name: \"Kwei\",\n },\n {\n code: \"Mwei\",\n magnitude: 6,\n name: \"Mwei\",\n },\n {\n code: \"Gwei\",\n magnitude: 9,\n name: \"Gwei\",\n },\n {\n code: \"ether\",\n magnitude: 18,\n name: \"ether\",\n },\n ],\n explorerViews: [\n {\n tx: \"https://goerli.etherscan.io/tx/$hash\",\n address: \"https://goerli.etherscan.io/address/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"ethereum_ropsten\",\n name: \"Ethereum Ropsten\",\n cointype: 60,\n family: \"ethereum\",\n units: [\n {\n code: \"wei\",\n magnitude: 0,\n name: \"wei\",\n },\n {\n code: \"Kwei\",\n magnitude: 3,\n name: \"Kwei\",\n },\n {\n code: \"Mwei\",\n magnitude: 6,\n name: \"Mwei\",\n },\n {\n code: \"Gwei\",\n magnitude: 9,\n name: \"Gwei\",\n },\n {\n code: \"ether\",\n magnitude: 18,\n name: \"ether\",\n },\n ],\n ethereumLikeInfo: {\n // @ts-expect-error\n baseChain: \"ropsten\",\n chainId: 3, // ropsten\n networkId: 3,\n hardfork: \"petersburg\",\n },\n explorerViews: [\n {\n tx: \"https://ropsten.etherscan.io/tx/$hash\",\n address: \"https://ropsten.etherscan.io/address/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"vertcoin\",\n // @ts-expect-error\n coinType: 28,\n name: \"Vertcoin\",\n managerAppName: \"Vertcoin\",\n ticker: \"VTC\",\n scheme: \"vertcoin\",\n color: \"#1b5c2e\",\n supportsSegwit: true,\n family: \"bitcoin\",\n blockAvgTime: 150,\n bitcoinLikeInfo: {\n P2PKH: 71,\n P2SH: 5,\n XPUBVersion: 0x0488b21e,\n },\n units: [\n {\n name: \"vertcoin\",\n code: \"VTC\",\n magnitude: 8,\n },\n {\n name: \"satoshi\",\n code: \"sat\",\n magnitude: 0,\n },\n ],\n explorerViews: [\n {\n tx: \"https://vtcblocks.com/tx/$hash\",\n address: \"https://vtcblocks.com/address/$address\",\n },\n ],\n },\n {\n type: \"CryptoCurrency\",\n // @ts-expect-error\n id: \"viacoin\",\n // @ts-expect-error\n coinType: 14,\n name: \"Viacoin\",\n managerAppName: \"Viacoin\",\n ticker: \"VIA\",\n scheme: \"viacoin\",\n color: \"#414141\",\n supportsSegwit: true,\n family: \"bitcoin\",\n blockAvgTime: 24,\n bitcoinLikeInfo: {\n P2PKH: 71,\n P2SH: 33,\n XPUBVersion: 0x0488b21e,\n },\n units: [\n {\n name: \"viacoin\",\n code: \"VIA\",\n magnitude: 8,\n },\n {\n name: \"satoshi\",\n code: \"sat\",\n magnitude: 0,\n },\n ],\n explorerViews: [\n {\n tx: \"https://explorer.viacoin.org/tx/$hash\",\n address: \"https://explorer.viacoin.org/address/$address\",\n },\n ],\n },\n];\n\nexport function getCryptoCurrencyById(id: string): CryptoCurrency {\n return vaultCoins.find((currency) => currency.id === id) || byId(id);\n}\n\n// istanbul ignore next\nconst listCryptoCurrencies = listCC;\nexport { listCryptoCurrencies };\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 _chunkTLTMGY3Ejs = require('./chunk-TLTMGY3E.js');
3
+ var _chunk6NGBW7BGjs = require('./chunk-6NGBW7BG.js');
4
4
 
5
5
  // src/createNetwork.ts
6
6
  var _axios = require('axios'); var _axios2 = _interopRequireDefault(_axios);
@@ -64,7 +64,7 @@ function createNetwork(networkOptions) {
64
64
  console.log(_chalk2.default`{grey ${msg}}`);
65
65
  }
66
66
  if (typeof networkDelay === "number") {
67
- await _chunkTLTMGY3Ejs.wait.call(void 0, networkDelay);
67
+ await _chunk6NGBW7BGjs.wait.call(void 0, networkDelay);
68
68
  }
69
69
  const res = await _axios2.default.request(axiosParams);
70
70
  if (networkOptions.interceptToken && res.headers && res.headers["set-cookie"]) {
@@ -94,4 +94,4 @@ function createNetwork(networkOptions) {
94
94
 
95
95
 
96
96
  exports.createNetwork = createNetwork;
97
- //# sourceMappingURL=chunk-O535UIIL.js.map
97
+ //# sourceMappingURL=chunk-QH2K2MDV.js.map