@ledgerhq/vault-common 2.2.4 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
 
2
- > @ledgerhq/vault-common@2.2.4 build /home/runner/work/vault-ts/vault-ts/packages/common
2
+ > @ledgerhq/vault-common@2.3.0 build /home/runner/work/vault-ts/vault-ts/packages/common
3
3
  > tsup
4
4
 
5
5
  CLI Building entry: src/createHSMBridge.ts, src/index.ts, src/recipeManifest.ts, src/reviewAPIRequest.ts, src/utils.ts, src/crypto/utils.ts, src/types/index.ts
@@ -9,39 +9,39 @@
9
9
  CLI Target: es2022
10
10
  CLI Cleaning output folder
11
11
  CJS Build start
12
+ DTS Build start
12
13
  CJS lib/createHSMBridge.js 331.00 B
13
14
  CJS lib/crypto/utils.js 335.00 B
14
15
  CJS lib/types/index.js 329.00 B
15
- CJS lib/index.js 120.29 KB
16
+ CJS lib/index.js 121.00 KB
16
17
  CJS lib/chunk-R5RZM7VO.js 3.52 KB
17
18
  CJS lib/recipeManifest.js 349.00 B
18
19
  CJS lib/chunk-UE4JXAYM.js 17.80 KB
19
20
  CJS lib/reviewAPIRequest.js 365.00 B
20
- CJS lib/chunk-5KTWGTUF.js 37.27 KB
21
+ CJS lib/chunk-MV3B246A.js 37.63 KB
21
22
  CJS lib/chunk-QH2K2MDV.js 3.39 KB
22
23
  CJS lib/utils.js 1.20 KB
23
24
  CJS lib/chunk-6NGBW7BG.js 29.85 KB
24
25
  CJS lib/chunk-3L2XDBZ2.js 8.65 KB
25
- CJS lib/chunk-PBYMPTCY.js 396.00 B
26
+ CJS lib/chunk-66ODLOZL.js 396.00 B
26
27
  CJS lib/chunk-PZ5AY32C.js 314.00 B
27
28
  CJS lib/createHSMBridge.js.map 293.00 B
28
29
  CJS lib/crypto/utils.js.map 281.00 B
29
30
  CJS lib/types/index.js.map 269.00 B
30
- CJS lib/index.js.map 178.14 KB
31
+ CJS lib/index.js.map 179.10 KB
31
32
  CJS lib/chunk-R5RZM7VO.js.map 6.86 KB
32
33
  CJS lib/recipeManifest.js.map 288.00 B
33
34
  CJS lib/chunk-UE4JXAYM.js.map 36.53 KB
34
35
  CJS lib/reviewAPIRequest.js.map 308.00 B
35
- CJS lib/chunk-5KTWGTUF.js.map 71.12 KB
36
+ CJS lib/chunk-MV3B246A.js.map 71.66 KB
36
37
  CJS lib/chunk-QH2K2MDV.js.map 5.19 KB
37
38
  CJS lib/utils.js.map 398.00 B
38
39
  CJS lib/chunk-6NGBW7BG.js.map 55.76 KB
39
40
  CJS lib/chunk-3L2XDBZ2.js.map 20.30 KB
40
- CJS lib/chunk-PBYMPTCY.js.map 52.44 KB
41
+ CJS lib/chunk-66ODLOZL.js.map 52.52 KB
41
42
  CJS lib/chunk-PZ5AY32C.js.map 479.00 B
42
- CJS ⚡️ Build success in 858ms
43
- DTS Build start
44
- DTS ⚡️ Build success in 11058ms
43
+ CJS ⚡️ Build success in 904ms
44
+ DTS ⚡️ Build success in 11987ms
45
45
  DTS lib/createHSMBridge.d.ts 952.00 B
46
46
  DTS lib/index.d.ts 12.96 KB
47
47
  DTS lib/reviewAPIRequest.d.ts 836.00 B
@@ -49,4 +49,4 @@
49
49
  DTS lib/crypto/utils.d.ts 428.00 B
50
50
  DTS lib/recipeManifest.d.ts 704.00 B
51
51
  DTS lib/types/index.d.ts 5.86 KB
52
- DTS lib/index-CfKTZ-yG.d.ts 68.05 KB
52
+ DTS lib/index-BDY859J4.d.ts 68.18 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @ledgerhq/vault-common
2
2
 
3
+ ## 2.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - ce5c522: feat: add the possibility to create account with policy
8
+
9
+ ## 2.2.5
10
+
11
+ ### Patch Changes
12
+
13
+ - e420c9b: fix(trc20): add missing tron/trc20 to types
14
+
3
15
  ## 2.2.4
4
16
 
5
17
  ### Patch Changes
@@ -11,4 +11,4 @@ var feesLevels = ["SLOW", "NORMAL", "FAST", "CUSTOM"];
11
11
 
12
12
 
13
13
  exports.GateGroupRequestTypeDefs = GateGroupRequestTypeDefs; exports.feesLevels = feesLevels;
