@ledgerhq/revault-sdk 0.29.2 → 0.29.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/bake.cjs CHANGED
@@ -126,7 +126,7 @@ async function bakePledgeAdjustment(options, logger) {
126
126
  const admin = await engine.withDeviceIndex(4).login();
127
127
  logger.info("Fetching account, tradelink blueprint and network...");
128
128
  const [matchingAccounts, blueprint, network] = await Promise.all([
129
- require_utils.fetchAll(admin.client.accounts.list.query, { name: pledgeAdjustment.account }),
129
+ require_utils.fetchAll(admin.client.accounts.list.query, { search: pledgeAdjustment.account }),
130
130
  admin.client.tradelink.getNetworkBlueprint.query(),
131
131
  admin.client.tradelink.getNetwork.query()
132
132
  ]);
@@ -1301,5 +1301,3 @@ exports.recipeManifest = recipeManifest;
1301
1301
  exports.waitForRequestInflightDone = waitForRequestInflightDone;
1302
1302
  exports.zManifest = zManifest;
1303
1303
  exports.zManifestPolicy = zManifestPolicy;
1304
-
1305
- //# sourceMappingURL=bake.cjs.map
package/lib/bake.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bake.cjs","names":["createDeviceIndexResolver","fetchAll","createDeviceIndexResolver","fetchAll","_","match","genKeys","createDeviceIndexResolver","fetchAll","match","z"],"sources":["../src/bake/utils.ts","../src/bake/bake-pledge.ts","../src/bake/bake-tradelink-organization.ts","../src/bake/bake-workspace.ts","../src/bake/recipe-workspace.ts","../src/bake/recipe.ts","../src/bake/types.ts","../src/bake/index.ts"],"sourcesContent":["import type { VaultRequestResponse } from \"@ledgerhq/revault-api\";\nimport invariant from \"invariant\";\n\nimport type { Engine, WithDevice, WithPsdAuth, WithWorkspace } from \"@/engine\";\nimport type { Logger } from \"@/logger\";\nimport type { RevaultApiTRPCClient, RouterInputs } from \"@/trpc\";\n\ntype LogFunction = (msg: string) => void;\n\ntype LogHelpers = {\n logTitle: LogFunction;\n logStep: LogFunction;\n logSubStep: LogFunction;\n};\n\nexport function createBakeLogHelpers(logger: Logger): LogHelpers {\n return {\n logTitle(title: string): void {\n logger.info(`:: ${title} ::`);\n },\n logStep(msg: string): void {\n logger.info(`=> ${msg}`);\n },\n logSubStep(msg: string): void {\n logger.info(` -> ${msg}`);\n },\n };\n}\n\nexport type CreateRequestInput = RouterInputs[\"requests\"][\"create\"][\"request\"];\n\nexport type inferRequestInputData<T extends RouterInputs[\"requests\"][\"create\"][\"request\"][\"type\"]> =\n Extract<RouterInputs[\"requests\"][\"create\"][\"request\"], { type: T }>[\"data\"];\n\nconst IS_REQUEST_STATE_END_STATE: Record<VaultRequestResponse[\"state\"], boolean> = {\n // end states:\n ABORTED: true,\n BLOCKED: true,\n EXECUTED: true,\n EXPIRED: true,\n FAILED: true,\n STUCK: true,\n // not end states:\n EXECUTING: false,\n INITIAL: false,\n PENDING_APPROVAL: false,\n};\n\nconst isEndState = (state: VaultRequestResponse[\"state\"]): boolean =>\n IS_REQUEST_STATE_END_STATE[state];\n\nconst DEFAULT_POLL_INTERVAL_MS = 250;\nconst DEFAULT_TIMEOUT_MS = 60_000;\n\nconst wait = (ms: number): Promise<void> => {\n return new Promise((resolve) => setTimeout(resolve, ms));\n};\n\n/**\n * Poll a request until its inflight field is false, indicating it has been processed by the system.\n * Returns the updated request once inflight is false.\n * Throws if the timeout is exceeded before inflight becomes false.\n */\nexport async function waitForRequestInflightDone(\n client: RevaultApiTRPCClient,\n request: VaultRequestResponse,\n logger: Logger,\n options?: { pollIntervalMs?: number; timeoutMs?: number },\n): Promise<VaultRequestResponse> {\n const { logSubStep } = createBakeLogHelpers(logger);\n if (request.inflight === undefined) {\n return request;\n }\n\n logSubStep(`Waiting for inflight request to be processed...`);\n\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const deadline = Date.now() + timeoutMs;\n const pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n\n let updated = request;\n\n while (Date.now() < deadline) {\n updated = await client.requests.findById.query({ id: request.id });\n if (updated.inflight === undefined) {\n return updated;\n }\n await wait(pollIntervalMs);\n }\n\n throw new Error(\n `Timed out waiting for request ${request.id} inflight to be processed (last inflight: ${JSON.stringify(\n updated.inflight,\n )})`,\n );\n}\n\n/**\n * Poll a request until it reaches a terminal state (EXECUTED, FAILED, etc.).\n *\n * Returns the request once it is no longer in EXECUTING/STUCK state.\n * Throws if the request reaches FAILED or STUCK state, or if the timeout is exceeded.\n */\nexport async function waitForRequestExecuted(\n client: RevaultApiTRPCClient,\n request: VaultRequestResponse,\n logger: Logger,\n options?: { pollIntervalMs?: number; timeoutMs?: number },\n): Promise<VaultRequestResponse> {\n const { logSubStep } = createBakeLogHelpers(logger);\n\n if (isEndState(request.state)) {\n if (request.state === \"EXECUTED\") {\n return request;\n }\n throw new Error(`Request is in error state ${request.state}`);\n }\n\n const pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const deadline = Date.now() + timeoutMs;\n\n logSubStep(`Waiting for request to be executed...`);\n\n let updated = request;\n\n while (Date.now() < deadline) {\n updated = await client.requests.findById.query({ id: request.id });\n if (isEndState(updated.state)) {\n if (updated.state === \"EXECUTED\") {\n return updated;\n }\n throw new Error(`Request is in error state ${updated.state}`);\n }\n await wait(pollIntervalMs);\n }\n\n throw new Error(\n `Timed out waiting for request ${request.id} to reach a terminal state (last state: ${updated.state})`,\n );\n}\n\nexport async function approveRequest(\n request: VaultRequestResponse,\n approvers: Engine<WithWorkspace & WithDevice & WithPsdAuth>[],\n logger: Logger,\n): Promise<VaultRequestResponse> {\n const { logSubStep } = createBakeLogHelpers(logger);\n for (let i = 0; i < approvers.length; i++) {\n logSubStep(`Collecting approval (${i + 1}/${approvers.length})...`);\n const approver = approvers[i]!;\n request = await approver.approve(request);\n request = await waitForRequestInflightDone(approver.client, request, logger);\n }\n return waitForRequestExecuted(approvers[0]!.client, request, logger);\n}\n\nexport async function createAndApproveRequest(\n input: CreateRequestInput,\n approvers: Engine<WithWorkspace & WithDevice & WithPsdAuth>[],\n logger: Logger,\n): Promise<VaultRequestResponse> {\n const { logSubStep } = createBakeLogHelpers(logger);\n const creator = approvers[0];\n invariant(creator, \"Need at least 1 user to create a request\");\n logSubStep(`Creating request of type ${input.type}...`);\n let request = await creator.client.requests.create.mutate({\n request: input,\n });\n request = await waitForRequestInflightDone(creator.client, request, logger);\n return approveRequest(request, approvers, logger);\n}\n\nexport function stripUndefinedDeep<T>(obj: T): T {\n if (Array.isArray(obj)) {\n return obj.map(stripUndefinedDeep) as unknown as T;\n }\n\n if (obj && typeof obj === \"object\") {\n return Object.fromEntries(\n Object.entries(obj)\n .filter(([_, v]) => v !== undefined)\n .map(([k, v]) => [k, stripUndefinedDeep(v)]),\n ) as T;\n }\n\n return obj;\n}\n","import invariant from \"invariant\";\n\nimport type { Engine, WithWorkspace } from \"@/engine\";\nimport type { Logger } from \"@/logger\";\nimport { createDeviceIndexResolver, fetchAll } from \"@/utils\";\n\nimport type { ManifestPledgeAdjustment } from \"./types\";\nimport { createAndApproveRequest } from \"./utils\";\n\ntype Options = {\n engine: Engine<WithWorkspace>;\n pledgeAdjustment: ManifestPledgeAdjustment;\n};\n\nconst flattenApprovers = (groups: { quorum: number; userIds: string[] }[]): string[] => {\n return groups.reduce<string[]>((acc, cur) => {\n acc.push(...cur.userIds.slice(0, cur.quorum));\n return acc;\n }, []);\n};\n\nexport async function bakePledgeAdjustment(options: Options, logger: Logger): Promise<void> {\n const { pledgeAdjustment, engine } = options;\n\n const getDeviceIndex = createDeviceIndexResolver(engine);\n\n logger.info(\"Logging in with admin...\");\n const admin = await engine.withDeviceIndex(4).login();\n\n logger.info(\"Fetching account, tradelink blueprint and network...\");\n const [matchingAccounts, blueprint, network] = await Promise.all([\n fetchAll(admin.client.accounts.list.query, { name: pledgeAdjustment.account }),\n admin.client.tradelink.getNetworkBlueprint.query(),\n admin.client.tradelink.getNetwork.query(),\n ]);\n\n const account = matchingAccounts.find((account) => account.name === pledgeAdjustment.account);\n invariant(account, `Account ${pledgeAdjustment.account} not found`);\n\n invariant(blueprint, \"Tradelink blueprint is not created yet\");\n invariant(network, \"Tradelink network is not created yet\");\n\n const exchange = network.exchanges.find((exchange) => {\n const blueprintExchange = blueprint.exchanges.find(\n (blueprintExchange) => blueprintExchange.tradelinkId === exchange.tradelinkId,\n );\n invariant(blueprintExchange, `Exchange ${exchange.tradelinkId} not found in blueprint`);\n return blueprintExchange.name === pledgeAdjustment.exchange;\n });\n invariant(exchange, `Exchange ${pledgeAdjustment.exchange} not found in network`);\n\n const governance = account.governance;\n invariant(governance.type === \"TRADELINK\", \"Account governance is not TRADELINK\");\n const assetManager = network.assetManagers.find((am) => am.id === governance.assetManagerId);\n invariant(assetManager, `Asset manager ${governance.assetManagerId} not found in network`);\n\n const exchangeIsConfiguredForAccount = !!governance.exchangeConfigs.find(\n (e) => e.exchangeId === exchange.id,\n );\n invariant(\n exchangeIsConfiguredForAccount,\n `Exchange ${exchange.id} is not configured for account ${account.id}`,\n );\n\n const approverIds = [\n ...flattenApprovers(assetManager.groups),\n ...flattenApprovers(exchange.groups),\n ];\n\n const approvers = await Promise.all(\n approverIds.map((id) =>\n admin.client.users.findById\n .query({ id })\n .then((user) => getDeviceIndex(user.deviceUserId!))\n .then((index) => engine.withDeviceIndex(index).login()),\n ),\n );\n\n await createAndApproveRequest(\n {\n type: \"TRADELINK_ADJUST_PLEDGE\",\n data: {\n accountId: account.id,\n exchangeId: exchange.id,\n amount: pledgeAdjustment.amount,\n },\n },\n approvers,\n logger,\n );\n\n logger.info(\n `Successfully adjusted pledge for account ${pledgeAdjustment.account} on exchange ${pledgeAdjustment.exchange}`,\n );\n}\n","import type { Logger } from \"@/logger\";\n\nimport type { BakeOptions, ManifestTradelinkNetworkBlueprint, ManifestTradelinkOrg } from \"./types\";\nimport { createBakeLogHelpers } from \"./utils\";\n\ntype Options = Omit<BakeOptions, \"manifest\" | \"rootAuthToken\"> & {\n tradelink: ManifestTradelinkOrg;\n rootAuthToken: string;\n networkBlueprint?: { workspaceName: string; blueprint: ManifestTradelinkNetworkBlueprint };\n};\n\nexport async function bakeTradelinkOrganization(options: Options, logger: Logger): Promise<void> {\n const { tradelink, engine, rootAuthToken, networkBlueprint } = options;\n\n const { logStep } = createBakeLogHelpers(logger);\n\n const rootClient = engine.createClient({ rootAuthToken });\n /* v8 ignore else - TODO bake empty tradelink org -- @preserve */\n if (tradelink.exchanges) {\n logStep(\"Creating Tradelink organization exchanges...\");\n const existingOrgExchanges = await rootClient.tradelink.root.listOrgExchanges.query();\n for (const orgExchange of tradelink.exchanges) {\n const existingOrgExchange = existingOrgExchanges.find((e) => e.name === orgExchange.name);\n if (existingOrgExchange) {\n logger.info(\n `[SKIPPED] Organization exchange ${existingOrgExchange.name} (${existingOrgExchange.code}) already exists`,\n );\n } else {\n await rootClient.tradelink.root.createOrgExchange.mutate({\n code: orgExchange.code,\n name: orgExchange.name,\n logoUrl: orgExchange.logo,\n });\n logger.info(`Created organization exchange ${orgExchange.name} (${orgExchange.code})`);\n }\n }\n }\n\n /* v8 ignore else -- @preserve */\n if (tradelink.assetManagers) {\n logStep(\"Creating Tradelink organization asset managers...\");\n const existingAssetManagers = await rootClient.tradelink.root.listOrgAssetManagers.query();\n for (const orgAssetManager of tradelink.assetManagers) {\n const existingOrgAssetManager = existingAssetManagers.find(\n (e) => e.name === orgAssetManager.name,\n );\n if (existingOrgAssetManager) {\n logger.info(\n `[SKIPPED] Organization asset manager ${existingOrgAssetManager.name} (${existingOrgAssetManager.code}) already exists`,\n );\n } else {\n await rootClient.tradelink.root.createOrgAssetManager.mutate({\n code: orgAssetManager.code,\n name: orgAssetManager.name,\n logoUrl: orgAssetManager.logo,\n });\n logger.info(\n `Created organization asset manager ${orgAssetManager.name} (${orgAssetManager.code})`,\n );\n }\n }\n }\n\n /* v8 ignore else -- @preserve */\n if (tradelink.custodians) {\n logStep(\"Creating Tradelink organization custodians...\");\n const existingCustodians = await rootClient.tradelink.root.listOrgCustodians.query();\n for (const orgCustodian of tradelink.custodians) {\n const existingOrgCustodian = existingCustodians.find((e) => e.name === orgCustodian.name);\n if (existingOrgCustodian) {\n logger.info(\n `[SKIPPED] Organization custodian ${existingOrgCustodian.name} (${existingOrgCustodian.code}) already exists`,\n );\n } else {\n await rootClient.tradelink.root.createOrgCustodian.mutate({\n code: orgCustodian.code,\n name: orgCustodian.name,\n logoUrl: orgCustodian.logo,\n });\n logger.info(`Created organization custodian ${orgCustodian.name} (${orgCustodian.code})`);\n }\n }\n }\n\n /* v8 ignore else -- @preserve */\n if (networkBlueprint) {\n logStep(\"Creating Tradelink network blueprint...\");\n const { workspaceName, blueprint } = networkBlueprint;\n const existingBlueprints = await rootClient.tradelink.root.listNetworkBlueprints.query();\n const existingBlueprint = existingBlueprints.find((e) => e.workspaceName === workspaceName);\n if (existingBlueprint) {\n logger.info(`[SKIPPED] Network blueprint for ${workspaceName} workspace already exists`);\n } else {\n await rootClient.tradelink.root.createNetworkBlueprint.mutate({\n workspaceName,\n custodian: { name: blueprint.custodian },\n exchanges: blueprint.exchanges.map((_) => ({ name: _ })),\n assetManagers: blueprint.assetManagers.map((_) => ({ name: _ })),\n });\n logger.info(`Created network blueprint for ${networkBlueprint.workspaceName} workspace`);\n }\n }\n}\n","import type {\n ReviewStepWithUsers,\n TradelinkNetworkBlueprintResponse,\n UserResponse,\n VaultRequestResponse,\n} from \"@ledgerhq/revault-api\";\nimport invariant from \"invariant\";\nimport _ from \"lodash\";\nimport { match } from \"ts-pattern\";\n\nimport { genKeys } from \"@/crypto\";\nimport type { Logger } from \"@/logger\";\nimport { createDeviceIndexResolver, fetchAll } from \"@/utils\";\n\nimport type {\n BakeOptions,\n ManifestAccount,\n ManifestApiUser,\n ManifestEntity,\n ManifestGovernanceRule,\n ManifestGroup,\n ManifestPolicy,\n ManifestRawSigningGovernanceRule,\n ManifestTradelinkEntity,\n ManifestTradelinkGroup,\n ManifestTradelinkNetwork,\n ManifestWhitelist,\n ManifestWorkspace,\n ManifestWorkspaceRule,\n} from \"./types\";\nimport {\n approveRequest,\n type CreateRequestInput,\n createAndApproveRequest,\n createBakeLogHelpers,\n type inferRequestInputData,\n stripUndefinedDeep,\n waitForRequestInflightDone,\n} from \"./utils\";\n\ntype GovRuleData = inferRequestInputData<\"CREATE_POLICY\">[\"govRules\"][number];\n\ntype Options = Omit<BakeOptions, \"manifest\" | \"workspaceName\"> & {\n workspace: ManifestWorkspace;\n workspaceName: string;\n};\n\nexport async function bakeWorkspace(options: Options, logger: Logger): Promise<void> {\n const { workspace, engine, workspaceName } = options;\n\n const workspaceEngine = engine.withWorkspace(workspaceName);\n const { logTitle, logStep, logSubStep } = createBakeLogHelpers(logger);\n\n // utility to retrieve device index based on device user id\n const findDeviceIndex = createDeviceIndexResolver(workspaceEngine);\n\n // Log-in once with the two admins (index 4 & 5 by convention) that will create all\n // the requests for the manifest objects.\n logger.info(\"Authenticating with two admins...\");\n const [admin1, admin2] = await Promise.all([\n workspaceEngine.withDeviceIndex(4).login(),\n workspaceEngine.withDeviceIndex(5).login(),\n ]);\n\n // Retrieve all existing data, so we are then able to skip creating stuff when not needed.\n logger.info(\"Fetching existing data...\");\n const [\n existingUsers,\n existingGroups,\n existingWhitelists,\n existingPolicies,\n existingAccounts,\n existingEntities,\n tradelinkNetworkBlueprint,\n ] = await Promise.all([\n fetchAll(admin1.client.users.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin1.client.groups.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin1.client.whitelists.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin1.client.policies.list.query, { isPrivate: false }),\n fetchAll(admin1.client.accounts.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin1.client.entities.list.query, { status: \"ACTIVE\" }),\n admin1.client.tradelink.getNetworkBlueprint.query(),\n ]);\n\n const tradelinkOrgExchangesByName = _.keyBy(tradelinkNetworkBlueprint?.exchanges, \"name\");\n const tradelinkOrgAssetManagersByName = _.keyBy(tradelinkNetworkBlueprint?.assetManagers, \"name\");\n\n let existingTradelinkNetwork = await admin1.client.tradelink.getNetwork.query();\n\n // Merge admins & operators (we can't fetch all users in a row because we don't want API users,\n // and we don't have a way to retrieve both admins & operators in a single fetch)\n const existingPsdUsers = existingUsers.filter((user) => user.deviceType === \"PSD\");\n const existingApiUsers = existingUsers.filter((user) => user.deviceType === \"API\");\n // Retrieve all device indexes for the existing users\n const usersWithDeviceIndex = await resolveDevicesIndexes(existingPsdUsers);\n\n // ---------------------------------\n // USERS\n // ---------------------------------\n if (workspace.users) {\n logTitle(\"Users\");\n if (workspace.users.admins) {\n for (const deviceIndex of workspace.users.admins) {\n await createUser(\"ADMIN\", deviceIndex);\n }\n }\n\n /* v8 ignore else -- @preserve */\n if (workspace.users.operators) {\n for (const deviceIndex of workspace.users.operators) {\n await createUser(\"OPERATOR\", deviceIndex);\n }\n }\n if (workspace.users.api) {\n for (const apiUser of workspace.users.api) {\n await createApiUser(apiUser);\n }\n }\n }\n\n // ---------------------------------\n // WORKSPACE RULES\n // ---------------------------------\n // Must come after users are created (rules reference users by ID)\n if (workspace.workspaceRules) {\n logTitle(\"Workspace Rules\");\n for (const workspaceRule of workspace.workspaceRules) {\n await createWorkspaceRule(workspaceRule);\n }\n }\n\n // ---------------------------------\n // GROUPS\n // ---------------------------------\n if (workspace.groups) {\n logTitle(\"Groups\");\n for (const group of workspace.groups) {\n await createGroup(group);\n }\n }\n\n // ---------------------------------\n // WHITELISTS\n // ---------------------------------\n if (workspace.whitelists) {\n logTitle(\"Whitelists\");\n await createWhitelists(workspace.whitelists);\n }\n\n // POLICIES\n // ---------------------------------\n if (workspace.policies) {\n logTitle(\"Policies\");\n for (const policy of workspace.policies) {\n await createPolicy(policy);\n }\n }\n\n // ---------------------------------\n // TRADELINK NETWORK\n // ---------------------------------\n if (workspace.tradelink) {\n logTitle(\"Tradelink\");\n await createTradelink(workspace.tradelink);\n }\n\n // ---------------------------------\n // ACCOUNTS\n // ---------------------------------\n if (workspace.accounts) {\n logTitle(\"Accounts\");\n for (const account of workspace.accounts) {\n await createAccount(account, workspace);\n }\n }\n\n // ---------------------------------\n // ENTITIES (depends on accounts and users so must be run after)\n // ---------------------------------\n if (workspace.entities) {\n logTitle(\"Entities\");\n for (const entity of workspace.entities) {\n await createEntity(entity);\n }\n }\n\n // If the Domain Object already exists, we check if the provided data has changed against the last VaultRequest targeting this Domain Object\n // If the data has changed, we create a new VaultRequest to edit the Domain Object.\n async function editDomainObjectIfNeeded(params: {\n entityType: \"Account\" | \"Entity\" | \"Group\" | \"Policy\" | \"Whitelist\";\n entityName: string;\n existingId: string;\n editInput: CreateRequestInput;\n editData: Record<string, unknown>;\n requestTypes: [VaultRequestResponse[\"type\"], VaultRequestResponse[\"type\"]];\n // biome-ignore lint/suspicious/noExplicitAny: VaultRequestResponse[\"data\"] is a wide union, callers know the shape after invariant check\n extractLastData: (data: any) => Record<string, unknown>;\n }): Promise<\"skipped\" | \"edited\"> {\n const previousRequests = await admin1.client.requests.list.query({\n type: params.requestTypes,\n targetId: params.existingId,\n state: \"EXECUTED\",\n sortBy: \"createdAt\",\n sortOrder: \"desc\",\n pageSize: 1,\n });\n\n if (previousRequests?.results && previousRequests.results.length > 0) {\n const stateRequest = previousRequests.results[0];\n invariant(\n stateRequest && params.requestTypes.includes(stateRequest.type),\n `State request should be a ${params.requestTypes[0]} or ${params.requestTypes[1]} request`,\n );\n\n const lastData = params.extractLastData(stateRequest.data);\n\n // No Edit needed if last data request is unchanged\n if (_.isEqual(stripUndefinedDeep(params.editData), stripUndefinedDeep(lastData))) {\n logger.info(`[SKIPPED] ${params.entityType} \"${params.entityName}\" has not changed`);\n return \"skipped\";\n }\n }\n\n logStep(`Editing ${params.entityType.toLowerCase()} \"${params.entityName}\"...`);\n await createAndApproveRequest(params.editInput, [admin1, admin2], logger);\n logger.info(`[EDITED] ${params.entityType} \"${params.entityName}\" has been edited`);\n return \"edited\";\n }\n\n async function createWhitelists(whitelists: ManifestWhitelist[]): Promise<void> {\n for (const whitelist of whitelists) {\n await createWhitelist(whitelist);\n }\n\n async function createWhitelist(whitelist: ManifestWhitelist): Promise<void> {\n const existing = existingWhitelists.find((w) => w.name === whitelist.name);\n\n const normalizeAddresses = (addresses: ManifestWhitelist[\"addresses\"]) =>\n addresses.map(({ destinationTag, ...rest }) => ({\n ...rest,\n ...(destinationTag ? { destinationTag } : {}),\n }));\n\n const whitelistEditData = {\n name: whitelist.name,\n addresses: normalizeAddresses(whitelist.addresses),\n };\n\n if (existing) {\n await editDomainObjectIfNeeded({\n entityType: \"Whitelist\",\n entityName: whitelist.name,\n existingId: existing.id,\n editInput: {\n type: \"EDIT_WHITELIST\",\n targetId: existing.id,\n data: { name: whitelist.name, addresses: whitelist.addresses },\n },\n editData: whitelistEditData,\n requestTypes: [\"CREATE_WHITELIST\", \"EDIT_WHITELIST\"],\n extractLastData: (data) => ({\n name: data.name,\n addresses: normalizeAddresses(data.addresses),\n }),\n });\n return;\n }\n\n const input: CreateRequestInput = {\n type: \"CREATE_WHITELIST\",\n data: { ...whitelist, description: whitelist.description ?? null },\n };\n\n const req = await createAndApproveRequest(input, [admin1, admin2], logger);\n logSubStep(`Whitelist \"${whitelist.name}\" has been created`);\n\n const createdWhitelist = await admin1.client.whitelists.findById.query({ id: req.targetId! });\n existingWhitelists.push(createdWhitelist);\n }\n }\n\n function govRuleFromManifest(rule: ManifestGovernanceRule): GovRuleData {\n return {\n operationType: rule.type,\n reviewSteps: rule.steps.map((step) => {\n if (\"group\" in step) {\n return {\n quorum: step.quorum,\n groupId: groupIdFromName(step.group),\n };\n }\n return {\n quorum: step.quorum,\n userIds: step.members.map(userIdFromDeviceIndexOrName),\n };\n }),\n ...(rule.threshold !== undefined ? { threshold: rule.threshold } : {}),\n ...(rule.whitelistNames !== undefined\n ? { whitelistIds: rule.whitelistNames.map(whitelistIdFromName) }\n : {}),\n };\n }\n\n function rawSigningRuleFromManifest(rule: ManifestRawSigningGovernanceRule) {\n return {\n operationType: rule.type as \"SIGN_DIGESTS\",\n // RAW_SIGNING only supports steps with userIds (no groups)\n reviewSteps: rule.steps.map((step) => ({\n quorum: step.quorum,\n userIds: step.members.map(userIdFromDeviceIndexOrName),\n })),\n };\n }\n\n async function createAccount(\n account: ManifestAccount,\n workspace: ManifestWorkspace,\n ): Promise<void> {\n const existing = existingAccounts.find(\n (a) =>\n a.currency === account.currency &&\n a.index === account.index &&\n (a.contractAddress ?? null) === (account.contractAddress ?? null),\n );\n\n const governance = match(account.governance)\n .with({ type: \"TRADELINK\" }, (gov) => ({\n type: \"TRADELINK\" as const,\n assetManagerId: assetManagerIdFromName(gov.assetManager),\n exchangeConfigs: gov.exchanges.map((exchangeConfig) => ({\n exchangeId: exchangeIdFromName(exchangeConfig.name),\n repledgeAuthorized: exchangeConfig.repledgeAuthorized === true,\n needsAssetManagerApprovalForSettlements:\n exchangeConfig.needsAssetManagerApprovalForSettlements === true,\n })),\n }))\n .with({ type: \"RAW_SIGNING\" }, (gov) => ({\n type: \"RAW_SIGNING\" as const,\n policy: { rules: gov.rules.map(rawSigningRuleFromManifest) },\n }))\n .with({ type: \"CLASSIC\" }, (gov) => ({\n type: \"CLASSIC\" as const,\n policy: { rules: gov.rules.map(govRuleFromManifest) },\n }))\n .with({ type: \"POLICY\" }, (gov) => ({\n type: \"CLASSIC\" as const,\n policy: { policyId: policyIdFromName(gov.policy) },\n }))\n .exhaustive();\n\n const accountData = {\n name: account.name,\n currency: account.currency,\n contractAddress: account.contractAddress ?? null,\n tokenIdentifier: account.tokenIdentifier ?? null,\n // bitcoinAddressDerivationMode is optional on the API: only send it when set\n ...(account.bitcoinAddressDerivationMode\n ? { bitcoinAddressDerivationMode: account.bitcoinAddressDerivationMode }\n : {}),\n index: account.index,\n governance,\n };\n\n if (existing) {\n const editData = { name: accountData.name, governance };\n const result = await editDomainObjectIfNeeded({\n entityType: \"Account\",\n entityName: account.name,\n existingId: existing.id,\n editInput: { type: \"EDIT_ACCOUNT\", targetId: existing.id, data: editData },\n editData,\n requestTypes: [\"CREATE_ACCOUNT\", \"EDIT_ACCOUNT\"],\n extractLastData: (data) => ({ name: data.name, governance: data.governance }),\n });\n if (result === \"skipped\") {\n await activateHederaAccount(account, workspace, existing.id);\n }\n return;\n }\n\n logStep(`Creating account \"${account.name}\"`);\n const createInput: Extract<CreateRequestInput, { type: \"CREATE_ACCOUNT\" }> = {\n type: \"CREATE_ACCOUNT\",\n data: accountData,\n };\n const req = await createAndApproveRequest(createInput, [admin1, admin2], logger);\n\n const createdAccount = await admin1.client.accounts.findById.query({ id: req.targetId! });\n existingAccounts.push(createdAccount);\n\n if (account.governance.type === \"TRADELINK\") {\n logStep(`Activating tradelink account \"${account.name}\"`);\n // we need to activate the account with the asset manager\n const assetManagerId = assetManagerIdFromName(account.governance.assetManager);\n const assetManager = existingTradelinkNetwork?.assetManagers.find(\n (assetManager) => assetManager.id === assetManagerId,\n );\n invariant(assetManager, `Asset manager for account exists`);\n const loggedAssetManagerOperators = await Promise.all(\n assetManager.groups.flatMap(({ quorum, userIds }) =>\n userIds.slice(0, quorum).map((userId) => {\n const deviceIndex = usersWithDeviceIndex.find((o) => o.user.id === userId)?.deviceIndex;\n return workspaceEngine.withDeviceIndex(deviceIndex!).login();\n }),\n ),\n );\n await createAndApproveRequest(\n { type: \"TRADELINK_ACTIVATE_ACCOUNT\", targetId: req.targetId!, data: null },\n loggedAssetManagerOperators,\n logger,\n );\n }\n\n if (req.targetId) {\n await activateHederaAccount(account, workspace, req.targetId);\n }\n\n logSubStep(`Account ${account.name} has been created`);\n }\n\n async function activateHederaAccount(\n account: ManifestAccount,\n workspace: ManifestWorkspace,\n accountId: string,\n ): Promise<void> {\n // Activate Hedera native account right after creation (before token accounts are created)\n // This ensures token accounts can be created within one Bake process\n if (\n account.currency === \"hedera\" &&\n account.contractAddress === undefined &&\n workspace.hederaData &&\n accountId\n ) {\n const salt = engine.__options.salt;\n const hederaAccountsForSalt = workspace.hederaData[salt];\n const hederaAccountData = hederaAccountsForSalt?.find(\n (h) => h.index === account.index && h.activate,\n );\n if (hederaAccountData) {\n try {\n await admin1.client.accounts.hedera.activateAccount.mutate({\n id: accountId,\n onchainId: hederaAccountData.onChainId,\n });\n logSubStep(`Hedera account \"${account.name}\" has been activated`);\n } catch (error) {\n logger.warning(`Activation for \"${account.name}\" failed: ${error}`);\n }\n }\n }\n }\n\n async function createUser(role: \"ADMIN\" | \"OPERATOR\", deviceIndex: number): Promise<void> {\n const userEngine = workspaceEngine.withDeviceIndex(deviceIndex);\n const deviceId = await userEngine.device.getDeviceUserId();\n\n // eventually check if we can skip user creation\n const existing = existingUsers.find((user) => user.deviceUserId === deviceId);\n if (existing) {\n logger.info(`[SKIPPED] User with device index ${deviceIndex} already exists`);\n return;\n }\n\n const name = `${role === \"ADMIN\" ? \"Admin\" : \"Operator\"} ${deviceIndex}`;\n logStep(`Creating ${name}`);\n\n logSubStep(\"Creating invitation...\");\n let registration = await admin1.client.userRegistrations.invite.mutate({\n name,\n role,\n deviceUserId: deviceId,\n psdModel: \"STAX\",\n });\n\n logSubStep(\"Completing registration...\");\n registration = await userEngine.register(registration);\n\n logSubStep(\"Creating request...\");\n let req = await admin1.client.requests.create.mutate({\n request: {\n type: \"CREATE_PSD_USER\",\n data: { registrationId: registration.id },\n },\n });\n req = await waitForRequestInflightDone(admin1.client, req, logger);\n\n req = await approveRequest(req, [admin1, admin2], logger);\n logSubStep(`${name} has been created`);\n\n const createdUser = await admin1.client.users.findById.query({ id: req.targetId! });\n\n // patch the current state with the newly created user\n existingUsers.push(createdUser);\n usersWithDeviceIndex.push({ user: createdUser, deviceIndex });\n }\n\n async function createApiUser(apiUser: ManifestApiUser): Promise<void> {\n const pubKey = apiUser.pubKey ?? genKeys(apiUser.name).hexPubKey;\n const existing = existingApiUsers.find(\n (user) => user.pubKey === pubKey || user.name === apiUser.name,\n );\n if (existing) {\n logger.info(\n `[SKIPPED] API user already exists with name \"${apiUser.name}\" or public key \"${pubKey}\"`,\n );\n return;\n }\n\n logStep(`Creating API user \"${apiUser.name}\"...`);\n\n logSubStep(\"Creating request...\");\n let req = await admin1.client.requests.create.mutate({\n request: {\n type: \"CREATE_API_USER\",\n data: {\n name: apiUser.name,\n role: apiUser.role,\n pubKey: pubKey,\n viewAll: apiUser.viewAll,\n },\n },\n });\n req = await waitForRequestInflightDone(admin1.client, req, logger);\n req = await approveRequest(req, [admin1, admin2], logger);\n logSubStep(`API user \"${apiUser.name}\" has been created`);\n\n logSubStep(\"Generating credentials...\");\n const credentials = await admin1.client.users.resetApiUserCredentials.mutate({\n id: req.targetId!,\n });\n logSubStep(\n `API user \"${apiUser.name}\" credentials have been generated: apiKeyId=${credentials.apiKeyId}, apiKeySecret=${credentials.apiKeySecret}`,\n );\n const createdUser = await admin1.client.users.findById.query({ id: req.targetId! });\n // patch the current state with the newly created user\n existingApiUsers.push(createdUser);\n }\n\n async function createGroup(group: ManifestGroup): Promise<void> {\n const existing = existingGroups.find((g) => g.name === group.name);\n const members = group.members.map(userIdFromDeviceIndexOrName);\n\n const groupData = {\n name: group.name,\n description: \"\",\n members,\n };\n\n if (existing) {\n await editDomainObjectIfNeeded({\n entityType: \"Group\",\n entityName: group.name,\n existingId: existing.id,\n editInput: { type: \"EDIT_GROUP\", targetId: existing.id, data: groupData },\n editData: groupData,\n requestTypes: [\"CREATE_GROUP\", \"EDIT_GROUP\"],\n extractLastData: (data) => ({ ...data, description: data.description ?? \"\" }),\n });\n return;\n }\n\n logStep(`Creating group ${group.name}...`);\n\n logSubStep(\"Creating request...\");\n let request = await admin1.client.requests.create.mutate({\n request: {\n type: \"CREATE_GROUP\",\n data: groupData,\n },\n });\n request = await waitForRequestInflightDone(admin1.client, request, logger);\n\n request = await approveRequest(request, [admin1, admin2], logger);\n logSubStep(`${group.name} has been created`);\n\n const createdGroup = await admin1.client.groups.findById.query({ id: request.targetId! });\n existingGroups.push(createdGroup);\n }\n\n async function createPolicy(policy: ManifestPolicy): Promise<void> {\n const existing = existingPolicies.find((p) => p.name === policy.name);\n\n const policyEditData = {\n name: policy.name,\n description: \"\",\n govRules: policy.rules.map(govRuleFromManifest),\n };\n\n if (existing) {\n await editDomainObjectIfNeeded({\n entityType: \"Policy\",\n entityName: policy.name,\n existingId: existing.id,\n editInput: { type: \"EDIT_POLICY\", targetId: existing.id, data: policyEditData },\n editData: policyEditData,\n requestTypes: [\"CREATE_POLICY\", \"EDIT_POLICY\"],\n extractLastData: (data) => ({\n name: data.name,\n /* v8 ignore next -- @preserve: defensive fallback for legacy request data */\n description: data.description ?? \"\",\n govRules: data.govRules,\n }),\n });\n return;\n }\n\n logStep(`Creating policy ${policy.name}...`);\n\n const policyAsset =\n policy.asset !== undefined\n ? policy.asset\n : policy.currency !== undefined && policy.currency !== null\n ? { network: policy.currency, contractAddress: null, tokenIdentifier: null }\n : null;\n\n logSubStep(\"Creating request...\");\n let request = await admin1.client.requests.create.mutate({\n request: {\n type: \"CREATE_POLICY\",\n data: {\n ...policyEditData,\n asset: policyAsset,\n },\n },\n });\n request = await waitForRequestInflightDone(admin1.client, request, logger);\n\n request = await approveRequest(request, [admin1, admin2], logger);\n logSubStep(`${policy.name} has been created`);\n\n const createdPolicy = await admin1.client.policies.findById.query({ id: request.targetId! });\n existingPolicies.push(createdPolicy);\n }\n\n async function createWorkspaceRule(workspaceRule: ManifestWorkspaceRule): Promise<void> {\n const { permission, quorum, members } = workspaceRule;\n\n // Always edit/upsert workspace rule - EDIT_WORKSPACE_RULE creates if not exists, updates if exists\n logStep(`Editing workspace rule for ${permission}...`);\n\n // Resolve user IDs from device indexes or names\n const userIds = members.map(userIdFromDeviceIndexOrName);\n\n logSubStep(\"Creating request...\");\n const input: CreateRequestInput = {\n type: \"EDIT_WORKSPACE_RULE\",\n data: {\n permission,\n reviewConfig: [{ quorum, userIds }],\n },\n };\n\n await createAndApproveRequest(input, [admin1, admin2], logger);\n logSubStep(`Workspace rule for \"${permission}\" has been edited`);\n }\n\n async function createEntity(entity: ManifestEntity): Promise<void> {\n const existing = existingEntities.find((e) => e.name === entity.name);\n\n const accountIds = (entity.accounts ?? []).map(accountIdFromName);\n const memberIds = (entity.members ?? []).map(userIdFromUserName);\n\n const entityEditData = { name: entity.name, accountIds, memberIds };\n\n if (existing) {\n await editDomainObjectIfNeeded({\n entityType: \"Entity\",\n entityName: entity.name,\n existingId: existing.id,\n editInput: { type: \"EDIT_ENTITY\", targetId: existing.id, data: entityEditData },\n editData: entityEditData,\n requestTypes: [\"CREATE_ENTITY\", \"EDIT_ENTITY\"],\n extractLastData: (data) => ({\n name: data.name,\n accountIds: data.accountIds,\n memberIds: data.memberIds,\n }),\n });\n return;\n }\n\n logStep(`Creating entity \"${entity.name}\"...`);\n\n const input: CreateRequestInput = {\n type: \"CREATE_ENTITY\",\n data: entityEditData,\n };\n\n const request = await createAndApproveRequest(input, [admin1, admin2], logger);\n logSubStep(`Entity \"${entity.name}\" has been created`);\n\n const createdEntity = await admin1.client.entities.findById.query({ id: request.targetId! });\n existingEntities.push(createdEntity);\n }\n\n async function createTradelink(tradelink: ManifestTradelinkNetwork): Promise<void> {\n /* v8 ignore else -- @preserve */\n if (tradelink.custodian) {\n if (existingTradelinkNetwork === null) {\n logStep(\"Creating custodian config...\");\n const { settlement, withdraw, arbitration } = tradelink.custodian;\n const data = {\n settlement: settlement.map(tradelinkReviewStepFromManifest),\n withdraw: withdraw.map(tradelinkReviewStepFromManifest),\n arbitration: arbitration.map(tradelinkReviewStepFromManifest),\n };\n\n logSubStep(\"Creating request...\");\n let request = await admin1.client.requests.create.mutate({\n request: {\n type: \"TRADELINK_CREATE_CUSTODIAN\",\n data,\n },\n });\n request = await waitForRequestInflightDone(admin1.client, request, logger);\n\n await approveRequest(request, [admin1, admin2], logger);\n logSubStep(\"Tradelink custodian config has been created\");\n\n existingTradelinkNetwork = await admin1.client.tradelink.getNetwork.query();\n } else {\n logger.info(\"[SKIPPED] Custodian config already exists\");\n }\n\n const networkBlueprint = await admin1.client.tradelink.getNetworkBlueprint.query();\n if (networkBlueprint !== null) {\n /* v8 ignore else -- @preserve */\n if (tradelink.exchanges !== undefined) {\n await createTradelinkExchanges(networkBlueprint, tradelink.exchanges);\n }\n\n /* v8 ignore else -- @preserve */\n if (tradelink.assetManagers !== undefined) {\n await createTradelinkAssetManagers(networkBlueprint, tradelink.assetManagers);\n }\n } else {\n logger.error(\n \"Will not create exchanges and asset managers because there is no network blueprint for current workspace\",\n );\n }\n }\n }\n\n async function createTradelinkExchanges(\n networkBlueprint: TradelinkNetworkBlueprintResponse,\n exchanges: ManifestTradelinkEntity[],\n ): Promise<void> {\n invariant(existingTradelinkNetwork !== null, \"Network should exist\");\n const blueprintExchanges = networkBlueprint.exchanges;\n for (const exchange of exchanges) {\n // find uid\n const blueprintExchange = blueprintExchanges.find(({ name }) => name === exchange.name);\n invariant(\n blueprintExchange !== undefined,\n `Exchange ${exchange.name} does not exist in network blueprint`,\n );\n const exchangeId = blueprintExchange.tradelinkId;\n logStep(`Creating exchange ${exchange.name}...`);\n if (\n existingTradelinkNetwork.exchanges.find(({ tradelinkId }) => tradelinkId === exchangeId) !==\n undefined\n ) {\n logger.info(`[SKIPPED] Exchange \"${exchange.name}\" already exists`);\n continue;\n }\n\n logSubStep(\"Creating request...\");\n let request = await admin1.client.requests.create.mutate({\n request: {\n type: \"TRADELINK_CREATE_EXCHANGE\",\n data: {\n tradelinkId: exchangeId,\n groups: exchange.groups.map(tradelinkReviewStepFromManifest),\n whitelist: exchange.whitelist,\n },\n },\n });\n request = await waitForRequestInflightDone(admin1.client, request, logger);\n\n const loggedExchangeOperators = await Promise.all(\n exchange.groups.flatMap(({ quorum, members }) =>\n members\n .slice(0, quorum)\n .map((deviceIndex) => workspaceEngine.withDeviceIndex(deviceIndex).login()),\n ),\n );\n\n await approveRequest(request, [admin1, admin2, ...loggedExchangeOperators], logger);\n\n // refresh tradelink network\n existingTradelinkNetwork = await admin1.client.tradelink.getNetwork.query();\n invariant(existingTradelinkNetwork !== null, \"Tradelink network exists\");\n }\n }\n\n async function createTradelinkAssetManagers(\n networkBlueprint: TradelinkNetworkBlueprintResponse,\n assetManagers: ManifestTradelinkEntity[],\n ): Promise<void> {\n invariant(existingTradelinkNetwork !== null, \"Network should exist\");\n const blueprintAssetManagers = networkBlueprint.assetManagers;\n for (const assetManager of assetManagers) {\n // find uid\n const blueprintAssetManager = blueprintAssetManagers.find(\n ({ name }) => name === assetManager.name,\n );\n invariant(\n blueprintAssetManager !== undefined,\n `AssetManager ${assetManager.name} does not exist in network blueprint`,\n );\n const assetManagerId = blueprintAssetManager.tradelinkId;\n logStep(`Creating assetManager ${assetManager.name}...`);\n if (\n existingTradelinkNetwork.assetManagers.find(\n ({ tradelinkId }) => tradelinkId === assetManagerId,\n ) !== undefined\n ) {\n logger.info(`[SKIPPED] Asset manager \"${assetManager.name}\" already exists`);\n continue;\n }\n\n logSubStep(\"Creating request...\");\n let request = await admin1.client.requests.create.mutate({\n request: {\n type: \"TRADELINK_CREATE_ASSET_MANAGER\",\n data: {\n tradelinkId: assetManagerId,\n groups: assetManager.groups.map(tradelinkReviewStepFromManifest),\n whitelist: assetManager.whitelist,\n },\n },\n });\n request = await waitForRequestInflightDone(admin1.client, request, logger);\n\n const loggedAssetManagerOperators = await Promise.all(\n assetManager.groups.flatMap(({ quorum, members }) =>\n members\n .slice(0, quorum)\n .map((deviceIndex) => workspaceEngine.withDeviceIndex(deviceIndex).login()),\n ),\n );\n\n await approveRequest(request, [admin1, admin2, ...loggedAssetManagerOperators], logger);\n\n // refresh tradelink network\n existingTradelinkNetwork = await admin1.client.tradelink.getNetwork.query();\n invariant(existingTradelinkNetwork !== null, \"Tradelink network exists\");\n }\n }\n\n // For each given user, retrieve (by brute force) their device index, by comparing their\n // device user id with the one computed for each tested index.\n // Using .reduce() here to leverage caching existing discoveries\n async function resolveDevicesIndexes(\n users: UserResponse[],\n ): Promise<{ user: UserResponse; deviceIndex: number }[]> {\n const usersWithDeviceIndex = await users.reduce<\n Promise<{ user: UserResponse; deviceIndex: number }[]>\n >(\n (acc, cur) =>\n acc.then(async (acc) => {\n acc.push(await withDeviceIndex(cur));\n return acc;\n }),\n Promise.resolve([]),\n );\n return usersWithDeviceIndex;\n }\n\n async function withDeviceIndex(\n user: UserResponse,\n ): Promise<{ user: UserResponse; deviceIndex: number }> {\n invariant(user.deviceUserId, `User ${user.id} does not have any device user id`);\n const deviceIndex = await findDeviceIndex(user.deviceUserId);\n return { user, deviceIndex };\n }\n\n function userIdFromDeviceIndex(deviceIndex: number): string {\n const corresponding = usersWithDeviceIndex.find((o) => o.deviceIndex === deviceIndex);\n invariant(corresponding, `No user with device index ${deviceIndex}`);\n return corresponding.user.id;\n }\n\n function userIdFromUserName(name: string): string {\n const user = existingApiUsers.find((u) => u.name === name);\n invariant(user, `User ${name} not found`);\n return user.id;\n }\n\n function userIdFromDeviceIndexOrName(identifier: number | string): string {\n if (typeof identifier === \"number\") {\n return userIdFromDeviceIndex(identifier);\n }\n return userIdFromUserName(identifier);\n }\n\n function groupIdFromName(groupName: string): string {\n const group = existingGroups.find((g) => g.name === groupName);\n invariant(group, `Group ${groupName} not found`);\n return group.id;\n }\n\n function policyIdFromName(policyName: string): string {\n const policy = existingPolicies.find((g) => g.name === policyName);\n invariant(policy, `Policy ${policyName} not found`);\n return policy.id;\n }\n\n function whitelistIdFromName(whitelistName: string): string {\n const whitelist = existingWhitelists.find((w) => w.name === whitelistName);\n invariant(whitelist, `Whitelist ${whitelistName} not found`);\n return whitelist.id;\n }\n\n function accountIdFromName(accountName: string): string {\n const account = existingAccounts.find((a) => a.name === accountName);\n invariant(account, `Account \"${accountName}\" not found`);\n return account.id;\n }\n\n function assetManagerIdFromName(assetManagerName: string): string {\n const orgAssetManager = tradelinkOrgAssetManagersByName[assetManagerName];\n invariant(\n orgAssetManager,\n `Can't find Tradelink organization asset manager ${assetManagerName}`,\n );\n const assetManager = existingTradelinkNetwork?.assetManagers.find(\n (assetManager) => assetManager.tradelinkId === orgAssetManager.tradelinkId,\n );\n invariant(assetManager, `Can't find Tradelink assetManager ${assetManagerName}`);\n return assetManager.id;\n }\n\n function exchangeIdFromName(exchangeName: string): string {\n const exchange = existingTradelinkNetwork?.exchanges.find((exchange) => {\n const orgExchange = tradelinkOrgExchangesByName[exchangeName];\n invariant(orgExchange, `Can't find Tradelink organization exchange ${exchange.tradelinkId}`);\n return orgExchange.name === exchangeName;\n });\n invariant(exchange, `Can't find Tradelink exchange ${exchangeName}`);\n return exchange.id;\n }\n\n function tradelinkReviewStepFromManifest({\n members,\n quorum,\n }: ManifestTradelinkGroup): ReviewStepWithUsers {\n return {\n userIds: members.map(userIdFromDeviceIndex),\n quorum,\n };\n }\n}\n","import invariant from \"invariant\";\nimport { match } from \"ts-pattern\";\n\nimport type { Logger } from \"@/logger\";\nimport { createDeviceIndexResolver, fetchAll } from \"@/utils\";\n\nimport type { RecipeOptions } from \"./recipe\";\nimport type {\n ManifestAccount,\n ManifestApiUser,\n ManifestEntity,\n ManifestGovernanceRule,\n ManifestGroup,\n ManifestPolicy,\n ManifestWhitelist,\n ManifestWorkspace,\n ManifestWorkspaceRule,\n} from \"./types\";\n\nexport async function recipeWorkspace(\n options: RecipeOptions,\n logger: Logger,\n): Promise<ManifestWorkspace> {\n const { engine, workspaceName } = options;\n\n const workspaceEngine = engine.withWorkspace(workspaceName);\n\n // Utility to retrieve device index based on device user id\n const findDeviceIndex = createDeviceIndexResolver(workspaceEngine);\n\n // Log-in with admin (index 4 by convention)\n logger.info(\"Authenticating with admin...\");\n const admin = await workspaceEngine.withDeviceIndex(4).login();\n\n // Fetch all existing data in parallel\n logger.info(\"Fetching existing data...\");\n const [\n existingUsers,\n existingGroups,\n existingWhitelists,\n publicPolicies,\n privatePolicies,\n existingAccounts,\n existingEntities,\n existingWorkspaceRules,\n ] = await Promise.all([\n fetchAll(admin.client.users.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin.client.groups.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin.client.whitelists.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin.client.policies.list.query, { isPrivate: false }),\n fetchAll(admin.client.policies.list.query, { isPrivate: true }),\n fetchAll(admin.client.accounts.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin.client.entities.list.query, { status: \"ACTIVE\" }),\n admin.client.governance.listWorkspaceRules.query(),\n ]);\n\n const existingPolicies = [...publicPolicies, ...privatePolicies];\n\n const existingPsdUsers = existingUsers.filter((user) => user.deviceType === \"PSD\");\n const existingApiUsers = existingUsers.filter((user) => user.deviceType === \"API\");\n\n // Resolve device indexes for PSD users\n logger.info(\"Resolving device indexes...\");\n const psdUsersWithIndex = await resolveDevicesIndexes(existingPsdUsers);\n\n // ---------------------------------\n // USERS\n // ---------------------------------\n logger.info(\"Reading users...\");\n const adminIndexes = psdUsersWithIndex\n .filter((u) => u.user.role === \"ADMIN\")\n .map((u) => u.deviceIndex);\n\n const operatorIndexes = psdUsersWithIndex\n .filter((u) => u.user.role === \"OPERATOR\")\n .map((u) => u.deviceIndex);\n\n const apiUsers: ManifestApiUser[] = existingApiUsers.map((user) => {\n const role = match(user.role)\n .with(\"ADMIN\", \"OPERATOR\", (role) => role)\n .with(\"READ_ONLY_API_KEY\", (role) => {\n throw new Error(`Unexpected API user role \"${role}\" for user ${user.name}`);\n })\n .exhaustive();\n return {\n name: user.name,\n role,\n pubKey: user.pubKey,\n viewAll: user.legacyViewAll,\n };\n });\n\n // ---------------------------------\n // GROUPS\n // ---------------------------------\n logger.info(\"Reading groups...\");\n const groups: ManifestGroup[] = existingGroups.map((group) => ({\n name: group.name,\n members: group.members.map((member) => resolveUserIdentifier(member.id)),\n }));\n\n // ---------------------------------\n // WHITELISTS\n // ---------------------------------\n logger.info(\"Reading whitelists...\");\n const whitelists: ManifestWhitelist[] = existingWhitelists.map((whitelist) => ({\n name: whitelist.name,\n description: whitelist.description ?? undefined,\n type: \"TRANSACTION\" as const,\n addresses: whitelist.addresses.map((addr) => ({\n name: addr.name,\n currency: addr.currency,\n address: addr.address,\n ...(addr.destinationTag ? { destinationTag: addr.destinationTag } : {}),\n })),\n }));\n\n // ---------------------------------\n // POLICIES\n // ---------------------------------\n logger.info(\"Reading policies...\");\n const policies: ManifestPolicy[] = publicPolicies.map((policy) => ({\n name: policy.name,\n asset: policy.asset,\n rules: policy.rules.map(govRuleToManifest),\n }));\n\n // ---------------------------------\n // ACCOUNTS\n // ---------------------------------\n logger.info(\"Reading accounts...\");\n const accounts: ManifestAccount[] = existingAccounts.map((account) => {\n const governance = match(account.governance)\n .with({ type: \"CLASSIC\" }, (gov) => {\n const policy = existingPolicies.find((p) => p.id === gov.policyId);\n invariant(policy, `Policy ${gov.policyId} not found for account ${account.name}`);\n return policy.isPrivate\n ? {\n type: \"CLASSIC\" as const,\n rules: policy.rules.map(govRuleToManifest),\n }\n : {\n type: \"POLICY\" as const,\n policy: policy.name,\n };\n })\n .with({ type: \"RAW_SIGNING\" }, (gov) => {\n const policy = existingPolicies.find((p) => p.id === gov.policyId);\n invariant(policy, `Policy ${gov.policyId} not found for account ${account.name}`);\n return {\n type: \"RAW_SIGNING\" as const,\n rules: policy.rules.map((rule) => ({\n type: \"SIGN_DIGESTS\" as const,\n steps: rule.reviewSteps.map((step) => {\n invariant(\"userIds\" in step, \"RAW_SIGNING rules only support user steps\");\n return {\n quorum: step.quorum,\n members: step.userIds.map(resolveUserToDeviceIndexOrName),\n };\n }),\n })),\n };\n })\n .with({ type: \"TRADELINK\" }, (gov) => ({\n type: \"TRADELINK\" as const,\n assetManager: resolveAssetManagerName(gov.assetManagerId),\n exchanges: gov.exchangeConfigs.map((exchangeConfig) => ({\n name: resolveExchangeName(exchangeConfig.exchangeId),\n ...(exchangeConfig.repledgeAuthorized ? { repledgeAuthorized: true } : {}),\n ...(exchangeConfig.needsAssetManagerApprovalForSettlements\n ? { needsAssetManagerApprovalForSettlements: true }\n : {}),\n })),\n }))\n .exhaustive();\n\n return {\n name: account.name,\n currency: account.currency,\n index: account.index,\n ...(account.contractAddress ? { contractAddress: account.contractAddress } : {}),\n ...(account.tokenIdentifier ? { tokenIdentifier: account.tokenIdentifier } : {}),\n // NEW is the default; only surface the field when it differs to keep manifests clean\n ...(account.asset?.type === \"BITCOIN_LIKE\" && account.asset.addressDerivationMode === \"STATIC\"\n ? { bitcoinAddressDerivationMode: \"STATIC\" as const }\n : {}),\n governance,\n };\n });\n\n // ---------------------------------\n // ENTITIES\n // ---------------------------------\n logger.info(\"Reading entities...\");\n const entities: ManifestEntity[] = existingEntities.map((entity) => ({\n name: entity.name,\n ...(entity.accountIds.length > 0 ? { accounts: entity.accountIds.map(accountNameFromId) } : {}),\n ...(entity.memberIds.length > 0 ? { members: entity.memberIds.map(userNameFromId) } : {}),\n }));\n\n // ---------------------------------\n // WORKSPACE RULES\n // ---------------------------------\n logger.info(\"Reading workspace rules...\");\n const workspaceRules: ManifestWorkspaceRule[] = existingWorkspaceRules.results\n .filter((rule) => rule.permission !== \"ROOT\")\n .map((rule) => {\n invariant(\n rule.reviewSteps.length === 1,\n \"Only one review step supported for workspace rules in manifest\",\n );\n const step = rule.reviewSteps[0]!;\n const quorum = step.quorum;\n invariant(rule.permission !== \"ROOT\", \"filtered out\");\n return {\n permission: rule.permission,\n quorum,\n members: step.userIds.map(resolveUserToDeviceIndexOrName),\n };\n });\n\n // TODO: recipe does not yet support pledges (future task)\n // TODO: recipe does not yet support hederaData\n // TODO: recipe does not yet support tradelink workspace config\n\n const workspace: ManifestWorkspace = {\n users: {\n ...(adminIndexes.length > 0 ? { admins: adminIndexes } : {}),\n ...(operatorIndexes.length > 0 ? { operators: operatorIndexes } : {}),\n ...(apiUsers.length > 0 ? { api: apiUsers } : {}),\n },\n ...(groups.length > 0 ? { groups } : {}),\n ...(whitelists.length > 0 ? { whitelists } : {}),\n ...(policies.length > 0 ? { policies } : {}),\n ...(accounts.length > 0 ? { accounts } : {}),\n ...(entities.length > 0 ? { entities } : {}),\n ...(workspaceRules.length > 0 ? { workspaceRules } : {}),\n };\n\n logger.info(\"Recipe completed\");\n return workspace;\n\n // ---- Helper functions ----\n\n async function resolveDevicesIndexes(\n users: typeof existingPsdUsers,\n ): Promise<{ user: (typeof existingPsdUsers)[number]; deviceIndex: number }[]> {\n const result: { user: (typeof existingPsdUsers)[number]; deviceIndex: number }[] = [];\n for (const user of users) {\n invariant(user.deviceUserId, `User ${user.id} does not have any device user id`);\n const deviceIndex = await findDeviceIndex(user.deviceUserId);\n result.push({ user, deviceIndex });\n }\n return result;\n }\n\n function resolveUserIdentifier(userId: string): number | string {\n const psdUser = psdUsersWithIndex.find((u) => u.user.id === userId);\n if (psdUser) return psdUser.deviceIndex;\n const apiUser = existingApiUsers.find((u) => u.id === userId);\n if (apiUser) return apiUser.name;\n throw new Error(`User ${userId} not found`);\n }\n\n function resolveUserToDeviceIndexOrName(userId: string): number | string {\n return resolveUserIdentifier(userId);\n }\n\n function validateGovernanceRuleType(value: string): ManifestGovernanceRule[\"type\"] {\n invariant(\n [\"SEND\", \"STAKE\", \"DEPLOY_CONTRACT\", \"EXECUTE_CONTRACT\", \"SIGN_MESSAGE\", \"RECEIVE\"].includes(\n value,\n ),\n `Unexpected governance rule type: ${value}`,\n );\n return value as ManifestGovernanceRule[\"type\"];\n }\n\n function govRuleToManifest(rule: {\n operationType: string;\n reviewSteps: ({ quorum: number; userIds: string[] } | { quorum: number; groupId: string })[];\n threshold?: { min: string | null; max: string | null };\n whitelistIds?: string[] | null;\n }): ManifestGovernanceRule {\n const operationType = validateGovernanceRuleType(rule.operationType);\n\n const threshold =\n rule.threshold !== undefined && (rule.threshold.min !== null || rule.threshold.max !== null)\n ? { threshold: { min: rule.threshold.min, max: rule.threshold.max } }\n : {};\n\n return {\n type: operationType,\n steps: rule.reviewSteps.map((step) => {\n if (\"groupId\" in step) {\n const group = existingGroups.find((g) => g.id === step.groupId);\n invariant(group, `Group ${step.groupId} not found`);\n return { quorum: step.quorum, group: group.name };\n }\n return {\n quorum: step.quorum,\n members: step.userIds.map(resolveUserToDeviceIndexOrName),\n };\n }),\n ...threshold,\n ...(rule.whitelistIds && rule.whitelistIds.length > 0\n ? { whitelistNames: rule.whitelistIds.map(whitelistNameFromId) }\n : {}),\n };\n }\n\n function whitelistNameFromId(whitelistId: string): string {\n const whitelist = existingWhitelists.find((w) => w.id === whitelistId);\n invariant(whitelist, `Whitelist ${whitelistId} not found`);\n return whitelist.name;\n }\n\n function accountNameFromId(accountId: string): string {\n const account = existingAccounts.find((a) => a.id === accountId);\n invariant(account, `Account ${accountId} not found`);\n return account.name;\n }\n\n function userNameFromId(userId: string): string {\n const user = existingApiUsers.find((u) => u.id === userId);\n invariant(user, `API user ${userId} not found`);\n return user.name;\n }\n\n function resolveAssetManagerName(assetManagerId: string): string {\n // We need the tradelink network to resolve names, but since we skip tradelink\n // in recipe, we return the ID as-is for now\n return assetManagerId;\n }\n\n function resolveExchangeName(exchangeId: string): string {\n // Same as above — tradelink not yet supported\n return exchangeId;\n }\n}\n","import type { Engine } from \"@/engine\";\nimport type { Logger } from \"@/logger\";\n\nimport { recipeWorkspace } from \"./recipe-workspace\";\nimport type { Manifest } from \"./types\";\n\nexport type RecipeOptions = {\n engine: Engine;\n workspaceName: string;\n};\n\nexport async function recipeManifest(options: RecipeOptions, logger: Logger): Promise<Manifest> {\n const workspace = await recipeWorkspace(options, logger);\n\n return {\n manifestVersion: 2,\n workspace,\n };\n}\n","import z from \"zod\";\n\nimport type { Engine } from \"@/engine\";\n\n// #region ---------- General types ---------------------------------------------------------------\n\nexport type BakeOptions = {\n manifest: Manifest;\n engine: Engine;\n workspaceName?: string;\n rootAuthToken?: string;\n};\n\n// #endregion\n\n// #region ---------- Users -----------------------------------------------------------------------\n\nconst zManifestUser = z.number().meta({ description: \"User device index\" });\nconst zManifestUserName = z.string().meta({ description: \"User name\" });\nconst zManifestApiUser = z.object({\n name: z.string().meta({ description: \"API user name\" }),\n role: z.enum([\"ADMIN\", \"OPERATOR\"]).meta({ description: \"API user role\" }).default(\"OPERATOR\"),\n pubKey: z\n .string()\n .meta({\n description:\n \"API user public key. If not provided, one will be generated using the name as entropy\",\n })\n .optional(),\n viewAll: z.boolean().meta({ description: \"Whether the API user can view all accounts\" }),\n});\n\nexport type ManifestApiUser = z.infer<typeof zManifestApiUser>;\n\n// #endregion\n\n// #region ---------- Groups ----------------------------------------------------------------------\n\nconst zManifestGroup = z\n .object({\n name: z.string().meta({ description: \"Group name\" }),\n members: z\n .array(z.union([zManifestUser, zManifestUserName]))\n .meta({ description: \"Group members\" }),\n })\n .strict()\n .meta({ description: \"Operators group\" });\n\nexport type ManifestGroup = z.infer<typeof zManifestGroup>;\n\n// #endregion\n\n// #region ---------- Whitelists ------------------------------------------------------------------\n\nconst zManifestWhitelistAddress = z\n .object({\n name: z.string().meta({ description: \"Whitelist address name\" }),\n currency: z.string().meta({ description: \"Whitelist address currency\" }),\n address: z.string().meta({ description: \"Whitelist address\" }),\n destinationTag: z\n .string()\n .optional()\n .meta({ description: \"Destination tag (applicable for Ripple currency)\" }),\n })\n .strict();\n\nconst zManifestWhitelist = z\n .object({\n name: z.string().meta({ description: \"Whitelist name\" }),\n description: z.string().optional().meta({ description: \"Whitelist description\" }),\n type: z\n .enum([\"TRANSACTION\", \"SMART_CONTRACT\"])\n .optional()\n .default(\"TRANSACTION\")\n .meta({ description: \"Whitelist type\" }),\n addresses: z.array(zManifestWhitelistAddress).meta({ description: \"Whitelist addresses\" }),\n })\n .strict()\n .meta({ description: \"Whitelist\" });\n\nexport type ManifestWhitelist = z.infer<typeof zManifestWhitelist>;\n\n// #endregion\n\n// #region ---------- Policies --------------------------------------------------------------------\n\nconst zManifestGovernanceStepWithUsers = z\n .object({\n quorum: z.number(),\n members: z.array(z.union([zManifestUser, zManifestUserName])),\n })\n .strict();\n\nconst zManifestGovernanceStepWithGroup = z\n .object({\n quorum: z.number(),\n group: z.string(),\n })\n .strict();\n\nconst zManifestGovernanceStep = z.union([\n zManifestGovernanceStepWithUsers,\n zManifestGovernanceStepWithGroup,\n]);\n\nconst zManifestGovernanceRule = z\n .object({\n // TODO see if there is a way to import this from `api` package\n // (the challenge there is that enums are not transpiled)\n type: z.enum([\n \"SEND\",\n \"STAKE\",\n \"DEPLOY_CONTRACT\",\n \"EXECUTE_CONTRACT\",\n \"SIGN_MESSAGE\",\n \"RECEIVE\",\n ]),\n steps: z.array(zManifestGovernanceStep).min(1),\n threshold: z\n .object({\n min: z.string().nullable(),\n max: z.string().nullable(),\n })\n .optional(),\n whitelistNames: z.array(z.string()).optional(),\n })\n .strict();\n\nexport type ManifestGovernanceRule = z.infer<typeof zManifestGovernanceRule>;\n\nconst zManifestPolicyAsset = z\n .object({\n network: z.string(),\n contractAddress: z.string().nullable(),\n tokenIdentifier: z.string().nullable(),\n })\n .strict();\n\nexport const zManifestPolicy = z\n .object({\n name: z.string(),\n /** @deprecated use asset instead */\n currency: z.string().nullable().optional(),\n asset: zManifestPolicyAsset.nullable().optional(),\n rules: z.array(zManifestGovernanceRule),\n })\n .strict();\n\nexport type ManifestPolicy = z.infer<typeof zManifestPolicy>;\n\n// #endregion\n\n// #region ---------- Accounts --------------------------------------------------------------------\n\nconst zManifestClassicAccountGovernance = z\n .object({\n type: z.literal(\"CLASSIC\"),\n rules: z.array(zManifestGovernanceRule),\n })\n .strict();\n\nconst zManifestClassicAccountGovernanceWithPolicy = z\n .object({\n type: z.literal(\"POLICY\"),\n policy: z.string(),\n })\n .strict();\n\nconst zManifestTradelinkExchangeConfig = z\n .object({\n name: z.string().meta({ description: \"Exchange name\" }),\n repledgeAuthorized: z\n .boolean()\n .optional()\n .meta({ description: \"Whether repledge is authorized\" }),\n needsAssetManagerApprovalForSettlements: z\n .boolean()\n .optional()\n .meta({ description: \"Whether asset manager pre approval is needed\" }),\n })\n .strict();\n\nconst zManifestTradelinkAccountGovernance = z\n .object({\n type: z.literal(\"TRADELINK\"),\n assetManager: z.string().meta({ description: \"Asset manager name\" }),\n exchanges: z.array(zManifestTradelinkExchangeConfig),\n })\n .strict();\n\n// RAW_SIGNING only supports steps with users (no groups)\nconst zManifestRawSigningGovernanceRule = z\n .object({\n type: z.literal(\"SIGN_DIGESTS\"),\n steps: z.array(zManifestGovernanceStepWithUsers).min(1),\n })\n .strict();\n\nexport type ManifestRawSigningGovernanceRule = z.infer<typeof zManifestRawSigningGovernanceRule>;\n\nconst zManifestRawSigningAccountGovernance = z\n .object({\n type: z.literal(\"RAW_SIGNING\"),\n rules: z.array(zManifestRawSigningGovernanceRule),\n })\n .strict();\n\nconst zManifestAccountGovernance = z.discriminatedUnion(\"type\", [\n zManifestClassicAccountGovernance,\n zManifestTradelinkAccountGovernance,\n zManifestRawSigningAccountGovernance,\n zManifestClassicAccountGovernanceWithPolicy,\n]);\n\nconst zManifestAccount = z\n .object({\n name: z.string(),\n currency: z.string(),\n index: z.number().nonnegative(),\n contractAddress: z.string().optional(),\n tokenIdentifier: z.string().optional(),\n bitcoinAddressDerivationMode: z\n .enum([\"NEW\", \"STATIC\"])\n .optional()\n .meta({\n description:\n \"Bitcoin address derivation mode. STATIC reuses the account's first receive address; \" +\n \"NEW (default) returns a fresh address each time. Only valid for bitcoin accounts.\",\n }),\n governance: zManifestAccountGovernance,\n })\n .strict();\n\nexport type ManifestAccount = z.infer<typeof zManifestAccount>;\n\n// #endregion\n\n// #region ---------- Entities --------------------------------------------------------------------\n\nconst zManifestEntity = z\n .object({\n name: z.string().min(1).max(19).meta({ description: \"Entity name\" }),\n accounts: z\n .array(z.string())\n .optional()\n .meta({ description: \"Account names to include in this entity\" }),\n members: z\n .array(z.string())\n .optional()\n .meta({ description: \"API operator names to include in this entity\" }),\n })\n .strict()\n .meta({ description: \"Entity\" });\n\nexport type ManifestEntity = z.infer<typeof zManifestEntity>;\n\n// #endregion\n\n// #region ---------- Hedera data ------------------------------------------------------------------\n\nconst zManifestHederaData = z\n .object({\n index: z.number(),\n onChainId: z.string(),\n activate: z.boolean().default(true),\n })\n .strict();\n\nexport type ManifestHederaData = z.infer<typeof zManifestHederaData>;\n\n// #endregion\n\n// #region ---------- Pledge adjustments (increment/decrement) ------------------------------------\n\nconst zManifestPledgeAdjustment = z\n .object({\n account: z.string(),\n exchange: z.string(),\n amount: z.string(),\n })\n .strict();\n\nexport type ManifestPledgeAdjustment = z.infer<typeof zManifestPledgeAdjustment>;\n\n// #endregion\n\n// #region ---------- Tradelink network -----------------------------------------------------------\n\nconst zManifestTradelinkGroup = z\n .object({\n members: z.array(zManifestUser),\n quorum: z.number(),\n })\n .strict()\n .meta({ description: \"Tradelink group\" });\n\nexport type ManifestTradelinkGroup = z.infer<typeof zManifestTradelinkGroup>;\n\nconst zManifestTradelinkGroups = z.array(zManifestTradelinkGroup);\n\nconst zManifestTradelinkWhitelistAddress = z\n .object({\n name: z.string().min(1),\n currency: z.string().min(1),\n address: z.string().min(1),\n })\n .strict()\n .meta({ description: \"Tradelink whitelist address\" });\n\nconst zManifestTradelinkWhitelist = z\n .array(zManifestTradelinkWhitelistAddress)\n .meta({ description: \"Tradelink whitelist\" });\n\nconst zManifestTradelinkEntity = z\n .object({\n name: z.string(),\n groups: zManifestTradelinkGroups,\n whitelist: zManifestTradelinkWhitelist,\n })\n .strict();\n\nexport type ManifestTradelinkEntity = z.infer<typeof zManifestTradelinkEntity>;\n\nconst zManifestTradelinkCustodian = z\n .object({\n settlement: zManifestTradelinkGroups,\n withdraw: zManifestTradelinkGroups,\n arbitration: zManifestTradelinkGroups,\n })\n .strict();\n\nconst zManifestTradelinkNetworkBlueprint = z\n .object({\n custodian: z.string(),\n exchanges: z.array(z.string()),\n assetManagers: z.array(z.string()),\n })\n .strict();\n\nexport type ManifestTradelinkNetworkBlueprint = z.infer<typeof zManifestTradelinkNetworkBlueprint>;\n\nconst zManifestTradelinkNetwork = z\n .object({\n networkBlueprint: zManifestTradelinkNetworkBlueprint.optional(),\n custodian: zManifestTradelinkCustodian.optional(),\n exchanges: z.array(zManifestTradelinkEntity).optional(),\n assetManagers: z.array(zManifestTradelinkEntity).optional(),\n })\n .strict()\n .meta({ description: \"Tradelink network configuration\" });\n\nexport type ManifestTradelinkNetwork = z.infer<typeof zManifestTradelinkNetwork>;\n\n// #endregion\n\n// #region ---------- Workspace rules -------------------------------------------------------------\n\nconst zManifestWorkspaceRule = z\n .object({\n permission: z.enum([\"CREATE_ACCOUNT_WITH_POLICY\"]),\n quorum: z.number().min(1),\n members: z.array(z.union([zManifestUser, zManifestUserName])),\n })\n .strict()\n .meta({ description: \"Workspace rule for granting permissions\" });\n\nexport type ManifestWorkspaceRule = z.infer<typeof zManifestWorkspaceRule>;\n\n// #endregion\n\n// #region ---------- Workspace -------------------------------------------------------------------\n\nconst zManifestWorkspace = z\n .object({\n tradelink: zManifestTradelinkNetwork.optional(),\n users: z\n .object({\n admins: z.array(zManifestUser).optional(),\n operators: z.array(zManifestUser).optional(),\n api: z.array(zManifestApiUser).optional(),\n })\n .optional(),\n groups: z.array(zManifestGroup).optional(),\n whitelists: z.array(zManifestWhitelist).optional(),\n policies: z.array(zManifestPolicy).optional(),\n accounts: z.array(zManifestAccount).optional(),\n entities: z.array(zManifestEntity).optional(),\n hederaData: z.record(z.string(), z.array(zManifestHederaData)).optional(),\n pledges: z.array(zManifestPledgeAdjustment).optional(),\n workspaceRules: z.array(zManifestWorkspaceRule).optional(),\n })\n .strict()\n .meta({ description: \"Workspace configuration\" });\n\nexport type ManifestWorkspace = z.infer<typeof zManifestWorkspace>;\n\n// #endregion\n\n// #region ---------- Tradelink organization ------------------------------------------------------\n\nconst zManifestTradelinkOrgEntity = z\n .object({\n name: z.string(),\n code: z.string(),\n logo: z.string(),\n })\n .strict()\n .meta({ description: \"Tradelink organization entity\" });\n\nconst zManifestTradelinkOrg = z\n .object({\n exchanges: z.array(zManifestTradelinkOrgEntity).optional(),\n assetManagers: z.array(zManifestTradelinkOrgEntity).optional(),\n custodians: z.array(zManifestTradelinkOrgEntity).optional(),\n })\n .strict()\n .meta({ description: \"Tradelink organization configuration\" });\n\nexport type ManifestTradelinkOrg = z.infer<typeof zManifestTradelinkOrg>;\n\n// #endregion\n\n// #region ---------- Manifest --------------------------------------------------------------------\n\nexport const zManifest = z\n .object({\n manifestVersion: z.literal(2),\n tradelink: zManifestTradelinkOrg.optional(),\n workspace: zManifestWorkspace.optional(),\n })\n .strict();\n\nexport type Manifest = z.infer<typeof zManifest>;\n\n// #endregion\n","import invariant from \"invariant\";\n\nimport type { Logger } from \"@/logger\";\n\nimport { bakePledgeAdjustment } from \"./bake-pledge\";\nimport { bakeTradelinkOrganization } from \"./bake-tradelink-organization\";\nimport { bakeWorkspace } from \"./bake-workspace\";\nimport type { BakeOptions } from \"./types\";\n\nexport * from \"./bake-pledge\";\nexport { type RecipeOptions, recipeManifest } from \"./recipe\";\nexport * from \"./types\";\nexport {\n type CreateRequestInput,\n createAndApproveRequest,\n waitForRequestInflightDone,\n} from \"./utils\";\n\nexport async function bakeManifest(options: BakeOptions, logger: Logger): Promise<void> {\n const {\n engine,\n workspaceName,\n rootAuthToken,\n manifest: { tradelink, workspace },\n } = options;\n\n if (tradelink) {\n invariant(rootAuthToken, `rootAuthToken is required to create Tradelink org entities`);\n await bakeTradelinkOrganization(\n {\n engine,\n tradelink,\n rootAuthToken,\n ...(workspace?.tradelink?.networkBlueprint && workspaceName\n ? { networkBlueprint: { blueprint: workspace.tradelink.networkBlueprint, workspaceName } }\n : {}),\n },\n logger,\n );\n }\n\n if (workspace) {\n invariant(workspaceName, `Can't bake workspace without specifying a workspace name`);\n await bakeWorkspace({ engine, workspace, workspaceName }, logger);\n\n if (workspace.pledges) {\n const engineWithWorkspace = engine.withWorkspace(workspaceName);\n for (const pledgeAdjustment of workspace.pledges) {\n await bakePledgeAdjustment({ engine: engineWithWorkspace, pledgeAdjustment }, logger);\n }\n }\n }\n\n logger.info(\"Successfully baked\");\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bake.cjs","names":["createDeviceIndexResolver","fetchAll","createDeviceIndexResolver","fetchAll","_","match","genKeys","createDeviceIndexResolver","fetchAll","match","z"],"sources":["../src/bake/utils.ts","../src/bake/bake-pledge.ts","../src/bake/bake-tradelink-organization.ts","../src/bake/bake-workspace.ts","../src/bake/recipe-workspace.ts","../src/bake/recipe.ts","../src/bake/types.ts","../src/bake/index.ts"],"sourcesContent":["import type { VaultRequestResponse } from \"@ledgerhq/revault-api\";\nimport invariant from \"invariant\";\n\nimport type { Engine, WithDevice, WithPsdAuth, WithWorkspace } from \"@/engine\";\nimport type { Logger } from \"@/logger\";\nimport type { RevaultApiTRPCClient, RouterInputs } from \"@/trpc\";\n\ntype LogFunction = (msg: string) => void;\n\ntype LogHelpers = {\n logTitle: LogFunction;\n logStep: LogFunction;\n logSubStep: LogFunction;\n};\n\nexport function createBakeLogHelpers(logger: Logger): LogHelpers {\n return {\n logTitle(title: string): void {\n logger.info(`:: ${title} ::`);\n },\n logStep(msg: string): void {\n logger.info(`=> ${msg}`);\n },\n logSubStep(msg: string): void {\n logger.info(` -> ${msg}`);\n },\n };\n}\n\nexport type CreateRequestInput = RouterInputs[\"requests\"][\"create\"][\"request\"];\n\nexport type inferRequestInputData<T extends RouterInputs[\"requests\"][\"create\"][\"request\"][\"type\"]> =\n Extract<RouterInputs[\"requests\"][\"create\"][\"request\"], { type: T }>[\"data\"];\n\nconst IS_REQUEST_STATE_END_STATE: Record<VaultRequestResponse[\"state\"], boolean> = {\n // end states:\n ABORTED: true,\n BLOCKED: true,\n EXECUTED: true,\n EXPIRED: true,\n FAILED: true,\n STUCK: true,\n // not end states:\n EXECUTING: false,\n INITIAL: false,\n PENDING_APPROVAL: false,\n};\n\nconst isEndState = (state: VaultRequestResponse[\"state\"]): boolean =>\n IS_REQUEST_STATE_END_STATE[state];\n\nconst DEFAULT_POLL_INTERVAL_MS = 250;\nconst DEFAULT_TIMEOUT_MS = 60_000;\n\nconst wait = (ms: number): Promise<void> => {\n return new Promise((resolve) => setTimeout(resolve, ms));\n};\n\n/**\n * Poll a request until its inflight field is false, indicating it has been processed by the system.\n * Returns the updated request once inflight is false.\n * Throws if the timeout is exceeded before inflight becomes false.\n */\nexport async function waitForRequestInflightDone(\n client: RevaultApiTRPCClient,\n request: VaultRequestResponse,\n logger: Logger,\n options?: { pollIntervalMs?: number; timeoutMs?: number },\n): Promise<VaultRequestResponse> {\n const { logSubStep } = createBakeLogHelpers(logger);\n if (request.inflight === undefined) {\n return request;\n }\n\n logSubStep(`Waiting for inflight request to be processed...`);\n\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const deadline = Date.now() + timeoutMs;\n const pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n\n let updated = request;\n\n while (Date.now() < deadline) {\n updated = await client.requests.findById.query({ id: request.id });\n if (updated.inflight === undefined) {\n return updated;\n }\n await wait(pollIntervalMs);\n }\n\n throw new Error(\n `Timed out waiting for request ${request.id} inflight to be processed (last inflight: ${JSON.stringify(\n updated.inflight,\n )})`,\n );\n}\n\n/**\n * Poll a request until it reaches a terminal state (EXECUTED, FAILED, etc.).\n *\n * Returns the request once it is no longer in EXECUTING/STUCK state.\n * Throws if the request reaches FAILED or STUCK state, or if the timeout is exceeded.\n */\nexport async function waitForRequestExecuted(\n client: RevaultApiTRPCClient,\n request: VaultRequestResponse,\n logger: Logger,\n options?: { pollIntervalMs?: number; timeoutMs?: number },\n): Promise<VaultRequestResponse> {\n const { logSubStep } = createBakeLogHelpers(logger);\n\n if (isEndState(request.state)) {\n if (request.state === \"EXECUTED\") {\n return request;\n }\n throw new Error(`Request is in error state ${request.state}`);\n }\n\n const pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const deadline = Date.now() + timeoutMs;\n\n logSubStep(`Waiting for request to be executed...`);\n\n let updated = request;\n\n while (Date.now() < deadline) {\n updated = await client.requests.findById.query({ id: request.id });\n if (isEndState(updated.state)) {\n if (updated.state === \"EXECUTED\") {\n return updated;\n }\n throw new Error(`Request is in error state ${updated.state}`);\n }\n await wait(pollIntervalMs);\n }\n\n throw new Error(\n `Timed out waiting for request ${request.id} to reach a terminal state (last state: ${updated.state})`,\n );\n}\n\nexport async function approveRequest(\n request: VaultRequestResponse,\n approvers: Engine<WithWorkspace & WithDevice & WithPsdAuth>[],\n logger: Logger,\n): Promise<VaultRequestResponse> {\n const { logSubStep } = createBakeLogHelpers(logger);\n for (let i = 0; i < approvers.length; i++) {\n logSubStep(`Collecting approval (${i + 1}/${approvers.length})...`);\n const approver = approvers[i]!;\n request = await approver.approve(request);\n request = await waitForRequestInflightDone(approver.client, request, logger);\n }\n return waitForRequestExecuted(approvers[0]!.client, request, logger);\n}\n\nexport async function createAndApproveRequest(\n input: CreateRequestInput,\n approvers: Engine<WithWorkspace & WithDevice & WithPsdAuth>[],\n logger: Logger,\n): Promise<VaultRequestResponse> {\n const { logSubStep } = createBakeLogHelpers(logger);\n const creator = approvers[0];\n invariant(creator, \"Need at least 1 user to create a request\");\n logSubStep(`Creating request of type ${input.type}...`);\n let request = await creator.client.requests.create.mutate({\n request: input,\n });\n request = await waitForRequestInflightDone(creator.client, request, logger);\n return approveRequest(request, approvers, logger);\n}\n\nexport function stripUndefinedDeep<T>(obj: T): T {\n if (Array.isArray(obj)) {\n return obj.map(stripUndefinedDeep) as unknown as T;\n }\n\n if (obj && typeof obj === \"object\") {\n return Object.fromEntries(\n Object.entries(obj)\n .filter(([_, v]) => v !== undefined)\n .map(([k, v]) => [k, stripUndefinedDeep(v)]),\n ) as T;\n }\n\n return obj;\n}\n","import invariant from \"invariant\";\n\nimport type { Engine, WithWorkspace } from \"@/engine\";\nimport type { Logger } from \"@/logger\";\nimport { createDeviceIndexResolver, fetchAll } from \"@/utils\";\n\nimport type { ManifestPledgeAdjustment } from \"./types\";\nimport { createAndApproveRequest } from \"./utils\";\n\ntype Options = {\n engine: Engine<WithWorkspace>;\n pledgeAdjustment: ManifestPledgeAdjustment;\n};\n\nconst flattenApprovers = (groups: { quorum: number; userIds: string[] }[]): string[] => {\n return groups.reduce<string[]>((acc, cur) => {\n acc.push(...cur.userIds.slice(0, cur.quorum));\n return acc;\n }, []);\n};\n\nexport async function bakePledgeAdjustment(options: Options, logger: Logger): Promise<void> {\n const { pledgeAdjustment, engine } = options;\n\n const getDeviceIndex = createDeviceIndexResolver(engine);\n\n logger.info(\"Logging in with admin...\");\n const admin = await engine.withDeviceIndex(4).login();\n\n logger.info(\"Fetching account, tradelink blueprint and network...\");\n const [matchingAccounts, blueprint, network] = await Promise.all([\n fetchAll(admin.client.accounts.list.query, { search: pledgeAdjustment.account }),\n admin.client.tradelink.getNetworkBlueprint.query(),\n admin.client.tradelink.getNetwork.query(),\n ]);\n\n const account = matchingAccounts.find((account) => account.name === pledgeAdjustment.account);\n invariant(account, `Account ${pledgeAdjustment.account} not found`);\n\n invariant(blueprint, \"Tradelink blueprint is not created yet\");\n invariant(network, \"Tradelink network is not created yet\");\n\n const exchange = network.exchanges.find((exchange) => {\n const blueprintExchange = blueprint.exchanges.find(\n (blueprintExchange) => blueprintExchange.tradelinkId === exchange.tradelinkId,\n );\n invariant(blueprintExchange, `Exchange ${exchange.tradelinkId} not found in blueprint`);\n return blueprintExchange.name === pledgeAdjustment.exchange;\n });\n invariant(exchange, `Exchange ${pledgeAdjustment.exchange} not found in network`);\n\n const governance = account.governance;\n invariant(governance.type === \"TRADELINK\", \"Account governance is not TRADELINK\");\n const assetManager = network.assetManagers.find((am) => am.id === governance.assetManagerId);\n invariant(assetManager, `Asset manager ${governance.assetManagerId} not found in network`);\n\n const exchangeIsConfiguredForAccount = !!governance.exchangeConfigs.find(\n (e) => e.exchangeId === exchange.id,\n );\n invariant(\n exchangeIsConfiguredForAccount,\n `Exchange ${exchange.id} is not configured for account ${account.id}`,\n );\n\n const approverIds = [\n ...flattenApprovers(assetManager.groups),\n ...flattenApprovers(exchange.groups),\n ];\n\n const approvers = await Promise.all(\n approverIds.map((id) =>\n admin.client.users.findById\n .query({ id })\n .then((user) => getDeviceIndex(user.deviceUserId!))\n .then((index) => engine.withDeviceIndex(index).login()),\n ),\n );\n\n await createAndApproveRequest(\n {\n type: \"TRADELINK_ADJUST_PLEDGE\",\n data: {\n accountId: account.id,\n exchangeId: exchange.id,\n amount: pledgeAdjustment.amount,\n },\n },\n approvers,\n logger,\n );\n\n logger.info(\n `Successfully adjusted pledge for account ${pledgeAdjustment.account} on exchange ${pledgeAdjustment.exchange}`,\n );\n}\n","import type { Logger } from \"@/logger\";\n\nimport type { BakeOptions, ManifestTradelinkNetworkBlueprint, ManifestTradelinkOrg } from \"./types\";\nimport { createBakeLogHelpers } from \"./utils\";\n\ntype Options = Omit<BakeOptions, \"manifest\" | \"rootAuthToken\"> & {\n tradelink: ManifestTradelinkOrg;\n rootAuthToken: string;\n networkBlueprint?: { workspaceName: string; blueprint: ManifestTradelinkNetworkBlueprint };\n};\n\nexport async function bakeTradelinkOrganization(options: Options, logger: Logger): Promise<void> {\n const { tradelink, engine, rootAuthToken, networkBlueprint } = options;\n\n const { logStep } = createBakeLogHelpers(logger);\n\n const rootClient = engine.createClient({ rootAuthToken });\n /* v8 ignore else - TODO bake empty tradelink org -- @preserve */\n if (tradelink.exchanges) {\n logStep(\"Creating Tradelink organization exchanges...\");\n const existingOrgExchanges = await rootClient.tradelink.root.listOrgExchanges.query();\n for (const orgExchange of tradelink.exchanges) {\n const existingOrgExchange = existingOrgExchanges.find((e) => e.name === orgExchange.name);\n if (existingOrgExchange) {\n logger.info(\n `[SKIPPED] Organization exchange ${existingOrgExchange.name} (${existingOrgExchange.code}) already exists`,\n );\n } else {\n await rootClient.tradelink.root.createOrgExchange.mutate({\n code: orgExchange.code,\n name: orgExchange.name,\n logoUrl: orgExchange.logo,\n });\n logger.info(`Created organization exchange ${orgExchange.name} (${orgExchange.code})`);\n }\n }\n }\n\n /* v8 ignore else -- @preserve */\n if (tradelink.assetManagers) {\n logStep(\"Creating Tradelink organization asset managers...\");\n const existingAssetManagers = await rootClient.tradelink.root.listOrgAssetManagers.query();\n for (const orgAssetManager of tradelink.assetManagers) {\n const existingOrgAssetManager = existingAssetManagers.find(\n (e) => e.name === orgAssetManager.name,\n );\n if (existingOrgAssetManager) {\n logger.info(\n `[SKIPPED] Organization asset manager ${existingOrgAssetManager.name} (${existingOrgAssetManager.code}) already exists`,\n );\n } else {\n await rootClient.tradelink.root.createOrgAssetManager.mutate({\n code: orgAssetManager.code,\n name: orgAssetManager.name,\n logoUrl: orgAssetManager.logo,\n });\n logger.info(\n `Created organization asset manager ${orgAssetManager.name} (${orgAssetManager.code})`,\n );\n }\n }\n }\n\n /* v8 ignore else -- @preserve */\n if (tradelink.custodians) {\n logStep(\"Creating Tradelink organization custodians...\");\n const existingCustodians = await rootClient.tradelink.root.listOrgCustodians.query();\n for (const orgCustodian of tradelink.custodians) {\n const existingOrgCustodian = existingCustodians.find((e) => e.name === orgCustodian.name);\n if (existingOrgCustodian) {\n logger.info(\n `[SKIPPED] Organization custodian ${existingOrgCustodian.name} (${existingOrgCustodian.code}) already exists`,\n );\n } else {\n await rootClient.tradelink.root.createOrgCustodian.mutate({\n code: orgCustodian.code,\n name: orgCustodian.name,\n logoUrl: orgCustodian.logo,\n });\n logger.info(`Created organization custodian ${orgCustodian.name} (${orgCustodian.code})`);\n }\n }\n }\n\n /* v8 ignore else -- @preserve */\n if (networkBlueprint) {\n logStep(\"Creating Tradelink network blueprint...\");\n const { workspaceName, blueprint } = networkBlueprint;\n const existingBlueprints = await rootClient.tradelink.root.listNetworkBlueprints.query();\n const existingBlueprint = existingBlueprints.find((e) => e.workspaceName === workspaceName);\n if (existingBlueprint) {\n logger.info(`[SKIPPED] Network blueprint for ${workspaceName} workspace already exists`);\n } else {\n await rootClient.tradelink.root.createNetworkBlueprint.mutate({\n workspaceName,\n custodian: { name: blueprint.custodian },\n exchanges: blueprint.exchanges.map((_) => ({ name: _ })),\n assetManagers: blueprint.assetManagers.map((_) => ({ name: _ })),\n });\n logger.info(`Created network blueprint for ${networkBlueprint.workspaceName} workspace`);\n }\n }\n}\n","import type {\n ReviewStepWithUsers,\n TradelinkNetworkBlueprintResponse,\n UserResponse,\n VaultRequestResponse,\n} from \"@ledgerhq/revault-api\";\nimport invariant from \"invariant\";\nimport _ from \"lodash\";\nimport { match } from \"ts-pattern\";\n\nimport { genKeys } from \"@/crypto\";\nimport type { Logger } from \"@/logger\";\nimport { createDeviceIndexResolver, fetchAll } from \"@/utils\";\n\nimport type {\n BakeOptions,\n ManifestAccount,\n ManifestApiUser,\n ManifestEntity,\n ManifestGovernanceRule,\n ManifestGroup,\n ManifestPolicy,\n ManifestRawSigningGovernanceRule,\n ManifestTradelinkEntity,\n ManifestTradelinkGroup,\n ManifestTradelinkNetwork,\n ManifestWhitelist,\n ManifestWorkspace,\n ManifestWorkspaceRule,\n} from \"./types\";\nimport {\n approveRequest,\n type CreateRequestInput,\n createAndApproveRequest,\n createBakeLogHelpers,\n type inferRequestInputData,\n stripUndefinedDeep,\n waitForRequestInflightDone,\n} from \"./utils\";\n\ntype GovRuleData = inferRequestInputData<\"CREATE_POLICY\">[\"govRules\"][number];\n\ntype Options = Omit<BakeOptions, \"manifest\" | \"workspaceName\"> & {\n workspace: ManifestWorkspace;\n workspaceName: string;\n};\n\nexport async function bakeWorkspace(options: Options, logger: Logger): Promise<void> {\n const { workspace, engine, workspaceName } = options;\n\n const workspaceEngine = engine.withWorkspace(workspaceName);\n const { logTitle, logStep, logSubStep } = createBakeLogHelpers(logger);\n\n // utility to retrieve device index based on device user id\n const findDeviceIndex = createDeviceIndexResolver(workspaceEngine);\n\n // Log-in once with the two admins (index 4 & 5 by convention) that will create all\n // the requests for the manifest objects.\n logger.info(\"Authenticating with two admins...\");\n const [admin1, admin2] = await Promise.all([\n workspaceEngine.withDeviceIndex(4).login(),\n workspaceEngine.withDeviceIndex(5).login(),\n ]);\n\n // Retrieve all existing data, so we are then able to skip creating stuff when not needed.\n logger.info(\"Fetching existing data...\");\n const [\n existingUsers,\n existingGroups,\n existingWhitelists,\n existingPolicies,\n existingAccounts,\n existingEntities,\n tradelinkNetworkBlueprint,\n ] = await Promise.all([\n fetchAll(admin1.client.users.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin1.client.groups.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin1.client.whitelists.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin1.client.policies.list.query, { isPrivate: false }),\n fetchAll(admin1.client.accounts.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin1.client.entities.list.query, { status: \"ACTIVE\" }),\n admin1.client.tradelink.getNetworkBlueprint.query(),\n ]);\n\n const tradelinkOrgExchangesByName = _.keyBy(tradelinkNetworkBlueprint?.exchanges, \"name\");\n const tradelinkOrgAssetManagersByName = _.keyBy(tradelinkNetworkBlueprint?.assetManagers, \"name\");\n\n let existingTradelinkNetwork = await admin1.client.tradelink.getNetwork.query();\n\n // Merge admins & operators (we can't fetch all users in a row because we don't want API users,\n // and we don't have a way to retrieve both admins & operators in a single fetch)\n const existingPsdUsers = existingUsers.filter((user) => user.deviceType === \"PSD\");\n const existingApiUsers = existingUsers.filter((user) => user.deviceType === \"API\");\n // Retrieve all device indexes for the existing users\n const usersWithDeviceIndex = await resolveDevicesIndexes(existingPsdUsers);\n\n // ---------------------------------\n // USERS\n // ---------------------------------\n if (workspace.users) {\n logTitle(\"Users\");\n if (workspace.users.admins) {\n for (const deviceIndex of workspace.users.admins) {\n await createUser(\"ADMIN\", deviceIndex);\n }\n }\n\n /* v8 ignore else -- @preserve */\n if (workspace.users.operators) {\n for (const deviceIndex of workspace.users.operators) {\n await createUser(\"OPERATOR\", deviceIndex);\n }\n }\n if (workspace.users.api) {\n for (const apiUser of workspace.users.api) {\n await createApiUser(apiUser);\n }\n }\n }\n\n // ---------------------------------\n // WORKSPACE RULES\n // ---------------------------------\n // Must come after users are created (rules reference users by ID)\n if (workspace.workspaceRules) {\n logTitle(\"Workspace Rules\");\n for (const workspaceRule of workspace.workspaceRules) {\n await createWorkspaceRule(workspaceRule);\n }\n }\n\n // ---------------------------------\n // GROUPS\n // ---------------------------------\n if (workspace.groups) {\n logTitle(\"Groups\");\n for (const group of workspace.groups) {\n await createGroup(group);\n }\n }\n\n // ---------------------------------\n // WHITELISTS\n // ---------------------------------\n if (workspace.whitelists) {\n logTitle(\"Whitelists\");\n await createWhitelists(workspace.whitelists);\n }\n\n // POLICIES\n // ---------------------------------\n if (workspace.policies) {\n logTitle(\"Policies\");\n for (const policy of workspace.policies) {\n await createPolicy(policy);\n }\n }\n\n // ---------------------------------\n // TRADELINK NETWORK\n // ---------------------------------\n if (workspace.tradelink) {\n logTitle(\"Tradelink\");\n await createTradelink(workspace.tradelink);\n }\n\n // ---------------------------------\n // ACCOUNTS\n // ---------------------------------\n if (workspace.accounts) {\n logTitle(\"Accounts\");\n for (const account of workspace.accounts) {\n await createAccount(account, workspace);\n }\n }\n\n // ---------------------------------\n // ENTITIES (depends on accounts and users so must be run after)\n // ---------------------------------\n if (workspace.entities) {\n logTitle(\"Entities\");\n for (const entity of workspace.entities) {\n await createEntity(entity);\n }\n }\n\n // If the Domain Object already exists, we check if the provided data has changed against the last VaultRequest targeting this Domain Object\n // If the data has changed, we create a new VaultRequest to edit the Domain Object.\n async function editDomainObjectIfNeeded(params: {\n entityType: \"Account\" | \"Entity\" | \"Group\" | \"Policy\" | \"Whitelist\";\n entityName: string;\n existingId: string;\n editInput: CreateRequestInput;\n editData: Record<string, unknown>;\n requestTypes: [VaultRequestResponse[\"type\"], VaultRequestResponse[\"type\"]];\n // biome-ignore lint/suspicious/noExplicitAny: VaultRequestResponse[\"data\"] is a wide union, callers know the shape after invariant check\n extractLastData: (data: any) => Record<string, unknown>;\n }): Promise<\"skipped\" | \"edited\"> {\n const previousRequests = await admin1.client.requests.list.query({\n type: params.requestTypes,\n targetId: params.existingId,\n state: \"EXECUTED\",\n sortBy: \"createdAt\",\n sortOrder: \"desc\",\n pageSize: 1,\n });\n\n if (previousRequests?.results && previousRequests.results.length > 0) {\n const stateRequest = previousRequests.results[0];\n invariant(\n stateRequest && params.requestTypes.includes(stateRequest.type),\n `State request should be a ${params.requestTypes[0]} or ${params.requestTypes[1]} request`,\n );\n\n const lastData = params.extractLastData(stateRequest.data);\n\n // No Edit needed if last data request is unchanged\n if (_.isEqual(stripUndefinedDeep(params.editData), stripUndefinedDeep(lastData))) {\n logger.info(`[SKIPPED] ${params.entityType} \"${params.entityName}\" has not changed`);\n return \"skipped\";\n }\n }\n\n logStep(`Editing ${params.entityType.toLowerCase()} \"${params.entityName}\"...`);\n await createAndApproveRequest(params.editInput, [admin1, admin2], logger);\n logger.info(`[EDITED] ${params.entityType} \"${params.entityName}\" has been edited`);\n return \"edited\";\n }\n\n async function createWhitelists(whitelists: ManifestWhitelist[]): Promise<void> {\n for (const whitelist of whitelists) {\n await createWhitelist(whitelist);\n }\n\n async function createWhitelist(whitelist: ManifestWhitelist): Promise<void> {\n const existing = existingWhitelists.find((w) => w.name === whitelist.name);\n\n const normalizeAddresses = (addresses: ManifestWhitelist[\"addresses\"]) =>\n addresses.map(({ destinationTag, ...rest }) => ({\n ...rest,\n ...(destinationTag ? { destinationTag } : {}),\n }));\n\n const whitelistEditData = {\n name: whitelist.name,\n addresses: normalizeAddresses(whitelist.addresses),\n };\n\n if (existing) {\n await editDomainObjectIfNeeded({\n entityType: \"Whitelist\",\n entityName: whitelist.name,\n existingId: existing.id,\n editInput: {\n type: \"EDIT_WHITELIST\",\n targetId: existing.id,\n data: { name: whitelist.name, addresses: whitelist.addresses },\n },\n editData: whitelistEditData,\n requestTypes: [\"CREATE_WHITELIST\", \"EDIT_WHITELIST\"],\n extractLastData: (data) => ({\n name: data.name,\n addresses: normalizeAddresses(data.addresses),\n }),\n });\n return;\n }\n\n const input: CreateRequestInput = {\n type: \"CREATE_WHITELIST\",\n data: { ...whitelist, description: whitelist.description ?? null },\n };\n\n const req = await createAndApproveRequest(input, [admin1, admin2], logger);\n logSubStep(`Whitelist \"${whitelist.name}\" has been created`);\n\n const createdWhitelist = await admin1.client.whitelists.findById.query({ id: req.targetId! });\n existingWhitelists.push(createdWhitelist);\n }\n }\n\n function govRuleFromManifest(rule: ManifestGovernanceRule): GovRuleData {\n return {\n operationType: rule.type,\n reviewSteps: rule.steps.map((step) => {\n if (\"group\" in step) {\n return {\n quorum: step.quorum,\n groupId: groupIdFromName(step.group),\n };\n }\n return {\n quorum: step.quorum,\n userIds: step.members.map(userIdFromDeviceIndexOrName),\n };\n }),\n ...(rule.threshold !== undefined ? { threshold: rule.threshold } : {}),\n ...(rule.whitelistNames !== undefined\n ? { whitelistIds: rule.whitelistNames.map(whitelistIdFromName) }\n : {}),\n };\n }\n\n function rawSigningRuleFromManifest(rule: ManifestRawSigningGovernanceRule) {\n return {\n operationType: rule.type as \"SIGN_DIGESTS\",\n // RAW_SIGNING only supports steps with userIds (no groups)\n reviewSteps: rule.steps.map((step) => ({\n quorum: step.quorum,\n userIds: step.members.map(userIdFromDeviceIndexOrName),\n })),\n };\n }\n\n async function createAccount(\n account: ManifestAccount,\n workspace: ManifestWorkspace,\n ): Promise<void> {\n const existing = existingAccounts.find(\n (a) =>\n a.currency === account.currency &&\n a.index === account.index &&\n (a.contractAddress ?? null) === (account.contractAddress ?? null),\n );\n\n const governance = match(account.governance)\n .with({ type: \"TRADELINK\" }, (gov) => ({\n type: \"TRADELINK\" as const,\n assetManagerId: assetManagerIdFromName(gov.assetManager),\n exchangeConfigs: gov.exchanges.map((exchangeConfig) => ({\n exchangeId: exchangeIdFromName(exchangeConfig.name),\n repledgeAuthorized: exchangeConfig.repledgeAuthorized === true,\n needsAssetManagerApprovalForSettlements:\n exchangeConfig.needsAssetManagerApprovalForSettlements === true,\n })),\n }))\n .with({ type: \"RAW_SIGNING\" }, (gov) => ({\n type: \"RAW_SIGNING\" as const,\n policy: { rules: gov.rules.map(rawSigningRuleFromManifest) },\n }))\n .with({ type: \"CLASSIC\" }, (gov) => ({\n type: \"CLASSIC\" as const,\n policy: { rules: gov.rules.map(govRuleFromManifest) },\n }))\n .with({ type: \"POLICY\" }, (gov) => ({\n type: \"CLASSIC\" as const,\n policy: { policyId: policyIdFromName(gov.policy) },\n }))\n .exhaustive();\n\n const accountData = {\n name: account.name,\n currency: account.currency,\n contractAddress: account.contractAddress ?? null,\n tokenIdentifier: account.tokenIdentifier ?? null,\n // bitcoinAddressDerivationMode is optional on the API: only send it when set\n ...(account.bitcoinAddressDerivationMode\n ? { bitcoinAddressDerivationMode: account.bitcoinAddressDerivationMode }\n : {}),\n index: account.index,\n governance,\n };\n\n if (existing) {\n const editData = { name: accountData.name, governance };\n const result = await editDomainObjectIfNeeded({\n entityType: \"Account\",\n entityName: account.name,\n existingId: existing.id,\n editInput: { type: \"EDIT_ACCOUNT\", targetId: existing.id, data: editData },\n editData,\n requestTypes: [\"CREATE_ACCOUNT\", \"EDIT_ACCOUNT\"],\n extractLastData: (data) => ({ name: data.name, governance: data.governance }),\n });\n if (result === \"skipped\") {\n await activateHederaAccount(account, workspace, existing.id);\n }\n return;\n }\n\n logStep(`Creating account \"${account.name}\"`);\n const createInput: Extract<CreateRequestInput, { type: \"CREATE_ACCOUNT\" }> = {\n type: \"CREATE_ACCOUNT\",\n data: accountData,\n };\n const req = await createAndApproveRequest(createInput, [admin1, admin2], logger);\n\n const createdAccount = await admin1.client.accounts.findById.query({ id: req.targetId! });\n existingAccounts.push(createdAccount);\n\n if (account.governance.type === \"TRADELINK\") {\n logStep(`Activating tradelink account \"${account.name}\"`);\n // we need to activate the account with the asset manager\n const assetManagerId = assetManagerIdFromName(account.governance.assetManager);\n const assetManager = existingTradelinkNetwork?.assetManagers.find(\n (assetManager) => assetManager.id === assetManagerId,\n );\n invariant(assetManager, `Asset manager for account exists`);\n const loggedAssetManagerOperators = await Promise.all(\n assetManager.groups.flatMap(({ quorum, userIds }) =>\n userIds.slice(0, quorum).map((userId) => {\n const deviceIndex = usersWithDeviceIndex.find((o) => o.user.id === userId)?.deviceIndex;\n return workspaceEngine.withDeviceIndex(deviceIndex!).login();\n }),\n ),\n );\n await createAndApproveRequest(\n { type: \"TRADELINK_ACTIVATE_ACCOUNT\", targetId: req.targetId!, data: null },\n loggedAssetManagerOperators,\n logger,\n );\n }\n\n if (req.targetId) {\n await activateHederaAccount(account, workspace, req.targetId);\n }\n\n logSubStep(`Account ${account.name} has been created`);\n }\n\n async function activateHederaAccount(\n account: ManifestAccount,\n workspace: ManifestWorkspace,\n accountId: string,\n ): Promise<void> {\n // Activate Hedera native account right after creation (before token accounts are created)\n // This ensures token accounts can be created within one Bake process\n if (\n account.currency === \"hedera\" &&\n account.contractAddress === undefined &&\n workspace.hederaData &&\n accountId\n ) {\n const salt = engine.__options.salt;\n const hederaAccountsForSalt = workspace.hederaData[salt];\n const hederaAccountData = hederaAccountsForSalt?.find(\n (h) => h.index === account.index && h.activate,\n );\n if (hederaAccountData) {\n try {\n await admin1.client.accounts.hedera.activateAccount.mutate({\n id: accountId,\n onchainId: hederaAccountData.onChainId,\n });\n logSubStep(`Hedera account \"${account.name}\" has been activated`);\n } catch (error) {\n logger.warning(`Activation for \"${account.name}\" failed: ${error}`);\n }\n }\n }\n }\n\n async function createUser(role: \"ADMIN\" | \"OPERATOR\", deviceIndex: number): Promise<void> {\n const userEngine = workspaceEngine.withDeviceIndex(deviceIndex);\n const deviceId = await userEngine.device.getDeviceUserId();\n\n // eventually check if we can skip user creation\n const existing = existingUsers.find((user) => user.deviceUserId === deviceId);\n if (existing) {\n logger.info(`[SKIPPED] User with device index ${deviceIndex} already exists`);\n return;\n }\n\n const name = `${role === \"ADMIN\" ? \"Admin\" : \"Operator\"} ${deviceIndex}`;\n logStep(`Creating ${name}`);\n\n logSubStep(\"Creating invitation...\");\n let registration = await admin1.client.userRegistrations.invite.mutate({\n name,\n role,\n deviceUserId: deviceId,\n psdModel: \"STAX\",\n });\n\n logSubStep(\"Completing registration...\");\n registration = await userEngine.register(registration);\n\n logSubStep(\"Creating request...\");\n let req = await admin1.client.requests.create.mutate({\n request: {\n type: \"CREATE_PSD_USER\",\n data: { registrationId: registration.id },\n },\n });\n req = await waitForRequestInflightDone(admin1.client, req, logger);\n\n req = await approveRequest(req, [admin1, admin2], logger);\n logSubStep(`${name} has been created`);\n\n const createdUser = await admin1.client.users.findById.query({ id: req.targetId! });\n\n // patch the current state with the newly created user\n existingUsers.push(createdUser);\n usersWithDeviceIndex.push({ user: createdUser, deviceIndex });\n }\n\n async function createApiUser(apiUser: ManifestApiUser): Promise<void> {\n const pubKey = apiUser.pubKey ?? genKeys(apiUser.name).hexPubKey;\n const existing = existingApiUsers.find(\n (user) => user.pubKey === pubKey || user.name === apiUser.name,\n );\n if (existing) {\n logger.info(\n `[SKIPPED] API user already exists with name \"${apiUser.name}\" or public key \"${pubKey}\"`,\n );\n return;\n }\n\n logStep(`Creating API user \"${apiUser.name}\"...`);\n\n logSubStep(\"Creating request...\");\n let req = await admin1.client.requests.create.mutate({\n request: {\n type: \"CREATE_API_USER\",\n data: {\n name: apiUser.name,\n role: apiUser.role,\n pubKey: pubKey,\n viewAll: apiUser.viewAll,\n },\n },\n });\n req = await waitForRequestInflightDone(admin1.client, req, logger);\n req = await approveRequest(req, [admin1, admin2], logger);\n logSubStep(`API user \"${apiUser.name}\" has been created`);\n\n logSubStep(\"Generating credentials...\");\n const credentials = await admin1.client.users.resetApiUserCredentials.mutate({\n id: req.targetId!,\n });\n logSubStep(\n `API user \"${apiUser.name}\" credentials have been generated: apiKeyId=${credentials.apiKeyId}, apiKeySecret=${credentials.apiKeySecret}`,\n );\n const createdUser = await admin1.client.users.findById.query({ id: req.targetId! });\n // patch the current state with the newly created user\n existingApiUsers.push(createdUser);\n }\n\n async function createGroup(group: ManifestGroup): Promise<void> {\n const existing = existingGroups.find((g) => g.name === group.name);\n const members = group.members.map(userIdFromDeviceIndexOrName);\n\n const groupData = {\n name: group.name,\n description: \"\",\n members,\n };\n\n if (existing) {\n await editDomainObjectIfNeeded({\n entityType: \"Group\",\n entityName: group.name,\n existingId: existing.id,\n editInput: { type: \"EDIT_GROUP\", targetId: existing.id, data: groupData },\n editData: groupData,\n requestTypes: [\"CREATE_GROUP\", \"EDIT_GROUP\"],\n extractLastData: (data) => ({ ...data, description: data.description ?? \"\" }),\n });\n return;\n }\n\n logStep(`Creating group ${group.name}...`);\n\n logSubStep(\"Creating request...\");\n let request = await admin1.client.requests.create.mutate({\n request: {\n type: \"CREATE_GROUP\",\n data: groupData,\n },\n });\n request = await waitForRequestInflightDone(admin1.client, request, logger);\n\n request = await approveRequest(request, [admin1, admin2], logger);\n logSubStep(`${group.name} has been created`);\n\n const createdGroup = await admin1.client.groups.findById.query({ id: request.targetId! });\n existingGroups.push(createdGroup);\n }\n\n async function createPolicy(policy: ManifestPolicy): Promise<void> {\n const existing = existingPolicies.find((p) => p.name === policy.name);\n\n const policyEditData = {\n name: policy.name,\n description: \"\",\n govRules: policy.rules.map(govRuleFromManifest),\n };\n\n if (existing) {\n await editDomainObjectIfNeeded({\n entityType: \"Policy\",\n entityName: policy.name,\n existingId: existing.id,\n editInput: { type: \"EDIT_POLICY\", targetId: existing.id, data: policyEditData },\n editData: policyEditData,\n requestTypes: [\"CREATE_POLICY\", \"EDIT_POLICY\"],\n extractLastData: (data) => ({\n name: data.name,\n /* v8 ignore next -- @preserve: defensive fallback for legacy request data */\n description: data.description ?? \"\",\n govRules: data.govRules,\n }),\n });\n return;\n }\n\n logStep(`Creating policy ${policy.name}...`);\n\n const policyAsset =\n policy.asset !== undefined\n ? policy.asset\n : policy.currency !== undefined && policy.currency !== null\n ? { network: policy.currency, contractAddress: null, tokenIdentifier: null }\n : null;\n\n logSubStep(\"Creating request...\");\n let request = await admin1.client.requests.create.mutate({\n request: {\n type: \"CREATE_POLICY\",\n data: {\n ...policyEditData,\n asset: policyAsset,\n },\n },\n });\n request = await waitForRequestInflightDone(admin1.client, request, logger);\n\n request = await approveRequest(request, [admin1, admin2], logger);\n logSubStep(`${policy.name} has been created`);\n\n const createdPolicy = await admin1.client.policies.findById.query({ id: request.targetId! });\n existingPolicies.push(createdPolicy);\n }\n\n async function createWorkspaceRule(workspaceRule: ManifestWorkspaceRule): Promise<void> {\n const { permission, quorum, members } = workspaceRule;\n\n // Always edit/upsert workspace rule - EDIT_WORKSPACE_RULE creates if not exists, updates if exists\n logStep(`Editing workspace rule for ${permission}...`);\n\n // Resolve user IDs from device indexes or names\n const userIds = members.map(userIdFromDeviceIndexOrName);\n\n logSubStep(\"Creating request...\");\n const input: CreateRequestInput = {\n type: \"EDIT_WORKSPACE_RULE\",\n data: {\n permission,\n reviewConfig: [{ quorum, userIds }],\n },\n };\n\n await createAndApproveRequest(input, [admin1, admin2], logger);\n logSubStep(`Workspace rule for \"${permission}\" has been edited`);\n }\n\n async function createEntity(entity: ManifestEntity): Promise<void> {\n const existing = existingEntities.find((e) => e.name === entity.name);\n\n const accountIds = (entity.accounts ?? []).map(accountIdFromName);\n const memberIds = (entity.members ?? []).map(userIdFromUserName);\n\n const entityEditData = { name: entity.name, accountIds, memberIds };\n\n if (existing) {\n await editDomainObjectIfNeeded({\n entityType: \"Entity\",\n entityName: entity.name,\n existingId: existing.id,\n editInput: { type: \"EDIT_ENTITY\", targetId: existing.id, data: entityEditData },\n editData: entityEditData,\n requestTypes: [\"CREATE_ENTITY\", \"EDIT_ENTITY\"],\n extractLastData: (data) => ({\n name: data.name,\n accountIds: data.accountIds,\n memberIds: data.memberIds,\n }),\n });\n return;\n }\n\n logStep(`Creating entity \"${entity.name}\"...`);\n\n const input: CreateRequestInput = {\n type: \"CREATE_ENTITY\",\n data: entityEditData,\n };\n\n const request = await createAndApproveRequest(input, [admin1, admin2], logger);\n logSubStep(`Entity \"${entity.name}\" has been created`);\n\n const createdEntity = await admin1.client.entities.findById.query({ id: request.targetId! });\n existingEntities.push(createdEntity);\n }\n\n async function createTradelink(tradelink: ManifestTradelinkNetwork): Promise<void> {\n /* v8 ignore else -- @preserve */\n if (tradelink.custodian) {\n if (existingTradelinkNetwork === null) {\n logStep(\"Creating custodian config...\");\n const { settlement, withdraw, arbitration } = tradelink.custodian;\n const data = {\n settlement: settlement.map(tradelinkReviewStepFromManifest),\n withdraw: withdraw.map(tradelinkReviewStepFromManifest),\n arbitration: arbitration.map(tradelinkReviewStepFromManifest),\n };\n\n logSubStep(\"Creating request...\");\n let request = await admin1.client.requests.create.mutate({\n request: {\n type: \"TRADELINK_CREATE_CUSTODIAN\",\n data,\n },\n });\n request = await waitForRequestInflightDone(admin1.client, request, logger);\n\n await approveRequest(request, [admin1, admin2], logger);\n logSubStep(\"Tradelink custodian config has been created\");\n\n existingTradelinkNetwork = await admin1.client.tradelink.getNetwork.query();\n } else {\n logger.info(\"[SKIPPED] Custodian config already exists\");\n }\n\n const networkBlueprint = await admin1.client.tradelink.getNetworkBlueprint.query();\n if (networkBlueprint !== null) {\n /* v8 ignore else -- @preserve */\n if (tradelink.exchanges !== undefined) {\n await createTradelinkExchanges(networkBlueprint, tradelink.exchanges);\n }\n\n /* v8 ignore else -- @preserve */\n if (tradelink.assetManagers !== undefined) {\n await createTradelinkAssetManagers(networkBlueprint, tradelink.assetManagers);\n }\n } else {\n logger.error(\n \"Will not create exchanges and asset managers because there is no network blueprint for current workspace\",\n );\n }\n }\n }\n\n async function createTradelinkExchanges(\n networkBlueprint: TradelinkNetworkBlueprintResponse,\n exchanges: ManifestTradelinkEntity[],\n ): Promise<void> {\n invariant(existingTradelinkNetwork !== null, \"Network should exist\");\n const blueprintExchanges = networkBlueprint.exchanges;\n for (const exchange of exchanges) {\n // find uid\n const blueprintExchange = blueprintExchanges.find(({ name }) => name === exchange.name);\n invariant(\n blueprintExchange !== undefined,\n `Exchange ${exchange.name} does not exist in network blueprint`,\n );\n const exchangeId = blueprintExchange.tradelinkId;\n logStep(`Creating exchange ${exchange.name}...`);\n if (\n existingTradelinkNetwork.exchanges.find(({ tradelinkId }) => tradelinkId === exchangeId) !==\n undefined\n ) {\n logger.info(`[SKIPPED] Exchange \"${exchange.name}\" already exists`);\n continue;\n }\n\n logSubStep(\"Creating request...\");\n let request = await admin1.client.requests.create.mutate({\n request: {\n type: \"TRADELINK_CREATE_EXCHANGE\",\n data: {\n tradelinkId: exchangeId,\n groups: exchange.groups.map(tradelinkReviewStepFromManifest),\n whitelist: exchange.whitelist,\n },\n },\n });\n request = await waitForRequestInflightDone(admin1.client, request, logger);\n\n const loggedExchangeOperators = await Promise.all(\n exchange.groups.flatMap(({ quorum, members }) =>\n members\n .slice(0, quorum)\n .map((deviceIndex) => workspaceEngine.withDeviceIndex(deviceIndex).login()),\n ),\n );\n\n await approveRequest(request, [admin1, admin2, ...loggedExchangeOperators], logger);\n\n // refresh tradelink network\n existingTradelinkNetwork = await admin1.client.tradelink.getNetwork.query();\n invariant(existingTradelinkNetwork !== null, \"Tradelink network exists\");\n }\n }\n\n async function createTradelinkAssetManagers(\n networkBlueprint: TradelinkNetworkBlueprintResponse,\n assetManagers: ManifestTradelinkEntity[],\n ): Promise<void> {\n invariant(existingTradelinkNetwork !== null, \"Network should exist\");\n const blueprintAssetManagers = networkBlueprint.assetManagers;\n for (const assetManager of assetManagers) {\n // find uid\n const blueprintAssetManager = blueprintAssetManagers.find(\n ({ name }) => name === assetManager.name,\n );\n invariant(\n blueprintAssetManager !== undefined,\n `AssetManager ${assetManager.name} does not exist in network blueprint`,\n );\n const assetManagerId = blueprintAssetManager.tradelinkId;\n logStep(`Creating assetManager ${assetManager.name}...`);\n if (\n existingTradelinkNetwork.assetManagers.find(\n ({ tradelinkId }) => tradelinkId === assetManagerId,\n ) !== undefined\n ) {\n logger.info(`[SKIPPED] Asset manager \"${assetManager.name}\" already exists`);\n continue;\n }\n\n logSubStep(\"Creating request...\");\n let request = await admin1.client.requests.create.mutate({\n request: {\n type: \"TRADELINK_CREATE_ASSET_MANAGER\",\n data: {\n tradelinkId: assetManagerId,\n groups: assetManager.groups.map(tradelinkReviewStepFromManifest),\n whitelist: assetManager.whitelist,\n },\n },\n });\n request = await waitForRequestInflightDone(admin1.client, request, logger);\n\n const loggedAssetManagerOperators = await Promise.all(\n assetManager.groups.flatMap(({ quorum, members }) =>\n members\n .slice(0, quorum)\n .map((deviceIndex) => workspaceEngine.withDeviceIndex(deviceIndex).login()),\n ),\n );\n\n await approveRequest(request, [admin1, admin2, ...loggedAssetManagerOperators], logger);\n\n // refresh tradelink network\n existingTradelinkNetwork = await admin1.client.tradelink.getNetwork.query();\n invariant(existingTradelinkNetwork !== null, \"Tradelink network exists\");\n }\n }\n\n // For each given user, retrieve (by brute force) their device index, by comparing their\n // device user id with the one computed for each tested index.\n // Using .reduce() here to leverage caching existing discoveries\n async function resolveDevicesIndexes(\n users: UserResponse[],\n ): Promise<{ user: UserResponse; deviceIndex: number }[]> {\n const usersWithDeviceIndex = await users.reduce<\n Promise<{ user: UserResponse; deviceIndex: number }[]>\n >(\n (acc, cur) =>\n acc.then(async (acc) => {\n acc.push(await withDeviceIndex(cur));\n return acc;\n }),\n Promise.resolve([]),\n );\n return usersWithDeviceIndex;\n }\n\n async function withDeviceIndex(\n user: UserResponse,\n ): Promise<{ user: UserResponse; deviceIndex: number }> {\n invariant(user.deviceUserId, `User ${user.id} does not have any device user id`);\n const deviceIndex = await findDeviceIndex(user.deviceUserId);\n return { user, deviceIndex };\n }\n\n function userIdFromDeviceIndex(deviceIndex: number): string {\n const corresponding = usersWithDeviceIndex.find((o) => o.deviceIndex === deviceIndex);\n invariant(corresponding, `No user with device index ${deviceIndex}`);\n return corresponding.user.id;\n }\n\n function userIdFromUserName(name: string): string {\n const user = existingApiUsers.find((u) => u.name === name);\n invariant(user, `User ${name} not found`);\n return user.id;\n }\n\n function userIdFromDeviceIndexOrName(identifier: number | string): string {\n if (typeof identifier === \"number\") {\n return userIdFromDeviceIndex(identifier);\n }\n return userIdFromUserName(identifier);\n }\n\n function groupIdFromName(groupName: string): string {\n const group = existingGroups.find((g) => g.name === groupName);\n invariant(group, `Group ${groupName} not found`);\n return group.id;\n }\n\n function policyIdFromName(policyName: string): string {\n const policy = existingPolicies.find((g) => g.name === policyName);\n invariant(policy, `Policy ${policyName} not found`);\n return policy.id;\n }\n\n function whitelistIdFromName(whitelistName: string): string {\n const whitelist = existingWhitelists.find((w) => w.name === whitelistName);\n invariant(whitelist, `Whitelist ${whitelistName} not found`);\n return whitelist.id;\n }\n\n function accountIdFromName(accountName: string): string {\n const account = existingAccounts.find((a) => a.name === accountName);\n invariant(account, `Account \"${accountName}\" not found`);\n return account.id;\n }\n\n function assetManagerIdFromName(assetManagerName: string): string {\n const orgAssetManager = tradelinkOrgAssetManagersByName[assetManagerName];\n invariant(\n orgAssetManager,\n `Can't find Tradelink organization asset manager ${assetManagerName}`,\n );\n const assetManager = existingTradelinkNetwork?.assetManagers.find(\n (assetManager) => assetManager.tradelinkId === orgAssetManager.tradelinkId,\n );\n invariant(assetManager, `Can't find Tradelink assetManager ${assetManagerName}`);\n return assetManager.id;\n }\n\n function exchangeIdFromName(exchangeName: string): string {\n const exchange = existingTradelinkNetwork?.exchanges.find((exchange) => {\n const orgExchange = tradelinkOrgExchangesByName[exchangeName];\n invariant(orgExchange, `Can't find Tradelink organization exchange ${exchange.tradelinkId}`);\n return orgExchange.name === exchangeName;\n });\n invariant(exchange, `Can't find Tradelink exchange ${exchangeName}`);\n return exchange.id;\n }\n\n function tradelinkReviewStepFromManifest({\n members,\n quorum,\n }: ManifestTradelinkGroup): ReviewStepWithUsers {\n return {\n userIds: members.map(userIdFromDeviceIndex),\n quorum,\n };\n }\n}\n","import invariant from \"invariant\";\nimport { match } from \"ts-pattern\";\n\nimport type { Logger } from \"@/logger\";\nimport { createDeviceIndexResolver, fetchAll } from \"@/utils\";\n\nimport type { RecipeOptions } from \"./recipe\";\nimport type {\n ManifestAccount,\n ManifestApiUser,\n ManifestEntity,\n ManifestGovernanceRule,\n ManifestGroup,\n ManifestPolicy,\n ManifestWhitelist,\n ManifestWorkspace,\n ManifestWorkspaceRule,\n} from \"./types\";\n\nexport async function recipeWorkspace(\n options: RecipeOptions,\n logger: Logger,\n): Promise<ManifestWorkspace> {\n const { engine, workspaceName } = options;\n\n const workspaceEngine = engine.withWorkspace(workspaceName);\n\n // Utility to retrieve device index based on device user id\n const findDeviceIndex = createDeviceIndexResolver(workspaceEngine);\n\n // Log-in with admin (index 4 by convention)\n logger.info(\"Authenticating with admin...\");\n const admin = await workspaceEngine.withDeviceIndex(4).login();\n\n // Fetch all existing data in parallel\n logger.info(\"Fetching existing data...\");\n const [\n existingUsers,\n existingGroups,\n existingWhitelists,\n publicPolicies,\n privatePolicies,\n existingAccounts,\n existingEntities,\n existingWorkspaceRules,\n ] = await Promise.all([\n fetchAll(admin.client.users.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin.client.groups.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin.client.whitelists.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin.client.policies.list.query, { isPrivate: false }),\n fetchAll(admin.client.policies.list.query, { isPrivate: true }),\n fetchAll(admin.client.accounts.list.query, { status: \"ACTIVE\" }),\n fetchAll(admin.client.entities.list.query, { status: \"ACTIVE\" }),\n admin.client.governance.listWorkspaceRules.query(),\n ]);\n\n const existingPolicies = [...publicPolicies, ...privatePolicies];\n\n const existingPsdUsers = existingUsers.filter((user) => user.deviceType === \"PSD\");\n const existingApiUsers = existingUsers.filter((user) => user.deviceType === \"API\");\n\n // Resolve device indexes for PSD users\n logger.info(\"Resolving device indexes...\");\n const psdUsersWithIndex = await resolveDevicesIndexes(existingPsdUsers);\n\n // ---------------------------------\n // USERS\n // ---------------------------------\n logger.info(\"Reading users...\");\n const adminIndexes = psdUsersWithIndex\n .filter((u) => u.user.role === \"ADMIN\")\n .map((u) => u.deviceIndex);\n\n const operatorIndexes = psdUsersWithIndex\n .filter((u) => u.user.role === \"OPERATOR\")\n .map((u) => u.deviceIndex);\n\n const apiUsers: ManifestApiUser[] = existingApiUsers.map((user) => {\n const role = match(user.role)\n .with(\"ADMIN\", \"OPERATOR\", (role) => role)\n .with(\"READ_ONLY_API_KEY\", (role) => {\n throw new Error(`Unexpected API user role \"${role}\" for user ${user.name}`);\n })\n .exhaustive();\n return {\n name: user.name,\n role,\n pubKey: user.pubKey,\n viewAll: user.legacyViewAll,\n };\n });\n\n // ---------------------------------\n // GROUPS\n // ---------------------------------\n logger.info(\"Reading groups...\");\n const groups: ManifestGroup[] = existingGroups.map((group) => ({\n name: group.name,\n members: group.members.map((member) => resolveUserIdentifier(member.id)),\n }));\n\n // ---------------------------------\n // WHITELISTS\n // ---------------------------------\n logger.info(\"Reading whitelists...\");\n const whitelists: ManifestWhitelist[] = existingWhitelists.map((whitelist) => ({\n name: whitelist.name,\n description: whitelist.description ?? undefined,\n type: \"TRANSACTION\" as const,\n addresses: whitelist.addresses.map((addr) => ({\n name: addr.name,\n currency: addr.currency,\n address: addr.address,\n ...(addr.destinationTag ? { destinationTag: addr.destinationTag } : {}),\n })),\n }));\n\n // ---------------------------------\n // POLICIES\n // ---------------------------------\n logger.info(\"Reading policies...\");\n const policies: ManifestPolicy[] = publicPolicies.map((policy) => ({\n name: policy.name,\n asset: policy.asset,\n rules: policy.rules.map(govRuleToManifest),\n }));\n\n // ---------------------------------\n // ACCOUNTS\n // ---------------------------------\n logger.info(\"Reading accounts...\");\n const accounts: ManifestAccount[] = existingAccounts.map((account) => {\n const governance = match(account.governance)\n .with({ type: \"CLASSIC\" }, (gov) => {\n const policy = existingPolicies.find((p) => p.id === gov.policyId);\n invariant(policy, `Policy ${gov.policyId} not found for account ${account.name}`);\n return policy.isPrivate\n ? {\n type: \"CLASSIC\" as const,\n rules: policy.rules.map(govRuleToManifest),\n }\n : {\n type: \"POLICY\" as const,\n policy: policy.name,\n };\n })\n .with({ type: \"RAW_SIGNING\" }, (gov) => {\n const policy = existingPolicies.find((p) => p.id === gov.policyId);\n invariant(policy, `Policy ${gov.policyId} not found for account ${account.name}`);\n return {\n type: \"RAW_SIGNING\" as const,\n rules: policy.rules.map((rule) => ({\n type: \"SIGN_DIGESTS\" as const,\n steps: rule.reviewSteps.map((step) => {\n invariant(\"userIds\" in step, \"RAW_SIGNING rules only support user steps\");\n return {\n quorum: step.quorum,\n members: step.userIds.map(resolveUserToDeviceIndexOrName),\n };\n }),\n })),\n };\n })\n .with({ type: \"TRADELINK\" }, (gov) => ({\n type: \"TRADELINK\" as const,\n assetManager: resolveAssetManagerName(gov.assetManagerId),\n exchanges: gov.exchangeConfigs.map((exchangeConfig) => ({\n name: resolveExchangeName(exchangeConfig.exchangeId),\n ...(exchangeConfig.repledgeAuthorized ? { repledgeAuthorized: true } : {}),\n ...(exchangeConfig.needsAssetManagerApprovalForSettlements\n ? { needsAssetManagerApprovalForSettlements: true }\n : {}),\n })),\n }))\n .exhaustive();\n\n return {\n name: account.name,\n currency: account.currency,\n index: account.index,\n ...(account.contractAddress ? { contractAddress: account.contractAddress } : {}),\n ...(account.tokenIdentifier ? { tokenIdentifier: account.tokenIdentifier } : {}),\n // NEW is the default; only surface the field when it differs to keep manifests clean\n ...(account.asset?.type === \"BITCOIN_LIKE\" && account.asset.addressDerivationMode === \"STATIC\"\n ? { bitcoinAddressDerivationMode: \"STATIC\" as const }\n : {}),\n governance,\n };\n });\n\n // ---------------------------------\n // ENTITIES\n // ---------------------------------\n logger.info(\"Reading entities...\");\n const entities: ManifestEntity[] = existingEntities.map((entity) => ({\n name: entity.name,\n ...(entity.accountIds.length > 0 ? { accounts: entity.accountIds.map(accountNameFromId) } : {}),\n ...(entity.memberIds.length > 0 ? { members: entity.memberIds.map(userNameFromId) } : {}),\n }));\n\n // ---------------------------------\n // WORKSPACE RULES\n // ---------------------------------\n logger.info(\"Reading workspace rules...\");\n const workspaceRules: ManifestWorkspaceRule[] = existingWorkspaceRules.results\n .filter((rule) => rule.permission !== \"ROOT\")\n .map((rule) => {\n invariant(\n rule.reviewSteps.length === 1,\n \"Only one review step supported for workspace rules in manifest\",\n );\n const step = rule.reviewSteps[0]!;\n const quorum = step.quorum;\n invariant(rule.permission !== \"ROOT\", \"filtered out\");\n return {\n permission: rule.permission,\n quorum,\n members: step.userIds.map(resolveUserToDeviceIndexOrName),\n };\n });\n\n // TODO: recipe does not yet support pledges (future task)\n // TODO: recipe does not yet support hederaData\n // TODO: recipe does not yet support tradelink workspace config\n\n const workspace: ManifestWorkspace = {\n users: {\n ...(adminIndexes.length > 0 ? { admins: adminIndexes } : {}),\n ...(operatorIndexes.length > 0 ? { operators: operatorIndexes } : {}),\n ...(apiUsers.length > 0 ? { api: apiUsers } : {}),\n },\n ...(groups.length > 0 ? { groups } : {}),\n ...(whitelists.length > 0 ? { whitelists } : {}),\n ...(policies.length > 0 ? { policies } : {}),\n ...(accounts.length > 0 ? { accounts } : {}),\n ...(entities.length > 0 ? { entities } : {}),\n ...(workspaceRules.length > 0 ? { workspaceRules } : {}),\n };\n\n logger.info(\"Recipe completed\");\n return workspace;\n\n // ---- Helper functions ----\n\n async function resolveDevicesIndexes(\n users: typeof existingPsdUsers,\n ): Promise<{ user: (typeof existingPsdUsers)[number]; deviceIndex: number }[]> {\n const result: { user: (typeof existingPsdUsers)[number]; deviceIndex: number }[] = [];\n for (const user of users) {\n invariant(user.deviceUserId, `User ${user.id} does not have any device user id`);\n const deviceIndex = await findDeviceIndex(user.deviceUserId);\n result.push({ user, deviceIndex });\n }\n return result;\n }\n\n function resolveUserIdentifier(userId: string): number | string {\n const psdUser = psdUsersWithIndex.find((u) => u.user.id === userId);\n if (psdUser) return psdUser.deviceIndex;\n const apiUser = existingApiUsers.find((u) => u.id === userId);\n if (apiUser) return apiUser.name;\n throw new Error(`User ${userId} not found`);\n }\n\n function resolveUserToDeviceIndexOrName(userId: string): number | string {\n return resolveUserIdentifier(userId);\n }\n\n function validateGovernanceRuleType(value: string): ManifestGovernanceRule[\"type\"] {\n invariant(\n [\"SEND\", \"STAKE\", \"DEPLOY_CONTRACT\", \"EXECUTE_CONTRACT\", \"SIGN_MESSAGE\", \"RECEIVE\"].includes(\n value,\n ),\n `Unexpected governance rule type: ${value}`,\n );\n return value as ManifestGovernanceRule[\"type\"];\n }\n\n function govRuleToManifest(rule: {\n operationType: string;\n reviewSteps: ({ quorum: number; userIds: string[] } | { quorum: number; groupId: string })[];\n threshold?: { min: string | null; max: string | null };\n whitelistIds?: string[] | null;\n }): ManifestGovernanceRule {\n const operationType = validateGovernanceRuleType(rule.operationType);\n\n const threshold =\n rule.threshold !== undefined && (rule.threshold.min !== null || rule.threshold.max !== null)\n ? { threshold: { min: rule.threshold.min, max: rule.threshold.max } }\n : {};\n\n return {\n type: operationType,\n steps: rule.reviewSteps.map((step) => {\n if (\"groupId\" in step) {\n const group = existingGroups.find((g) => g.id === step.groupId);\n invariant(group, `Group ${step.groupId} not found`);\n return { quorum: step.quorum, group: group.name };\n }\n return {\n quorum: step.quorum,\n members: step.userIds.map(resolveUserToDeviceIndexOrName),\n };\n }),\n ...threshold,\n ...(rule.whitelistIds && rule.whitelistIds.length > 0\n ? { whitelistNames: rule.whitelistIds.map(whitelistNameFromId) }\n : {}),\n };\n }\n\n function whitelistNameFromId(whitelistId: string): string {\n const whitelist = existingWhitelists.find((w) => w.id === whitelistId);\n invariant(whitelist, `Whitelist ${whitelistId} not found`);\n return whitelist.name;\n }\n\n function accountNameFromId(accountId: string): string {\n const account = existingAccounts.find((a) => a.id === accountId);\n invariant(account, `Account ${accountId} not found`);\n return account.name;\n }\n\n function userNameFromId(userId: string): string {\n const user = existingApiUsers.find((u) => u.id === userId);\n invariant(user, `API user ${userId} not found`);\n return user.name;\n }\n\n function resolveAssetManagerName(assetManagerId: string): string {\n // We need the tradelink network to resolve names, but since we skip tradelink\n // in recipe, we return the ID as-is for now\n return assetManagerId;\n }\n\n function resolveExchangeName(exchangeId: string): string {\n // Same as above — tradelink not yet supported\n return exchangeId;\n }\n}\n","import type { Engine } from \"@/engine\";\nimport type { Logger } from \"@/logger\";\n\nimport { recipeWorkspace } from \"./recipe-workspace\";\nimport type { Manifest } from \"./types\";\n\nexport type RecipeOptions = {\n engine: Engine;\n workspaceName: string;\n};\n\nexport async function recipeManifest(options: RecipeOptions, logger: Logger): Promise<Manifest> {\n const workspace = await recipeWorkspace(options, logger);\n\n return {\n manifestVersion: 2,\n workspace,\n };\n}\n","import z from \"zod\";\n\nimport type { Engine } from \"@/engine\";\n\n// #region ---------- General types ---------------------------------------------------------------\n\nexport type BakeOptions = {\n manifest: Manifest;\n engine: Engine;\n workspaceName?: string;\n rootAuthToken?: string;\n};\n\n// #endregion\n\n// #region ---------- Users -----------------------------------------------------------------------\n\nconst zManifestUser = z.number().meta({ description: \"User device index\" });\nconst zManifestUserName = z.string().meta({ description: \"User name\" });\nconst zManifestApiUser = z.object({\n name: z.string().meta({ description: \"API user name\" }),\n role: z.enum([\"ADMIN\", \"OPERATOR\"]).meta({ description: \"API user role\" }).default(\"OPERATOR\"),\n pubKey: z\n .string()\n .meta({\n description:\n \"API user public key. If not provided, one will be generated using the name as entropy\",\n })\n .optional(),\n viewAll: z.boolean().meta({ description: \"Whether the API user can view all accounts\" }),\n});\n\nexport type ManifestApiUser = z.infer<typeof zManifestApiUser>;\n\n// #endregion\n\n// #region ---------- Groups ----------------------------------------------------------------------\n\nconst zManifestGroup = z\n .object({\n name: z.string().meta({ description: \"Group name\" }),\n members: z\n .array(z.union([zManifestUser, zManifestUserName]))\n .meta({ description: \"Group members\" }),\n })\n .strict()\n .meta({ description: \"Operators group\" });\n\nexport type ManifestGroup = z.infer<typeof zManifestGroup>;\n\n// #endregion\n\n// #region ---------- Whitelists ------------------------------------------------------------------\n\nconst zManifestWhitelistAddress = z\n .object({\n name: z.string().meta({ description: \"Whitelist address name\" }),\n currency: z.string().meta({ description: \"Whitelist address currency\" }),\n address: z.string().meta({ description: \"Whitelist address\" }),\n destinationTag: z\n .string()\n .optional()\n .meta({ description: \"Destination tag (applicable for Ripple currency)\" }),\n })\n .strict();\n\nconst zManifestWhitelist = z\n .object({\n name: z.string().meta({ description: \"Whitelist name\" }),\n description: z.string().optional().meta({ description: \"Whitelist description\" }),\n type: z\n .enum([\"TRANSACTION\", \"SMART_CONTRACT\"])\n .optional()\n .default(\"TRANSACTION\")\n .meta({ description: \"Whitelist type\" }),\n addresses: z.array(zManifestWhitelistAddress).meta({ description: \"Whitelist addresses\" }),\n })\n .strict()\n .meta({ description: \"Whitelist\" });\n\nexport type ManifestWhitelist = z.infer<typeof zManifestWhitelist>;\n\n// #endregion\n\n// #region ---------- Policies --------------------------------------------------------------------\n\nconst zManifestGovernanceStepWithUsers = z\n .object({\n quorum: z.number(),\n members: z.array(z.union([zManifestUser, zManifestUserName])),\n })\n .strict();\n\nconst zManifestGovernanceStepWithGroup = z\n .object({\n quorum: z.number(),\n group: z.string(),\n })\n .strict();\n\nconst zManifestGovernanceStep = z.union([\n zManifestGovernanceStepWithUsers,\n zManifestGovernanceStepWithGroup,\n]);\n\nconst zManifestGovernanceRule = z\n .object({\n // TODO see if there is a way to import this from `api` package\n // (the challenge there is that enums are not transpiled)\n type: z.enum([\n \"SEND\",\n \"STAKE\",\n \"DEPLOY_CONTRACT\",\n \"EXECUTE_CONTRACT\",\n \"SIGN_MESSAGE\",\n \"RECEIVE\",\n ]),\n steps: z.array(zManifestGovernanceStep).min(1),\n threshold: z\n .object({\n min: z.string().nullable(),\n max: z.string().nullable(),\n })\n .optional(),\n whitelistNames: z.array(z.string()).optional(),\n })\n .strict();\n\nexport type ManifestGovernanceRule = z.infer<typeof zManifestGovernanceRule>;\n\nconst zManifestPolicyAsset = z\n .object({\n network: z.string(),\n contractAddress: z.string().nullable(),\n tokenIdentifier: z.string().nullable(),\n })\n .strict();\n\nexport const zManifestPolicy = z\n .object({\n name: z.string(),\n /** @deprecated use asset instead */\n currency: z.string().nullable().optional(),\n asset: zManifestPolicyAsset.nullable().optional(),\n rules: z.array(zManifestGovernanceRule),\n })\n .strict();\n\nexport type ManifestPolicy = z.infer<typeof zManifestPolicy>;\n\n// #endregion\n\n// #region ---------- Accounts --------------------------------------------------------------------\n\nconst zManifestClassicAccountGovernance = z\n .object({\n type: z.literal(\"CLASSIC\"),\n rules: z.array(zManifestGovernanceRule),\n })\n .strict();\n\nconst zManifestClassicAccountGovernanceWithPolicy = z\n .object({\n type: z.literal(\"POLICY\"),\n policy: z.string(),\n })\n .strict();\n\nconst zManifestTradelinkExchangeConfig = z\n .object({\n name: z.string().meta({ description: \"Exchange name\" }),\n repledgeAuthorized: z\n .boolean()\n .optional()\n .meta({ description: \"Whether repledge is authorized\" }),\n needsAssetManagerApprovalForSettlements: z\n .boolean()\n .optional()\n .meta({ description: \"Whether asset manager pre approval is needed\" }),\n })\n .strict();\n\nconst zManifestTradelinkAccountGovernance = z\n .object({\n type: z.literal(\"TRADELINK\"),\n assetManager: z.string().meta({ description: \"Asset manager name\" }),\n exchanges: z.array(zManifestTradelinkExchangeConfig),\n })\n .strict();\n\n// RAW_SIGNING only supports steps with users (no groups)\nconst zManifestRawSigningGovernanceRule = z\n .object({\n type: z.literal(\"SIGN_DIGESTS\"),\n steps: z.array(zManifestGovernanceStepWithUsers).min(1),\n })\n .strict();\n\nexport type ManifestRawSigningGovernanceRule = z.infer<typeof zManifestRawSigningGovernanceRule>;\n\nconst zManifestRawSigningAccountGovernance = z\n .object({\n type: z.literal(\"RAW_SIGNING\"),\n rules: z.array(zManifestRawSigningGovernanceRule),\n })\n .strict();\n\nconst zManifestAccountGovernance = z.discriminatedUnion(\"type\", [\n zManifestClassicAccountGovernance,\n zManifestTradelinkAccountGovernance,\n zManifestRawSigningAccountGovernance,\n zManifestClassicAccountGovernanceWithPolicy,\n]);\n\nconst zManifestAccount = z\n .object({\n name: z.string(),\n currency: z.string(),\n index: z.number().nonnegative(),\n contractAddress: z.string().optional(),\n tokenIdentifier: z.string().optional(),\n bitcoinAddressDerivationMode: z\n .enum([\"NEW\", \"STATIC\"])\n .optional()\n .meta({\n description:\n \"Bitcoin address derivation mode. STATIC reuses the account's first receive address; \" +\n \"NEW (default) returns a fresh address each time. Only valid for bitcoin accounts.\",\n }),\n governance: zManifestAccountGovernance,\n })\n .strict();\n\nexport type ManifestAccount = z.infer<typeof zManifestAccount>;\n\n// #endregion\n\n// #region ---------- Entities --------------------------------------------------------------------\n\nconst zManifestEntity = z\n .object({\n name: z.string().min(1).max(19).meta({ description: \"Entity name\" }),\n accounts: z\n .array(z.string())\n .optional()\n .meta({ description: \"Account names to include in this entity\" }),\n members: z\n .array(z.string())\n .optional()\n .meta({ description: \"API operator names to include in this entity\" }),\n })\n .strict()\n .meta({ description: \"Entity\" });\n\nexport type ManifestEntity = z.infer<typeof zManifestEntity>;\n\n// #endregion\n\n// #region ---------- Hedera data ------------------------------------------------------------------\n\nconst zManifestHederaData = z\n .object({\n index: z.number(),\n onChainId: z.string(),\n activate: z.boolean().default(true),\n })\n .strict();\n\nexport type ManifestHederaData = z.infer<typeof zManifestHederaData>;\n\n// #endregion\n\n// #region ---------- Pledge adjustments (increment/decrement) ------------------------------------\n\nconst zManifestPledgeAdjustment = z\n .object({\n account: z.string(),\n exchange: z.string(),\n amount: z.string(),\n })\n .strict();\n\nexport type ManifestPledgeAdjustment = z.infer<typeof zManifestPledgeAdjustment>;\n\n// #endregion\n\n// #region ---------- Tradelink network -----------------------------------------------------------\n\nconst zManifestTradelinkGroup = z\n .object({\n members: z.array(zManifestUser),\n quorum: z.number(),\n })\n .strict()\n .meta({ description: \"Tradelink group\" });\n\nexport type ManifestTradelinkGroup = z.infer<typeof zManifestTradelinkGroup>;\n\nconst zManifestTradelinkGroups = z.array(zManifestTradelinkGroup);\n\nconst zManifestTradelinkWhitelistAddress = z\n .object({\n name: z.string().min(1),\n currency: z.string().min(1),\n address: z.string().min(1),\n })\n .strict()\n .meta({ description: \"Tradelink whitelist address\" });\n\nconst zManifestTradelinkWhitelist = z\n .array(zManifestTradelinkWhitelistAddress)\n .meta({ description: \"Tradelink whitelist\" });\n\nconst zManifestTradelinkEntity = z\n .object({\n name: z.string(),\n groups: zManifestTradelinkGroups,\n whitelist: zManifestTradelinkWhitelist,\n })\n .strict();\n\nexport type ManifestTradelinkEntity = z.infer<typeof zManifestTradelinkEntity>;\n\nconst zManifestTradelinkCustodian = z\n .object({\n settlement: zManifestTradelinkGroups,\n withdraw: zManifestTradelinkGroups,\n arbitration: zManifestTradelinkGroups,\n })\n .strict();\n\nconst zManifestTradelinkNetworkBlueprint = z\n .object({\n custodian: z.string(),\n exchanges: z.array(z.string()),\n assetManagers: z.array(z.string()),\n })\n .strict();\n\nexport type ManifestTradelinkNetworkBlueprint = z.infer<typeof zManifestTradelinkNetworkBlueprint>;\n\nconst zManifestTradelinkNetwork = z\n .object({\n networkBlueprint: zManifestTradelinkNetworkBlueprint.optional(),\n custodian: zManifestTradelinkCustodian.optional(),\n exchanges: z.array(zManifestTradelinkEntity).optional(),\n assetManagers: z.array(zManifestTradelinkEntity).optional(),\n })\n .strict()\n .meta({ description: \"Tradelink network configuration\" });\n\nexport type ManifestTradelinkNetwork = z.infer<typeof zManifestTradelinkNetwork>;\n\n// #endregion\n\n// #region ---------- Workspace rules -------------------------------------------------------------\n\nconst zManifestWorkspaceRule = z\n .object({\n permission: z.enum([\"CREATE_ACCOUNT_WITH_POLICY\"]),\n quorum: z.number().min(1),\n members: z.array(z.union([zManifestUser, zManifestUserName])),\n })\n .strict()\n .meta({ description: \"Workspace rule for granting permissions\" });\n\nexport type ManifestWorkspaceRule = z.infer<typeof zManifestWorkspaceRule>;\n\n// #endregion\n\n// #region ---------- Workspace -------------------------------------------------------------------\n\nconst zManifestWorkspace = z\n .object({\n tradelink: zManifestTradelinkNetwork.optional(),\n users: z\n .object({\n admins: z.array(zManifestUser).optional(),\n operators: z.array(zManifestUser).optional(),\n api: z.array(zManifestApiUser).optional(),\n })\n .optional(),\n groups: z.array(zManifestGroup).optional(),\n whitelists: z.array(zManifestWhitelist).optional(),\n policies: z.array(zManifestPolicy).optional(),\n accounts: z.array(zManifestAccount).optional(),\n entities: z.array(zManifestEntity).optional(),\n hederaData: z.record(z.string(), z.array(zManifestHederaData)).optional(),\n pledges: z.array(zManifestPledgeAdjustment).optional(),\n workspaceRules: z.array(zManifestWorkspaceRule).optional(),\n })\n .strict()\n .meta({ description: \"Workspace configuration\" });\n\nexport type ManifestWorkspace = z.infer<typeof zManifestWorkspace>;\n\n// #endregion\n\n// #region ---------- Tradelink organization ------------------------------------------------------\n\nconst zManifestTradelinkOrgEntity = z\n .object({\n name: z.string(),\n code: z.string(),\n logo: z.string(),\n })\n .strict()\n .meta({ description: \"Tradelink organization entity\" });\n\nconst zManifestTradelinkOrg = z\n .object({\n exchanges: z.array(zManifestTradelinkOrgEntity).optional(),\n assetManagers: z.array(zManifestTradelinkOrgEntity).optional(),\n custodians: z.array(zManifestTradelinkOrgEntity).optional(),\n })\n .strict()\n .meta({ description: \"Tradelink organization configuration\" });\n\nexport type ManifestTradelinkOrg = z.infer<typeof zManifestTradelinkOrg>;\n\n// #endregion\n\n// #region ---------- Manifest --------------------------------------------------------------------\n\nexport const zManifest = z\n .object({\n manifestVersion: z.literal(2),\n tradelink: zManifestTradelinkOrg.optional(),\n workspace: zManifestWorkspace.optional(),\n })\n .strict();\n\nexport type Manifest = z.infer<typeof zManifest>;\n\n// #endregion\n","import invariant from \"invariant\";\n\nimport type { Logger } from \"@/logger\";\n\nimport { bakePledgeAdjustment } from \"./bake-pledge\";\nimport { bakeTradelinkOrganization } from \"./bake-tradelink-organization\";\nimport { bakeWorkspace } from \"./bake-workspace\";\nimport type { BakeOptions } from \"./types\";\n\nexport * from \"./bake-pledge\";\nexport { type RecipeOptions, recipeManifest } from \"./recipe\";\nexport * from \"./types\";\nexport {\n type CreateRequestInput,\n createAndApproveRequest,\n waitForRequestInflightDone,\n} from \"./utils\";\n\nexport async function bakeManifest(options: BakeOptions, logger: Logger): Promise<void> {\n const {\n engine,\n workspaceName,\n rootAuthToken,\n manifest: { tradelink, workspace },\n } = options;\n\n if (tradelink) {\n invariant(rootAuthToken, `rootAuthToken is required to create Tradelink org entities`);\n await bakeTradelinkOrganization(\n {\n engine,\n tradelink,\n rootAuthToken,\n ...(workspace?.tradelink?.networkBlueprint && workspaceName\n ? { networkBlueprint: { blueprint: workspace.tradelink.networkBlueprint, workspaceName } }\n : {}),\n },\n logger,\n );\n }\n\n if (workspace) {\n invariant(workspaceName, `Can't bake workspace without specifying a workspace name`);\n await bakeWorkspace({ engine, workspace, workspaceName }, logger);\n\n if (workspace.pledges) {\n const engineWithWorkspace = engine.withWorkspace(workspaceName);\n for (const pledgeAdjustment of workspace.pledges) {\n await bakePledgeAdjustment({ engine: engineWithWorkspace, pledgeAdjustment }, logger);\n }\n }\n }\n\n logger.info(\"Successfully baked\");\n}\n"],"mappings":"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"}
package/lib/bake.js CHANGED
@@ -121,7 +121,7 @@ async function bakePledgeAdjustment(options, logger) {
121
121
  const admin = await engine.withDeviceIndex(4).login();
122
122
  logger.info("Fetching account, tradelink blueprint and network...");
123
123
  const [matchingAccounts, blueprint, network] = await Promise.all([
124
- fetchAll(admin.client.accounts.list.query, { name: pledgeAdjustment.account }),
124
+ fetchAll(admin.client.accounts.list.query, { search: pledgeAdjustment.account }),
125
125
  admin.client.tradelink.getNetworkBlueprint.query(),
126
126
  admin.client.tradelink.getNetwork.query()
127
127
  ]);