@ledgerhq/vault-cli 2.3.1 → 2.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/index.ts","../src/cli.ts","../src/__patchGateOptionsWithEnvVariables.ts","../src/logger.ts","../src/commands/apdu.ts","../src/commands/approve.ts","../src/cliOptions.ts","../src/deviceOption.ts","../src/gateOptions.ts","../src/lamOptions.ts","../src/commands/backupCompartment.ts","../src/getCertFromPFX.ts","../src/commands/bake.ts","../src/manifests/beatles.json","../src/manifests/empty.json","../src/manifests/erc20.json","../src/manifests/message-signing.json","../src/manifests/mobile.json","../src/manifests/polkadot-staking.json","../src/manifests/polkadot.json","../src/manifests/rawsigning.json","../src/manifests/ripple.json","../src/manifests/sci.json","../src/manifests/solana-dev.json","../src/manifests/solana-staking.json","../src/manifests/solana.json","../src/manifests/stellar.json","../src/manifests/tezos.json","../src/manifests/tradelink-hsm.json","../src/manifests/tradelink.json","../src/miscOptions.ts","../src/revault-compat.ts","../src/commands/wipe.ts","../src/commands/bridge.ts","../src/commands/configcat.ts","../src/commands/create.ts","../src/commands/get.ts","../src/utils.ts","../src/commands/deploy.ts","../src/commands/destroy.ts","../src/commands/drain.ts","../src/commands/faucet.ts","../src/commands/fetch.ts","../src/commands/genKeys.ts","../src/commands/getAPIUserTokens.ts","../src/commands/getAuthToken.ts","../src/commands/getMVInstances.ts","../src/commands/getSeeds.ts","../src/commands/getUserID.ts","../src/commands/initCompartment.ts","../src/commands/listen.ts","../src/commands/onboard.ts","../src/commands/pledge.ts","../src/commands/proxy.ts","../src/commands/receive.ts","../src/commands/recipe.ts","../src/commands/reject.ts","../src/commands/resetCompartment.ts","../src/commands/restoreCompartment.ts","../src/commands/revoke.ts","../src/commands/send.ts","../src/commands/setQuorum.ts","../src/commands/settle.ts","../src/commands/upgrade.ts","../src/commands/index.ts","../src/registerTransports.ts"],"sourcesContent":["{\n \"name\": \"@ledgerhq/vault-cli\",\n \"version\": \"2.3.1\",\n \"description\": \"A various utility command-line for Vault development\",\n \"homepage\": \"https://github.com/LedgerHQ/vault-ts\",\n \"license\": \"BSD-2-Clause\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/LedgerHQ/vault-ts.git\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"bin\": {\n \"ledger-vault\": \"bin/index.js\"\n },\n \"scripts\": {\n \"clean\": \"rm -rf bin\",\n \"build\": \"tsup && chmod +x bin/index.js\",\n \"test\": \"jest\",\n \"test:pedantic\": \"jest --coverage --coverageThreshold '{ \\\"global\\\": { \\\"branches\\\": 100, \\\"functions\\\": 100, \\\"lines\\\": 100, \\\"statements\\\": 100 } }'\",\n \"lint\": \"eslint .\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@ledgerhq/cryptoassets\": \"^6.37.0\",\n \"@ledgerhq/hw-transport-node-hid\": \"^6.29.4\",\n \"@ledgerhq/live-common-stub\": \"workspace:*\",\n \"@ledgerhq/vault-common\": \"workspace:*\",\n \"@ledgerhq/vault-utils\": \"workspace:*\",\n \"axios\": \"^0.21.4\",\n \"bignumber.js\": \"^9.1.1\",\n \"body-parser\": \"^1.20.2\",\n \"chalk\": \"^4.1.1\",\n \"cli-table3\": \"^0.6.3\",\n \"command-line-args\": \"^5.1.1\",\n \"command-line-usage\": \"^6.1.0\",\n \"cors\": \"^2.8.5\",\n \"eslint\": \"^8.43.0\",\n \"express\": \"^4.18.2\",\n \"lodash\": \"^4.17.21\",\n \"moment\": \"^2.29.1\",\n \"nanoid\": \"3\",\n \"pem\": \"github:Dexus/pem#71dae3346801dafb5a8bcebcd4c7267fd182666f\",\n \"prettier\": \"^2.8.8\",\n \"progress\": \"^2.0.3\",\n \"qs\": \"^6.11.2\"\n },\n \"devDependencies\": {\n \"@ledgerhq/eslint-config-custom\": \"workspace:*\",\n \"@swc/core\": \"1.2.205\",\n \"@swc/jest\": \"^0.2.26\",\n \"@types/body-parser\": \"^1.19.2\",\n \"@types/cli-table\": \"^0.3.1\",\n \"@types/command-line-args\": \"^5.0.0\",\n \"@types/command-line-usage\": \"^5.0.1\",\n \"@types/cors\": \"^2.8.13\",\n \"@types/express\": \"^4.17.17\",\n \"@types/jest\": \"^28.1.8\",\n \"@types/lodash\": \"^4.14.195\",\n \"@types/node\": \"^15.14.9\",\n \"@types/pem\": \"^1.9.6\",\n \"@types/prettier\": \"2.7.3\",\n \"@types/progress\": \"^2.0.3\",\n \"@types/qs\": \"^6.9.7\",\n \"@typescript-eslint/eslint-plugin\": \"^5.60.1\",\n \"jest\": \"^29.7.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\"\n }\n}\n","#!/usr/bin/env node\n// node shebang makes gh stats counting this file as js\nimport chalk from \"chalk\";\n\nimport cli from \"./cli\";\n\ncli();\nprocess.on(\"unhandledRejection\", (err) => {\n // @ts-ignore\n // eslint-disable-next-line no-console\n console.log(chalk`{red.bold ERROR} {red ${err.toString()}}`);\n\n // @ts-ignore\n if (err.name === \"AggregateError\") {\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError\n // @ts-ignore\n err.errors.forEach((e: Error) => {\n // eslint-disable-next-line no-console\n console.log(chalk`{red.bold ERROR} {red ${e.toString()}}`);\n });\n }\n\n if (process.env.DEBUG === \"1\") {\n // @ts-ignore\n console.log(chalk`{red ${err.stack}}`);\n }\n});\n","import chalk from \"chalk\";\nimport commandLineArgs, { OptionDefinition } from \"command-line-args\";\nimport commandLineUsage, { Content } from \"command-line-usage\";\n\nimport __patchGateOptionsWithEnvVariables from \"./__patchGateOptionsWithEnvVariables\";\nimport commands from \"./commands\";\nimport \"./registerTransports\";\n\n// eslint-disable-next-line\nconst { version } = require(\"../package.json\");\n\ninterface VaultCliCommand {\n command?: string;\n subCommands?: VaultCliCommand[];\n description?: string;\n help?: Content[];\n run?: (arg0: any) => void;\n options?: OptionDefinition[];\n positionals?: boolean;\n allowNoPositional?: boolean;\n}\n\nasync function runCLI(overrideArgv?: string[]): Promise<void> {\n const accumulatedOptions = {};\n const accumulatedOptionsChoices: any[] = [];\n let help = false;\n\n return parseOptionsAndRun(commands, overrideArgv);\n\n async function parseOptionsAndRun(_cmd: VaultCliCommand, argv?: string[]) {\n // istanbul ignore next\n const cmd = { ..._cmd, options: _cmd.options || [] };\n // istanbul ignore next\n accumulatedOptionsChoices.unshift(...(cmd.options || []));\n /* istanbul ignore next */\n const definitions = cmd.subCommands\n ? [{ name: \"command\", defaultOption: true }, ...(cmd.options || [])]\n : cmd.positionals\n ? [{ name: \"positionals\", defaultOption: true, multiple: true }, ...(cmd.options || [])]\n : cmd.options;\n\n const options = commandLineArgs(definitions, {\n argv,\n partial: true,\n });\n\n if (options.version) {\n // will be replaced at build time\n // eslint-disable-next-line no-console\n console.log(version);\n return;\n }\n\n Object.assign(accumulatedOptions, options);\n\n // @ts-ignore\n delete accumulatedOptions._unknown;\n\n const _argv = options._unknown || [];\n\n if (!help) {\n definitions.forEach((optionDefinition) => {\n if (\n // @ts-ignore: we sneakily injected it here\n optionDefinition.required &&\n !(optionDefinition.name in accumulatedOptions)\n ) {\n // eslint-disable-next-line no-console\n console.log(\n chalk`{red.bold ERROR} {red missing required option --${optionDefinition.name}}`,\n );\n process.exit(1);\n }\n });\n }\n\n help =\n help ||\n options.help ||\n (cmd.subCommands && !options.command) ||\n /* istanbul ignore next */\n (cmd.positionals && !options.positionals && !cmd.allowNoPositional);\n\n if (cmd.subCommands) {\n const subCommand = cmd.subCommands.find((cmd) => cmd.command === options.command);\n if (!subCommand) {\n showHelp();\n return;\n }\n await parseOptionsAndRun(subCommand, _argv);\n return;\n }\n // @ts-ignore\n __patchGateOptionsWithEnvVariables(accumulatedOptions);\n\n if (\"debug\" in accumulatedOptions) {\n process.env.DEBUG = \"1\";\n }\n\n // don't know how to trigger this if\n // istanbul ignore next\n if (help) {\n showHelp();\n return;\n }\n\n if (cmd.run) {\n try {\n await cmd.run(accumulatedOptions);\n // istanbul ignore if\n if (!overrideArgv) {\n process.exit(0);\n }\n } catch (err) /* istanbul ignore next */ {\n if (overrideArgv) {\n throw err;\n }\n // eheheh\n // @ts-expect-error\n if (err.message === \"HACKY_CLOSE_DEVICES\") {\n process.exit(0);\n return;\n }\n // @ts-expect-error\n // eslint-disable-next-line no-console\n console.log(chalk`{red.bold ERROR} {red ${err.toString()}}`);\n if (process.env.DEBUG) {\n // @ts-expect-error\n // eslint-disable-next-line no-console\n console.log(err.stack);\n }\n process.exit(1);\n }\n }\n\n function showHelp() {\n const opts1 = accumulatedOptionsChoices.filter((opt) => !isGlobalOpt(opt));\n const opts2 = accumulatedOptionsChoices.filter(isGlobalOpt);\n const hasOptions = opts1.length > 0;\n\n const helpText = commandLineUsage([\n {\n content: cmd.description,\n },\n ...(cmd.help || []),\n ...(cmd.subCommands\n ? [\n {\n header: \"Commands\",\n content: cmd.subCommands.map((cmd) => ({\n name: cmd.command,\n summary: cmd.description,\n })),\n },\n ]\n : /* istanbul ignore next */ []),\n ...(hasOptions\n ? [\n {\n header: \"Options\",\n optionList: opts1.map((opt) => {\n return {\n ...opt,\n ...(opt.required\n ? /* istanbul ignore next */ {\n description: `{red.bold *} ${opt.description}`,\n }\n : {}),\n };\n }),\n },\n ]\n : /* istanbul ignore next */ []),\n {\n header: \"Global options\",\n optionList: opts2,\n },\n ]);\n // eslint-disable-next-line no-console\n console.log(helpText.trim());\n // eslint-disable-next-line no-console\n console.log(\"\");\n }\n }\n}\n\nconst isGlobalOpt = (opt: OptionDefinition) => {\n const GLOBAL_OPTIONS = [\"help\", \"debug\", \"version\"];\n return GLOBAL_OPTIONS.includes(opt.name);\n};\n\nexport default runCLI;\n","import { setDeviceAPIEndpoint } from \"@ledgerhq/vault-common\";\n\nimport logger from \"./logger\";\nimport { OptionalRevaultOnboardingOptions } from \"./revault-compat\";\nimport { GateOptions } from \"./types\";\n\nexport const envVariablesOptionsMap: Record<string, string> = {\n VAULT_SALT: \"salt\",\n VAULT_GATE_URL: \"gate\",\n};\n\nexport default function __patchGateOptionsWithEnvVariables(\n opts: GateOptions & OptionalRevaultOnboardingOptions,\n): GateOptions {\n Object.keys(envVariablesOptionsMap).forEach((key) => {\n const value = envVariablesOptionsMap[key];\n\n // @ts-ignore\n if (opts[value] !== \"\") {\n return;\n }\n\n const envValue = process.env[key];\n if (envValue) {\n // @ts-ignore\n opts[value] = envValue;\n }\n });\n if (opts.minivault) logger.info(\"The --minivault option is not needed anymore.\");\n if (opts.minivaultURL) {\n const baseURL = opts.minivaultURL.endsWith(\"/\")\n ? opts.minivaultURL\n : /* istanbul ignore next */ `${opts.minivaultURL}/`;\n opts.deviceAPI = `${baseURL}device-api`;\n setDeviceAPIEndpoint(opts.deviceAPI);\n opts.gate = `${baseURL}gate/minivault`;\n opts.apiGateway = `${baseURL}api-gateway`;\n opts.lam = `${baseURL}lam`;\n opts.revaultApiUrl = `${baseURL}api`;\n opts.revaultRootAuthToken = \"root-auth-token\";\n }\n return opts;\n}\n","import { createConsoleLogger } from \"@ledgerhq/vault-utils\";\n\nexport default createConsoleLogger();\n","import TransportNodeHid from \"@ledgerhq/hw-transport-node-hid\";\n\nexport type APDUOptions = {\n positionals: string[];\n};\n\nexport default {\n command: \"apdu\",\n positionals: true,\n description: \"Send raw APDU to hardware device\",\n help: [\n {\n content: \"{grey $} ledger-vault apdu e0400200090280564c5480553246\",\n },\n ],\n run: async (options: APDUOptions): Promise<void> => {\n if (!options.positionals) {\n throw new Error(`You must pass an APDU`);\n }\n const toSend = options.positionals[0] as string;\n const transport = await TransportNodeHid.create();\n const response = await transport.exchange(Buffer.from(toSend, \"hex\"));\n // eslint-disable-next-line no-console\n console.log(response.toString(\"hex\"));\n },\n};\n","import { createDevicesPool, recipeManifest, reviewAPIRequest } from \"@ledgerhq/vault-common\";\nimport type { Connection, GateGenericRequest, UserWithDevice } from \"@ledgerhq/vault-common\";\nimport type { ReviewType } from \"@ledgerhq/vault-common/api-request\";\n\nimport cliOptions from \"../cliOptions\";\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\n\nexport type ApproveOptions = GateOptions & {\n device: number;\n requestID?: number;\n all?: boolean;\n withoutHSM?: boolean;\n apiV2User?: string;\n apiGateway?: string;\n};\n\nconst runApprove = async (options: ApproveOptions): Promise<void> => {\n const { device, all, requestID, withoutHSM, apiV2User } = options;\n if (!all && !requestID) {\n // eslint-disable-next-line no-console\n console.log(\"Usage: ledger-vault approve --all\");\n // eslint-disable-next-line no-console\n console.log(\"Usage: ledger-vault approve --requestID 1303\");\n return;\n }\n const pool = createDevicesPool({\n ...options,\n deviceAPIURL: options.deviceAPI,\n });\n\n if (apiV2User) {\n const recipe = await recipeManifest(pool);\n const { manifest } = recipe;\n\n /* istanbul ignore next */\n const myApiUser = manifest.users?.apiV2?.find((user) => user.name.includes(apiV2User));\n if (!myApiUser) {\n throw new Error(`No API V2 user found for ${apiV2User}`);\n }\n\n const approveApiRequestData = {\n pool,\n requestID: requestID as number,\n apiUser: myApiUser,\n gate: options.gate,\n apiGateway: String(options.apiGateway),\n reviewType: \"APPROVE\" as ReviewType,\n };\n\n const requestResp = await reviewAPIRequest(approveApiRequestData, {\n logger,\n });\n logger.info(requestResp);\n return;\n }\n\n const userDevice = await pool.login(options.device);\n const requestsConnection = await userDevice.network<Connection<GateGenericRequest>>(\n \"GET\",\n \"/requests?meta_status=PENDING&pageSize=-1\",\n );\n\n const manifestFromGate = await recipeManifest(pool);\n const gateUsers = manifestFromGate.rawData.usersWithDevice;\n const user = gateUsers.find((gateUser) => gateUser.deviceIndex === device);\n\n if (!user) throw new Error(\"No user found for this device\");\n const requests: GateGenericRequest[] = requestsConnection.edges.map((elt) => elt.node);\n\n if (all) {\n // istanbul ignore next\n if (requests.length === 0) {\n logger.info(\"No request to approve\");\n return;\n }\n logger.info(\"Approving all pending requests\");\n // process approvals one-by-one. Otherwise it doesn't work\n for await (const request of requests) {\n if (hasUserApprovedRequest(user, request)) {\n logger.info(`User width device ${device} already approved request ${request.id}`);\n continue;\n }\n withoutHSM\n ? await userDevice.approveRequestWithoutHSM({ id: request.id })\n : await userDevice.approveRequest({ id: request.id });\n logger.success(`Approved request ${request.id}: ${request.type}`);\n }\n return;\n }\n\n const request = requests.find((request) => request.id === requestID);\n if (!request) throw new Error(`Couldn't find request ${requestID}`);\n if (hasUserApprovedRequest(user, request)) {\n logger.info(`User width device ${device} already approved request ${request.id}`);\n return;\n }\n withoutHSM\n ? await userDevice.approveRequestWithoutHSM({ id: request.id })\n : await userDevice.approveRequest({ id: request.id });\n\n logger.success(`Approved request ${request.id}: ${request.type}`);\n};\n\nconst hasUserApprovedRequest = (user: UserWithDevice, request: GateGenericRequest) =>\n request.approvals &&\n request.approvals.filter((approval) => {\n /* istanbul ignore next */\n return approval.created_by?.pub_key === user.user.pub_key && approval.type === \"APPROVE\";\n }).length > 0;\n\nexport default {\n command: \"approve\",\n description: \"Approve specific request or all request\",\n options: [\n ...gateOptions,\n ...lamOptions,\n ...cliOptions,\n deviceOption,\n {\n name: \"all\",\n description: \"Approve all pending request\",\n type: Boolean,\n },\n {\n name: \"requestID\",\n description: \"Approve a specific request\",\n type: Number,\n },\n {\n name: \"withoutHSM\",\n description: \"Do not require device to approve request\",\n type: Boolean,\n },\n {\n name: \"apiV2User\",\n description: \"API V2 user name\",\n type: String,\n },\n ],\n run: runApprove,\n};\n","export default [\n {\n name: \"networkDelay\",\n description: \"Allows to delay (ms) between each request\",\n type: Number,\n defaultValue: 0,\n },\n];\n","export default {\n name: \"device\",\n alias: \"d\",\n type: Number,\n description: \"Device used to do the query {grey (default: 4 (Admin 1))}\",\n defaultValue: 4,\n};\n","export const GATE_OPTION = {\n name: \"gate\",\n alias: \"g\",\n defaultValue: process.env.VAULT_GATE_URL || \"https://localhost:8443/gate/minivault\",\n description:\n \"Target gate {blue $VAULT_GATE_URL} {grey (default: https://localhost:8443/gate/minivault)}\",\n type: String,\n};\n\nexport const MINIVAULT_OPTION = {\n name: \"minivault\",\n type: Boolean,\n description: \"This option is deprecated, it is not needed anymore for minivault usage\",\n};\n\nconst MINIVAULT_URL_OPTION = {\n name: \"minivaultURL\",\n description: \"Remote URL to apply CLI actions\",\n type: String,\n defaultValue: process.env.MINIVAULT_URL,\n};\n\nexport const TRANSPORT_OPTION = {\n name: \"transport\",\n type: String,\n description: \"Either software|nodehid|nodehid-replayer\",\n};\n\nconst SALT_OPTION = {\n name: \"salt\",\n alias: \"s\",\n type: String,\n typeLabel: \"<salt>\",\n description: \"Salt used to generate devices seeds {blue $VAULT_SALT}\",\n defaultValue: \"\",\n};\n\nconst DEVICE_API_OPTION = {\n name: \"deviceAPI\",\n type: String,\n typeLabel: \"<url>\",\n description: \"Device API URL\",\n};\n\nconst API_GATEWAY_OPTION = {\n name: \"apiGateway\",\n type: String,\n description: \"api gateway URL\",\n defaultValue: process.env.VAULT_API_GATEWAY_URL || \"https://localhost:8443/api-gateway\",\n};\n\nexport const minimalGateOptions = [GATE_OPTION, SALT_OPTION, MINIVAULT_OPTION];\n\nexport default [\n GATE_OPTION,\n SALT_OPTION,\n DEVICE_API_OPTION,\n TRANSPORT_OPTION,\n {\n name: \"readOnlyUser\",\n type: String,\n description: \"Name of user to login in read only mode\",\n },\n MINIVAULT_OPTION,\n MINIVAULT_URL_OPTION,\n API_GATEWAY_OPTION,\n];\n","export default [\n {\n name: \"lam\",\n alias: \"l\",\n defaultValue: \"https://localhost:8443/lam\",\n description: \"Target lam{grey (default: https://localhost:8443/lam)}\",\n type: String,\n },\n {\n name: \"lamAPIKey\",\n description: \"LAM API key\",\n type: String,\n },\n];\n","import createHSMBridge from \"@ledgerhq/vault-common/createHSMBridge\";\n\nimport getCertFromPFX from \"../getCertFromPFX\";\n\nexport type Options = {\n compartment: number;\n hsm: string;\n hsmCert: string;\n hsmCertPassword: string;\n};\n\nexport default {\n command: \"backupCompartment\",\n description: \"Backup HSM simu compartment\",\n help: [\n {\n content: \"{grey $} ledger-vault backupCompartment --cid 123\",\n },\n ],\n options: [\n {\n name: \"compartment\",\n alias: \"c\",\n type: Number,\n description: \"HSM compartment ID {blue $VAULT_COMPARTMENT_ID}\",\n defaultValue: process.env.VAULT_COMPARTMENT_ID,\n required: true,\n },\n {\n name: \"hsm\",\n type: String,\n description: \"HSM endpoint {blue $VAULT_HSM_ENDPOINT}\",\n defaultValue: process.env.VAULT_HSM_ENDPOINT,\n required: true,\n },\n {\n name: \"hsmCert\",\n type: String,\n description: \"Path to HSM certificate {blue $VAULT_HSM_CLIENT_CERT_PATH}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PATH,\n required: true,\n },\n {\n name: \"hsmCertPassword\",\n type: String,\n description: \"HSM certificate password {blue $VAULT_HSM_CLIENT_CERT_PWD}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PWD,\n required: true,\n },\n ],\n run: async (options: Options): Promise<void> => {\n if (!options.hsmCert) {\n throw new Error(\n \"You must specify the path to your HSM certificate in your environment variable VAULT_HSM_CLIENT_CERT_PATH or use the --hsmCert flag\",\n );\n }\n\n const cert = await getCertFromPFX(options.hsmCert, options.hsmCertPassword);\n\n const bridge = createHSMBridge({\n hsmCert: cert.cert,\n hsmCertKey: cert.key,\n hsmEndpoint: options.hsm,\n });\n\n const backup = await bridge.backupCompartment(options.compartment);\n\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(backup));\n },\n};\n","import fs from \"fs\";\nimport pem from \"pem\";\n\nexport type Cert = {\n cert: Buffer;\n key: Buffer;\n};\n\nasync function pemReady() {\n // we don't have a way to know if `openssl` has been properly called by `pem`\n // package. let's assume waiting 500ms is enough\n await new Promise((r) => setTimeout(r, 500));\n}\n\nexport default async function getCertFromPFX(pfxPath: string, passphrase: string): Promise<Cert> {\n // `pem` package is asynchronously checking openssl OS version at start\n // to assign proper flags when needed (e.g: '-legacy')\n await pemReady();\n\n const cert: Cert = await new Promise((resolve, reject) => {\n // VG-11534 this motherfucker `pem` package is outputting on stdout if process.env.CI === 'true'\n // -> see https://github.com/Dexus/pem/blob/71dae3346801dafb5a8bcebcd4c7267fd182666f/lib/debug.js#L2-L6\n const envCIBefore = process.env[\"CI\"];\n delete process.env[\"CI\"];\n pem.readPkcs12(fs.readFileSync(pfxPath), { p12Password: passphrase }, (err, cert) => {\n process.env[\"CI\"] = envCIBefore;\n if (err) {\n return reject(err);\n }\n resolve({\n cert: Buffer.from(cert.cert),\n key: Buffer.from(cert.key),\n });\n });\n });\n\n return cert;\n}\n","import { bakeManifest, createDevicesPool, validateManifest } from \"@ledgerhq/vault-common\";\nimport { Manifest } from \"@ledgerhq/vault-common/types\";\nimport chalk from \"chalk\";\nimport fs from \"fs\";\nimport readline from \"readline\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport logger from \"../logger\";\nimport MANIFEST_BEATLES from \"../manifests/beatles.json\";\nimport MANIFEST_EMPTY from \"../manifests/empty.json\";\nimport MANIFEST_ERC20 from \"../manifests/erc20.json\";\nimport PRESET_MESSAGE_SIGNING from \"../manifests/message-signing.json\";\nimport MANIFEST_MOBILE from \"../manifests/mobile.json\";\nimport MANIFEST_POLKADOT_STAKING from \"../manifests/polkadot-staking.json\";\nimport MANIFEST_POLKADOT from \"../manifests/polkadot.json\";\nimport MANIFEST_RAW from \"../manifests/rawsigning.json\";\nimport MANIFEST_RIPPLE from \"../manifests/ripple.json\";\nimport MANIFEST_SCI from \"../manifests/sci.json\";\nimport MANIFEST_SOLANA_DEV from \"../manifests/solana-dev.json\";\nimport MANIFEST_SOLANA_STAKING from \"../manifests/solana-staking.json\";\nimport MANIFEST_SOLANA from \"../manifests/solana.json\";\nimport MANIFEST_STELLAR from \"../manifests/stellar.json\";\nimport MANIFEST_TEZOS from \"../manifests/tezos.json\";\nimport MANIFEST_TRADELINK_HSM from \"../manifests/tradelink-hsm.json\";\nimport MANIFEST_TRADELINK from \"../manifests/tradelink.json\";\nimport { TWO_STEPS_REQUEST_OPTION, TwoStepsRequestOption } from \"../miscOptions\";\nimport {\n OptionalRevaultOnboardingOptions,\n REVAULT_ONBOARDING_OPTIONS,\n extractRevaultOnboardingOptions,\n} from \"../revault-compat\";\nimport { GateOptions } from \"../types\";\nimport { wipe, wipeOptions } from \"./wipe\";\n\nconst MANIFESTS: Record<string, Manifest> = {\n empty: MANIFEST_EMPTY,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n beatles: MANIFEST_BEATLES,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n sci: MANIFEST_SCI,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n erc20: MANIFEST_ERC20,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n tezos: MANIFEST_TEZOS,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n polkadot: MANIFEST_POLKADOT,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n \"polkadot-staking\": MANIFEST_POLKADOT_STAKING,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n solana: MANIFEST_SOLANA,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n \"solana-staking\": MANIFEST_SOLANA_STAKING,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n \"solana-dev\": MANIFEST_SOLANA_DEV,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n stellar: MANIFEST_STELLAR,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n tradelink: MANIFEST_TRADELINK,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n \"tradelink-hsm\": MANIFEST_TRADELINK_HSM,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n ripple: MANIFEST_RIPPLE,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n rawsigning: MANIFEST_RAW,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n \"message-signing\": PRESET_MESSAGE_SIGNING,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n mobile: MANIFEST_MOBILE,\n};\n\nexport type BakeOptions = GateOptions &\n TwoStepsRequestOption &\n OptionalRevaultOnboardingOptions & {\n positionals?: string[];\n manifest?: string;\n stdin: boolean; // workaround until we figure out the bug when the script is run from another script\n\n retry: number;\n\n // wipe options\n wipe: boolean;\n compartment: number;\n hsm: string;\n hsmCert: string;\n hsmCertPassword: string;\n };\n\nexport default {\n command: \"bake\",\n description: \"Put the Vault in a predefined state\",\n help: [\n {\n header: \"Usage\",\n content: [\n \"{grey $} ledger-vault bake {grey <builtin-manifest>} [options]\",\n \"{grey $} ledger-vault bake {grey <path/to/manifest.json>} [options]\",\n ],\n },\n {\n header: \"Built-in manifests\",\n content: Object.keys(MANIFESTS)\n .sort()\n .map((p) => `{yellow ${p}}`)\n .join(\", \"),\n },\n ],\n allowNoPositional: true,\n positionals: true,\n options: [\n {\n name: \"manifest\",\n alias: \"m\",\n description: \"{yellow Deprecated}: use the positional argument instead\",\n type: String,\n },\n ...REVAULT_ONBOARDING_OPTIONS,\n {\n name: \"retry\",\n description: \"How many times bake should be retried on error {grey (default: 0)}\",\n type: Number,\n defaultValue: 0,\n },\n TWO_STEPS_REQUEST_OPTION,\n ...cliOptions,\n ...gateOptions,\n ...lamOptions,\n {\n name: \"stdin\",\n description: \"allow reading stdin\",\n type: Boolean,\n defaultValue: false,\n },\n {\n name: \"wipe\",\n alias: \"w\",\n description: \"Wipe backend before baking\",\n type: Boolean,\n defaultValue: false,\n },\n ...wipeOptions,\n ],\n run: async (options: BakeOptions): Promise<void> => {\n const { retry: retryCount, twoStepsRequest } = options;\n const stdin = await readSTDIN(options);\n\n if (\n !(options.positionals && options.positionals.length) &&\n !options.manifest &&\n !options.stdin &&\n !stdin\n ) {\n throw new Error(\n `You must either choose a manifest, pass a JSON manifest in stdin or pass a manifest file path`,\n );\n }\n\n if (options.positionals && options.positionals.length > 1) {\n throw new Error(\"You can pass only one manifest file\");\n }\n\n if (options.manifest) {\n logger.info(\n chalk`Option {yellow --manifest} is deprecated. Please pass it as a {yellow positional} argument.`,\n );\n if (options.positionals && options.positionals.length) {\n throw new Error(\n \"You can't specify a positional argument and the --manifest option at the same time\",\n );\n }\n }\n\n let manifestName =\n (options.positionals && options.positionals[0]) || options.manifest || undefined;\n\n switch (manifestName) {\n case \"beatles-legacy\": {\n logger.info(\n chalk`Manifest {yellow beatles-legacy} is not existing anymore. Fallback to manifest {yellow beatles}.`,\n );\n manifestName = \"beatles\";\n break;\n }\n case undefined: {\n if (!stdin) {\n throw new Error(`No manifest provided`);\n }\n }\n }\n\n if (options.wipe) {\n await wipe(options);\n }\n\n let manifest;\n\n if (stdin) {\n manifest = JSON.parse(stdin);\n } else if (manifestName && fs.existsSync(manifestName)) {\n try {\n manifest = JSON.parse(fs.readFileSync(manifestName, \"utf-8\"));\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`Invalid manifest ${manifestName}`);\n } else {\n throw error;\n }\n }\n } else if (manifestName && manifestName in MANIFESTS) {\n manifest = MANIFESTS[manifestName];\n } else {\n throw new Error(`The manifest ${manifestName} does not exists`);\n }\n\n validateManifest(manifest);\n\n const pool = createDevicesPool({\n ...options,\n lamURL: options.lam,\n deviceAPIURL: options.deviceAPI,\n networkDelay: options.networkDelay,\n });\n\n for (let i = 0; i <= retryCount; i++) {\n try {\n await bakeManifest(manifest, pool, {\n logger,\n twoStepsRequest,\n revaultOnboarding: await extractRevaultOnboardingOptions(options),\n });\n break;\n } catch (err) /* istanbul ignore next */ {\n // @ts-expect-error\n logger.error(err.toString());\n if (i < retryCount) {\n logger.info(\n `An error occurred during bake, trying again in 5 seconds... (${\n retryCount - i\n } attempts left)`,\n );\n await new Promise((r) => setTimeout(r, 5e3));\n } else {\n throw err;\n }\n }\n }\n },\n};\n\nconst readSTDIN = async (options: BakeOptions) => {\n if (!options.stdin) {\n return Promise.resolve(null);\n }\n const rl = readline.createInterface({\n input: process.stdin,\n terminal: false,\n });\n const stdInLines = [];\n // for await let us avoid the callback syntax\n // otherwise we would have to run all the rest of the code in a\n // rl.on('close', fn) callback\n for await (const line of rl) {\n stdInLines.push(line);\n }\n return stdInLines.join(\"\");\n};\n","{\n \"customUsernames\": {\n \"10\": \"John Lennon\",\n \"11\": \"Paul McCartney\",\n \"12\": \"George Harrison\",\n \"13\": \"Ringo Starr\"\n },\n \"users\": {\n \"operators\": [10, 11, 12, 13]\n },\n \"groups\": [{ \"name\": \"Beatles\", \"users\": [10, 11, 12, 13] }],\n \"whitelists\": [\n {\n \"name\": \"White Album\",\n \"addresses\": [\n {\n \"address\": \"mmizX66rU546AD6A5BBd7qKoyBKBwJWD4h\",\n \"currency\": \"bitcoin_testnet\"\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"BTC Testnet 1\",\n \"currency\": \"bitcoin_testnet\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Beatles\" }]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"White Album\"]\n },\n {\n \"type\": \"THRESHOLD\",\n \"min\": 0,\n \"max\": 100\n }\n ]\n ]\n }\n ]\n}\n","{}\n","{\n \"users\": {\n \"operators\": [10]\n },\n \"accounts\": [\n {\n \"name\": \"Ethereum 1\",\n \"currency\": \"ethereum\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"users\": [10] }]\n }\n ]\n ]\n },\n {\n \"name\": \"Yee Token 1\",\n \"contractAddress\": \"0x922105fAd8153F516bCfB829f56DC097a0E1D705\",\n \"parentAccount\": \"Ethereum 1\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"users\": [10] }]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"operators\": [10]\n },\n \"accounts\": [\n {\n \"name\": \"ETH 1\",\n \"currency\": \"ethereum\",\n \"rules\": [\n [\n {\n \"type\": \"MESSAGE_SIGNING\"\n },\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"users\": [10] }]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": false\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"users\": [10] }]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": true\n }\n ]\n ]\n }\n ]\n}\n","{\n \"customUsernames\": {\n \"10\": \"John Lennon\",\n \"11\": \"Paul McCartney\",\n \"12\": \"George Harrison\",\n \"13\": \"Ringo Starr\"\n },\n \"users\": {\n \"operators\": [10, 11, 12, 13]\n },\n \"accounts\": [\n {\n \"name\": \"BTC Testnet 1\",\n \"currency\": \"bitcoin_testnet\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 2, \"users\": [11, 12, 13] }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Sepolia\",\n \"currency\": \"ethereum_sepolia\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 2, \"users\": [11, 12, 13] }\n ]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"operators\": [10, 11]\n },\n \"accounts\": [\n {\n \"name\": \"Polkadot 1\",\n \"currency\": \"polkadot\",\n \"rules\": [\n [\n {\n \"type\": \"POLKADOT_STAKING\"\n },\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10, 11]\n }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Polkadot Westend 1\",\n \"currency\": \"westend\",\n \"rules\": [\n [\n {\n \"type\": \"POLKADOT_STAKING\"\n },\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10, 11]\n }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Polkadot Westend 2\",\n \"currency\": \"westend\",\n \"rules\": [\n [\n {\n \"type\": \"POLKADOT_STAKING\"\n },\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10, 11]\n }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Polkadot Westend 3\",\n \"currency\": \"westend\",\n \"rules\": [\n [\n {\n \"type\": \"POLKADOT_STAKING\"\n },\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10, 11]\n }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Polkadot Westend 4\",\n \"currency\": \"westend\",\n \"rules\": [\n [\n {\n \"type\": \"POLKADOT_STAKING\"\n },\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10, 11]\n }\n ]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"operators\": [10, 11]\n },\n \"accounts\": [\n {\n \"name\": \"Polkadot 1\",\n \"currency\": \"polkadot\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Polkadot Westend 1\",\n \"currency\": \"westend\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"operators\": [10, 11]\n },\n \"accounts\": [\n {\n \"name\": \"Cosmos\",\n \"currency\": \"cosmos\",\n \"accountType\": \"Cosmos\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10]\n }\n ]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10, 11]\n }\n ]\n },\n {\n \"type\": \"RAW_SIGNING\"\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"operators\": [10, 11]\n },\n \"accounts\": [\n {\n \"name\": \"Ripple 1\",\n \"currency\": \"ripple\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Ripple 2\",\n \"currency\": \"ripple\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"customUsernames\": {\n \"10\": \"John\",\n \"11\": \"Paul\",\n \"12\": \"George\",\n \"13\": \"Ringo\"\n },\n \"users\": {\n \"operators\": [10, 11, 12, 13]\n },\n \"groups\": [{ \"name\": \"Beatles\", \"users\": [10, 11, 12, 13] }],\n \"accounts\": [\n {\n \"name\": \"ETH 1\",\n \"currency\": \"ethereum\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10]\n },\n {\n \"quorum\": 1,\n \"users\": [11]\n }\n ]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": false\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [12]\n },\n {\n \"quorum\": 1,\n \"users\": [13]\n }\n ]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": true\n }\n ]\n ]\n },\n {\n \"name\": \"ETH 2\",\n \"currency\": \"ethereum\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10]\n },\n {\n \"quorum\": 1,\n \"users\": [11]\n }\n ]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": true\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Beatles\"\n },\n {\n \"quorum\": 1,\n \"group\": \"Beatles\"\n }\n ]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": false\n }\n ]\n ]\n },\n {\n \"name\": \"ETH Goerli 1\",\n \"currency\": \"ethereum_goerli\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Beatles\"\n },\n {\n \"quorum\": 1,\n \"group\": \"Beatles\"\n }\n ]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": true\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Beatles\"\n },\n {\n \"quorum\": 1,\n \"group\": \"Beatles\"\n }\n ]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": false\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": { \"operators\": [10, 11] },\n \"groups\": [{ \"name\": \"Users\", \"users\": [10, 11] }],\n \"accounts\": [\n {\n \"name\": \"Solana 1\",\n \"currency\": \"solana\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n },\n { \"type\": \"SOLANA_STAKING\" }\n ]\n ]\n },\n {\n \"name\": \"Solana 2\",\n \"currency\": \"solana\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ]\n ]\n },\n {\n \"name\": \"Solana Testnet 1\",\n \"currency\": \"solana_testnet\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n },\n { \"type\": \"SOLANA_STAKING\" }\n ]\n ]\n },\n {\n \"name\": \"Solana Testnet 2\",\n \"currency\": \"solana_testnet\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ]\n ]\n },\n {\n \"name\": \"Solana Devnet 1\",\n \"currency\": \"solana_devnet\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n },\n { \"type\": \"SOLANA_STAKING\" }\n ]\n ]\n },\n {\n \"name\": \"Solana Devnet 2\",\n \"currency\": \"solana_devnet\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": { \"operators\": [10, 11] },\n \"groups\": [{ \"name\": \"Users\", \"users\": [10, 11] }],\n \"accounts\": [\n {\n \"name\": \"Solana 1\",\n \"currency\": \"solana\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n },\n { \"type\": \"SOLANA_STAKING\" }\n ]\n ]\n },\n {\n \"name\": \"Solana 2\",\n \"currency\": \"solana\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n },\n { \"type\": \"SOLANA_STAKING\" }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": { \"operators\": [10, 11] },\n \"groups\": [{ \"name\": \"Users\", \"users\": [10, 11] }],\n \"accounts\": [\n {\n \"name\": \"Solana 1\",\n \"currency\": \"solana\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ]\n ]\n },\n {\n \"name\": \"Solana 2\",\n \"currency\": \"solana\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"operators\": [10, 11]\n },\n \"accounts\": [\n {\n \"name\": \"Stellar 1\",\n \"currency\": \"stellar\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Stellar 2\",\n \"currency\": \"stellar\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"operators\": [10, 11]\n },\n \"accounts\": [\n {\n \"name\": \"Tezos #0\",\n \"currency\": \"tezos\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Tezos #1\",\n \"currency\": \"tezos\",\n \"rules\": [\n [\n {\n \"type\": \"TEZOS_DELEGATION\"\n },\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10, 11]\n }\n ]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"apiV2\": [\n {\n \"name\": \"Hedy OneOf 10\"\n },\n {\n \"name\": \"Joan Oneof 11\"\n },\n {\n \"name\": \"Grace Bybit 12\"\n },\n {\n \"name\": \"Mileva CC 13\"\n },\n {\n \"name\": \"Adi CC 14\"\n },\n {\n \"name\": \"David Winterm 15\"\n },\n {\n \"name\": \"Clause Comply 16\"\n }\n ],\n \"operators\": [10, 11, 12, 13, 14]\n },\n \"customUsernames\": {\n \"10\": \"AM guy\",\n \"11\": \"CC guy\",\n \"12\": \"Bybit guy\",\n \"13\": \"Wintermute guy\",\n \"14\": \"Komainu guy\"\n },\n \"groups\": [\n {\n \"name\": \"My Compliance Team\",\n \"description\": \"\",\n \"users\": [\"Clause Comply 16\", 14]\n },\n {\n \"name\": \"Group Wintermute\",\n \"description\": \"\",\n \"users\": [\"David Winterm 15\", 13]\n },\n {\n \"name\": \"Group Crypto.com\",\n \"description\": \"\",\n \"users\": [\"Mileva CC 13\", \"Adi CC 14\", 11]\n },\n {\n \"name\": \"Group Bybit\",\n \"description\": \"\",\n \"users\": [\"Grace Bybit 12\", 12]\n },\n {\n \"name\": \"Group OneOf\",\n \"description\": \"\",\n \"users\": [\"Hedy OneOf 10\", \"Joan Oneof 11\", 10]\n }\n ],\n \"whitelists\": [\n {\n \"name\": \"all exchanges\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"wintermute btc\",\n \"address\": \"tb1q7893kjx6gemqh4jpg5kld5r0qadmemu9kt6jxg\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"bybit btc\",\n \"address\": \"tb1qa87hqcqhec3g7dv03gncherlpvfh6wwt8nevnu\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"crypto.com btc\",\n \"address\": \"tb1q2nkfr9va8gr9gyryg0pr9v3vfknx9kjth637za\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"wintermute sepolia\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum_sepolia\"\n },\n {\n \"name\": \"bybit sepolia\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_sepolia\"\n },\n {\n \"name\": \"crypto.com sepolia\",\n \"address\": \"0xfc2aFF9c8623fc4B1928a818C405F5271cBaBe17\",\n \"currency\": \"ethereum_sepolia\"\n },\n {\n \"name\": \"crypto.com holesky\",\n \"address\": \"0xfc2aFF9c8623fc4B1928a818C405F5271cBaBe17\",\n \"currency\": \"ethereum_holesky\"\n }\n ]\n },\n {\n \"name\": \"wintermute addresses\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"wintermute btc\",\n \"address\": \"tb1q7893kjx6gemqh4jpg5kld5r0qadmemu9kt6jxg\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"wintermute sepolia\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum_sepolia\"\n },\n {\n \"name\": \"wintermute holesky\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum_holesky\"\n }\n ]\n },\n {\n \"name\": \"bybit addresses\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"bybit btc\",\n \"address\": \"tb1qa87hqcqhec3g7dv03gncherlpvfh6wwt8nevnu\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"bybit sepolia\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_sepolia\"\n },\n {\n \"name\": \"bybit holes\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_holesky\"\n }\n ]\n },\n {\n \"name\": \"crypto.com addresses\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"crypto.com btc\",\n \"address\": \"tb1q2nkfr9va8gr9gyryg0pr9v3vfknx9kjth637za\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"crypto.com sepolia\",\n \"address\": \"0xfc2aFF9c8623fc4B1928a818C405F5271cBaBe17\",\n \"currency\": \"ethereum_sepolia\"\n },\n {\n \"name\": \"crypto.com holesky\",\n \"address\": \"0xfc2aFF9c8623fc4B1928a818C405F5271cBaBe17\",\n \"currency\": \"ethereum_holesky\"\n }\n ]\n },\n {\n \"name\": \"Oneof whitelist\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"oneof btc\",\n \"address\": \"tb1q645fc9qjq4h9779ph2f2ade5mpqprhr2k68mtj\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"oneof sepolia\",\n \"address\": \"0x85587bD30240A98662a4cFc9de87BB0a2fA90CFf\",\n \"currency\": \"ethereum_sepolia\"\n },\n {\n \"name\": \"oneof holesky\",\n \"address\": \"0x85587bD30240A98662a4cFc9de87BB0a2fA90CFf\",\n \"currency\": \"ethereum_holesky\"\n }\n ]\n }\n ],\n \"tradelink\": {\n \"onboarded\": true,\n \"exchanges\": [\n {\n \"id\": \"dfc82b8c-7674-4355-8180-8ecbbb55dc5d\",\n \"name\": \"Crypto.com\",\n \"code\": \"CCc\",\n \"logoUrl\": \"https://i.imgur.com/Di1SzqF.png\",\n \"group\": \"Group Crypto.com\",\n \"whitelist\": \"crypto.com addresses\"\n },\n {\n \"id\": \"19360626-292a-4dd0-b76b-8e6aa13a5af2\",\n \"name\": \"ByBit\",\n \"code\": \"BBt\",\n \"logoUrl\": \"https://i.imgur.com/LZq4CCA.png\",\n \"group\": \"Group Bybit\",\n \"whitelist\": \"bybit addresses\"\n },\n {\n \"id\": \"efcbc2d7-3c5b-428c-b3e1-e2984b66ea5a\",\n \"name\": \"Wintermute\",\n \"code\": \"WMt\",\n \"logoUrl\": \"https://i.imgur.com/k81ehFP.png\",\n \"group\": \"Group Wintermute\",\n \"whitelist\": \"wintermute addresses\"\n }\n ],\n \"assetManagers\": [\n {\n \"id\": \"b81fd631-dbee-4aff-93ce-e6acf1ed994e\",\n \"name\": \"OneOf\",\n \"logoUrl\": \"https://i.imgur.com/AhF6Hap.png\",\n \"code\": \"OOF\",\n \"group\": \"Group OneOf\",\n \"whitelist\": \"Oneof whitelist\"\n }\n ],\n \"custodians\": [\n {\n \"id\": \"b2015189-0657-4e6d-89ba-fae58300f54b\",\n \"name\": \"Komainu\",\n \"logoUrl\": \"https://i.imgur.com/TOZh7Fm.png\",\n \"code\": \"KOM\",\n \"group\": \"My Compliance Team\",\n \"whitelist\": \"all exchanges\"\n }\n ]\n },\n \"accounts\": [\n {\n \"name\": \"TL-0001-ETH-OOF-KOM\",\n \"currency\": \"ethereum_sepolia\",\n \"tradelink_data\": {\n \"currency\": \"ethereum_sepolia\",\n \"custodian\": {\n \"id\": \"b2015189-0657-4e6d-89ba-fae58300f54b\",\n \"approver_group_id\": 1,\n \"whitelist_id\": 1,\n \"role\": \"CUSTODIAN\",\n \"name\": \"Komainu\",\n \"logo_url\": \"https://i.imgur.com/TOZh7Fm.png\",\n \"code\": \"KOM\"\n },\n \"exchanges\": [\n {\n \"id\": 1,\n \"approver_group_id\": 3,\n \"whitelist_id\": 4,\n \"name\": \"Crypto.com\",\n \"role\": \"EXCHANGE\",\n \"logo_url\": \"https://i.imgur.com/Di1SzqF.png\",\n \"code\": \"CCc\",\n \"requires_pre_approval\": true\n },\n {\n \"id\": 2,\n \"approver_group_id\": 4,\n \"whitelist_id\": 3,\n \"name\": \"ByBit\",\n \"role\": \"EXCHANGE\",\n \"logo_url\": \"https://i.imgur.com/LZq4CCA.png\",\n \"code\": \"BBt\",\n \"requires_pre_approval\": true\n },\n {\n \"id\": 3,\n \"approver_group_id\": 2,\n \"whitelist_id\": 2,\n \"name\": \"Wintermute\",\n \"role\": \"EXCHANGE\",\n \"logo_url\": \"https://i.imgur.com/k81ehFP.png\",\n \"code\": \"WIT\",\n \"requires_pre_approval\": true\n }\n ],\n \"asset_manager\": {\n \"id\": 1,\n \"approver_group_id\": 5,\n \"whitelist_id\": 5,\n \"name\": \"OneOf\",\n \"role\": \"ASSET_MANAGER\",\n \"logo_url\": \"https://i.imgur.com/AhF6Hap.png\",\n \"code\": \"OOF\"\n }\n },\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group Crypto.com\"\n },\n {\n \"quorum\": 1,\n \"group\": \"Group OneOf\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"crypto.com addresses\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group Bybit\"\n },\n {\n \"quorum\": 1,\n \"group\": \"Group OneOf\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"bybit addresses\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group Wintermute\"\n },\n {\n \"quorum\": 1,\n \"group\": \"Group OneOf\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"wintermute addresses\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group OneOf\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"Oneof whitelist\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"crypto.com addresses\", \"bybit addresses\", \"wintermute addresses\"]\n }\n ]\n ]\n }\n ],\n \"contractApprovals\": [\n {\n \"user\": 10,\n \"contractNames\": [\"TRADELINK\"]\n },\n {\n \"user\": 11,\n \"contractNames\": [\"TRADELINK\"]\n },\n {\n \"user\": 12,\n \"contractNames\": [\"TRADELINK\"]\n },\n {\n \"user\": 13,\n \"contractNames\": [\"TRADELINK\"]\n },\n {\n \"user\": 14,\n \"contractNames\": [\"TRADELINK\"]\n }\n ]\n}\n","{\n \"users\": {\n \"apiV2\": [\n {\n \"name\": \"Hedy OneOf 10\"\n },\n {\n \"name\": \"Joan Oneof 11\"\n },\n {\n \"name\": \"Grace Bybit 12\"\n },\n {\n \"name\": \"Mileva CC 13\"\n },\n {\n \"name\": \"Adi CC 14\"\n },\n {\n \"name\": \"David Winterm 15\"\n },\n {\n \"name\": \"Clause Comply 16\"\n }\n ],\n \"operators\": [10, 11]\n },\n \"customUsernames\": {\n \"10\": \"Toni Henson\",\n \"11\": \"Damon Reagan\"\n },\n \"groups\": [\n {\n \"name\": \"My Compliance Team\",\n \"description\": \"\",\n \"users\": [\"Clause Comply 16\", 11]\n },\n {\n \"name\": \"Group Wintermute\",\n \"description\": \"\",\n \"users\": [\"David Winterm 15\"]\n },\n {\n \"name\": \"Group Crypto.com\",\n \"description\": \"\",\n \"users\": [\"Mileva CC 13\", \"Adi CC 14\"]\n },\n {\n \"name\": \"Group Bybit\",\n \"description\": \"\",\n \"users\": [\"Grace Bybit 12\"]\n },\n {\n \"name\": \"Group OneOf\",\n \"description\": \"\",\n \"users\": [\"Hedy OneOf 10\", \"Joan Oneof 11\", 10]\n }\n ],\n \"whitelists\": [\n {\n \"name\": \"all exchanges\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"Kraken n1\",\n \"address\": \"tb1q7893kjx6gemqh4jpg5kld5r0qadmemu9kt6jxg\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"Binance n0\",\n \"address\": \"tb1qa87hqcqhec3g7dv03gncherlpvfh6wwt8nevnu\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"ETH classic\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum\"\n },\n {\n \"name\": \"ETH sepopo\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_sepolia\"\n }\n ]\n },\n {\n \"name\": \"wintermute addresses\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"Kraken n1\",\n \"address\": \"tb1q7893kjx6gemqh4jpg5kld5r0qadmemu9kt6jxg\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"Binance n0\",\n \"address\": \"tb1qa87hqcqhec3g7dv03gncherlpvfh6wwt8nevnu\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"ETH classic\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum\"\n },\n {\n \"name\": \"ETH sepopo\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_sepolia\"\n }\n ]\n },\n {\n \"name\": \"bybit addresses\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"Kraken n1\",\n \"address\": \"tb1q7893kjx6gemqh4jpg5kld5r0qadmemu9kt6jxg\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"Binance n0\",\n \"address\": \"tb1qa87hqcqhec3g7dv03gncherlpvfh6wwt8nevnu\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"ETH classic\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum\"\n },\n {\n \"name\": \"ETH sepopo\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_sepolia\"\n }\n ]\n },\n {\n \"name\": \"crypto.com addresses\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"BTC Reserves n1\",\n \"address\": \"tb1q7893kjx6gemqh4jpg5kld5r0qadmemu9kt6jxg\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"BTC Liquidity n0\",\n \"address\": \"tb1qa87hqcqhec3g7dv03gncherlpvfh6wwt8nevnu\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"ETH classic\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum\"\n },\n {\n \"name\": \"ETH sepopo\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_sepolia\"\n }\n ]\n },\n {\n \"name\": \"Oneof whitelist\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"bitcoin_testnet-1\",\n \"address\": \"tb1q645fc9qjq4h9779ph2f2ade5mpqprhr2k68mtj\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"ETH classic\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum\"\n },\n {\n \"name\": \"ETH sepopo\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_sepolia\"\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"TL-0001-ETH-OOF-KOM\",\n \"currency\": \"ethereum_sepolia\",\n \"tradelink_data\": {\n \"currency\": \"ethereum_sepolia\",\n \"exchanges\": [\n {\n \"id\": 1,\n \"approver_group_id\": 3,\n \"whitelist_id\": 4,\n \"name\": \"Crypto.com\",\n \"role\": \"EXCHANGE\",\n \"logo_url\": \"https://static.intercomassets.com/avatars/5265558/square_128/Logo-1636463979.jpg\",\n \"code\": \"CCc\",\n \"requires_pre_approval\": true\n },\n {\n \"id\": 2,\n \"approver_group_id\": 4,\n \"whitelist_id\": 3,\n \"name\": \"ByBit\",\n \"role\": \"EXCHANGE\",\n \"logo_url\": \"https://seeklogo.com/images/B/bybit-logo-4C31FD6A08-seeklogo.com.png\",\n \"code\": \"BBt\",\n \"requires_pre_approval\": true\n },\n {\n \"id\": 3,\n \"approver_group_id\": 2,\n \"whitelist_id\": 2,\n \"name\": \"Wintermute\",\n \"role\": \"EXCHANGE\",\n \"logo_url\": \"https://pbs.twimg.com/profile_images/1731739745997234176/wBqS9X5A_400x400.jpg\",\n \"code\": \"WIT\",\n \"requires_pre_approval\": true\n }\n ],\n \"asset_manager\": {\n \"id\": 1,\n \"approver_group_id\": 5,\n \"whitelist_id\": 5,\n \"name\": \"OneOf\",\n \"role\": \"ASSET_MANAGER\",\n \"logo_url\": \"https://pbs.twimg.com/profile_images/1623734503603593219/kJWLMu2O_400x400.jpg\",\n \"code\": \"OOF\"\n },\n \"custodian\": {\n \"id\": 1,\n \"approver_group_id\": 1,\n \"whitelist_id\": 1,\n \"role\": \"CUSTODIAN\",\n \"name\": \"Komainu\",\n \"logo_url\": \"https://pbs.twimg.com/profile_images/1412795738539581447/WoWVR9-f_400x400.png\",\n \"code\": \"KOM\"\n }\n },\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group Crypto.com\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"crypto.com addresses\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group Bybit\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"bybit addresses\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group Wintermute\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"wintermute addresses\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group OneOf\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"Oneof whitelist\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"all exchanges\"]\n }\n ]\n ]\n },\n {\n \"name\": \"bitcoin\",\n \"currency\": \"bitcoin_testnet\",\n \"derivationMode\": \"NATIVE_SEGWIT\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n }\n ]\n ]\n }\n ]\n}\n","export type TwoStepsRequestOption = {\n twoStepsRequest?: boolean;\n};\n\nexport const TWO_STEPS_REQUEST_OPTION = {\n name: \"twoStepsRequest\",\n description: \"Enable two-steps request (request creation resilient to timeouts, see VG-12436)\",\n type: Boolean,\n};\n\nexport type FormatOption = {\n format: \"table\" | \"json\";\n};\n\nexport const FORMAT_OPTION = {\n name: \"format\",\n alias: \"f\",\n type: String,\n typeLabel: \"json\",\n description: \"Output format {grey (available: table, json)}\",\n defaultValue: \"table\",\n};\n","import { BakeManifestOptions } from \"@ledgerhq/vault-common\";\nimport get from \"lodash/get\";\n\ntype RevaultOnboardingOptions = BakeManifestOptions[\"revaultOnboarding\"];\n\nexport type OptionalRevaultOnboardingOptions = Partial<RevaultOnboardingOptions> & {\n minivaultURL?: string;\n gate?: string;\n};\n\nexport const REVAULT_ONBOARDING_OPTIONS = [\n {\n name: \"compartmentId\",\n type: Number,\n description: \"{black.bgGreen.bold NEW } The compartment ID to use for the onboarding\",\n },\n {\n name: \"hsmScriptsVersion\",\n type: String,\n description:\n \"{black.bgGreen.bold NEW } The version of the HSM scripts to use for the onboarding\",\n },\n {\n name: \"revaultRootAuthToken\",\n type: String,\n description: \"{black.bgGreen.bold NEW } The revault root auth token to use to init onboarding\",\n },\n {\n name: \"revaultApiUrl\",\n type: String,\n description: \"{black.bgGreen.bold NEW } The target revault API URL to use for the onboarding\",\n },\n];\n\n/* istanbul ignore next */\nfunction extractMinivaultUrlFromGate(gate: string): string | undefined {\n const match = gate.match(/(https?:\\/\\/[^.]+\\.minivault\\.[^/]*)\\//);\n if (match) {\n return match[1];\n }\n}\n\n/* istanbul ignore next */\nfunction getInstanceNameFromMinivaultUrl(minivaultUrl: string): string {\n const match = minivaultUrl.match(/https?:\\/\\/([^.]+)\\.minivault\\..*/);\n const instanceName = match && match[1];\n if (!instanceName) {\n throw new Error(`Could not extract instance name from minivault URL: ${minivaultUrl}`);\n }\n return instanceName;\n}\n\nexport /* istanbul ignore next */ async function extractRevaultOnboardingOptions(\n maybeOptions: OptionalRevaultOnboardingOptions,\n): Promise<RevaultOnboardingOptions | undefined> {\n let compartmentId = maybeOptions.compartmentId;\n let revaultRootAuthToken = maybeOptions.revaultRootAuthToken;\n let revaultApiUrl = maybeOptions.revaultApiUrl;\n let hsmScriptsVersion = maybeOptions.hsmScriptsVersion;\n\n // if any of the info is missing, let's try to see if we are in a minivault context\n if (\n compartmentId === undefined ||\n revaultRootAuthToken === undefined ||\n revaultApiUrl === undefined ||\n hsmScriptsVersion === undefined\n ) {\n let minivaultURL = maybeOptions.minivaultURL;\n const gate = maybeOptions.gate;\n if (minivaultURL === undefined && gate !== undefined) {\n minivaultURL = extractMinivaultUrlFromGate(gate);\n }\n\n // super hacky way to try to guess the infos through vault-remote (for retro-compat)\n if (minivaultURL !== undefined) {\n const remoteUrl = minivaultURL.replace(/https:\\/\\/[^.]+/, \"https://remote\");\n const instanceName = getInstanceNameFromMinivaultUrl(minivaultURL);\n\n // @ts-expect-error for some reason it doesn't know the native fetch\n const instanceValuesResponse = await fetch(`${remoteUrl}/api/instances/${instanceName}`);\n const instanceValues = await instanceValuesResponse.json();\n\n compartmentId =\n compartmentId ?? (get(instanceValues, \"values.hsm.compartmentID\") as number | undefined);\n hsmScriptsVersion =\n hsmScriptsVersion ??\n (get(instanceValues, \"values.gate.hsmScriptsVersion\") as string | undefined);\n revaultApiUrl = revaultApiUrl ?? `${minivaultURL}/api`;\n revaultRootAuthToken = revaultRootAuthToken ?? \"root-auth-token\";\n }\n }\n\n if (\n compartmentId !== undefined &&\n revaultApiUrl !== undefined &&\n revaultRootAuthToken !== undefined &&\n hsmScriptsVersion !== undefined\n ) {\n return { compartmentId, hsmScriptsVersion, revaultApiUrl, revaultRootAuthToken };\n }\n}\n","import { WipeOptions, wipeBackend } from \"@ledgerhq/vault-common\";\n\nimport { GATE_OPTION, MINIVAULT_OPTION } from \"../gateOptions\";\nimport getCertFromPFX from \"../getCertFromPFX\";\nimport lamOptions from \"../lamOptions\";\nimport logger from \"../logger\";\n\nexport type WipeCommandOptions = {\n gate: string;\n lam?: string;\n lamAPIKey?: string;\n // used to patch gate in __patchGateOptionsWithEnvVariables\n minivault?: boolean;\n compartment: number;\n hsm: string;\n hsmCert: string;\n hsmCertPassword: string;\n monotonicCountersSize?: number;\n fileSystemSize?: number;\n};\n\nexport async function wipe(options: WipeCommandOptions): Promise<void> {\n if (!options.hsmCert) {\n throw new Error(\n \"You must specify the path to your HSM certificate in your environment variable VAULT_HSM_CLIENT_CERT_PATH or use the --hsmCert flag\",\n );\n }\n\n const cert = await getCertFromPFX(options.hsmCert, options.hsmCertPassword);\n\n const wipeOptions: WipeOptions = {\n gate: options.gate,\n lam: options.lam,\n lamAPIKey: options.lamAPIKey,\n hsmCompartmentID: options.compartment,\n hsmEndpoint: options.hsm,\n hsmCert: cert.cert,\n hsmCertKey: cert.key,\n monotonicCountersSize: options.monotonicCountersSize,\n fileSystemSize: options.fileSystemSize,\n };\n return wipeBackend(wipeOptions, { logger });\n}\n\nexport const wipeOptions = [\n {\n name: \"compartment\",\n alias: \"c\",\n type: Number,\n description: \"HSM compartment ID {blue $VAULT_COMPARTMENT_ID}\",\n defaultValue: process.env.VAULT_COMPARTMENT_ID,\n },\n {\n name: \"hsm\",\n type: String,\n description: \"HSM endpoint {blue $VAULT_HSM_ENDPOINT}\",\n defaultValue: process.env.VAULT_HSM_ENDPOINT,\n },\n {\n name: \"hsmCert\",\n type: String,\n description: \"Path to HSM certificate {blue $VAULT_HSM_CLIENT_CERT_PATH}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PATH,\n },\n {\n name: \"hsmCertPassword\",\n type: String,\n description: \"HSM certificate password {blue $VAULT_HSM_CLIENT_CERT_PWD}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PWD,\n },\n {\n name: \"monotonicCountersSize\",\n type: Number,\n description: \"Size of monotonic counters\",\n },\n {\n name: \"fileSystemSize\",\n type: Number,\n description: \"Size of file system\",\n },\n];\n\nexport default {\n command: \"wipe\",\n description: \"Wipe backend data and reset it to onboarding state\",\n help: [{ content: \"{grey $} ledger-vault wipe [options]\" }],\n options: [GATE_OPTION, MINIVAULT_OPTION, ...wipeOptions, ...lamOptions],\n run: wipe,\n};\n","import { createDevicesPool } from \"@ledgerhq/vault-common\";\nimport bodyParser from \"body-parser\";\nimport cors from \"cors\";\nimport express from \"express\";\nimport { nanoid } from \"nanoid\";\n\nimport logger from \"../logger\";\n\ntype BridgeOptions = {\n port: number;\n networkDelay?: number;\n};\n\n/* istanbul ignore file */\nasync function bridge({ port, networkDelay }: BridgeOptions): Promise<void> {\n // eslint-disable-next-line no-console\n console.log({ networkDelay });\n const server = express();\n server.use(cors());\n server.use(bodyParser.json());\n server.use(bodyParser.text());\n\n server.use((req, res, next) => {\n logger.info(`${req.method} ${req.url}`);\n next();\n });\n\n server.listen(port, () => {\n logger.success(`Bridge listening on port ${port}`);\n });\n\n server.post(\"/login\", async (req, res) => {\n const { salt, gate, device = 4, readOnlyUser, deviceAPI } = req.body;\n try {\n // @ts-ignore\n const pool = createDevicesPool({\n salt,\n gate,\n readOnlyUser,\n networkDelay,\n deviceAPIURL: deviceAPI,\n deviceAPISessionID: nanoid(),\n });\n const user = await pool.login(device);\n res.send({ token: user.getToken() });\n } catch (err) {\n logger.error(err);\n // @ts-expect-error\n res.status(500).send(`Error: ${err.toString()}`);\n }\n });\n\n server.post(\"/userID\", async (req, res) => {\n const { salt, gate, device = 4, deviceAPI } = req.body;\n try {\n // @ts-ignore\n const pool = createDevicesPool({\n salt,\n gate,\n networkDelay,\n deviceAPIURL: deviceAPI,\n deviceAPISessionID: nanoid(),\n });\n const userID = await pool.getUserID(device);\n res.send({ userID });\n } catch (err) {\n logger.error(err);\n // @ts-expect-error\n res.status(500).send(`Error: ${err.toString()}`);\n }\n });\n\n server.post(\"/register\", async (req, res) => {\n const { gate, salt, device, request, deviceAPI } = req.body;\n try {\n // @ts-ignore\n const pool = createDevicesPool({\n salt,\n gate,\n networkDelay,\n deviceAPIURL: deviceAPI,\n deviceAPISessionID: nanoid(),\n });\n await pool.registerDevice(device, request);\n return res.send({});\n } catch (err) {\n logger.error(err);\n // @ts-expect-error\n res.status(500).send(`Error: ${err.toString()}`);\n }\n });\n\n server.post(\"/approve\", async (req, res) => {\n const { gate, salt, device, requestID } = req.body;\n try {\n // @ts-ignore\n const pool = createDevicesPool({\n salt,\n gate,\n networkDelay,\n deviceAPISessionID: nanoid(),\n });\n const user = await pool.login(device);\n await user.approveRequest({ id: requestID });\n return res.send({});\n } catch (err) {\n logger.error(err);\n // @ts-expect-error\n res.status(500).send(`Error: ${err.toString()}`);\n }\n });\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const p: Promise<void> = new Promise(() => {});\n return p;\n}\n\nexport default {\n command: \"bridge\",\n description: \"Open a bridge to pilot vault-common from outside via HTTP\",\n help: [\n {\n header: \"Usage\",\n content: [\"{grey $} ledger-vault bridge\"],\n },\n ],\n options: [\n {\n name: \"port\",\n type: Number,\n description: \"Bridge HTTP port\",\n defaultValue: 4242,\n },\n {\n name: \"networkDelay\",\n type: Number,\n description: \"Delay between requests\",\n defaultValue: 1,\n },\n ],\n run: bridge,\n};\n","import {\n ConfigCatConfiguration,\n createConfigCatEnvironment,\n deleteConfigCatEnvironment,\n setConfigCatFeatureFlagValues,\n} from \"@ledgerhq/vault-common\";\nimport chalk from \"chalk\";\n\nimport logger from \"../logger\";\n\nexport type ConfigcatOptions = {\n env: string;\n sbx: boolean;\n stg: boolean;\n ppr: boolean;\n data: string | null;\n apiKey: string | null;\n productId: string | null | undefined;\n configId: string | null | undefined;\n};\n\nconst asciiArtConfigCatHeader = ` \n ## \n ## #### \n #### ###### \n ################## \n #####*********#### \n ###-+:-+::#@@@:### ###\n ###-=::+::@@@@-### #####\n ####*+======++#### #####\n *#######+*#######* #####\n ::+++*###**####***= ####\n ################ ##### \n ################### \n`;\n\nfunction getConfigCatConfiguration(options: ConfigcatOptions): Promise<ConfigCatConfiguration> {\n const apiKey = process.env[\"CONFIGCAT_API_KEY\"] || options.apiKey;\n let productId = process.env[\"CONFIGCAT_PRODUCT_ID\"] || options.productId;\n let configId = process.env[\"CONFIGCAT_CONFIG_ID\"] || options.configId;\n if (options.sbx) {\n productId = process.env.CONFIGCAT_SBX_PRODUCT_ID;\n configId = process.env.CONFIGCAT_SBX_CONFIG_ID;\n } else if (options.stg) {\n productId = process.env.CONFIGCAT_STG_PRODUCT_ID;\n configId = process.env.CONFIGCAT_STG_CONFIG_ID;\n } else if (options.ppr) {\n productId = process.env.CONFIGCAT_PPR_PRODUCT_ID;\n configId = process.env.CONFIGCAT_PPR_CONFIG_ID;\n }\n if (!apiKey || !productId || !configId)\n throw Error(\n \"One of ConfigCat data (apiKey, productId or configId) is missing. Please use --help to know about relevant env variables or CLI options.\",\n );\n const config = { apiKey, productId, configId };\n return Promise.resolve(config);\n}\n\nexport const configCatCreate = async (options: ConfigcatOptions): Promise<void> => {\n const response = await getConfigCatConfiguration(options).then((config) =>\n createConfigCatEnvironment(config, options.env),\n );\n // not using logger here because we want to be able to use \"jq\" to parse the output\n /* istanbul ignore next */ console.log(JSON.stringify(response));\n};\n\nexport const configCatSetFlags = async (options: ConfigcatOptions): Promise<void> => {\n let jsonData = {};\n try {\n jsonData = JSON.parse(options.data || \"{}\");\n } catch (error) {\n throw Error(\"Invalid JSON input for feature flags data\");\n }\n await getConfigCatConfiguration(options).then((config) =>\n setConfigCatFeatureFlagValues(config, options.env, jsonData, { logger }),\n );\n};\n\nexport const configCatDelete = async (options: ConfigcatOptions): Promise<void> => {\n await getConfigCatConfiguration(options).then((configcatConfig) =>\n deleteConfigCatEnvironment(configcatConfig, options.env),\n );\n};\n\nconst subCommandConfigCatCreate = {\n command: \"create\",\n description: \"Create a ConfigCat environment\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault configcat create -e foo\"],\n },\n ],\n options: [\n {\n name: \"env\",\n alias: \"e\",\n type: String,\n description: \"ConfigCat environment name\",\n required: true,\n },\n ],\n run: configCatCreate,\n};\n\nconst subCommandConfigCatSetFlags = {\n command: \"setFlags\",\n description: \"Set flags within a ConfigCat environment\",\n help: [\n {\n header: \"Examples\",\n content: [\n '{grey $} ledger-vault configcat setFlags -e foo -d \\'\\\\{\"flag1\": true, \"flag2\": false\\\\}\\'',\n ],\n },\n ],\n options: [\n {\n name: \"env\",\n alias: \"e\",\n type: String,\n description: \"ConfigCat environment name\",\n required: true,\n },\n {\n name: \"data\",\n alias: \"d\",\n description: \"Feature flags to set, JSON format expected\",\n type: String,\n defaultValue: \"{}\",\n },\n ],\n run: configCatSetFlags,\n};\n\nconst subCommandConfigCatDelete = {\n command: \"delete\",\n description: \"Delete a ConfigCat environment\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault configcat delete -e foo\"],\n },\n ],\n options: [\n {\n name: \"env\",\n alias: \"e\",\n type: String,\n description: \"ConfigCat environment name\",\n required: true,\n },\n ],\n run: configCatDelete,\n};\n\nexport default {\n command: \"configcat\",\n description: \"Manage ConfigCat environments and feature flags\",\n help: [\n { content: chalk.red(asciiArtConfigCatHeader), raw: true },\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault configcat --sbx --apiKey <sbxSecret> create ...\",\n \"{grey $} ledger-vault configcat --ppr --apiKey <pprSecret> setFlags ...\",\n \"{grey $} ledger-vault configcat --stg --apiKey <stgSecret> delete ...\",\n \"# or use those env variables\",\n '{grey $} CONFIGCAT_API_KEY=\"...\" CONFIGCAT_PRODUCT_ID=\"...\" CONFIGCAT_CONFIG_ID=\"...\" ledger-vault configcat ...',\n ],\n },\n {\n header: \"Where to find the needed env variables ?\",\n content: [\n \"{italic CONFIGCAT_API_KEY}\",\n \"You need to create your own !\",\n \"Go to {underline https://app.configcat.com/my-account/public-api-credentials} and get your base64 encoded auth header (without the 'Basic' part)\",\n \"\",\n \"{italic CONFIGCAT_PRODUCT_ID & CONFIGCAT_CONFIG_ID}\",\n \"First and second parts of the URL when you are on the flags page\",\n \"-> {underline https://app.configcat.com/<CONFIGCAT_PRODUCT_ID>/<CONFIGCAT_CONFIG_ID>/...}\",\n ],\n },\n ],\n options: [\n {\n name: \"apiKey\",\n type: String,\n description:\n \"Your own ConfigCat API key (basic auth), this uses by default CONFIGCAT_API_KEY.\",\n },\n {\n name: \"productId\",\n type: String,\n description:\n \"See {underline https://configcat.com/docs/main-concepts/#product}, this uses by default CONFIGCAT_PRODUCT_ID.\",\n },\n {\n name: \"configId\",\n type: String,\n description:\n \"See {underline https://configcat.com/docs/main-concepts/#config}, this uses by default CONFIGCAT_CONFIG_ID.\",\n },\n {\n name: \"sbx\",\n description:\n \"Autofill SBX data using CONFIGCAT_SBX_PRODUCT_ID & CONFIGCAT_SBX_CONFIG_ID env variables.\",\n type: Boolean,\n defaultValue: false,\n },\n {\n name: \"stg\",\n description:\n \"Autofill STG data using CONFIGCAT_STG_PRODUCT_ID & CONFIGCAT_STG_CONFIG_ID env variables.\",\n type: Boolean,\n defaultValue: false,\n },\n {\n name: \"ppr\",\n description:\n \"Autofill PPR data using CONFIGCAT_PPR_PRODUCT_ID & CONFIGCAT_PPR_CONFIG_ID env variables.\",\n type: Boolean,\n defaultValue: false,\n },\n ],\n subCommands: [subCommandConfigCatCreate, subCommandConfigCatSetFlags, subCommandConfigCatDelete],\n};\n","import { bakeManifest, createDevicesPool } from \"@ledgerhq/vault-common\";\nimport {\n EntityType,\n Manifest,\n ManifestAccount,\n ManifestAccountRule,\n ManifestWhitelistAddress,\n PoolOptions,\n} from \"@ledgerhq/vault-common/types\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport logger from \"../logger\";\nimport {\n FORMAT_OPTION,\n FormatOption,\n TWO_STEPS_REQUEST_OPTION,\n TwoStepsRequestOption,\n} from \"../miscOptions\";\nimport { CliOptions, GateOptions } from \"../types\";\nimport { queryEntityWithPoolByName } from \"./get\";\n\nexport type CreateOptions<T> = GateOptions &\n TwoStepsRequestOption &\n FormatOption &\n CliOptions & {\n device: number | \"api\" | \"lam\";\n noApproval: boolean;\n command: T;\n };\n\ntype CreatePolicy = CreateOptions<\"policy\"> & {\n name: string;\n currency?: string;\n rules: string;\n};\n\ntype CreateGroup = CreateOptions<\"group\"> & {\n name: string;\n users: string;\n description?: string;\n};\n\ntype CreateUser = CreateOptions<\"user\"> & {\n name: string;\n role: string;\n viewAll?: boolean;\n publicKey?: string;\n};\n\ntype CreateWhitelist = CreateOptions<\"whitelist\"> & {\n name: string;\n addresses: string[];\n type?: \"TRANSACTION\" | \"SMART_CONTRACT\";\n};\n\ntype CreateExchange = CreateOptions<\"exchange\"> & {\n name: string;\n platform: string;\n status?: \"PENDING\" | \"ACTIVE\" | \"ABORTED\";\n rules?: string;\n apiKey: string;\n apiSecret: string;\n};\n\ntype CreateAccount = CreateOptions<\"account\"> & {\n name: string;\n currency?: string;\n accountType?: string;\n contractAddress?: string;\n parentAccount?: string;\n rules?: string;\n policy?: string;\n derivationMode?: \"standard\" | \"native_segwit\";\n index?: number;\n\n // VG-10744 ability to create read-only account based on xPub / network parameters\n xpub?: string;\n publicKey?: string;\n chainCode?: string;\n\n // ability to enable NFT gallery\n enableNFTGallery?: boolean;\n\n // wait for account status to be ACTIVE (synced) after creation\n waitForActive?: boolean;\n};\n\ntype CreateVaultEntity = CreateOptions<\"entity\"> & {\n name: string;\n accounts: string;\n};\n\nexport type CreateEntity =\n | CreateGroup\n | CreateUser\n | CreateWhitelist\n | CreateExchange\n | CreateAccount\n | CreateVaultEntity\n | CreatePolicy;\n\nconst entityTypeByCommand: Record<string, EntityType> = {\n user: \"USER\",\n group: \"GROUP\",\n whitelist: \"WHITELIST\",\n account: \"ACCOUNT\",\n exchange: \"EXCHANGE\",\n entity: \"VAULT_ENTITY\",\n policy: \"POLICY\",\n};\n\nexport const createEntity = async (opts: CreateEntity): Promise<void> => {\n const poolOptions: PoolOptions = {\n salt: opts.salt,\n gate: opts.gate,\n apiGateway: opts.apiGateway,\n transport: opts.transport,\n lamURL: opts.lam,\n lamAPIKey: opts.lamAPIKey,\n deviceAPIURL: opts.deviceAPI,\n };\n const { networkDelay, noApproval, twoStepsRequest } = opts;\n\n const pool = createDevicesPool({\n ...poolOptions,\n lamURL: opts.lam,\n networkDelay,\n });\n\n let manifest: Manifest | null = null;\n\n if (opts.command === \"group\") {\n const { name, users, description } = opts;\n\n manifest = {\n groups: [\n {\n name,\n users: users\n .split(\",\")\n // @ts-ignore this condition will always return 'false' since the types 'number' and 'string' have no overlap.\n .map((u) => (parseInt(u) == u ? Number(u) : u)),\n description,\n status: /* istanbul ignore next */ noApproval ? \"PENDING\" : undefined,\n },\n ],\n };\n }\n\n if (opts.command === \"user\") {\n const { device, role, name, viewAll, publicKey } = opts;\n const users = {};\n\n manifest = {};\n\n if (device === \"api\") {\n Object.assign(users, {\n apiV2: [\n {\n name,\n publicKey,\n role: role || \"operator\",\n ...(viewAll ? { viewAll } : {}),\n },\n ],\n });\n } else if (device === \"lam\") {\n Object.assign(users, {\n api: [viewAll ? /* istanbul ignore next */ { name, viewAll } : name],\n });\n } else {\n if (isNaN(device)) {\n throw new Error(\n `Invalid value \"${device}\" for device, must be either \"lam\", \"api\" or a number`,\n );\n }\n if (!role) {\n throw new Error(\"`role` option is required when creating regular (non-API) user\");\n }\n if ([\"admin\", \"operator\"].indexOf(role) === -1) {\n throw new Error(`invalid role \\`${role}\\``);\n }\n const key = `${role}s`;\n Object.assign(users, { [key]: [Number(device)] });\n Object.assign(manifest, { customUsernames: { [device]: name } });\n }\n Object.assign(manifest, { users });\n }\n\n if (opts.command === \"whitelist\") {\n const { name, addresses, type } = opts;\n\n manifest = {\n whitelists: [\n {\n name,\n type,\n addresses: addresses.map((a) => {\n const s = a.split(\"|\");\n\n // istanbul ignore next\n const result: ManifestWhitelistAddress = {\n currency: s[0] || \"\",\n name: s[1] || \"\",\n address: s[2] || \"\",\n };\n\n if (s.length === 4) {\n const destination_tags: number[] = JSON.parse(s[3]!);\n return { ...result, destination_tags };\n }\n\n if (s.length !== 3)\n throw new Error(\"invalid address format, should be currency|name|address\");\n // istanbul ignore next\n return result;\n }),\n status: noApproval /* istanbul ignore next */ ? \"PENDING\" : undefined,\n },\n ],\n };\n }\n\n if (opts.command === \"account\") {\n let rules;\n if (opts.rules) {\n try {\n rules = JSON.parse(opts.rules);\n } catch {\n throw new Error(\"Invalid rules given\");\n }\n }\n\n const manifestAccount: ManifestAccount = {\n name: opts.name,\n status: noApproval ? \"PENDING\" : undefined,\n policy: opts.policy,\n ...(rules ? { rules } : {}),\n ...(opts.index !== undefined ? { index: opts.index } : {}),\n ...(opts.contractAddress\n ? /* istanbul ignore next */ {\n contractAddress: opts.contractAddress,\n ...(opts.parentAccount\n ? /* istanbul ignore next */ {\n parentAccount: opts.parentAccount,\n }\n : /* istanbul ignore next */ {}),\n }\n : opts.currency\n ? {\n currency: opts.currency,\n ...(opts.derivationMode ? { derivationMode: opts.derivationMode } : {}),\n }\n : (() => {\n throw new Error(`No currency or contractAddress in account`);\n })()),\n ...(\"xpub\" in opts || \"publicKey\" in opts || \"chainCode\" in opts\n ? (() => {\n if (!opts.xpub || !opts.publicKey || !opts.chainCode)\n throw new Error(\n \"xpub / publicKey / chainCode must be defined together in order to work\",\n );\n return {\n readOnly: {\n xpub: opts.xpub,\n publicKey: opts.publicKey,\n chainCode: opts.chainCode,\n },\n };\n })()\n : {}),\n ...(opts.accountType ? { accountType: opts.accountType } : {}),\n ...(opts.enableNFTGallery ? { config: { nftGallery: true } } : {}),\n };\n\n manifest = {\n accounts: [manifestAccount],\n };\n }\n\n if (opts.command === \"entity\") {\n const { name, accounts } = opts;\n\n manifest = {\n entities: [\n {\n name,\n accounts: accounts.split(\",\"),\n status: /* istanbul ignore next */ noApproval ? \"PENDING\" : undefined,\n },\n ],\n };\n }\n\n if (opts.command === \"exchange\") {\n const { name, apiKey, apiSecret, platform, rules: _rules } = opts;\n const rules = _rules ? (JSON.parse(_rules) as Array<ManifestAccountRule[]>) : undefined;\n manifest = {\n exchanges: [\n {\n name,\n platform,\n status: /* istanbul ignore next */ noApproval ? \"PENDING\" : undefined,\n rules,\n configuration: {\n apiKey,\n apiSecret,\n },\n },\n ],\n };\n }\n\n if (opts.command === \"policy\") {\n const { name, currency, rules: _rules } = opts;\n const rules = JSON.parse(_rules) as Array<ManifestAccountRule[]>;\n manifest = {\n policies: [\n {\n name,\n ...(currency ? { currency } : {}),\n rules,\n },\n ],\n };\n }\n\n if (!manifest) {\n throw new Error(\"Nothing to bake\");\n }\n\n await bakeManifest(manifest, pool, {\n noApproval,\n twoStepsRequest,\n waitForActive: \"waitForActive\" in opts ? opts.waitForActive : undefined,\n logger: opts.format !== \"json\" ? logger : undefined,\n });\n\n await queryEntityWithPoolByName(\n // @ts-ignore\n {\n ...poolOptions,\n format: opts.format,\n },\n opts.name,\n entityTypeByCommand[opts.command],\n );\n};\n\nexport default {\n command: \"create\",\n description: \"Create users, groups, accounts, entities...\",\n options: [\n ...gateOptions,\n ...lamOptions,\n ...cliOptions,\n {\n name: \"noApproval\",\n type: Boolean,\n description: \"Create the request without approving it\",\n },\n ],\n subCommands: [\n {\n command: \"user\",\n description: \"Create a user of the given role\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{blue # Create a regular user:}\",\n \"{grey $} ledger-vault create user {bold --name} Bob {bold --role} admin {bold --device} 28\",\n \"\",\n \"{blue # Create a LAM user:}\",\n \"{grey $} ledger-vault create user {bold --name} BobLAM {bold --device} lam\",\n \"\",\n \"{blue # Create an API user:}\",\n \"{grey $} ledger-vault create user {bold --name} BobAPI {bold --device} api {bold --publicKey} 04a7629e22eaeeccddf13349a0a88fd401d31e2275c53e4acb526f56510f80a5db82dd52d10c5720779c3d065eaca87c75e0cabbfd2cf9eddd3202d1563db97177\",\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"User name\",\n required: true,\n },\n {\n name: \"role\",\n typeLabel: \"{underline role}\",\n description: \"One of: admin, operator\",\n type: String,\n },\n {\n name: \"device\",\n description: \"'lam' for LAM user, 'api' for API user, or device index to generate seed\",\n default: 1,\n type: String,\n required: true,\n },\n {\n name: \"viewAll\",\n description: \"User has view all rights\",\n default: false,\n type: Boolean,\n },\n {\n name: \"publicKey\",\n description: \"API user's secp256r1 public key\",\n type: String,\n },\n FORMAT_OPTION,\n ],\n run: createEntity,\n },\n {\n command: \"group\",\n description: \"Create a group\",\n help: [\n {\n header: \"Examples\",\n content: [\n '{grey $} ledger-vault create group --name GroupA --users 11,12 --description \"Some description here\"',\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Group name\",\n required: true,\n },\n {\n name: \"description\",\n description: \"Group description\",\n type: String,\n },\n {\n name: \"users\",\n description: \"List of users device index\",\n type: String,\n required: true,\n },\n TWO_STEPS_REQUEST_OPTION,\n FORMAT_OPTION,\n ],\n run: createEntity,\n },\n {\n command: \"account\",\n description: \"Create an account\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault create account {bold --name} btc1 {bold --currency} bitcoin\",\n \"{grey $} ledger-vault create account {bold --name} lgc1 {bold --contractAddress} 0x9549E8A940062615ceE20C0420C98c25Ffa2b214 {bold --parentAccount} eth1\",\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Account name\",\n required: true,\n },\n {\n name: \"currency\",\n description: \"Account currency\",\n type: String,\n },\n {\n name: \"accountType\",\n description: \"Specify the account type (see Gate 'account_type')\",\n type: String,\n },\n {\n name: \"contractAddress\",\n description: \"Account contract address\",\n type: String,\n },\n {\n name: \"parentAccount\",\n description: \"Account parent\",\n type: String,\n },\n {\n name: \"derivationMode\",\n type: String,\n description:\n \"Derivation mode: can be '{magenta native_segwit}' (default) or '{magenta standard}' (legacy) (available only for: bitcoin, bitcoin_testnet)\",\n },\n {\n name: \"index\",\n type: Number,\n description: \"Account index\",\n },\n {\n name: \"rules\",\n type: String,\n },\n {\n name: \"policy\",\n type: String,\n description: \"Policy name to attach to the account\",\n },\n {\n name: \"xpub\",\n type: String,\n description: \"{yellow.bold read-only} Account xPub\",\n },\n {\n name: \"address\",\n type: String,\n description: \"{yellow.bold read-only} Account EVM address\",\n },\n {\n name: \"publicKey\",\n type: String,\n description: \"{yellow.bold read-only} Account public key\",\n },\n {\n name: \"chainCode\",\n type: String,\n description: \"{yellow.bold read-only} Account chain-code\",\n },\n {\n name: \"enableNFTGallery\",\n type: Boolean,\n description: \"If passed, enable NFT gallery for account\",\n },\n {\n name: \"waitForActive\",\n type: Boolean,\n description: \"Wait for account status to be ACTIVE (synced) after creation\",\n },\n TWO_STEPS_REQUEST_OPTION,\n FORMAT_OPTION,\n ],\n run: createEntity,\n },\n {\n command: \"whitelist\",\n description: \"Create a whitelist\",\n help: [\n {\n header: \"Examples\",\n content: [\n '{grey $} ledger-vault create whitelist {bold --name} whitelistname1 {bold --description} someDescription {bold --addresses} \"bitcoin|btc_name|1F1tAa....\" \"dash|my_dash_name|XqHt831...\" ',\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Whitelist name\",\n required: true,\n },\n {\n name: \"description\",\n description: \"Whitelist description\",\n type: String,\n },\n {\n name: \"type\",\n description: \"Whitelist type (TRANSACTION|SMART_CONTRACT)\",\n type: String,\n },\n {\n name: \"addresses\",\n description:\n 'List of addresses with the \"currency|name|address\" \"currency|name|address\" ...',\n type: String,\n required: true,\n multiple: true,\n },\n TWO_STEPS_REQUEST_OPTION,\n FORMAT_OPTION,\n ],\n run: createEntity,\n },\n {\n command: \"entity\",\n description: \"Create an entity\",\n help: [\n {\n header: \"Examples\",\n content: [\n `{grey $} ledger-vault create entity --name EntityA --accounts \"BTC Testnet 1,ETH Ropsten 1\"`,\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Entity name\",\n required: true,\n },\n {\n name: \"accounts\",\n description: \"List of accounts name, separated by a comma\",\n type: String,\n required: true,\n },\n ],\n run: createEntity,\n },\n {\n command: \"exchange\",\n description: \"Import an exchange\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault create exchange {bold --name} awesome-exchange {bold --platform} binance {bold --apiKey} foo {bold --apiSecret} bar\",\n \"{grey # With custom rules:}\",\n `{grey $} ledger-vault create exchange {bold --name} awesome-exchange {bold --platform} binance {bold --apiKey} foo {bold --apiSecret} bar {bold --rules} '[ [ \\\\{ \"type\": \"MULTI_AUTHORIZATIONS\", \"steps\": [\\\\{ \"quorum\": 1, \"users\": [10] \\\\}] \\\\} ] ]'`,\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Exchange name\",\n required: true,\n },\n {\n name: \"platform\",\n description: \"Which platform to connect with (e.g: {magenta binance})\",\n type: String,\n required: true,\n },\n {\n name: \"apiKey\",\n description: \"API key\",\n type: String,\n required: true,\n },\n {\n name: \"apiSecret\",\n description: \"API secret\",\n type: String,\n required: true,\n },\n {\n name: \"rules\",\n description: \"Send rules, passed as stringified JSON\",\n type: String,\n },\n TWO_STEPS_REQUEST_OPTION,\n FORMAT_OPTION,\n ],\n run: createEntity,\n },\n {\n command: \"policy\",\n description: \"Create a policy\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault create policy {bold --name} awesome-policy {bold --currency} bitcoin\",\n \"{grey # With custom rules:}\",\n `{grey $} ledger-vault create policy {bold --name} awesome-policy {bold --currency} bitcoin {bold --rules} '[ [ \\\\{ \"type\": \"MULTI_AUTHORIZATIONS\", \"steps\": [\\\\{ \"quorum\": 1, \"users\": [10] \\\\}] \\\\} ] ]'`,\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Policy name\",\n required: true,\n },\n {\n name: \"currency\",\n description: \"Policy currency (don't pass the option to create a currency-less policy)\",\n type: String,\n },\n {\n name: \"rules\",\n description: \"Send rules, passed as stringified JSON\",\n type: String,\n required: true,\n },\n TWO_STEPS_REQUEST_OPTION,\n FORMAT_OPTION,\n ],\n run: createEntity,\n },\n ],\n};\n","import { createDevicesPool, fetchTokens } from \"@ledgerhq/vault-common\";\nimport {\n Connection,\n EntityType,\n GateEntity,\n GateTokenCurrency,\n PoolOptions,\n} from \"@ledgerhq/vault-common\";\nimport qs from \"qs\";\n\nimport cliOptions from \"../cliOptions\";\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\nimport { displayTable } from \"../utils\";\n\nexport default {\n command: \"get\",\n description: \"Query entities\",\n options: [\n {\n name: \"format\",\n alias: \"f\",\n type: String,\n typeLabel: \"json\",\n description: \"Output format {grey (available: table, json)}\",\n defaultValue: \"table\",\n },\n {\n name: \"pageSize\",\n type: Number,\n description: \"Number of items to display\",\n },\n {\n name: \"page\",\n type: Number,\n description: \"Page number\",\n defaultValue: 1,\n },\n ...cliOptions,\n deviceOption,\n ...gateOptions,\n ],\n subCommands: [\n {\n command: \"users\",\n description: \"Get the list of users\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault get users\"],\n },\n ],\n options: [],\n run: async (options: QueryEntityWithPoolOptions): Promise<void> =>\n queryEntitiesWithPool(\n options,\n \"/people\",\n {\n role: [\"ADMIN\", \"OPERATOR\"],\n },\n \"USER\",\n ),\n },\n {\n command: \"groups\",\n description: \"Get the list of groups\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault get groups\"],\n },\n ],\n options: [],\n run: async (options: QueryEntityWithPoolOptions): Promise<void> =>\n queryEntitiesWithPool(options, \"/groups\", {}, \"GROUP\"),\n },\n {\n command: \"accounts\",\n description: \"Get the list of accounts\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault get accounts\"],\n },\n ],\n options: [],\n run: async (options: QueryEntityWithPoolOptions): Promise<void> =>\n queryEntitiesWithPool(options, \"/accounts\", {}, \"ACCOUNT\"),\n },\n {\n command: \"whitelists\",\n description: \"Get the list of whitelists\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault get whitelists\"],\n },\n ],\n options: [],\n run: async (options: QueryEntityWithPoolOptions): Promise<void> =>\n queryEntitiesWithPool(options, \"/whitelists\", {}, \"WHITELIST\"),\n },\n {\n command: \"transactions\",\n description: \"Get the list of the 30 latest transactions\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault get transactions\"],\n },\n ],\n options: [],\n run: async (options: QueryEntityWithPoolOptions): Promise<void> =>\n queryEntitiesWithPool(\n options,\n \"/transactions\",\n {\n pageSize: 30,\n },\n \"TRANSACTION\",\n ),\n },\n {\n command: \"entities\",\n description: \"Get the list of entities\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault get entities\"],\n },\n ],\n options: [],\n run: async (options: QueryEntityWithPoolOptions): Promise<void> =>\n queryEntitiesWithPool(options, \"/entities\", {}, \"VAULT_ENTITY\"),\n },\n ],\n};\n\nconst queryEntitiesWithPool = async (\n {\n gate,\n apiGateway,\n salt,\n readOnlyUser,\n format,\n pageSize,\n page,\n device,\n transport,\n lam,\n networkDelay,\n deviceAPI,\n }: QueryEntityWithPoolOptions,\n url: string,\n query: any,\n entityType: EntityType,\n) => {\n const opts: PoolOptions = {\n gate,\n apiGateway,\n transport,\n salt,\n readOnlyUser,\n lamURL: lam,\n deviceAPIURL: deviceAPI,\n networkDelay,\n };\n const pool = createDevicesPool(opts);\n // istanbul ignore next\n const admin = await pool.login(Number(device || 4));\n let tokens: GateTokenCurrency[] = [];\n if (entityType === \"ACCOUNT\") {\n tokens = await fetchTokens(admin, { logger });\n }\n\n const q = qs.stringify(\n {\n ...query,\n pageSize: pageSize || query.pageSize || -1,\n page,\n },\n { indices: false },\n );\n const data = await admin.network<Connection<GateEntity>>(\"GET\", `${url}?${q}`);\n if (format === \"json\") {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(data.edges.map((edge: any) => edge.node)));\n } else {\n const extraData = { tokens };\n displayTable(data, entityType, extraData);\n }\n};\n\nconst tableEntityUrl: {\n [key in EntityType]: string;\n} = {\n USER: \"/people\",\n GROUP: \"/groups\",\n ACCOUNT: \"/accounts\",\n WHITELIST: \"/whitelists\",\n TRANSACTION: \"/transactions\",\n VAULT_ENTITY: \"/entities\",\n EXCHANGE: \"/exchanges\",\n POLICY: \"/policies\",\n};\n\nexport interface QueryEntityWithPoolOptions extends GateOptions {\n device: number;\n format: string;\n pageSize?: number;\n page: number;\n lamURL?: string;\n deviceAPIURL?: string;\n}\n\nexport const queryEntityWithPoolByName = async (\n poolOptions: QueryEntityWithPoolOptions,\n name: string,\n entityType: EntityType,\n): Promise<void> => {\n const { format, device, networkDelay } = poolOptions;\n\n const pool = createDevicesPool({\n ...poolOptions,\n deviceAPIURL: poolOptions.deviceAPI || poolOptions.deviceAPIURL,\n lamURL: poolOptions.lam || poolOptions.lamURL,\n networkDelay,\n });\n // istanbul ignore next\n const admin = await pool.login(Number(device || 4));\n\n const fieldName = entityType === \"USER\" ? \"username\" : \"name\";\n const url = `${tableEntityUrl[entityType]}?${fieldName}=${name}`;\n const data = await admin.network(\"GET\", url);\n if (format === \"json\") {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(data));\n } else {\n let tokens: GateTokenCurrency[] = [];\n\n if (entityType === \"ACCOUNT\") {\n tokens = await fetchTokens(admin, { logger });\n }\n displayTable(data as Connection<GateEntity>, entityType, { tokens });\n }\n};\nexport const queryEntityWithPool = async (\n {\n gate,\n apiGateway,\n salt,\n transport,\n format,\n device,\n lam,\n lamURL,\n networkDelay,\n deviceAPI,\n deviceAPIURL,\n }: QueryEntityWithPoolOptions,\n id: string,\n entityType: EntityType,\n): Promise<void> => {\n const opts: PoolOptions = {\n gate,\n apiGateway,\n salt,\n transport,\n lamURL: lam || lamURL,\n networkDelay,\n deviceAPIURL: deviceAPI || deviceAPIURL,\n };\n const pool = createDevicesPool(opts);\n // istanbul ignore next\n const admin = await pool.login(Number(device || 4));\n\n const url = `${tableEntityUrl[entityType]}/${id}`;\n const data = await admin.network(\"GET\", url);\n if (format === \"json\") {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(data));\n } else {\n // @ts-ignore\n displayTable(data, entityType);\n }\n};\n","import { formatCurrencyUnit } from \"@ledgerhq/live-common-stub/lib/currencies/formatCurrencyUnit\";\nimport {\n Connection,\n EntityType,\n GateAccount,\n GateEntity,\n GateExchange,\n GateGroup,\n GatePolicy,\n GateTokenCurrency,\n GateTransaction,\n GateUser,\n GateVaultEntity,\n GateWhitelist,\n} from \"@ledgerhq/vault-common\";\nimport { getCurrencyOrToken, getGateAccountUnit } from \"@ledgerhq/vault-common/utils\";\nimport BigNumber from \"bignumber.js\";\nimport { exec } from \"child_process\";\nimport Table from \"cli-table3\";\nimport fs, { Dirent, Stats } from \"fs\";\n\ntype ExtraData = {\n tokens?: GateTokenCurrency[];\n accounts?: GateAccount[];\n};\n\ntype TableDefinition<T> = {\n head: string[];\n extract: (entity: T, extraData?: ExtraData) => any[];\n};\n\n/* istanbul ignore next */\nconst tableDefMap: {\n // Todo find a way to use GateEntity instead of any\n [key in EntityType]: TableDefinition<any>;\n} = {\n USER: {\n head: [\"id\", \"username\", \"role\", \"user_id\", \"status\"],\n extract: (entity: GateUser) => [\n entity.id,\n entity.username,\n `${entity.role}${entity.is_api ? \" (API)\" : \"\"}`,\n entity.user_id,\n entity.status,\n ],\n },\n GROUP: {\n head: [\"id\", \"name\", \"users\", \"status\", \"description\"],\n extract: (entity: GateGroup) => [\n entity.id,\n entity.name,\n entity.members.map((m) => m.username).join(\",\"),\n entity.status,\n entity.description,\n ],\n },\n ACCOUNT: {\n head: [\"id\", \"currency\", \"name\", \"status\", \"balance\", \"entity\"],\n extract: (account: GateAccount, extraData: ExtraData = {}) => {\n const { tokens = [] } = extraData;\n const currencyOrToken = getCurrencyOrToken(account, tokens);\n\n let balance = account.balance;\n const unit = getGateAccountUnit(account, tokens);\n const b = new BigNumber(balance);\n balance = formatCurrencyUnit(unit, b, {\n showCode: true,\n showAllDigits: false,\n disableRounding: true,\n });\n // HACK to make 𝚝 units (e.g 𝚝BTC) not break table formatting\n balance = balance.replace(\"𝚝\", \"t\");\n const res = [\n account.id,\n currencyOrToken.name,\n account.name,\n account.status,\n { content: balance, hAlign: \"right\" },\n ];\n\n return res;\n },\n },\n WHITELIST: {\n head: [\"id\", \"name\", \"status\", \"description\"],\n extract: (entity: GateWhitelist) => [entity.id, entity.name, entity.status, entity.description],\n },\n TRANSACTION: {\n head: [\"id\", \"account_id\", \"type\", \"created_on\", \"status\", \"amount\", \"note\"],\n extract: (entity: GateTransaction) => {\n const note = entity.notes.length\n ? [entity.notes[0] && entity.notes[0].title, entity.notes[0] && entity.notes[0].content]\n .filter(Boolean)\n .join(\" - \")\n : \"\";\n return [\n entity.id,\n entity.account_id,\n entity.type,\n entity.created_on,\n entity.status,\n entity.amount,\n note,\n ];\n },\n },\n VAULT_ENTITY: {\n head: [\"id\", \"name\", \"accounts\", \"status\"],\n extract: (entity: GateVaultEntity) => [\n entity.id,\n entity.name,\n entity.accounts.map((a) => a.name).join(\",\"),\n entity.status,\n ],\n },\n EXCHANGE: {\n head: [\"id\", \"name\", \"platform\", \"status\"],\n extract: (entity: GateExchange) => [entity.id, entity.name, entity.platform, entity.status],\n },\n POLICY: {\n head: [\"id\", \"name\", \"currency\", \"status\"],\n extract: (entity: GatePolicy) => [entity.id, entity.name, entity.currency, entity.status],\n },\n};\n\nexport const displayTable = (\n data: Connection<GateEntity>,\n entityType: EntityType,\n extraData?: ExtraData,\n): void => {\n const tableDef: TableDefinition<GateEntity> = tableDefMap[entityType];\n\n const table = new Table({\n head: tableDef.head,\n style: { head: [\"blue\", \"bold\"], border: [\"grey\"] },\n });\n // istanbul ignore else\n if (data.edges) {\n table.push(...data.edges.map((edge: any) => tableDef.extract(edge.node, extraData)));\n } else {\n // FIXME is this case happening???\n // @ts-ignore\n table.push(tableDef.extract(data, extraData));\n }\n // eslint-disable-next-line no-console\n console.log(table.toString());\n};\n\nexport const promisify =\n <T>(fn: (...args: any) => void): ((...args: any) => Promise<T>) =>\n /* istanbul ignore next */\n (...args) =>\n new Promise((resolve, reject) =>\n fn(...args, (err: Error, res: T) => {\n if (err) {\n return reject(err);\n }\n resolve(res);\n }),\n );\n\nconst promisifiedExec: (cmd: string, options?: { cwd: string }) => Promise<string> =\n promisify(exec);\n\nexport const execShell = /* istanbul ignore next */ async (\n cmd: string,\n options?: { cwd: string },\n): Promise<string> => {\n const output = await promisifiedExec(cmd, options);\n return output.trim();\n};\n\nexport const rmdir: (path: string, options: { recursive: boolean }) => Promise<void> = promisify(\n fs.rmdir,\n);\n\nexport const readdir: (p: string, options?: { withFileTypes: boolean }) => Promise<Dirent[]> =\n promisify(fs.readdir);\n\nexport const writeFile: (p: string, data: string) => Promise<void> = promisify(fs.writeFile);\n\nconst stat: (p: string) => Promise<Stats> = promisify(fs.stat);\n\nexport const fileExists = /* istanbul ignore next */ async (path: string): Promise<boolean> => {\n try {\n const stats = await stat(path);\n if (!stats.isFile()) {\n throw new Error(\"Provided output file already exists and is not a file\");\n }\n return true;\n } catch (err) {\n // @ts-expect-error\n if (err.code === \"ENOENT\") {\n return false;\n }\n throw err;\n }\n};\n","import {\n DEFAULT_VAULT_REMOTE_URL,\n DeployOptions,\n HelmValues,\n deploy,\n} from \"@ledgerhq/vault-common\";\nimport moment from \"moment\";\n\nimport logger from \"../logger\";\n\ntype DeployCommandOptions = {\n remoteURL: string;\n name: string;\n owner: string;\n expirationHours?: number;\n preset?: string;\n values?: string;\n watchTimeoutMinutes?: number;\n useDedicatedHSMSimu?: boolean;\n useHTTPPolling?: boolean;\n};\n\nexport const deployCommand = async (options: DeployCommandOptions): Promise<void> => {\n let values: HelmValues | null = null;\n if (options.values) {\n values = JSON.parse(options.values) as HelmValues;\n }\n const deployOptions: DeployOptions = {\n remoteURL: options.remoteURL,\n name: options.name,\n owner: options.owner,\n watchTimeoutMinutes: options.watchTimeoutMinutes,\n useDedicatedHSMSimu: options.useDedicatedHSMSimu,\n useHTTPPolling: options.useHTTPPolling,\n ...(options.preset ? { preset: options.preset } : {}),\n ...(values ? { values } : {}),\n ...(options.expirationHours\n ? {\n expireOn: moment().add(options.expirationHours, \"hours\").toDate(),\n }\n : {}),\n };\n const { url } = await deploy(deployOptions, { logger });\n logger.info(\"Onboard it with:\");\n logger.info(`ledger-vault onboard --minivaultURL ${url}`);\n logger.info(\"Or directly bake it with:\");\n logger.info(`ledger-vault bake --preset beatles --minivaultURL ${url}`);\n};\n\nexport default {\n command: \"deploy\",\n description: \"Deploy a minivault instance on distant environment\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault deploy --name foo --owner bar\",\n `{grey $} ledger-vault deploy --name foo --owner bar --preset tezos --values '\\\\{ \"versions\": \\\\{ \"gate\": \"7.0.0\" \\\\} \\\\}'`,\n `{grey $} ledger-vault deploy --name foo --owner bar --expirationHours 4`,\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Instance name (must be unique on cluster, lowercase alphanumeric + dash)\",\n required: true,\n },\n {\n name: \"owner\",\n description: \"Your name or squad name\",\n type: String,\n required: true,\n },\n {\n name: \"expirationHours\",\n description: \"How many hours the instance should live\",\n type: Number,\n required: false,\n defaultValue: 3,\n },\n {\n name: \"preset\",\n description: \"minivault preset to use\",\n type: String,\n },\n {\n name: \"values\",\n description: \"JSON values to override Helm values\",\n type: String,\n },\n {\n name: \"remoteURL\",\n description: `vault-remote URL {grey (default: ${DEFAULT_VAULT_REMOTE_URL})}`,\n type: String,\n defaultValue: DEFAULT_VAULT_REMOTE_URL,\n },\n {\n name: \"useDedicatedHSMSimu\",\n description: `Spawn and use a dedicated HSM simu with proper scripts version`,\n type: Boolean,\n defaultValue: false,\n },\n {\n name: \"useHTTPPolling\",\n description: `Use HTTP polling instead of Websocket to define if instance is ready (provide less details about deployment, but is more reliable)`,\n type: Boolean,\n defaultValue: false,\n },\n {\n name: \"watchTimeoutMinutes\",\n description: `Stop watching and throw after the given elapsed minutes {grey (default: 10)}`,\n type: Number,\n defaultValue: 10,\n },\n ],\n run: deployCommand,\n};\n","import { DEFAULT_VAULT_REMOTE_URL, DestroyOptions, destroy } from \"@ledgerhq/vault-common\";\n\nimport logger from \"../logger\";\n\ntype DestroyCommandOptions = {\n remoteURL: string;\n name: string;\n wait?: boolean;\n};\n\nexport const destroyCommand = async (options: DestroyCommandOptions): Promise<void> => {\n const destroyOptions: DestroyOptions = {\n remoteURL: options.remoteURL,\n name: options.name,\n wait: options.wait,\n };\n await destroy(destroyOptions, { logger });\n};\n\nexport default {\n command: \"destroy\",\n description: \"Destroy a deployed minivault instance on distant environment\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault destroy --name foo\"],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Instance name (must be unique on cluster)\",\n required: true,\n },\n {\n name: \"remoteURL\",\n description: `vault-remote URL {grey (default: ${DEFAULT_VAULT_REMOTE_URL})}`,\n type: String,\n defaultValue: DEFAULT_VAULT_REMOTE_URL,\n },\n\n {\n name: \"wait\",\n description:\n \"If passed, will exit command only once instance has completely disappeared from cluster\",\n type: Boolean,\n defaultValue: false,\n },\n ],\n run: destroyCommand,\n};\n","import { createDevicesPool } from \"@ledgerhq/vault-common\";\nimport { PoolOptions, UserContext } from \"@ledgerhq/vault-common\";\n\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport { GateOptions } from \"../types\";\n\nexport interface DrainOptions extends GateOptions {\n device: number;\n}\n\nexport default {\n command: \"drain\",\n description: \"Drain full gate data\",\n options: [deviceOption, ...gateOptions, ...lamOptions],\n run: async (opts: DrainOptions): Promise<void> => {\n const poolOptions: PoolOptions = {\n salt: opts.salt,\n gate: opts.gate,\n apiGateway: opts.apiGateway,\n transport: opts.transport,\n lamURL: opts.lam,\n deviceAPIURL: opts.deviceAPI,\n };\n\n const pool = createDevicesPool(poolOptions);\n\n // TODO ability to choose device\n /* istanbul ignore next */\n const admin = await pool.login(opts.device || 4);\n\n const data = await drainData(admin, [\n \"/_version\",\n \"/organization\",\n \"/people/me\",\n \"/people?pageSize=-1&role=ADMIN&role=OPERATOR\",\n \"/groups?pageSize=-1\",\n \"/whitelists?pageSize=-1\",\n \"/accounts?pageSize=-1\",\n \"/accounts/tx_rights?light=1\",\n \"/transactions?pageSize=-1\",\n \"/transactions/can_create_tx\",\n \"/requests?order=asc&pageSize=-1&status=PENDING_APPROVAL&status=PENDING_REGISTRATION\",\n ]);\n\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(data));\n },\n};\n\nconst drainData = async (user: UserContext, urls: string[]) => {\n const output = {};\n const pushToPromises = async (url: string) => {\n try {\n const res = await user.network(\"GET\", url);\n Object.assign(output, { [url]: res });\n } catch (e) {\n /* istanbul ignore next */\n // eslint-disable-next-line no-console\n console.error(e);\n }\n };\n await Promise.all(urls.map(pushToPromises));\n return output;\n};\n","import { createFaucet } from \"@ledgerhq/vault-common\";\n\nimport logger from \"../logger\";\n\nexport type FaucetOptions = {\n currency: string;\n amount: string;\n recipient: string;\n pralineBTCTestnetURL: string;\n};\n\nconst CURRENCIES = [\"bitcoin_testnet\"];\n\nexport default {\n command: \"faucet\",\n description: \"Send funds to accounts using mocked blockchains (e.g: praline)\",\n help: [\n {\n content: \"{grey $} ledger-vault faucet --currency bitcoin_testnet --amount 7 [options]\",\n },\n ],\n options: [\n {\n name: \"recipient\",\n alias: \"r\",\n description: \"Recipient\",\n type: String,\n required: true,\n },\n {\n name: \"currency\",\n alias: \"c\",\n description: `Available currencies: ${CURRENCIES.map((p) => `{yellow ${p}}`).join(\", \")}`,\n type: String,\n required: true,\n },\n {\n name: \"amount\",\n alias: \"a\",\n description: `Amount in base unit (e.g: 1 for \"1 BTC\")`,\n type: String,\n required: true,\n },\n {\n name: \"pralineBTCTestnetURL\",\n description:\n \"URL of Praline for BTC Testnet {blue $PRALINE_BTC_TESTNET_URL} {grey (default: https://localhost:8443/praline)}\",\n type: String,\n defaultValue: process.env.PRALINE_BTC_TESTNET_URL || \"https://localhost:8443/praline\",\n },\n ],\n run: async (options: FaucetOptions): Promise<void> => {\n const faucet = createFaucet({\n pralineBTCTestnetURL: options.pralineBTCTestnetURL,\n });\n const hash = await faucet({\n currency: options.currency,\n amount: options.amount,\n recipient: options.recipient,\n });\n logger.success(`Transaction success`);\n logger.info(`hash: ${hash}`);\n },\n};\n","import { PoolOptions, createDevicesPool } from \"@ledgerhq/vault-common\";\nimport fs from \"fs\";\n\nimport cliOptions from \"../cliOptions\";\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport { GateOptions } from \"../types\";\n\ntype FetchMethod = \"GET\" | \"POST\" | \"DELETE\";\n\nexport interface FetchOptions extends GateOptions {\n positionals: string[];\n device: number;\n method: FetchMethod;\n body: string;\n download?: string;\n}\n\nconst methodOption = {\n name: \"method\",\n type: String,\n description: \"REST method to use {grey (default: GET)}\",\n defaultValue: \"GET\",\n};\n\nconst downloadOption = {\n name: \"download\",\n type: String,\n description: \"Download the raw response to the given file path\",\n};\n\nconst bodyOption = {\n name: \"body\",\n type: String,\n description: \"JSON body to send with the request {grey (default: '\\\\{\\\\}')}\",\n defaultValue: \"{}\",\n};\n\nexport default {\n command: \"fetch\",\n positionals: true,\n description: \"Fetch given URL on gate with given device\",\n help: [\n {\n header: \"Examples\",\n content: ['{grey $} ledger-vault fetch \"/accounts?currency=stellar\" {bold --device} 5'],\n },\n ],\n options: [\n deviceOption,\n methodOption,\n bodyOption,\n downloadOption,\n ...gateOptions,\n ...lamOptions,\n ...cliOptions,\n ],\n run: async (options: FetchOptions): Promise<void> => {\n const {\n gate,\n apiGateway,\n salt,\n transport,\n device,\n method,\n body,\n positionals,\n networkDelay,\n readOnlyUser,\n download: downloadFile,\n } = options;\n\n const opts: PoolOptions = {\n gate,\n apiGateway,\n transport,\n salt,\n lamURL: options.lam,\n deviceAPIURL: options.deviceAPI,\n readOnlyUser,\n networkDelay,\n };\n\n const pool = createDevicesPool(opts);\n const admin = await pool.login(device);\n\n const url = positionals[0];\n if (!url) throw new Error(`No URL given`);\n const data = await admin.network(method, url, JSON.parse(body), { raw: !!downloadFile });\n\n if (downloadFile) {\n fs.writeFileSync(downloadFile, data as Buffer);\n // eslint-disable-next-line no-console\n console.log(`Downloaded to ${downloadFile}`);\n return;\n }\n\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(data));\n },\n};\n","import { genKeys } from \"@ledgerhq/vault-common/crypto-utils\";\n\nexport default {\n command: \"genKeys\",\n description: \"Generate API user keys\",\n options: [\n {\n name: \"entropy\",\n type: String,\n description: \"Deterministic entropy (if not passed, keys pair will be randomly generated)\",\n },\n ],\n run: (options: { entropy?: string }) => {\n const keys = genKeys(options.entropy);\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(keys, null, 2));\n },\n};\n","import {\n PoolOptions,\n createDevicesPool,\n createNetwork,\n getAuthTokens,\n} from \"@ledgerhq/vault-common\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport { GateOptions } from \"../types\";\n\nexport interface GetAPIUserTokensOptions extends GateOptions {\n username: string;\n workspace: string;\n}\n\nasync function getAPIUserTokens(options: GetAPIUserTokensOptions): Promise<void> {\n const opts: PoolOptions = {\n ...options,\n deviceAPIURL: options.deviceAPI,\n };\n const pool = createDevicesPool(opts);\n const admin = await pool.login(4);\n\n const apiNetwork = createNetwork({\n baseURL: options.apiGateway,\n });\n\n const payload = {\n type: \"CREATE_API_USER_ACCESS\",\n user_data: { username: options.username },\n };\n\n try {\n const request: any = await admin.post(\"/requests\", payload);\n const approvedReq: any = await admin.post(`/requests/${request.id}/post-create`, {});\n const { api_key_id, api_key_secret } = approvedReq;\n\n const { access_token: accessToken, refresh_token: refreshToken } = await getAuthTokens(\n apiNetwork,\n options.workspace,\n { api_key_id, api_key_secret },\n );\n console.log(JSON.stringify({ accessToken, refreshToken }));\n } catch (err) {\n // istanbul ignore next\n // @ts-expect-error\n console.log(`Error while getting API user tokens: ${err.toString()}`);\n }\n}\n\nexport default {\n command: \"getAPIUserTokens\",\n description: \"Regenerate and return API v2 credentials\",\n options: [\n ...cliOptions,\n ...gateOptions,\n {\n name: \"username\",\n type: String,\n description: \"API User's username\",\n required: true,\n },\n {\n name: \"workspace\",\n type: String,\n description: \"Workspace\",\n defaultValue: \"minivault\",\n },\n ],\n run: getAPIUserTokens,\n};\n","import { PoolOptions, createDevicesPool } from \"@ledgerhq/vault-common\";\n\nimport cliOptions from \"../cliOptions\";\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport { GateOptions } from \"../types\";\n\nexport interface GetAuthTokenOptions extends GateOptions {\n device: number;\n}\n\nasync function getAuthToken(options: GetAuthTokenOptions): Promise<void> {\n const opts: PoolOptions = {\n ...options,\n deviceAPIURL: options.deviceAPI,\n };\n const pool = createDevicesPool(opts);\n const admin = await pool.login(options.device);\n // eslint-disable-next-line no-console\n console.log(admin.getToken());\n}\n\nexport default {\n command: \"getAuthToken\",\n description: \"Login with given device and returns the authorization token\",\n options: [\n deviceOption,\n ...cliOptions,\n ...gateOptions,\n {\n name: \"deviceAPISessionID\",\n description: \"SessionID to send to device-api\",\n type: String,\n },\n ],\n run: getAuthToken,\n};\n","import { DEFAULT_VAULT_REMOTE_URL, MVInstance, getMVInstances } from \"@ledgerhq/vault-common\";\nimport { SILENT_LOGGER } from \"@ledgerhq/vault-utils\";\nimport Table from \"cli-table3\";\n\nimport logger from \"../logger\";\n\ntype Options = {\n remoteURL: string;\n format?: \"json\" | \"table\";\n};\n\nexport const getMVInstancesCommand = async (options: Options): Promise<void> => {\n const instances = await getMVInstances(\n { remoteURL: options.remoteURL },\n {\n logger: options.format === \"json\" ? SILENT_LOGGER : logger,\n },\n );\n if (options.format === \"table\") {\n displayMVInstancesTable(instances);\n } else {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(instances));\n }\n};\n\nexport default {\n command: \"getMVInstances\",\n description: \"Get list of instances running on vault-remote\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault getMVInstances\",\n \"{grey $} ledger-vault getMVInstances --remoteURL https://remote.minivault.ledger-sbx.com\",\n ],\n },\n ],\n options: [\n {\n name: \"remoteURL\",\n description: `vault-remote URL {grey (default: ${DEFAULT_VAULT_REMOTE_URL})}`,\n type: String,\n defaultValue: DEFAULT_VAULT_REMOTE_URL,\n },\n {\n name: \"format\",\n alias: \"f\",\n type: String,\n typeLabel: \"json\",\n description: \"Output format {grey (available: table, json)}\",\n defaultValue: \"table\",\n },\n ],\n run: getMVInstancesCommand,\n};\n\nexport const displayMVInstancesTable = (data: MVInstance[]): void => {\n const table = new Table({\n head: [\"name\", \"status\"],\n style: { head: [\"blue\", \"bold\"], border: [\"grey\"] },\n });\n table.push(...data.map((instance) => [instance.name, instance.status]));\n // eslint-disable-next-line no-console\n console.log(table.toString());\n};\n","import { genSeed } from \"@ledgerhq/vault-common\";\n\nexport default {\n command: \"getSeeds\",\n description: \"Get all seeds from a salt\",\n options: [\n {\n name: \"salt\",\n alias: \"s\",\n type: String,\n typeLabel: \"<salt>\",\n description: \"Salt used to generate devices seeds\",\n },\n ],\n help: [\n {\n content: \"{grey $} ledger-vault getSeeds --salt toto\",\n },\n ],\n run: (options: { salt: string }): void => {\n const { salt } = options;\n const devices = [\n {\n name: \"Wrapping Key 1\",\n index: 1,\n },\n {\n name: \"Wrapping Key 2\",\n index: 2,\n },\n {\n name: \"Wrapping Key 3\",\n index: 3,\n },\n {\n name: \"Admin 1\",\n index: 4,\n },\n {\n name: \"Admin 2\",\n index: 5,\n },\n {\n name: \"Admin 3\",\n index: 6,\n },\n {\n name: \"Shared-Owner 1\",\n index: 7,\n },\n {\n name: \"Shared-Owner 2\",\n index: 8,\n },\n {\n name: \"Shared-Owner 3\",\n index: 9,\n },\n {\n name: \"Operator 10\",\n index: 10,\n },\n {\n name: \"Operator 11\",\n index: 11,\n },\n {\n name: \"Operator 12\",\n index: 12,\n },\n {\n name: \"Operator 13\",\n index: 13,\n },\n {\n name: \"Operator 14\",\n index: 14,\n },\n {\n name: \"Operator 15\",\n index: 15,\n },\n {\n name: \"Operator 16\",\n index: 16,\n },\n ];\n\n devices.forEach((d) => {\n const seed = genSeed(salt, d.index);\n console.log(`${d.name}: ${seed}`); // eslint-disable-line\n });\n },\n};\n","import { PoolOptions, createDevicesPool } from \"@ledgerhq/vault-common\";\n\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport { GateOptions } from \"../types\";\n\nexport interface GetUserIDOptions extends GateOptions {\n device: number;\n}\n\nasync function getUserID(options: GetUserIDOptions): Promise<void> {\n const opts: PoolOptions = {\n ...options,\n deviceAPIURL: options.deviceAPI,\n };\n const pool = createDevicesPool(opts);\n const userID = await pool.getUserID(options.device);\n // eslint-disable-next-line no-console\n console.log(userID);\n}\n\nexport default {\n command: \"getUserID\",\n description: \"Returns the user ID of the given device\",\n options: [deviceOption, ...gateOptions],\n run: getUserID,\n};\n","import createHSMBridge from \"@ledgerhq/vault-common/createHSMBridge\";\n\nimport getCertFromPFX from \"../getCertFromPFX\";\nimport logger from \"../logger\";\n\nexport type Options = {\n hsm: string;\n hsmCert: string;\n hsmCertPassword: string;\n};\n\nexport default {\n command: \"initCompartment\",\n description: \"Init HSM simu compartment\",\n help: [\n {\n content: \"{grey $} ledger-vault initCompartment --hsm <hsm-endpoint>\",\n },\n ],\n options: [\n {\n name: \"hsm\",\n type: String,\n description: \"HSM endpoint {blue $VAULT_HSM_ENDPOINT}\",\n defaultValue: process.env.VAULT_HSM_ENDPOINT,\n required: true,\n },\n {\n name: \"hsmCert\",\n type: String,\n description: \"Path to HSM certificate {blue $VAULT_HSM_CLIENT_CERT_PATH}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PATH,\n required: true,\n },\n {\n name: \"hsmCertPassword\",\n type: String,\n description: \"HSM certificate password {blue $VAULT_HSM_CLIENT_CERT_PWD}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PWD,\n required: true,\n },\n ],\n run: async (options: Options): Promise<void> => {\n if (!options.hsmCert) {\n throw new Error(\n \"You must specify the path to your HSM certificate in your environment variable VAULT_HSM_CLIENT_CERT_PATH or use the --hsmCert flag\",\n );\n }\n\n const cert = await getCertFromPFX(options.hsmCert, options.hsmCertPassword);\n\n const bridge = createHSMBridge({\n hsmCert: cert.cert,\n hsmCertKey: cert.key,\n hsmEndpoint: options.hsm,\n });\n\n await bridge.initCompartment({ logger });\n },\n};\n","import { PoolOptions, createDevicesPool } from \"@ledgerhq/vault-common\";\n\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\n\n/* istanbul ignore file */\n\nconst notifierURLOption = {\n name: \"notifier\",\n alias: \"n\",\n defaultValue: \"http://localhost:5012\",\n description: \"Target vault-notifier url {grey (default: http://localhost:5012)}\",\n type: String,\n};\n\nexport interface ListenNotificationOptions extends GateOptions {\n device: number;\n notifier: string;\n}\n\nexport default {\n command: \"listen\",\n description: \"Listen to notifications broadcasted to user\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault listen {bold --device} 4\",\n \"{grey $} ledger-vault listen {bold --device} 4 --notifier $NOTIFIER_URL\",\n ],\n },\n ],\n options: [deviceOption, notifierURLOption, ...gateOptions],\n\n run: async (options: ListenNotificationOptions): Promise<void> => {\n const { gate, apiGateway, salt, device, notifier, transport } = options;\n const opts: PoolOptions = {\n gate,\n apiGateway,\n transport,\n salt,\n notifierURL: notifier,\n deviceAPIURL: options.deviceAPI,\n };\n const pool = createDevicesPool(opts, { logger });\n const user = await pool.login(device);\n await user.connectSocket();\n // eslint-disable-next-line no-console\n user.onEvent((event) => console.log(JSON.stringify(event)));\n\n // Avoid process.exit();\n return new Promise(() => null);\n },\n};\n","import { bakeManifest, createDevicesPool } from \"@ledgerhq/vault-common\";\nimport type { OnboardingStep } from \"@ledgerhq/vault-common\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport logger from \"../logger\";\nimport { REVAULT_ONBOARDING_OPTIONS, extractRevaultOnboardingOptions } from \"../revault-compat\";\nimport { CliOptions, GateOptions, LamOptions } from \"../types\";\n\nexport type OnboardOptions = CliOptions &\n GateOptions &\n LamOptions & {\n untilStep?: OnboardingStep;\n };\n\nexport const OnboardingSteps: OnboardingStep[] = [\n \"WRAPPING_KEYS_REGISTRATION\",\n \"ADMINS_REGISTRATION\",\n \"QUORUM_SETTINGS\",\n \"SHARED_OWNERS_REGISTRATION\",\n \"ADMIN_APPROVALS\",\n \"MASTER_SEED_GENERATION\",\n];\n\nexport default {\n command: \"onboard\",\n description: \"Onboard the workspace\",\n help: [\n {\n content: \"{grey $} ledger-vault onboard [options]\",\n },\n ],\n options: [\n ...REVAULT_ONBOARDING_OPTIONS,\n ...cliOptions,\n ...gateOptions,\n ...lamOptions,\n {\n name: \"untilStep\",\n alias: \"u\",\n type: String,\n description: `Stop just before this step (one of: ${OnboardingSteps.map(\n (n) => `{yellow ${n}}`,\n ).join(\", \")})`,\n defaultValue: \"\",\n },\n ],\n run: async (runOptions: OnboardOptions): Promise<void> => {\n const { untilStep, ...options } = runOptions;\n if (untilStep && !OnboardingSteps.includes(untilStep)) {\n throw new Error(\n `${untilStep} is not a valid step, must be one of: ${OnboardingSteps.join(\", \")}`,\n );\n }\n await bakeManifest(\n {},\n createDevicesPool({\n ...options,\n lamURL: options.lam,\n deviceAPIURL: options.deviceAPI,\n networkDelay: options.networkDelay,\n }),\n {\n logger,\n untilStep,\n revaultOnboarding: await extractRevaultOnboardingOptions(options),\n },\n );\n },\n};\n","import { createDevicesPool, createPledge, recipeManifest } from \"@ledgerhq/vault-common\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\n\nexport interface PledgeOpts extends GateOptions {\n account: string;\n exchange: string;\n amount: string;\n apiV2User: string;\n}\n\nasync function createPledgeIncrement(options: PledgeOpts): Promise<void> {\n const { exchange, amount, apiV2User } = options;\n\n const pool = createDevicesPool({\n ...options,\n deviceAPIURL: options.deviceAPI,\n });\n\n const recipe = await recipeManifest(pool);\n const { manifest, rawData } = recipe;\n\n /* istanbul ignore next */\n const account = manifest.accounts?.find((a) => a.name === options.account);\n\n if (!account) {\n throw new Error(`Account '${options.account}' not found`);\n }\n\n const myApiUser = manifest.users?.apiV2?.find((user) => user.name.includes(apiV2User));\n if (!myApiUser) {\n throw new Error(`No API V2 user found for ${apiV2User}`);\n }\n\n const pledgeData = {\n pool,\n account,\n accountsByName: rawData.accountsByName,\n exchange,\n amount,\n apiUser: myApiUser,\n gate: options.gate,\n apiGateway: options.apiGateway,\n };\n\n const pledgeResp = await createPledge(pledgeData, { logger });\n logger.info(pledgeResp);\n}\n\nexport default {\n command: \"pledge\",\n description: \"Create a pledge increment\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault pledge {bold --account} TL-0001-ETH-OOF-KOM {bold --exchange} Crypto.com {bold --amount} 1000 {bold --apiV2User} 10\",\n ],\n },\n ],\n options: [\n {\n name: \"account\",\n type: String,\n description: \"Sender account name\",\n required: true,\n },\n {\n name: \"exchange\",\n type: String,\n description: \"Pledge exchange name\",\n required: true,\n },\n {\n name: \"amount\",\n description: \"Amount to pledge in default unit (e.g in BTC for Bitcoin)\",\n type: String,\n required: true,\n },\n {\n name: \"apiV2User\",\n description: \"API V2 user name: will do a string search\",\n type: String,\n required: true,\n },\n ...gateOptions,\n ...cliOptions,\n ],\n run: createPledgeIncrement,\n};\n","import axios, { AxiosInstance } from \"axios\";\nimport bodyParser from \"body-parser\";\nimport chalk from \"chalk\";\nimport cors from \"cors\";\nimport express, { Router } from \"express\";\nimport fs from \"fs\";\nimport https from \"https\";\nimport path from \"path\";\nimport { URL } from \"url\";\n\nimport logger from \"../logger\";\n\ntype VaultConfig = {\n API_BASE_URL: string;\n DEVICE_REGISTRY_BASE_URL: string;\n WEBLUE_URL: string;\n SPECULOS_WEBLUE_URL: string;\n NOTIFIER_URL: string;\n APP_VERSION: string;\n ERC20_LIST: string;\n ENABLE_WEBLUE: boolean;\n ENABLE_SOFTWARE: boolean;\n ONLY_WEBLUE: boolean;\n};\n\nexport type ProxyOptions = {\n positionals: string[];\n};\n\nconst FRONT_URL = \"https://localhost:9000\";\n\nconst httpsAgent = new https.Agent({ rejectUnauthorized: false });\n\nconst createProxy = ({ port, host }: { port: number; host: string }) => {\n const app = express();\n app.disable(\"x-powered-by\");\n\n const register = (config: ProxyRouteRegisterConfig) => {\n const router = Router();\n const { url, route, name, raw, transformResponseHeaders, transformURL } = config;\n const proxifiedURL = `https://${host}${url}`;\n const network = axios.create({ baseURL: proxifiedURL, httpsAgent });\n router.all(\"*\", async (req, res) => {\n try {\n // @ts-ignore\n const method: \"POST\" | \"GET\" | \"DELETE\" = req.method;\n logger.info(`[${name}] ${method} ${req.url}`);\n req.headers.host = host;\n req.headers[\"Accept-Encoding\"] = \"gzip;q=0,deflate;q=0\";\n const r = await network({\n method,\n url: transformURL ? transformURL(req.url) : req.url,\n data: req.body,\n headers: req.headers,\n ...(raw\n ? {\n responseType: \"arraybuffer\",\n responseEncoding: \"binary\",\n }\n : {}),\n });\n if (raw) {\n // seems that content-length can be too small went directly sent by backend (maybe because of gzip?)\n // ensuring we don't truncate the event content with:\n r.headers[\"content-length\"] = Buffer.from(r.data).toString(\"utf8\").length;\n }\n if (transformResponseHeaders) {\n transformResponseHeaders(r.headers);\n }\n if (raw) {\n res.writeHead(200, r.headers);\n res.write(r.data);\n res.end();\n } else {\n res.set(r.headers);\n res.send(r.data);\n }\n } catch (err) {\n // @ts-expect-error\n if (err.response) {\n // @ts-expect-error\n return res.status(err.response.status).send(err.response.data);\n }\n // @ts-expect-error\n return res.status(500).send({ message: err.reason || \"Proxy error\" });\n }\n });\n\n logger.info(chalk`{magenta ${route}} {yellow.bold =>} ${proxifiedURL}`);\n app.use(route, router);\n };\n\n app.use(cors({ credentials: true, origin: FRONT_URL }));\n\n app.use(bodyParser.text());\n app.use(bodyParser.json());\n\n const listen = () => {\n const cert = getLocalhostSSLCert();\n const httpsServer = https.createServer(cert, app);\n httpsServer.listen(8443, () => {\n logger.success(`Proxy listening on port ${port}`);\n });\n };\n\n return { listen, register };\n};\n\nconst getLocalhostSSLCert = () => {\n try {\n if (!process.env[\"VAULT_WORKSPACE_DIR\"]) {\n throw new Error(\n \"Env var $VAULT_WORKSPACE_DIR is not defined. Check the Vault Guide: https://vault-guide.ldg-tech.com/\",\n );\n }\n const workspace = process.env[\"VAULT_WORKSPACE_DIR\"];\n const base = path.join(workspace, \"ledger-vault-front/certificate\");\n const cert = fs.readFileSync(path.join(base, \"localhost.crt\"), \"utf8\");\n const key = fs.readFileSync(path.join(base, \"localhost.key\"), \"utf8\");\n return { cert, key };\n } catch (err) {\n logger.error(\"Could not correctly parse cert files\");\n throw err;\n }\n};\n\n/* istanbul ignore file */\nasync function proxyCommand({ positionals }: ProxyOptions): Promise<void> {\n const [distantURL] = positionals;\n if (!distantURL) throw new Error(`No distant URL given`);\n const distantNetwork = axios.create({ baseURL: distantURL, httpsAgent });\n const host = new URL(distantURL).hostname;\n const config = await getDistantConfig(distantNetwork);\n\n const proxy = createProxy({ port: 8443, host });\n\n proxy.register({\n name: \"Gate\",\n route: \"/gate\",\n url: config.API_BASE_URL,\n transformResponseHeaders: transformGateHeaders,\n });\n\n proxy.register({\n name: \"Device registry\",\n route: \"/device-registry\",\n url: config.DEVICE_REGISTRY_BASE_URL,\n transformURL: (url) => url.replace(\"domain=localhost\", `domain=${host}`),\n });\n\n proxy.register({\n name: \"Device api WebSocket\",\n route: \"/device-api/socket.io\",\n url: \"/device-api/socket.io\",\n raw: true,\n });\n\n proxy.register({\n name: \"Device api\",\n route: \"/device-api\",\n url: \"/device-api\",\n });\n\n proxy.register({\n name: \"Platform manager\",\n route: \"/platform-manager\",\n url: \"/platform-manager\",\n });\n\n proxy.register({\n name: \"Vault notifier\",\n url: \"/notifier/socket.io\",\n route: config.NOTIFIER_URL,\n raw: true,\n });\n\n proxy.listen();\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const p: Promise<void> = new Promise(() => {});\n return p;\n}\n\ntype ProxyRouteRegisterConfig = {\n // used to describe what is proxified, e.g \"Gate\"\n name: string;\n // url to proxify. if it starts with \"/\", it will be prefixed by proxy host\n url: string;\n // route to serve on the proxy route\n route: string;\n // whether stuff needs to be raw parsed (not sure why we want this, have to dig)\n raw?: boolean;\n // some stuff that need to be documented\n transformURL?: (url: string) => string;\n // some stuff that need to be documented\n transformResponseHeaders?: (headers: Record<string, any>) => void;\n};\n\nconst transformGateHeaders = (headers: Record<string, any>) => {\n if (headers[\"set-cookie\"]) {\n headers[\"set-cookie\"] = headers[\"set-cookie\"].map((cookie: string) => {\n if (cookie.startsWith(\"ledger_workspace=\")) {\n return cookie.replace(\"Secure;\", \"\");\n }\n if (cookie.startsWith(\"ledger_token=\")) {\n return cookie.replace(/Domain=[^;]+/, \"Domain=localhost\").replace(\"Secure;\", \"\");\n }\n return cookie;\n });\n }\n};\n\nasync function getDistantConfig(network: AxiosInstance): Promise<VaultConfig> {\n const networkRes = await network({\n method: \"GET\",\n url: \"/config.js\",\n });\n\n const res: string = networkRes.data;\n // hacky way to retrieve the distant config\n // at least, it avoid us to use unsafe `eval()`\n const config = res.replace(\"window.config = \", \"\").replace(\";\", \"\");\n const result = config\n .trim()\n .split(\"\\n\")\n .map((line, i, lines) => {\n if (i === 0 || i === lines.length - 1) return line;\n // right hand can be an url so we need to join(\":\") it after\n const [property, ...value] = line.trim().split(\":\");\n line = `\"${property}\":${value.join(\":\")}`;\n // check if there's an extra ','\n if (i === lines.length - 2 && line[line.length - 1] === \",\") {\n line = line.slice(0, -1);\n }\n return line;\n })\n .join(\"\\n\");\n try {\n return JSON.parse(result);\n } catch {\n throw new Error(\"Invalid distant config.js file\");\n }\n}\n\nexport default {\n command: \"proxy\",\n positionals: true,\n description: \"Expose a distant gate/device-registry to localhost\",\n help: [\n {\n header: \"Usage\",\n content: [\"{grey $} ledger-vault proxy {blue <distant-url>}\"],\n },\n ],\n options: [],\n run: proxyCommand,\n};\n","import { createDevicesPool } from \"@ledgerhq/vault-common\";\nimport { Connection, DaemonAddress, GateAccount } from \"@ledgerhq/vault-common/types\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport { GateOptions } from \"../types\";\n\nexport interface ReceiveOptions extends GateOptions {\n account: string;\n index: number;\n}\n\nexport default {\n command: \"receive\",\n description: \"Display receive address for given account\",\n options: [\n {\n name: \"account\",\n alias: \"a\",\n description: \"Name of the account\",\n type: String,\n required: true,\n },\n {\n name: \"index\",\n alias: \"i\",\n description: \"Address index {grey (default: 0)}\",\n type: Number,\n defaultValue: 0,\n },\n ...gateOptions,\n ...lamOptions,\n ...cliOptions,\n ],\n run: async (options: ReceiveOptions): Promise<void> => {\n const { account: accountName, index } = options;\n const pool = createDevicesPool({\n ...options,\n lamURL: options.lam,\n deviceAPIURL: options.deviceAPI,\n });\n const admin = await pool.login(4);\n const accountsURL = `/accounts?name=${accountName}`;\n const accounts = await admin.network<Connection<GateAccount>>(\"GET\", accountsURL);\n const account = accounts.edges.find((e) => e.node.name === accountName);\n if (!account) {\n throw new Error(`No account matching name \"${accountName}\"`);\n }\n const freshAddressesURL = `/accounts/${account.node.id}/fresh_addresses`;\n const freshAddresses = await admin.network<DaemonAddress[]>(\"GET\", freshAddressesURL);\n const address = freshAddresses[index];\n if (!address) {\n throw new Error(`No fresh address available at index ${index}`);\n }\n // eslint-disable-next-line no-console\n console.log(address.address);\n },\n};\n","import { createDevicesPool, recipeManifest } from \"@ledgerhq/vault-common\";\nimport prettier from \"prettier\";\n\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport { GateOptions } from \"../types\";\n\nexport type RecipeOptions = GateOptions & {\n saveAccountsIndexes?: boolean;\n saveAccountsTypes?: boolean;\n};\n\nexport default {\n command: \"recipe\",\n description: \"Build a manifest from a gate\",\n help: [\n {\n content: \"{grey $} ledger-vault recipe [options]\",\n },\n ],\n options: [\n ...gateOptions,\n ...lamOptions,\n {\n name: \"saveAccountsTypes\",\n defaultValue: false,\n description: \"If passed, will store the accountType into each account\",\n type: Boolean,\n },\n {\n name: \"saveAccountsIndexes\",\n defaultValue: false,\n description: \"If passed, will store account index into each account\",\n type: Boolean,\n },\n ],\n run: async (options: RecipeOptions): Promise<void> => {\n const { saveAccountsIndexes, saveAccountsTypes, ...opts } = options;\n const data = await recipeManifest(\n createDevicesPool({\n ...opts,\n lamURL: options.lam,\n deviceAPIURL: options.deviceAPI,\n }),\n { saveAccountsIndexes, saveAccountsTypes },\n );\n const stringified = JSON.stringify(data.manifest);\n const formatted = prettier.format(stringified, { parser: \"json\" });\n // eslint-disable-next-line no-console\n console.log(formatted.trim());\n },\n};\n","import { DevicesPool, GateUser, createDevicesPool, recipeManifest } from \"@ledgerhq/vault-common\";\nimport {\n Connection,\n GateGenericRequest,\n UserWithDevice,\n reviewAPIRequest,\n} from \"@ledgerhq/vault-common\";\nimport { ReviewAPIRequestOptions } from \"@ledgerhq/vault-common/api-request\";\n\nimport cliOptions from \"../cliOptions\";\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\n\nexport interface RejectOptions extends GateOptions {\n device: number | \"lam\";\n requestID?: number;\n all?: boolean;\n apiV2User?: string;\n}\n\nconst runReject = async (options: RejectOptions): Promise<void> => {\n const { all, requestID, apiV2User } = options;\n\n if (!all && !requestID) {\n // eslint-disable-next-line no-console\n console.log(\"Usage: ledger-vault reject --all\");\n // eslint-disable-next-line no-console\n console.log(\"Usage: ledger-vault reject --requestID 1303\");\n return;\n }\n const pool = createDevicesPool({\n ...options,\n deviceAPIURL: options.deviceAPI,\n });\n\n const isTransactionRequest = (request: GateGenericRequest) =>\n request.type === \"CREATE_TRANSACTION\";\n\n const isMessageSigningRequest = (request: GateGenericRequest) =>\n request.type === \"MESSAGE_SIGNING\";\n\n const isPledgeRequest = (request: GateGenericRequest) =>\n request.type === \"CREATE_PLEDGE_INCREMENT\";\n\n const admin = await pool.login(options.device);\n const requestsConnection = await admin.network<Connection<GateGenericRequest>>(\n \"GET\",\n \"/requests?meta_status=PENDING&pageSize=-1\",\n );\n // we need the requests array in both --all and --requestID cases\n // because in the case of --requestID we have to check if request is a tx request\n const requests: GateGenericRequest[] = requestsConnection.edges.map((elt) => elt.node);\n const hasPendingTransactions = requests.some(isTransactionRequest);\n\n // we need the manifest in order to get usersWithDevice array when we\n // want to reject tx request (admins can't reject tx)\n // opti: we don't want to recipe full manifest when no pending tx request exist\n let usersWithDevice: UserWithDevice[] = [];\n if (hasPendingTransactions) {\n const manifestFromGate = await recipeManifest(pool);\n usersWithDevice = manifestFromGate.rawData.usersWithDevice;\n }\n\n if (all) {\n // istanbul ignore next\n if (requests.length === 0) return;\n logger.info(\"Rejecting all pending requests\");\n const pool = createDevicesPool({\n ...options,\n deviceAPIURL: options.deviceAPI,\n });\n\n for (const request of requests) {\n // today only transaction and pledge are creatable by API V2 user\n if (\n (isTransactionRequest(request) ||\n isPledgeRequest(request) ||\n isMessageSigningRequest(request)) &&\n request.created_by\n ) {\n const approver = findApprover(request);\n /* istanbul ignore if */\n if (!approver) {\n throw new Error(`No approver found for request ${request.id}`);\n }\n if (approver.device_type === \"API\") {\n await rejectTransactionRequestAPIV2({\n pool,\n gate: options.gate,\n apiGateway: options.apiGateway,\n requestID: request.id,\n apiV2UserName: approver.username,\n skipDecodeChallenge: isMessageSigningRequest(request),\n });\n } else {\n await rejectTransactionRequest({ pool, request, usersWithDevice, approver });\n }\n } else {\n await admin.rejectRequest(request.id);\n }\n logger.success(`Rejected request ${request.id}: ${request.type}`);\n }\n } else if (requestID) {\n const request = requests.find((request) => request.id === requestID);\n if (!request) throw new Error(`Couldn't find request ${requestID}`);\n if (apiV2User) {\n await rejectTransactionRequestAPIV2({\n pool,\n gate: options.gate,\n apiGateway: options.apiGateway,\n requestID,\n apiV2UserName: apiV2User,\n skipDecodeChallenge: isMessageSigningRequest(request),\n });\n return;\n }\n if (isTransactionRequest(request) && request.created_by) {\n await rejectTransactionRequest({ pool, request, usersWithDevice });\n } else {\n await admin.rejectRequest(request.id);\n }\n logger.success(`Rejected request ${request.id}: ${request.type}`);\n }\n};\n\nexport default {\n command: \"reject\",\n description: \"Reject specific request or all request\",\n options: [\n ...gateOptions,\n ...lamOptions,\n ...cliOptions,\n deviceOption,\n {\n name: \"all\",\n description: \"Reject all pending request\",\n type: Boolean,\n },\n {\n name: \"requestID\",\n description: \"Reject a specific request\",\n type: Number,\n },\n {\n name: \"apiV2User\",\n description: \"API V2 user name\",\n type: String,\n },\n ],\n run: runReject,\n};\n\nexport const findApprover = (request: GateGenericRequest): GateUser | undefined => {\n const approvalSteps = request.approvals_steps || [];\n const approvalCount = request.approvals?.length || 0;\n let quorumToCheck = 0;\n for (let currentStep = 0; currentStep < approvalSteps.length; currentStep++) {\n const step = approvalSteps[currentStep];\n // istanbul ignore next\n quorumToCheck += step?.quorum || 0;\n\n if (approvalCount < quorumToCheck) {\n /* istanbul ignore next */\n return step?.group.members[step?.group.members.length - (quorumToCheck - approvalCount)];\n }\n }\n return undefined;\n};\n\nexport const rejectTransactionRequest = async ({\n pool,\n request,\n usersWithDevice,\n approver,\n}: {\n pool: DevicesPool;\n request: GateGenericRequest;\n usersWithDevice: UserWithDevice[];\n approver?: GateUser;\n}): Promise<void> => {\n let user = usersWithDevice.find(\n (ud) => request.created_by && ud.user.id === request.created_by.id,\n );\n if (approver) {\n user = usersWithDevice.find((ud) => ud.user.id === approver.id);\n }\n if (!user) throw new Error(`Couldn't find user who created request ${request.id}`);\n const deviceIndex = user.deviceIndex;\n const operator = await pool.login(deviceIndex);\n await operator.rejectRequest(request.id);\n};\n\nexport const rejectTransactionRequestAPIV2 = async ({\n pool,\n gate,\n apiGateway,\n requestID,\n apiV2UserName,\n skipDecodeChallenge,\n}: {\n pool: DevicesPool;\n gate: string;\n apiGateway: string;\n requestID: number;\n apiV2UserName: string;\n skipDecodeChallenge: boolean;\n}): Promise<void> => {\n const recipe = await recipeManifest(pool);\n const { manifest } = recipe;\n /* istanbul ignore next */\n const myApiUser = manifest.users?.apiV2?.find((user) => user.name.includes(apiV2UserName));\n if (!myApiUser) {\n throw new Error(`No API V2 user found for ${apiV2UserName}`);\n }\n const approvalApiRequestData: ReviewAPIRequestOptions = {\n pool,\n requestID,\n apiUser: myApiUser,\n gate,\n apiGateway,\n reviewType: \"REJECT\",\n skipDecodeChallenge,\n };\n\n await reviewAPIRequest(approvalApiRequestData, {\n logger,\n });\n};\n","import createHSMBridge from \"@ledgerhq/vault-common/createHSMBridge\";\n\nimport getCertFromPFX from \"../getCertFromPFX\";\nimport logger from \"../logger\";\n\nexport type Options = {\n compartment: number;\n hsm: string;\n hsmCert: string;\n hsmCertPassword: string;\n};\n\nexport default {\n command: \"resetCompartment\",\n description: \"Reset HSM simu compartment\",\n help: [\n {\n content: \"{grey $} ledger-vault resetCompartment --cid 123\",\n },\n ],\n options: [\n {\n name: \"compartment\",\n alias: \"c\",\n type: Number,\n description: \"HSM compartment ID {blue $VAULT_COMPARTMENT_ID}\",\n defaultValue: process.env.VAULT_COMPARTMENT_ID,\n required: true,\n },\n {\n name: \"hsm\",\n type: String,\n description: \"HSM endpoint {blue $VAULT_HSM_ENDPOINT}\",\n defaultValue: process.env.VAULT_HSM_ENDPOINT,\n required: true,\n },\n {\n name: \"hsmCert\",\n type: String,\n description: \"Path to HSM certificate {blue $VAULT_HSM_CLIENT_CERT_PATH}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PATH,\n required: true,\n },\n {\n name: \"hsmCertPassword\",\n type: String,\n description: \"HSM certificate password {blue $VAULT_HSM_CLIENT_CERT_PWD}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PWD,\n required: true,\n },\n ],\n run: async (options: Options): Promise<void> => {\n if (!options.hsmCert) {\n throw new Error(\n \"You must specify the path to your HSM certificate in your environment variable VAULT_HSM_CLIENT_CERT_PATH or use the --hsmCert flag\",\n );\n }\n\n const cert = await getCertFromPFX(options.hsmCert, options.hsmCertPassword);\n\n const bridge = createHSMBridge({\n hsmCert: cert.cert,\n hsmCertKey: cert.key,\n hsmEndpoint: options.hsm,\n });\n\n await bridge.resetCompartment(options.compartment, { logger });\n\n // eslint-disable-next-line no-console\n logger.success(\"Compartment has been reset\");\n },\n};\n","import createHSMBridge from \"@ledgerhq/vault-common/createHSMBridge\";\nimport fs from \"fs\";\n\nimport getCertFromPFX from \"../getCertFromPFX\";\nimport logger from \"../logger\";\n\nexport type Options = {\n compartment: number;\n hsm: string;\n hsmCert: string;\n hsmCertPassword: string;\n backupFile: string;\n};\n\nexport default {\n command: \"restoreCompartment\",\n description: \"Restore HSM simu compartment\",\n help: [\n {\n content: \"{grey $} ledger-vault restoreCompartment --cid 123 --backupFile backup.json\",\n },\n ],\n options: [\n {\n name: \"compartment\",\n alias: \"c\",\n type: Number,\n description: \"HSM compartment ID {blue $VAULT_COMPARTMENT_ID}\",\n defaultValue: process.env.VAULT_COMPARTMENT_ID,\n required: true,\n },\n {\n name: \"backupFile\",\n alias: \"b\",\n type: String,\n description: \"Location of the backup file (output of ledger-vault backupCompartment)\",\n required: true,\n },\n {\n name: \"hsm\",\n type: String,\n description: \"HSM endpoint {blue $VAULT_HSM_ENDPOINT}\",\n defaultValue: process.env.VAULT_HSM_ENDPOINT,\n required: true,\n },\n {\n name: \"hsmCert\",\n type: String,\n description: \"Path to HSM certificate {blue $VAULT_HSM_CLIENT_CERT_PATH}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PATH,\n required: true,\n },\n {\n name: \"hsmCertPassword\",\n type: String,\n description: \"HSM certificate password {blue $VAULT_HSM_CLIENT_CERT_PWD}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PWD,\n required: true,\n },\n ],\n run: async (options: Options): Promise<void> => {\n if (!options.hsmCert) {\n throw new Error(\n \"You must specify the path to your HSM certificate in your environment variable VAULT_HSM_CLIENT_CERT_PATH or use the --hsmCert flag\",\n );\n }\n\n const cert = await getCertFromPFX(options.hsmCert, options.hsmCertPassword);\n\n const bridge = createHSMBridge({\n hsmCert: cert.cert,\n hsmCertKey: cert.key,\n hsmEndpoint: options.hsm,\n });\n\n const fileContent = fs.readFileSync(options.backupFile, \"utf-8\");\n const backup = JSON.parse(fileContent);\n\n await bridge.restoreCompartment(options.compartment, backup, { logger });\n },\n};\n","import { createDevicesPool } from \"@ledgerhq/vault-common\";\n\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport logger from \"../logger\";\nimport type { GateOptions } from \"../types\";\n\nexport type RevokeOptions = GateOptions & {\n command: \"user\" | \"group\";\n device: number;\n id: number;\n noApproval: boolean;\n};\n\nexport const revokeEntity = async (opts: RevokeOptions): Promise<void> => {\n const pool = createDevicesPool({\n ...opts,\n deviceAPIURL: opts.deviceAPI,\n });\n const userDevice = await pool.login(opts.device);\n\n let request: any;\n if (opts.command === \"user\") {\n logger.info(`Revoking user ${opts.id}`);\n request = await userDevice.post(\"/requests\", { type: \"REVOKE_USER\", user_id: opts.id });\n }\n\n if (opts.command === \"group\") {\n logger.info(`Revoking group ${opts.id}`);\n request = await userDevice.post(\"/requests\", { type: \"REVOKE_GROUP\", group_id: opts.id });\n }\n\n if (opts.noApproval) return;\n\n logger.info(\"Approving request...\");\n // load admin devices in cache - needed for `pool.runWithQuorum()`\n await pool.getOnboardingAdminDevices();\n /* istanbul ignore next */\n await pool.runWithQuorum((admin) => admin.approveRequest(request));\n};\n\nexport default {\n command: \"revoke\",\n description: \"Revoke user or group\",\n options: [\n ...gateOptions,\n deviceOption,\n {\n name: \"noApproval\",\n type: Boolean,\n description: \"Create the request without approving it\",\n },\n ],\n subCommands: [\n {\n command: \"user\",\n description: \"Revoke user\",\n options: [\n {\n name: \"id\",\n type: Number,\n description: \"User ID\",\n required: true,\n },\n ],\n run: revokeEntity,\n },\n {\n command: \"group\",\n description: \"Revoke group\",\n options: [\n {\n name: \"id\",\n type: Number,\n description: \"Group ID\",\n required: true,\n },\n ],\n run: revokeEntity,\n },\n ],\n};\n","import {\n FeesLevel,\n GateTransactionType,\n ManifestAccount,\n createDevicesPool,\n feesLevels,\n recipeManifest,\n send,\n} from \"@ledgerhq/vault-common\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\nimport { displayTable } from \"../utils\";\n\nexport interface SendOpts extends GateOptions {\n noApproval: boolean;\n strategy?: string;\n account: string;\n recipient: string;\n amount: string;\n feesLevel: FeesLevel;\n gasPrice?: string;\n gasLimit?: string;\n contractPayload?: string;\n txType: GateTransactionType;\n title?: string;\n comment?: string;\n}\n\nasync function sendTransaction(options: SendOpts): Promise<void> {\n const { feesLevel, gasPrice, gasLimit } = options;\n if (!feesLevels.includes(feesLevel)) {\n throw new Error(\n `Fees level should be one of the following ${feesLevels\n .map((feesLevel) => feesLevel)\n .join(\", \")}`,\n );\n }\n\n if (feesLevel === \"CUSTOM\" && (!gasPrice || !gasLimit)) {\n throw new Error(\"Gas price and gas limit are required when using custom fees\");\n }\n\n const pool = createDevicesPool({\n ...options,\n deviceAPIURL: options.deviceAPI,\n });\n\n const recipe = await recipeManifest(pool);\n const { manifest, rawData } = recipe;\n\n if (!manifest.accounts) {\n throw new Error(\"No accounts found\");\n }\n\n const account = manifest.accounts.find((a) => a.name === options.account);\n\n if (!account) {\n throw new Error(`Account '${options.account}' not found`);\n }\n\n const transaction = {\n account: options.account,\n recipient: options.recipient,\n amount: options.amount,\n transactionType: options.txType,\n feesLevel: options.feesLevel,\n gasLimit: options.gasLimit,\n gasPrice: options.gasPrice,\n title: options.title,\n comment: options.comment,\n };\n\n if (options.strategy) {\n Object.assign(transaction, {\n utxosPickingStrategy: options.strategy,\n });\n }\n\n if (options.contractPayload) {\n if (!contractPayloadSupported(account)) {\n throw new Error(\"Option --contractPayload can only be used with ethereum accounts\");\n }\n Object.assign(transaction, {\n contractPayload: options.contractPayload,\n });\n }\n\n const sendPayload = {\n pool,\n transaction,\n account,\n groups: manifest.groups,\n accountsByName: rawData.accountsByName,\n whitelistsByName: rawData.whitelistsByName,\n noApproval: options.noApproval,\n };\n\n const tx = await send(sendPayload, { logger });\n\n displayTable(\n {\n edges: [{ cursor: tx.id, node: tx }],\n pageInfo: {\n count: 1,\n hasNextPage: false,\n },\n },\n \"TRANSACTION\",\n );\n}\n\nconst contractPayloadSupported = (account: ManifestAccount) => {\n return (\n \"currency\" in account &&\n [\"ethereum\", \"ethereum_ropsten\", \"ethereum_goerli\", \"polygon\", \"bsc\"].includes(account.currency)\n );\n};\n\nexport default {\n command: \"send\",\n description: \"Create a transaction\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault send {bold --account} accountName {bold --recipient} address {bold --amount} 2\",\n ],\n },\n ],\n options: [\n {\n name: \"account\",\n type: String,\n description: \"Sender account name\",\n required: true,\n },\n {\n name: \"recipient\",\n description: \"Address of the recipient\",\n type: String,\n defaultValue: \"\", // intended to not make it `required` because some transaction types does not need recipient (e.g: UNDELEGATE)\n },\n {\n name: \"amount\",\n description: \"Amount in default unit (e.g in BTC for Bitcoin)\",\n type: String,\n defaultValue: \"0\",\n },\n {\n name: \"feesLevel\",\n description: \"Fees level (SLOW|NORMAL|FAST|CUSTOM)\",\n type: String,\n defaultValue: \"NORMAL\",\n },\n {\n name: \"gasPrice\",\n description:\n \"Gas price for your transaction. Only used with {blue --feesLevel} set to CUSTOM\",\n type: String,\n },\n {\n name: \"gasLimit\",\n description:\n \"Gas limit for your transaction. Only used with {blue --feesLevel} set to CUSTOM\",\n type: String,\n },\n {\n name: \"noApproval\",\n type: Boolean,\n description: \"Create the transaction without approving it\",\n },\n {\n name: \"strategy\",\n type: String,\n description: \"Strategy to use to pick utxo (MERGE_OUTPUTS|DEEP_OUTPUTS_FIRST|OPTIMIZE_SIZE)\",\n },\n {\n name: \"contractPayload\",\n type: String,\n description: \"Raw hex smart-contract input (only for Ethereum account types)\",\n },\n {\n name: \"txType\",\n type: String,\n defaultValue: \"SEND\",\n description: \"Transaction type (SEND|RECEIVE|PREBURN|BURN|MINT|DELEGATE|UNDELEGATE)\",\n },\n {\n name: \"title\",\n type: String,\n description: \"Transaction title\",\n },\n {\n name: \"comment\",\n type: String,\n description: \"Transaction note comment\",\n },\n ...gateOptions,\n ...cliOptions,\n ],\n run: sendTransaction,\n};\n","import { bakeManifest, createDevicesPool } from \"@ledgerhq/vault-common\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\n\nexport interface SetQuorumOptions extends GateOptions {\n positionals: string[];\n}\n\nexport default {\n command: \"setQuorum\",\n positionals: true,\n description: \"Set the admin quorum\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault setQuorum {bold 5}\"],\n },\n ],\n options: [...gateOptions, ...cliOptions],\n run: async (options: SetQuorumOptions): Promise<void> => {\n const { gate, apiGateway, transport, salt, positionals, networkDelay } = options;\n\n const quorum = Number(positionals[0]);\n const pool = createDevicesPool({\n gate,\n apiGateway,\n salt,\n transport,\n networkDelay,\n deviceAPIURL: options.deviceAPI,\n });\n\n await bakeManifest({ quorum }, pool, { logger });\n },\n};\n","import { createDevicesPool, createSettlement, recipeManifest } from \"@ledgerhq/vault-common\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\n\nexport interface SettlementOpts extends GateOptions {\n account: string;\n exchange: string;\n percentage: number;\n apiV2User: string;\n}\n\nasync function settle(options: SettlementOpts): Promise<void> {\n const { exchange, percentage, apiV2User } = options;\n\n if (percentage > 100) {\n throw new Error(`Invalid percentage '${percentage}', please choose a value between 0 and 100'`);\n }\n const pool = createDevicesPool({\n ...options,\n deviceAPIURL: options.deviceAPI,\n });\n\n const recipe = await recipeManifest(pool);\n const { manifest, rawData } = recipe;\n\n /* istanbul ignore next */\n const account = manifest.accounts?.find((a) => a.name === options.account);\n\n if (!account) {\n throw new Error(`Account '${options.account}' not found`);\n }\n\n const myApiUser = manifest.users?.apiV2?.find((user) => user.name.includes(apiV2User));\n if (!myApiUser) {\n throw new Error(`No API V2 user found for ${apiV2User}`);\n }\n\n const settlementData = {\n pool,\n account,\n accountsByName: rawData.accountsByName,\n exchange,\n percentage,\n apiUser: myApiUser,\n gate: options.gate,\n apiGateway: options.apiGateway,\n };\n\n const settleResp = await createSettlement(settlementData, { logger });\n logger.info(settleResp);\n}\n\nexport default {\n command: \"settle\",\n description: \"Create a settlement\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault settle {bold --account} TL-0001-ETH-OOF-KOM {bold --exchange} Crypto.com {bold --percentage} 50 {bold --apiV2User} 10\",\n ],\n },\n ],\n options: [\n {\n name: \"account\",\n type: String,\n description: \"Sender account name\",\n required: true,\n },\n {\n name: \"exchange\",\n type: String,\n description: \"Pledge exchange name\",\n required: true,\n },\n {\n name: \"percentage\",\n description: \"Percentage amount to pledge (0-100)\",\n type: Number,\n required: true,\n },\n {\n name: \"apiV2User\",\n description: \"API V2 user name: will do a string search\",\n type: String,\n required: true,\n },\n ...gateOptions,\n ...cliOptions,\n ],\n run: settle,\n};\n","import {\n DEFAULT_VAULT_REMOTE_URL,\n HelmValues,\n UpgradeOptions,\n upgrade,\n} from \"@ledgerhq/vault-common\";\n\nimport logger from \"../logger\";\n\ntype UpgradeCommandOptions = {\n name: string;\n preset?: string;\n values?: string;\n watchTimeoutMinutes?: number;\n remoteURL: string;\n};\n\nexport const upgradeCommand = async (options: UpgradeCommandOptions): Promise<void> => {\n let values: HelmValues | null = null;\n if (options.values) {\n values = JSON.parse(options.values) as HelmValues;\n }\n const upgradeOptions: UpgradeOptions = {\n remoteURL: options.remoteURL,\n name: options.name,\n watchTimeoutMinutes: options.watchTimeoutMinutes,\n ...(options.preset ? { preset: options.preset } : {}),\n ...(values ? { values } : {}),\n };\n await upgrade(upgradeOptions, { logger });\n};\n\nexport default {\n command: \"upgrade\",\n description: \"Upgrade a minivault instance deployed by vault-remote\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault upgrade --name foo --preset release-4.20\"],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Name of the instance to target\",\n required: true,\n },\n {\n name: \"preset\",\n description: \"If passed, will upgrade to those preset values\",\n type: String,\n },\n {\n name: \"values\",\n description: \"JSON values to override Helm values\",\n type: String,\n },\n {\n name: \"remoteURL\",\n description: `vault-remote URL {grey (default: ${DEFAULT_VAULT_REMOTE_URL})}`,\n type: String,\n defaultValue: DEFAULT_VAULT_REMOTE_URL,\n },\n {\n name: \"watchTimeoutMinutes\",\n description: `Stop watching and throw after the given elapsed minutes {grey (default: 10)}`,\n type: Number,\n defaultValue: 10,\n },\n ],\n run: upgradeCommand,\n};\n","import commandAPDU from \"./apdu\";\nimport commandApprove from \"./approve\";\nimport commandBackupCompartment from \"./backupCompartment\";\nimport commandBake from \"./bake\";\nimport commandBridge from \"./bridge\";\nimport commandConfigCat from \"./configcat\";\nimport commandCreate from \"./create\";\nimport commandDeploy from \"./deploy\";\nimport commandDestroy from \"./destroy\";\nimport commandDrain from \"./drain\";\nimport commandFaucet from \"./faucet\";\nimport commandFetch from \"./fetch\";\nimport commandGenKeys from \"./genKeys\";\nimport commandGet from \"./get\";\nimport commandGetAPIUserTokens from \"./getAPIUserTokens\";\nimport commandGetAuthToken from \"./getAuthToken\";\nimport commandGetMVInstances from \"./getMVInstances\";\nimport commandGetSeeds from \"./getSeeds\";\nimport commandGetUserID from \"./getUserID\";\nimport commandInitCompartment from \"./initCompartment\";\nimport commandListen from \"./listen\";\nimport commandOnboard from \"./onboard\";\nimport commandPlege from \"./pledge\";\nimport commandProxy from \"./proxy\";\nimport commandReceive from \"./receive\";\nimport commandRecipe from \"./recipe\";\nimport commandReject from \"./reject\";\nimport commandResetCompartment from \"./resetCompartment\";\nimport commandRestoreCompartment from \"./restoreCompartment\";\nimport commandRevoke from \"./revoke\";\nimport commandSend from \"./send\";\nimport commandSetQuorum from \"./setQuorum\";\nimport commandSettle from \"./settle\";\nimport commandUpgrade from \"./upgrade\";\nimport commandWipe from \"./wipe\";\n\n// TODO\n// improve help https://github.com/75lb/command-line-usage/wiki/How-to-add-an-examples-section-to-your-usage-guide\n\nconst help = [\n {\n header: \"ledger-vault\",\n content: [\n \"A various utility command-line for Vault development.\",\n \"\",\n \"usage: ledger-vault <command> [options]\",\n ],\n },\n];\n\nconst options = [\n {\n name: \"debug\",\n type: Boolean,\n description: \"Print debug messages\",\n },\n {\n name: \"version\",\n alias: \"v\",\n type: Boolean,\n description: \"Show version\",\n },\n {\n name: \"help\",\n alias: \"h\",\n type: Boolean,\n description: \"Show help\",\n },\n];\n\nexport default {\n help,\n options,\n subCommands: [\n commandOnboard,\n commandBake,\n commandRecipe,\n commandWipe,\n commandDeploy,\n commandUpgrade,\n commandDestroy,\n commandCreate,\n commandSetQuorum,\n commandGet,\n commandFetch,\n commandFaucet,\n commandGetAuthToken,\n commandGetAPIUserTokens,\n commandGetUserID,\n commandInitCompartment,\n commandResetCompartment,\n commandBackupCompartment,\n commandRestoreCompartment,\n commandListen,\n commandGetSeeds,\n commandGenKeys,\n commandDrain,\n commandSend,\n commandReceive,\n commandPlege,\n commandSettle,\n commandProxy,\n commandBridge,\n commandApprove,\n commandReject,\n commandRevoke,\n commandAPDU,\n commandGetMVInstances,\n commandConfigCat,\n ],\n};\n","import TransportNodeHID from \"@ledgerhq/hw-transport-node-hid\";\nimport { registerTransportModule } from \"@ledgerhq/live-common-stub/lib/hw\";\n\n/* istanbul ignore next */\nregisterTransportModule({\n id: \"nodehid\",\n disconnect: () => null,\n open: (id: string) => {\n if (id !== \"nodehid\") return;\n const transport = TransportNodeHID.create();\n return transport;\n },\n});\n"],"mappings":"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","names":["chalk","chalk","options","options","user","request","cert","options","bridge","createDevicesPool","fs","options","wipeOptions","options","fs","createDevicesPool","createDevicesPool","createDevicesPool","chalk","options","chalk","bakeManifest","createDevicesPool","createDevicesPool","fs","fs","options","createDevicesPool","createDevicesPool","bakeManifest","options","DEFAULT_VAULT_REMOTE_URL","options","DEFAULT_VAULT_REMOTE_URL","createDevicesPool","createDevicesPool","options","createDevicesPool","fs","options","createDevicesPool","fs","options","createDevicesPool","options","createDevicesPool","createDevicesPool","options","createDevicesPool","DEFAULT_VAULT_REMOTE_URL","Table","options","DEFAULT_VAULT_REMOTE_URL","Table","options","createDevicesPool","options","createDevicesPool","createHSMBridge","options","bridge","createHSMBridge","createDevicesPool","options","createDevicesPool","bakeManifest","createDevicesPool","options","bakeManifest","createDevicesPool","createDevicesPool","recipeManifest","options","createDevicesPool","recipeManifest","bodyParser","chalk","cors","express","fs","express","chalk","cors","bodyParser","fs","createDevicesPool","options","createDevicesPool","createDevicesPool","recipeManifest","options","recipeManifest","createDevicesPool","createDevicesPool","recipeManifest","reviewAPIRequest","options","createDevicesPool","recipeManifest","pool","request","reviewAPIRequest","createHSMBridge","options","bridge","createHSMBridge","createHSMBridge","fs","options","bridge","createHSMBridge","fs","createDevicesPool","createDevicesPool","createDevicesPool","recipeManifest","options","feesLevel","createDevicesPool","recipeManifest","bakeManifest","createDevicesPool","options","createDevicesPool","bakeManifest","createDevicesPool","recipeManifest","options","createDevicesPool","recipeManifest","DEFAULT_VAULT_REMOTE_URL","options","DEFAULT_VAULT_REMOTE_URL","help","options","chalk","cmd","chalk"]}
1
+ {"version":3,"sources":["../package.json","../src/index.ts","../src/cli.ts","../src/__patchGateOptionsWithEnvVariables.ts","../src/logger.ts","../src/commands/apdu.ts","../src/commands/approve.ts","../src/cliOptions.ts","../src/deviceOption.ts","../src/gateOptions.ts","../src/lamOptions.ts","../src/commands/backupCompartment.ts","../src/getCertFromPFX.ts","../src/commands/bake.ts","../src/manifests/beatles.json","../src/manifests/empty.json","../src/manifests/erc20.json","../src/manifests/message-signing.json","../src/manifests/mobile.json","../src/manifests/polkadot-staking.json","../src/manifests/polkadot.json","../src/manifests/rawsigning.json","../src/manifests/ripple.json","../src/manifests/sci.json","../src/manifests/solana-dev.json","../src/manifests/solana-staking.json","../src/manifests/solana.json","../src/manifests/stellar.json","../src/manifests/tezos.json","../src/manifests/tradelink-hsm.json","../src/manifests/tradelink.json","../src/miscOptions.ts","../src/revault-compat.ts","../src/commands/wipe.ts","../src/commands/bridge.ts","../src/commands/configcat.ts","../src/commands/create.ts","../src/commands/get.ts","../src/utils.ts","../src/commands/deploy.ts","../src/commands/destroy.ts","../src/commands/drain.ts","../src/commands/faucet.ts","../src/commands/fetch.ts","../src/commands/genKeys.ts","../src/commands/getAPIUserTokens.ts","../src/commands/getAuthToken.ts","../src/commands/getMVInstances.ts","../src/commands/getSeeds.ts","../src/commands/getUserID.ts","../src/commands/initCompartment.ts","../src/commands/listen.ts","../src/commands/onboard.ts","../src/commands/pledge.ts","../src/commands/proxy.ts","../src/commands/receive.ts","../src/commands/recipe.ts","../src/commands/reject.ts","../src/commands/resetCompartment.ts","../src/commands/restoreCompartment.ts","../src/commands/revoke.ts","../src/commands/send.ts","../src/commands/setQuorum.ts","../src/commands/settle.ts","../src/commands/upgrade.ts","../src/commands/index.ts","../src/registerTransports.ts"],"sourcesContent":["{\n \"name\": \"@ledgerhq/vault-cli\",\n \"version\": \"2.3.2\",\n \"description\": \"A various utility command-line for Vault development\",\n \"homepage\": \"https://github.com/LedgerHQ/vault-ts\",\n \"license\": \"BSD-2-Clause\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/LedgerHQ/vault-ts.git\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"bin\": {\n \"ledger-vault\": \"bin/index.js\"\n },\n \"scripts\": {\n \"clean\": \"rm -rf bin\",\n \"build\": \"tsup && chmod +x bin/index.js\",\n \"test\": \"jest\",\n \"test:pedantic\": \"jest --coverage --coverageThreshold '{ \\\"global\\\": { \\\"branches\\\": 100, \\\"functions\\\": 100, \\\"lines\\\": 100, \\\"statements\\\": 100 } }'\",\n \"lint\": \"eslint .\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@ledgerhq/cryptoassets\": \"^6.37.0\",\n \"@ledgerhq/hw-transport-node-hid\": \"^6.29.4\",\n \"@ledgerhq/live-common-stub\": \"workspace:*\",\n \"@ledgerhq/vault-common\": \"workspace:*\",\n \"@ledgerhq/vault-utils\": \"workspace:*\",\n \"axios\": \"^0.21.4\",\n \"bignumber.js\": \"^9.1.1\",\n \"body-parser\": \"^1.20.2\",\n \"chalk\": \"^4.1.1\",\n \"cli-table3\": \"^0.6.3\",\n \"command-line-args\": \"^5.1.1\",\n \"command-line-usage\": \"^6.1.0\",\n \"cors\": \"^2.8.5\",\n \"eslint\": \"^8.43.0\",\n \"express\": \"^4.18.2\",\n \"lodash\": \"^4.17.21\",\n \"moment\": \"^2.29.1\",\n \"nanoid\": \"3\",\n \"pem\": \"github:Dexus/pem#71dae3346801dafb5a8bcebcd4c7267fd182666f\",\n \"prettier\": \"^2.8.8\",\n \"progress\": \"^2.0.3\",\n \"qs\": \"^6.11.2\"\n },\n \"devDependencies\": {\n \"@ledgerhq/eslint-config-custom\": \"workspace:*\",\n \"@swc/core\": \"1.2.205\",\n \"@swc/jest\": \"^0.2.26\",\n \"@types/body-parser\": \"^1.19.2\",\n \"@types/cli-table\": \"^0.3.1\",\n \"@types/command-line-args\": \"^5.0.0\",\n \"@types/command-line-usage\": \"^5.0.1\",\n \"@types/cors\": \"^2.8.13\",\n \"@types/express\": \"^4.17.17\",\n \"@types/jest\": \"^28.1.8\",\n \"@types/lodash\": \"^4.14.195\",\n \"@types/node\": \"^15.14.9\",\n \"@types/pem\": \"^1.9.6\",\n \"@types/prettier\": \"2.7.3\",\n \"@types/progress\": \"^2.0.3\",\n \"@types/qs\": \"^6.9.7\",\n \"@typescript-eslint/eslint-plugin\": \"^5.60.1\",\n \"jest\": \"^29.7.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\"\n }\n}\n","#!/usr/bin/env node\n// node shebang makes gh stats counting this file as js\nimport chalk from \"chalk\";\n\nimport cli from \"./cli\";\n\ncli();\nprocess.on(\"unhandledRejection\", (err) => {\n // @ts-ignore\n // eslint-disable-next-line no-console\n console.log(chalk`{red.bold ERROR} {red ${err.toString()}}`);\n\n // @ts-ignore\n if (err.name === \"AggregateError\") {\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError\n // @ts-ignore\n err.errors.forEach((e: Error) => {\n // eslint-disable-next-line no-console\n console.log(chalk`{red.bold ERROR} {red ${e.toString()}}`);\n });\n }\n\n if (process.env.DEBUG === \"1\") {\n // @ts-ignore\n console.log(chalk`{red ${err.stack}}`);\n }\n});\n","import chalk from \"chalk\";\nimport commandLineArgs, { OptionDefinition } from \"command-line-args\";\nimport commandLineUsage, { Content } from \"command-line-usage\";\n\nimport __patchGateOptionsWithEnvVariables from \"./__patchGateOptionsWithEnvVariables\";\nimport commands from \"./commands\";\nimport \"./registerTransports\";\n\n// eslint-disable-next-line\nconst { version } = require(\"../package.json\");\n\ninterface VaultCliCommand {\n command?: string;\n subCommands?: VaultCliCommand[];\n description?: string;\n help?: Content[];\n run?: (arg0: any) => void;\n options?: OptionDefinition[];\n positionals?: boolean;\n allowNoPositional?: boolean;\n}\n\nasync function runCLI(overrideArgv?: string[]): Promise<void> {\n const accumulatedOptions = {};\n const accumulatedOptionsChoices: any[] = [];\n let help = false;\n\n return parseOptionsAndRun(commands, overrideArgv);\n\n async function parseOptionsAndRun(_cmd: VaultCliCommand, argv?: string[]) {\n // istanbul ignore next\n const cmd = { ..._cmd, options: _cmd.options || [] };\n // istanbul ignore next\n accumulatedOptionsChoices.unshift(...(cmd.options || []));\n /* istanbul ignore next */\n const definitions = cmd.subCommands\n ? [{ name: \"command\", defaultOption: true }, ...(cmd.options || [])]\n : cmd.positionals\n ? [{ name: \"positionals\", defaultOption: true, multiple: true }, ...(cmd.options || [])]\n : cmd.options;\n\n const options = commandLineArgs(definitions, {\n argv,\n partial: true,\n });\n\n if (options.version) {\n // will be replaced at build time\n // eslint-disable-next-line no-console\n console.log(version);\n return;\n }\n\n Object.assign(accumulatedOptions, options);\n\n // @ts-ignore\n delete accumulatedOptions._unknown;\n\n const _argv = options._unknown || [];\n\n if (!help) {\n definitions.forEach((optionDefinition) => {\n if (\n // @ts-ignore: we sneakily injected it here\n optionDefinition.required &&\n !(optionDefinition.name in accumulatedOptions)\n ) {\n // eslint-disable-next-line no-console\n console.log(\n chalk`{red.bold ERROR} {red missing required option --${optionDefinition.name}}`,\n );\n process.exit(1);\n }\n });\n }\n\n help =\n help ||\n options.help ||\n (cmd.subCommands && !options.command) ||\n /* istanbul ignore next */\n (cmd.positionals && !options.positionals && !cmd.allowNoPositional);\n\n if (cmd.subCommands) {\n const subCommand = cmd.subCommands.find((cmd) => cmd.command === options.command);\n if (!subCommand) {\n showHelp();\n return;\n }\n await parseOptionsAndRun(subCommand, _argv);\n return;\n }\n // @ts-ignore\n __patchGateOptionsWithEnvVariables(accumulatedOptions);\n\n if (\"debug\" in accumulatedOptions) {\n process.env.DEBUG = \"1\";\n }\n\n // don't know how to trigger this if\n // istanbul ignore next\n if (help) {\n showHelp();\n return;\n }\n\n if (cmd.run) {\n try {\n await cmd.run(accumulatedOptions);\n // istanbul ignore if\n if (!overrideArgv) {\n process.exit(0);\n }\n } catch (err) /* istanbul ignore next */ {\n if (overrideArgv) {\n throw err;\n }\n // eheheh\n // @ts-expect-error\n if (err.message === \"HACKY_CLOSE_DEVICES\") {\n process.exit(0);\n return;\n }\n // @ts-expect-error\n // eslint-disable-next-line no-console\n console.log(chalk`{red.bold ERROR} {red ${err.toString()}}`);\n if (process.env.DEBUG) {\n // @ts-expect-error\n // eslint-disable-next-line no-console\n console.log(err.stack);\n }\n process.exit(1);\n }\n }\n\n function showHelp() {\n const opts1 = accumulatedOptionsChoices.filter((opt) => !isGlobalOpt(opt));\n const opts2 = accumulatedOptionsChoices.filter(isGlobalOpt);\n const hasOptions = opts1.length > 0;\n\n const helpText = commandLineUsage([\n {\n content: cmd.description,\n },\n ...(cmd.help || []),\n ...(cmd.subCommands\n ? [\n {\n header: \"Commands\",\n content: cmd.subCommands.map((cmd) => ({\n name: cmd.command,\n summary: cmd.description,\n })),\n },\n ]\n : /* istanbul ignore next */ []),\n ...(hasOptions\n ? [\n {\n header: \"Options\",\n optionList: opts1.map((opt) => {\n return {\n ...opt,\n ...(opt.required\n ? /* istanbul ignore next */ {\n description: `{red.bold *} ${opt.description}`,\n }\n : {}),\n };\n }),\n },\n ]\n : /* istanbul ignore next */ []),\n {\n header: \"Global options\",\n optionList: opts2,\n },\n ]);\n // eslint-disable-next-line no-console\n console.log(helpText.trim());\n // eslint-disable-next-line no-console\n console.log(\"\");\n }\n }\n}\n\nconst isGlobalOpt = (opt: OptionDefinition) => {\n const GLOBAL_OPTIONS = [\"help\", \"debug\", \"version\"];\n return GLOBAL_OPTIONS.includes(opt.name);\n};\n\nexport default runCLI;\n","import { setDeviceAPIEndpoint } from \"@ledgerhq/vault-common\";\n\nimport logger from \"./logger\";\nimport { OptionalRevaultOnboardingOptions } from \"./revault-compat\";\nimport { GateOptions } from \"./types\";\n\nexport const envVariablesOptionsMap: Record<string, string> = {\n VAULT_SALT: \"salt\",\n VAULT_GATE_URL: \"gate\",\n};\n\nexport default function __patchGateOptionsWithEnvVariables(\n opts: GateOptions & OptionalRevaultOnboardingOptions,\n): GateOptions {\n Object.keys(envVariablesOptionsMap).forEach((key) => {\n const value = envVariablesOptionsMap[key];\n\n // @ts-ignore\n if (opts[value] !== \"\") {\n return;\n }\n\n const envValue = process.env[key];\n if (envValue) {\n // @ts-ignore\n opts[value] = envValue;\n }\n });\n if (opts.minivault) logger.info(\"The --minivault option is not needed anymore.\");\n if (opts.minivaultURL) {\n const baseURL = opts.minivaultURL.endsWith(\"/\")\n ? opts.minivaultURL\n : /* istanbul ignore next */ `${opts.minivaultURL}/`;\n opts.deviceAPI = `${baseURL}device-api`;\n setDeviceAPIEndpoint(opts.deviceAPI);\n opts.gate = `${baseURL}gate/minivault`;\n opts.apiGateway = `${baseURL}api-gateway`;\n opts.lam = `${baseURL}lam`;\n opts.revaultApiUrl = `${baseURL}api`;\n opts.revaultRootAuthToken = \"root-auth-token\";\n }\n return opts;\n}\n","import { createConsoleLogger } from \"@ledgerhq/vault-utils\";\n\nexport default createConsoleLogger();\n","import TransportNodeHid from \"@ledgerhq/hw-transport-node-hid\";\n\nexport type APDUOptions = {\n positionals: string[];\n};\n\nexport default {\n command: \"apdu\",\n positionals: true,\n description: \"Send raw APDU to hardware device\",\n help: [\n {\n content: \"{grey $} ledger-vault apdu e0400200090280564c5480553246\",\n },\n ],\n run: async (options: APDUOptions): Promise<void> => {\n if (!options.positionals) {\n throw new Error(`You must pass an APDU`);\n }\n const toSend = options.positionals[0] as string;\n const transport = await TransportNodeHid.create();\n const response = await transport.exchange(Buffer.from(toSend, \"hex\"));\n // eslint-disable-next-line no-console\n console.log(response.toString(\"hex\"));\n },\n};\n","import { createDevicesPool, recipeManifest, reviewAPIRequest } from \"@ledgerhq/vault-common\";\nimport type { Connection, GateGenericRequest, UserWithDevice } from \"@ledgerhq/vault-common\";\nimport type { ReviewType } from \"@ledgerhq/vault-common/api-request\";\n\nimport cliOptions from \"../cliOptions\";\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\n\nexport type ApproveOptions = GateOptions & {\n device: number;\n requestID?: number;\n all?: boolean;\n withoutHSM?: boolean;\n apiV2User?: string;\n apiGateway?: string;\n};\n\nconst runApprove = async (options: ApproveOptions): Promise<void> => {\n const { device, all, requestID, withoutHSM, apiV2User } = options;\n if (!all && !requestID) {\n // eslint-disable-next-line no-console\n console.log(\"Usage: ledger-vault approve --all\");\n // eslint-disable-next-line no-console\n console.log(\"Usage: ledger-vault approve --requestID 1303\");\n return;\n }\n const pool = createDevicesPool({\n ...options,\n deviceAPIURL: options.deviceAPI,\n });\n\n if (apiV2User) {\n const recipe = await recipeManifest(pool);\n const { manifest } = recipe;\n\n /* istanbul ignore next */\n const myApiUser = manifest.users?.apiV2?.find((user) => user.name.includes(apiV2User));\n if (!myApiUser) {\n throw new Error(`No API V2 user found for ${apiV2User}`);\n }\n\n const approveApiRequestData = {\n pool,\n requestID: requestID as number,\n apiUser: myApiUser,\n gate: options.gate,\n apiGateway: String(options.apiGateway),\n reviewType: \"APPROVE\" as ReviewType,\n };\n\n const requestResp = await reviewAPIRequest(approveApiRequestData, {\n logger,\n });\n logger.info(requestResp);\n return;\n }\n\n const userDevice = await pool.login(options.device);\n const requestsConnection = await userDevice.network<Connection<GateGenericRequest>>(\n \"GET\",\n \"/requests?meta_status=PENDING&pageSize=-1\",\n );\n\n const manifestFromGate = await recipeManifest(pool);\n const gateUsers = manifestFromGate.rawData.usersWithDevice;\n const user = gateUsers.find((gateUser) => gateUser.deviceIndex === device);\n\n if (!user) throw new Error(\"No user found for this device\");\n const requests: GateGenericRequest[] = requestsConnection.edges.map((elt) => elt.node);\n\n if (all) {\n // istanbul ignore next\n if (requests.length === 0) {\n logger.info(\"No request to approve\");\n return;\n }\n logger.info(\"Approving all pending requests\");\n // process approvals one-by-one. Otherwise it doesn't work\n for await (const request of requests) {\n if (hasUserApprovedRequest(user, request)) {\n logger.info(`User width device ${device} already approved request ${request.id}`);\n continue;\n }\n withoutHSM\n ? await userDevice.approveRequestWithoutHSM({ id: request.id })\n : await userDevice.approveRequest({ id: request.id });\n logger.success(`Approved request ${request.id}: ${request.type}`);\n }\n return;\n }\n\n const request = requests.find((request) => request.id === requestID);\n if (!request) throw new Error(`Couldn't find request ${requestID}`);\n if (hasUserApprovedRequest(user, request)) {\n logger.info(`User width device ${device} already approved request ${request.id}`);\n return;\n }\n withoutHSM\n ? await userDevice.approveRequestWithoutHSM({ id: request.id })\n : await userDevice.approveRequest({ id: request.id });\n\n logger.success(`Approved request ${request.id}: ${request.type}`);\n};\n\nconst hasUserApprovedRequest = (user: UserWithDevice, request: GateGenericRequest) =>\n request.approvals &&\n request.approvals.filter((approval) => {\n /* istanbul ignore next */\n return approval.created_by?.pub_key === user.user.pub_key && approval.type === \"APPROVE\";\n }).length > 0;\n\nexport default {\n command: \"approve\",\n description: \"Approve specific request or all request\",\n options: [\n ...gateOptions,\n ...lamOptions,\n ...cliOptions,\n deviceOption,\n {\n name: \"all\",\n description: \"Approve all pending request\",\n type: Boolean,\n },\n {\n name: \"requestID\",\n description: \"Approve a specific request\",\n type: Number,\n },\n {\n name: \"withoutHSM\",\n description: \"Do not require device to approve request\",\n type: Boolean,\n },\n {\n name: \"apiV2User\",\n description: \"API V2 user name\",\n type: String,\n },\n ],\n run: runApprove,\n};\n","export default [\n {\n name: \"networkDelay\",\n description: \"Allows to delay (ms) between each request\",\n type: Number,\n defaultValue: 0,\n },\n];\n","export default {\n name: \"device\",\n alias: \"d\",\n type: Number,\n description: \"Device used to do the query {grey (default: 4 (Admin 1))}\",\n defaultValue: 4,\n};\n","export const GATE_OPTION = {\n name: \"gate\",\n alias: \"g\",\n defaultValue: process.env.VAULT_GATE_URL || \"https://localhost:8443/gate/minivault\",\n description:\n \"Target gate {blue $VAULT_GATE_URL} {grey (default: https://localhost:8443/gate/minivault)}\",\n type: String,\n};\n\nexport const MINIVAULT_OPTION = {\n name: \"minivault\",\n type: Boolean,\n description: \"This option is deprecated, it is not needed anymore for minivault usage\",\n};\n\nconst MINIVAULT_URL_OPTION = {\n name: \"minivaultURL\",\n description: \"Remote URL to apply CLI actions\",\n type: String,\n defaultValue: process.env.MINIVAULT_URL,\n};\n\nexport const TRANSPORT_OPTION = {\n name: \"transport\",\n type: String,\n description: \"Either software|nodehid|nodehid-replayer\",\n};\n\nconst SALT_OPTION = {\n name: \"salt\",\n alias: \"s\",\n type: String,\n typeLabel: \"<salt>\",\n description: \"Salt used to generate devices seeds {blue $VAULT_SALT}\",\n defaultValue: \"\",\n};\n\nconst DEVICE_API_OPTION = {\n name: \"deviceAPI\",\n type: String,\n typeLabel: \"<url>\",\n description: \"Device API URL\",\n};\n\nconst API_GATEWAY_OPTION = {\n name: \"apiGateway\",\n type: String,\n description: \"api gateway URL\",\n defaultValue: process.env.VAULT_API_GATEWAY_URL || \"https://localhost:8443/api-gateway\",\n};\n\nexport const minimalGateOptions = [GATE_OPTION, SALT_OPTION, MINIVAULT_OPTION];\n\nexport default [\n GATE_OPTION,\n SALT_OPTION,\n DEVICE_API_OPTION,\n TRANSPORT_OPTION,\n {\n name: \"readOnlyUser\",\n type: String,\n description: \"Name of user to login in read only mode\",\n },\n MINIVAULT_OPTION,\n MINIVAULT_URL_OPTION,\n API_GATEWAY_OPTION,\n];\n","export default [\n {\n name: \"lam\",\n alias: \"l\",\n defaultValue: \"https://localhost:8443/lam\",\n description: \"Target lam{grey (default: https://localhost:8443/lam)}\",\n type: String,\n },\n {\n name: \"lamAPIKey\",\n description: \"LAM API key\",\n type: String,\n },\n];\n","import createHSMBridge from \"@ledgerhq/vault-common/createHSMBridge\";\n\nimport getCertFromPFX from \"../getCertFromPFX\";\n\nexport type Options = {\n compartment: number;\n hsm: string;\n hsmCert: string;\n hsmCertPassword: string;\n};\n\nexport default {\n command: \"backupCompartment\",\n description: \"Backup HSM simu compartment\",\n help: [\n {\n content: \"{grey $} ledger-vault backupCompartment --cid 123\",\n },\n ],\n options: [\n {\n name: \"compartment\",\n alias: \"c\",\n type: Number,\n description: \"HSM compartment ID {blue $VAULT_COMPARTMENT_ID}\",\n defaultValue: process.env.VAULT_COMPARTMENT_ID,\n required: true,\n },\n {\n name: \"hsm\",\n type: String,\n description: \"HSM endpoint {blue $VAULT_HSM_ENDPOINT}\",\n defaultValue: process.env.VAULT_HSM_ENDPOINT,\n required: true,\n },\n {\n name: \"hsmCert\",\n type: String,\n description: \"Path to HSM certificate {blue $VAULT_HSM_CLIENT_CERT_PATH}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PATH,\n required: true,\n },\n {\n name: \"hsmCertPassword\",\n type: String,\n description: \"HSM certificate password {blue $VAULT_HSM_CLIENT_CERT_PWD}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PWD,\n required: true,\n },\n ],\n run: async (options: Options): Promise<void> => {\n if (!options.hsmCert) {\n throw new Error(\n \"You must specify the path to your HSM certificate in your environment variable VAULT_HSM_CLIENT_CERT_PATH or use the --hsmCert flag\",\n );\n }\n\n const cert = await getCertFromPFX(options.hsmCert, options.hsmCertPassword);\n\n const bridge = createHSMBridge({\n hsmCert: cert.cert,\n hsmCertKey: cert.key,\n hsmEndpoint: options.hsm,\n });\n\n const backup = await bridge.backupCompartment(options.compartment);\n\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(backup));\n },\n};\n","import fs from \"fs\";\nimport pem from \"pem\";\n\nexport type Cert = {\n cert: Buffer;\n key: Buffer;\n};\n\nasync function pemReady() {\n // we don't have a way to know if `openssl` has been properly called by `pem`\n // package. let's assume waiting 500ms is enough\n await new Promise((r) => setTimeout(r, 500));\n}\n\nexport default async function getCertFromPFX(pfxPath: string, passphrase: string): Promise<Cert> {\n // `pem` package is asynchronously checking openssl OS version at start\n // to assign proper flags when needed (e.g: '-legacy')\n await pemReady();\n\n const cert: Cert = await new Promise((resolve, reject) => {\n // VG-11534 this motherfucker `pem` package is outputting on stdout if process.env.CI === 'true'\n // -> see https://github.com/Dexus/pem/blob/71dae3346801dafb5a8bcebcd4c7267fd182666f/lib/debug.js#L2-L6\n const envCIBefore = process.env[\"CI\"];\n delete process.env[\"CI\"];\n pem.readPkcs12(fs.readFileSync(pfxPath), { p12Password: passphrase }, (err, cert) => {\n process.env[\"CI\"] = envCIBefore;\n if (err) {\n return reject(err);\n }\n resolve({\n cert: Buffer.from(cert.cert),\n key: Buffer.from(cert.key),\n });\n });\n });\n\n return cert;\n}\n","import { bakeManifest, createDevicesPool, validateManifest } from \"@ledgerhq/vault-common\";\nimport { Manifest } from \"@ledgerhq/vault-common/types\";\nimport chalk from \"chalk\";\nimport fs from \"fs\";\nimport readline from \"readline\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport logger from \"../logger\";\nimport MANIFEST_BEATLES from \"../manifests/beatles.json\";\nimport MANIFEST_EMPTY from \"../manifests/empty.json\";\nimport MANIFEST_ERC20 from \"../manifests/erc20.json\";\nimport PRESET_MESSAGE_SIGNING from \"../manifests/message-signing.json\";\nimport MANIFEST_MOBILE from \"../manifests/mobile.json\";\nimport MANIFEST_POLKADOT_STAKING from \"../manifests/polkadot-staking.json\";\nimport MANIFEST_POLKADOT from \"../manifests/polkadot.json\";\nimport MANIFEST_RAW from \"../manifests/rawsigning.json\";\nimport MANIFEST_RIPPLE from \"../manifests/ripple.json\";\nimport MANIFEST_SCI from \"../manifests/sci.json\";\nimport MANIFEST_SOLANA_DEV from \"../manifests/solana-dev.json\";\nimport MANIFEST_SOLANA_STAKING from \"../manifests/solana-staking.json\";\nimport MANIFEST_SOLANA from \"../manifests/solana.json\";\nimport MANIFEST_STELLAR from \"../manifests/stellar.json\";\nimport MANIFEST_TEZOS from \"../manifests/tezos.json\";\nimport MANIFEST_TRADELINK_HSM from \"../manifests/tradelink-hsm.json\";\nimport MANIFEST_TRADELINK from \"../manifests/tradelink.json\";\nimport { TWO_STEPS_REQUEST_OPTION, TwoStepsRequestOption } from \"../miscOptions\";\nimport {\n OptionalRevaultOnboardingOptions,\n REVAULT_ONBOARDING_OPTIONS,\n extractRevaultOnboardingOptions,\n} from \"../revault-compat\";\nimport { GateOptions } from \"../types\";\nimport { wipe, wipeOptions } from \"./wipe\";\n\nconst MANIFESTS: Record<string, Manifest> = {\n empty: MANIFEST_EMPTY,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n beatles: MANIFEST_BEATLES,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n sci: MANIFEST_SCI,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n erc20: MANIFEST_ERC20,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n tezos: MANIFEST_TEZOS,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n polkadot: MANIFEST_POLKADOT,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n \"polkadot-staking\": MANIFEST_POLKADOT_STAKING,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n solana: MANIFEST_SOLANA,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n \"solana-staking\": MANIFEST_SOLANA_STAKING,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n \"solana-dev\": MANIFEST_SOLANA_DEV,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n stellar: MANIFEST_STELLAR,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n tradelink: MANIFEST_TRADELINK,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n \"tradelink-hsm\": MANIFEST_TRADELINK_HSM,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n ripple: MANIFEST_RIPPLE,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n rawsigning: MANIFEST_RAW,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n \"message-signing\": PRESET_MESSAGE_SIGNING,\n // @ts-ignore (type string is not assignable to type MULTI_AUTHORIZATIONS etc.)\n mobile: MANIFEST_MOBILE,\n};\n\nexport type BakeOptions = GateOptions &\n TwoStepsRequestOption &\n OptionalRevaultOnboardingOptions & {\n positionals?: string[];\n manifest?: string;\n stdin: boolean; // workaround until we figure out the bug when the script is run from another script\n\n retry: number;\n\n // wipe options\n wipe: boolean;\n compartment: number;\n hsm: string;\n hsmCert: string;\n hsmCertPassword: string;\n };\n\nexport default {\n command: \"bake\",\n description: \"Put the Vault in a predefined state\",\n help: [\n {\n header: \"Usage\",\n content: [\n \"{grey $} ledger-vault bake {grey <builtin-manifest>} [options]\",\n \"{grey $} ledger-vault bake {grey <path/to/manifest.json>} [options]\",\n ],\n },\n {\n header: \"Built-in manifests\",\n content: Object.keys(MANIFESTS)\n .sort()\n .map((p) => `{yellow ${p}}`)\n .join(\", \"),\n },\n ],\n allowNoPositional: true,\n positionals: true,\n options: [\n {\n name: \"manifest\",\n alias: \"m\",\n description: \"{yellow Deprecated}: use the positional argument instead\",\n type: String,\n },\n ...REVAULT_ONBOARDING_OPTIONS,\n {\n name: \"retry\",\n description: \"How many times bake should be retried on error {grey (default: 0)}\",\n type: Number,\n defaultValue: 0,\n },\n TWO_STEPS_REQUEST_OPTION,\n ...cliOptions,\n ...gateOptions,\n ...lamOptions,\n {\n name: \"stdin\",\n description: \"allow reading stdin\",\n type: Boolean,\n defaultValue: false,\n },\n {\n name: \"wipe\",\n alias: \"w\",\n description: \"Wipe backend before baking\",\n type: Boolean,\n defaultValue: false,\n },\n ...wipeOptions,\n ],\n run: async (options: BakeOptions): Promise<void> => {\n const { retry: retryCount, twoStepsRequest } = options;\n const stdin = await readSTDIN(options);\n\n if (\n !(options.positionals && options.positionals.length) &&\n !options.manifest &&\n !options.stdin &&\n !stdin\n ) {\n throw new Error(\n `You must either choose a manifest, pass a JSON manifest in stdin or pass a manifest file path`,\n );\n }\n\n if (options.positionals && options.positionals.length > 1) {\n throw new Error(\"You can pass only one manifest file\");\n }\n\n if (options.manifest) {\n logger.info(\n chalk`Option {yellow --manifest} is deprecated. Please pass it as a {yellow positional} argument.`,\n );\n if (options.positionals && options.positionals.length) {\n throw new Error(\n \"You can't specify a positional argument and the --manifest option at the same time\",\n );\n }\n }\n\n let manifestName =\n (options.positionals && options.positionals[0]) || options.manifest || undefined;\n\n switch (manifestName) {\n case \"beatles-legacy\": {\n logger.info(\n chalk`Manifest {yellow beatles-legacy} is not existing anymore. Fallback to manifest {yellow beatles}.`,\n );\n manifestName = \"beatles\";\n break;\n }\n case undefined: {\n if (!stdin) {\n throw new Error(`No manifest provided`);\n }\n }\n }\n\n if (options.wipe) {\n await wipe(options);\n }\n\n let manifest;\n\n if (stdin) {\n manifest = JSON.parse(stdin);\n } else if (manifestName && fs.existsSync(manifestName)) {\n try {\n manifest = JSON.parse(fs.readFileSync(manifestName, \"utf-8\"));\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`Invalid manifest ${manifestName}`);\n } else {\n throw error;\n }\n }\n } else if (manifestName && manifestName in MANIFESTS) {\n manifest = MANIFESTS[manifestName];\n } else {\n throw new Error(`The manifest ${manifestName} does not exists`);\n }\n\n validateManifest(manifest);\n\n const pool = createDevicesPool({\n ...options,\n lamURL: options.lam,\n deviceAPIURL: options.deviceAPI,\n networkDelay: options.networkDelay,\n });\n\n for (let i = 0; i <= retryCount; i++) {\n try {\n await bakeManifest(manifest, pool, {\n logger,\n twoStepsRequest,\n revaultOnboarding: await extractRevaultOnboardingOptions(options),\n });\n break;\n } catch (err) /* istanbul ignore next */ {\n // @ts-expect-error\n logger.error(err.toString());\n if (i < retryCount) {\n logger.info(\n `An error occurred during bake, trying again in 5 seconds... (${\n retryCount - i\n } attempts left)`,\n );\n await new Promise((r) => setTimeout(r, 5e3));\n } else {\n throw err;\n }\n }\n }\n },\n};\n\nconst readSTDIN = async (options: BakeOptions) => {\n if (!options.stdin) {\n return Promise.resolve(null);\n }\n const rl = readline.createInterface({\n input: process.stdin,\n terminal: false,\n });\n const stdInLines = [];\n // for await let us avoid the callback syntax\n // otherwise we would have to run all the rest of the code in a\n // rl.on('close', fn) callback\n for await (const line of rl) {\n stdInLines.push(line);\n }\n return stdInLines.join(\"\");\n};\n","{\n \"customUsernames\": {\n \"10\": \"John Lennon\",\n \"11\": \"Paul McCartney\",\n \"12\": \"George Harrison\",\n \"13\": \"Ringo Starr\"\n },\n \"users\": {\n \"operators\": [10, 11, 12, 13]\n },\n \"groups\": [{ \"name\": \"Beatles\", \"users\": [10, 11, 12, 13] }],\n \"whitelists\": [\n {\n \"name\": \"White Album\",\n \"addresses\": [\n {\n \"address\": \"mmizX66rU546AD6A5BBd7qKoyBKBwJWD4h\",\n \"currency\": \"bitcoin_testnet\"\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"BTC Testnet 1\",\n \"currency\": \"bitcoin_testnet\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Beatles\" }]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"White Album\"]\n },\n {\n \"type\": \"THRESHOLD\",\n \"min\": 0,\n \"max\": 100\n }\n ]\n ]\n }\n ]\n}\n","{}\n","{\n \"users\": {\n \"operators\": [10]\n },\n \"accounts\": [\n {\n \"name\": \"Ethereum 1\",\n \"currency\": \"ethereum\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"users\": [10] }]\n }\n ]\n ]\n },\n {\n \"name\": \"Yee Token 1\",\n \"contractAddress\": \"0x922105fAd8153F516bCfB829f56DC097a0E1D705\",\n \"parentAccount\": \"Ethereum 1\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"users\": [10] }]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"operators\": [10]\n },\n \"accounts\": [\n {\n \"name\": \"ETH 1\",\n \"currency\": \"ethereum\",\n \"rules\": [\n [\n {\n \"type\": \"MESSAGE_SIGNING\"\n },\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"users\": [10] }]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": false\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"users\": [10] }]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": true\n }\n ]\n ]\n }\n ]\n}\n","{\n \"customUsernames\": {\n \"10\": \"John Lennon\",\n \"11\": \"Paul McCartney\",\n \"12\": \"George Harrison\",\n \"13\": \"Ringo Starr\"\n },\n \"users\": {\n \"operators\": [10, 11, 12, 13]\n },\n \"accounts\": [\n {\n \"name\": \"BTC Testnet 1\",\n \"currency\": \"bitcoin_testnet\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 2, \"users\": [11, 12, 13] }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Sepolia\",\n \"currency\": \"ethereum_sepolia\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 2, \"users\": [11, 12, 13] }\n ]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"operators\": [10, 11]\n },\n \"accounts\": [\n {\n \"name\": \"Polkadot 1\",\n \"currency\": \"polkadot\",\n \"rules\": [\n [\n {\n \"type\": \"POLKADOT_STAKING\"\n },\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10, 11]\n }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Polkadot Westend 1\",\n \"currency\": \"westend\",\n \"rules\": [\n [\n {\n \"type\": \"POLKADOT_STAKING\"\n },\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10, 11]\n }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Polkadot Westend 2\",\n \"currency\": \"westend\",\n \"rules\": [\n [\n {\n \"type\": \"POLKADOT_STAKING\"\n },\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10, 11]\n }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Polkadot Westend 3\",\n \"currency\": \"westend\",\n \"rules\": [\n [\n {\n \"type\": \"POLKADOT_STAKING\"\n },\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10, 11]\n }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Polkadot Westend 4\",\n \"currency\": \"westend\",\n \"rules\": [\n [\n {\n \"type\": \"POLKADOT_STAKING\"\n },\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10, 11]\n }\n ]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"operators\": [10, 11]\n },\n \"accounts\": [\n {\n \"name\": \"Polkadot 1\",\n \"currency\": \"polkadot\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Polkadot Westend 1\",\n \"currency\": \"westend\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"operators\": [10, 11]\n },\n \"accounts\": [\n {\n \"name\": \"Cosmos\",\n \"currency\": \"cosmos\",\n \"accountType\": \"Cosmos\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10]\n }\n ]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10, 11]\n }\n ]\n },\n {\n \"type\": \"RAW_SIGNING\"\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"operators\": [10, 11]\n },\n \"accounts\": [\n {\n \"name\": \"Ripple 1\",\n \"currency\": \"ripple\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Ripple 2\",\n \"currency\": \"ripple\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"customUsernames\": {\n \"10\": \"John\",\n \"11\": \"Paul\",\n \"12\": \"George\",\n \"13\": \"Ringo\"\n },\n \"users\": {\n \"operators\": [10, 11, 12, 13]\n },\n \"groups\": [{ \"name\": \"Beatles\", \"users\": [10, 11, 12, 13] }],\n \"accounts\": [\n {\n \"name\": \"ETH 1\",\n \"currency\": \"ethereum\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10]\n },\n {\n \"quorum\": 1,\n \"users\": [11]\n }\n ]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": false\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [12]\n },\n {\n \"quorum\": 1,\n \"users\": [13]\n }\n ]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": true\n }\n ]\n ]\n },\n {\n \"name\": \"ETH 2\",\n \"currency\": \"ethereum\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10]\n },\n {\n \"quorum\": 1,\n \"users\": [11]\n }\n ]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": true\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Beatles\"\n },\n {\n \"quorum\": 1,\n \"group\": \"Beatles\"\n }\n ]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": false\n }\n ]\n ]\n },\n {\n \"name\": \"ETH Goerli 1\",\n \"currency\": \"ethereum_goerli\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Beatles\"\n },\n {\n \"quorum\": 1,\n \"group\": \"Beatles\"\n }\n ]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": true\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Beatles\"\n },\n {\n \"quorum\": 1,\n \"group\": \"Beatles\"\n }\n ]\n },\n {\n \"type\": \"SMART_CONTRACT_INTERACTION\",\n \"enabled\": false\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": { \"operators\": [10, 11] },\n \"groups\": [{ \"name\": \"Users\", \"users\": [10, 11] }],\n \"accounts\": [\n {\n \"name\": \"Solana 1\",\n \"currency\": \"solana\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n },\n { \"type\": \"SOLANA_STAKING\" }\n ]\n ]\n },\n {\n \"name\": \"Solana 2\",\n \"currency\": \"solana\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ]\n ]\n },\n {\n \"name\": \"Solana Testnet 1\",\n \"currency\": \"solana_testnet\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n },\n { \"type\": \"SOLANA_STAKING\" }\n ]\n ]\n },\n {\n \"name\": \"Solana Testnet 2\",\n \"currency\": \"solana_testnet\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ]\n ]\n },\n {\n \"name\": \"Solana Devnet 1\",\n \"currency\": \"solana_devnet\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n },\n { \"type\": \"SOLANA_STAKING\" }\n ]\n ]\n },\n {\n \"name\": \"Solana Devnet 2\",\n \"currency\": \"solana_devnet\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": { \"operators\": [10, 11] },\n \"groups\": [{ \"name\": \"Users\", \"users\": [10, 11] }],\n \"accounts\": [\n {\n \"name\": \"Solana 1\",\n \"currency\": \"solana\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n },\n { \"type\": \"SOLANA_STAKING\" }\n ]\n ]\n },\n {\n \"name\": \"Solana 2\",\n \"currency\": \"solana\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n },\n { \"type\": \"SOLANA_STAKING\" }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": { \"operators\": [10, 11] },\n \"groups\": [{ \"name\": \"Users\", \"users\": [10, 11] }],\n \"accounts\": [\n {\n \"name\": \"Solana 1\",\n \"currency\": \"solana\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ]\n ]\n },\n {\n \"name\": \"Solana 2\",\n \"currency\": \"solana\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [{ \"quorum\": 1, \"group\": \"Users\" }]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"operators\": [10, 11]\n },\n \"accounts\": [\n {\n \"name\": \"Stellar 1\",\n \"currency\": \"stellar\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Stellar 2\",\n \"currency\": \"stellar\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"operators\": [10, 11]\n },\n \"accounts\": [\n {\n \"name\": \"Tezos #0\",\n \"currency\": \"tezos\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ]\n ]\n },\n {\n \"name\": \"Tezos #1\",\n \"currency\": \"tezos\",\n \"rules\": [\n [\n {\n \"type\": \"TEZOS_DELEGATION\"\n },\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n { \"quorum\": 1, \"users\": [10] },\n { \"quorum\": 1, \"users\": [11] }\n ]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"users\": [10, 11]\n }\n ]\n }\n ]\n ]\n }\n ]\n}\n","{\n \"users\": {\n \"apiV2\": [\n {\n \"name\": \"Hedy OneOf 10\"\n },\n {\n \"name\": \"Joan Oneof 11\"\n },\n {\n \"name\": \"Grace Bybit 12\"\n },\n {\n \"name\": \"Mileva CC 13\"\n },\n {\n \"name\": \"Adi CC 14\"\n },\n {\n \"name\": \"David Winterm 15\"\n },\n {\n \"name\": \"Clause Comply 16\"\n }\n ],\n \"operators\": [10, 11, 12, 13, 14]\n },\n \"customUsernames\": {\n \"10\": \"AM guy\",\n \"11\": \"CC guy\",\n \"12\": \"Bybit guy\",\n \"13\": \"Wintermute guy\",\n \"14\": \"Komainu guy\"\n },\n \"groups\": [\n {\n \"name\": \"My Compliance Team\",\n \"description\": \"\",\n \"users\": [\"Clause Comply 16\", 14]\n },\n {\n \"name\": \"Group Wintermute\",\n \"description\": \"\",\n \"users\": [\"David Winterm 15\", 13]\n },\n {\n \"name\": \"Group Crypto.com\",\n \"description\": \"\",\n \"users\": [\"Mileva CC 13\", \"Adi CC 14\", 11]\n },\n {\n \"name\": \"Group Bybit\",\n \"description\": \"\",\n \"users\": [\"Grace Bybit 12\", 12]\n },\n {\n \"name\": \"Group OneOf\",\n \"description\": \"\",\n \"users\": [\"Hedy OneOf 10\", \"Joan Oneof 11\", 10]\n }\n ],\n \"whitelists\": [\n {\n \"name\": \"all exchanges\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"wintermute btc\",\n \"address\": \"tb1q7893kjx6gemqh4jpg5kld5r0qadmemu9kt6jxg\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"bybit btc\",\n \"address\": \"tb1qa87hqcqhec3g7dv03gncherlpvfh6wwt8nevnu\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"crypto.com btc\",\n \"address\": \"tb1q2nkfr9va8gr9gyryg0pr9v3vfknx9kjth637za\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"wintermute sepolia\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum_sepolia\"\n },\n {\n \"name\": \"bybit sepolia\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_sepolia\"\n },\n {\n \"name\": \"crypto.com sepolia\",\n \"address\": \"0xfc2aFF9c8623fc4B1928a818C405F5271cBaBe17\",\n \"currency\": \"ethereum_sepolia\"\n },\n {\n \"name\": \"crypto.com holesky\",\n \"address\": \"0xfc2aFF9c8623fc4B1928a818C405F5271cBaBe17\",\n \"currency\": \"ethereum_holesky\"\n }\n ]\n },\n {\n \"name\": \"wintermute addresses\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"wintermute btc\",\n \"address\": \"tb1q7893kjx6gemqh4jpg5kld5r0qadmemu9kt6jxg\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"wintermute sepolia\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum_sepolia\"\n },\n {\n \"name\": \"wintermute holesky\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum_holesky\"\n }\n ]\n },\n {\n \"name\": \"bybit addresses\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"bybit btc\",\n \"address\": \"tb1qa87hqcqhec3g7dv03gncherlpvfh6wwt8nevnu\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"bybit sepolia\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_sepolia\"\n },\n {\n \"name\": \"bybit holes\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_holesky\"\n }\n ]\n },\n {\n \"name\": \"crypto.com addresses\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"crypto.com btc\",\n \"address\": \"tb1q2nkfr9va8gr9gyryg0pr9v3vfknx9kjth637za\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"crypto.com sepolia\",\n \"address\": \"0xfc2aFF9c8623fc4B1928a818C405F5271cBaBe17\",\n \"currency\": \"ethereum_sepolia\"\n },\n {\n \"name\": \"crypto.com holesky\",\n \"address\": \"0xfc2aFF9c8623fc4B1928a818C405F5271cBaBe17\",\n \"currency\": \"ethereum_holesky\"\n }\n ]\n },\n {\n \"name\": \"Oneof whitelist\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"oneof btc\",\n \"address\": \"tb1q645fc9qjq4h9779ph2f2ade5mpqprhr2k68mtj\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"oneof sepolia\",\n \"address\": \"0x85587bD30240A98662a4cFc9de87BB0a2fA90CFf\",\n \"currency\": \"ethereum_sepolia\"\n },\n {\n \"name\": \"oneof holesky\",\n \"address\": \"0x85587bD30240A98662a4cFc9de87BB0a2fA90CFf\",\n \"currency\": \"ethereum_holesky\"\n }\n ]\n }\n ],\n \"tradelink\": {\n \"onboarded\": true,\n \"exchanges\": [\n {\n \"id\": \"dfc82b8c-7674-4355-8180-8ecbbb55dc5d\",\n \"name\": \"Crypto.com\",\n \"code\": \"CCc\",\n \"logoUrl\": \"https://i.imgur.com/Di1SzqF.png\",\n \"group\": \"Group Crypto.com\",\n \"whitelist\": \"crypto.com addresses\"\n },\n {\n \"id\": \"19360626-292a-4dd0-b76b-8e6aa13a5af2\",\n \"name\": \"ByBit\",\n \"code\": \"BBt\",\n \"logoUrl\": \"https://i.imgur.com/LZq4CCA.png\",\n \"group\": \"Group Bybit\",\n \"whitelist\": \"bybit addresses\"\n },\n {\n \"id\": \"efcbc2d7-3c5b-428c-b3e1-e2984b66ea5a\",\n \"name\": \"Wintermute\",\n \"code\": \"WMt\",\n \"logoUrl\": \"https://i.imgur.com/k81ehFP.png\",\n \"group\": \"Group Wintermute\",\n \"whitelist\": \"wintermute addresses\"\n }\n ],\n \"assetManagers\": [\n {\n \"id\": \"b81fd631-dbee-4aff-93ce-e6acf1ed994e\",\n \"name\": \"OneOf\",\n \"logoUrl\": \"https://i.imgur.com/AhF6Hap.png\",\n \"code\": \"OOF\",\n \"group\": \"Group OneOf\",\n \"whitelist\": \"Oneof whitelist\"\n }\n ],\n \"custodians\": [\n {\n \"id\": \"b2015189-0657-4e6d-89ba-fae58300f54b\",\n \"name\": \"Komainu\",\n \"logoUrl\": \"https://i.imgur.com/TOZh7Fm.png\",\n \"code\": \"KOM\",\n \"group\": \"My Compliance Team\",\n \"whitelist\": \"all exchanges\"\n }\n ]\n },\n \"accounts\": [\n {\n \"name\": \"TL-0001-ETH-OOF-KOM\",\n \"currency\": \"ethereum_sepolia\",\n \"tradelink_data\": {\n \"currency\": \"ethereum_sepolia\",\n \"custodian\": {\n \"id\": \"b2015189-0657-4e6d-89ba-fae58300f54b\",\n \"approver_group_id\": 1,\n \"whitelist_id\": 1,\n \"role\": \"CUSTODIAN\",\n \"name\": \"Komainu\",\n \"logo_url\": \"https://i.imgur.com/TOZh7Fm.png\",\n \"code\": \"KOM\"\n },\n \"exchanges\": [\n {\n \"id\": 1,\n \"approver_group_id\": 3,\n \"whitelist_id\": 4,\n \"name\": \"Crypto.com\",\n \"role\": \"EXCHANGE\",\n \"logo_url\": \"https://i.imgur.com/Di1SzqF.png\",\n \"code\": \"CCc\",\n \"requires_pre_approval\": true\n },\n {\n \"id\": 2,\n \"approver_group_id\": 4,\n \"whitelist_id\": 3,\n \"name\": \"ByBit\",\n \"role\": \"EXCHANGE\",\n \"logo_url\": \"https://i.imgur.com/LZq4CCA.png\",\n \"code\": \"BBt\",\n \"requires_pre_approval\": true\n },\n {\n \"id\": 3,\n \"approver_group_id\": 2,\n \"whitelist_id\": 2,\n \"name\": \"Wintermute\",\n \"role\": \"EXCHANGE\",\n \"logo_url\": \"https://i.imgur.com/k81ehFP.png\",\n \"code\": \"WIT\",\n \"requires_pre_approval\": true\n }\n ],\n \"asset_manager\": {\n \"id\": 1,\n \"approver_group_id\": 5,\n \"whitelist_id\": 5,\n \"name\": \"OneOf\",\n \"role\": \"ASSET_MANAGER\",\n \"logo_url\": \"https://i.imgur.com/AhF6Hap.png\",\n \"code\": \"OOF\"\n }\n },\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group Crypto.com\"\n },\n {\n \"quorum\": 1,\n \"group\": \"Group OneOf\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"crypto.com addresses\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group Bybit\"\n },\n {\n \"quorum\": 1,\n \"group\": \"Group OneOf\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"bybit addresses\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group Wintermute\"\n },\n {\n \"quorum\": 1,\n \"group\": \"Group OneOf\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"wintermute addresses\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group OneOf\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"Oneof whitelist\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"crypto.com addresses\", \"bybit addresses\", \"wintermute addresses\"]\n }\n ]\n ]\n }\n ],\n \"contractApprovals\": [\n {\n \"user\": 10,\n \"contractNames\": [\"TRADELINK\"]\n },\n {\n \"user\": 11,\n \"contractNames\": [\"TRADELINK\"]\n },\n {\n \"user\": 12,\n \"contractNames\": [\"TRADELINK\"]\n },\n {\n \"user\": 13,\n \"contractNames\": [\"TRADELINK\"]\n },\n {\n \"user\": 14,\n \"contractNames\": [\"TRADELINK\"]\n }\n ]\n}\n","{\n \"users\": {\n \"apiV2\": [\n {\n \"name\": \"Hedy OneOf 10\"\n },\n {\n \"name\": \"Joan Oneof 11\"\n },\n {\n \"name\": \"Grace Bybit 12\"\n },\n {\n \"name\": \"Mileva CC 13\"\n },\n {\n \"name\": \"Adi CC 14\"\n },\n {\n \"name\": \"David Winterm 15\"\n },\n {\n \"name\": \"Clause Comply 16\"\n }\n ],\n \"operators\": [10, 11]\n },\n \"customUsernames\": {\n \"10\": \"Toni Henson\",\n \"11\": \"Damon Reagan\"\n },\n \"groups\": [\n {\n \"name\": \"My Compliance Team\",\n \"description\": \"\",\n \"users\": [\"Clause Comply 16\", 11]\n },\n {\n \"name\": \"Group Wintermute\",\n \"description\": \"\",\n \"users\": [\"David Winterm 15\"]\n },\n {\n \"name\": \"Group Crypto.com\",\n \"description\": \"\",\n \"users\": [\"Mileva CC 13\", \"Adi CC 14\"]\n },\n {\n \"name\": \"Group Bybit\",\n \"description\": \"\",\n \"users\": [\"Grace Bybit 12\"]\n },\n {\n \"name\": \"Group OneOf\",\n \"description\": \"\",\n \"users\": [\"Hedy OneOf 10\", \"Joan Oneof 11\", 10]\n }\n ],\n \"whitelists\": [\n {\n \"name\": \"all exchanges\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"Kraken n1\",\n \"address\": \"tb1q7893kjx6gemqh4jpg5kld5r0qadmemu9kt6jxg\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"Binance n0\",\n \"address\": \"tb1qa87hqcqhec3g7dv03gncherlpvfh6wwt8nevnu\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"ETH classic\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum\"\n },\n {\n \"name\": \"ETH sepopo\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_sepolia\"\n }\n ]\n },\n {\n \"name\": \"wintermute addresses\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"Kraken n1\",\n \"address\": \"tb1q7893kjx6gemqh4jpg5kld5r0qadmemu9kt6jxg\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"Binance n0\",\n \"address\": \"tb1qa87hqcqhec3g7dv03gncherlpvfh6wwt8nevnu\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"ETH classic\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum\"\n },\n {\n \"name\": \"ETH sepopo\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_sepolia\"\n }\n ]\n },\n {\n \"name\": \"bybit addresses\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"Kraken n1\",\n \"address\": \"tb1q7893kjx6gemqh4jpg5kld5r0qadmemu9kt6jxg\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"Binance n0\",\n \"address\": \"tb1qa87hqcqhec3g7dv03gncherlpvfh6wwt8nevnu\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"ETH classic\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum\"\n },\n {\n \"name\": \"ETH sepopo\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_sepolia\"\n }\n ]\n },\n {\n \"name\": \"crypto.com addresses\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"BTC Reserves n1\",\n \"address\": \"tb1q7893kjx6gemqh4jpg5kld5r0qadmemu9kt6jxg\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"BTC Liquidity n0\",\n \"address\": \"tb1qa87hqcqhec3g7dv03gncherlpvfh6wwt8nevnu\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"ETH classic\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum\"\n },\n {\n \"name\": \"ETH sepopo\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_sepolia\"\n }\n ]\n },\n {\n \"name\": \"Oneof whitelist\",\n \"description\": \"\",\n \"type\": \"TRANSACTION\",\n \"addresses\": [\n {\n \"name\": \"bitcoin_testnet-1\",\n \"address\": \"tb1q645fc9qjq4h9779ph2f2ade5mpqprhr2k68mtj\",\n \"currency\": \"bitcoin_testnet\"\n },\n {\n \"name\": \"ETH classic\",\n \"address\": \"0x9FA6A7d3f30c20e4159057f8DdDB67Da0F30DeB3\",\n \"currency\": \"ethereum\"\n },\n {\n \"name\": \"ETH sepopo\",\n \"address\": \"0xb550388547691a526190d60C30C2f9E2af03fF3D\",\n \"currency\": \"ethereum_sepolia\"\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"TL-0001-ETH-OOF-KOM\",\n \"currency\": \"ethereum_sepolia\",\n \"tradelink_data\": {\n \"currency\": \"ethereum_sepolia\",\n \"exchanges\": [\n {\n \"id\": 1,\n \"approver_group_id\": 3,\n \"whitelist_id\": 4,\n \"name\": \"Crypto.com\",\n \"role\": \"EXCHANGE\",\n \"logo_url\": \"https://static.intercomassets.com/avatars/5265558/square_128/Logo-1636463979.jpg\",\n \"code\": \"CCc\",\n \"requires_pre_approval\": true\n },\n {\n \"id\": 2,\n \"approver_group_id\": 4,\n \"whitelist_id\": 3,\n \"name\": \"ByBit\",\n \"role\": \"EXCHANGE\",\n \"logo_url\": \"https://seeklogo.com/images/B/bybit-logo-4C31FD6A08-seeklogo.com.png\",\n \"code\": \"BBt\",\n \"requires_pre_approval\": true\n },\n {\n \"id\": 3,\n \"approver_group_id\": 2,\n \"whitelist_id\": 2,\n \"name\": \"Wintermute\",\n \"role\": \"EXCHANGE\",\n \"logo_url\": \"https://pbs.twimg.com/profile_images/1731739745997234176/wBqS9X5A_400x400.jpg\",\n \"code\": \"WIT\",\n \"requires_pre_approval\": true\n }\n ],\n \"asset_manager\": {\n \"id\": 1,\n \"approver_group_id\": 5,\n \"whitelist_id\": 5,\n \"name\": \"OneOf\",\n \"role\": \"ASSET_MANAGER\",\n \"logo_url\": \"https://pbs.twimg.com/profile_images/1623734503603593219/kJWLMu2O_400x400.jpg\",\n \"code\": \"OOF\"\n },\n \"custodian\": {\n \"id\": 1,\n \"approver_group_id\": 1,\n \"whitelist_id\": 1,\n \"role\": \"CUSTODIAN\",\n \"name\": \"Komainu\",\n \"logo_url\": \"https://pbs.twimg.com/profile_images/1412795738539581447/WoWVR9-f_400x400.png\",\n \"code\": \"KOM\"\n }\n },\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group Crypto.com\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"crypto.com addresses\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group Bybit\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"bybit addresses\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group Wintermute\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"wintermute addresses\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"Group OneOf\"\n },\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"Oneof whitelist\"]\n }\n ],\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n },\n {\n \"type\": \"WHITELIST\",\n \"whitelists\": [\"all exchanges\"]\n }\n ]\n ]\n },\n {\n \"name\": \"bitcoin\",\n \"currency\": \"bitcoin_testnet\",\n \"derivationMode\": \"NATIVE_SEGWIT\",\n \"rules\": [\n [\n {\n \"type\": \"MULTI_AUTHORIZATIONS\",\n \"steps\": [\n {\n \"quorum\": 1,\n \"group\": \"My Compliance Team\"\n }\n ]\n }\n ]\n ]\n }\n ]\n}\n","export type TwoStepsRequestOption = {\n twoStepsRequest?: boolean;\n};\n\nexport const TWO_STEPS_REQUEST_OPTION = {\n name: \"twoStepsRequest\",\n description: \"Enable two-steps request (request creation resilient to timeouts, see VG-12436)\",\n type: Boolean,\n};\n\nexport type FormatOption = {\n format: \"table\" | \"json\";\n};\n\nexport const FORMAT_OPTION = {\n name: \"format\",\n alias: \"f\",\n type: String,\n typeLabel: \"json\",\n description: \"Output format {grey (available: table, json)}\",\n defaultValue: \"table\",\n};\n","import { BakeManifestOptions } from \"@ledgerhq/vault-common\";\nimport get from \"lodash/get\";\n\ntype RevaultOnboardingOptions = BakeManifestOptions[\"revaultOnboarding\"];\n\nexport type OptionalRevaultOnboardingOptions = Partial<RevaultOnboardingOptions> & {\n minivaultURL?: string;\n gate?: string;\n};\n\nexport const REVAULT_ONBOARDING_OPTIONS = [\n {\n name: \"compartmentId\",\n type: Number,\n description: \"{black.bgGreen.bold NEW } The compartment ID to use for the onboarding\",\n },\n {\n name: \"hsmScriptsVersion\",\n type: String,\n description:\n \"{black.bgGreen.bold NEW } The version of the HSM scripts to use for the onboarding\",\n },\n {\n name: \"revaultRootAuthToken\",\n type: String,\n description: \"{black.bgGreen.bold NEW } The revault root auth token to use to init onboarding\",\n },\n {\n name: \"revaultApiUrl\",\n type: String,\n description: \"{black.bgGreen.bold NEW } The target revault API URL to use for the onboarding\",\n },\n];\n\n/* istanbul ignore next */\nfunction extractMinivaultUrlFromGate(gate: string): string | undefined {\n const match = gate.match(/(https?:\\/\\/[^.]+\\.minivault\\.[^/]*)\\//);\n if (match) {\n return match[1];\n }\n}\n\n/* istanbul ignore next */\nfunction getInstanceNameFromMinivaultUrl(minivaultUrl: string): string {\n const match = minivaultUrl.match(/https?:\\/\\/([^.]+)\\.minivault\\..*/);\n const instanceName = match && match[1];\n if (!instanceName) {\n throw new Error(`Could not extract instance name from minivault URL: ${minivaultUrl}`);\n }\n return instanceName;\n}\n\nexport /* istanbul ignore next */ async function extractRevaultOnboardingOptions(\n maybeOptions: OptionalRevaultOnboardingOptions,\n): Promise<RevaultOnboardingOptions | undefined> {\n let compartmentId = maybeOptions.compartmentId;\n let revaultRootAuthToken = maybeOptions.revaultRootAuthToken;\n let revaultApiUrl = maybeOptions.revaultApiUrl;\n let hsmScriptsVersion = maybeOptions.hsmScriptsVersion;\n\n // if any of the info is missing, let's try to see if we are in a minivault context\n if (\n compartmentId === undefined ||\n revaultRootAuthToken === undefined ||\n revaultApiUrl === undefined ||\n hsmScriptsVersion === undefined\n ) {\n let minivaultURL = maybeOptions.minivaultURL;\n const gate = maybeOptions.gate;\n if (minivaultURL === undefined && gate !== undefined) {\n minivaultURL = extractMinivaultUrlFromGate(gate);\n }\n\n // super hacky way to try to guess the infos through vault-remote (for retro-compat)\n if (minivaultURL !== undefined) {\n const remoteUrl = minivaultURL.replace(/https:\\/\\/[^.]+/, \"https://remote\");\n const instanceName = getInstanceNameFromMinivaultUrl(minivaultURL);\n\n // @ts-expect-error for some reason it doesn't know the native fetch\n const instanceValuesResponse = await fetch(`${remoteUrl}/api/instances/${instanceName}`);\n const instanceValues = await instanceValuesResponse.json();\n\n compartmentId =\n compartmentId ?? (get(instanceValues, \"values.hsm.compartmentID\") as number | undefined);\n hsmScriptsVersion =\n hsmScriptsVersion ??\n (get(instanceValues, \"values.gate.hsmScriptsVersion\") as string | undefined);\n revaultApiUrl = revaultApiUrl ?? `${minivaultURL}/api`;\n revaultRootAuthToken = revaultRootAuthToken ?? \"root-auth-token\";\n }\n }\n\n if (\n compartmentId !== undefined &&\n revaultApiUrl !== undefined &&\n revaultRootAuthToken !== undefined &&\n hsmScriptsVersion !== undefined\n ) {\n return { compartmentId, hsmScriptsVersion, revaultApiUrl, revaultRootAuthToken };\n }\n}\n","import { WipeOptions, wipeBackend } from \"@ledgerhq/vault-common\";\n\nimport { GATE_OPTION, MINIVAULT_OPTION } from \"../gateOptions\";\nimport getCertFromPFX from \"../getCertFromPFX\";\nimport lamOptions from \"../lamOptions\";\nimport logger from \"../logger\";\n\nexport type WipeCommandOptions = {\n gate: string;\n lam?: string;\n lamAPIKey?: string;\n // used to patch gate in __patchGateOptionsWithEnvVariables\n minivault?: boolean;\n compartment: number;\n hsm: string;\n hsmCert: string;\n hsmCertPassword: string;\n monotonicCountersSize?: number;\n fileSystemSize?: number;\n};\n\nexport async function wipe(options: WipeCommandOptions): Promise<void> {\n if (!options.hsmCert) {\n throw new Error(\n \"You must specify the path to your HSM certificate in your environment variable VAULT_HSM_CLIENT_CERT_PATH or use the --hsmCert flag\",\n );\n }\n\n const cert = await getCertFromPFX(options.hsmCert, options.hsmCertPassword);\n\n const wipeOptions: WipeOptions = {\n gate: options.gate,\n lam: options.lam,\n lamAPIKey: options.lamAPIKey,\n hsmCompartmentID: options.compartment,\n hsmEndpoint: options.hsm,\n hsmCert: cert.cert,\n hsmCertKey: cert.key,\n monotonicCountersSize: options.monotonicCountersSize,\n fileSystemSize: options.fileSystemSize,\n };\n return wipeBackend(wipeOptions, { logger });\n}\n\nexport const wipeOptions = [\n {\n name: \"compartment\",\n alias: \"c\",\n type: Number,\n description: \"HSM compartment ID {blue $VAULT_COMPARTMENT_ID}\",\n defaultValue: process.env.VAULT_COMPARTMENT_ID,\n },\n {\n name: \"hsm\",\n type: String,\n description: \"HSM endpoint {blue $VAULT_HSM_ENDPOINT}\",\n defaultValue: process.env.VAULT_HSM_ENDPOINT,\n },\n {\n name: \"hsmCert\",\n type: String,\n description: \"Path to HSM certificate {blue $VAULT_HSM_CLIENT_CERT_PATH}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PATH,\n },\n {\n name: \"hsmCertPassword\",\n type: String,\n description: \"HSM certificate password {blue $VAULT_HSM_CLIENT_CERT_PWD}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PWD,\n },\n {\n name: \"monotonicCountersSize\",\n type: Number,\n description: \"Size of monotonic counters\",\n },\n {\n name: \"fileSystemSize\",\n type: Number,\n description: \"Size of file system\",\n },\n];\n\nexport default {\n command: \"wipe\",\n description: \"Wipe backend data and reset it to onboarding state\",\n help: [{ content: \"{grey $} ledger-vault wipe [options]\" }],\n options: [GATE_OPTION, MINIVAULT_OPTION, ...wipeOptions, ...lamOptions],\n run: wipe,\n};\n","import { createDevicesPool } from \"@ledgerhq/vault-common\";\nimport bodyParser from \"body-parser\";\nimport cors from \"cors\";\nimport express from \"express\";\nimport { nanoid } from \"nanoid\";\n\nimport logger from \"../logger\";\n\ntype BridgeOptions = {\n port: number;\n networkDelay?: number;\n};\n\n/* istanbul ignore file */\nasync function bridge({ port, networkDelay }: BridgeOptions): Promise<void> {\n // eslint-disable-next-line no-console\n console.log({ networkDelay });\n const server = express();\n server.use(cors());\n server.use(bodyParser.json());\n server.use(bodyParser.text());\n\n server.use((req, res, next) => {\n logger.info(`${req.method} ${req.url}`);\n next();\n });\n\n server.listen(port, () => {\n logger.success(`Bridge listening on port ${port}`);\n });\n\n server.post(\"/login\", async (req, res) => {\n const { salt, gate, device = 4, readOnlyUser, deviceAPI } = req.body;\n try {\n // @ts-ignore\n const pool = createDevicesPool({\n salt,\n gate,\n readOnlyUser,\n networkDelay,\n deviceAPIURL: deviceAPI,\n deviceAPISessionID: nanoid(),\n });\n const user = await pool.login(device);\n res.send({ token: user.getToken() });\n } catch (err) {\n logger.error(err);\n // @ts-expect-error\n res.status(500).send(`Error: ${err.toString()}`);\n }\n });\n\n server.post(\"/userID\", async (req, res) => {\n const { salt, gate, device = 4, deviceAPI } = req.body;\n try {\n // @ts-ignore\n const pool = createDevicesPool({\n salt,\n gate,\n networkDelay,\n deviceAPIURL: deviceAPI,\n deviceAPISessionID: nanoid(),\n });\n const userID = await pool.getUserID(device);\n res.send({ userID });\n } catch (err) {\n logger.error(err);\n // @ts-expect-error\n res.status(500).send(`Error: ${err.toString()}`);\n }\n });\n\n server.post(\"/register\", async (req, res) => {\n const { gate, salt, device, request, deviceAPI } = req.body;\n try {\n // @ts-ignore\n const pool = createDevicesPool({\n salt,\n gate,\n networkDelay,\n deviceAPIURL: deviceAPI,\n deviceAPISessionID: nanoid(),\n });\n await pool.registerDevice(device, request);\n return res.send({});\n } catch (err) {\n logger.error(err);\n // @ts-expect-error\n res.status(500).send(`Error: ${err.toString()}`);\n }\n });\n\n server.post(\"/approve\", async (req, res) => {\n const { gate, salt, device, requestID } = req.body;\n try {\n // @ts-ignore\n const pool = createDevicesPool({\n salt,\n gate,\n networkDelay,\n deviceAPISessionID: nanoid(),\n });\n const user = await pool.login(device);\n await user.approveRequest({ id: requestID });\n return res.send({});\n } catch (err) {\n logger.error(err);\n // @ts-expect-error\n res.status(500).send(`Error: ${err.toString()}`);\n }\n });\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const p: Promise<void> = new Promise(() => {});\n return p;\n}\n\nexport default {\n command: \"bridge\",\n description: \"Open a bridge to pilot vault-common from outside via HTTP\",\n help: [\n {\n header: \"Usage\",\n content: [\"{grey $} ledger-vault bridge\"],\n },\n ],\n options: [\n {\n name: \"port\",\n type: Number,\n description: \"Bridge HTTP port\",\n defaultValue: 4242,\n },\n {\n name: \"networkDelay\",\n type: Number,\n description: \"Delay between requests\",\n defaultValue: 1,\n },\n ],\n run: bridge,\n};\n","import {\n ConfigCatConfiguration,\n createConfigCatEnvironment,\n deleteConfigCatEnvironment,\n setConfigCatFeatureFlagValues,\n} from \"@ledgerhq/vault-common\";\nimport chalk from \"chalk\";\n\nimport logger from \"../logger\";\n\nexport type ConfigcatOptions = {\n env: string;\n sbx: boolean;\n stg: boolean;\n ppr: boolean;\n data: string | null;\n apiKey: string | null;\n productId: string | null | undefined;\n configId: string | null | undefined;\n};\n\nconst asciiArtConfigCatHeader = ` \n ## \n ## #### \n #### ###### \n ################## \n #####*********#### \n ###-+:-+::#@@@:### ###\n ###-=::+::@@@@-### #####\n ####*+======++#### #####\n *#######+*#######* #####\n ::+++*###**####***= ####\n ################ ##### \n ################### \n`;\n\nfunction getConfigCatConfiguration(options: ConfigcatOptions): Promise<ConfigCatConfiguration> {\n const apiKey = process.env[\"CONFIGCAT_API_KEY\"] || options.apiKey;\n let productId = process.env[\"CONFIGCAT_PRODUCT_ID\"] || options.productId;\n let configId = process.env[\"CONFIGCAT_CONFIG_ID\"] || options.configId;\n if (options.sbx) {\n productId = process.env.CONFIGCAT_SBX_PRODUCT_ID;\n configId = process.env.CONFIGCAT_SBX_CONFIG_ID;\n } else if (options.stg) {\n productId = process.env.CONFIGCAT_STG_PRODUCT_ID;\n configId = process.env.CONFIGCAT_STG_CONFIG_ID;\n } else if (options.ppr) {\n productId = process.env.CONFIGCAT_PPR_PRODUCT_ID;\n configId = process.env.CONFIGCAT_PPR_CONFIG_ID;\n }\n if (!apiKey || !productId || !configId)\n throw Error(\n \"One of ConfigCat data (apiKey, productId or configId) is missing. Please use --help to know about relevant env variables or CLI options.\",\n );\n const config = { apiKey, productId, configId };\n return Promise.resolve(config);\n}\n\nexport const configCatCreate = async (options: ConfigcatOptions): Promise<void> => {\n const response = await getConfigCatConfiguration(options).then((config) =>\n createConfigCatEnvironment(config, options.env),\n );\n // not using logger here because we want to be able to use \"jq\" to parse the output\n /* istanbul ignore next */ console.log(JSON.stringify(response));\n};\n\nexport const configCatSetFlags = async (options: ConfigcatOptions): Promise<void> => {\n let jsonData = {};\n try {\n jsonData = JSON.parse(options.data || \"{}\");\n } catch (error) {\n throw Error(\"Invalid JSON input for feature flags data\");\n }\n await getConfigCatConfiguration(options).then((config) =>\n setConfigCatFeatureFlagValues(config, options.env, jsonData, { logger }),\n );\n};\n\nexport const configCatDelete = async (options: ConfigcatOptions): Promise<void> => {\n await getConfigCatConfiguration(options).then((configcatConfig) =>\n deleteConfigCatEnvironment(configcatConfig, options.env),\n );\n};\n\nconst subCommandConfigCatCreate = {\n command: \"create\",\n description: \"Create a ConfigCat environment\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault configcat create -e foo\"],\n },\n ],\n options: [\n {\n name: \"env\",\n alias: \"e\",\n type: String,\n description: \"ConfigCat environment name\",\n required: true,\n },\n ],\n run: configCatCreate,\n};\n\nconst subCommandConfigCatSetFlags = {\n command: \"setFlags\",\n description: \"Set flags within a ConfigCat environment\",\n help: [\n {\n header: \"Examples\",\n content: [\n '{grey $} ledger-vault configcat setFlags -e foo -d \\'\\\\{\"flag1\": true, \"flag2\": false\\\\}\\'',\n ],\n },\n ],\n options: [\n {\n name: \"env\",\n alias: \"e\",\n type: String,\n description: \"ConfigCat environment name\",\n required: true,\n },\n {\n name: \"data\",\n alias: \"d\",\n description: \"Feature flags to set, JSON format expected\",\n type: String,\n defaultValue: \"{}\",\n },\n ],\n run: configCatSetFlags,\n};\n\nconst subCommandConfigCatDelete = {\n command: \"delete\",\n description: \"Delete a ConfigCat environment\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault configcat delete -e foo\"],\n },\n ],\n options: [\n {\n name: \"env\",\n alias: \"e\",\n type: String,\n description: \"ConfigCat environment name\",\n required: true,\n },\n ],\n run: configCatDelete,\n};\n\nexport default {\n command: \"configcat\",\n description: \"Manage ConfigCat environments and feature flags\",\n help: [\n { content: chalk.red(asciiArtConfigCatHeader), raw: true },\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault configcat --sbx --apiKey <sbxSecret> create ...\",\n \"{grey $} ledger-vault configcat --ppr --apiKey <pprSecret> setFlags ...\",\n \"{grey $} ledger-vault configcat --stg --apiKey <stgSecret> delete ...\",\n \"# or use those env variables\",\n '{grey $} CONFIGCAT_API_KEY=\"...\" CONFIGCAT_PRODUCT_ID=\"...\" CONFIGCAT_CONFIG_ID=\"...\" ledger-vault configcat ...',\n ],\n },\n {\n header: \"Where to find the needed env variables ?\",\n content: [\n \"{italic CONFIGCAT_API_KEY}\",\n \"You need to create your own !\",\n \"Go to {underline https://app.configcat.com/my-account/public-api-credentials} and get your base64 encoded auth header (without the 'Basic' part)\",\n \"\",\n \"{italic CONFIGCAT_PRODUCT_ID & CONFIGCAT_CONFIG_ID}\",\n \"First and second parts of the URL when you are on the flags page\",\n \"-> {underline https://app.configcat.com/<CONFIGCAT_PRODUCT_ID>/<CONFIGCAT_CONFIG_ID>/...}\",\n ],\n },\n ],\n options: [\n {\n name: \"apiKey\",\n type: String,\n description:\n \"Your own ConfigCat API key (basic auth), this uses by default CONFIGCAT_API_KEY.\",\n },\n {\n name: \"productId\",\n type: String,\n description:\n \"See {underline https://configcat.com/docs/main-concepts/#product}, this uses by default CONFIGCAT_PRODUCT_ID.\",\n },\n {\n name: \"configId\",\n type: String,\n description:\n \"See {underline https://configcat.com/docs/main-concepts/#config}, this uses by default CONFIGCAT_CONFIG_ID.\",\n },\n {\n name: \"sbx\",\n description:\n \"Autofill SBX data using CONFIGCAT_SBX_PRODUCT_ID & CONFIGCAT_SBX_CONFIG_ID env variables.\",\n type: Boolean,\n defaultValue: false,\n },\n {\n name: \"stg\",\n description:\n \"Autofill STG data using CONFIGCAT_STG_PRODUCT_ID & CONFIGCAT_STG_CONFIG_ID env variables.\",\n type: Boolean,\n defaultValue: false,\n },\n {\n name: \"ppr\",\n description:\n \"Autofill PPR data using CONFIGCAT_PPR_PRODUCT_ID & CONFIGCAT_PPR_CONFIG_ID env variables.\",\n type: Boolean,\n defaultValue: false,\n },\n ],\n subCommands: [subCommandConfigCatCreate, subCommandConfigCatSetFlags, subCommandConfigCatDelete],\n};\n","import { bakeManifest, createDevicesPool } from \"@ledgerhq/vault-common\";\nimport {\n EntityType,\n Manifest,\n ManifestAccount,\n ManifestAccountRule,\n ManifestWhitelistAddress,\n PoolOptions,\n} from \"@ledgerhq/vault-common/types\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport logger from \"../logger\";\nimport {\n FORMAT_OPTION,\n FormatOption,\n TWO_STEPS_REQUEST_OPTION,\n TwoStepsRequestOption,\n} from \"../miscOptions\";\nimport { CliOptions, GateOptions } from \"../types\";\nimport { queryEntityWithPoolByName } from \"./get\";\n\nexport type CreateOptions<T> = GateOptions &\n TwoStepsRequestOption &\n FormatOption &\n CliOptions & {\n device: number | \"api\" | \"lam\";\n noApproval: boolean;\n command: T;\n };\n\ntype CreatePolicy = CreateOptions<\"policy\"> & {\n name: string;\n currency?: string;\n rules: string;\n};\n\ntype CreateGroup = CreateOptions<\"group\"> & {\n name: string;\n users: string;\n description?: string;\n};\n\ntype CreateUser = CreateOptions<\"user\"> & {\n name: string;\n role: string;\n viewAll?: boolean;\n publicKey?: string;\n};\n\ntype CreateWhitelist = CreateOptions<\"whitelist\"> & {\n name: string;\n addresses: string[];\n type?: \"TRANSACTION\" | \"SMART_CONTRACT\";\n};\n\ntype CreateExchange = CreateOptions<\"exchange\"> & {\n name: string;\n platform: string;\n status?: \"PENDING\" | \"ACTIVE\" | \"ABORTED\";\n rules?: string;\n apiKey: string;\n apiSecret: string;\n};\n\ntype CreateAccount = CreateOptions<\"account\"> & {\n name: string;\n currency?: string;\n accountType?: string;\n contractAddress?: string;\n parentAccount?: string;\n rules?: string;\n policy?: string;\n derivationMode?: \"standard\" | \"native_segwit\";\n index?: number;\n\n // VG-10744 ability to create read-only account based on xPub / network parameters\n xpub?: string;\n publicKey?: string;\n chainCode?: string;\n\n // ability to enable NFT gallery\n enableNFTGallery?: boolean;\n\n // wait for account status to be ACTIVE (synced) after creation\n waitForActive?: boolean;\n};\n\ntype CreateVaultEntity = CreateOptions<\"entity\"> & {\n name: string;\n accounts: string;\n};\n\nexport type CreateEntity =\n | CreateGroup\n | CreateUser\n | CreateWhitelist\n | CreateExchange\n | CreateAccount\n | CreateVaultEntity\n | CreatePolicy;\n\nconst entityTypeByCommand: Record<string, EntityType> = {\n user: \"USER\",\n group: \"GROUP\",\n whitelist: \"WHITELIST\",\n account: \"ACCOUNT\",\n exchange: \"EXCHANGE\",\n entity: \"VAULT_ENTITY\",\n policy: \"POLICY\",\n};\n\nexport const createEntity = async (opts: CreateEntity): Promise<void> => {\n const poolOptions: PoolOptions = {\n salt: opts.salt,\n gate: opts.gate,\n apiGateway: opts.apiGateway,\n transport: opts.transport,\n lamURL: opts.lam,\n lamAPIKey: opts.lamAPIKey,\n deviceAPIURL: opts.deviceAPI,\n };\n const { networkDelay, noApproval, twoStepsRequest } = opts;\n\n const pool = createDevicesPool({\n ...poolOptions,\n lamURL: opts.lam,\n networkDelay,\n });\n\n let manifest: Manifest | null = null;\n\n if (opts.command === \"group\") {\n const { name, users, description } = opts;\n\n manifest = {\n groups: [\n {\n name,\n users: users\n .split(\",\")\n // @ts-ignore this condition will always return 'false' since the types 'number' and 'string' have no overlap.\n .map((u) => (parseInt(u) == u ? Number(u) : u)),\n description,\n status: /* istanbul ignore next */ noApproval ? \"PENDING\" : undefined,\n },\n ],\n };\n }\n\n if (opts.command === \"user\") {\n const { device, role, name, viewAll, publicKey } = opts;\n const users = {};\n\n manifest = {};\n\n if (device === \"api\") {\n Object.assign(users, {\n apiV2: [\n {\n name,\n publicKey,\n role: role || \"operator\",\n ...(viewAll ? { viewAll } : {}),\n },\n ],\n });\n } else if (device === \"lam\") {\n Object.assign(users, {\n api: [viewAll ? /* istanbul ignore next */ { name, viewAll } : name],\n });\n } else {\n if (isNaN(device)) {\n throw new Error(\n `Invalid value \"${device}\" for device, must be either \"lam\", \"api\" or a number`,\n );\n }\n if (!role) {\n throw new Error(\"`role` option is required when creating regular (non-API) user\");\n }\n if ([\"admin\", \"operator\"].indexOf(role) === -1) {\n throw new Error(`invalid role \\`${role}\\``);\n }\n const key = `${role}s`;\n Object.assign(users, { [key]: [Number(device)] });\n Object.assign(manifest, { customUsernames: { [device]: name } });\n }\n Object.assign(manifest, { users });\n }\n\n if (opts.command === \"whitelist\") {\n const { name, addresses, type } = opts;\n\n manifest = {\n whitelists: [\n {\n name,\n type,\n addresses: addresses.map((a) => {\n const s = a.split(\"|\");\n\n // istanbul ignore next\n const result: ManifestWhitelistAddress = {\n currency: s[0] || \"\",\n name: s[1] || \"\",\n address: s[2] || \"\",\n };\n\n if (s.length === 4) {\n const destination_tags: number[] = JSON.parse(s[3]!);\n return { ...result, destination_tags };\n }\n\n if (s.length !== 3)\n throw new Error(\"invalid address format, should be currency|name|address\");\n // istanbul ignore next\n return result;\n }),\n status: noApproval /* istanbul ignore next */ ? \"PENDING\" : undefined,\n },\n ],\n };\n }\n\n if (opts.command === \"account\") {\n let rules;\n if (opts.rules) {\n try {\n rules = JSON.parse(opts.rules);\n } catch {\n throw new Error(\"Invalid rules given\");\n }\n }\n\n const manifestAccount: ManifestAccount = {\n name: opts.name,\n status: noApproval ? \"PENDING\" : undefined,\n ...(rules ? { rules } : {}),\n ...(opts.policy !== undefined ? { policy: opts.policy } : {}),\n ...(opts.index !== undefined ? { index: opts.index } : {}),\n ...(opts.contractAddress\n ? /* istanbul ignore next */ {\n contractAddress: opts.contractAddress,\n ...(opts.parentAccount\n ? /* istanbul ignore next */ {\n parentAccount: opts.parentAccount,\n }\n : /* istanbul ignore next */ {}),\n }\n : opts.currency\n ? {\n currency: opts.currency,\n ...(opts.derivationMode ? { derivationMode: opts.derivationMode } : {}),\n }\n : (() => {\n throw new Error(`No currency or contractAddress in account`);\n })()),\n ...(\"xpub\" in opts || \"publicKey\" in opts || \"chainCode\" in opts\n ? (() => {\n if (!opts.xpub || !opts.publicKey || !opts.chainCode)\n throw new Error(\n \"xpub / publicKey / chainCode must be defined together in order to work\",\n );\n return {\n readOnly: {\n xpub: opts.xpub,\n publicKey: opts.publicKey,\n chainCode: opts.chainCode,\n },\n };\n })()\n : {}),\n ...(opts.accountType ? { accountType: opts.accountType } : {}),\n ...(opts.enableNFTGallery ? { config: { nftGallery: true } } : {}),\n };\n\n manifest = {\n accounts: [manifestAccount],\n };\n }\n\n if (opts.command === \"entity\") {\n const { name, accounts } = opts;\n\n manifest = {\n entities: [\n {\n name,\n accounts: accounts.split(\",\"),\n status: /* istanbul ignore next */ noApproval ? \"PENDING\" : undefined,\n },\n ],\n };\n }\n\n if (opts.command === \"exchange\") {\n const { name, apiKey, apiSecret, platform, rules: _rules } = opts;\n const rules = _rules ? (JSON.parse(_rules) as Array<ManifestAccountRule[]>) : undefined;\n manifest = {\n exchanges: [\n {\n name,\n platform,\n status: /* istanbul ignore next */ noApproval ? \"PENDING\" : undefined,\n rules,\n configuration: {\n apiKey,\n apiSecret,\n },\n },\n ],\n };\n }\n\n if (opts.command === \"policy\") {\n const { name, currency, rules: _rules } = opts;\n const rules = JSON.parse(_rules) as Array<ManifestAccountRule[]>;\n manifest = {\n policies: [\n {\n name,\n ...(currency ? { currency } : {}),\n rules,\n },\n ],\n };\n }\n\n if (!manifest) {\n throw new Error(\"Nothing to bake\");\n }\n\n await bakeManifest(manifest, pool, {\n noApproval,\n twoStepsRequest,\n waitForActive: \"waitForActive\" in opts ? opts.waitForActive : undefined,\n logger: opts.format !== \"json\" ? logger : undefined,\n });\n\n await queryEntityWithPoolByName(\n // @ts-ignore\n {\n ...poolOptions,\n format: opts.format,\n },\n opts.name,\n entityTypeByCommand[opts.command],\n );\n};\n\nexport default {\n command: \"create\",\n description: \"Create users, groups, accounts, entities...\",\n options: [\n ...gateOptions,\n ...lamOptions,\n ...cliOptions,\n {\n name: \"noApproval\",\n type: Boolean,\n description: \"Create the request without approving it\",\n },\n ],\n subCommands: [\n {\n command: \"user\",\n description: \"Create a user of the given role\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{blue # Create a regular user:}\",\n \"{grey $} ledger-vault create user {bold --name} Bob {bold --role} admin {bold --device} 28\",\n \"\",\n \"{blue # Create a LAM user:}\",\n \"{grey $} ledger-vault create user {bold --name} BobLAM {bold --device} lam\",\n \"\",\n \"{blue # Create an API user:}\",\n \"{grey $} ledger-vault create user {bold --name} BobAPI {bold --device} api {bold --publicKey} 04a7629e22eaeeccddf13349a0a88fd401d31e2275c53e4acb526f56510f80a5db82dd52d10c5720779c3d065eaca87c75e0cabbfd2cf9eddd3202d1563db97177\",\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"User name\",\n required: true,\n },\n {\n name: \"role\",\n typeLabel: \"{underline role}\",\n description: \"One of: admin, operator\",\n type: String,\n },\n {\n name: \"device\",\n description: \"'lam' for LAM user, 'api' for API user, or device index to generate seed\",\n default: 1,\n type: String,\n required: true,\n },\n {\n name: \"viewAll\",\n description: \"User has view all rights\",\n default: false,\n type: Boolean,\n },\n {\n name: \"publicKey\",\n description: \"API user's secp256r1 public key\",\n type: String,\n },\n FORMAT_OPTION,\n ],\n run: createEntity,\n },\n {\n command: \"group\",\n description: \"Create a group\",\n help: [\n {\n header: \"Examples\",\n content: [\n '{grey $} ledger-vault create group --name GroupA --users 11,12 --description \"Some description here\"',\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Group name\",\n required: true,\n },\n {\n name: \"description\",\n description: \"Group description\",\n type: String,\n },\n {\n name: \"users\",\n description: \"List of users device index\",\n type: String,\n required: true,\n },\n TWO_STEPS_REQUEST_OPTION,\n FORMAT_OPTION,\n ],\n run: createEntity,\n },\n {\n command: \"account\",\n description: \"Create an account\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault create account {bold --name} btc1 {bold --currency} bitcoin\",\n \"{grey $} ledger-vault create account {bold --name} lgc1 {bold --contractAddress} 0x9549E8A940062615ceE20C0420C98c25Ffa2b214 {bold --parentAccount} eth1\",\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Account name\",\n required: true,\n },\n {\n name: \"currency\",\n description: \"Account currency\",\n type: String,\n },\n {\n name: \"accountType\",\n description: \"Specify the account type (see Gate 'account_type')\",\n type: String,\n },\n {\n name: \"contractAddress\",\n description: \"Account contract address\",\n type: String,\n },\n {\n name: \"parentAccount\",\n description: \"Account parent\",\n type: String,\n },\n {\n name: \"derivationMode\",\n type: String,\n description:\n \"Derivation mode: can be '{magenta native_segwit}' (default) or '{magenta standard}' (legacy) (available only for: bitcoin, bitcoin_testnet)\",\n },\n {\n name: \"index\",\n type: Number,\n description: \"Account index\",\n },\n {\n name: \"rules\",\n type: String,\n },\n {\n name: \"policy\",\n type: String,\n description: \"Policy name to attach to the account\",\n },\n {\n name: \"xpub\",\n type: String,\n description: \"{yellow.bold read-only} Account xPub\",\n },\n {\n name: \"address\",\n type: String,\n description: \"{yellow.bold read-only} Account EVM address\",\n },\n {\n name: \"publicKey\",\n type: String,\n description: \"{yellow.bold read-only} Account public key\",\n },\n {\n name: \"chainCode\",\n type: String,\n description: \"{yellow.bold read-only} Account chain-code\",\n },\n {\n name: \"enableNFTGallery\",\n type: Boolean,\n description: \"If passed, enable NFT gallery for account\",\n },\n {\n name: \"waitForActive\",\n type: Boolean,\n description: \"Wait for account status to be ACTIVE (synced) after creation\",\n },\n TWO_STEPS_REQUEST_OPTION,\n FORMAT_OPTION,\n ],\n run: createEntity,\n },\n {\n command: \"whitelist\",\n description: \"Create a whitelist\",\n help: [\n {\n header: \"Examples\",\n content: [\n '{grey $} ledger-vault create whitelist {bold --name} whitelistname1 {bold --description} someDescription {bold --addresses} \"bitcoin|btc_name|1F1tAa....\" \"dash|my_dash_name|XqHt831...\" ',\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Whitelist name\",\n required: true,\n },\n {\n name: \"description\",\n description: \"Whitelist description\",\n type: String,\n },\n {\n name: \"type\",\n description: \"Whitelist type (TRANSACTION|SMART_CONTRACT)\",\n type: String,\n },\n {\n name: \"addresses\",\n description:\n 'List of addresses with the \"currency|name|address\" \"currency|name|address\" ...',\n type: String,\n required: true,\n multiple: true,\n },\n TWO_STEPS_REQUEST_OPTION,\n FORMAT_OPTION,\n ],\n run: createEntity,\n },\n {\n command: \"entity\",\n description: \"Create an entity\",\n help: [\n {\n header: \"Examples\",\n content: [\n `{grey $} ledger-vault create entity --name EntityA --accounts \"BTC Testnet 1,ETH Ropsten 1\"`,\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Entity name\",\n required: true,\n },\n {\n name: \"accounts\",\n description: \"List of accounts name, separated by a comma\",\n type: String,\n required: true,\n },\n ],\n run: createEntity,\n },\n {\n command: \"exchange\",\n description: \"Import an exchange\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault create exchange {bold --name} awesome-exchange {bold --platform} binance {bold --apiKey} foo {bold --apiSecret} bar\",\n \"{grey # With custom rules:}\",\n `{grey $} ledger-vault create exchange {bold --name} awesome-exchange {bold --platform} binance {bold --apiKey} foo {bold --apiSecret} bar {bold --rules} '[ [ \\\\{ \"type\": \"MULTI_AUTHORIZATIONS\", \"steps\": [\\\\{ \"quorum\": 1, \"users\": [10] \\\\}] \\\\} ] ]'`,\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Exchange name\",\n required: true,\n },\n {\n name: \"platform\",\n description: \"Which platform to connect with (e.g: {magenta binance})\",\n type: String,\n required: true,\n },\n {\n name: \"apiKey\",\n description: \"API key\",\n type: String,\n required: true,\n },\n {\n name: \"apiSecret\",\n description: \"API secret\",\n type: String,\n required: true,\n },\n {\n name: \"rules\",\n description: \"Send rules, passed as stringified JSON\",\n type: String,\n },\n TWO_STEPS_REQUEST_OPTION,\n FORMAT_OPTION,\n ],\n run: createEntity,\n },\n {\n command: \"policy\",\n description: \"Create a policy\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault create policy {bold --name} awesome-policy {bold --currency} bitcoin\",\n \"{grey # With custom rules:}\",\n `{grey $} ledger-vault create policy {bold --name} awesome-policy {bold --currency} bitcoin {bold --rules} '[ [ \\\\{ \"type\": \"MULTI_AUTHORIZATIONS\", \"steps\": [\\\\{ \"quorum\": 1, \"users\": [10] \\\\}] \\\\} ] ]'`,\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Policy name\",\n required: true,\n },\n {\n name: \"currency\",\n description: \"Policy currency (don't pass the option to create a currency-less policy)\",\n type: String,\n },\n {\n name: \"rules\",\n description: \"Send rules, passed as stringified JSON\",\n type: String,\n required: true,\n },\n TWO_STEPS_REQUEST_OPTION,\n FORMAT_OPTION,\n ],\n run: createEntity,\n },\n ],\n};\n","import { createDevicesPool, fetchTokens } from \"@ledgerhq/vault-common\";\nimport {\n Connection,\n EntityType,\n GateEntity,\n GateTokenCurrency,\n PoolOptions,\n} from \"@ledgerhq/vault-common\";\nimport qs from \"qs\";\n\nimport cliOptions from \"../cliOptions\";\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\nimport { displayTable } from \"../utils\";\n\nexport default {\n command: \"get\",\n description: \"Query entities\",\n options: [\n {\n name: \"format\",\n alias: \"f\",\n type: String,\n typeLabel: \"json\",\n description: \"Output format {grey (available: table, json)}\",\n defaultValue: \"table\",\n },\n {\n name: \"pageSize\",\n type: Number,\n description: \"Number of items to display\",\n },\n {\n name: \"page\",\n type: Number,\n description: \"Page number\",\n defaultValue: 1,\n },\n ...cliOptions,\n deviceOption,\n ...gateOptions,\n ],\n subCommands: [\n {\n command: \"users\",\n description: \"Get the list of users\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault get users\"],\n },\n ],\n options: [],\n run: async (options: QueryEntityWithPoolOptions): Promise<void> =>\n queryEntitiesWithPool(\n options,\n \"/people\",\n {\n role: [\"ADMIN\", \"OPERATOR\"],\n },\n \"USER\",\n ),\n },\n {\n command: \"groups\",\n description: \"Get the list of groups\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault get groups\"],\n },\n ],\n options: [],\n run: async (options: QueryEntityWithPoolOptions): Promise<void> =>\n queryEntitiesWithPool(options, \"/groups\", {}, \"GROUP\"),\n },\n {\n command: \"accounts\",\n description: \"Get the list of accounts\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault get accounts\"],\n },\n ],\n options: [],\n run: async (options: QueryEntityWithPoolOptions): Promise<void> =>\n queryEntitiesWithPool(options, \"/accounts\", {}, \"ACCOUNT\"),\n },\n {\n command: \"whitelists\",\n description: \"Get the list of whitelists\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault get whitelists\"],\n },\n ],\n options: [],\n run: async (options: QueryEntityWithPoolOptions): Promise<void> =>\n queryEntitiesWithPool(options, \"/whitelists\", {}, \"WHITELIST\"),\n },\n {\n command: \"transactions\",\n description: \"Get the list of the 30 latest transactions\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault get transactions\"],\n },\n ],\n options: [],\n run: async (options: QueryEntityWithPoolOptions): Promise<void> =>\n queryEntitiesWithPool(\n options,\n \"/transactions\",\n {\n pageSize: 30,\n },\n \"TRANSACTION\",\n ),\n },\n {\n command: \"entities\",\n description: \"Get the list of entities\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault get entities\"],\n },\n ],\n options: [],\n run: async (options: QueryEntityWithPoolOptions): Promise<void> =>\n queryEntitiesWithPool(options, \"/entities\", {}, \"VAULT_ENTITY\"),\n },\n ],\n};\n\nconst queryEntitiesWithPool = async (\n {\n gate,\n apiGateway,\n salt,\n readOnlyUser,\n format,\n pageSize,\n page,\n device,\n transport,\n lam,\n networkDelay,\n deviceAPI,\n }: QueryEntityWithPoolOptions,\n url: string,\n query: any,\n entityType: EntityType,\n) => {\n const opts: PoolOptions = {\n gate,\n apiGateway,\n transport,\n salt,\n readOnlyUser,\n lamURL: lam,\n deviceAPIURL: deviceAPI,\n networkDelay,\n };\n const pool = createDevicesPool(opts);\n // istanbul ignore next\n const admin = await pool.login(Number(device || 4));\n let tokens: GateTokenCurrency[] = [];\n if (entityType === \"ACCOUNT\") {\n tokens = await fetchTokens(admin, { logger });\n }\n\n const q = qs.stringify(\n {\n ...query,\n pageSize: pageSize || query.pageSize || -1,\n page,\n },\n { indices: false },\n );\n const data = await admin.network<Connection<GateEntity>>(\"GET\", `${url}?${q}`);\n if (format === \"json\") {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(data.edges.map((edge: any) => edge.node)));\n } else {\n const extraData = { tokens };\n displayTable(data, entityType, extraData);\n }\n};\n\nconst tableEntityUrl: {\n [key in EntityType]: string;\n} = {\n USER: \"/people\",\n GROUP: \"/groups\",\n ACCOUNT: \"/accounts\",\n WHITELIST: \"/whitelists\",\n TRANSACTION: \"/transactions\",\n VAULT_ENTITY: \"/entities\",\n EXCHANGE: \"/exchanges\",\n POLICY: \"/policies\",\n};\n\nexport interface QueryEntityWithPoolOptions extends GateOptions {\n device: number;\n format: string;\n pageSize?: number;\n page: number;\n lamURL?: string;\n deviceAPIURL?: string;\n}\n\nexport const queryEntityWithPoolByName = async (\n poolOptions: QueryEntityWithPoolOptions,\n name: string,\n entityType: EntityType,\n): Promise<void> => {\n const { format, device, networkDelay } = poolOptions;\n\n const pool = createDevicesPool({\n ...poolOptions,\n deviceAPIURL: poolOptions.deviceAPI || poolOptions.deviceAPIURL,\n lamURL: poolOptions.lam || poolOptions.lamURL,\n networkDelay,\n });\n // istanbul ignore next\n const admin = await pool.login(Number(device || 4));\n\n const fieldName = entityType === \"USER\" ? \"username\" : \"name\";\n const url = `${tableEntityUrl[entityType]}?${fieldName}=${name}`;\n const data = await admin.network(\"GET\", url);\n if (format === \"json\") {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(data));\n } else {\n let tokens: GateTokenCurrency[] = [];\n\n if (entityType === \"ACCOUNT\") {\n tokens = await fetchTokens(admin, { logger });\n }\n displayTable(data as Connection<GateEntity>, entityType, { tokens });\n }\n};\nexport const queryEntityWithPool = async (\n {\n gate,\n apiGateway,\n salt,\n transport,\n format,\n device,\n lam,\n lamURL,\n networkDelay,\n deviceAPI,\n deviceAPIURL,\n }: QueryEntityWithPoolOptions,\n id: string,\n entityType: EntityType,\n): Promise<void> => {\n const opts: PoolOptions = {\n gate,\n apiGateway,\n salt,\n transport,\n lamURL: lam || lamURL,\n networkDelay,\n deviceAPIURL: deviceAPI || deviceAPIURL,\n };\n const pool = createDevicesPool(opts);\n // istanbul ignore next\n const admin = await pool.login(Number(device || 4));\n\n const url = `${tableEntityUrl[entityType]}/${id}`;\n const data = await admin.network(\"GET\", url);\n if (format === \"json\") {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(data));\n } else {\n // @ts-ignore\n displayTable(data, entityType);\n }\n};\n","import { formatCurrencyUnit } from \"@ledgerhq/live-common-stub/lib/currencies/formatCurrencyUnit\";\nimport {\n Connection,\n EntityType,\n GateAccount,\n GateEntity,\n GateExchange,\n GateGroup,\n GatePolicy,\n GateTokenCurrency,\n GateTransaction,\n GateUser,\n GateVaultEntity,\n GateWhitelist,\n} from \"@ledgerhq/vault-common\";\nimport { getCurrencyOrToken, getGateAccountUnit } from \"@ledgerhq/vault-common/utils\";\nimport BigNumber from \"bignumber.js\";\nimport { exec } from \"child_process\";\nimport Table from \"cli-table3\";\nimport fs, { Dirent, Stats } from \"fs\";\n\ntype ExtraData = {\n tokens?: GateTokenCurrency[];\n accounts?: GateAccount[];\n};\n\ntype TableDefinition<T> = {\n head: string[];\n extract: (entity: T, extraData?: ExtraData) => any[];\n};\n\n/* istanbul ignore next */\nconst tableDefMap: {\n // Todo find a way to use GateEntity instead of any\n [key in EntityType]: TableDefinition<any>;\n} = {\n USER: {\n head: [\"id\", \"username\", \"role\", \"user_id\", \"status\"],\n extract: (entity: GateUser) => [\n entity.id,\n entity.username,\n `${entity.role}${entity.is_api ? \" (API)\" : \"\"}`,\n entity.user_id,\n entity.status,\n ],\n },\n GROUP: {\n head: [\"id\", \"name\", \"users\", \"status\", \"description\"],\n extract: (entity: GateGroup) => [\n entity.id,\n entity.name,\n entity.members.map((m) => m.username).join(\",\"),\n entity.status,\n entity.description,\n ],\n },\n ACCOUNT: {\n head: [\"id\", \"currency\", \"name\", \"status\", \"balance\", \"entity\"],\n extract: (account: GateAccount, extraData: ExtraData = {}) => {\n const { tokens = [] } = extraData;\n const currencyOrToken = getCurrencyOrToken(account, tokens);\n\n let balance = account.balance;\n const unit = getGateAccountUnit(account, tokens);\n const b = new BigNumber(balance);\n balance = formatCurrencyUnit(unit, b, {\n showCode: true,\n showAllDigits: false,\n disableRounding: true,\n });\n // HACK to make 𝚝 units (e.g 𝚝BTC) not break table formatting\n balance = balance.replace(\"𝚝\", \"t\");\n const res = [\n account.id,\n currencyOrToken.name,\n account.name,\n account.status,\n { content: balance, hAlign: \"right\" },\n ];\n\n return res;\n },\n },\n WHITELIST: {\n head: [\"id\", \"name\", \"status\", \"description\"],\n extract: (entity: GateWhitelist) => [entity.id, entity.name, entity.status, entity.description],\n },\n TRANSACTION: {\n head: [\"id\", \"account_id\", \"type\", \"created_on\", \"status\", \"amount\", \"note\"],\n extract: (entity: GateTransaction) => {\n const note = entity.notes.length\n ? [entity.notes[0] && entity.notes[0].title, entity.notes[0] && entity.notes[0].content]\n .filter(Boolean)\n .join(\" - \")\n : \"\";\n return [\n entity.id,\n entity.account_id,\n entity.type,\n entity.created_on,\n entity.status,\n entity.amount,\n note,\n ];\n },\n },\n VAULT_ENTITY: {\n head: [\"id\", \"name\", \"accounts\", \"status\"],\n extract: (entity: GateVaultEntity) => [\n entity.id,\n entity.name,\n entity.accounts.map((a) => a.name).join(\",\"),\n entity.status,\n ],\n },\n EXCHANGE: {\n head: [\"id\", \"name\", \"platform\", \"status\"],\n extract: (entity: GateExchange) => [entity.id, entity.name, entity.platform, entity.status],\n },\n POLICY: {\n head: [\"id\", \"name\", \"currency\", \"status\"],\n extract: (entity: GatePolicy) => [entity.id, entity.name, entity.currency, entity.status],\n },\n};\n\nexport const displayTable = (\n data: Connection<GateEntity>,\n entityType: EntityType,\n extraData?: ExtraData,\n): void => {\n const tableDef: TableDefinition<GateEntity> = tableDefMap[entityType];\n\n const table = new Table({\n head: tableDef.head,\n style: { head: [\"blue\", \"bold\"], border: [\"grey\"] },\n });\n // istanbul ignore else\n if (data.edges) {\n table.push(...data.edges.map((edge: any) => tableDef.extract(edge.node, extraData)));\n } else {\n // FIXME is this case happening???\n // @ts-ignore\n table.push(tableDef.extract(data, extraData));\n }\n // eslint-disable-next-line no-console\n console.log(table.toString());\n};\n\nexport const promisify =\n <T>(fn: (...args: any) => void): ((...args: any) => Promise<T>) =>\n /* istanbul ignore next */\n (...args) =>\n new Promise((resolve, reject) =>\n fn(...args, (err: Error, res: T) => {\n if (err) {\n return reject(err);\n }\n resolve(res);\n }),\n );\n\nconst promisifiedExec: (cmd: string, options?: { cwd: string }) => Promise<string> =\n promisify(exec);\n\nexport const execShell = /* istanbul ignore next */ async (\n cmd: string,\n options?: { cwd: string },\n): Promise<string> => {\n const output = await promisifiedExec(cmd, options);\n return output.trim();\n};\n\nexport const rmdir: (path: string, options: { recursive: boolean }) => Promise<void> = promisify(\n fs.rmdir,\n);\n\nexport const readdir: (p: string, options?: { withFileTypes: boolean }) => Promise<Dirent[]> =\n promisify(fs.readdir);\n\nexport const writeFile: (p: string, data: string) => Promise<void> = promisify(fs.writeFile);\n\nconst stat: (p: string) => Promise<Stats> = promisify(fs.stat);\n\nexport const fileExists = /* istanbul ignore next */ async (path: string): Promise<boolean> => {\n try {\n const stats = await stat(path);\n if (!stats.isFile()) {\n throw new Error(\"Provided output file already exists and is not a file\");\n }\n return true;\n } catch (err) {\n // @ts-expect-error\n if (err.code === \"ENOENT\") {\n return false;\n }\n throw err;\n }\n};\n","import {\n DEFAULT_VAULT_REMOTE_URL,\n DeployOptions,\n HelmValues,\n deploy,\n} from \"@ledgerhq/vault-common\";\nimport moment from \"moment\";\n\nimport logger from \"../logger\";\n\ntype DeployCommandOptions = {\n remoteURL: string;\n name: string;\n owner: string;\n expirationHours?: number;\n preset?: string;\n values?: string;\n watchTimeoutMinutes?: number;\n useDedicatedHSMSimu?: boolean;\n useHTTPPolling?: boolean;\n};\n\nexport const deployCommand = async (options: DeployCommandOptions): Promise<void> => {\n let values: HelmValues | null = null;\n if (options.values) {\n values = JSON.parse(options.values) as HelmValues;\n }\n const deployOptions: DeployOptions = {\n remoteURL: options.remoteURL,\n name: options.name,\n owner: options.owner,\n watchTimeoutMinutes: options.watchTimeoutMinutes,\n useDedicatedHSMSimu: options.useDedicatedHSMSimu,\n useHTTPPolling: options.useHTTPPolling,\n ...(options.preset ? { preset: options.preset } : {}),\n ...(values ? { values } : {}),\n ...(options.expirationHours\n ? {\n expireOn: moment().add(options.expirationHours, \"hours\").toDate(),\n }\n : {}),\n };\n const { url } = await deploy(deployOptions, { logger });\n logger.info(\"Onboard it with:\");\n logger.info(`ledger-vault onboard --minivaultURL ${url}`);\n logger.info(\"Or directly bake it with:\");\n logger.info(`ledger-vault bake --preset beatles --minivaultURL ${url}`);\n};\n\nexport default {\n command: \"deploy\",\n description: \"Deploy a minivault instance on distant environment\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault deploy --name foo --owner bar\",\n `{grey $} ledger-vault deploy --name foo --owner bar --preset tezos --values '\\\\{ \"versions\": \\\\{ \"gate\": \"7.0.0\" \\\\} \\\\}'`,\n `{grey $} ledger-vault deploy --name foo --owner bar --expirationHours 4`,\n ],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Instance name (must be unique on cluster, lowercase alphanumeric + dash)\",\n required: true,\n },\n {\n name: \"owner\",\n description: \"Your name or squad name\",\n type: String,\n required: true,\n },\n {\n name: \"expirationHours\",\n description: \"How many hours the instance should live\",\n type: Number,\n required: false,\n defaultValue: 3,\n },\n {\n name: \"preset\",\n description: \"minivault preset to use\",\n type: String,\n },\n {\n name: \"values\",\n description: \"JSON values to override Helm values\",\n type: String,\n },\n {\n name: \"remoteURL\",\n description: `vault-remote URL {grey (default: ${DEFAULT_VAULT_REMOTE_URL})}`,\n type: String,\n defaultValue: DEFAULT_VAULT_REMOTE_URL,\n },\n {\n name: \"useDedicatedHSMSimu\",\n description: `Spawn and use a dedicated HSM simu with proper scripts version`,\n type: Boolean,\n defaultValue: false,\n },\n {\n name: \"useHTTPPolling\",\n description: `Use HTTP polling instead of Websocket to define if instance is ready (provide less details about deployment, but is more reliable)`,\n type: Boolean,\n defaultValue: false,\n },\n {\n name: \"watchTimeoutMinutes\",\n description: `Stop watching and throw after the given elapsed minutes {grey (default: 10)}`,\n type: Number,\n defaultValue: 10,\n },\n ],\n run: deployCommand,\n};\n","import { DEFAULT_VAULT_REMOTE_URL, DestroyOptions, destroy } from \"@ledgerhq/vault-common\";\n\nimport logger from \"../logger\";\n\ntype DestroyCommandOptions = {\n remoteURL: string;\n name: string;\n wait?: boolean;\n};\n\nexport const destroyCommand = async (options: DestroyCommandOptions): Promise<void> => {\n const destroyOptions: DestroyOptions = {\n remoteURL: options.remoteURL,\n name: options.name,\n wait: options.wait,\n };\n await destroy(destroyOptions, { logger });\n};\n\nexport default {\n command: \"destroy\",\n description: \"Destroy a deployed minivault instance on distant environment\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault destroy --name foo\"],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Instance name (must be unique on cluster)\",\n required: true,\n },\n {\n name: \"remoteURL\",\n description: `vault-remote URL {grey (default: ${DEFAULT_VAULT_REMOTE_URL})}`,\n type: String,\n defaultValue: DEFAULT_VAULT_REMOTE_URL,\n },\n\n {\n name: \"wait\",\n description:\n \"If passed, will exit command only once instance has completely disappeared from cluster\",\n type: Boolean,\n defaultValue: false,\n },\n ],\n run: destroyCommand,\n};\n","import { createDevicesPool } from \"@ledgerhq/vault-common\";\nimport { PoolOptions, UserContext } from \"@ledgerhq/vault-common\";\n\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport { GateOptions } from \"../types\";\n\nexport interface DrainOptions extends GateOptions {\n device: number;\n}\n\nexport default {\n command: \"drain\",\n description: \"Drain full gate data\",\n options: [deviceOption, ...gateOptions, ...lamOptions],\n run: async (opts: DrainOptions): Promise<void> => {\n const poolOptions: PoolOptions = {\n salt: opts.salt,\n gate: opts.gate,\n apiGateway: opts.apiGateway,\n transport: opts.transport,\n lamURL: opts.lam,\n deviceAPIURL: opts.deviceAPI,\n };\n\n const pool = createDevicesPool(poolOptions);\n\n // TODO ability to choose device\n /* istanbul ignore next */\n const admin = await pool.login(opts.device || 4);\n\n const data = await drainData(admin, [\n \"/_version\",\n \"/organization\",\n \"/people/me\",\n \"/people?pageSize=-1&role=ADMIN&role=OPERATOR\",\n \"/groups?pageSize=-1\",\n \"/whitelists?pageSize=-1\",\n \"/accounts?pageSize=-1\",\n \"/accounts/tx_rights?light=1\",\n \"/transactions?pageSize=-1\",\n \"/transactions/can_create_tx\",\n \"/requests?order=asc&pageSize=-1&status=PENDING_APPROVAL&status=PENDING_REGISTRATION\",\n ]);\n\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(data));\n },\n};\n\nconst drainData = async (user: UserContext, urls: string[]) => {\n const output = {};\n const pushToPromises = async (url: string) => {\n try {\n const res = await user.network(\"GET\", url);\n Object.assign(output, { [url]: res });\n } catch (e) {\n /* istanbul ignore next */\n // eslint-disable-next-line no-console\n console.error(e);\n }\n };\n await Promise.all(urls.map(pushToPromises));\n return output;\n};\n","import { createFaucet } from \"@ledgerhq/vault-common\";\n\nimport logger from \"../logger\";\n\nexport type FaucetOptions = {\n currency: string;\n amount: string;\n recipient: string;\n pralineBTCTestnetURL: string;\n};\n\nconst CURRENCIES = [\"bitcoin_testnet\"];\n\nexport default {\n command: \"faucet\",\n description: \"Send funds to accounts using mocked blockchains (e.g: praline)\",\n help: [\n {\n content: \"{grey $} ledger-vault faucet --currency bitcoin_testnet --amount 7 [options]\",\n },\n ],\n options: [\n {\n name: \"recipient\",\n alias: \"r\",\n description: \"Recipient\",\n type: String,\n required: true,\n },\n {\n name: \"currency\",\n alias: \"c\",\n description: `Available currencies: ${CURRENCIES.map((p) => `{yellow ${p}}`).join(\", \")}`,\n type: String,\n required: true,\n },\n {\n name: \"amount\",\n alias: \"a\",\n description: `Amount in base unit (e.g: 1 for \"1 BTC\")`,\n type: String,\n required: true,\n },\n {\n name: \"pralineBTCTestnetURL\",\n description:\n \"URL of Praline for BTC Testnet {blue $PRALINE_BTC_TESTNET_URL} {grey (default: https://localhost:8443/praline)}\",\n type: String,\n defaultValue: process.env.PRALINE_BTC_TESTNET_URL || \"https://localhost:8443/praline\",\n },\n ],\n run: async (options: FaucetOptions): Promise<void> => {\n const faucet = createFaucet({\n pralineBTCTestnetURL: options.pralineBTCTestnetURL,\n });\n const hash = await faucet({\n currency: options.currency,\n amount: options.amount,\n recipient: options.recipient,\n });\n logger.success(`Transaction success`);\n logger.info(`hash: ${hash}`);\n },\n};\n","import { PoolOptions, createDevicesPool } from \"@ledgerhq/vault-common\";\nimport fs from \"fs\";\n\nimport cliOptions from \"../cliOptions\";\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport { GateOptions } from \"../types\";\n\ntype FetchMethod = \"GET\" | \"POST\" | \"DELETE\";\n\nexport interface FetchOptions extends GateOptions {\n positionals: string[];\n device: number;\n method: FetchMethod;\n body: string;\n download?: string;\n}\n\nconst methodOption = {\n name: \"method\",\n type: String,\n description: \"REST method to use {grey (default: GET)}\",\n defaultValue: \"GET\",\n};\n\nconst downloadOption = {\n name: \"download\",\n type: String,\n description: \"Download the raw response to the given file path\",\n};\n\nconst bodyOption = {\n name: \"body\",\n type: String,\n description: \"JSON body to send with the request {grey (default: '\\\\{\\\\}')}\",\n defaultValue: \"{}\",\n};\n\nexport default {\n command: \"fetch\",\n positionals: true,\n description: \"Fetch given URL on gate with given device\",\n help: [\n {\n header: \"Examples\",\n content: ['{grey $} ledger-vault fetch \"/accounts?currency=stellar\" {bold --device} 5'],\n },\n ],\n options: [\n deviceOption,\n methodOption,\n bodyOption,\n downloadOption,\n ...gateOptions,\n ...lamOptions,\n ...cliOptions,\n ],\n run: async (options: FetchOptions): Promise<void> => {\n const {\n gate,\n apiGateway,\n salt,\n transport,\n device,\n method,\n body,\n positionals,\n networkDelay,\n readOnlyUser,\n download: downloadFile,\n } = options;\n\n const opts: PoolOptions = {\n gate,\n apiGateway,\n transport,\n salt,\n lamURL: options.lam,\n deviceAPIURL: options.deviceAPI,\n readOnlyUser,\n networkDelay,\n };\n\n const pool = createDevicesPool(opts);\n const admin = await pool.login(device);\n\n const url = positionals[0];\n if (!url) throw new Error(`No URL given`);\n const data = await admin.network(method, url, JSON.parse(body), { raw: !!downloadFile });\n\n if (downloadFile) {\n fs.writeFileSync(downloadFile, data as Buffer);\n // eslint-disable-next-line no-console\n console.log(`Downloaded to ${downloadFile}`);\n return;\n }\n\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(data));\n },\n};\n","import { genKeys } from \"@ledgerhq/vault-common/crypto-utils\";\n\nexport default {\n command: \"genKeys\",\n description: \"Generate API user keys\",\n options: [\n {\n name: \"entropy\",\n type: String,\n description: \"Deterministic entropy (if not passed, keys pair will be randomly generated)\",\n },\n ],\n run: (options: { entropy?: string }) => {\n const keys = genKeys(options.entropy);\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(keys, null, 2));\n },\n};\n","import {\n PoolOptions,\n createDevicesPool,\n createNetwork,\n getAuthTokens,\n} from \"@ledgerhq/vault-common\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport { GateOptions } from \"../types\";\n\nexport interface GetAPIUserTokensOptions extends GateOptions {\n username: string;\n workspace: string;\n}\n\nasync function getAPIUserTokens(options: GetAPIUserTokensOptions): Promise<void> {\n const opts: PoolOptions = {\n ...options,\n deviceAPIURL: options.deviceAPI,\n };\n const pool = createDevicesPool(opts);\n const admin = await pool.login(4);\n\n const apiNetwork = createNetwork({\n baseURL: options.apiGateway,\n });\n\n const payload = {\n type: \"CREATE_API_USER_ACCESS\",\n user_data: { username: options.username },\n };\n\n try {\n const request: any = await admin.post(\"/requests\", payload);\n const approvedReq: any = await admin.post(`/requests/${request.id}/post-create`, {});\n const { api_key_id, api_key_secret } = approvedReq;\n\n const { access_token: accessToken, refresh_token: refreshToken } = await getAuthTokens(\n apiNetwork,\n options.workspace,\n { api_key_id, api_key_secret },\n );\n console.log(JSON.stringify({ accessToken, refreshToken }));\n } catch (err) {\n // istanbul ignore next\n // @ts-expect-error\n console.log(`Error while getting API user tokens: ${err.toString()}`);\n }\n}\n\nexport default {\n command: \"getAPIUserTokens\",\n description: \"Regenerate and return API v2 credentials\",\n options: [\n ...cliOptions,\n ...gateOptions,\n {\n name: \"username\",\n type: String,\n description: \"API User's username\",\n required: true,\n },\n {\n name: \"workspace\",\n type: String,\n description: \"Workspace\",\n defaultValue: \"minivault\",\n },\n ],\n run: getAPIUserTokens,\n};\n","import { PoolOptions, createDevicesPool } from \"@ledgerhq/vault-common\";\n\nimport cliOptions from \"../cliOptions\";\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport { GateOptions } from \"../types\";\n\nexport interface GetAuthTokenOptions extends GateOptions {\n device: number;\n}\n\nasync function getAuthToken(options: GetAuthTokenOptions): Promise<void> {\n const opts: PoolOptions = {\n ...options,\n deviceAPIURL: options.deviceAPI,\n };\n const pool = createDevicesPool(opts);\n const admin = await pool.login(options.device);\n // eslint-disable-next-line no-console\n console.log(admin.getToken());\n}\n\nexport default {\n command: \"getAuthToken\",\n description: \"Login with given device and returns the authorization token\",\n options: [\n deviceOption,\n ...cliOptions,\n ...gateOptions,\n {\n name: \"deviceAPISessionID\",\n description: \"SessionID to send to device-api\",\n type: String,\n },\n ],\n run: getAuthToken,\n};\n","import { DEFAULT_VAULT_REMOTE_URL, MVInstance, getMVInstances } from \"@ledgerhq/vault-common\";\nimport { SILENT_LOGGER } from \"@ledgerhq/vault-utils\";\nimport Table from \"cli-table3\";\n\nimport logger from \"../logger\";\n\ntype Options = {\n remoteURL: string;\n format?: \"json\" | \"table\";\n};\n\nexport const getMVInstancesCommand = async (options: Options): Promise<void> => {\n const instances = await getMVInstances(\n { remoteURL: options.remoteURL },\n {\n logger: options.format === \"json\" ? SILENT_LOGGER : logger,\n },\n );\n if (options.format === \"table\") {\n displayMVInstancesTable(instances);\n } else {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(instances));\n }\n};\n\nexport default {\n command: \"getMVInstances\",\n description: \"Get list of instances running on vault-remote\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault getMVInstances\",\n \"{grey $} ledger-vault getMVInstances --remoteURL https://remote.minivault.ledger-sbx.com\",\n ],\n },\n ],\n options: [\n {\n name: \"remoteURL\",\n description: `vault-remote URL {grey (default: ${DEFAULT_VAULT_REMOTE_URL})}`,\n type: String,\n defaultValue: DEFAULT_VAULT_REMOTE_URL,\n },\n {\n name: \"format\",\n alias: \"f\",\n type: String,\n typeLabel: \"json\",\n description: \"Output format {grey (available: table, json)}\",\n defaultValue: \"table\",\n },\n ],\n run: getMVInstancesCommand,\n};\n\nexport const displayMVInstancesTable = (data: MVInstance[]): void => {\n const table = new Table({\n head: [\"name\", \"status\"],\n style: { head: [\"blue\", \"bold\"], border: [\"grey\"] },\n });\n table.push(...data.map((instance) => [instance.name, instance.status]));\n // eslint-disable-next-line no-console\n console.log(table.toString());\n};\n","import { genSeed } from \"@ledgerhq/vault-common\";\n\nexport default {\n command: \"getSeeds\",\n description: \"Get all seeds from a salt\",\n options: [\n {\n name: \"salt\",\n alias: \"s\",\n type: String,\n typeLabel: \"<salt>\",\n description: \"Salt used to generate devices seeds\",\n },\n ],\n help: [\n {\n content: \"{grey $} ledger-vault getSeeds --salt toto\",\n },\n ],\n run: (options: { salt: string }): void => {\n const { salt } = options;\n const devices = [\n {\n name: \"Wrapping Key 1\",\n index: 1,\n },\n {\n name: \"Wrapping Key 2\",\n index: 2,\n },\n {\n name: \"Wrapping Key 3\",\n index: 3,\n },\n {\n name: \"Admin 1\",\n index: 4,\n },\n {\n name: \"Admin 2\",\n index: 5,\n },\n {\n name: \"Admin 3\",\n index: 6,\n },\n {\n name: \"Shared-Owner 1\",\n index: 7,\n },\n {\n name: \"Shared-Owner 2\",\n index: 8,\n },\n {\n name: \"Shared-Owner 3\",\n index: 9,\n },\n {\n name: \"Operator 10\",\n index: 10,\n },\n {\n name: \"Operator 11\",\n index: 11,\n },\n {\n name: \"Operator 12\",\n index: 12,\n },\n {\n name: \"Operator 13\",\n index: 13,\n },\n {\n name: \"Operator 14\",\n index: 14,\n },\n {\n name: \"Operator 15\",\n index: 15,\n },\n {\n name: \"Operator 16\",\n index: 16,\n },\n ];\n\n devices.forEach((d) => {\n const seed = genSeed(salt, d.index);\n console.log(`${d.name}: ${seed}`); // eslint-disable-line\n });\n },\n};\n","import { PoolOptions, createDevicesPool } from \"@ledgerhq/vault-common\";\n\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport { GateOptions } from \"../types\";\n\nexport interface GetUserIDOptions extends GateOptions {\n device: number;\n}\n\nasync function getUserID(options: GetUserIDOptions): Promise<void> {\n const opts: PoolOptions = {\n ...options,\n deviceAPIURL: options.deviceAPI,\n };\n const pool = createDevicesPool(opts);\n const userID = await pool.getUserID(options.device);\n // eslint-disable-next-line no-console\n console.log(userID);\n}\n\nexport default {\n command: \"getUserID\",\n description: \"Returns the user ID of the given device\",\n options: [deviceOption, ...gateOptions],\n run: getUserID,\n};\n","import createHSMBridge from \"@ledgerhq/vault-common/createHSMBridge\";\n\nimport getCertFromPFX from \"../getCertFromPFX\";\nimport logger from \"../logger\";\n\nexport type Options = {\n hsm: string;\n hsmCert: string;\n hsmCertPassword: string;\n};\n\nexport default {\n command: \"initCompartment\",\n description: \"Init HSM simu compartment\",\n help: [\n {\n content: \"{grey $} ledger-vault initCompartment --hsm <hsm-endpoint>\",\n },\n ],\n options: [\n {\n name: \"hsm\",\n type: String,\n description: \"HSM endpoint {blue $VAULT_HSM_ENDPOINT}\",\n defaultValue: process.env.VAULT_HSM_ENDPOINT,\n required: true,\n },\n {\n name: \"hsmCert\",\n type: String,\n description: \"Path to HSM certificate {blue $VAULT_HSM_CLIENT_CERT_PATH}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PATH,\n required: true,\n },\n {\n name: \"hsmCertPassword\",\n type: String,\n description: \"HSM certificate password {blue $VAULT_HSM_CLIENT_CERT_PWD}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PWD,\n required: true,\n },\n ],\n run: async (options: Options): Promise<void> => {\n if (!options.hsmCert) {\n throw new Error(\n \"You must specify the path to your HSM certificate in your environment variable VAULT_HSM_CLIENT_CERT_PATH or use the --hsmCert flag\",\n );\n }\n\n const cert = await getCertFromPFX(options.hsmCert, options.hsmCertPassword);\n\n const bridge = createHSMBridge({\n hsmCert: cert.cert,\n hsmCertKey: cert.key,\n hsmEndpoint: options.hsm,\n });\n\n await bridge.initCompartment({ logger });\n },\n};\n","import { PoolOptions, createDevicesPool } from \"@ledgerhq/vault-common\";\n\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\n\n/* istanbul ignore file */\n\nconst notifierURLOption = {\n name: \"notifier\",\n alias: \"n\",\n defaultValue: \"http://localhost:5012\",\n description: \"Target vault-notifier url {grey (default: http://localhost:5012)}\",\n type: String,\n};\n\nexport interface ListenNotificationOptions extends GateOptions {\n device: number;\n notifier: string;\n}\n\nexport default {\n command: \"listen\",\n description: \"Listen to notifications broadcasted to user\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault listen {bold --device} 4\",\n \"{grey $} ledger-vault listen {bold --device} 4 --notifier $NOTIFIER_URL\",\n ],\n },\n ],\n options: [deviceOption, notifierURLOption, ...gateOptions],\n\n run: async (options: ListenNotificationOptions): Promise<void> => {\n const { gate, apiGateway, salt, device, notifier, transport } = options;\n const opts: PoolOptions = {\n gate,\n apiGateway,\n transport,\n salt,\n notifierURL: notifier,\n deviceAPIURL: options.deviceAPI,\n };\n const pool = createDevicesPool(opts, { logger });\n const user = await pool.login(device);\n await user.connectSocket();\n // eslint-disable-next-line no-console\n user.onEvent((event) => console.log(JSON.stringify(event)));\n\n // Avoid process.exit();\n return new Promise(() => null);\n },\n};\n","import { bakeManifest, createDevicesPool } from \"@ledgerhq/vault-common\";\nimport type { OnboardingStep } from \"@ledgerhq/vault-common\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport logger from \"../logger\";\nimport { REVAULT_ONBOARDING_OPTIONS, extractRevaultOnboardingOptions } from \"../revault-compat\";\nimport { CliOptions, GateOptions, LamOptions } from \"../types\";\n\nexport type OnboardOptions = CliOptions &\n GateOptions &\n LamOptions & {\n untilStep?: OnboardingStep;\n };\n\nexport const OnboardingSteps: OnboardingStep[] = [\n \"WRAPPING_KEYS_REGISTRATION\",\n \"ADMINS_REGISTRATION\",\n \"QUORUM_SETTINGS\",\n \"SHARED_OWNERS_REGISTRATION\",\n \"ADMIN_APPROVALS\",\n \"MASTER_SEED_GENERATION\",\n];\n\nexport default {\n command: \"onboard\",\n description: \"Onboard the workspace\",\n help: [\n {\n content: \"{grey $} ledger-vault onboard [options]\",\n },\n ],\n options: [\n ...REVAULT_ONBOARDING_OPTIONS,\n ...cliOptions,\n ...gateOptions,\n ...lamOptions,\n {\n name: \"untilStep\",\n alias: \"u\",\n type: String,\n description: `Stop just before this step (one of: ${OnboardingSteps.map(\n (n) => `{yellow ${n}}`,\n ).join(\", \")})`,\n defaultValue: \"\",\n },\n ],\n run: async (runOptions: OnboardOptions): Promise<void> => {\n const { untilStep, ...options } = runOptions;\n if (untilStep && !OnboardingSteps.includes(untilStep)) {\n throw new Error(\n `${untilStep} is not a valid step, must be one of: ${OnboardingSteps.join(\", \")}`,\n );\n }\n await bakeManifest(\n {},\n createDevicesPool({\n ...options,\n lamURL: options.lam,\n deviceAPIURL: options.deviceAPI,\n networkDelay: options.networkDelay,\n }),\n {\n logger,\n untilStep,\n revaultOnboarding: await extractRevaultOnboardingOptions(options),\n },\n );\n },\n};\n","import { createDevicesPool, createPledge, recipeManifest } from \"@ledgerhq/vault-common\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\n\nexport interface PledgeOpts extends GateOptions {\n account: string;\n exchange: string;\n amount: string;\n apiV2User: string;\n}\n\nasync function createPledgeIncrement(options: PledgeOpts): Promise<void> {\n const { exchange, amount, apiV2User } = options;\n\n const pool = createDevicesPool({\n ...options,\n deviceAPIURL: options.deviceAPI,\n });\n\n const recipe = await recipeManifest(pool);\n const { manifest, rawData } = recipe;\n\n /* istanbul ignore next */\n const account = manifest.accounts?.find((a) => a.name === options.account);\n\n if (!account) {\n throw new Error(`Account '${options.account}' not found`);\n }\n\n const myApiUser = manifest.users?.apiV2?.find((user) => user.name.includes(apiV2User));\n if (!myApiUser) {\n throw new Error(`No API V2 user found for ${apiV2User}`);\n }\n\n const pledgeData = {\n pool,\n account,\n accountsByName: rawData.accountsByName,\n exchange,\n amount,\n apiUser: myApiUser,\n gate: options.gate,\n apiGateway: options.apiGateway,\n };\n\n const pledgeResp = await createPledge(pledgeData, { logger });\n logger.info(pledgeResp);\n}\n\nexport default {\n command: \"pledge\",\n description: \"Create a pledge increment\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault pledge {bold --account} TL-0001-ETH-OOF-KOM {bold --exchange} Crypto.com {bold --amount} 1000 {bold --apiV2User} 10\",\n ],\n },\n ],\n options: [\n {\n name: \"account\",\n type: String,\n description: \"Sender account name\",\n required: true,\n },\n {\n name: \"exchange\",\n type: String,\n description: \"Pledge exchange name\",\n required: true,\n },\n {\n name: \"amount\",\n description: \"Amount to pledge in default unit (e.g in BTC for Bitcoin)\",\n type: String,\n required: true,\n },\n {\n name: \"apiV2User\",\n description: \"API V2 user name: will do a string search\",\n type: String,\n required: true,\n },\n ...gateOptions,\n ...cliOptions,\n ],\n run: createPledgeIncrement,\n};\n","import axios, { AxiosInstance } from \"axios\";\nimport bodyParser from \"body-parser\";\nimport chalk from \"chalk\";\nimport cors from \"cors\";\nimport express, { Router } from \"express\";\nimport fs from \"fs\";\nimport https from \"https\";\nimport path from \"path\";\nimport { URL } from \"url\";\n\nimport logger from \"../logger\";\n\ntype VaultConfig = {\n API_BASE_URL: string;\n DEVICE_REGISTRY_BASE_URL: string;\n WEBLUE_URL: string;\n SPECULOS_WEBLUE_URL: string;\n NOTIFIER_URL: string;\n APP_VERSION: string;\n ERC20_LIST: string;\n ENABLE_WEBLUE: boolean;\n ENABLE_SOFTWARE: boolean;\n ONLY_WEBLUE: boolean;\n};\n\nexport type ProxyOptions = {\n positionals: string[];\n};\n\nconst FRONT_URL = \"https://localhost:9000\";\n\nconst httpsAgent = new https.Agent({ rejectUnauthorized: false });\n\nconst createProxy = ({ port, host }: { port: number; host: string }) => {\n const app = express();\n app.disable(\"x-powered-by\");\n\n const register = (config: ProxyRouteRegisterConfig) => {\n const router = Router();\n const { url, route, name, raw, transformResponseHeaders, transformURL } = config;\n const proxifiedURL = `https://${host}${url}`;\n const network = axios.create({ baseURL: proxifiedURL, httpsAgent });\n router.all(\"*\", async (req, res) => {\n try {\n // @ts-ignore\n const method: \"POST\" | \"GET\" | \"DELETE\" = req.method;\n logger.info(`[${name}] ${method} ${req.url}`);\n req.headers.host = host;\n req.headers[\"Accept-Encoding\"] = \"gzip;q=0,deflate;q=0\";\n const r = await network({\n method,\n url: transformURL ? transformURL(req.url) : req.url,\n data: req.body,\n headers: req.headers,\n ...(raw\n ? {\n responseType: \"arraybuffer\",\n responseEncoding: \"binary\",\n }\n : {}),\n });\n if (raw) {\n // seems that content-length can be too small went directly sent by backend (maybe because of gzip?)\n // ensuring we don't truncate the event content with:\n r.headers[\"content-length\"] = Buffer.from(r.data).toString(\"utf8\").length;\n }\n if (transformResponseHeaders) {\n transformResponseHeaders(r.headers);\n }\n if (raw) {\n res.writeHead(200, r.headers);\n res.write(r.data);\n res.end();\n } else {\n res.set(r.headers);\n res.send(r.data);\n }\n } catch (err) {\n // @ts-expect-error\n if (err.response) {\n // @ts-expect-error\n return res.status(err.response.status).send(err.response.data);\n }\n // @ts-expect-error\n return res.status(500).send({ message: err.reason || \"Proxy error\" });\n }\n });\n\n logger.info(chalk`{magenta ${route}} {yellow.bold =>} ${proxifiedURL}`);\n app.use(route, router);\n };\n\n app.use(cors({ credentials: true, origin: FRONT_URL }));\n\n app.use(bodyParser.text());\n app.use(bodyParser.json());\n\n const listen = () => {\n const cert = getLocalhostSSLCert();\n const httpsServer = https.createServer(cert, app);\n httpsServer.listen(8443, () => {\n logger.success(`Proxy listening on port ${port}`);\n });\n };\n\n return { listen, register };\n};\n\nconst getLocalhostSSLCert = () => {\n try {\n if (!process.env[\"VAULT_WORKSPACE_DIR\"]) {\n throw new Error(\n \"Env var $VAULT_WORKSPACE_DIR is not defined. Check the Vault Guide: https://vault-guide.ldg-tech.com/\",\n );\n }\n const workspace = process.env[\"VAULT_WORKSPACE_DIR\"];\n const base = path.join(workspace, \"ledger-vault-front/certificate\");\n const cert = fs.readFileSync(path.join(base, \"localhost.crt\"), \"utf8\");\n const key = fs.readFileSync(path.join(base, \"localhost.key\"), \"utf8\");\n return { cert, key };\n } catch (err) {\n logger.error(\"Could not correctly parse cert files\");\n throw err;\n }\n};\n\n/* istanbul ignore file */\nasync function proxyCommand({ positionals }: ProxyOptions): Promise<void> {\n const [distantURL] = positionals;\n if (!distantURL) throw new Error(`No distant URL given`);\n const distantNetwork = axios.create({ baseURL: distantURL, httpsAgent });\n const host = new URL(distantURL).hostname;\n const config = await getDistantConfig(distantNetwork);\n\n const proxy = createProxy({ port: 8443, host });\n\n proxy.register({\n name: \"Gate\",\n route: \"/gate\",\n url: config.API_BASE_URL,\n transformResponseHeaders: transformGateHeaders,\n });\n\n proxy.register({\n name: \"Device registry\",\n route: \"/device-registry\",\n url: config.DEVICE_REGISTRY_BASE_URL,\n transformURL: (url) => url.replace(\"domain=localhost\", `domain=${host}`),\n });\n\n proxy.register({\n name: \"Device api WebSocket\",\n route: \"/device-api/socket.io\",\n url: \"/device-api/socket.io\",\n raw: true,\n });\n\n proxy.register({\n name: \"Device api\",\n route: \"/device-api\",\n url: \"/device-api\",\n });\n\n proxy.register({\n name: \"Platform manager\",\n route: \"/platform-manager\",\n url: \"/platform-manager\",\n });\n\n proxy.register({\n name: \"Vault notifier\",\n url: \"/notifier/socket.io\",\n route: config.NOTIFIER_URL,\n raw: true,\n });\n\n proxy.listen();\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const p: Promise<void> = new Promise(() => {});\n return p;\n}\n\ntype ProxyRouteRegisterConfig = {\n // used to describe what is proxified, e.g \"Gate\"\n name: string;\n // url to proxify. if it starts with \"/\", it will be prefixed by proxy host\n url: string;\n // route to serve on the proxy route\n route: string;\n // whether stuff needs to be raw parsed (not sure why we want this, have to dig)\n raw?: boolean;\n // some stuff that need to be documented\n transformURL?: (url: string) => string;\n // some stuff that need to be documented\n transformResponseHeaders?: (headers: Record<string, any>) => void;\n};\n\nconst transformGateHeaders = (headers: Record<string, any>) => {\n if (headers[\"set-cookie\"]) {\n headers[\"set-cookie\"] = headers[\"set-cookie\"].map((cookie: string) => {\n if (cookie.startsWith(\"ledger_workspace=\")) {\n return cookie.replace(\"Secure;\", \"\");\n }\n if (cookie.startsWith(\"ledger_token=\")) {\n return cookie.replace(/Domain=[^;]+/, \"Domain=localhost\").replace(\"Secure;\", \"\");\n }\n return cookie;\n });\n }\n};\n\nasync function getDistantConfig(network: AxiosInstance): Promise<VaultConfig> {\n const networkRes = await network({\n method: \"GET\",\n url: \"/config.js\",\n });\n\n const res: string = networkRes.data;\n // hacky way to retrieve the distant config\n // at least, it avoid us to use unsafe `eval()`\n const config = res.replace(\"window.config = \", \"\").replace(\";\", \"\");\n const result = config\n .trim()\n .split(\"\\n\")\n .map((line, i, lines) => {\n if (i === 0 || i === lines.length - 1) return line;\n // right hand can be an url so we need to join(\":\") it after\n const [property, ...value] = line.trim().split(\":\");\n line = `\"${property}\":${value.join(\":\")}`;\n // check if there's an extra ','\n if (i === lines.length - 2 && line[line.length - 1] === \",\") {\n line = line.slice(0, -1);\n }\n return line;\n })\n .join(\"\\n\");\n try {\n return JSON.parse(result);\n } catch {\n throw new Error(\"Invalid distant config.js file\");\n }\n}\n\nexport default {\n command: \"proxy\",\n positionals: true,\n description: \"Expose a distant gate/device-registry to localhost\",\n help: [\n {\n header: \"Usage\",\n content: [\"{grey $} ledger-vault proxy {blue <distant-url>}\"],\n },\n ],\n options: [],\n run: proxyCommand,\n};\n","import { createDevicesPool } from \"@ledgerhq/vault-common\";\nimport { Connection, DaemonAddress, GateAccount } from \"@ledgerhq/vault-common/types\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport { GateOptions } from \"../types\";\n\nexport interface ReceiveOptions extends GateOptions {\n account: string;\n index: number;\n}\n\nexport default {\n command: \"receive\",\n description: \"Display receive address for given account\",\n options: [\n {\n name: \"account\",\n alias: \"a\",\n description: \"Name of the account\",\n type: String,\n required: true,\n },\n {\n name: \"index\",\n alias: \"i\",\n description: \"Address index {grey (default: 0)}\",\n type: Number,\n defaultValue: 0,\n },\n ...gateOptions,\n ...lamOptions,\n ...cliOptions,\n ],\n run: async (options: ReceiveOptions): Promise<void> => {\n const { account: accountName, index } = options;\n const pool = createDevicesPool({\n ...options,\n lamURL: options.lam,\n deviceAPIURL: options.deviceAPI,\n });\n const admin = await pool.login(4);\n const accountsURL = `/accounts?name=${accountName}`;\n const accounts = await admin.network<Connection<GateAccount>>(\"GET\", accountsURL);\n const account = accounts.edges.find((e) => e.node.name === accountName);\n if (!account) {\n throw new Error(`No account matching name \"${accountName}\"`);\n }\n const freshAddressesURL = `/accounts/${account.node.id}/fresh_addresses`;\n const freshAddresses = await admin.network<DaemonAddress[]>(\"GET\", freshAddressesURL);\n const address = freshAddresses[index];\n if (!address) {\n throw new Error(`No fresh address available at index ${index}`);\n }\n // eslint-disable-next-line no-console\n console.log(address.address);\n },\n};\n","import { createDevicesPool, recipeManifest } from \"@ledgerhq/vault-common\";\nimport prettier from \"prettier\";\n\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport { GateOptions } from \"../types\";\n\nexport type RecipeOptions = GateOptions & {\n saveAccountsIndexes?: boolean;\n saveAccountsTypes?: boolean;\n};\n\nexport default {\n command: \"recipe\",\n description: \"Build a manifest from a gate\",\n help: [\n {\n content: \"{grey $} ledger-vault recipe [options]\",\n },\n ],\n options: [\n ...gateOptions,\n ...lamOptions,\n {\n name: \"saveAccountsTypes\",\n defaultValue: false,\n description: \"If passed, will store the accountType into each account\",\n type: Boolean,\n },\n {\n name: \"saveAccountsIndexes\",\n defaultValue: false,\n description: \"If passed, will store account index into each account\",\n type: Boolean,\n },\n ],\n run: async (options: RecipeOptions): Promise<void> => {\n const { saveAccountsIndexes, saveAccountsTypes, ...opts } = options;\n const data = await recipeManifest(\n createDevicesPool({\n ...opts,\n lamURL: options.lam,\n deviceAPIURL: options.deviceAPI,\n }),\n { saveAccountsIndexes, saveAccountsTypes },\n );\n const stringified = JSON.stringify(data.manifest);\n const formatted = prettier.format(stringified, { parser: \"json\" });\n // eslint-disable-next-line no-console\n console.log(formatted.trim());\n },\n};\n","import { DevicesPool, GateUser, createDevicesPool, recipeManifest } from \"@ledgerhq/vault-common\";\nimport {\n Connection,\n GateGenericRequest,\n UserWithDevice,\n reviewAPIRequest,\n} from \"@ledgerhq/vault-common\";\nimport { ReviewAPIRequestOptions } from \"@ledgerhq/vault-common/api-request\";\n\nimport cliOptions from \"../cliOptions\";\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport lamOptions from \"../lamOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\n\nexport interface RejectOptions extends GateOptions {\n device: number | \"lam\";\n requestID?: number;\n all?: boolean;\n apiV2User?: string;\n}\n\nconst runReject = async (options: RejectOptions): Promise<void> => {\n const { all, requestID, apiV2User } = options;\n\n if (!all && !requestID) {\n // eslint-disable-next-line no-console\n console.log(\"Usage: ledger-vault reject --all\");\n // eslint-disable-next-line no-console\n console.log(\"Usage: ledger-vault reject --requestID 1303\");\n return;\n }\n const pool = createDevicesPool({\n ...options,\n deviceAPIURL: options.deviceAPI,\n });\n\n const isTransactionRequest = (request: GateGenericRequest) =>\n request.type === \"CREATE_TRANSACTION\";\n\n const isMessageSigningRequest = (request: GateGenericRequest) =>\n request.type === \"MESSAGE_SIGNING\";\n\n const isPledgeRequest = (request: GateGenericRequest) =>\n request.type === \"CREATE_PLEDGE_INCREMENT\";\n\n const admin = await pool.login(options.device);\n const requestsConnection = await admin.network<Connection<GateGenericRequest>>(\n \"GET\",\n \"/requests?meta_status=PENDING&pageSize=-1\",\n );\n // we need the requests array in both --all and --requestID cases\n // because in the case of --requestID we have to check if request is a tx request\n const requests: GateGenericRequest[] = requestsConnection.edges.map((elt) => elt.node);\n const hasPendingTransactions = requests.some(isTransactionRequest);\n\n // we need the manifest in order to get usersWithDevice array when we\n // want to reject tx request (admins can't reject tx)\n // opti: we don't want to recipe full manifest when no pending tx request exist\n let usersWithDevice: UserWithDevice[] = [];\n if (hasPendingTransactions) {\n const manifestFromGate = await recipeManifest(pool);\n usersWithDevice = manifestFromGate.rawData.usersWithDevice;\n }\n\n if (all) {\n // istanbul ignore next\n if (requests.length === 0) return;\n logger.info(\"Rejecting all pending requests\");\n const pool = createDevicesPool({\n ...options,\n deviceAPIURL: options.deviceAPI,\n });\n\n for (const request of requests) {\n // today only transaction and pledge are creatable by API V2 user\n if (\n (isTransactionRequest(request) ||\n isPledgeRequest(request) ||\n isMessageSigningRequest(request)) &&\n request.created_by\n ) {\n const approver = findApprover(request);\n /* istanbul ignore if */\n if (!approver) {\n throw new Error(`No approver found for request ${request.id}`);\n }\n if (approver.device_type === \"API\") {\n await rejectTransactionRequestAPIV2({\n pool,\n gate: options.gate,\n apiGateway: options.apiGateway,\n requestID: request.id,\n apiV2UserName: approver.username,\n skipDecodeChallenge: isMessageSigningRequest(request),\n });\n } else {\n await rejectTransactionRequest({ pool, request, usersWithDevice, approver });\n }\n } else {\n await admin.rejectRequest(request.id);\n }\n logger.success(`Rejected request ${request.id}: ${request.type}`);\n }\n } else if (requestID) {\n const request = requests.find((request) => request.id === requestID);\n if (!request) throw new Error(`Couldn't find request ${requestID}`);\n if (apiV2User) {\n await rejectTransactionRequestAPIV2({\n pool,\n gate: options.gate,\n apiGateway: options.apiGateway,\n requestID,\n apiV2UserName: apiV2User,\n skipDecodeChallenge: isMessageSigningRequest(request),\n });\n return;\n }\n if (isTransactionRequest(request) && request.created_by) {\n await rejectTransactionRequest({ pool, request, usersWithDevice });\n } else {\n await admin.rejectRequest(request.id);\n }\n logger.success(`Rejected request ${request.id}: ${request.type}`);\n }\n};\n\nexport default {\n command: \"reject\",\n description: \"Reject specific request or all request\",\n options: [\n ...gateOptions,\n ...lamOptions,\n ...cliOptions,\n deviceOption,\n {\n name: \"all\",\n description: \"Reject all pending request\",\n type: Boolean,\n },\n {\n name: \"requestID\",\n description: \"Reject a specific request\",\n type: Number,\n },\n {\n name: \"apiV2User\",\n description: \"API V2 user name\",\n type: String,\n },\n ],\n run: runReject,\n};\n\nexport const findApprover = (request: GateGenericRequest): GateUser | undefined => {\n const approvalSteps = request.approvals_steps || [];\n const approvalCount = request.approvals?.length || 0;\n let quorumToCheck = 0;\n for (let currentStep = 0; currentStep < approvalSteps.length; currentStep++) {\n const step = approvalSteps[currentStep];\n // istanbul ignore next\n quorumToCheck += step?.quorum || 0;\n\n if (approvalCount < quorumToCheck) {\n /* istanbul ignore next */\n return step?.group.members[step?.group.members.length - (quorumToCheck - approvalCount)];\n }\n }\n return undefined;\n};\n\nexport const rejectTransactionRequest = async ({\n pool,\n request,\n usersWithDevice,\n approver,\n}: {\n pool: DevicesPool;\n request: GateGenericRequest;\n usersWithDevice: UserWithDevice[];\n approver?: GateUser;\n}): Promise<void> => {\n let user = usersWithDevice.find(\n (ud) => request.created_by && ud.user.id === request.created_by.id,\n );\n if (approver) {\n user = usersWithDevice.find((ud) => ud.user.id === approver.id);\n }\n if (!user) throw new Error(`Couldn't find user who created request ${request.id}`);\n const deviceIndex = user.deviceIndex;\n const operator = await pool.login(deviceIndex);\n await operator.rejectRequest(request.id);\n};\n\nexport const rejectTransactionRequestAPIV2 = async ({\n pool,\n gate,\n apiGateway,\n requestID,\n apiV2UserName,\n skipDecodeChallenge,\n}: {\n pool: DevicesPool;\n gate: string;\n apiGateway: string;\n requestID: number;\n apiV2UserName: string;\n skipDecodeChallenge: boolean;\n}): Promise<void> => {\n const recipe = await recipeManifest(pool);\n const { manifest } = recipe;\n /* istanbul ignore next */\n const myApiUser = manifest.users?.apiV2?.find((user) => user.name.includes(apiV2UserName));\n if (!myApiUser) {\n throw new Error(`No API V2 user found for ${apiV2UserName}`);\n }\n const approvalApiRequestData: ReviewAPIRequestOptions = {\n pool,\n requestID,\n apiUser: myApiUser,\n gate,\n apiGateway,\n reviewType: \"REJECT\",\n skipDecodeChallenge,\n };\n\n await reviewAPIRequest(approvalApiRequestData, {\n logger,\n });\n};\n","import createHSMBridge from \"@ledgerhq/vault-common/createHSMBridge\";\n\nimport getCertFromPFX from \"../getCertFromPFX\";\nimport logger from \"../logger\";\n\nexport type Options = {\n compartment: number;\n hsm: string;\n hsmCert: string;\n hsmCertPassword: string;\n};\n\nexport default {\n command: \"resetCompartment\",\n description: \"Reset HSM simu compartment\",\n help: [\n {\n content: \"{grey $} ledger-vault resetCompartment --cid 123\",\n },\n ],\n options: [\n {\n name: \"compartment\",\n alias: \"c\",\n type: Number,\n description: \"HSM compartment ID {blue $VAULT_COMPARTMENT_ID}\",\n defaultValue: process.env.VAULT_COMPARTMENT_ID,\n required: true,\n },\n {\n name: \"hsm\",\n type: String,\n description: \"HSM endpoint {blue $VAULT_HSM_ENDPOINT}\",\n defaultValue: process.env.VAULT_HSM_ENDPOINT,\n required: true,\n },\n {\n name: \"hsmCert\",\n type: String,\n description: \"Path to HSM certificate {blue $VAULT_HSM_CLIENT_CERT_PATH}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PATH,\n required: true,\n },\n {\n name: \"hsmCertPassword\",\n type: String,\n description: \"HSM certificate password {blue $VAULT_HSM_CLIENT_CERT_PWD}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PWD,\n required: true,\n },\n ],\n run: async (options: Options): Promise<void> => {\n if (!options.hsmCert) {\n throw new Error(\n \"You must specify the path to your HSM certificate in your environment variable VAULT_HSM_CLIENT_CERT_PATH or use the --hsmCert flag\",\n );\n }\n\n const cert = await getCertFromPFX(options.hsmCert, options.hsmCertPassword);\n\n const bridge = createHSMBridge({\n hsmCert: cert.cert,\n hsmCertKey: cert.key,\n hsmEndpoint: options.hsm,\n });\n\n await bridge.resetCompartment(options.compartment, { logger });\n\n // eslint-disable-next-line no-console\n logger.success(\"Compartment has been reset\");\n },\n};\n","import createHSMBridge from \"@ledgerhq/vault-common/createHSMBridge\";\nimport fs from \"fs\";\n\nimport getCertFromPFX from \"../getCertFromPFX\";\nimport logger from \"../logger\";\n\nexport type Options = {\n compartment: number;\n hsm: string;\n hsmCert: string;\n hsmCertPassword: string;\n backupFile: string;\n};\n\nexport default {\n command: \"restoreCompartment\",\n description: \"Restore HSM simu compartment\",\n help: [\n {\n content: \"{grey $} ledger-vault restoreCompartment --cid 123 --backupFile backup.json\",\n },\n ],\n options: [\n {\n name: \"compartment\",\n alias: \"c\",\n type: Number,\n description: \"HSM compartment ID {blue $VAULT_COMPARTMENT_ID}\",\n defaultValue: process.env.VAULT_COMPARTMENT_ID,\n required: true,\n },\n {\n name: \"backupFile\",\n alias: \"b\",\n type: String,\n description: \"Location of the backup file (output of ledger-vault backupCompartment)\",\n required: true,\n },\n {\n name: \"hsm\",\n type: String,\n description: \"HSM endpoint {blue $VAULT_HSM_ENDPOINT}\",\n defaultValue: process.env.VAULT_HSM_ENDPOINT,\n required: true,\n },\n {\n name: \"hsmCert\",\n type: String,\n description: \"Path to HSM certificate {blue $VAULT_HSM_CLIENT_CERT_PATH}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PATH,\n required: true,\n },\n {\n name: \"hsmCertPassword\",\n type: String,\n description: \"HSM certificate password {blue $VAULT_HSM_CLIENT_CERT_PWD}\",\n defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PWD,\n required: true,\n },\n ],\n run: async (options: Options): Promise<void> => {\n if (!options.hsmCert) {\n throw new Error(\n \"You must specify the path to your HSM certificate in your environment variable VAULT_HSM_CLIENT_CERT_PATH or use the --hsmCert flag\",\n );\n }\n\n const cert = await getCertFromPFX(options.hsmCert, options.hsmCertPassword);\n\n const bridge = createHSMBridge({\n hsmCert: cert.cert,\n hsmCertKey: cert.key,\n hsmEndpoint: options.hsm,\n });\n\n const fileContent = fs.readFileSync(options.backupFile, \"utf-8\");\n const backup = JSON.parse(fileContent);\n\n await bridge.restoreCompartment(options.compartment, backup, { logger });\n },\n};\n","import { createDevicesPool } from \"@ledgerhq/vault-common\";\n\nimport deviceOption from \"../deviceOption\";\nimport gateOptions from \"../gateOptions\";\nimport logger from \"../logger\";\nimport type { GateOptions } from \"../types\";\n\nexport type RevokeOptions = GateOptions & {\n command: \"user\" | \"group\";\n device: number;\n id: number;\n noApproval: boolean;\n};\n\nexport const revokeEntity = async (opts: RevokeOptions): Promise<void> => {\n const pool = createDevicesPool({\n ...opts,\n deviceAPIURL: opts.deviceAPI,\n });\n const userDevice = await pool.login(opts.device);\n\n let request: any;\n if (opts.command === \"user\") {\n logger.info(`Revoking user ${opts.id}`);\n request = await userDevice.post(\"/requests\", { type: \"REVOKE_USER\", user_id: opts.id });\n }\n\n if (opts.command === \"group\") {\n logger.info(`Revoking group ${opts.id}`);\n request = await userDevice.post(\"/requests\", { type: \"REVOKE_GROUP\", group_id: opts.id });\n }\n\n if (opts.noApproval) return;\n\n logger.info(\"Approving request...\");\n // load admin devices in cache - needed for `pool.runWithQuorum()`\n await pool.getOnboardingAdminDevices();\n /* istanbul ignore next */\n await pool.runWithQuorum((admin) => admin.approveRequest(request));\n};\n\nexport default {\n command: \"revoke\",\n description: \"Revoke user or group\",\n options: [\n ...gateOptions,\n deviceOption,\n {\n name: \"noApproval\",\n type: Boolean,\n description: \"Create the request without approving it\",\n },\n ],\n subCommands: [\n {\n command: \"user\",\n description: \"Revoke user\",\n options: [\n {\n name: \"id\",\n type: Number,\n description: \"User ID\",\n required: true,\n },\n ],\n run: revokeEntity,\n },\n {\n command: \"group\",\n description: \"Revoke group\",\n options: [\n {\n name: \"id\",\n type: Number,\n description: \"Group ID\",\n required: true,\n },\n ],\n run: revokeEntity,\n },\n ],\n};\n","import {\n FeesLevel,\n GateTransactionType,\n ManifestAccount,\n createDevicesPool,\n feesLevels,\n recipeManifest,\n send,\n} from \"@ledgerhq/vault-common\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\nimport { displayTable } from \"../utils\";\n\nexport interface SendOpts extends GateOptions {\n noApproval: boolean;\n strategy?: string;\n account: string;\n recipient: string;\n amount: string;\n feesLevel: FeesLevel;\n gasPrice?: string;\n gasLimit?: string;\n contractPayload?: string;\n txType: GateTransactionType;\n title?: string;\n comment?: string;\n}\n\nasync function sendTransaction(options: SendOpts): Promise<void> {\n const { feesLevel, gasPrice, gasLimit } = options;\n if (!feesLevels.includes(feesLevel)) {\n throw new Error(\n `Fees level should be one of the following ${feesLevels\n .map((feesLevel) => feesLevel)\n .join(\", \")}`,\n );\n }\n\n if (feesLevel === \"CUSTOM\" && (!gasPrice || !gasLimit)) {\n throw new Error(\"Gas price and gas limit are required when using custom fees\");\n }\n\n const pool = createDevicesPool({\n ...options,\n deviceAPIURL: options.deviceAPI,\n });\n\n const recipe = await recipeManifest(pool);\n const { manifest, rawData } = recipe;\n\n if (!manifest.accounts) {\n throw new Error(\"No accounts found\");\n }\n\n const account = manifest.accounts.find((a) => a.name === options.account);\n\n if (!account) {\n throw new Error(`Account '${options.account}' not found`);\n }\n\n const transaction = {\n account: options.account,\n recipient: options.recipient,\n amount: options.amount,\n transactionType: options.txType,\n feesLevel: options.feesLevel,\n gasLimit: options.gasLimit,\n gasPrice: options.gasPrice,\n title: options.title,\n comment: options.comment,\n };\n\n if (options.strategy) {\n Object.assign(transaction, {\n utxosPickingStrategy: options.strategy,\n });\n }\n\n if (options.contractPayload) {\n if (!contractPayloadSupported(account)) {\n throw new Error(\"Option --contractPayload can only be used with ethereum accounts\");\n }\n Object.assign(transaction, {\n contractPayload: options.contractPayload,\n });\n }\n\n const sendPayload = {\n pool,\n transaction,\n account,\n groups: manifest.groups,\n accountsByName: rawData.accountsByName,\n whitelistsByName: rawData.whitelistsByName,\n noApproval: options.noApproval,\n };\n\n const tx = await send(sendPayload, { logger });\n\n displayTable(\n {\n edges: [{ cursor: tx.id, node: tx }],\n pageInfo: {\n count: 1,\n hasNextPage: false,\n },\n },\n \"TRANSACTION\",\n );\n}\n\nconst contractPayloadSupported = (account: ManifestAccount) => {\n return (\n \"currency\" in account &&\n [\"ethereum\", \"ethereum_ropsten\", \"ethereum_goerli\", \"polygon\", \"bsc\"].includes(account.currency)\n );\n};\n\nexport default {\n command: \"send\",\n description: \"Create a transaction\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault send {bold --account} accountName {bold --recipient} address {bold --amount} 2\",\n ],\n },\n ],\n options: [\n {\n name: \"account\",\n type: String,\n description: \"Sender account name\",\n required: true,\n },\n {\n name: \"recipient\",\n description: \"Address of the recipient\",\n type: String,\n defaultValue: \"\", // intended to not make it `required` because some transaction types does not need recipient (e.g: UNDELEGATE)\n },\n {\n name: \"amount\",\n description: \"Amount in default unit (e.g in BTC for Bitcoin)\",\n type: String,\n defaultValue: \"0\",\n },\n {\n name: \"feesLevel\",\n description: \"Fees level (SLOW|NORMAL|FAST|CUSTOM)\",\n type: String,\n defaultValue: \"NORMAL\",\n },\n {\n name: \"gasPrice\",\n description:\n \"Gas price for your transaction. Only used with {blue --feesLevel} set to CUSTOM\",\n type: String,\n },\n {\n name: \"gasLimit\",\n description:\n \"Gas limit for your transaction. Only used with {blue --feesLevel} set to CUSTOM\",\n type: String,\n },\n {\n name: \"noApproval\",\n type: Boolean,\n description: \"Create the transaction without approving it\",\n },\n {\n name: \"strategy\",\n type: String,\n description: \"Strategy to use to pick utxo (MERGE_OUTPUTS|DEEP_OUTPUTS_FIRST|OPTIMIZE_SIZE)\",\n },\n {\n name: \"contractPayload\",\n type: String,\n description: \"Raw hex smart-contract input (only for Ethereum account types)\",\n },\n {\n name: \"txType\",\n type: String,\n defaultValue: \"SEND\",\n description: \"Transaction type (SEND|RECEIVE|PREBURN|BURN|MINT|DELEGATE|UNDELEGATE)\",\n },\n {\n name: \"title\",\n type: String,\n description: \"Transaction title\",\n },\n {\n name: \"comment\",\n type: String,\n description: \"Transaction note comment\",\n },\n ...gateOptions,\n ...cliOptions,\n ],\n run: sendTransaction,\n};\n","import { bakeManifest, createDevicesPool } from \"@ledgerhq/vault-common\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\n\nexport interface SetQuorumOptions extends GateOptions {\n positionals: string[];\n}\n\nexport default {\n command: \"setQuorum\",\n positionals: true,\n description: \"Set the admin quorum\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault setQuorum {bold 5}\"],\n },\n ],\n options: [...gateOptions, ...cliOptions],\n run: async (options: SetQuorumOptions): Promise<void> => {\n const { gate, apiGateway, transport, salt, positionals, networkDelay } = options;\n\n const quorum = Number(positionals[0]);\n const pool = createDevicesPool({\n gate,\n apiGateway,\n salt,\n transport,\n networkDelay,\n deviceAPIURL: options.deviceAPI,\n });\n\n await bakeManifest({ quorum }, pool, { logger });\n },\n};\n","import { createDevicesPool, createSettlement, recipeManifest } from \"@ledgerhq/vault-common\";\n\nimport cliOptions from \"../cliOptions\";\nimport gateOptions from \"../gateOptions\";\nimport logger from \"../logger\";\nimport { GateOptions } from \"../types\";\n\nexport interface SettlementOpts extends GateOptions {\n account: string;\n exchange: string;\n percentage: number;\n apiV2User: string;\n}\n\nasync function settle(options: SettlementOpts): Promise<void> {\n const { exchange, percentage, apiV2User } = options;\n\n if (percentage > 100) {\n throw new Error(`Invalid percentage '${percentage}', please choose a value between 0 and 100'`);\n }\n const pool = createDevicesPool({\n ...options,\n deviceAPIURL: options.deviceAPI,\n });\n\n const recipe = await recipeManifest(pool);\n const { manifest, rawData } = recipe;\n\n /* istanbul ignore next */\n const account = manifest.accounts?.find((a) => a.name === options.account);\n\n if (!account) {\n throw new Error(`Account '${options.account}' not found`);\n }\n\n const myApiUser = manifest.users?.apiV2?.find((user) => user.name.includes(apiV2User));\n if (!myApiUser) {\n throw new Error(`No API V2 user found for ${apiV2User}`);\n }\n\n const settlementData = {\n pool,\n account,\n accountsByName: rawData.accountsByName,\n exchange,\n percentage,\n apiUser: myApiUser,\n gate: options.gate,\n apiGateway: options.apiGateway,\n };\n\n const settleResp = await createSettlement(settlementData, { logger });\n logger.info(settleResp);\n}\n\nexport default {\n command: \"settle\",\n description: \"Create a settlement\",\n help: [\n {\n header: \"Examples\",\n content: [\n \"{grey $} ledger-vault settle {bold --account} TL-0001-ETH-OOF-KOM {bold --exchange} Crypto.com {bold --percentage} 50 {bold --apiV2User} 10\",\n ],\n },\n ],\n options: [\n {\n name: \"account\",\n type: String,\n description: \"Sender account name\",\n required: true,\n },\n {\n name: \"exchange\",\n type: String,\n description: \"Pledge exchange name\",\n required: true,\n },\n {\n name: \"percentage\",\n description: \"Percentage amount to pledge (0-100)\",\n type: Number,\n required: true,\n },\n {\n name: \"apiV2User\",\n description: \"API V2 user name: will do a string search\",\n type: String,\n required: true,\n },\n ...gateOptions,\n ...cliOptions,\n ],\n run: settle,\n};\n","import {\n DEFAULT_VAULT_REMOTE_URL,\n HelmValues,\n UpgradeOptions,\n upgrade,\n} from \"@ledgerhq/vault-common\";\n\nimport logger from \"../logger\";\n\ntype UpgradeCommandOptions = {\n name: string;\n preset?: string;\n values?: string;\n watchTimeoutMinutes?: number;\n remoteURL: string;\n};\n\nexport const upgradeCommand = async (options: UpgradeCommandOptions): Promise<void> => {\n let values: HelmValues | null = null;\n if (options.values) {\n values = JSON.parse(options.values) as HelmValues;\n }\n const upgradeOptions: UpgradeOptions = {\n remoteURL: options.remoteURL,\n name: options.name,\n watchTimeoutMinutes: options.watchTimeoutMinutes,\n ...(options.preset ? { preset: options.preset } : {}),\n ...(values ? { values } : {}),\n };\n await upgrade(upgradeOptions, { logger });\n};\n\nexport default {\n command: \"upgrade\",\n description: \"Upgrade a minivault instance deployed by vault-remote\",\n help: [\n {\n header: \"Examples\",\n content: [\"{grey $} ledger-vault upgrade --name foo --preset release-4.20\"],\n },\n ],\n options: [\n {\n name: \"name\",\n type: String,\n description: \"Name of the instance to target\",\n required: true,\n },\n {\n name: \"preset\",\n description: \"If passed, will upgrade to those preset values\",\n type: String,\n },\n {\n name: \"values\",\n description: \"JSON values to override Helm values\",\n type: String,\n },\n {\n name: \"remoteURL\",\n description: `vault-remote URL {grey (default: ${DEFAULT_VAULT_REMOTE_URL})}`,\n type: String,\n defaultValue: DEFAULT_VAULT_REMOTE_URL,\n },\n {\n name: \"watchTimeoutMinutes\",\n description: `Stop watching and throw after the given elapsed minutes {grey (default: 10)}`,\n type: Number,\n defaultValue: 10,\n },\n ],\n run: upgradeCommand,\n};\n","import commandAPDU from \"./apdu\";\nimport commandApprove from \"./approve\";\nimport commandBackupCompartment from \"./backupCompartment\";\nimport commandBake from \"./bake\";\nimport commandBridge from \"./bridge\";\nimport commandConfigCat from \"./configcat\";\nimport commandCreate from \"./create\";\nimport commandDeploy from \"./deploy\";\nimport commandDestroy from \"./destroy\";\nimport commandDrain from \"./drain\";\nimport commandFaucet from \"./faucet\";\nimport commandFetch from \"./fetch\";\nimport commandGenKeys from \"./genKeys\";\nimport commandGet from \"./get\";\nimport commandGetAPIUserTokens from \"./getAPIUserTokens\";\nimport commandGetAuthToken from \"./getAuthToken\";\nimport commandGetMVInstances from \"./getMVInstances\";\nimport commandGetSeeds from \"./getSeeds\";\nimport commandGetUserID from \"./getUserID\";\nimport commandInitCompartment from \"./initCompartment\";\nimport commandListen from \"./listen\";\nimport commandOnboard from \"./onboard\";\nimport commandPlege from \"./pledge\";\nimport commandProxy from \"./proxy\";\nimport commandReceive from \"./receive\";\nimport commandRecipe from \"./recipe\";\nimport commandReject from \"./reject\";\nimport commandResetCompartment from \"./resetCompartment\";\nimport commandRestoreCompartment from \"./restoreCompartment\";\nimport commandRevoke from \"./revoke\";\nimport commandSend from \"./send\";\nimport commandSetQuorum from \"./setQuorum\";\nimport commandSettle from \"./settle\";\nimport commandUpgrade from \"./upgrade\";\nimport commandWipe from \"./wipe\";\n\n// TODO\n// improve help https://github.com/75lb/command-line-usage/wiki/How-to-add-an-examples-section-to-your-usage-guide\n\nconst help = [\n {\n header: \"ledger-vault\",\n content: [\n \"A various utility command-line for Vault development.\",\n \"\",\n \"usage: ledger-vault <command> [options]\",\n ],\n },\n];\n\nconst options = [\n {\n name: \"debug\",\n type: Boolean,\n description: \"Print debug messages\",\n },\n {\n name: \"version\",\n alias: \"v\",\n type: Boolean,\n description: \"Show version\",\n },\n {\n name: \"help\",\n alias: \"h\",\n type: Boolean,\n description: \"Show help\",\n },\n];\n\nexport default {\n help,\n options,\n subCommands: [\n commandOnboard,\n commandBake,\n commandRecipe,\n commandWipe,\n commandDeploy,\n commandUpgrade,\n commandDestroy,\n commandCreate,\n commandSetQuorum,\n commandGet,\n commandFetch,\n commandFaucet,\n commandGetAuthToken,\n commandGetAPIUserTokens,\n commandGetUserID,\n commandInitCompartment,\n commandResetCompartment,\n commandBackupCompartment,\n commandRestoreCompartment,\n commandListen,\n commandGetSeeds,\n commandGenKeys,\n commandDrain,\n commandSend,\n commandReceive,\n commandPlege,\n commandSettle,\n commandProxy,\n commandBridge,\n commandApprove,\n commandReject,\n commandRevoke,\n commandAPDU,\n commandGetMVInstances,\n commandConfigCat,\n ],\n};\n","import TransportNodeHID from \"@ledgerhq/hw-transport-node-hid\";\nimport { registerTransportModule } from \"@ledgerhq/live-common-stub/lib/hw\";\n\n/* istanbul ignore next */\nregisterTransportModule({\n id: \"nodehid\",\n disconnect: () => null,\n open: (id: string) => {\n if (id !== \"nodehid\") return;\n const transport = TransportNodeHID.create();\n return transport;\n },\n});\n"],"mappings":"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","names":["chalk","chalk","options","options","user","request","cert","options","bridge","createDevicesPool","fs","options","wipeOptions","options","fs","createDevicesPool","createDevicesPool","createDevicesPool","chalk","options","chalk","bakeManifest","createDevicesPool","createDevicesPool","fs","fs","options","createDevicesPool","createDevicesPool","bakeManifest","options","DEFAULT_VAULT_REMOTE_URL","options","DEFAULT_VAULT_REMOTE_URL","createDevicesPool","createDevicesPool","options","createDevicesPool","fs","options","createDevicesPool","fs","options","createDevicesPool","options","createDevicesPool","createDevicesPool","options","createDevicesPool","DEFAULT_VAULT_REMOTE_URL","Table","options","DEFAULT_VAULT_REMOTE_URL","Table","options","createDevicesPool","options","createDevicesPool","createHSMBridge","options","bridge","createHSMBridge","createDevicesPool","options","createDevicesPool","bakeManifest","createDevicesPool","options","bakeManifest","createDevicesPool","createDevicesPool","recipeManifest","options","createDevicesPool","recipeManifest","bodyParser","chalk","cors","express","fs","express","chalk","cors","bodyParser","fs","createDevicesPool","options","createDevicesPool","createDevicesPool","recipeManifest","options","recipeManifest","createDevicesPool","createDevicesPool","recipeManifest","reviewAPIRequest","options","createDevicesPool","recipeManifest","pool","request","reviewAPIRequest","createHSMBridge","options","bridge","createHSMBridge","createHSMBridge","fs","options","bridge","createHSMBridge","fs","createDevicesPool","createDevicesPool","createDevicesPool","recipeManifest","options","feesLevel","createDevicesPool","recipeManifest","bakeManifest","createDevicesPool","options","createDevicesPool","bakeManifest","createDevicesPool","recipeManifest","options","createDevicesPool","recipeManifest","DEFAULT_VAULT_REMOTE_URL","options","DEFAULT_VAULT_REMOTE_URL","help","options","chalk","cmd","chalk"]}