14
- //# sourceMappingURL=chunk-PBYMPTCY.js.map
14
+ //# sourceMappingURL=chunk-66ODLOZL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-PBYMPTCY.js","../src/types/index.ts"],"names":[],"mappings":"AAAA;ACwoCO,IAAM,yBAAA,EAA2B;AAAA,EACtC,cAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA;AAqVO,IAAM,WAAA,EAAa,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAA;AD19C7D;AACA;AACE;AACA;AACF,6FAAC","file":"/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-PBYMPTCY.js","sourcesContent":[null,"import { RecordStore } from \"@ledgerhq/hw-transport-mocker\";\nimport { CryptoCurrency, TokenCurrency } from \"@ledgerhq/types-cryptoassets\";\nimport { Logger } from \"@ledgerhq/vault-utils\";\nimport { BigNumber } from \"bignumber.js\";\nimport { Socket } from \"socket.io-client\";\n\nimport { Device } from \"../device/types\";\nimport {\n DataAccount,\n DataExchange,\n DataGroup,\n DataPolicy,\n DataVaultEntity,\n DataWhitelist,\n} from \"../prepareRequest\";\nimport { RecipeManifestResult } from \"../recipeManifest\";\nimport { CardanoBalances } from \"./cardano\";\nimport { PolkadotAccountData } from \"./polkadot\";\n\nexport * from \"./cardano\";\n\nexport type UserContext = {\n network: Network;\n getToken: () => string | null;\n run: (interactions: Interaction<any>[], data: any) => Promise<any>;\n get: <T>(url: string, requestOptions?: any) => Promise<T>;\n post: <T>(url: string, payload: any) => Promise<T>;\n approveRequest: (payload: any) => Promise<any>;\n approveRequestWithoutHSM: (payload: any) => Promise<any>;\n rejectRequest: (requestID: number) => Promise<any>;\n connectSocket: () => Promise<typeof Socket>;\n onEvent: (cb: (event: VaultEvent) => void) => void;\n};\n\nexport type RawUser = {\n entityType: \"USER\";\n name: string;\n role: \"admin\" | \"operator\";\n device: number;\n};\n\nexport type RawGroup = {\n entityType: \"GROUP\";\n name: string;\n users: number[];\n description?: string;\n};\n\nexport type RawAccount = {\n entityType: \"ACCOUNT\";\n name: string;\n currency: string;\n derivationMode?: string;\n};\n\nexport type RawWhiteList = {\n entityType: \"WHITELIST\";\n name: string;\n description?: string;\n addresses: string[];\n};\n\nexport type RawEntity = RawUser | RawAccount | RawGroup | RawWhiteList;\n\nexport type EntityType =\n | \"USER\"\n | \"GROUP\"\n | \"ACCOUNT\"\n | \"WHITELIST\"\n | \"TRANSACTION\"\n | \"EXCHANGE\"\n | \"POLICY\"\n | \"VAULT_ENTITY\";\n\nexport type TransportType = \"software\" | \"speculos-web\" | \"nodehid\" | \"nodehid-replayer\";\n\nexport type DevicesPoolOptions = {\n salt?: string;\n gate: string;\n apiGateway?: string;\n overrideSeeds?: string[];\n deviceAPIURL?: string;\n notifierURL?: string;\n readOnlyUser?: string;\n transport?: TransportType;\n recordStore?: RecordStore | null;\n psdModel?: PsdModel;\n\n // see VFE-1010\n deviceAPISessionID?: string;\n};\n\nexport type LamOptions = {\n lamURL?: string;\n lamAPIKey?: string;\n};\n\nexport type CliOptions = {\n networkDelay?: number;\n};\n\nexport type PoolOptions = DevicesPoolOptions & LamOptions & CliOptions;\n\nexport type UserContextRunnable = (context: UserContext) => any;\n\nexport type DeployOptions = {\n // vault-remote URL\n remoteURL?: string;\n // name of the instance, will be used for namespace creation & domain registration\n name: string;\n // who is deploying\n owner: string;\n // default is `main`\n preset?: string;\n // expiration date\n expireOn?: Date;\n // arbitrary helm values to pass\n values?: HelmValues;\n // elapsed minutes before deploy throw an error\n watchTimeoutMinutes?: number;\n // spawn a dedicated HSM simu\n useDedicatedHSMSimu?: boolean;\n // use HTTP polling instead of socket to check instance status\n useHTTPPolling?: boolean;\n};\n\nexport type UpgradeOptions = {\n // vault-remote URL\n remoteURL?: string;\n // name of the instance to target\n name: string;\n // will upgrade to values defined in the preset\n preset?: string;\n // arbitrary helm values to pass\n values?: HelmValues;\n // elapsed minutes before deploy throw an error\n watchTimeoutMinutes?: number;\n};\n\nexport type DestroyOptions = {\n // vault-remote URL\n remoteURL?: string;\n // name of the instance\n name: string;\n // wether we should wait for instance to completely disappear\n wait?: boolean;\n};\n\nexport type HelmValue =\n | string\n | number\n | boolean\n | undefined\n | null\n | Array<HelmValue>\n | HelmValues;\n\nexport interface HelmValues {\n [x: string]: HelmValue;\n}\n\nexport type DevicesPool = {\n getRevaultCompatOptions: () => {\n workspace: string;\n deviceApiUrl: string;\n salt: string;\n };\n workspace: string;\n gate: string;\n apiGateway: string | undefined;\n network: Network;\n psdModel: PsdModel;\n login: (deviceIndex: number | string) => Promise<UserContext>;\n getUserID: (deviceIndex: number) => Promise<string>;\n bruteforceDeviceIndex: (userID: string) => Promise<number>;\n setSalt: (salt: string) => void;\n registerDevice: (deviceIndex: number, request: any) => Promise<any>;\n lamAPI: {\n createInvitation: (invitationID: string) => Promise<{ device_id: string }>;\n registerUser: (name: string, uuid: string) => Promise<void>;\n };\n runWithDevice: (deviceIndex: number, interactions: Interaction<any>[], data: any) => Promise<any>;\n runWithQuorum: (iteratee: UserContextRunnable) => Promise<any>;\n device: Device;\n interactions: Interactions;\n getOnboardingAdminDevices: () => Promise<AdminDevice[]>;\n};\n\nexport type ConnectionEdge<T> = {\n cursor: number;\n node: T;\n};\n\nexport type Connection<T> = {\n edges: ConnectionEdge<T>[];\n pageInfo: {\n hasNextPage: boolean;\n count: number;\n };\n};\n\ntype GateEntityWithRequest = Extract<GateEntity, { last_request?: any }>;\n\nexport interface GateEditWorkspaceRuleRequest extends GateGenericRequest {\n type: \"EDIT_WORKSPACE_RULE\";\n target_type: \"WORKSPACE_RULE\";\n workspace_rule: GateWorkspaceRule;\n request_data: {\n steps: GateWorkspaceRuleStep[];\n };\n}\n\nexport type GateRequest =\n | NonNullable<GateEntityWithRequest[\"last_request\"]>\n | GateAPIV2UserAccessRequest\n | GateEditWorkspaceRuleRequest\n | GateOrganizationRequest\n | GateActivateRequest;\n\nexport type GateRequestType = GateRequest[\"type\"];\n\nexport type GateEntity =\n | GateAPIKey\n | GateAccount\n | GateExchange\n | GateExchange\n | GateGroup\n | GateMessage\n | GatePolicy\n | GateSCIConfig\n | GateTransaction\n | GateUser\n | GateVaultEntity\n | GateWhitelist\n | GatePledgeIncrement\n | GateWorkspaceRule\n | GateRepledge\n | GateForcedUnpledge\n | GateDigestGroup\n | GateTransfer\n | GateTradelink\n | GateTradelinkExchange\n | GateTradelinkAssetManager;\n\nexport type GatePledgeIncrement = {\n id: number;\n status: \"PENDING\" | \"SUBMITTED\";\n account_id: number;\n data: {\n amount: string;\n };\n last_request?: GatePledgeIncrementRequest;\n};\nexport type GateRepledge = {\n id: number;\n status: \"PENDING\" | \"SUBMITTED\";\n account_id: number;\n data: {\n pledge_id: number;\n settlement_id: string;\n account_name: string;\n exchange_name: string;\n amount: string;\n currency: string;\n };\n last_request?: GateRepledgeRequest;\n};\n\nexport type GateForcedUnpledge = {\n id: number;\n status: \"PENDING\" | \"SUBMITTED\";\n account_id: number;\n data: {\n pledge_id: number;\n account_name: string;\n currency: string;\n exchange_name: string;\n };\n pledge_id: string;\n last_request?: GateForcedUnpledgeRequest;\n};\n\nexport type TradelinkNetwork = {\n id: string;\n custodian: GateTradelinkThirdParty<\"CUSTODIAN\">;\n asset_managers: GateTradelinkThirdParty<\"ASSET_MANAGER\">[];\n exchanges: GateTradelinkThirdParty<\"EXCHANGE\">[];\n};\nexport type GateTradelink = {\n id: number;\n status: \"PENDING\" | \"SUBMITTED\" | \"ACTIVE\" | \"ABORTED\";\n hsm_groups: {\n arbitration_groups: GateGroup[];\n settlement_groups: GateGroup[];\n withdraw_groups: GateGroup[];\n };\n network: TradelinkNetwork;\n\n last_request?: GateTradelinkRequest;\n};\n\ntype TradelinkInternalGroup = {\n quorum: number;\n users: Array<{ id: number; pub_key: string; username: string }>;\n};\ntype TradelinkInternalWhitelist = {\n id: number;\n addresses: Array<Omit<GateAddress, \"id\">>;\n};\n\nexport type GateTradelinkExchange = {\n id: number;\n status: \"PENDING\" | \"SUBMITTED\" | \"ACTIVE\" | \"ABORTED\";\n last_request?: GateTradelinkExchangeRequest;\n is_under_edit: boolean;\n network: TradelinkNetwork;\n network_data: TradelinkNetwork[\"exchanges\"][number];\n front_data: {\n pledge_approval_group: TradelinkInternalGroup;\n settlement_creator_group: TradelinkInternalGroup;\n whitelist: TradelinkInternalWhitelist;\n };\n hsm_data: {\n name: string;\n pledge_approval_group: {\n id: number;\n quorum: number;\n users: string[]; // array of public keys\n };\n settlement_creator_group: {\n id: number;\n quorum: number;\n users: string[]; // array of public keys\n };\n };\n};\n\nexport type GateTradelinkAssetManager = {\n id: number;\n status: \"PENDING\" | \"SUBMITTED\" | \"ACTIVE\" | \"ABORTED\";\n last_request?: GateTradelinkAssetManagerRequest;\n is_under_edit: boolean;\n network: TradelinkNetwork;\n network_data: TradelinkNetwork[\"asset_managers\"][number];\n front_data: {\n pledge_creator_group: TradelinkInternalGroup;\n settlement_approval_group: TradelinkInternalGroup;\n whitelist: TradelinkInternalWhitelist;\n };\n hsm_data: {\n name: string;\n pledge_creator_group: {\n id: number;\n quorum: number;\n users: string[]; // array of public keys\n };\n settlement_approval_group: {\n id: number;\n quorum: number;\n users: string[]; // array of public keys\n };\n };\n};\n\nexport type GateDeviceType = \"API\" | \"PSD\" | \"SOFT_PSD\";\n\nexport type GateUser = {\n id: number;\n entityType: \"USER\";\n is_api?: boolean;\n view_all_override?: boolean;\n pub_key: string;\n username: string;\n user_id: string;\n picture?: string;\n created_on: string;\n status: string;\n email?: string;\n role: \"ADMIN\" | \"OPERATOR\";\n last_request?: GateUserRequest;\n device_type: GateDeviceType;\n app_version?: string;\n};\n\nexport type GateAPIKey = {\n id: number;\n secret?: string;\n entityType: \"VAULT_API_KEY\";\n name: string;\n created_on: string;\n updated_on: string;\n status:\n | \"PENDING_APPROVAL\"\n | \"APPROVED\"\n | \"ACTIVE\"\n | \"SUSPENDED\"\n | \"PENDING_REVOCATION\"\n | \"REVOKED\"\n | \"ABORTED\";\n entities: GateVaultEntity[];\n scopes: Record<string, any>;\n identifier: string;\n last_request?: GateAPIKeyRequest;\n};\n\nexport type GateTransfer = {\n id: number;\n amount: string;\n network: string | null;\n recipient: string;\n status: \"PENDING\" | \"APPROVED\" | \"SUBMITTED\" | \"ABORTED\";\n last_request: GateTransferRequest;\n};\n\nexport type GateSCIConfig = {\n id: number;\n entityType: \"SCI_CONFIG\";\n account: Omit<GateAccount, \"sci_config\">;\n sciconfig: {\n dapps: string[];\n custom_contract_call_enabled: boolean;\n };\n status: \"PENDING\" | \"ACTIVE\";\n last_request?: GateSCIConfigRequest;\n};\n\ntype MessageType = \"EIP191\" | \"EIP712\";\n\nexport type GateMessage = {\n account_id: number;\n data: string | Record<string, any>;\n id: number;\n message_type: MessageType;\n signature: string | null;\n der_signature: string | null;\n status: \"PENDING_APPROVAL\" | \"APPROVED\" | \"SIGNED\" | \"ABORTED\";\n type: \"MESSAGE_SIGNING_ALLOWED\";\n entityType: \"MESSAGE_SIGNING\";\n created_on?: string;\n notes: GateTransactionNote[];\n last_request?: GateMessageRequest;\n};\n\nexport type AdminDevice = [username: string, index: number];\n\nexport type GateGroup = {\n id: number;\n name: string;\n entityType: \"GROUP\";\n created_on: string;\n created_by: GateUser;\n description?: string;\n status: \"ACTIVE\" | \"PENDING\" | \"REVOKED\" | \"ABORTED\" | \"TO_MIGRATE\";\n is_internal: boolean;\n members: GateUser[];\n is_under_edit: boolean;\n last_request?: GateGroupRequest;\n is_tradelink?: boolean;\n};\n\ntype GateDigestSignature = {\n der: string;\n r: number;\n s: number;\n v: number | null;\n pub_key: string;\n};\n\ntype GateDigest = {\n digest: string;\n derivation_path: string;\n signature?: GateDigestSignature;\n index?: number;\n};\n\nexport type GateDigestGroup = {\n id: number;\n last_request?: GateDigestsRequest;\n account_id: number;\n created_by: GateUser;\n created_on: string;\n digests_data: GateDigest[];\n // todo check final status with gate\n status: \"PENDING_APPROVAL\" | \"APPROVED\";\n};\n\nexport type UTXOsPickingStrategy = \"MERGE_OUTPUTS\" | \"DEEP_OUTPUTS_FIRST\" | \"OPTIMIZE_SIZE\";\n\nexport type GateFees = {\n gas_price: string;\n gas_limit: string;\n fees_per_byte: string;\n fees: string;\n utxo_picking_strategy?: UTXOsPickingStrategy;\n storage_limit?: number;\n};\n\nexport type GateFeesEIP1559 = {\n base_fees: string;\n gas_limit: string;\n max_fees: string;\n max_fees_buffer_factor: string;\n priority_fees: string;\n};\n\nexport type AccountType =\n | \"Ethereum\"\n | \"Bitcoin\"\n | \"Erc20\"\n | \"Bep20\"\n | \"Ripple\"\n | \"Stellar\"\n | \"Tezos\"\n | \"Solana\"\n | \"Cardano\"\n | \"Polkadot\"\n | \"Tron\"\n | \"Trc20\";\n\nexport type AccountStatus =\n | \"PENDING_CREATE_IN_HSM\"\n | \"PENDING\"\n | \"APPROVED\"\n | \"PENDING_VIEW_ONLY\"\n | \"ACTIVE\"\n | \"VIEW_ONLY\"\n | \"PENDING_ACTIVATION\"\n | \"ABORTED\"\n | \"ACTIVATION_ABORTED\";\n\nexport type Unit = {\n name: string;\n code: string;\n magnitude: number;\n};\n\ntype AccountSettings = {\n id: number;\n fiat: string;\n currency_unit: Unit;\n unitIndex: number;\n blockchain_explorer: string;\n};\n\nexport type GateRuleMultiAuthStep = { quorum: number; group: GateGroup };\n\nexport type GateRuleMultiAuth = {\n type: \"MULTI_AUTHORIZATIONS\";\n data: GateRuleMultiAuthStep[];\n};\n\nexport type GateRuleThreshold = {\n type: \"THRESHOLD\";\n data: [\n {\n currency_type: \"CRYPTO\";\n max: string | null;\n min: string | null;\n },\n ];\n};\n\nexport type GateRuleWhitelist = {\n type: \"WHITELIST\";\n data: GateWhitelist[];\n};\n\nexport type GateRuleSCI = {\n type: \"SMART_CONTRACT_INTERACTION\";\n data: [{ enabled: boolean }];\n};\n\ntype GateRuleTransactionFilterPreset =\n | \"TEZOS_DELEGATION\"\n | \"POLKADOT_STAKING\"\n | \"DEPLOY_CONTRACT\"\n | \"SOLANA_STAKING\"\n | \"CARDANO_STAKING\"\n | \"RAW_SIGNING\"\n | \"SEND\"\n | \"MESSAGE_SIGNING\"\n | \"CREATE_SPL_TOKEN_ACCOUNT\"\n | \"TRANSFER_SPL_TOKEN\"\n | \"STAKE\";\n\nexport type GateRuleTransactionFilter = {\n type: \"TRANSACTION_FILTER\";\n data:\n | { preset: Exclude<GateRuleTransactionFilterPreset, \"TRANSFER_SPL_TOKEN\"> }\n | { preset: \"TRANSFER_SPL_TOKEN\"; contract_address: string };\n};\n\nexport type GateGovernanceRule =\n | GateRuleMultiAuth\n | GateRuleThreshold\n | GateRuleWhitelist\n | GateRuleSCI\n | GateRuleTransactionFilter;\n\nexport type GateGovernanceRulesSet = {\n name: string;\n rules: GateGovernanceRule[];\n};\n\nexport type WeirdGateRuleMultiAuthStep =\n | { quorum: number; group_id: number }\n | { quorum: number; users: number[] };\n\nexport type WeirdGateRuleMultiAuth = {\n type: \"MULTI_AUTHORIZATIONS\";\n data: WeirdGateRuleMultiAuthStep[];\n};\n\nexport type WeirdGateRuleThreshold = {\n type: \"THRESHOLD\";\n data: [\n {\n currency_type: \"CRYPTO\";\n // *just* when creating threshold, `max` is optional and can't be null\n max?: string;\n min: string | null;\n },\n ];\n};\n\nexport type WeirdGateRuleWhitelist = {\n type: \"WHITELIST\";\n data: number[];\n};\n\nexport type WeirdGateGovernanceRule =\n | WeirdGateRuleMultiAuth\n | WeirdGateRuleThreshold\n | GateRuleSCI\n | GateRuleTransactionFilter\n | WeirdGateRuleWhitelist;\n\nexport type WeirdGateGovernanceRulesSet = {\n name: string;\n rules: WeirdGateGovernanceRule[];\n};\n\nexport type GateLabel = {\n id: number;\n name: string;\n info: {\n color: string;\n description: string;\n };\n};\n\nexport type GateAccountCommon = {\n id: number;\n account_type: AccountType;\n entityType: \"ACCOUNT\";\n address?: string;\n contract_address: string;\n name: string;\n settings: AccountSettings;\n balance: any; //Bignumber\n available_balance: any; //Bignumber\n currency: string;\n parent_balance?: any; //Bignumber\n has_access_to_parent: boolean | null;\n created_on: string;\n governance_rules: GateGovernanceRulesSet[] | null;\n next_governance_rules: GateGovernanceRulesSet[] | null;\n fresh_addresses: any;\n nfts_gallery_enabled?: boolean;\n is_hsm_coin_app_updated: boolean;\n is_under_edit: boolean;\n index: number;\n status: AccountStatus;\n xpub: string;\n parent: number | null;\n derivation_path: string;\n labels: GateLabel[];\n extended_public_key: {\n public_key: string;\n chain_code: string;\n };\n derivation_mode: \"STANDARD\" | \"NATIVE_SEGWIT\";\n entity_id?: number;\n last_request?: GateAccountRequest;\n is_tradelink?: boolean;\n tradelink_data?: GateAccountTradelinkData;\n synced_on: string | null;\n last_sync_requested_at: string | null;\n policy?: GatePolicy;\n is_raw_signing_account?: boolean;\n};\n\nexport interface GateAccountExchangeOptions {\n auto_repledge_enabled: boolean;\n requires_pre_approval: boolean;\n}\nexport interface GateAccountTradelinkData {\n asset_manager: GateTradelinkAssetManager;\n custodian: GateTradelinkThirdParty<\"CUSTODIAN\">;\n exchanges: Array<GateTradelinkExchange & GateAccountExchangeOptions>;\n total_repledge: string;\n}\n\nexport interface GateAccountEthereum extends GateAccountCommon {\n account_type: \"Ethereum\";\n sci_config: GateSCIConfig | null;\n ethereum_data?: {\n staking?: {\n total_staking: string;\n total_rewards: string;\n available_rewards: string;\n network_apy: string;\n };\n };\n}\n\nexport interface GateTradelinkThirdParty<T extends \"CUSTODIAN\" | \"ASSET_MANAGER\" | \"EXCHANGE\"> {\n code: string;\n id: string;\n logo_url: string | null;\n name: string;\n role: T;\n}\n\nexport interface GateTradelinkRequest extends GateGenericRequest {\n tradelink: GateTradelink;\n type: \"CREATE_TRADELINK\" | \"EDIT_TRADELINK\";\n target_type: \"TRADELINK\";\n edit_data?: {\n operators: string[]; // pub_keys\n };\n}\n\nexport interface GateTradelinkExchangeRequest extends GateGenericRequest {\n tradelink: GateTradelinkExchange;\n type: \"CREATE_TRADELINK_EXCHANGE\" | \"EDIT_TRADELINK_EXCHANGE\";\n target_type: \"TRADELINK_EXCHANGE\";\n tradelink_exchange: GateTradelinkExchange;\n edit_data?: {\n operators: string[]; // pub_keys\n addresses: Array<Omit<GateAddress, \"id\">>;\n };\n}\n\nexport interface GateTradelinkAssetManagerRequest extends GateGenericRequest {\n tradelink: GateTradelinkAssetManager;\n type: \"CREATE_TRADELINK_ASSET_MANAGER\" | \"EDIT_TRADELINK_ASSET_MANAGER\";\n target_type: \"TRADELINK_ASSET_MANAGER\";\n tradelink_asset_manager: GateTradelinkAssetManager;\n edit_data?: {\n operators: string[]; // pub_keys\n addresses: Array<Omit<GateAddress, \"id\">>;\n };\n}\n\nexport type SPLToken = {\n token_name: string;\n associated_token_account: string;\n account_name: string;\n contract_address: string;\n available: string;\n pending: string;\n status: \"ACTIVE\" | \"INACTIVE\" | \"VIEW_ONLY\";\n ticker: string;\n creation_transaction_hash: string;\n parent_id: number;\n};\n\nexport interface GateAccountBitcoin extends GateAccountCommon {\n account_type: \"Bitcoin\";\n}\nexport interface GateAccountTRC20 extends GateAccountCommon {\n account_type: \"Trc20\";\n parent_available_balance: BigNumber;\n}\nexport interface GateAccountERC20 extends GateAccountCommon {\n account_type: \"Erc20\";\n parent_available_balance: BigNumber;\n}\nexport interface GateAccountRipple extends GateAccountCommon {\n account_type: \"Ripple\";\n}\nexport interface GateAccountStellar extends GateAccountCommon {\n account_type: \"Stellar\";\n}\nexport interface GateAccountTezos extends GateAccountCommon {\n account_type: \"Tezos\";\n}\nexport interface GateAccountSolana extends GateAccountCommon {\n account_type: \"Solana\";\n solana_data?: {\n tokens?: SPLToken[];\n can_create_spl_token_accounts: boolean;\n };\n}\nexport interface GateAccountCardano extends GateAccountCommon {\n account_type: \"Cardano\";\n cardano_data: {\n balances: CardanoBalances;\n };\n}\nexport interface GateAccountTron extends GateAccountCommon {\n account_type: \"Tron\";\n tron_data: {\n available: number;\n bandwidth: number;\n energy: number;\n pending: number;\n total: number;\n };\n}\n\nexport interface GateAccountPolkadot extends GateAccountCommon {\n account_type: \"Polkadot\";\n polkadot_data: PolkadotAccountData;\n}\n\nexport type GateAccount =\n | GateAccountEthereum\n | GateAccountBitcoin\n | GateAccountERC20\n | GateAccountTRC20\n | GateAccountStellar\n | GateAccountTezos\n | GateAccountSolana\n | GateAccountPolkadot\n | GateAccountRipple\n | GateAccountCardano\n | GateAccountTron;\n\nexport type GateVaultEntityStatus = \"PENDING\" | \"ACTIVE\" | \"ABORTED\" | \"REVOKED\" | \"TO_MIGRATE\";\n\nexport type GateWorkspacePermission = \"ROOT\" | \"CREATE_ACCOUNT_WITH_POLICY\";\n\nexport type GateWorkspaceRuleStep = {\n quorum: number;\n users: string[]; // array of public keys\n};\n\nexport type GateWorkspaceRule = {\n id: number;\n permission: GateWorkspacePermission;\n status: \"ACTIVE\";\n steps: GateWorkspaceRuleStep[];\n\n // Gate will never serialize them, but assigning the key to respect what's in all the other entities\n last_request: null;\n};\n\nexport type GateExchange = {\n id: number;\n entityType: \"EXCHANGE\";\n created_by: GateUser;\n created_on: string;\n balances: {\n available: string;\n locked: string;\n total: string;\n };\n governance_rules: GateGovernanceRulesSet[] | null;\n last_request: GateExchangeRequest;\n name: string;\n platform: string;\n status: \"PENDING\" | \"ACTIVE\" | \"ABORTED\";\n};\n\nexport type GatePolicy = {\n id: number;\n entityType: \"POLICY\";\n created_by: GateUser;\n created_on: string;\n last_request: GatePolicyRequest;\n name: string;\n currency: string | null;\n description: string | null;\n governance_rules: GateGovernanceRulesSet[];\n account_ids: GateAccount[\"id\"][];\n status: \"PENDING\" | \"ACTIVE\" | \"ABORTED\";\n};\n\nexport type GateTradelinkEntity<T extends \"CUSTODIAN\" | \"ASSET_MANAGER\" | \"EXCHANGE\"> = Omit<\n GateTradelinkThirdParty<T>,\n \"role\"\n>;\n\nexport type GateTradelinkNetwork = {\n id: string;\n asset_managers: GateTradelinkEntity<\"ASSET_MANAGER\">[];\n custodian: GateTradelinkEntity<\"CUSTODIAN\">;\n exchanges: GateTradelinkEntity<\"EXCHANGE\">[];\n};\n\nexport type GateTradelinkOnboardingStatus = {\n status:\n | \"NOT_READY\"\n | \"READY_TO_ONBOARD\"\n | \"CUSTODIAN_ONBOARDED\"\n | \"EXCHANGE_ONBOARDED\"\n | \"HSM_READY\";\n};\n\nexport type GateVaultEntity = {\n id: number;\n entityType: \"VAULT_ENTITY\";\n name: string;\n accounts: GateAccount[];\n status: GateVaultEntityStatus;\n created_on: string;\n last_request?: GateVaultEntityRequest;\n};\n\ntype WhitelistType = \"TRANSACTION\" | \"SMART_CONTRACT\";\n\nexport type GateWhitelist = {\n id: number;\n name: string;\n entityType: \"WHITELIST\";\n description: string;\n addresses: GateAddress[];\n created_on: string;\n created_by: GateUser;\n approvals: Approval[];\n status: \"ACTIVE\" | \"PENDING\" | \"ABORTED\" | \"REVOKED\" | \"TO_MIGRATE\";\n last_request?: GateWhitelistRequest;\n whitelist_type?: WhitelistType;\n is_tradelink?: boolean;\n};\n\ntype GateTransactionNote = {\n title: string;\n content: string;\n};\n\nexport type GateTransactionType =\n | \"SEND\"\n | \"RECEIVE\"\n | \"PREBURN\"\n | \"BURN\"\n | \"MINT\"\n | \"DELEGATE\"\n | \"UNDELEGATE\"\n | \"DELEGATE_VOTE_TO_DREP\"\n | \"STAKING_REGISTER\"\n | \"STAKING_DEREGISTER\"\n | \"STAKING_DELEGATE\"\n | \"STAKING_WITHDRAW\"\n | \"CREATE_SPL_TOKEN_ACCOUNT\";\n\nexport type CardanoVoteDelegationDrep = \"ALWAYS ABSTAIN\" | null;\n\nexport type GateTransaction = {\n id: number;\n account_id: number;\n recipient: string;\n type: GateTransactionType;\n created_on: string;\n created_by: GateUser;\n labels: GateLabel[];\n tx_hash: string;\n status:\n | \"ABORTED\"\n | \"APPROVED\"\n | \"CONFIRMED\"\n | \"DROPPED\"\n | \"FAILED\"\n | \"FAILED_TO_BROADCAST\"\n | \"PENDING_APPROVAL\"\n | \"PENDING_CREATE_IN_HSM\"\n | \"SIGNED\"\n | \"SUBMITTED\";\n amount: string;\n max_fees?: string;\n notes: GateTransactionNote[];\n last_request?: GateTransactionRequest;\n failure_reason?: string | null;\n tx_parameters?: {\n drep?: CardanoVoteDelegationDrep;\n tradelink?: {\n type: \"SETTLEMENT\";\n settlement_id: string;\n pledge_id: string;\n };\n token_address?: string;\n };\n};\n\ntype Approval = {\n created_on: string;\n created_by: GateUser;\n type: \"APPROVE\" | \"ABORT\";\n};\n\nexport type GateAddress = {\n id: number;\n currency: string;\n address: string;\n name: string;\n destination_tags?: number[] | null;\n};\n\nexport type GateGenericRequest = {\n entityType: \"REQUEST\";\n created_by: GateUser | null;\n created_on: string;\n id: number;\n status: string;\n type: string;\n approvals?: RequestApproval[];\n approvals_steps: Array<{\n group: GateGroup;\n quorum: number;\n }>;\n current_step: number;\n target_id: number;\n target_type: string;\n quorum?: number;\n organization?: Organization;\n expired_at: Date;\n edit_data?: any;\n};\n\nexport interface GateAccountRequest extends GateGenericRequest {\n // TODO we probably want to have GateAccountBitcoin/Ethereum..etc.. based on target_type\n account: GateAccount;\n target_type:\n | \"BITCOIN_ACCOUNT\"\n | \"ETHEREUM_ACCOUNT\"\n | \"RIPPLE_ACCOUNT\"\n | \"TEZOS_ACCOUNT\"\n | \"POLKADOT_ACCOUNT\"\n | \"ERC20_ACCOUNT\"\n | \"STELLAR_ACCOUNT\"\n | \"SOLANA_ACCOUNT\"\n | \"CARDANO_ACCOUNT\"\n | \"TRON_ACCOUNT\";\n type:\n | \"CREATE_ACCOUNT\"\n | \"EDIT_ACCOUNT\"\n | \"REVOKE_ACCOUNT\"\n | \"EDIT_TOKEN_RULE\"\n | \"MIGRATE_ACCOUNT\"; // TODO migration code should be remove;\n request_data: Partial<{\n currency: { name: string };\n derivation_mode: string;\n entity_id: number | null;\n governance_rules: GateGovernanceRulesSet[];\n name: string;\n }>;\n}\n\nexport interface GateSPLTokenAccountRequest extends GateGenericRequest {\n account: GateAccount;\n target_type: \"SOLANA_ACCOUNT\";\n type: \"EDIT_TOKEN_RULE\";\n target_id: number;\n edit_data: {\n governance_rules: GateGovernanceRulesSet[];\n };\n request_data: Partial<{\n governance_rules: GateGovernanceRulesSet[];\n }>;\n contract_address: string;\n}\n\nexport interface GateActivateRequest extends GateGenericRequest {\n target_type: GateAccountRequest[\"target_type\"];\n target_id: number;\n target: GateAccount;\n type: \"ACTIVATE\";\n}\n\nexport interface GateRepledgeRequest extends GateGenericRequest {\n repledge: GateRepledge;\n target_type: \"REPLEDGE\";\n type: \"CREATE_REPLEDGE\";\n}\nexport interface GatePledgeIncrementRequest extends GateGenericRequest {\n pledge_increment: GatePledgeIncrement;\n target_type: \"PLEDGE_INCREMENT\";\n type: \"CREATE_PLEDGE_INCREMENT\";\n}\nexport interface GateForcedUnpledgeRequest extends GateGenericRequest {\n forced_unpledge: GateForcedUnpledge;\n target_type: \"FORCED_UNPLEDGE\";\n type: \"CREATE_FORCED_UNPLEDGE\";\n}\n\nexport interface GateUserRequest extends GateGenericRequest {\n url_id: string;\n user: GateUser;\n target_type: \"PERSON\";\n type:\n | \"REVOKE_USER\"\n | \"CREATE_ADMIN\"\n | \"CREATE_OPERATOR\"\n | \"CREATE_API_USER\"\n | \"CREATE_API_USER_ACCESS\"\n | \"MIGRATE_ADMIN\"\n | \"MIGRATE_OPERATOR\"; // TODO migration code should be remove\n}\n\nexport interface GateAPIV2UserAccessRequest extends GateGenericRequest {\n username: string;\n user: GateUser;\n api_key_id: string;\n api_key_secret: string;\n target_type: \"PERSON\";\n type: \"CREATE_API_USER\" | \"CREATE_API_USER_ACCESS\";\n}\n\nexport interface GateSCIConfigRequest extends GateGenericRequest {\n sciconfig: GateSCIConfig;\n target_type: \"SCI_CONFIG\";\n type: \"CREATE_SCICONFIG\" | \"EDIT_SCICONFIG\";\n edit_data?: {\n custom_contract_call_enabled: boolean;\n dapps: string[];\n };\n request_data?: {\n custom_contract_call_enabled: boolean;\n dapps: string[];\n };\n}\n\nexport interface GateMessageRequest extends GateGenericRequest {\n target_type: \"MESSAGE\";\n message: GateMessage;\n type: \"MESSAGE_SIGNING\";\n}\n\nexport interface GateWhitelistRequest extends GateGenericRequest {\n whitelist: GateWhitelist;\n target_type: \"WHITELIST\";\n type: \"CREATE_WHITELIST\" | \"EDIT_WHITELIST\" | \"MIGRATE_WHITELIST\"; // TODO migration code should be remove;\n edit_data?: {\n name?: string;\n addresses: GateAddress[];\n };\n}\n\nexport interface GateExchangeRequest extends GateGenericRequest {\n exchange: GateExchange;\n target_type: \"EXCHANGE\";\n type: \"IMPORT_EXCHANGE\" | \"EDIT_EXCHANGE\" | \"EDIT_EXCHANGE_CREDENTIALS\" | \"REVOKE_EXCHANGE\";\n}\n\nexport interface GateTransactionRequest extends GateGenericRequest {\n // TODO we probably want to have GateTransactionBitcoin/Ethereum..etc.. based on target_type\n transaction: GateTransaction;\n target_type:\n | \"BITCOIN_LIKE_TRANSACTION\"\n | \"ETHEREUM_LIKE_TRANSACTION\"\n | \"RIPPLE_LIKE_TRANSACTION\"\n | \"POLKADOT_LIKE_TRANSACTION\"\n | \"TEZOS_LIKE_TRANSACTION\"\n | \"STELLAR_LIKE_TRANSACTION\"\n | \"CARDANO_LIKE_TRANSACTION\";\n type: \"CREATE_TRANSACTION\";\n}\n\nexport const GateGroupRequestTypeDefs = [\n \"CREATE_GROUP\",\n \"EDIT_GROUP\",\n \"REVOKE_GROUP\",\n \"MIGRATE_GROUP\",\n] as const;\n\nexport interface GateGroupRequest extends GateGenericRequest {\n group: GateGroup;\n target_type: \"GROUP\";\n type: (typeof GateGroupRequestTypeDefs)[number]; // TODO migration code should be remove\n}\n\nexport interface GateDigestsRequest extends GateGenericRequest {\n digests: GateDigestGroup;\n target_type: \"DIGESTS\";\n type: \"SIGN_DIGESTS\";\n}\n\nexport interface GateOrganizationRequest extends GateGenericRequest {\n organization: Organization;\n target_type: \"ORGANIZATION\";\n type: \"UPDATE_QUORUM\";\n}\n\nexport interface GateAPIKeyRequest extends GateGenericRequest {\n api_key: GateAPIKey;\n target_type: \"VAULT_API_KEY\";\n type: \"CREATE_API_KEY\" | \"EDIT_API_KEY\" | \"REVOKE_API_KEY\";\n}\n\nexport interface GateTransferRequest extends GateGenericRequest {\n transfer: GateTransfer;\n target_type: \"TRANSFER\";\n type: \"CREATE_TRANSFER\";\n}\n\nexport interface GateVaultEntityRequest extends GateGenericRequest {\n vaultEntity: GateVaultEntity;\n target_type: \"ENTITY\";\n type: \"CREATE_ENTITY\" | \"EDIT_ENTITY\" | \"REVOKE_ENTITY\";\n edit_data?: {\n name: string;\n accounts: number[];\n };\n}\n\nexport interface GatePolicyRequest extends GateGenericRequest {\n policy: GatePolicy;\n target_type: \"POLICY\";\n type: \"CREATE_POLICY\" | \"EDIT_POLICY\";\n}\n\nexport type Organization = {\n name: string;\n domain_name: string;\n workspace: string;\n number_of_admins: number;\n quorum: number;\n};\n\ntype RequestApproval = {\n created_by: GateUser;\n created_on: string;\n type: string;\n step: number;\n};\n\n// a LAM user is referenced by string\nexport type UserDevice = number | string;\n\nexport type ManifestGroup = {\n name: string;\n users: UserDevice[];\n description?: string;\n status?: \"PENDING\" | \"ACTIVE\" | \"ABORTED\";\n};\n\nexport type ManifestAccountRuleMultiAuthStep =\n | { quorum: number; users: UserDevice[] }\n | { quorum: number; group: string };\n\nexport type ManifestAccountRuleMultiAuth = {\n type: \"MULTI_AUTHORIZATIONS\";\n steps: ManifestAccountRuleMultiAuthStep[];\n};\n\nexport type ManifestAccountRuleSCI = {\n type: \"SMART_CONTRACT_INTERACTION\";\n enabled: boolean;\n};\n\nexport type ManifestAccountRuleTezosDelegation = {\n type: \"TEZOS_DELEGATION\";\n};\nexport type ManifestAccountRulePolkadotStaking = {\n type: \"POLKADOT_STAKING\";\n};\nexport type ManifestAccountRuleDeployContract = {\n type: \"DEPLOY_CONTRACT\";\n};\nexport type ManifestAccountRuleSolanaStaking = {\n type: \"SOLANA_STAKING\";\n};\nexport type ManifestAccountRuleCardanoStaking = {\n type: \"CARDANO_STAKING\";\n};\nexport type ManifestAccountRuleRawSigning = {\n type: \"RAW_SIGNING\";\n};\nexport type ManifestAccountRuleSend = {\n type: \"SEND\";\n};\nexport type ManifestAccountRuleStake = {\n type: \"STAKE\";\n};\nexport type ManifestAccountRuleMessageSigning = {\n type: \"MESSAGE_SIGNING\";\n};\n\nexport type ManifestAccountRuleCreateSplTokenAccount = {\n type: \"CREATE_SPL_TOKEN_ACCOUNT\";\n};\n\nexport type ManifestAccountRuleTransferSplToken = {\n type: \"TRANSFER_SPL_TOKEN\";\n contractAddress: string;\n};\n\nexport type ManifestAccountRuleWhitelist = {\n type: \"WHITELIST\";\n whitelists: string[];\n};\n\nexport type ManifestAccountRuleThreshold = {\n type: \"THRESHOLD\";\n min?: number;\n max?: number;\n};\n\nexport type ManifestAccountRule =\n | ManifestAccountRuleMultiAuth\n | ManifestAccountRuleWhitelist\n | ManifestAccountRuleSCI\n | ManifestAccountRuleDeployContract\n | ManifestAccountRuleThreshold\n | ManifestAccountRulePolkadotStaking\n | ManifestAccountRuleSolanaStaking\n | ManifestAccountRuleCardanoStaking\n | ManifestAccountRuleRawSigning\n | ManifestAccountRuleTezosDelegation\n | ManifestAccountRuleSend\n | ManifestAccountRuleMessageSigning\n | ManifestAccountRuleCreateSplTokenAccount\n | ManifestAccountRuleTransferSplToken\n | ManifestAccountRuleStake;\n\nexport type ManifestAccountConfig = {\n nftGallery?: boolean;\n};\n\ntype ManifestTradelinkOrg = {\n name: string;\n};\n\ntype AccountTradelinkExchangeData = {\n name: string;\n requires_pre_approval: boolean;\n auto_repledge_enabled: boolean;\n};\n\nexport type ManifestAccountTradelinkData = {\n currency: string;\n custodian: ManifestTradelinkOrg;\n asset_manager: ManifestTradelinkOrg;\n exchanges: AccountTradelinkExchangeData[];\n};\n\ntype ManifestCryptoAccount = {\n name: string;\n currency: string;\n accountType?: string;\n derivationMode?: string;\n rules?: Array<ManifestAccountRule[]>;\n status?: \"PENDING\" | \"ABORTED\" | \"ACTIVE\";\n index?: number;\n readOnly?: {\n xpub: string;\n publicKey: string;\n chainCode: string;\n address?: string;\n };\n tradelink_data?: ManifestAccountTradelinkData;\n // all the fields that doesn't require a request to be changed\n config?: ManifestAccountConfig;\n};\n\ntype ManifestERC20Account = {\n name: string;\n contractAddress: string;\n parentAccount?: string;\n rules?: Array<ManifestAccountRule[]>;\n status?: \"PENDING\" | \"ABORTED\" | \"ACTIVE\";\n index?: number;\n tradelink_data?: ManifestAccountTradelinkData;\n};\n\nexport type ManifestAccount = ManifestCryptoAccount | ManifestERC20Account;\n\nexport type ManifestVaultEntity = {\n name: string;\n accounts?: string[];\n status?: \"PENDING\" | \"ACTIVE\" | \"ABORTED\";\n};\n\nexport type ManifestWhitelistAddress = {\n currency: string;\n name?: string;\n address: string;\n destination_tags?: number[] | null;\n};\n\nexport type ManifestWhitelist = {\n name: string;\n addresses: ManifestWhitelistAddress[];\n description?: string;\n status?: \"PENDING\" | \"ABORTED\";\n type?: WhitelistType;\n};\n\nexport type ManifestUser = {\n device: number;\n};\n\nexport type ManifestAPIUser = {\n name: string;\n viewAll?: boolean;\n};\n\nexport type ManifestAPIV2User = {\n name: string;\n role: string;\n publicKey?: string;\n viewAll?: boolean;\n};\n\nexport type ManifestExchange = {\n name: string;\n platform: string;\n rules?: Array<ManifestAccountRule[]>;\n status?: \"PENDING\" | \"ACTIVE\" | \"ABORTED\";\n\n // note for the future: one day we will be able to put\n // extra fields in the configuration, for now, all exchanges\n // receive `apiKey` and `secret` only\n configuration: {\n apiKey: string;\n apiSecret: string;\n };\n};\n\nexport type ManifestPolicy = {\n name: string;\n currency?: string;\n rules: Array<ManifestAccountRule[]>;\n status?: \"PENDING\" | \"ACTIVE\" | \"ABORTED\";\n};\n\nexport type ManifestWorkspaceRuleStep = {\n quorum: number;\n users: string[]; // array of api admin usernames\n};\n\nexport type ManifestWorkspaceRule = {\n permission: Exclude<GateWorkspacePermission, \"ROOT\">;\n steps: ManifestWorkspaceRuleStep[];\n};\n\ninterface ManifestCommon {\n salt?: string;\n quorum?: number;\n customUsernames?: Record<string, string>;\n groups?: ManifestGroup[];\n accounts?: ManifestAccount[];\n entities?: ManifestVaultEntity[];\n whitelists?: ManifestWhitelist[];\n exchanges?: ManifestExchange[];\n policies?: ManifestPolicy[];\n tradelink?: ManifestTradelink;\n contractApprovals?: ManifestContractApproval[];\n workspaceRules?: ManifestWorkspaceRule[];\n}\n\nexport type ManifestTradelink = {\n onboarded: boolean;\n exchanges: ManifestTradelinkEntityWithAddresses[];\n assetManagers: ManifestTradelinkEntityWithAddresses[];\n custodians: ManifestTradelinkEntity[];\n};\n\nexport type ManifestTradelinkEntity = {\n id: string;\n name: string;\n logoUrl: string;\n code: string;\n users: {\n operators?: number[];\n apiV2?: string[];\n };\n};\n\nexport type ManifestTradelinkEntityWithAddresses = {\n id: string;\n name: string;\n logoUrl: string;\n code: string;\n users: {\n operators?: number[];\n apiV2: string[];\n };\n addresses: ManifestWhitelistAddress[];\n};\n\nexport type ManifestContractApproval = {\n user: number;\n contractNames: string[];\n};\n\nexport interface Manifest extends ManifestCommon {\n users?: {\n operators?: Array<number | ManifestUser>;\n admins?: Array<number | ManifestUser>;\n api?: Array<string | ManifestAPIUser>;\n apiV2?: Array<ManifestAPIV2User>;\n };\n}\n\nexport interface DeserializedManifest extends ManifestCommon {\n users?: {\n operators?: ManifestUser[];\n admins?: ManifestUser[];\n api?: ManifestAPIUser[];\n apiV2?: ManifestAPIV2User[];\n };\n}\n\nexport const feesLevels = [\"SLOW\", \"NORMAL\", \"FAST\", \"CUSTOM\"] as const;\nexport type FeesLevel = (typeof feesLevels)[number];\n\nexport type ManifestTransaction = {\n // account name\n account: string;\n // recipient address\n recipient: string;\n // transaction amount in default unit (e.g BTC)\n amount: string | number;\n utxosPickingStrategy?: UTXOsPickingStrategy;\n contractPayload?: string;\n transactionType?: GateTransactionType;\n feesLevel?: FeesLevel;\n gasPrice?: string;\n gasLimit?: string;\n title?: string;\n comment?: string;\n maxFees?: string;\n\n // EIP1559-specific\n baseFees?: string;\n maxFeesBufferFactor?: string;\n priorityFees?: string;\n};\n\nexport type OnboardingContext = {\n pool: DevicesPool;\n getState: () => Promise<any>;\n getChallenge: () => Promise<any>;\n next: (data?: any) => Promise<void>;\n collectMasterSeedFragment: (challenge: any, deviceIndex: number) => Promise<void>;\n validateSO: (challenge: any, deviceIndex: number) => Promise<void>;\n registerAdmin: (data: any, deviceIndex: number) => Promise<void>;\n registerSO: (data: any, deviceIndex: number) => Promise<void>;\n registerWrappingKey: (challenge: any, deviceIndex: number) => Promise<void>;\n};\n\nexport type OnboardingStep =\n | \"WRAPPING_KEYS_REGISTRATION\"\n | \"ADMINS_REGISTRATION\"\n | \"QUORUM_SETTINGS\"\n | \"SHARED_OWNERS_REGISTRATION\"\n | \"ADMIN_APPROVALS\"\n | \"MASTER_SEED_GENERATION\";\n\nexport interface RecordLogger extends Logger {\n logs: string[];\n reset: () => void;\n expect: (s: string) => void;\n}\n\nexport type RunnableOptions = {\n logger?: Logger;\n};\n\nexport type MockNetworkResponse = [\n string, // verb: GET, POST, ...\n string, // url\n number, // returned status code\n any?, // returned data\n any?, // expected request payload\n any?, // returned headers\n any?, // expected request headers\n];\n\nexport type LegacyERC20Token = {\n blockchain_name: \"foundation\" | \"ropsten\" | \"goerli\";\n contract_address: string;\n decimals: number;\n hsm_account_parameters: string;\n hsm_signature: string;\n name: string;\n ticker: string;\n};\n\nexport type GateCoinCapabilities = {\n signer: {\n raw_signing_supported: boolean;\n send_clear_signing_supported: boolean;\n stake_clear_signing_supported: boolean;\n };\n wallet: {\n balance_supported: boolean;\n broadcast_supported: boolean;\n crafting_supported: boolean;\n tx_history_supported: boolean;\n };\n};\n\nexport type GateTokenCurrency = {\n contract_address: string;\n family: \"ethereum\";\n name: string;\n parent_currency: \"ethereum\" | \"ethereum_ropsten\" | \"ethereum_goerli\" | \"bsc\";\n ticker: string;\n token_type: \"erc20\" | \"stablecoin\" | \"bep20\";\n units: [Unit];\n delisted?: boolean;\n disable_countervalue?: boolean;\n capabilities?: GateCoinCapabilities;\n\n // FIXME: here only for retro-compatibility with gate < 3.6 (that expect front to send hsm parameters)\n __legacy_hsm_account_parameters?: string;\n __legacy_hsm_signature?: string;\n};\n\nexport type GateCurrency = {\n name: string;\n type: \"CRYPTO\";\n family: string;\n confirmations_needed: number;\n units: Unit[];\n capabilities?: GateCoinCapabilities;\n};\n\n// surprisingly the gate expect some fields to change\n// from the erc20 token *it literally send* us\nexport type WeirdGateERC20Token = {\n ticker: string;\n address: string;\n decimals: number;\n hsm_signature: string;\n hsm_account_parameters: string;\n};\n\nexport type WeirdGateTokenCurrency = {\n type: \"erc20\" | \"stablecoin\";\n address: string;\n};\n\nexport type DaemonAddress = {\n address: string;\n derivation_path: string;\n};\n\nexport type VaultEvent =\n | Ev<\"ACCOUNT_UPDATED\", GateAccount>\n | Ev<\"REQUEST_CREATED\", GateRequest>\n | Ev<\"REQUEST_ABORTED\", GateRequest>\n | Ev<\"REQUEST_APPROVAL\", GateRequest>\n | Ev<\"REQUEST_APPROVED\", GateRequest>\n | Ev<\"TRANSACTION_BROADCASTED\", GateTransaction>\n | Ev<\"TRANSACTION_RECEIVED\", GateTransaction>\n | Ev<\"TRANSACTION_FAILED\", GateTransaction>\n | Ev<\"USER_REGISTERED\", GateUser>\n | Ev<\"USER_SUSPENDED\", GateUser>;\n\ntype Ev<T, P> = { type: T; payload: P };\n\nexport type { CryptoCurrency, TokenCurrency };\nexport type UserWithDevice = { deviceIndex: number; user: GateUser };\nexport type UserWithoutDevice = { username: string; user: GateUser };\n\nexport type CurrencyOrToken = CryptoCurrency | TokenCurrency;\n\nexport type Network = <T>(\n method: \"POST\" | \"PUT\" | \"GET\" | \"DELETE\",\n url: string,\n data?: any,\n requestOptions?: any,\n) => Promise<T>;\n\nexport type WipeOptions = {\n gate: string;\n lam?: string;\n lamAPIKey?: string;\n hsmCompartmentID: number;\n hsmEndpoint: string;\n hsmCert: Buffer;\n hsmCertKey: Buffer;\n monotonicCountersSize?: number;\n fileSystemSize?: number;\n};\n\nexport interface BakeManifestOptions extends RunnableOptions {\n noApproval?: boolean;\n runner?: ManifestRunner;\n untilStep?: OnboardingStep;\n twoStepsRequest?: boolean;\n waitForActive?: boolean;\n\n // revault-compat onboarding\n revaultOnboarding?: {\n compartmentId: number;\n hsmScriptsVersion: string;\n revaultApiUrl: string;\n revaultRootAuthToken: string;\n };\n}\n\n// 'MR' stands for 'ManifestRunner'\ntype MRAction<P, R> = (params: P) => Promise<R>;\n\nexport type MRCreateUserParams = {\n role: \"admin\" | \"operator\";\n userID: string;\n name: string;\n device: number;\n};\n\nexport type MRCreateAPIUserParams = {\n user: ManifestAPIUser;\n userID: string;\n name: string;\n};\n\nexport type MRCreateAPIV2UserParams = {\n user: ManifestAPIV2User;\n publicKey: string;\n role: string;\n name: string;\n};\n\nexport type MRBakeGroupParams = {\n group: ManifestGroup;\n data: DataGroup;\n existingRequest: GateGroupRequest | null;\n noApproval: boolean;\n twoStepsRequest?: boolean;\n};\n\nexport type MRBakeAccountParams = {\n account: ManifestAccount;\n data: DataAccount;\n existingRequest: GateAccountRequest | null;\n noApproval: boolean;\n twoStepsRequest?: boolean;\n waitForActive?: boolean;\n tradelinkAM?: ManifestAPIV2User;\n};\n\nexport type MRBakeVaultEntityParams = {\n vaultEntity: ManifestVaultEntity;\n data: DataVaultEntity;\n existingRequest: GateVaultEntityRequest | null;\n noApproval: boolean;\n};\n\nexport type MRBakeWhitelistParams = {\n whitelist: ManifestWhitelist;\n data: DataWhitelist;\n existingRequest: GateWhitelistRequest | null;\n noApproval: boolean;\n twoStepsRequest?: boolean;\n};\n\nexport type MRBakeExchangeParams = {\n exchange: ManifestExchange;\n data: DataExchange;\n existingRequest: GateExchangeRequest | null;\n noApproval: boolean;\n twoStepsRequest?: boolean;\n};\n\nexport type MRBakePolicyParams = {\n policy: ManifestPolicy;\n data: DataPolicy;\n existingRequest: GatePolicyRequest | null;\n noApproval: boolean;\n twoStepsRequest?: boolean;\n};\n\nexport type MRBakeTradelinkOnboardingParams = {\n type: \"CREATE_TRADELINK\";\n operators: string[];\n};\n\nexport type MREditQuorumParams = {\n quorum: number;\n};\n\nexport type MREditWorkspaceRuleParams = {\n rule: ManifestWorkspaceRule;\n usersByName: Record<string, GateUser>;\n};\n\nexport type MBRBakeTradelinkEntityWithAddresses = {\n operators: string[];\n addresses: ManifestWhitelistAddress[];\n name: string;\n};\n\nexport type MRBakeTradelinkEntityParams = {\n tradelinkEntity: ManifestTradelinkEntity | ManifestTradelinkEntityWithAddresses;\n type: \"asset_managers\" | \"exchanges\" | \"custodians\";\n};\n\nexport type MRBakeTradelinkEntityOnboardingParams = {\n tradelinkEntity: MBRBakeTradelinkEntityWithAddresses;\n type: \"asset_managers\" | \"exchanges\";\n tradelinkEntityApprover: ManifestAPIV2User; // entity approver, like exchange approver of the exchange\n};\n\nexport type MRBakeTradelinkNetworkParams = {\n custodians: DataTradelinkNetworkEntity<\"CUSTODIAN\">[];\n exchanges: DataTradelinkNetworkEntity<\"EXCHANGE\">[];\n assetManagers: DataTradelinkNetworkEntity<\"ASSET_MANAGER\">[];\n};\n\nexport type DataTradelinkNetworkEntity<T extends \"CUSTODIAN\" | \"EXCHANGE\" | \"ASSET_MANAGER\"> = Pick<\n GateTradelinkThirdParty<T>,\n \"id\" | \"name\"\n>;\n\nexport type ManifestRunner = {\n editQuorum: (params: MREditQuorumParams) => Promise<void>;\n editWorkspaceRule: (params: MREditWorkspaceRuleParams) => Promise<void>;\n\n createUser: MRAction<MRCreateUserParams, GateUserRequest>;\n createAPIUser: (\n params: MRCreateAPIUserParams,\n r: RecipeManifestResult,\n ) => Promise<GateUserRequest>;\n createAPIV2User: MRAction<MRCreateAPIV2UserParams, GateUserRequest>;\n createAPIV2UserAccess: MRAction<MRCreateAPIV2UserParams, GateAPIV2UserAccessRequest>;\n\n createGroup: MRAction<MRBakeGroupParams, GateGroupRequest>;\n editGroup: MRAction<MRBakeGroupParams, GateGroupRequest>;\n\n createAccount: MRAction<MRBakeAccountParams, GateAccountRequest>;\n editAccount: MRAction<MRBakeAccountParams, GateAccountRequest>;\n\n createVaultEntity: MRAction<MRBakeVaultEntityParams, GateVaultEntityRequest>;\n editVaultEntity: MRAction<MRBakeVaultEntityParams, GateVaultEntityRequest>;\n\n createWhitelist: MRAction<MRBakeWhitelistParams, GateWhitelistRequest>;\n editWhitelist: MRAction<MRBakeWhitelistParams, GateWhitelistRequest>;\n\n createExchange: MRAction<MRBakeExchangeParams, GateExchangeRequest>;\n editExchange: MRAction<MRBakeExchangeParams, GateExchangeRequest>;\n\n createPolicy: MRAction<MRBakePolicyParams, GatePolicyRequest>;\n\n createTradelink: MRAction<MRBakeTradelinkOnboardingParams, GateTradelinkRequest>;\n createTradelinkEntity: <T extends \"ASSET_MANAGER\" | \"EXCHANGE\" | \"CUSTODIAN\">(\n params: MRBakeTradelinkEntityParams,\n ) => Promise<GateTradelinkEntity<T>>;\n onboardTradelinkEntity: MRAction<\n MRBakeTradelinkEntityOnboardingParams,\n GateTradelinkExchangeRequest | GateTradelinkAssetManagerRequest\n >;\n createTradelinkNetwork: MRAction<MRBakeTradelinkNetworkParams, GateTradelinkNetwork>;\n};\n\nexport type HsmCertificate = {\n attestation_pub: string;\n certificate: string;\n code_hash: string;\n signature: string;\n};\n\nexport type SecureChannel = {\n request_id: string;\n handshake: string;\n ciphertext: string;\n challenge: string;\n u2f_register_data: string;\n // defined for user registration\n handshake_attestation?: HsmCertificate;\n};\n\n// TODO centralize types with vault-remote\nexport type DeploymentStepID =\n | \"checkConnectivity\"\n | \"createNamespace\"\n | \"installNamespace\"\n | \"setupFeatureFlagsProvider\"\n | \"waitPods\"\n | \"success\";\n\nexport type DeploymentStep = {\n key: DeploymentStepID;\n labelWaiting: string;\n labelCurrent: string;\n labelSuccess: string;\n};\n\nexport type MVInstanceDeploymentFF = { key: string; set: boolean };\n\nexport type MVInstanceDeployment = {\n id: string;\n\n startedOn: Date;\n finishedOn: Date | null;\n\n status: \"BUSY\" | \"SUCCESS\" | \"ERROR\";\n steps: DeploymentStep[];\n currentStep: DeploymentStepID;\n\n instance: MVInstance;\n flags: Array<MVInstanceDeploymentFF>;\n\n error: Error | null;\n spawnFailTimeout?: ReturnType<typeof setTimeout>;\n};\n\nexport type MVPod = {\n name: string;\n podName: string;\n status: \"BUSY\" | \"HEALTHY\" | \"ERROR\" | \"EVICTED\";\n};\n\nexport type MVInstance = {\n name: string;\n status: string;\n host: string;\n pods: MVPod[];\n};\n\nexport type InteractionResponses = {\n network: Network;\n transport: any;\n secure_channel: any;\n pairing_payload: any;\n blob: any;\n confidentiality_key: any;\n attestation: any;\n u2f_key: any;\n onboardingRegisterChallenge: any;\n role: any;\n username: any;\n register_data: any;\n validation_key: any;\n u2f_register: any;\n validate_device: any;\n attested_handshake: any;\n};\n\nexport type Interaction<T> = {\n responseKey: string;\n action: (responses: InteractionResponses) => Promise<T>;\n device?: boolean;\n};\n\nexport type GetU2FPubKeyInteraction = Interaction<{\n pubKey: string;\n signature: Buffer;\n}>;\n\nexport type Interactions = {\n approveFlow: Interaction<any>[];\n approveFlowWithoutHSM: Interaction<any>[];\n doStartKpatternAsResponder: Interaction<any>;\n validateDevice: Interaction<any>;\n validatePayload: Interaction<any>;\n postApproval: Interaction<any>;\n postSimpleApproval: Interaction<any>;\n ensurePartitionPairing: Interaction<any>;\n finalizePairing: Interaction<any>;\n getAttestation: Interaction<{ attestation: Buffer }>;\n getConfidentialityPublicKey: Interaction<any>;\n getSecureChannel: Interaction<any>;\n getU2FChallenge: Interaction<any>;\n getU2FPublicKey: GetU2FPubKeyInteraction;\n getValidationPublicKey: Interaction<any>;\n initPairing: Interaction<any>;\n loginFlow: Interaction<any>[];\n operatorGetChallenge: Interaction<any>;\n postU2FSignature: Interaction<any>;\n postUserRegistration: Interaction<any>;\n readOnlyLoginFlow: (userName: string) => Interaction<any>[];\n registerUserFlow: Interaction<any>[];\n u2fAuthenticate: Interaction<any>;\n validateOperation: Interaction<any>[];\n};\n\n// API Types\nexport type APIBearerTokenResponse = {\n access_token: string;\n expires_in: number;\n refresh_token: string;\n session_state: string;\n token_type: string;\n};\n\nexport type APIGetChallengeResponse = {\n challenge: string;\n id: number;\n};\n\n// FIXME properly define this type at this is the response to /request\n// and it handle a lot of type, request target, request id\nexport type APIRequestResponse = {\n id: number;\n status: \"PENDING_APPROVAL\" | \"APPROVED\" | \"SUBMITTED\" | \"ABORTED\";\n};\n\nexport type APICreateTransactionRequest = {\n data: APIBitcoinLikeSend | APIEthereumLikeSend;\n note?: {\n content: string;\n title: string;\n };\n type: \"CREATE_TRANSACTION\";\n};\n\nexport type APIGenericSend = {\n account_id: number;\n fees_strategy: GenericFeesStrategy;\n transaction_data: {\n account_name: string;\n amount: string;\n max_fees: string;\n recipient: string;\n };\n};\n\nexport type APIBitcoinLikeSend = APIGenericSend & {\n transaction_data: {\n currency: \"bitcoin\" | \"bitcoin_testnet\";\n };\n transaction_type: \"BITCOIN_LIKE_SEND\";\n};\n\nexport type APIEthereumLikeSend = APIGenericSend & {\n transaction_data: {\n currency: \"ethereum\" | \"ethereum_sepolia\" | \"polygon\" | \"ethereum_holesky\";\n contract_address?: string;\n };\n transaction_type: \"ETHEREUM_LIKE_SEND\";\n};\n\ntype GenericFeesStrategy = {\n type: \"SPEED\";\n data: {\n speed: \"FAST\" | \"NORMAL\" | \"SLOW\";\n };\n};\n\n// FIXME properly define this type\nexport type APIEstimateFeesResponse = {\n max_fees: string;\n};\n\nexport type PsdModel = \"BLUE\" | \"STAX\";\n"]}
1
+ {"version":3,"sources":["/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-66ODLOZL.js","../src/types/index.ts"],"names":[],"mappings":"AAAA;ACwoCO,IAAM,yBAAA,EAA2B;AAAA,EACtC,cAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA;AAuVO,IAAM,WAAA,EAAa,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAA;AD59C7D;AACA;AACE;AACA;AACF,6FAAC","file":"/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-66ODLOZL.js","sourcesContent":[null,"import { RecordStore } from \"@ledgerhq/hw-transport-mocker\";\nimport { CryptoCurrency, TokenCurrency } from \"@ledgerhq/types-cryptoassets\";\nimport { Logger } from \"@ledgerhq/vault-utils\";\nimport { BigNumber } from \"bignumber.js\";\nimport { Socket } from \"socket.io-client\";\n\nimport { Device } from \"../device/types\";\nimport {\n DataAccount,\n DataExchange,\n DataGroup,\n DataPolicy,\n DataVaultEntity,\n DataWhitelist,\n} from \"../prepareRequest\";\nimport { RecipeManifestResult } from \"../recipeManifest\";\nimport { CardanoBalances } from \"./cardano\";\nimport { PolkadotAccountData } from \"./polkadot\";\n\nexport * from \"./cardano\";\n\nexport type UserContext = {\n network: Network;\n getToken: () => string | null;\n run: (interactions: Interaction<any>[], data: any) => Promise<any>;\n get: <T>(url: string, requestOptions?: any) => Promise<T>;\n post: <T>(url: string, payload: any) => Promise<T>;\n approveRequest: (payload: any) => Promise<any>;\n approveRequestWithoutHSM: (payload: any) => Promise<any>;\n rejectRequest: (requestID: number) => Promise<any>;\n connectSocket: () => Promise<typeof Socket>;\n onEvent: (cb: (event: VaultEvent) => void) => void;\n};\n\nexport type RawUser = {\n entityType: \"USER\";\n name: string;\n role: \"admin\" | \"operator\";\n device: number;\n};\n\nexport type RawGroup = {\n entityType: \"GROUP\";\n name: string;\n users: number[];\n description?: string;\n};\n\nexport type RawAccount = {\n entityType: \"ACCOUNT\";\n name: string;\n currency: string;\n derivationMode?: string;\n};\n\nexport type RawWhiteList = {\n entityType: \"WHITELIST\";\n name: string;\n description?: string;\n addresses: string[];\n};\n\nexport type RawEntity = RawUser | RawAccount | RawGroup | RawWhiteList;\n\nexport type EntityType =\n | \"USER\"\n | \"GROUP\"\n | \"ACCOUNT\"\n | \"WHITELIST\"\n | \"TRANSACTION\"\n | \"EXCHANGE\"\n | \"POLICY\"\n | \"VAULT_ENTITY\";\n\nexport type TransportType = \"software\" | \"speculos-web\" | \"nodehid\" | \"nodehid-replayer\";\n\nexport type DevicesPoolOptions = {\n salt?: string;\n gate: string;\n apiGateway?: string;\n overrideSeeds?: string[];\n deviceAPIURL?: string;\n notifierURL?: string;\n readOnlyUser?: string;\n transport?: TransportType;\n recordStore?: RecordStore | null;\n psdModel?: PsdModel;\n\n // see VFE-1010\n deviceAPISessionID?: string;\n};\n\nexport type LamOptions = {\n lamURL?: string;\n lamAPIKey?: string;\n};\n\nexport type CliOptions = {\n networkDelay?: number;\n};\n\nexport type PoolOptions = DevicesPoolOptions & LamOptions & CliOptions;\n\nexport type UserContextRunnable = (context: UserContext) => any;\n\nexport type DeployOptions = {\n // vault-remote URL\n remoteURL?: string;\n // name of the instance, will be used for namespace creation & domain registration\n name: string;\n // who is deploying\n owner: string;\n // default is `main`\n preset?: string;\n // expiration date\n expireOn?: Date;\n // arbitrary helm values to pass\n values?: HelmValues;\n // elapsed minutes before deploy throw an error\n watchTimeoutMinutes?: number;\n // spawn a dedicated HSM simu\n useDedicatedHSMSimu?: boolean;\n // use HTTP polling instead of socket to check instance status\n useHTTPPolling?: boolean;\n};\n\nexport type UpgradeOptions = {\n // vault-remote URL\n remoteURL?: string;\n // name of the instance to target\n name: string;\n // will upgrade to values defined in the preset\n preset?: string;\n // arbitrary helm values to pass\n values?: HelmValues;\n // elapsed minutes before deploy throw an error\n watchTimeoutMinutes?: number;\n};\n\nexport type DestroyOptions = {\n // vault-remote URL\n remoteURL?: string;\n // name of the instance\n name: string;\n // wether we should wait for instance to completely disappear\n wait?: boolean;\n};\n\nexport type HelmValue =\n | string\n | number\n | boolean\n | undefined\n | null\n | Array<HelmValue>\n | HelmValues;\n\nexport interface HelmValues {\n [x: string]: HelmValue;\n}\n\nexport type DevicesPool = {\n getRevaultCompatOptions: () => {\n workspace: string;\n deviceApiUrl: string;\n salt: string;\n };\n workspace: string;\n gate: string;\n apiGateway: string | undefined;\n network: Network;\n psdModel: PsdModel;\n login: (deviceIndex: number | string) => Promise<UserContext>;\n getUserID: (deviceIndex: number) => Promise<string>;\n bruteforceDeviceIndex: (userID: string) => Promise<number>;\n setSalt: (salt: string) => void;\n registerDevice: (deviceIndex: number, request: any) => Promise<any>;\n lamAPI: {\n createInvitation: (invitationID: string) => Promise<{ device_id: string }>;\n registerUser: (name: string, uuid: string) => Promise<void>;\n };\n runWithDevice: (deviceIndex: number, interactions: Interaction<any>[], data: any) => Promise<any>;\n runWithQuorum: (iteratee: UserContextRunnable) => Promise<any>;\n device: Device;\n interactions: Interactions;\n getOnboardingAdminDevices: () => Promise<AdminDevice[]>;\n};\n\nexport type ConnectionEdge<T> = {\n cursor: number;\n node: T;\n};\n\nexport type Connection<T> = {\n edges: ConnectionEdge<T>[];\n pageInfo: {\n hasNextPage: boolean;\n count: number;\n };\n};\n\ntype GateEntityWithRequest = Extract<GateEntity, { last_request?: any }>;\n\nexport interface GateEditWorkspaceRuleRequest extends GateGenericRequest {\n type: \"EDIT_WORKSPACE_RULE\";\n target_type: \"WORKSPACE_RULE\";\n workspace_rule: GateWorkspaceRule;\n request_data: {\n steps: GateWorkspaceRuleStep[];\n };\n}\n\nexport type GateRequest =\n | NonNullable<GateEntityWithRequest[\"last_request\"]>\n | GateAPIV2UserAccessRequest\n | GateEditWorkspaceRuleRequest\n | GateOrganizationRequest\n | GateActivateRequest;\n\nexport type GateRequestType = GateRequest[\"type\"];\n\nexport type GateEntity =\n | GateAPIKey\n | GateAccount\n | GateExchange\n | GateExchange\n | GateGroup\n | GateMessage\n | GatePolicy\n | GateSCIConfig\n | GateTransaction\n | GateUser\n | GateVaultEntity\n | GateWhitelist\n | GatePledgeIncrement\n | GateWorkspaceRule\n | GateRepledge\n | GateForcedUnpledge\n | GateDigestGroup\n | GateTransfer\n | GateTradelink\n | GateTradelinkExchange\n | GateTradelinkAssetManager;\n\nexport type GatePledgeIncrement = {\n id: number;\n status: \"PENDING\" | \"SUBMITTED\";\n account_id: number;\n data: {\n amount: string;\n };\n last_request?: GatePledgeIncrementRequest;\n};\nexport type GateRepledge = {\n id: number;\n status: \"PENDING\" | \"SUBMITTED\";\n account_id: number;\n data: {\n pledge_id: number;\n settlement_id: string;\n account_name: string;\n exchange_name: string;\n amount: string;\n currency: string;\n };\n last_request?: GateRepledgeRequest;\n};\n\nexport type GateForcedUnpledge = {\n id: number;\n status: \"PENDING\" | \"SUBMITTED\";\n account_id: number;\n data: {\n pledge_id: number;\n account_name: string;\n currency: string;\n exchange_name: string;\n };\n pledge_id: string;\n last_request?: GateForcedUnpledgeRequest;\n};\n\nexport type TradelinkNetwork = {\n id: string;\n custodian: GateTradelinkThirdParty<\"CUSTODIAN\">;\n asset_managers: GateTradelinkThirdParty<\"ASSET_MANAGER\">[];\n exchanges: GateTradelinkThirdParty<\"EXCHANGE\">[];\n};\nexport type GateTradelink = {\n id: number;\n status: \"PENDING\" | \"SUBMITTED\" | \"ACTIVE\" | \"ABORTED\";\n hsm_groups: {\n arbitration_groups: GateGroup[];\n settlement_groups: GateGroup[];\n withdraw_groups: GateGroup[];\n };\n network: TradelinkNetwork;\n\n last_request?: GateTradelinkRequest;\n};\n\ntype TradelinkInternalGroup = {\n quorum: number;\n users: Array<{ id: number; pub_key: string; username: string }>;\n};\ntype TradelinkInternalWhitelist = {\n id: number;\n addresses: Array<Omit<GateAddress, \"id\">>;\n};\n\nexport type GateTradelinkExchange = {\n id: number;\n status: \"PENDING\" | \"SUBMITTED\" | \"ACTIVE\" | \"ABORTED\";\n last_request?: GateTradelinkExchangeRequest;\n is_under_edit: boolean;\n network: TradelinkNetwork;\n network_data: TradelinkNetwork[\"exchanges\"][number];\n front_data: {\n pledge_approval_group: TradelinkInternalGroup;\n settlement_creator_group: TradelinkInternalGroup;\n whitelist: TradelinkInternalWhitelist;\n };\n hsm_data: {\n name: string;\n pledge_approval_group: {\n id: number;\n quorum: number;\n users: string[]; // array of public keys\n };\n settlement_creator_group: {\n id: number;\n quorum: number;\n users: string[]; // array of public keys\n };\n };\n};\n\nexport type GateTradelinkAssetManager = {\n id: number;\n status: \"PENDING\" | \"SUBMITTED\" | \"ACTIVE\" | \"ABORTED\";\n last_request?: GateTradelinkAssetManagerRequest;\n is_under_edit: boolean;\n network: TradelinkNetwork;\n network_data: TradelinkNetwork[\"asset_managers\"][number];\n front_data: {\n pledge_creator_group: TradelinkInternalGroup;\n settlement_approval_group: TradelinkInternalGroup;\n whitelist: TradelinkInternalWhitelist;\n };\n hsm_data: {\n name: string;\n pledge_creator_group: {\n id: number;\n quorum: number;\n users: string[]; // array of public keys\n };\n settlement_approval_group: {\n id: number;\n quorum: number;\n users: string[]; // array of public keys\n };\n };\n};\n\nexport type GateDeviceType = \"API\" | \"PSD\" | \"SOFT_PSD\";\n\nexport type GateUser = {\n id: number;\n entityType: \"USER\";\n is_api?: boolean;\n view_all_override?: boolean;\n pub_key: string;\n username: string;\n user_id: string;\n picture?: string;\n created_on: string;\n status: string;\n email?: string;\n role: \"ADMIN\" | \"OPERATOR\";\n last_request?: GateUserRequest;\n device_type: GateDeviceType;\n app_version?: string;\n};\n\nexport type GateAPIKey = {\n id: number;\n secret?: string;\n entityType: \"VAULT_API_KEY\";\n name: string;\n created_on: string;\n updated_on: string;\n status:\n | \"PENDING_APPROVAL\"\n | \"APPROVED\"\n | \"ACTIVE\"\n | \"SUSPENDED\"\n | \"PENDING_REVOCATION\"\n | \"REVOKED\"\n | \"ABORTED\";\n entities: GateVaultEntity[];\n scopes: Record<string, any>;\n identifier: string;\n last_request?: GateAPIKeyRequest;\n};\n\nexport type GateTransfer = {\n id: number;\n amount: string;\n network: string | null;\n recipient: string;\n status: \"PENDING\" | \"APPROVED\" | \"SUBMITTED\" | \"ABORTED\";\n last_request: GateTransferRequest;\n};\n\nexport type GateSCIConfig = {\n id: number;\n entityType: \"SCI_CONFIG\";\n account: Omit<GateAccount, \"sci_config\">;\n sciconfig: {\n dapps: string[];\n custom_contract_call_enabled: boolean;\n };\n status: \"PENDING\" | \"ACTIVE\";\n last_request?: GateSCIConfigRequest;\n};\n\ntype MessageType = \"EIP191\" | \"EIP712\";\n\nexport type GateMessage = {\n account_id: number;\n data: string | Record<string, any>;\n id: number;\n message_type: MessageType;\n signature: string | null;\n der_signature: string | null;\n status: \"PENDING_APPROVAL\" | \"APPROVED\" | \"SIGNED\" | \"ABORTED\";\n type: \"MESSAGE_SIGNING_ALLOWED\";\n entityType: \"MESSAGE_SIGNING\";\n created_on?: string;\n notes: GateTransactionNote[];\n last_request?: GateMessageRequest;\n};\n\nexport type AdminDevice = [username: string, index: number];\n\nexport type GateGroup = {\n id: number;\n name: string;\n entityType: \"GROUP\";\n created_on: string;\n created_by: GateUser;\n description?: string;\n status: \"ACTIVE\" | \"PENDING\" | \"REVOKED\" | \"ABORTED\" | \"TO_MIGRATE\";\n is_internal: boolean;\n members: GateUser[];\n is_under_edit: boolean;\n last_request?: GateGroupRequest;\n is_tradelink?: boolean;\n};\n\ntype GateDigestSignature = {\n der: string;\n r: number;\n s: number;\n v: number | null;\n pub_key: string;\n};\n\ntype GateDigest = {\n digest: string;\n derivation_path: string;\n signature?: GateDigestSignature;\n index?: number;\n};\n\nexport type GateDigestGroup = {\n id: number;\n last_request?: GateDigestsRequest;\n account_id: number;\n created_by: GateUser;\n created_on: string;\n digests_data: GateDigest[];\n // todo check final status with gate\n status: \"PENDING_APPROVAL\" | \"APPROVED\";\n};\n\nexport type UTXOsPickingStrategy = \"MERGE_OUTPUTS\" | \"DEEP_OUTPUTS_FIRST\" | \"OPTIMIZE_SIZE\";\n\nexport type GateFees = {\n gas_price: string;\n gas_limit: string;\n fees_per_byte: string;\n fees: string;\n utxo_picking_strategy?: UTXOsPickingStrategy;\n storage_limit?: number;\n};\n\nexport type GateFeesEIP1559 = {\n base_fees: string;\n gas_limit: string;\n max_fees: string;\n max_fees_buffer_factor: string;\n priority_fees: string;\n};\n\nexport type AccountType =\n | \"Ethereum\"\n | \"Bitcoin\"\n | \"Erc20\"\n | \"Bep20\"\n | \"Ripple\"\n | \"Stellar\"\n | \"Tezos\"\n | \"Solana\"\n | \"Cardano\"\n | \"Polkadot\"\n | \"Tron\"\n | \"Trc20\";\n\nexport type AccountStatus =\n | \"PENDING_CREATE_IN_HSM\"\n | \"PENDING\"\n | \"APPROVED\"\n | \"PENDING_VIEW_ONLY\"\n | \"ACTIVE\"\n | \"VIEW_ONLY\"\n | \"PENDING_ACTIVATION\"\n | \"ABORTED\"\n | \"ACTIVATION_ABORTED\";\n\nexport type Unit = {\n name: string;\n code: string;\n magnitude: number;\n};\n\ntype AccountSettings = {\n id: number;\n fiat: string;\n currency_unit: Unit;\n unitIndex: number;\n blockchain_explorer: string;\n};\n\nexport type GateRuleMultiAuthStep = { quorum: number; group: GateGroup };\n\nexport type GateRuleMultiAuth = {\n type: \"MULTI_AUTHORIZATIONS\";\n data: GateRuleMultiAuthStep[];\n};\n\nexport type GateRuleThreshold = {\n type: \"THRESHOLD\";\n data: [\n {\n currency_type: \"CRYPTO\";\n max: string | null;\n min: string | null;\n },\n ];\n};\n\nexport type GateRuleWhitelist = {\n type: \"WHITELIST\";\n data: GateWhitelist[];\n};\n\nexport type GateRuleSCI = {\n type: \"SMART_CONTRACT_INTERACTION\";\n data: [{ enabled: boolean }];\n};\n\ntype GateRuleTransactionFilterPreset =\n | \"TEZOS_DELEGATION\"\n | \"POLKADOT_STAKING\"\n | \"DEPLOY_CONTRACT\"\n | \"SOLANA_STAKING\"\n | \"CARDANO_STAKING\"\n | \"RAW_SIGNING\"\n | \"SEND\"\n | \"MESSAGE_SIGNING\"\n | \"CREATE_SPL_TOKEN_ACCOUNT\"\n | \"TRANSFER_SPL_TOKEN\"\n | \"STAKE\";\n\nexport type GateRuleTransactionFilter = {\n type: \"TRANSACTION_FILTER\";\n data:\n | { preset: Exclude<GateRuleTransactionFilterPreset, \"TRANSFER_SPL_TOKEN\"> }\n | { preset: \"TRANSFER_SPL_TOKEN\"; contract_address: string };\n};\n\nexport type GateGovernanceRule =\n | GateRuleMultiAuth\n | GateRuleThreshold\n | GateRuleWhitelist\n | GateRuleSCI\n | GateRuleTransactionFilter;\n\nexport type GateGovernanceRulesSet = {\n name: string;\n rules: GateGovernanceRule[];\n};\n\nexport type WeirdGateRuleMultiAuthStep =\n | { quorum: number; group_id: number }\n | { quorum: number; users: number[] };\n\nexport type WeirdGateRuleMultiAuth = {\n type: \"MULTI_AUTHORIZATIONS\";\n data: WeirdGateRuleMultiAuthStep[];\n};\n\nexport type WeirdGateRuleThreshold = {\n type: \"THRESHOLD\";\n data: [\n {\n currency_type: \"CRYPTO\";\n // *just* when creating threshold, `max` is optional and can't be null\n max?: string;\n min: string | null;\n },\n ];\n};\n\nexport type WeirdGateRuleWhitelist = {\n type: \"WHITELIST\";\n data: number[];\n};\n\nexport type WeirdGateGovernanceRule =\n | WeirdGateRuleMultiAuth\n | WeirdGateRuleThreshold\n | GateRuleSCI\n | GateRuleTransactionFilter\n | WeirdGateRuleWhitelist;\n\nexport type WeirdGateGovernanceRulesSet = {\n name: string;\n rules: WeirdGateGovernanceRule[];\n};\n\nexport type GateLabel = {\n id: number;\n name: string;\n info: {\n color: string;\n description: string;\n };\n};\n\nexport type GateAccountCommon = {\n id: number;\n account_type: AccountType;\n entityType: \"ACCOUNT\";\n address?: string;\n contract_address: string;\n name: string;\n settings: AccountSettings;\n balance: any; //Bignumber\n available_balance: any; //Bignumber\n currency: string;\n parent_balance?: any; //Bignumber\n has_access_to_parent: boolean | null;\n created_on: string;\n governance_rules: GateGovernanceRulesSet[] | null;\n next_governance_rules: GateGovernanceRulesSet[] | null;\n fresh_addresses: any;\n nfts_gallery_enabled?: boolean;\n is_hsm_coin_app_updated: boolean;\n is_under_edit: boolean;\n index: number;\n status: AccountStatus;\n xpub: string;\n parent: number | null;\n derivation_path: string;\n labels: GateLabel[];\n extended_public_key: {\n public_key: string;\n chain_code: string;\n };\n derivation_mode: \"STANDARD\" | \"NATIVE_SEGWIT\";\n entity_id?: number;\n last_request?: GateAccountRequest;\n is_tradelink?: boolean;\n tradelink_data?: GateAccountTradelinkData;\n synced_on: string | null;\n last_sync_requested_at: string | null;\n policy?: GatePolicy;\n is_raw_signing_account?: boolean;\n};\n\nexport interface GateAccountExchangeOptions {\n auto_repledge_enabled: boolean;\n requires_pre_approval: boolean;\n}\nexport interface GateAccountTradelinkData {\n asset_manager: GateTradelinkAssetManager;\n custodian: GateTradelinkThirdParty<\"CUSTODIAN\">;\n exchanges: Array<GateTradelinkExchange & GateAccountExchangeOptions>;\n total_repledge: string;\n}\n\nexport interface GateAccountEthereum extends GateAccountCommon {\n account_type: \"Ethereum\";\n sci_config: GateSCIConfig | null;\n ethereum_data?: {\n staking?: {\n total_staking: string;\n total_rewards: string;\n available_rewards: string;\n network_apy: string;\n };\n };\n}\n\nexport interface GateTradelinkThirdParty<T extends \"CUSTODIAN\" | \"ASSET_MANAGER\" | \"EXCHANGE\"> {\n code: string;\n id: string;\n logo_url: string | null;\n name: string;\n role: T;\n}\n\nexport interface GateTradelinkRequest extends GateGenericRequest {\n tradelink: GateTradelink;\n type: \"CREATE_TRADELINK\" | \"EDIT_TRADELINK\";\n target_type: \"TRADELINK\";\n edit_data?: {\n operators: string[]; // pub_keys\n };\n}\n\nexport interface GateTradelinkExchangeRequest extends GateGenericRequest {\n tradelink: GateTradelinkExchange;\n type: \"CREATE_TRADELINK_EXCHANGE\" | \"EDIT_TRADELINK_EXCHANGE\";\n target_type: \"TRADELINK_EXCHANGE\";\n tradelink_exchange: GateTradelinkExchange;\n edit_data?: {\n operators: string[]; // pub_keys\n addresses: Array<Omit<GateAddress, \"id\">>;\n };\n}\n\nexport interface GateTradelinkAssetManagerRequest extends GateGenericRequest {\n tradelink: GateTradelinkAssetManager;\n type: \"CREATE_TRADELINK_ASSET_MANAGER\" | \"EDIT_TRADELINK_ASSET_MANAGER\";\n target_type: \"TRADELINK_ASSET_MANAGER\";\n tradelink_asset_manager: GateTradelinkAssetManager;\n edit_data?: {\n operators: string[]; // pub_keys\n addresses: Array<Omit<GateAddress, \"id\">>;\n };\n}\n\nexport type SPLToken = {\n token_name: string;\n associated_token_account: string;\n account_name: string;\n contract_address: string;\n available: string;\n pending: string;\n status: \"ACTIVE\" | \"INACTIVE\" | \"VIEW_ONLY\";\n ticker: string;\n creation_transaction_hash: string;\n parent_id: number;\n};\n\nexport interface GateAccountBitcoin extends GateAccountCommon {\n account_type: \"Bitcoin\";\n}\nexport interface GateAccountTRC20 extends GateAccountCommon {\n account_type: \"Trc20\";\n parent_available_balance: BigNumber;\n}\nexport interface GateAccountERC20 extends GateAccountCommon {\n account_type: \"Erc20\";\n parent_available_balance: BigNumber;\n}\nexport interface GateAccountRipple extends GateAccountCommon {\n account_type: \"Ripple\";\n}\nexport interface GateAccountStellar extends GateAccountCommon {\n account_type: \"Stellar\";\n}\nexport interface GateAccountTezos extends GateAccountCommon {\n account_type: \"Tezos\";\n}\nexport interface GateAccountSolana extends GateAccountCommon {\n account_type: \"Solana\";\n solana_data?: {\n tokens?: SPLToken[];\n can_create_spl_token_accounts: boolean;\n };\n}\nexport interface GateAccountCardano extends GateAccountCommon {\n account_type: \"Cardano\";\n cardano_data: {\n balances: CardanoBalances;\n };\n}\nexport interface GateAccountTron extends GateAccountCommon {\n account_type: \"Tron\";\n tron_data: {\n available: number;\n bandwidth: number;\n energy: number;\n pending: number;\n total: number;\n };\n}\n\nexport interface GateAccountPolkadot extends GateAccountCommon {\n account_type: \"Polkadot\";\n polkadot_data: PolkadotAccountData;\n}\n\nexport type GateAccount =\n | GateAccountEthereum\n | GateAccountBitcoin\n | GateAccountERC20\n | GateAccountTRC20\n | GateAccountStellar\n | GateAccountTezos\n | GateAccountSolana\n | GateAccountPolkadot\n | GateAccountRipple\n | GateAccountCardano\n | GateAccountTron;\n\nexport type GateVaultEntityStatus = \"PENDING\" | \"ACTIVE\" | \"ABORTED\" | \"REVOKED\" | \"TO_MIGRATE\";\n\nexport type GateWorkspacePermission = \"ROOT\" | \"CREATE_ACCOUNT_WITH_POLICY\";\n\nexport type GateWorkspaceRuleStep = {\n quorum: number;\n users: string[]; // array of public keys\n};\n\nexport type GateWorkspaceRule = {\n id: number;\n permission: GateWorkspacePermission;\n status: \"ACTIVE\";\n steps: GateWorkspaceRuleStep[];\n\n // Gate will never serialize them, but assigning the key to respect what's in all the other entities\n last_request: null;\n};\n\nexport type GateExchange = {\n id: number;\n entityType: \"EXCHANGE\";\n created_by: GateUser;\n created_on: string;\n balances: {\n available: string;\n locked: string;\n total: string;\n };\n governance_rules: GateGovernanceRulesSet[] | null;\n last_request: GateExchangeRequest;\n name: string;\n platform: string;\n status: \"PENDING\" | \"ACTIVE\" | \"ABORTED\";\n};\n\nexport type GatePolicy = {\n id: number;\n entityType: \"POLICY\";\n created_by: GateUser;\n created_on: string;\n last_request: GatePolicyRequest;\n name: string;\n currency: string | null;\n description: string | null;\n governance_rules: GateGovernanceRulesSet[];\n account_ids: GateAccount[\"id\"][];\n status: \"PENDING\" | \"ACTIVE\" | \"ABORTED\";\n};\n\nexport type GateTradelinkEntity<T extends \"CUSTODIAN\" | \"ASSET_MANAGER\" | \"EXCHANGE\"> = Omit<\n GateTradelinkThirdParty<T>,\n \"role\"\n>;\n\nexport type GateTradelinkNetwork = {\n id: string;\n asset_managers: GateTradelinkEntity<\"ASSET_MANAGER\">[];\n custodian: GateTradelinkEntity<\"CUSTODIAN\">;\n exchanges: GateTradelinkEntity<\"EXCHANGE\">[];\n};\n\nexport type GateTradelinkOnboardingStatus = {\n status:\n | \"NOT_READY\"\n | \"READY_TO_ONBOARD\"\n | \"CUSTODIAN_ONBOARDED\"\n | \"EXCHANGE_ONBOARDED\"\n | \"HSM_READY\";\n};\n\nexport type GateVaultEntity = {\n id: number;\n entityType: \"VAULT_ENTITY\";\n name: string;\n accounts: GateAccount[];\n status: GateVaultEntityStatus;\n created_on: string;\n last_request?: GateVaultEntityRequest;\n};\n\ntype WhitelistType = \"TRANSACTION\" | \"SMART_CONTRACT\";\n\nexport type GateWhitelist = {\n id: number;\n name: string;\n entityType: \"WHITELIST\";\n description: string;\n addresses: GateAddress[];\n created_on: string;\n created_by: GateUser;\n approvals: Approval[];\n status: \"ACTIVE\" | \"PENDING\" | \"ABORTED\" | \"REVOKED\" | \"TO_MIGRATE\";\n last_request?: GateWhitelistRequest;\n whitelist_type?: WhitelistType;\n is_tradelink?: boolean;\n};\n\ntype GateTransactionNote = {\n title: string;\n content: string;\n};\n\nexport type GateTransactionType =\n | \"SEND\"\n | \"RECEIVE\"\n | \"PREBURN\"\n | \"BURN\"\n | \"MINT\"\n | \"DELEGATE\"\n | \"UNDELEGATE\"\n | \"DELEGATE_VOTE_TO_DREP\"\n | \"STAKING_REGISTER\"\n | \"STAKING_DEREGISTER\"\n | \"STAKING_DELEGATE\"\n | \"STAKING_WITHDRAW\"\n | \"CREATE_SPL_TOKEN_ACCOUNT\";\n\nexport type CardanoVoteDelegationDrep = \"ALWAYS ABSTAIN\" | null;\n\nexport type GateTransaction = {\n id: number;\n account_id: number;\n recipient: string;\n type: GateTransactionType;\n created_on: string;\n created_by: GateUser;\n labels: GateLabel[];\n tx_hash: string;\n status:\n | \"ABORTED\"\n | \"APPROVED\"\n | \"CONFIRMED\"\n | \"DROPPED\"\n | \"FAILED\"\n | \"FAILED_TO_BROADCAST\"\n | \"PENDING_APPROVAL\"\n | \"PENDING_CREATE_IN_HSM\"\n | \"SIGNED\"\n | \"SUBMITTED\";\n amount: string;\n max_fees?: string;\n notes: GateTransactionNote[];\n last_request?: GateTransactionRequest;\n failure_reason?: string | null;\n tx_parameters?: {\n drep?: CardanoVoteDelegationDrep;\n tradelink?: {\n type: \"SETTLEMENT\";\n settlement_id: string;\n pledge_id: string;\n };\n token_address?: string;\n };\n};\n\ntype Approval = {\n created_on: string;\n created_by: GateUser;\n type: \"APPROVE\" | \"ABORT\";\n};\n\nexport type GateAddress = {\n id: number;\n currency: string;\n address: string;\n name: string;\n destination_tags?: number[] | null;\n};\n\nexport type GateGenericRequest = {\n entityType: \"REQUEST\";\n created_by: GateUser | null;\n created_on: string;\n id: number;\n status: string;\n type: string;\n approvals?: RequestApproval[];\n approvals_steps: Array<{\n group: GateGroup;\n quorum: number;\n }>;\n current_step: number;\n target_id: number;\n target_type: string;\n quorum?: number;\n organization?: Organization;\n expired_at: Date;\n edit_data?: any;\n};\n\nexport interface GateAccountRequest extends GateGenericRequest {\n // TODO we probably want to have GateAccountBitcoin/Ethereum..etc.. based on target_type\n account: GateAccount;\n target_type:\n | \"BITCOIN_ACCOUNT\"\n | \"ETHEREUM_ACCOUNT\"\n | \"RIPPLE_ACCOUNT\"\n | \"TEZOS_ACCOUNT\"\n | \"POLKADOT_ACCOUNT\"\n | \"ERC20_ACCOUNT\"\n | \"STELLAR_ACCOUNT\"\n | \"SOLANA_ACCOUNT\"\n | \"CARDANO_ACCOUNT\"\n | \"TRON_ACCOUNT\";\n type:\n | \"CREATE_ACCOUNT\"\n | \"EDIT_ACCOUNT\"\n | \"REVOKE_ACCOUNT\"\n | \"EDIT_TOKEN_RULE\"\n | \"MIGRATE_ACCOUNT\"; // TODO migration code should be remove;\n request_data: Partial<{\n currency: { name: string };\n derivation_mode: string;\n entity_id: number | null;\n governance_rules: GateGovernanceRulesSet[];\n name: string;\n }>;\n}\n\nexport interface GateSPLTokenAccountRequest extends GateGenericRequest {\n account: GateAccount;\n target_type: \"SOLANA_ACCOUNT\";\n type: \"EDIT_TOKEN_RULE\";\n target_id: number;\n edit_data: {\n governance_rules: GateGovernanceRulesSet[];\n };\n request_data: Partial<{\n governance_rules: GateGovernanceRulesSet[];\n }>;\n contract_address: string;\n}\n\nexport interface GateActivateRequest extends GateGenericRequest {\n target_type: GateAccountRequest[\"target_type\"];\n target_id: number;\n target: GateAccount;\n type: \"ACTIVATE\";\n}\n\nexport interface GateRepledgeRequest extends GateGenericRequest {\n repledge: GateRepledge;\n target_type: \"REPLEDGE\";\n type: \"CREATE_REPLEDGE\";\n}\nexport interface GatePledgeIncrementRequest extends GateGenericRequest {\n pledge_increment: GatePledgeIncrement;\n target_type: \"PLEDGE_INCREMENT\";\n type: \"CREATE_PLEDGE_INCREMENT\";\n}\nexport interface GateForcedUnpledgeRequest extends GateGenericRequest {\n forced_unpledge: GateForcedUnpledge;\n target_type: \"FORCED_UNPLEDGE\";\n type: \"CREATE_FORCED_UNPLEDGE\";\n}\n\nexport interface GateUserRequest extends GateGenericRequest {\n url_id: string;\n user: GateUser;\n target_type: \"PERSON\";\n type:\n | \"REVOKE_USER\"\n | \"CREATE_ADMIN\"\n | \"CREATE_OPERATOR\"\n | \"CREATE_API_USER\"\n | \"CREATE_API_USER_ACCESS\"\n | \"MIGRATE_ADMIN\"\n | \"MIGRATE_OPERATOR\"; // TODO migration code should be remove\n}\n\nexport interface GateAPIV2UserAccessRequest extends GateGenericRequest {\n username: string;\n user: GateUser;\n api_key_id: string;\n api_key_secret: string;\n target_type: \"PERSON\";\n type: \"CREATE_API_USER\" | \"CREATE_API_USER_ACCESS\";\n}\n\nexport interface GateSCIConfigRequest extends GateGenericRequest {\n sciconfig: GateSCIConfig;\n target_type: \"SCI_CONFIG\";\n type: \"CREATE_SCICONFIG\" | \"EDIT_SCICONFIG\";\n edit_data?: {\n custom_contract_call_enabled: boolean;\n dapps: string[];\n };\n request_data?: {\n custom_contract_call_enabled: boolean;\n dapps: string[];\n };\n}\n\nexport interface GateMessageRequest extends GateGenericRequest {\n target_type: \"MESSAGE\";\n message: GateMessage;\n type: \"MESSAGE_SIGNING\";\n}\n\nexport interface GateWhitelistRequest extends GateGenericRequest {\n whitelist: GateWhitelist;\n target_type: \"WHITELIST\";\n type: \"CREATE_WHITELIST\" | \"EDIT_WHITELIST\" | \"MIGRATE_WHITELIST\"; // TODO migration code should be remove;\n edit_data?: {\n name?: string;\n addresses: GateAddress[];\n };\n}\n\nexport interface GateExchangeRequest extends GateGenericRequest {\n exchange: GateExchange;\n target_type: \"EXCHANGE\";\n type: \"IMPORT_EXCHANGE\" | \"EDIT_EXCHANGE\" | \"EDIT_EXCHANGE_CREDENTIALS\" | \"REVOKE_EXCHANGE\";\n}\n\nexport interface GateTransactionRequest extends GateGenericRequest {\n // TODO we probably want to have GateTransactionBitcoin/Ethereum..etc.. based on target_type\n transaction: GateTransaction;\n target_type:\n | \"BITCOIN_LIKE_TRANSACTION\"\n | \"ETHEREUM_LIKE_TRANSACTION\"\n | \"RIPPLE_LIKE_TRANSACTION\"\n | \"POLKADOT_LIKE_TRANSACTION\"\n | \"TEZOS_LIKE_TRANSACTION\"\n | \"STELLAR_LIKE_TRANSACTION\"\n | \"CARDANO_LIKE_TRANSACTION\";\n type: \"CREATE_TRANSACTION\";\n}\n\nexport const GateGroupRequestTypeDefs = [\n \"CREATE_GROUP\",\n \"EDIT_GROUP\",\n \"REVOKE_GROUP\",\n \"MIGRATE_GROUP\",\n] as const;\n\nexport interface GateGroupRequest extends GateGenericRequest {\n group: GateGroup;\n target_type: \"GROUP\";\n type: (typeof GateGroupRequestTypeDefs)[number]; // TODO migration code should be remove\n}\n\nexport interface GateDigestsRequest extends GateGenericRequest {\n digests: GateDigestGroup;\n target_type: \"DIGESTS\";\n type: \"SIGN_DIGESTS\";\n}\n\nexport interface GateOrganizationRequest extends GateGenericRequest {\n organization: Organization;\n target_type: \"ORGANIZATION\";\n type: \"UPDATE_QUORUM\";\n}\n\nexport interface GateAPIKeyRequest extends GateGenericRequest {\n api_key: GateAPIKey;\n target_type: \"VAULT_API_KEY\";\n type: \"CREATE_API_KEY\" | \"EDIT_API_KEY\" | \"REVOKE_API_KEY\";\n}\n\nexport interface GateTransferRequest extends GateGenericRequest {\n transfer: GateTransfer;\n target_type: \"TRANSFER\";\n type: \"CREATE_TRANSFER\";\n}\n\nexport interface GateVaultEntityRequest extends GateGenericRequest {\n vaultEntity: GateVaultEntity;\n target_type: \"ENTITY\";\n type: \"CREATE_ENTITY\" | \"EDIT_ENTITY\" | \"REVOKE_ENTITY\";\n edit_data?: {\n name: string;\n accounts: number[];\n };\n}\n\nexport interface GatePolicyRequest extends GateGenericRequest {\n policy: GatePolicy;\n target_type: \"POLICY\";\n type: \"CREATE_POLICY\" | \"EDIT_POLICY\";\n}\n\nexport type Organization = {\n name: string;\n domain_name: string;\n workspace: string;\n number_of_admins: number;\n quorum: number;\n};\n\ntype RequestApproval = {\n created_by: GateUser;\n created_on: string;\n type: string;\n step: number;\n};\n\n// a LAM user is referenced by string\nexport type UserDevice = number | string;\n\nexport type ManifestGroup = {\n name: string;\n users: UserDevice[];\n description?: string;\n status?: \"PENDING\" | \"ACTIVE\" | \"ABORTED\";\n};\n\nexport type ManifestAccountRuleMultiAuthStep =\n | { quorum: number; users: UserDevice[] }\n | { quorum: number; group: string };\n\nexport type ManifestAccountRuleMultiAuth = {\n type: \"MULTI_AUTHORIZATIONS\";\n steps: ManifestAccountRuleMultiAuthStep[];\n};\n\nexport type ManifestAccountRuleSCI = {\n type: \"SMART_CONTRACT_INTERACTION\";\n enabled: boolean;\n};\n\nexport type ManifestAccountRuleTezosDelegation = {\n type: \"TEZOS_DELEGATION\";\n};\nexport type ManifestAccountRulePolkadotStaking = {\n type: \"POLKADOT_STAKING\";\n};\nexport type ManifestAccountRuleDeployContract = {\n type: \"DEPLOY_CONTRACT\";\n};\nexport type ManifestAccountRuleSolanaStaking = {\n type: \"SOLANA_STAKING\";\n};\nexport type ManifestAccountRuleCardanoStaking = {\n type: \"CARDANO_STAKING\";\n};\nexport type ManifestAccountRuleRawSigning = {\n type: \"RAW_SIGNING\";\n};\nexport type ManifestAccountRuleSend = {\n type: \"SEND\";\n};\nexport type ManifestAccountRuleStake = {\n type: \"STAKE\";\n};\nexport type ManifestAccountRuleMessageSigning = {\n type: \"MESSAGE_SIGNING\";\n};\n\nexport type ManifestAccountRuleCreateSplTokenAccount = {\n type: \"CREATE_SPL_TOKEN_ACCOUNT\";\n};\n\nexport type ManifestAccountRuleTransferSplToken = {\n type: \"TRANSFER_SPL_TOKEN\";\n contractAddress: string;\n};\n\nexport type ManifestAccountRuleWhitelist = {\n type: \"WHITELIST\";\n whitelists: string[];\n};\n\nexport type ManifestAccountRuleThreshold = {\n type: \"THRESHOLD\";\n min?: number;\n max?: number;\n};\n\nexport type ManifestAccountRule =\n | ManifestAccountRuleMultiAuth\n | ManifestAccountRuleWhitelist\n | ManifestAccountRuleSCI\n | ManifestAccountRuleDeployContract\n | ManifestAccountRuleThreshold\n | ManifestAccountRulePolkadotStaking\n | ManifestAccountRuleSolanaStaking\n | ManifestAccountRuleCardanoStaking\n | ManifestAccountRuleRawSigning\n | ManifestAccountRuleTezosDelegation\n | ManifestAccountRuleSend\n | ManifestAccountRuleMessageSigning\n | ManifestAccountRuleCreateSplTokenAccount\n | ManifestAccountRuleTransferSplToken\n | ManifestAccountRuleStake;\n\nexport type ManifestAccountConfig = {\n nftGallery?: boolean;\n};\n\ntype ManifestTradelinkOrg = {\n name: string;\n};\n\ntype AccountTradelinkExchangeData = {\n name: string;\n requires_pre_approval: boolean;\n auto_repledge_enabled: boolean;\n};\n\nexport type ManifestAccountTradelinkData = {\n currency: string;\n custodian: ManifestTradelinkOrg;\n asset_manager: ManifestTradelinkOrg;\n exchanges: AccountTradelinkExchangeData[];\n};\n\ntype ManifestCryptoAccount = {\n name: string;\n currency: string;\n accountType?: string;\n derivationMode?: string;\n rules?: Array<ManifestAccountRule[]>;\n policy?: string;\n status?: \"PENDING\" | \"ABORTED\" | \"ACTIVE\";\n index?: number;\n readOnly?: {\n xpub: string;\n publicKey: string;\n chainCode: string;\n address?: string;\n };\n tradelink_data?: ManifestAccountTradelinkData;\n // all the fields that doesn't require a request to be changed\n config?: ManifestAccountConfig;\n};\n\ntype ManifestERC20Account = {\n name: string;\n contractAddress: string;\n parentAccount?: string;\n rules?: Array<ManifestAccountRule[]>;\n policy?: string;\n status?: \"PENDING\" | \"ABORTED\" | \"ACTIVE\";\n index?: number;\n tradelink_data?: ManifestAccountTradelinkData;\n};\n\nexport type ManifestAccount = ManifestCryptoAccount | ManifestERC20Account;\n\nexport type ManifestVaultEntity = {\n name: string;\n accounts?: string[];\n status?: \"PENDING\" | \"ACTIVE\" | \"ABORTED\";\n};\n\nexport type ManifestWhitelistAddress = {\n currency: string;\n name?: string;\n address: string;\n destination_tags?: number[] | null;\n};\n\nexport type ManifestWhitelist = {\n name: string;\n addresses: ManifestWhitelistAddress[];\n description?: string;\n status?: \"PENDING\" | \"ABORTED\";\n type?: WhitelistType;\n};\n\nexport type ManifestUser = {\n device: number;\n};\n\nexport type ManifestAPIUser = {\n name: string;\n viewAll?: boolean;\n};\n\nexport type ManifestAPIV2User = {\n name: string;\n role: string;\n publicKey?: string;\n viewAll?: boolean;\n};\n\nexport type ManifestExchange = {\n name: string;\n platform: string;\n rules?: Array<ManifestAccountRule[]>;\n status?: \"PENDING\" | \"ACTIVE\" | \"ABORTED\";\n\n // note for the future: one day we will be able to put\n // extra fields in the configuration, for now, all exchanges\n // receive `apiKey` and `secret` only\n configuration: {\n apiKey: string;\n apiSecret: string;\n };\n};\n\nexport type ManifestPolicy = {\n name: string;\n currency?: string;\n rules: Array<ManifestAccountRule[]>;\n status?: \"PENDING\" | \"ACTIVE\" | \"ABORTED\";\n};\n\nexport type ManifestWorkspaceRuleStep = {\n quorum: number;\n users: string[]; // array of api admin usernames\n};\n\nexport type ManifestWorkspaceRule = {\n permission: Exclude<GateWorkspacePermission, \"ROOT\">;\n steps: ManifestWorkspaceRuleStep[];\n};\n\ninterface ManifestCommon {\n salt?: string;\n quorum?: number;\n customUsernames?: Record<string, string>;\n groups?: ManifestGroup[];\n accounts?: ManifestAccount[];\n entities?: ManifestVaultEntity[];\n whitelists?: ManifestWhitelist[];\n exchanges?: ManifestExchange[];\n policies?: ManifestPolicy[];\n tradelink?: ManifestTradelink;\n contractApprovals?: ManifestContractApproval[];\n workspaceRules?: ManifestWorkspaceRule[];\n}\n\nexport type ManifestTradelink = {\n onboarded: boolean;\n exchanges: ManifestTradelinkEntityWithAddresses[];\n assetManagers: ManifestTradelinkEntityWithAddresses[];\n custodians: ManifestTradelinkEntity[];\n};\n\nexport type ManifestTradelinkEntity = {\n id: string;\n name: string;\n logoUrl: string;\n code: string;\n users: {\n operators?: number[];\n apiV2?: string[];\n };\n};\n\nexport type ManifestTradelinkEntityWithAddresses = {\n id: string;\n name: string;\n logoUrl: string;\n code: string;\n users: {\n operators?: number[];\n apiV2: string[];\n };\n addresses: ManifestWhitelistAddress[];\n};\n\nexport type ManifestContractApproval = {\n user: number;\n contractNames: string[];\n};\n\nexport interface Manifest extends ManifestCommon {\n users?: {\n operators?: Array<number | ManifestUser>;\n admins?: Array<number | ManifestUser>;\n api?: Array<string | ManifestAPIUser>;\n apiV2?: Array<ManifestAPIV2User>;\n };\n}\n\nexport interface DeserializedManifest extends ManifestCommon {\n users?: {\n operators?: ManifestUser[];\n admins?: ManifestUser[];\n api?: ManifestAPIUser[];\n apiV2?: ManifestAPIV2User[];\n };\n}\n\nexport const feesLevels = [\"SLOW\", \"NORMAL\", \"FAST\", \"CUSTOM\"] as const;\nexport type FeesLevel = (typeof feesLevels)[number];\n\nexport type ManifestTransaction = {\n // account name\n account: string;\n // recipient address\n recipient: string;\n // transaction amount in default unit (e.g BTC)\n amount: string | number;\n utxosPickingStrategy?: UTXOsPickingStrategy;\n contractPayload?: string;\n transactionType?: GateTransactionType;\n feesLevel?: FeesLevel;\n gasPrice?: string;\n gasLimit?: string;\n title?: string;\n comment?: string;\n maxFees?: string;\n\n // EIP1559-specific\n baseFees?: string;\n maxFeesBufferFactor?: string;\n priorityFees?: string;\n};\n\nexport type OnboardingContext = {\n pool: DevicesPool;\n getState: () => Promise<any>;\n getChallenge: () => Promise<any>;\n next: (data?: any) => Promise<void>;\n collectMasterSeedFragment: (challenge: any, deviceIndex: number) => Promise<void>;\n validateSO: (challenge: any, deviceIndex: number) => Promise<void>;\n registerAdmin: (data: any, deviceIndex: number) => Promise<void>;\n registerSO: (data: any, deviceIndex: number) => Promise<void>;\n registerWrappingKey: (challenge: any, deviceIndex: number) => Promise<void>;\n};\n\nexport type OnboardingStep =\n | \"WRAPPING_KEYS_REGISTRATION\"\n | \"ADMINS_REGISTRATION\"\n | \"QUORUM_SETTINGS\"\n | \"SHARED_OWNERS_REGISTRATION\"\n | \"ADMIN_APPROVALS\"\n | \"MASTER_SEED_GENERATION\";\n\nexport interface RecordLogger extends Logger {\n logs: string[];\n reset: () => void;\n expect: (s: string) => void;\n}\n\nexport type RunnableOptions = {\n logger?: Logger;\n};\n\nexport type MockNetworkResponse = [\n string, // verb: GET, POST, ...\n string, // url\n number, // returned status code\n any?, // returned data\n any?, // expected request payload\n any?, // returned headers\n any?, // expected request headers\n];\n\nexport type LegacyERC20Token = {\n blockchain_name: \"foundation\" | \"ropsten\" | \"goerli\";\n contract_address: string;\n decimals: number;\n hsm_account_parameters: string;\n hsm_signature: string;\n name: string;\n ticker: string;\n};\n\nexport type GateCoinCapabilities = {\n signer: {\n raw_signing_supported: boolean;\n send_clear_signing_supported: boolean;\n stake_clear_signing_supported: boolean;\n };\n wallet: {\n balance_supported: boolean;\n broadcast_supported: boolean;\n crafting_supported: boolean;\n tx_history_supported: boolean;\n };\n};\n\nexport type GateTokenCurrency = {\n contract_address: string;\n family: \"ethereum\";\n name: string;\n parent_currency: \"ethereum\" | \"ethereum_ropsten\" | \"ethereum_goerli\" | \"bsc\" | \"tron\";\n ticker: string;\n token_type: \"erc20\" | \"stablecoin\" | \"bep20\" | \"trc20\";\n units: [Unit];\n delisted?: boolean;\n disable_countervalue?: boolean;\n capabilities?: GateCoinCapabilities;\n\n // FIXME: here only for retro-compatibility with gate < 3.6 (that expect front to send hsm parameters)\n __legacy_hsm_account_parameters?: string;\n __legacy_hsm_signature?: string;\n};\n\nexport type GateCurrency = {\n name: string;\n type: \"CRYPTO\";\n family: string;\n confirmations_needed: number;\n units: Unit[];\n capabilities?: GateCoinCapabilities;\n};\n\n// surprisingly the gate expect some fields to change\n// from the erc20 token *it literally send* us\nexport type WeirdGateERC20Token = {\n ticker: string;\n address: string;\n decimals: number;\n hsm_signature: string;\n hsm_account_parameters: string;\n};\n\nexport type WeirdGateTokenCurrency = {\n type: \"erc20\" | \"stablecoin\" | \"trc20\";\n address: string;\n};\n\nexport type DaemonAddress = {\n address: string;\n derivation_path: string;\n};\n\nexport type VaultEvent =\n | Ev<\"ACCOUNT_UPDATED\", GateAccount>\n | Ev<\"REQUEST_CREATED\", GateRequest>\n | Ev<\"REQUEST_ABORTED\", GateRequest>\n | Ev<\"REQUEST_APPROVAL\", GateRequest>\n | Ev<\"REQUEST_APPROVED\", GateRequest>\n | Ev<\"TRANSACTION_BROADCASTED\", GateTransaction>\n | Ev<\"TRANSACTION_RECEIVED\", GateTransaction>\n | Ev<\"TRANSACTION_FAILED\", GateTransaction>\n | Ev<\"USER_REGISTERED\", GateUser>\n | Ev<\"USER_SUSPENDED\", GateUser>;\n\ntype Ev<T, P> = { type: T; payload: P };\n\nexport type { CryptoCurrency, TokenCurrency };\nexport type UserWithDevice = { deviceIndex: number; user: GateUser };\nexport type UserWithoutDevice = { username: string; user: GateUser };\n\nexport type CurrencyOrToken = CryptoCurrency | TokenCurrency;\n\nexport type Network = <T>(\n method: \"POST\" | \"PUT\" | \"GET\" | \"DELETE\",\n url: string,\n data?: any,\n requestOptions?: any,\n) => Promise<T>;\n\nexport type WipeOptions = {\n gate: string;\n lam?: string;\n lamAPIKey?: string;\n hsmCompartmentID: number;\n hsmEndpoint: string;\n hsmCert: Buffer;\n hsmCertKey: Buffer;\n monotonicCountersSize?: number;\n fileSystemSize?: number;\n};\n\nexport interface BakeManifestOptions extends RunnableOptions {\n noApproval?: boolean;\n runner?: ManifestRunner;\n untilStep?: OnboardingStep;\n twoStepsRequest?: boolean;\n waitForActive?: boolean;\n\n // revault-compat onboarding\n revaultOnboarding?: {\n compartmentId: number;\n hsmScriptsVersion: string;\n revaultApiUrl: string;\n revaultRootAuthToken: string;\n };\n}\n\n// 'MR' stands for 'ManifestRunner'\ntype MRAction<P, R> = (params: P) => Promise<R>;\n\nexport type MRCreateUserParams = {\n role: \"admin\" | \"operator\";\n userID: string;\n name: string;\n device: number;\n};\n\nexport type MRCreateAPIUserParams = {\n user: ManifestAPIUser;\n userID: string;\n name: string;\n};\n\nexport type MRCreateAPIV2UserParams = {\n user: ManifestAPIV2User;\n publicKey: string;\n role: string;\n name: string;\n};\n\nexport type MRBakeGroupParams = {\n group: ManifestGroup;\n data: DataGroup;\n existingRequest: GateGroupRequest | null;\n noApproval: boolean;\n twoStepsRequest?: boolean;\n};\n\nexport type MRBakeAccountParams = {\n account: ManifestAccount;\n data: DataAccount;\n existingRequest: GateAccountRequest | null;\n noApproval: boolean;\n twoStepsRequest?: boolean;\n waitForActive?: boolean;\n tradelinkAM?: ManifestAPIV2User;\n};\n\nexport type MRBakeVaultEntityParams = {\n vaultEntity: ManifestVaultEntity;\n data: DataVaultEntity;\n existingRequest: GateVaultEntityRequest | null;\n noApproval: boolean;\n};\n\nexport type MRBakeWhitelistParams = {\n whitelist: ManifestWhitelist;\n data: DataWhitelist;\n existingRequest: GateWhitelistRequest | null;\n noApproval: boolean;\n twoStepsRequest?: boolean;\n};\n\nexport type MRBakeExchangeParams = {\n exchange: ManifestExchange;\n data: DataExchange;\n existingRequest: GateExchangeRequest | null;\n noApproval: boolean;\n twoStepsRequest?: boolean;\n};\n\nexport type MRBakePolicyParams = {\n policy: ManifestPolicy;\n data: DataPolicy;\n existingRequest: GatePolicyRequest | null;\n noApproval: boolean;\n twoStepsRequest?: boolean;\n};\n\nexport type MRBakeTradelinkOnboardingParams = {\n type: \"CREATE_TRADELINK\";\n operators: string[];\n};\n\nexport type MREditQuorumParams = {\n quorum: number;\n};\n\nexport type MREditWorkspaceRuleParams = {\n rule: ManifestWorkspaceRule;\n usersByName: Record<string, GateUser>;\n};\n\nexport type MBRBakeTradelinkEntityWithAddresses = {\n operators: string[];\n addresses: ManifestWhitelistAddress[];\n name: string;\n};\n\nexport type MRBakeTradelinkEntityParams = {\n tradelinkEntity: ManifestTradelinkEntity | ManifestTradelinkEntityWithAddresses;\n type: \"asset_managers\" | \"exchanges\" | \"custodians\";\n};\n\nexport type MRBakeTradelinkEntityOnboardingParams = {\n tradelinkEntity: MBRBakeTradelinkEntityWithAddresses;\n type: \"asset_managers\" | \"exchanges\";\n tradelinkEntityApprover: ManifestAPIV2User; // entity approver, like exchange approver of the exchange\n};\n\nexport type MRBakeTradelinkNetworkParams = {\n custodians: DataTradelinkNetworkEntity<\"CUSTODIAN\">[];\n exchanges: DataTradelinkNetworkEntity<\"EXCHANGE\">[];\n assetManagers: DataTradelinkNetworkEntity<\"ASSET_MANAGER\">[];\n};\n\nexport type DataTradelinkNetworkEntity<T extends \"CUSTODIAN\" | \"EXCHANGE\" | \"ASSET_MANAGER\"> = Pick<\n GateTradelinkThirdParty<T>,\n \"id\" | \"name\"\n>;\n\nexport type ManifestRunner = {\n editQuorum: (params: MREditQuorumParams) => Promise<void>;\n editWorkspaceRule: (params: MREditWorkspaceRuleParams) => Promise<void>;\n\n createUser: MRAction<MRCreateUserParams, GateUserRequest>;\n createAPIUser: (\n params: MRCreateAPIUserParams,\n r: RecipeManifestResult,\n ) => Promise<GateUserRequest>;\n createAPIV2User: MRAction<MRCreateAPIV2UserParams, GateUserRequest>;\n createAPIV2UserAccess: MRAction<MRCreateAPIV2UserParams, GateAPIV2UserAccessRequest>;\n\n createGroup: MRAction<MRBakeGroupParams, GateGroupRequest>;\n editGroup: MRAction<MRBakeGroupParams, GateGroupRequest>;\n\n createAccount: MRAction<MRBakeAccountParams, GateAccountRequest>;\n editAccount: MRAction<MRBakeAccountParams, GateAccountRequest>;\n\n createVaultEntity: MRAction<MRBakeVaultEntityParams, GateVaultEntityRequest>;\n editVaultEntity: MRAction<MRBakeVaultEntityParams, GateVaultEntityRequest>;\n\n createWhitelist: MRAction<MRBakeWhitelistParams, GateWhitelistRequest>;\n editWhitelist: MRAction<MRBakeWhitelistParams, GateWhitelistRequest>;\n\n createExchange: MRAction<MRBakeExchangeParams, GateExchangeRequest>;\n editExchange: MRAction<MRBakeExchangeParams, GateExchangeRequest>;\n\n createPolicy: MRAction<MRBakePolicyParams, GatePolicyRequest>;\n\n createTradelink: MRAction<MRBakeTradelinkOnboardingParams, GateTradelinkRequest>;\n createTradelinkEntity: <T extends \"ASSET_MANAGER\" | \"EXCHANGE\" | \"CUSTODIAN\">(\n params: MRBakeTradelinkEntityParams,\n ) => Promise<GateTradelinkEntity<T>>;\n onboardTradelinkEntity: MRAction<\n MRBakeTradelinkEntityOnboardingParams,\n GateTradelinkExchangeRequest | GateTradelinkAssetManagerRequest\n >;\n createTradelinkNetwork: MRAction<MRBakeTradelinkNetworkParams, GateTradelinkNetwork>;\n};\n\nexport type HsmCertificate = {\n attestation_pub: string;\n certificate: string;\n code_hash: string;\n signature: string;\n};\n\nexport type SecureChannel = {\n request_id: string;\n handshake: string;\n ciphertext: string;\n challenge: string;\n u2f_register_data: string;\n // defined for user registration\n handshake_attestation?: HsmCertificate;\n};\n\n// TODO centralize types with vault-remote\nexport type DeploymentStepID =\n | \"checkConnectivity\"\n | \"createNamespace\"\n | \"installNamespace\"\n | \"setupFeatureFlagsProvider\"\n | \"waitPods\"\n | \"success\";\n\nexport type DeploymentStep = {\n key: DeploymentStepID;\n labelWaiting: string;\n labelCurrent: string;\n labelSuccess: string;\n};\n\nexport type MVInstanceDeploymentFF = { key: string; set: boolean };\n\nexport type MVInstanceDeployment = {\n id: string;\n\n startedOn: Date;\n finishedOn: Date | null;\n\n status: \"BUSY\" | \"SUCCESS\" | \"ERROR\";\n steps: DeploymentStep[];\n currentStep: DeploymentStepID;\n\n instance: MVInstance;\n flags: Array<MVInstanceDeploymentFF>;\n\n error: Error | null;\n spawnFailTimeout?: ReturnType<typeof setTimeout>;\n};\n\nexport type MVPod = {\n name: string;\n podName: string;\n status: \"BUSY\" | \"HEALTHY\" | \"ERROR\" | \"EVICTED\";\n};\n\nexport type MVInstance = {\n name: string;\n status: string;\n host: string;\n pods: MVPod[];\n};\n\nexport type InteractionResponses = {\n network: Network;\n transport: any;\n secure_channel: any;\n pairing_payload: any;\n blob: any;\n confidentiality_key: any;\n attestation: any;\n u2f_key: any;\n onboardingRegisterChallenge: any;\n role: any;\n username: any;\n register_data: any;\n validation_key: any;\n u2f_register: any;\n validate_device: any;\n attested_handshake: any;\n};\n\nexport type Interaction<T> = {\n responseKey: string;\n action: (responses: InteractionResponses) => Promise<T>;\n device?: boolean;\n};\n\nexport type GetU2FPubKeyInteraction = Interaction<{\n pubKey: string;\n signature: Buffer;\n}>;\n\nexport type Interactions = {\n approveFlow: Interaction<any>[];\n approveFlowWithoutHSM: Interaction<any>[];\n doStartKpatternAsResponder: Interaction<any>;\n validateDevice: Interaction<any>;\n validatePayload: Interaction<any>;\n postApproval: Interaction<any>;\n postSimpleApproval: Interaction<any>;\n ensurePartitionPairing: Interaction<any>;\n finalizePairing: Interaction<any>;\n getAttestation: Interaction<{ attestation: Buffer }>;\n getConfidentialityPublicKey: Interaction<any>;\n getSecureChannel: Interaction<any>;\n getU2FChallenge: Interaction<any>;\n getU2FPublicKey: GetU2FPubKeyInteraction;\n getValidationPublicKey: Interaction<any>;\n initPairing: Interaction<any>;\n loginFlow: Interaction<any>[];\n operatorGetChallenge: Interaction<any>;\n postU2FSignature: Interaction<any>;\n postUserRegistration: Interaction<any>;\n readOnlyLoginFlow: (userName: string) => Interaction<any>[];\n registerUserFlow: Interaction<any>[];\n u2fAuthenticate: Interaction<any>;\n validateOperation: Interaction<any>[];\n};\n\n// API Types\nexport type APIBearerTokenResponse = {\n access_token: string;\n expires_in: number;\n refresh_token: string;\n session_state: string;\n token_type: string;\n};\n\nexport type APIGetChallengeResponse = {\n challenge: string;\n id: number;\n};\n\n// FIXME properly define this type at this is the response to /request\n// and it handle a lot of type, request target, request id\nexport type APIRequestResponse = {\n id: number;\n status: \"PENDING_APPROVAL\" | \"APPROVED\" | \"SUBMITTED\" | \"ABORTED\";\n};\n\nexport type APICreateTransactionRequest = {\n data: APIBitcoinLikeSend | APIEthereumLikeSend;\n note?: {\n content: string;\n title: string;\n };\n type: \"CREATE_TRANSACTION\";\n};\n\nexport type APIGenericSend = {\n account_id: number;\n fees_strategy: GenericFeesStrategy;\n transaction_data: {\n account_name: string;\n amount: string;\n max_fees: string;\n recipient: string;\n };\n};\n\nexport type APIBitcoinLikeSend = APIGenericSend & {\n transaction_data: {\n currency: \"bitcoin\" | \"bitcoin_testnet\";\n };\n transaction_type: \"BITCOIN_LIKE_SEND\";\n};\n\nexport type APIEthereumLikeSend = APIGenericSend & {\n transaction_data: {\n currency: \"ethereum\" | \"ethereum_sepolia\" | \"polygon\" | \"ethereum_holesky\";\n contract_address?: string;\n };\n transaction_type: \"ETHEREUM_LIKE_SEND\";\n};\n\ntype GenericFeesStrategy = {\n type: \"SPEED\";\n data: {\n speed: \"FAST\" | \"NORMAL\" | \"SLOW\";\n };\n};\n\n// FIXME properly define this type\nexport type APIEstimateFeesResponse = {\n max_fees: string;\n};\n\nexport type PsdModel = \"BLUE\" | \"STAX\";\n"]}
@@ -67,6 +67,7 @@ var prepareAccountCreation = ({ type, data }) => {
67
67
  hsmCustodiansIDsByName,
68
68
  hsmAssetManagersIDsByName,
69
69
  hsmExchangesIDsByName,
70
+ policiesIDsByName,
70
71
  usersByName,
71
72
  tokens
72
73
  } = data;
@@ -91,7 +92,7 @@ var prepareAccountCreation = ({ type, data }) => {
91
92
  throw new Error(`Can't determine account type`);
92
93
  }
93
94
  const unit = _chunk6NGBW7BGjs.getAccountUnit.call(void 0, account, tokens);
94
- const governance_rules = "tradelink_data" in account && !!account.tradelink_data ? null : transformManifestRules({
95
+ const governance_rules = "policy" in account || "tradelink_data" in account && !!account.tradelink_data ? null : transformManifestRules({
95
96
  rules: account.rules,
96
97
  unit,
97
98
  usersByDevice,
@@ -106,6 +107,15 @@ var prepareAccountCreation = ({ type, data }) => {
106
107
  name: account.name,
107
108
  ...governance_rules ? { governance_rules } : {}
108
109
  };
110
+ if ("policy" in account && !!account.policy) {
111
+ const policyID = policiesIDsByName[account.policy];
112
+ if (typeof policyID === "undefined") {
113
+ throw new Error(`Invalid policy name ${account.policy}`);
114
+ }
115
+ Object.assign(account_data, {
116
+ policy_id: policiesIDsByName[account.policy]
117
+ });
118
+ }
109
119
  if ("readOnly" in account && !!account.readOnly) {
110
120
  Object.assign(account_data, {
111
121
  xpub: account.readOnly.xpub,
@@ -1171,4 +1181,4 @@ var reviewAPIRequest_default = reviewAPIRequest;
1171
1181
 
1172
1182
 
1173
1183
  exports.performRequest = performRequest; exports.prepareRequest_default = prepareRequest_default; exports.reviewAPIRequest_default = reviewAPIRequest_default; exports.createDefaultRunner_default = createDefaultRunner_default; exports.getAuthTokens = getAuthTokens; exports.authenticate = authenticate; exports.decodeChallenge = decodeChallenge; exports.signAndApprove = signAndApprove; exports.getTradelinkPledge = getTradelinkPledge; exports.getTradelinkRecipient = getTradelinkRecipient;
1174
- //# sourceMappingURL=chunk-5KTWGTUF.js.map
1184
+ //# sourceMappingURL=chunk-MV3B246A.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-MV3B246A.js","../src/reviewAPIRequest.ts","../src/apiUser/index.ts","../src/createDefaultRunner.ts","../src/prepareRequest.ts"],"names":["admin","invariant","account"],"mappings":"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","file":"/home/runner/work/vault-ts/vault-ts/packages/common/lib/chunk-MV3B246A.js","sourcesContent":[null,"import { SILENT_LOGGER } from \"@ledgerhq/vault-utils\";\n\nimport { authenticate, decodeChallenge, signAndApprove } from \"./apiUser\";\nimport createNetwork from \"./createNetwork\";\nimport { APIRequestResponse, DevicesPool, ManifestAPIV2User, RunnableOptions } from \"./types\";\nimport { getWorkspaceFromGate } from \"./utils\";\n\nexport type ReviewAPIRequestOptions = {\n pool: DevicesPool;\n requestID: number;\n apiUser: ManifestAPIV2User;\n gate: string;\n apiGateway: string;\n reviewType: ReviewType;\n skipDecodeChallenge?: boolean;\n};\n\nexport type ReviewType = \"APPROVE\" | \"REJECT\";\n\nasync function reviewAPIRequest(\n {\n pool,\n requestID,\n apiUser,\n gate,\n apiGateway,\n reviewType,\n skipDecodeChallenge = false,\n }: ReviewAPIRequestOptions,\n { logger = SILENT_LOGGER }: RunnableOptions,\n): Promise<APIRequestResponse> {\n const workspace = getWorkspaceFromGate(gate);\n const apiNetwork = createNetwork({\n baseURL: apiGateway,\n });\n logger.info(`Authenticate for ${apiUser.name}`);\n const bearerToken = await authenticate(pool, apiNetwork, workspace, apiUser, logger);\n\n let apiChallenge = {\n challenge: \"\",\n decodedChallenge: \"\",\n };\n // for example today there is no challenge ro reject a message signing transaction as a simple empty abort is enough like for regular transaction\n if (skipDecodeChallenge === false) {\n logger.info(\"Decode challenge\");\n apiChallenge = await decodeChallenge({\n apiNetwork,\n workspace,\n bearerToken,\n requestID,\n reviewType,\n });\n }\n\n logger.info(apiChallenge.decodedChallenge);\n logger.info(\"Sign and approve\");\n\n return signAndApprove({\n apiNetwork,\n workspace,\n bearerToken,\n requestID,\n apiUser,\n challenge: apiChallenge.challenge,\n reviewType,\n });\n}\n\nexport default reviewAPIRequest;\n","import { Logger } from \"@ledgerhq/vault-utils\";\nimport chalk from \"chalk\";\n\nimport createDefaultRunner from \"../createDefaultRunner\";\nimport { decodeData, genKeys, sign } from \"../crypto/utils\";\nimport { ReviewType } from \"../reviewAPIRequest\";\nimport {\n APIBearerTokenResponse,\n APIGetChallengeResponse,\n APIRequestResponse,\n Connection,\n DevicesPool,\n GateAccount,\n GateWhitelist,\n ManifestAPIV2User,\n Network,\n} from \"../types\";\nimport { TradelinkPledge } from \"../types/tradelink\";\n\nfunction getAPIHeader(bearerToken: string, workspace: string) {\n return {\n headers: {\n \"X-Ledger-Workspace\": workspace,\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${bearerToken}`,\n },\n };\n}\n\nexport async function regenerateCredentials(\n pool: DevicesPool,\n apiNetwork: Network,\n workspace: string,\n apiUser: ManifestAPIV2User,\n logger: Logger,\n): Promise<{ api_key_id: string; api_key_secret: string }> {\n const runner = createDefaultRunner(pool, {});\n const postApiUserAccess = {\n user: apiUser,\n publicKey: genKeys(apiUser.name).hexPubKey,\n role: apiUser.role,\n name: apiUser.name,\n };\n const userAccessRequest = await runner.createAPIV2UserAccess(postApiUserAccess);\n const apiUserAuth = {\n api_key_id: userAccessRequest.api_key_id,\n api_key_secret: userAccessRequest.api_key_secret,\n };\n\n logger.info(\n chalk`{red.bold IMPORTANT:} {red The API user credentials will not be displayed again so note them somewhere}`,\n );\n logger.info(\n JSON.stringify({\n api_key_id: userAccessRequest.api_key_id,\n api_key_secret: userAccessRequest.api_key_secret,\n }),\n );\n return apiUserAuth;\n}\n\nexport async function getAuthTokens(\n apiNetwork: Network,\n workspace: string,\n apiUserAuth: { api_key_id: string; api_key_secret: string },\n) {\n return await apiNetwork<APIBearerTokenResponse>(\"POST\", \"/auth/token\", apiUserAuth, {\n headers: { \"X-Ledger-Workspace\": workspace },\n });\n}\n\nexport async function authenticate(\n pool: DevicesPool,\n apiNetwork: Network,\n workspace: string,\n apiUser: ManifestAPIV2User,\n logger: Logger,\n): Promise<string> {\n const apiUserAuth = await regenerateCredentials(pool, apiNetwork, workspace, apiUser, logger);\n\n const bearerResp = await getAuthTokens(apiNetwork, workspace, apiUserAuth);\n return bearerResp.access_token;\n}\n\nexport type APIChallenge = {\n challenge: string;\n decodedChallenge: any;\n};\n\nexport async function decodeChallenge({\n apiNetwork,\n workspace,\n bearerToken,\n requestID,\n reviewType,\n}: {\n apiNetwork: Network;\n workspace: string;\n bearerToken: string;\n requestID: number;\n reviewType: ReviewType;\n}): Promise<APIChallenge> {\n let challengeUrl = `/requests/${requestID}/challenge`;\n if (reviewType === \"REJECT\") {\n challengeUrl = `${challengeUrl}/reject`;\n }\n const challengeResp = await apiNetwork<APIGetChallengeResponse>(\n \"GET\",\n challengeUrl,\n {},\n getAPIHeader(bearerToken, workspace),\n ).catch((error) => {\n // have to do this sh**t because settlement are transaction today so we have now way to know if this create transaction is part of a tradelink settlement\n if (error.message.includes(\"Get abort challenge is only available for tradelink settlement\")) {\n return { challenge: \"\" };\n }\n /* istanbul ignore next */\n throw error;\n });\n if (challengeResp.challenge === \"\") {\n return {\n challenge: \"\",\n decodedChallenge: \"\",\n };\n }\n return {\n challenge: challengeResp.challenge,\n decodedChallenge: decodeData(challengeResp.challenge),\n };\n}\n\nexport async function signAndApprove({\n apiNetwork,\n workspace,\n bearerToken,\n requestID,\n apiUser,\n challenge,\n reviewType,\n}: {\n apiNetwork: Network;\n workspace: string;\n bearerToken: string;\n requestID: number;\n apiUser: ManifestAPIV2User;\n challenge: string;\n reviewType: ReviewType;\n}): Promise<APIRequestResponse> {\n const keys = genKeys(apiUser.name);\n\n let jws = \"\";\n if (challenge !== \"\") {\n jws = sign(String(keys.privateKey), challenge);\n }\n\n return await apiNetwork<APIRequestResponse>(\n \"POST\",\n `/requests/${requestID}/${reviewType.toLowerCase()}`,\n { jws },\n getAPIHeader(bearerToken, workspace),\n );\n}\n\nexport async function getTradelinkPledge({\n apiNetwork,\n workspace,\n gateAccount,\n bearerToken,\n exchange,\n}: {\n apiNetwork: Network;\n workspace: string;\n gateAccount: GateAccount;\n bearerToken: string;\n exchange: string;\n}): Promise<TradelinkPledge> {\n const pledgesResp = await apiNetwork<Connection<TradelinkPledge>>(\n \"GET\",\n `/pledges?account_id=${gateAccount.id}`,\n {},\n getAPIHeader(bearerToken, workspace),\n );\n // find sub_account\n const pledgeResp = pledgesResp.edges.find((p) => p.node.exchange.name == exchange);\n /* istanbul ignore if */\n if (!pledgeResp) {\n throw new Error(`Exchange '${exchange}' not found`);\n }\n return pledgeResp.node;\n}\n\nexport async function getTradelinkRecipient({\n pool,\n gateAccount,\n pledge,\n}: {\n pool: DevicesPool;\n gateAccount: GateAccount;\n pledge: TradelinkPledge;\n}): Promise<string> {\n const exchangeWLId = pledge.exchange.whitelist_id;\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const wlResp = await admin.network<Connection<GateWhitelist>>(\n \"GET\",\n `/whitelists?id=${exchangeWLId}`,\n );\n /* istanbul ignore next */\n const wlAddress = wlResp.edges[0]?.node.addresses.find(\n (a) => a.currency === gateAccount.currency,\n )?.address;\n return String(wlAddress);\n}\n","import { SILENT_LOGGER } from \"@ledgerhq/vault-utils\";\nimport invariant from \"invariant\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport prepareRequest, {\n GateCreateAccountPayload,\n GateEditWorkspaceRulePayload,\n Input,\n performRequest,\n} from \"./prepareRequest\";\nimport { RecipeManifestResult } from \"./recipeManifest\";\nimport reviewAPIRequest from \"./reviewAPIRequest\";\nimport {\n BakeManifestOptions,\n Connection,\n DevicesPool,\n GateAPIV2UserAccessRequest,\n GateAccount,\n GateAccountRequest,\n GateEditWorkspaceRuleRequest,\n GateExchangeRequest,\n GateGenericRequest,\n GateGroupRequest,\n GatePolicyRequest,\n GateRequestType,\n GateTradelinkAssetManagerRequest,\n GateTradelinkEntity,\n GateTradelinkExchangeRequest,\n GateTradelinkNetwork,\n GateTradelinkRequest,\n GateUserRequest,\n GateVaultEntityRequest,\n GateWhitelistRequest,\n GateWorkspaceRuleStep,\n MRBakeAccountParams,\n MRBakeExchangeParams,\n MRBakeGroupParams,\n MRBakePolicyParams,\n MRBakeTradelinkEntityOnboardingParams,\n MRBakeTradelinkEntityParams,\n MRBakeTradelinkNetworkParams,\n MRBakeTradelinkOnboardingParams,\n MRBakeVaultEntityParams,\n MRBakeWhitelistParams,\n MRCreateAPIUserParams,\n MRCreateAPIV2UserParams,\n MRCreateUserParams,\n MREditQuorumParams,\n MREditWorkspaceRuleParams,\n ManifestRunner,\n} from \"./types\";\nimport { unwrapConnection, wait } from \"./utils\";\n\nconst createDefaultRunner = (pool: DevicesPool, options: BakeManifestOptions): ManifestRunner => {\n const { twoStepsRequest } = options;\n\n const basicHandler = <R>(type: GateRequestType, options?: { withoutHSM: boolean }) => {\n return async (\n params:\n | MRBakeGroupParams\n | MRBakeAccountParams\n | MRBakeVaultEntityParams\n | MRBakeWhitelistParams\n | MRBakeExchangeParams\n | MRBakePolicyParams,\n ) => {\n const { data, existingRequest, noApproval } = params;\n const payload = prepareRequest({ type, data } as Input);\n const extra = { noApproval, existingRequest, twoStepsRequest, ...options };\n return performRequest<R>(payload, pool, extra);\n };\n };\n\n const createAccount = async (params: MRBakeAccountParams) => {\n const { account, data, tradelinkAM } = params;\n if (\"readOnly\" in account && account.readOnly) {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const payload = prepareRequest({ type: \"CREATE_ACCOUNT\", data }) as GateCreateAccountPayload;\n return admin.post<GateAccountRequest>(\"/dev/accounts\", payload);\n }\n\n let res;\n try {\n res = await basicHandler<GateAccountRequest>(\"CREATE_ACCOUNT\")(params);\n\n if (tradelinkAM) {\n // get the activation request id\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const reqResp = await admin.get<Connection<GateAccountRequest>>(\n `/requests?page=1&type=ACTIVATE&target_id=${res.account.id}`,\n );\n const requests: GateAccountRequest[] = unwrapConnection(reqResp);\n const activationRequest = requests[0];\n\n /* istanbul ignore if */\n if (!activationRequest) {\n throw new Error(`No account activation request found for account ${res.account.name}`);\n }\n /* istanbul ignore if */\n if (!pool.apiGateway) {\n throw new Error(\"apiGateway URL is not set\");\n }\n await reviewAPIRequest(\n {\n pool,\n requestID: activationRequest.id,\n apiUser: tradelinkAM,\n gate: pool.gate,\n apiGateway: pool.apiGateway,\n reviewType: \"APPROVE\",\n },\n { logger: SILENT_LOGGER },\n );\n }\n } catch (err) {\n //\n // VG-18856 mitigate airdropped account when syncing the parent while children accounts\n // are described in manifest\n //\n /* istanbul ignore else */\n if (\n err instanceof Error &&\n err.name === \"ACCOUNT_CHILD_ALREADY_EXISTED_EXCEPTION\" &&\n \"contractAddress\" in account &&\n !!account.parentAccount\n ) {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const parentAccountsConnection = await admin.network<Connection<GateAccount>>(\n \"GET\",\n `/accounts?name=${account.parentAccount}`,\n );\n const parentAccountEdge = parentAccountsConnection.edges.find(\n (e) => e.node.name === account.parentAccount,\n );\n invariant(parentAccountEdge, `Parent account not found for ${account.name}`);\n const parentAccount = parentAccountEdge.node;\n const rawCurrencyQuery = `${parentAccount.currency}:${account.contractAddress}`;\n const currencyQuery = encodeURIComponent(rawCurrencyQuery);\n const potentialAccounts = await admin.network<Connection<GateAccount>>(\n \"GET\",\n `/accounts?currency=${currencyQuery}&index=${parentAccount.index}`,\n );\n invariant(\n potentialAccounts.edges.length === 1,\n `We should have one matching token account for ${currencyQuery} (index: ${parentAccount.index})`,\n );\n const existingAccount = potentialAccounts.edges[0]!.node;\n const editParams: MRBakeAccountParams = {\n ...params,\n data: { ...params.data, existingAccount },\n };\n res = await basicHandler<GateAccountRequest>(\"EDIT_ACCOUNT\")(editParams);\n } else {\n throw err;\n }\n }\n\n // VG-17223 optionally wait for account to be active\n if (params.waitForActive) {\n const accountId = res.target_id;\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n\n for (let i = 0; i < 60; i++) {\n const account = await admin.get<GateAccount>(`/accounts/${accountId}`);\n if (account.status === \"ACTIVE\") {\n res.account = account;\n break;\n }\n /* istanbul ignore next */\n await wait(3e3);\n }\n }\n return res;\n };\n\n const createUser = async (params: MRCreateUserParams) => {\n const { role, userID, name, device } = params;\n const type = role === \"operator\" ? \"CREATE_OPERATOR\" : \"CREATE_ADMIN\";\n const data = { userID, role, name };\n const payload = prepareRequest({ type, data });\n const extra = { noApproval: true };\n const req = await performRequest<GateUserRequest>(payload, pool, extra);\n const res = await pool.registerDevice(device, req);\n req.user.pub_key = res.u2f_key.pubKey;\n if (!options.noApproval) {\n await pool.runWithQuorum((admin) => admin.approveRequest(req));\n }\n return req;\n };\n\n const createAPIUser = async (\n params: MRCreateAPIUserParams,\n manifestFromGate: RecipeManifestResult,\n ) => {\n const { user, name, userID } = params;\n let request: GateUserRequest | null =\n manifestFromGate.rawData.pendingUserRequests.find((e) => e.user.username === name) || null;\n if (!request) {\n // Tries to invite user -> PENDING_REGISTRATION status if successful (creation/invitation of user from admin front)\n request = await performRequest<GateUserRequest>(\n {\n type: \"CREATE_OPERATOR\",\n username: name,\n user_id: userID,\n is_api: true,\n view_all_override: user.viewAll,\n },\n pool,\n { noApproval: true },\n );\n }\n if (request.status != \"PENDING_APPROVAL\")\n // Tries to register user -> PENDING_APPROVAL status if successful (api user from api)\n await pool.lamAPI.registerUser(name, request.url_id);\n if (!options.noApproval) {\n // Approves registration request (admin in front)\n await pool.runWithQuorum((admin) => admin.approveRequest(request));\n }\n return request;\n };\n\n const createAPIV2User = async (params: MRCreateAPIV2UserParams) => {\n const { name, publicKey, role } = params;\n const type = \"CREATE_API_USER\";\n const data = { publicKey, name, role };\n const payload = prepareRequest({ type, data });\n const extra = { noApproval: true };\n const req = await performRequest<GateUserRequest>(payload, pool, extra);\n if (!options.noApproval) {\n await pool.runWithQuorum((admin) => admin.approveRequest(req));\n }\n return req;\n };\n\n const createAPIV2UserAccess = async (params: MRCreateAPIV2UserParams) => {\n const { name } = params;\n const type = \"CREATE_API_USER_ACCESS\";\n const data = { name };\n const payload = prepareRequest({ type, data });\n const extra = { noApproval: true };\n return await performRequest<GateAPIV2UserAccessRequest>(payload, pool, extra);\n };\n\n const createTradelinkEntity = async <T extends \"ASSET_MANAGER\" | \"EXCHANGE\" | \"CUSTODIAN\">(\n params: MRBakeTradelinkEntityParams,\n ) => {\n const { tradelinkEntity, type } = params;\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const data = {\n id: tradelinkEntity.id,\n name: tradelinkEntity.name,\n code: tradelinkEntity.code,\n logo_url: tradelinkEntity.logoUrl,\n };\n return await admin.post<GateTradelinkEntity<T>>(`/tradelink/${type}`, data);\n };\n\n const createTradelinkNetwork = async (params: MRBakeTradelinkNetworkParams) => {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const data = {\n id: uuidv4(),\n custodian: params.custodians[0],\n exchanges: params.exchanges,\n asset_managers: params.assetManagers,\n };\n // we keep deleting and create TL network in case manifest got updated\n await admin.network<GateTradelinkNetwork>(\"DELETE\", \"/tradelink/network\").catch(\n /* istanbul ignore next */\n (error) => {\n if (error.message.includes(\"404\")) {\n // Handle 404 error: if there is no network, it will return a 404 as there is nothing to delete\n } else {\n throw error;\n }\n },\n );\n return await admin.post<GateTradelinkNetwork>(`/tradelink/network`, data);\n };\n\n const createTradelink = async (params: MRBakeTradelinkOnboardingParams) => {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n const request = await admin.post<GateTradelinkRequest>(`/requests`, params);\n await pool.runWithQuorum((admin) => admin.approveRequest(request));\n return request;\n };\n\n const onboardTradelinkEntity = async (params: MRBakeTradelinkEntityOnboardingParams) => {\n const { tradelinkEntity, type, tradelinkEntityApprover } = params;\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n let data = {};\n let request: GateTradelinkAssetManagerRequest | GateTradelinkExchangeRequest;\n if (type === \"exchanges\") {\n data = {\n type: \"CREATE_TRADELINK_EXCHANGE\",\n exchange_name: tradelinkEntity.name,\n operators: tradelinkEntity.operators,\n addresses: tradelinkEntity.addresses,\n };\n request = await admin.post<GateTradelinkExchangeRequest>(`/requests`, data);\n } else {\n data = {\n type: \"CREATE_TRADELINK_ASSET_MANAGER\",\n asset_manager_name: tradelinkEntity.name,\n operators: tradelinkEntity.operators,\n addresses: tradelinkEntity.addresses,\n };\n request = await admin.post<GateTradelinkAssetManagerRequest>(`/requests`, data);\n }\n await pool.runWithQuorum((admin) => admin.approveRequest(request));\n\n /* istanbul ignore next */\n if (!pool.apiGateway) {\n throw new Error(\"apiGateway URL is not set\");\n }\n // for now the API user have to approve the exchange request (soonTM a new operator request to activate)\n await reviewAPIRequest(\n {\n pool,\n requestID: request.id,\n apiUser: tradelinkEntityApprover,\n gate: pool.gate,\n apiGateway: pool.apiGateway,\n reviewType: \"APPROVE\",\n },\n { logger: SILENT_LOGGER },\n );\n return request;\n };\n\n const editQuorum = async (params: MREditQuorumParams) => {\n const { quorum } = params;\n const payload = prepareRequest({\n type: \"UPDATE_QUORUM\",\n data: { quorum },\n });\n await performRequest<GateGenericRequest>(payload, pool);\n };\n\n const editWorkspaceRule = async (params: MREditWorkspaceRuleParams) => {\n const { rule, usersByName } = params;\n const payload: GateEditWorkspaceRulePayload = {\n type: \"EDIT_WORKSPACE_RULE\",\n permission: rule.permission,\n edit_data: {\n steps: rule.steps.map((s): GateWorkspaceRuleStep => {\n return {\n quorum: s.quorum,\n users: s.users.map((username) => {\n const user = usersByName[username];\n invariant(user, `No user with name ${username}`);\n return user.pub_key;\n }),\n };\n }),\n },\n };\n await performRequest<GateEditWorkspaceRuleRequest>(payload, pool);\n };\n\n const runner: ManifestRunner = {\n editQuorum,\n editWorkspaceRule,\n createUser,\n createAPIUser,\n createAPIV2User,\n createAPIV2UserAccess,\n createGroup: basicHandler<GateGroupRequest>(\"CREATE_GROUP\"),\n editGroup: basicHandler<GateGroupRequest>(\"EDIT_GROUP\"),\n createAccount,\n editAccount: basicHandler<GateAccountRequest>(\"EDIT_ACCOUNT\"),\n createWhitelist: basicHandler<GateWhitelistRequest>(\"CREATE_WHITELIST\"),\n editWhitelist: basicHandler<GateWhitelistRequest>(\"EDIT_WHITELIST\"),\n createVaultEntity: basicHandler<GateVaultEntityRequest>(\"CREATE_ENTITY\", {\n withoutHSM: true,\n }),\n editVaultEntity: basicHandler<GateVaultEntityRequest>(\"EDIT_ENTITY\", {\n withoutHSM: true,\n }),\n createExchange: basicHandler<GateExchangeRequest>(\"IMPORT_EXCHANGE\", {\n withoutHSM: true,\n }),\n editExchange: basicHandler<GateExchangeRequest>(\"IMPORT_EXCHANGE\", {\n withoutHSM: true,\n }),\n createPolicy: basicHandler<GatePolicyRequest>(\"CREATE_POLICY\"),\n createTradelink,\n createTradelinkEntity,\n onboardTradelinkEntity,\n createTradelinkNetwork,\n };\n\n return runner;\n};\n\nexport default createDefaultRunner;\n","import invariant from \"invariant\";\n\nimport {\n DevicesPool,\n GateAccount,\n GateExchange,\n GateGenericRequest,\n GateGovernanceRule,\n GateGovernanceRulesSet,\n GateGroup,\n GatePolicy,\n GateRequestType,\n GateRuleMultiAuthStep,\n GateRuleSCI,\n GateRuleTransactionFilter,\n GateTokenCurrency,\n GateUser,\n GateVaultEntity,\n GateWhitelist,\n GateWorkspacePermission,\n GateWorkspaceRuleStep,\n ManifestAccount,\n ManifestAccountRule,\n ManifestAccountRuleMultiAuth,\n ManifestAccountRuleSCI,\n ManifestAccountRuleThreshold,\n ManifestAccountRuleWhitelist,\n ManifestExchange,\n ManifestGroup,\n ManifestPolicy,\n ManifestVaultEntity,\n ManifestWhitelist,\n Unit,\n WeirdGateERC20Token,\n WeirdGateGovernanceRule,\n WeirdGateGovernanceRulesSet,\n WeirdGateRuleMultiAuth,\n WeirdGateRuleMultiAuthStep,\n WeirdGateRuleThreshold,\n WeirdGateRuleWhitelist,\n WeirdGateTokenCurrency,\n} from \"./types\";\nimport {\n getAccountTypeByCurrency,\n getAccountUnit,\n getCurrencyUnit,\n serializeUnitValue,\n} from \"./utils\";\n\ntype PrepareRequestArgs<S, T> = {\n type: S;\n data: T;\n};\n\nexport type GateCreateUserPayload = {\n type: \"CREATE_ADMIN\" | \"CREATE_OPERATOR\";\n username: string;\n user_id: string;\n is_api?: boolean;\n view_all_override?: boolean;\n};\n\nexport type GateCreateAPIUserPayload = {\n type: \"CREATE_API_USER\";\n user_data: {\n username: string;\n public_key: string;\n role: string;\n };\n};\n\ntype GateCreateAPIV2UserAccessPayload = {\n type: \"CREATE_API_USER_ACCESS\";\n user_data: {\n username: string;\n };\n};\n\ntype GateMigrateUserPayload = {\n type: \"MIGRATE_ADMIN\" | \"MIGRATE_OPERATOR\";\n id: number;\n};\n\ntype GateCreateGroupPayload = {\n type: \"CREATE_GROUP\";\n name: string;\n description: string;\n members: number[];\n};\n\ntype GateMigrateGroupPayload = {\n type: \"MIGRATE_GROUP\";\n group_id: number;\n migration_data: {\n members: number[];\n };\n};\n\nexport type GateCreateLamUserPayload = {\n type: \"CREATE_OPERATOR\";\n username: string;\n user_id: number;\n};\n\ntype GateCreateAccountTradelinkPayload = {\n currency: string;\n custodian: number;\n asset_manager: number;\n exchanges: Array<{ id: number; auto_repledge_enabled: boolean; requires_pre_approval: boolean }>;\n};\n\nexport type GateCreateAccountPayload = {\n type: \"CREATE_ACCOUNT\";\n index?: number;\n account_type: string;\n account_data: {\n name: string;\n derivation_mode?: \"standard\" | \"native_segwit\";\n parent_account?: { id: number } | { name: string };\n currency?: { name: string };\n governance_rules?: WeirdGateGovernanceRulesSet[];\n token?: WeirdGateTokenCurrency;\n policy_id?: number;\n\n // legacy format for erc20 token (see VFE-951)\n erc20?: WeirdGateERC20Token;\n };\n tradelink_data?: GateCreateAccountTradelinkPayload;\n};\n\ntype GateEditAccountPayload = {\n type: \"EDIT_ACCOUNT\";\n account_id: number;\n edit_data: {\n erc20?: WeirdGateERC20Token;\n token?: WeirdGateTokenCurrency;\n governance_rules?: WeirdGateGovernanceRulesSet[];\n name: string;\n };\n};\n\ntype GateCreateVaultEntityPayload = {\n type: \"CREATE_ENTITY\";\n name: string;\n accounts: number[];\n};\n\ntype GateEditVaultEntityPayload = {\n type: \"EDIT_ENTITY\";\n entity_id: number;\n edit_data: {\n name: string;\n accounts: number[];\n };\n};\n\ntype GateMigrateAccountPayload = {\n type: \"MIGRATE_ACCOUNT\";\n account_id: number;\n migration_data: {\n currency?: string;\n derivation_mode?: \"STANDARD\" | \"NATIVE_SEGWIT\";\n governance_rules: WeirdGateGovernanceRulesSet[];\n name: string;\n };\n};\n\ntype GateEditGroupPayload = {\n type: \"EDIT_GROUP\";\n group_id: number;\n edit_data: {\n name: string;\n members: number[];\n };\n};\n\ntype GateAddressPayload = {\n name: string;\n currency: string;\n address: string;\n};\n\ntype GateCreateWhitelistPayload = {\n type: \"CREATE_WHITELIST\";\n name: string;\n whitelist_type?: \"TRANSACTION\" | \"SMART_CONTRACT\";\n description: string;\n addresses: GateAddressPayload[];\n};\n\ntype GateMigrateWhitelistPayload = {\n type: \"MIGRATE_WHITELIST\";\n whitelist_id: number;\n};\n\ntype GateEditWhitelistPayload = {\n type: \"EDIT_WHITELIST\";\n whitelist_id: number;\n edit_data: {\n name: string;\n addresses: GateAddressPayload[];\n };\n};\n\ntype GateCreateExchangePayload = {\n type: \"IMPORT_EXCHANGE\";\n exchange_data: {\n name: string;\n platform: string;\n governance_rules: WeirdGateGovernanceRulesSet[] | null;\n credentials: {\n apiKey: string;\n secret: string;\n };\n };\n};\n\ntype GateCreatePolicyPayload = {\n type: \"CREATE_POLICY\";\n policy_data: {\n name: string;\n currency?: { name: string };\n governance_rules: WeirdGateGovernanceRulesSet[];\n };\n};\n\nexport type UsersByDevice = Record<number, GateUser>;\nexport type UsersByName = Record<string, GateUser>;\nexport type GroupByName = Record<string, GateGroup>;\nexport type AccountsByName = Record<string, GateAccount>;\n\nexport type IDByName = {\n [_: string]: number;\n};\n\nexport type DataGroup = {\n group: ManifestGroup;\n usersByDevice: UsersByDevice;\n usersByName: UsersByName;\n existingGroup?: GateGroup;\n};\n\nexport type DataWhitelist = {\n whitelist: ManifestWhitelist;\n existingWhitelist?: GateWhitelist;\n};\n\nexport type DataExchange = {\n exchange: ManifestExchange;\n usersByDevice: UsersByDevice;\n usersByName: UsersByName;\n groupsIDsByName: Record<string, number>;\n existingExchange: GateExchange | void;\n};\n\nexport type DataPolicy = {\n policy: ManifestPolicy;\n usersByDevice: UsersByDevice;\n whitelistsIDsByName: IDByName;\n usersByName: UsersByName;\n groupsIDsByName: Record<string, number>;\n existingPolicy: GatePolicy | void;\n};\n\nexport type DataAccount = {\n account: ManifestAccount;\n existingAccount?: GateAccount;\n usersByDevice: UsersByDevice;\n usersByName: UsersByName;\n groupsIDsByName: IDByName;\n whitelistsIDsByName: IDByName;\n hsmAssetManagersIDsByName: IDByName;\n hsmExchangesIDsByName: IDByName;\n hsmCustodiansIDsByName: IDByName;\n policiesIDsByName: IDByName;\n accountsByName: { [key: string]: GateAccount };\n tokens: GateTokenCurrency[];\n};\n\nexport type DataVaultEntity = {\n vaultEntity: ManifestVaultEntity;\n existingVaultEntity?: GateVaultEntity;\n accountsByName: { [key: string]: GateAccount };\n};\n\nexport type DataUser = {\n userID: string;\n name: string;\n role: \"operator\" | \"admin\";\n};\n\nexport type DataAPIUser = {\n name: string;\n publicKey: string;\n role: string;\n};\n\nexport type DataAPIUserAccess = {\n name: string;\n};\n\ntype EditGroupInput = PrepareRequestArgs<\"EDIT_GROUP\", DataGroup>;\ntype CreateGroupInput = PrepareRequestArgs<\"CREATE_GROUP\", DataGroup>;\ntype EditWhitelistInput = PrepareRequestArgs<\"EDIT_WHITELIST\", DataWhitelist>;\n\ntype CreateWhitelistInput = PrepareRequestArgs<\"CREATE_WHITELIST\", DataWhitelist>;\n\ntype CreateUserInput = PrepareRequestArgs<\"CREATE_ADMIN\" | \"CREATE_OPERATOR\", DataUser>;\ntype CreateAPIUserInput = PrepareRequestArgs<\"CREATE_API_USER\", DataAPIUser>;\ntype CreateAPIUserAccessInput = PrepareRequestArgs<\"CREATE_API_USER_ACCESS\", DataAPIUserAccess>;\n\ntype CreateAccountInput = PrepareRequestArgs<\"CREATE_ACCOUNT\", DataAccount>;\ntype EditAccountInput = PrepareRequestArgs<\"EDIT_ACCOUNT\", DataAccount>;\n\ntype CreateVaultEntityInput = PrepareRequestArgs<\"CREATE_ENTITY\", DataVaultEntity>;\ntype EditVaultEntityInput = PrepareRequestArgs<\"EDIT_ENTITY\", DataVaultEntity>;\n\ntype CreateExchangeInput = PrepareRequestArgs<\"IMPORT_EXCHANGE\", DataExchange>;\n\ntype CreatePolicyInput = PrepareRequestArgs<\"CREATE_POLICY\", DataPolicy>;\n\ntype PrepareRequest<T, S> = (obj: T) => S;\n\ntype DataQuorum = {\n quorum: number;\n};\n\ntype EditQuorumInput = PrepareRequestArgs<\"UPDATE_QUORUM\", DataQuorum>;\ntype GateEditQuorumPayload = {\n type: \"UPDATE_QUORUM\";\n quorum: number;\n};\n\nexport type GateEditWorkspaceRulePayload = {\n type: \"EDIT_WORKSPACE_RULE\";\n permission: GateWorkspacePermission;\n edit_data: {\n steps: GateWorkspaceRuleStep[];\n };\n};\n\ntype PrepareEditQuorum = PrepareRequest<EditQuorumInput, GateEditQuorumPayload>;\n\ntype PrepareCreateUser = PrepareRequest<CreateUserInput, GateCreateUserPayload>;\ntype PrepareCreateAPIUser = PrepareRequest<CreateAPIUserInput, GateCreateAPIUserPayload>;\ntype PrepareCreateAPIV2UserAccess = PrepareRequest<\n CreateAPIUserAccessInput,\n GateCreateAPIV2UserAccessPayload\n>;\ntype PrepareEditGroup = PrepareRequest<EditGroupInput, GateEditGroupPayload>;\n\ntype PrepareCreateGroup = PrepareRequest<CreateGroupInput, GateCreateGroupPayload>;\n\ntype PrepareCreateAccount = PrepareRequest<CreateAccountInput, GateCreateAccountPayload>;\n\ntype PrepareEditAccount = PrepareRequest<EditAccountInput, GateEditAccountPayload>;\n\ntype PrepareCreateVaultEntity = PrepareRequest<\n CreateVaultEntityInput,\n GateCreateVaultEntityPayload\n>;\n\ntype PrepareEditVaultEntity = PrepareRequest<EditVaultEntityInput, GateEditVaultEntityPayload>;\n\ntype PrepareEditWhitelist = PrepareRequest<EditWhitelistInput, GateEditWhitelistPayload>;\n\ntype PrepareCreateWhitelist = PrepareRequest<CreateWhitelistInput, GateCreateWhitelistPayload>;\n\ntype PrepareCreateExchange = PrepareRequest<CreateExchangeInput, GateCreateExchangePayload>;\n\ntype PrepareCreatePolicy = PrepareRequest<CreatePolicyInput, GateCreatePolicyPayload>;\n\nexport const EMPTY_RULES_SETS: GateGovernanceRulesSet[] = [\n {\n name: \"Rule 1\",\n rules: [\n {\n type: \"MULTI_AUTHORIZATIONS\",\n data: [],\n },\n ],\n },\n];\n\nexport const prepareUserCreation: PrepareCreateUser = ({ data }) => {\n const { role, name, userID } = data;\n return {\n type: role === \"operator\" ? \"CREATE_OPERATOR\" : \"CREATE_ADMIN\",\n username: name,\n user_id: userID,\n };\n};\n\nexport const prepareAPIUserCreation: PrepareCreateAPIUser = ({ data }) => {\n const { publicKey, name, role } = data;\n return {\n type: \"CREATE_API_USER\",\n user_data: {\n username: name,\n public_key: publicKey,\n role,\n },\n };\n};\n\nexport const prepareAPIUserAccessCreation: PrepareCreateAPIV2UserAccess = ({ data }) => {\n const { name } = data;\n return {\n type: \"CREATE_API_USER_ACCESS\",\n user_data: {\n username: name,\n },\n };\n};\n\nexport const prepareAccountCreation: PrepareCreateAccount = ({ type, data }) => {\n const {\n account,\n usersByDevice,\n whitelistsIDsByName,\n groupsIDsByName,\n accountsByName,\n hsmCustodiansIDsByName,\n hsmAssetManagersIDsByName,\n hsmExchangesIDsByName,\n policiesIDsByName,\n usersByName,\n tokens,\n } = data;\n\n const allAccounts = Object.keys(accountsByName).map((key) => accountsByName[key]);\n\n const token =\n \"contractAddress\" in account\n ? tokens.find((t) => t.contract_address === account.contractAddress)\n : null;\n\n if (\"contractAddress\" in account && !token) {\n throw new Error(`Can't find token with contract address ${account.contractAddress}`);\n }\n\n let account_type = null;\n if (token?.family === \"ethereum\") {\n if (token.parent_currency === \"bsc\") {\n account_type = \"Bep20\";\n } else {\n account_type = \"Erc20\";\n }\n } else if (\"accountType\" in account) {\n account_type = account.accountType;\n } else if (\"currency\" in account) {\n account_type = getAccountTypeByCurrency(account.currency);\n }\n\n if (!account_type) {\n throw new Error(`Can't determine account type`);\n }\n\n const unit = getAccountUnit(account, tokens);\n const governance_rules =\n \"policy\" in account || (\"tradelink_data\" in account && !!account.tradelink_data)\n ? null\n : transformManifestRules({\n rules: account.rules,\n unit,\n usersByDevice,\n usersByName,\n whitelistsIDsByName,\n groupsIDsByName,\n // VG-18120 accounts *must* enforce having a tx-filter rule of type SEND for rules that are\n // not SCI and not \"any-other-type-of-filter\".\n enforceSendTxFilter: true,\n });\n\n const account_data = {\n name: account.name,\n ...(governance_rules ? { governance_rules } : {}),\n };\n\n if (\"policy\" in account && !!account.policy) {\n const policyID = policiesIDsByName[account.policy];\n if (typeof policyID === \"undefined\") {\n throw new Error(`Invalid policy name ${account.policy}`);\n }\n\n Object.assign(account_data, {\n policy_id: policiesIDsByName[account.policy],\n });\n }\n\n if (\"readOnly\" in account && !!account.readOnly) {\n Object.assign(account_data, {\n xpub: account.readOnly.xpub,\n extended_public_key: {\n public_key: account.readOnly.publicKey,\n chain_code: account.readOnly.chainCode,\n },\n address: account.readOnly.address,\n });\n }\n\n if (\"contractAddress\" in account && token) {\n const currencyName = token.parent_currency;\n const parentAccountName = account.parentAccount;\n\n // FIXME there is something weird in this code\n const parent_account = parentAccountName\n ? (() => {\n let parentAccountID = null;\n // FIXME why not using accountsByName\n // search in existing accounts\n const existingParentAccount = allAccounts.find(\n (a) => !!a && a.name === parentAccountName,\n );\n if (existingParentAccount) {\n parentAccountID = existingParentAccount.id;\n } else {\n const createdParentAccount = accountsByName[parentAccountName];\n if (!createdParentAccount) {\n return { name: parentAccountName };\n }\n parentAccountID = createdParentAccount.id;\n }\n return { id: parentAccountID };\n })()\n : null;\n\n // see VFE-951\n if (process.env.LEGACY_TOKENS) {\n const erc20 = {\n ticker: token.ticker,\n address: token.contract_address,\n decimals: token.units[0].magnitude,\n hsm_account_parameters: token.__legacy_hsm_account_parameters,\n hsm_signature: token.__legacy_hsm_signature,\n };\n Object.assign(account_data, { erc20 });\n } else {\n Object.assign(account_data, {\n token: { type: token.token_type, address: token.contract_address },\n });\n }\n\n Object.assign(account_data, {\n currency: { name: currencyName },\n parent_account,\n });\n }\n\n if (\"currency\" in account) {\n Object.assign(account_data, {\n currency: {\n name: account.currency,\n },\n });\n\n if (\"derivationMode\" in account) {\n Object.assign(account_data, {\n derivation_mode: account.derivationMode,\n });\n }\n }\n\n let tradelinkData;\n if (\"tradelink_data\" in account && !!account.tradelink_data) {\n const custodianID = hsmCustodiansIDsByName[account.tradelink_data.custodian.name];\n /* istanbul ignore if */\n if (typeof custodianID === \"undefined\")\n throw new Error(`Invalid custodian name ${account.tradelink_data.custodian.name}`);\n\n const assetManagerID = hsmAssetManagersIDsByName[account.tradelink_data.asset_manager.name];\n /* istanbul ignore if */\n if (typeof assetManagerID === \"undefined\")\n throw new Error(`Invalid asset manager name ${account.tradelink_data.asset_manager.name}`);\n\n tradelinkData = {\n currency: account.tradelink_data.currency,\n custodian: custodianID,\n asset_manager: assetManagerID,\n exchanges: account.tradelink_data.exchanges.map((exchange) => {\n const exchangeID = hsmExchangesIDsByName[exchange.name];\n /* istanbul ignore if */\n if (typeof exchangeID === \"undefined\")\n throw new Error(`Invalid exchange name ${exchange.name}`);\n return {\n auto_repledge_enabled: exchange.auto_repledge_enabled,\n requires_pre_approval: exchange.requires_pre_approval,\n id: exchangeID,\n };\n }),\n };\n }\n\n return {\n type,\n ...(account.index !== undefined ? { index: account.index } : {}),\n ...(tradelinkData ? { tradelink_data: tradelinkData } : {}),\n account_type,\n account_data,\n };\n};\n\nconst prepareAccountEdition: PrepareEditAccount = ({ type, data }) => {\n const {\n account,\n existingAccount,\n usersByDevice,\n usersByName,\n whitelistsIDsByName,\n groupsIDsByName,\n tokens,\n } = data;\n\n /* istanbul ignore if */\n if (!existingAccount) {\n throw new Error(\"No existingAccount given\");\n }\n\n const unit = getAccountUnit(account, tokens);\n const governance_rules = transformManifestRules({\n rules: account.rules,\n unit,\n usersByDevice,\n usersByName,\n whitelistsIDsByName,\n groupsIDsByName,\n enforceSendTxFilter: true,\n });\n\n const edit_data = {\n name: account.name,\n governance_rules,\n };\n\n if (\"contractAddress\" in account) {\n const token = tokens.find((t) => t.contract_address === account.contractAddress);\n\n /* istanbul ignore if */\n if (!token) {\n throw new Error(`Can't find token with contract address ${account.contractAddress}`);\n }\n\n // see VFE-951\n if (process.env.LEGACY_TOKENS) {\n const erc20 = {\n ticker: token.ticker,\n address: token.contract_address,\n decimals: token.units[0].magnitude,\n hsm_account_parameters: token.__legacy_hsm_account_parameters,\n hsm_signature: token.__legacy_hsm_signature,\n };\n Object.assign(edit_data, { erc20 });\n } else {\n Object.assign(edit_data, {\n token: { type: \"erc20\", address: token.contract_address },\n });\n }\n }\n\n return {\n type,\n account_id: existingAccount.id,\n edit_data,\n };\n};\n\nconst serializeGroupMembers = (\n groupUsers: Array<string | number>,\n { usersByDevice, usersByName }: { usersByDevice: UsersByDevice; usersByName: UsersByName },\n): number[] => {\n return groupUsers.map((device) => {\n if (typeof device === \"number\") {\n const u = usersByDevice[device];\n /* istanbul ignore if */\n if (!u) throw new Error(`Invalid device ${device}`);\n return u.id;\n } else {\n const u = usersByName[device];\n /* istanbul ignore if */\n if (!u) throw new Error(`Invalid user name ${device}`);\n return u.id;\n }\n });\n};\n\nconst prepareGroupCreation: PrepareCreateGroup = ({ type, data }) => {\n const { group } = data;\n const members = serializeGroupMembers(group.users, data);\n return {\n type,\n name: group.name,\n description: group.description || \"\",\n members,\n };\n};\n\nconst prepareGroupEdition: PrepareEditGroup = ({ type, data }) => {\n const { group, existingGroup } = data;\n /* istanbul ignore if */\n if (!existingGroup) {\n throw new Error(\"No existingGroup given\");\n }\n const members = serializeGroupMembers(group.users, data);\n return {\n type,\n name: group.name,\n description: group.description || \"\",\n group_id: existingGroup.id,\n edit_data: {\n name: group.name,\n members,\n },\n };\n};\n\nconst serializeVaultEntityAccounts = (\n vaultEntityAccounts: string[],\n { accountsByName }: { accountsByName: AccountsByName },\n): number[] => {\n return vaultEntityAccounts.map((accountName) => {\n const a = accountsByName[accountName];\n /* istanbul ignore if */\n if (!a) throw new Error(`Invalid account ${accountName}`);\n return a.id;\n });\n};\n\nconst prepareVaultEntityCreation: PrepareCreateVaultEntity = ({ type, data }) => {\n const {\n vaultEntity: { name, accounts },\n } = data;\n return {\n type,\n name,\n accounts: accounts ? serializeVaultEntityAccounts(accounts, data) : [],\n };\n};\n\nconst prepareVaultEntityEdition: PrepareEditVaultEntity = ({ type, data }) => {\n const { vaultEntity, existingVaultEntity } = data;\n /* istanbul ignore if */\n if (!existingVaultEntity) {\n throw new Error(\"No existing VaultEntity given\");\n }\n return {\n type,\n entity_id: existingVaultEntity.id,\n edit_data: {\n name: vaultEntity.name,\n accounts: vaultEntity.accounts\n ? serializeVaultEntityAccounts(vaultEntity.accounts, data)\n : [],\n },\n };\n};\n\nconst prepareWhitelistCreation: PrepareCreateWhitelist = ({ type, data }) => {\n const { whitelist } = data;\n const addresses = whitelist.addresses.map((a, i) => ({\n ...a,\n name: a.name || `${a.currency}-${i + 1}`,\n }));\n return {\n type,\n name: whitelist.name,\n description: whitelist.description || \"\",\n addresses,\n ...(whitelist.type && { whitelist_type: whitelist.type }),\n };\n};\n\nconst prepareWhitelistEdition: PrepareEditWhitelist = ({ type, data }) => {\n const { whitelist, existingWhitelist } = data;\n /* istanbul ignore if */\n if (!existingWhitelist) {\n throw new Error(`No existingWhitelist given`);\n }\n const addresses = whitelist.addresses.map((a, i) => ({\n ...a,\n name: a.name || `${a.currency}-${i + 1}`,\n }));\n return {\n type,\n name: whitelist.name,\n description: \"\",\n whitelist_id: existingWhitelist.id,\n edit_data: {\n name: whitelist.name,\n addresses,\n },\n };\n};\n\nconst prepareExchangeCreation: PrepareCreateExchange = ({ type, data }) => {\n const { exchange, usersByDevice, usersByName, groupsIDsByName } = data;\n const governance_rules = exchange.rules\n ? transformManifestRules({ rules: exchange.rules, usersByDevice, usersByName, groupsIDsByName })\n : [];\n return {\n type,\n exchange_data: {\n name: exchange.name,\n governance_rules,\n platform: exchange.platform,\n credentials: {\n apiKey: exchange.configuration.apiKey,\n secret: exchange.configuration.apiSecret,\n },\n },\n };\n};\n\nconst preparePolicyCreation: PrepareCreatePolicy = ({ type, data }) => {\n const { policy, usersByName, usersByDevice, groupsIDsByName, whitelistsIDsByName } = data;\n\n const unit = data.policy.currency ? getCurrencyUnit(data.policy.currency) : undefined;\n const governance_rules = transformManifestRules({\n rules: policy.rules,\n unit,\n usersByDevice,\n usersByName,\n groupsIDsByName,\n whitelistsIDsByName,\n });\n\n return {\n type,\n policy_data: {\n name: policy.name,\n governance_rules,\n ...(policy.currency ? { currency: { name: policy.currency } } : {}),\n },\n };\n};\n\nconst prepareQuorumEdition: PrepareEditQuorum = ({ data }) => {\n return {\n type: \"UPDATE_QUORUM\",\n quorum: data.quorum,\n };\n};\n\nexport type Input =\n | EditQuorumInput\n | CreateAPIUserInput\n | CreateUserInput\n | CreateAPIUserAccessInput\n | CreateGroupInput\n | EditGroupInput\n | CreateWhitelistInput\n | EditWhitelistInput\n | CreateExchangeInput\n | CreatePolicyInput\n | CreateAccountInput\n | EditAccountInput\n | CreateVaultEntityInput\n | EditVaultEntityInput;\n\nexport type Output =\n | GateEditQuorumPayload\n | GateEditWorkspaceRulePayload\n | GateCreateAPIUserPayload\n | GateCreateAPIV2UserAccessPayload\n | GateCreateUserPayload\n | GateMigrateUserPayload\n | GateCreateGroupPayload\n | GateMigrateGroupPayload\n | GateEditGroupPayload\n | GateEditWhitelistPayload\n | GateCreateWhitelistPayload\n | GateMigrateWhitelistPayload\n | GateCreateExchangePayload\n | GateCreatePolicyPayload\n | GateCreateAccountPayload\n | GateCreateLamUserPayload\n | GateEditAccountPayload\n | GateMigrateAccountPayload\n | GateCreateVaultEntityPayload\n | GateEditVaultEntityPayload;\n\nconst prepareRequest = (data: Input): Output => {\n if (data.type === \"EDIT_GROUP\") {\n return prepareGroupEdition(data);\n }\n\n if (data.type === \"CREATE_GROUP\") {\n return prepareGroupCreation(data);\n }\n if (data.type === \"EDIT_WHITELIST\") {\n return prepareWhitelistEdition(data);\n }\n if (data.type === \"CREATE_WHITELIST\") {\n return prepareWhitelistCreation(data);\n }\n if (data.type === \"CREATE_ACCOUNT\") {\n return prepareAccountCreation(data);\n }\n if (data.type === \"EDIT_ACCOUNT\") {\n return prepareAccountEdition(data);\n }\n if (data.type === \"CREATE_ENTITY\") {\n return prepareVaultEntityCreation(data);\n }\n if (data.type === \"EDIT_ENTITY\") {\n return prepareVaultEntityEdition(data);\n }\n if (data.type === \"CREATE_ADMIN\" || data.type === \"CREATE_OPERATOR\") {\n return prepareUserCreation(data);\n }\n if (data.type === \"CREATE_API_USER\") {\n return prepareAPIUserCreation(data);\n }\n\n if (data.type === \"CREATE_API_USER_ACCESS\") {\n return prepareAPIUserAccessCreation(data);\n }\n\n if (data.type === \"UPDATE_QUORUM\") {\n return prepareQuorumEdition(data);\n }\n if (data.type === \"IMPORT_EXCHANGE\") {\n return prepareExchangeCreation(data);\n }\n if (data.type === \"CREATE_POLICY\") {\n return preparePolicyCreation(data);\n }\n\n // @ts-ignore\n throw new Error(`Unhandled request type ${data.type}`);\n};\n\nconst getGroupID = (groupsIDsByName: IDByName, groupName: string) => {\n const groupID = groupsIDsByName[groupName];\n /* istanbul ignore if */\n if (typeof groupID === \"undefined\") throw new Error(`Invalid group name ${groupName}`);\n return groupID;\n};\n\nconst transformMultiAuthRuleFromManifest = (\n rule: ManifestAccountRuleMultiAuth,\n groupsIDsByName: IDByName,\n usersByDevice: UsersByDevice,\n usersByName: UsersByName,\n): WeirdGateRuleMultiAuth => {\n return {\n type: rule.type,\n data: rule.steps.map((step) => {\n return {\n quorum: step.quorum,\n ...(\"group\" in step\n ? { group_id: getGroupID(groupsIDsByName, step.group) }\n : {\n users: step.users.map((d) => {\n if (typeof d === \"number\") {\n const user = usersByDevice[d];\n /* istanbul ignore if */\n if (!user) throw new Error(`Invalid device ${d}`);\n return user.id;\n }\n const user = usersByName[d];\n /* istanbul ignore if */\n if (!user) throw new Error(`Invalid name ${d}`);\n return user.id;\n }),\n }),\n };\n }),\n };\n};\n\nconst transformWhitelistRuleFromManifest = (\n rule: ManifestAccountRuleWhitelist,\n whitelistsIDsByName: Record<string, number>,\n): WeirdGateRuleWhitelist => {\n return {\n type: rule.type,\n data: rule.whitelists.map((w) => {\n const whitelistID = whitelistsIDsByName[w];\n /* istanbul ignore if */\n if (typeof whitelistID === \"undefined\") throw new Error(`Invalid whitelist name ${w}`);\n return whitelistID;\n }),\n };\n};\n\nexport const transformSCIRuleFromManifest = (rule: ManifestAccountRuleSCI): GateRuleSCI => {\n return {\n type: rule.type,\n data: [\n {\n enabled: rule.enabled,\n },\n ],\n };\n};\n\nexport const transformTezosDelegationRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"TEZOS_DELEGATION\" } };\n};\n\nexport const transformPolkadotStakingRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"POLKADOT_STAKING\" } };\n};\n\nexport const transformSolanaStakingRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"SOLANA_STAKING\" } };\n};\nexport const transformMessageSigningRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"MESSAGE_SIGNING\" } };\n};\nexport const transformCreateSplTokenAccountRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"CREATE_SPL_TOKEN_ACCOUNT\" } };\n};\n\nexport const transformCardanoStakingRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"CARDANO_STAKING\" } };\n};\n\nexport const transformRawTransactionRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"RAW_SIGNING\" } };\n};\n\nexport const transformSendTransactionRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"SEND\" } };\n};\n\nexport const transformSmartContractDeploymentFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"DEPLOY_CONTRACT\" } };\n};\n\nexport const transformStakeTransactionRuleFromManifest = (): GateRuleTransactionFilter => {\n return { type: \"TRANSACTION_FILTER\", data: { preset: \"STAKE\" } };\n};\n\nexport const transformThresholdRuleFromManifest = (\n rule: ManifestAccountRuleThreshold,\n unit: Unit,\n): WeirdGateRuleThreshold => {\n return {\n type: rule.type,\n data: [\n {\n currency_type: \"CRYPTO\",\n ...(rule.max ? { max: serializeUnitValue(unit, rule.max) } : {}),\n min: serializeUnitValue(unit, rule.min || 0),\n },\n ],\n };\n};\n\nexport const transformManifestRules = ({\n rules,\n unit,\n usersByDevice,\n usersByName,\n whitelistsIDsByName,\n groupsIDsByName,\n enforceSendTxFilter,\n}: {\n rules: Array<ManifestAccountRule[]> | void;\n unit?: Unit;\n usersByDevice: UsersByDevice;\n usersByName: UsersByName;\n whitelistsIDsByName?: IDByName;\n groupsIDsByName: IDByName;\n // VG-18120 ability to enforce `SEND` transaction filter if no transaction filter is present\n enforceSendTxFilter?: boolean;\n}): WeirdGateGovernanceRulesSet[] => {\n const governance_rules =\n rules && rules.length\n ? rules.map((rules, i) => {\n return {\n name: `Rule ${i + 1}`,\n rules: rules.map((rule) => {\n if (rule.type === \"MULTI_AUTHORIZATIONS\") {\n return transformMultiAuthRuleFromManifest(\n rule,\n groupsIDsByName,\n usersByDevice,\n usersByName,\n );\n }\n if (rule.type === \"WHITELIST\") {\n invariant(\n whitelistsIDsByName,\n \"WHITELIST rule configured outside of account context\",\n );\n return transformWhitelistRuleFromManifest(rule, whitelistsIDsByName);\n }\n if (rule.type === \"THRESHOLD\") {\n invariant(unit, \"THRESHOLD: no unit provided\");\n\n return transformThresholdRuleFromManifest(rule, unit);\n }\n if (rule.type === \"SMART_CONTRACT_INTERACTION\") {\n return transformSCIRuleFromManifest(rule);\n }\n\n if (rule.type === \"DEPLOY_CONTRACT\") {\n return transformSmartContractDeploymentFromManifest();\n }\n\n if (rule.type === \"TEZOS_DELEGATION\") {\n return transformTezosDelegationRuleFromManifest();\n }\n if (rule.type === \"POLKADOT_STAKING\") {\n return transformPolkadotStakingRuleFromManifest();\n }\n if (rule.type === \"SOLANA_STAKING\") {\n return transformSolanaStakingRuleFromManifest();\n }\n if (rule.type === \"CARDANO_STAKING\") {\n return transformCardanoStakingRuleFromManifest();\n }\n if (rule.type === \"RAW_SIGNING\") {\n return transformRawTransactionRuleFromManifest();\n }\n if (rule.type === \"SEND\") {\n return transformSendTransactionRuleFromManifest();\n }\n if (rule.type === \"STAKE\") {\n return transformStakeTransactionRuleFromManifest();\n }\n if (rule.type === \"MESSAGE_SIGNING\") {\n return transformMessageSigningRuleFromManifest();\n }\n if (rule.type === \"CREATE_SPL_TOKEN_ACCOUNT\") {\n return transformCreateSplTokenAccountRuleFromManifest();\n }\n // @ts-ignore\n throw new Error(`Unhandled rule type ${rule.type}`);\n }),\n };\n })\n : getDefaultRule(usersByDevice);\n\n // VG-18120 ability to enforce `SEND` transaction filter if no transaction filter is present\n if (enforceSendTxFilter) {\n governance_rules.forEach((rulesSet) => {\n const hasTxFilterRule = !!rulesSet.rules.find((r) => r.type === \"TRANSACTION_FILTER\");\n const hasSCIRule = !!rulesSet.rules.find((r) => r.type === \"SMART_CONTRACT_INTERACTION\");\n if (!hasTxFilterRule && !hasSCIRule) {\n rulesSet.rules.unshift({ type: \"TRANSACTION_FILTER\", data: { preset: \"SEND\" } });\n }\n });\n }\n\n return governance_rules;\n};\n\nconst getDefaultRule = (usersByDevice: Record<string, GateUser>): WeirdGateGovernanceRulesSet[] => {\n const operatorsDevices = Object.keys(usersByDevice).filter((key) => {\n const u = usersByDevice[key];\n /* istanbul ignore if */\n if (!u) throw new Error(`Invalid device ${key}`);\n return u.role === \"OPERATOR\";\n });\n const lastCreatedOperatorDevice = operatorsDevices[0];\n /* istanbul ignore if */\n if (!lastCreatedOperatorDevice) {\n throw new Error(`Can't get the last created operator device`);\n }\n const lastCreatedOperator = usersByDevice[lastCreatedOperatorDevice];\n /* istanbul ignore if */\n if (!lastCreatedOperator) {\n throw new Error(`Can't get the last created operator`);\n }\n\n return [\n {\n name: \"Rule 1\",\n rules: [\n {\n type: \"MULTI_AUTHORIZATIONS\",\n data: [\n {\n quorum: 1,\n users: [lastCreatedOperator.id],\n },\n ],\n },\n ],\n },\n ];\n};\n\nexport const serializeToWeirdGateRulesSets = (\n rulesSets: GateGovernanceRulesSet[],\n): WeirdGateGovernanceRulesSet[] => {\n return rulesSets.map((rulesSet: GateGovernanceRulesSet): WeirdGateGovernanceRulesSet => {\n return {\n name: rulesSet.name,\n rules: rulesSet.rules.map((rule: GateGovernanceRule): WeirdGateGovernanceRule => {\n if (rule.type === \"MULTI_AUTHORIZATIONS\") {\n return {\n type: rule.type,\n data: rule.data.map((step: GateRuleMultiAuthStep): WeirdGateRuleMultiAuthStep => {\n if (step.group.is_internal) {\n return {\n quorum: step.quorum,\n users: step.group.members.map((member) => member.id),\n };\n }\n return {\n quorum: step.quorum,\n group_id: step.group.id,\n };\n }),\n };\n }\n if (rule.type === \"THRESHOLD\") {\n return {\n type: rule.type,\n data: [\n {\n currency_type: \"CRYPTO\",\n min: rule.data[0].min,\n ...(rule.data[0].max ? /* istanbul ignore next */ { max: rule.data[0].max } : {}),\n },\n ],\n };\n }\n if (rule.type === \"WHITELIST\") {\n return {\n type: rule.type,\n data: rule.data.map((whitelist) => whitelist.id),\n };\n }\n /* istanbul ignore next */\n return rule;\n }),\n };\n });\n};\n\nconst TWO_STEPS_CREATION_REQUESTS: GateRequestType[] = [\n \"CREATE_ACCOUNT\",\n \"CREATE_GROUP\",\n \"CREATE_TRANSACTION\",\n \"CREATE_WHITELIST\",\n \"EDIT_ACCOUNT\",\n \"EDIT_GROUP\",\n \"EDIT_WHITELIST\",\n \"REVOKE_USER\",\n \"UPDATE_QUORUM\",\n];\n\nexport const performRequest = async <T>(\n payload: Output,\n pool: DevicesPool,\n options?: {\n existingRequest?: GateGenericRequest | null;\n noApproval?: boolean;\n withoutHSM?: boolean;\n twoStepsRequest?: boolean;\n },\n): Promise<T> => {\n const adminDevices = await pool.getOnboardingAdminDevices();\n const admin = await pool.login(adminDevices[0]![1]);\n\n let request: GateGenericRequest | void | null = options?.existingRequest;\n\n if (!request) {\n const enableTwoStepsCreation =\n options?.twoStepsRequest && TWO_STEPS_CREATION_REQUESTS.includes(payload.type);\n\n if (enableTwoStepsCreation) {\n Object.assign(payload, { enable_two_step_request_creation: true });\n }\n\n const r = await admin.post<GateGenericRequest>(\"/requests\", payload);\n request = r;\n\n if (enableTwoStepsCreation) {\n const pingChallenge = async () => {\n try {\n await admin.post(`/requests/${r.id}/post-create`, {});\n } catch (err) /* istanbul ignore next */ {\n await pingChallenge();\n }\n };\n await pingChallenge();\n }\n }\n\n if (!options || !options.noApproval) {\n await pool.runWithQuorum((admin) =>\n options?.withoutHSM ? admin.approveRequestWithoutHSM(request) : admin.approveRequest(request),\n );\n }\n return request as unknown as T;\n};\n\nexport default prepareRequest;\n"]}
@@ -1,4 +1,4 @@
1
- import { R as RunnableOptions } from './index-CfKTZ-yG.js';
1
+ import { R as RunnableOptions } from './index-BDY859J4.js';
2
2
  import '@ledgerhq/hw-transport-mocker';
3
3
  import '@ledgerhq/types-cryptoassets';
4
4
  import '@ledgerhq/vault-utils';